AJO推播通知中,裝載陣列中的動態欄位失敗
在Adobe Journey Optimizer (AJO)中,推播通知無法從承載陣列(例如"callerName"),呈現動態欄位,即使相同的資料在電子郵件和簡訊中也可運作。 欄位可能會顯示為空白或顯示特殊字元為十六進位代碼。 若要解決此問題,請簡化運算式,儘可能將裝載平面化,並確保端對端保留UTF-8編碼。
說明 description
環境
產品: Adobe Journey Optimizer (AJO)
管道:推播(透過APN的iOS、透過FCM的Android)
問題/症狀
推播通知中陣列型欄位的動態個人化失敗。
重現問題的步驟
-
在AJO中建立觸發推播通知的歷程。
-
傳遞個人化屬性屬於陣列一部分的裝載,例如:
code language-none { "attribute_list_group": [ { "name": "callerName", "value": "Bill Robert" } ] } -
在推播通知標題/內文中,設定個人化運算式:
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 -
傳送通知。
觀察:在行動裝置上,欄位顯示為空白或顯示特殊字元的十六進位代碼。 相同的運算式在電子郵件和簡訊通道中可正常運作。
原因
- 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()
- JavaScript中的
-
使用JSONLint等工具驗證裝載
-
避免雙重逸出或雙重序列化
-
使用多語言和Emoji字元進行測試,以確保正確轉譯
相關閱讀
- AJO指南中的推播通知中的Personalization
- AJO指南中的Personalization使用案例
recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f