AJO推播通知中,裝載陣列中的動態欄位失敗

在Adobe Journey Optimizer (AJO)中,推播通知無法從承載陣列(例如"callerName"),呈現動態欄位,即使相同的資料在電子郵件和簡訊中也可運作。 欄位可能會顯示為空白或顯示特殊字元為十六進位代碼。 若要解決此問題,請簡化運算式,儘可能將裝載平面化,並確保端對端保留UTF-8編碼。

說明 description

環境

產品: Adobe Journey Optimizer (AJO)
管道:推播(透過APN的iOS、透過FCM的Android)

問題/症狀

推播通知中陣列型欄位的動態個人化失敗。

重現問題的步驟

  1. 在AJO中建立觸發推播通知的歷程。

  2. 傳遞個人化屬性屬於陣列一部分的裝載,例如:

    code language-none
    {
      "attribute_list_group": [
        {
          "name": "callerName",
          "value": "Bill Robert"
        }
      ]
    }
    
  3. 在推播通知標題/內文中,設定個人化運算式:

    code language-none
    #each context.journey.events.[ eventId] ._tmobile.decision_detail_group.attribute_list_group as |container|
      {%#if contains(container.name, "callerName")%}
        container.value
      {%/if%}
    /each
    
  4. 傳送通知。

觀察:在行動裝置上,欄位顯示為空白或顯示特殊字元的十六進位代碼。 相同的運算式在電子郵件和簡訊通道中可正常運作。

原因

  • AJO的推播頻道剖析器比電子郵件和簡訊更嚴格。 它需要純字串值,並且對標題或本文中的回圈、複雜運算式和非字串資料型別支援有限。
  • 推播通知欄位中可能並不同等支援範本和協助程式語法(Handlebars與Nunjucks/Liquid)。
  • 在序列化期間,承載中的特殊字元可能會編碼為十六進位(例如,\u2019)。 推送服務和部分裝置應用程式可能不會解碼這些序列,而是照原樣顯示。
  • APN和FCM等推送服務會強制UTF-8編碼、拒絕控制字元,且可能錯誤轉譯、捨棄或拒絕順序錯誤或逸出的訊息。
  • AJO僅支援正確輸入的字串。 如果動態運算式解析為物件、格式錯誤的字串或陣列,推送訊息可能會無訊息地失敗或遭到截斷。

解決方法 resolution

  • 移除回圈運算式中的所有空白字元和新行。 使用精簡版本,如下所示:#each context.journey.events.[ eventId] ._tmobile.decision_detail_group.attribute_list_group as |container|{%#if contains(container.name, "callerName")%}container.value{%/if%}/each 這解決了目前客戶實作中的拉丁字元問題。
  • 如果可能,請將callerName移至最上層欄位,以平面化裝載。 然後直接在推播範本中使用event.callerName
  • 如果無法使用平面化,請確保選取正確的陣列索引,並在AJO中測試個人化預覽,以確認轉譯。
  • 確保在每個階段都保留UTF-8編碼 — 從來源系統到AJO處理再到推送服務。 避免雙重編碼或逸出特殊字元。
  • 如果特殊字元仍顯示為十六進位,這很可能是推播通道或裝置轉譯的限制。 AJO目前不提供在裝置上強制解碼這些字元的設定。

處理裝載中的特殊字元和Unicode

在JWT裝載或個人化資料中傳遞字串時,請一律確保您正確編碼或逸出特殊字元,並驗證Unicode輸入。 編碼不當會導致轉譯問題、剖析失敗或推播通知中的空白欄位。

適當的JSON字串編碼和字元逸出

JSON需要逸出某些字元,以確保正確剖析裝載:

字元
逸出序列
退格字元
\b
換頁字元
\f
新行
\n
歸位
\r
Tab 鍵
\t
雙引號
\"
反斜線
\\

範例:

{
  "message": "Hello\\nWorld! She said, \\\"Hi there!\\\"."
}

在程式碼中逸出

  • JavaScript: JSON.stringify("Hello\nWorld! She said, \"Hi there!\".")
  • Python: json.dumps("Hello\nWorld! She said, \"Hi there!\".")

Unicode處理

JSON透過UTF-8編碼支援Unicode。 字元可以直接表示或使用\uXXXX標籤法表示:

{
  "emoji": ":grinning:",
  "currency": "€",
  "chinese": "你好",
  "heart": "\u2764"
}

具有特殊字元的範例承載:

{
  "scopes": [ "read", "write", "special:áéíóú", "quote:\"test\""] ,
  "user": "John\\nDoe"
}

JWT模組中有不支援或敏感的字元

裝載必須為有效的JSON。 避免:

  • 未逸出的雙引號或字串外的新行
  • 控制字元(ASCII代碼0-31,空白字元除外)
  • 非UTF-8位元組

如需JSON字元編碼規則,請參閱RFC 8259第7節。

已知問題:

  • 欄位名稱中的逗號、句號和反斜線
  • 未逸出的引號中斷剖析
  • 控制字元和無效的Unicode序列

Unicode和編碼的最佳作法

  • 一律設定標題: Content-Type: application/json; charset=UTF-8

  • 使用標準程式庫進行序列化:

    • JavaScript中的JSON.stringify()
    • Python中的json.dumps()
  • 使用JSONLint等工具驗證裝載

  • 避免雙重逸出或雙重序列化

  • 使用多語言和Emoji字元進行測試,以確保正確轉譯

相關閱讀

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f