[英]Critical Alert support on OneSignal not working
我們在 OneSignal 中使用新的 iOS 嚴重警報功能時遇到問題。 我們擁有的應用程序是使用 Apache Flex 構建的,推送通知有效負載通過Distriqt ANE編譯/生成,並通過OneSignal iOS SDK發送。 我們已獲得 Apple 批准的關鍵警報,但是當嘗試通過 OneSignal 發送有效負載時,它不起作用。
Distriqt 團隊內置了對關鍵警報的支持,這很棒,但是一旦通過 OneSignal 發送,負載就不會成功交付,也不會生成關鍵警報。 需要明確的是,一般推送通知工作正常。
OneSignal 有關於 Critical Alerts 的文檔,但它過於簡化了。 在 iOS 上觸發關鍵警報所需的負載很清楚,但無法通過 OneSignal iOS SDK 構建這樣的負載。
在鏈接中,我們執行了#1(更新 iOS 的 OneSignal 應用負載結構),但#2 不清楚。 有效載荷需要看起來像什么? 提供的代碼沒有說明這一點。 此外,引用的“通知類別擴展”是什么,如果確定了該代碼,那么此時我們需要做什么?
我們已經聯系了 OneSignal,但未能成功了解如何成功構建此有效載荷。 文檔說“iOS 功能 OneSignal SDK 支持”但從他們的支持我們收到了這個:
Unfortunately our SDK is not setup to handle critical alerts.
One user reported he achieved this with our additional data parameter like this:
"data": {"CRITICAL_ALERT":"YES","CRITICAL_PAYLOAD":{"CRITICAL_VOLUME":"1.0","CRITICAL_SOUND":"Alert.wav"}}
雖然那行不通。 雖然是一個相對較新的功能,但我希望社區中的某個人在這方面取得了成功並且可以提供幫助。 謝謝!
TL;DR 構建 iOS 通知服務擴展是解決方案。 OneSignal 文檔提到了這一點,但沒有那么詳細。
當 Apple 引入關鍵警報時,他們更改了通過 APNS 負載傳遞的sound
參數。 以前, sound
只是一個字符串。 例如:
{
“aps” : {
“sound” : “critical-alert-sound.wav”
}
}
對於關鍵警報,它是一本字典。 例子:
{
“aps” : {
“sound” : {
“critical”: 1,
“name”: “critical-alert-sound.wav”,
“volume”: 1.0
}
}
}
字符串版本仍然有效,用於非關鍵警報。 基於推理和測試,當將sound
參數傳遞給 OneSignal 時,它只支持初始的 'string' 版本。 當 OneSignal 將有效負載發送給 Apple 時,它會將其作為字符串傳遞,因此即使嘗試將聲音字典傳遞給 OneSignal 也不起作用,因為它在到達 Apple 之前就被解析了。 當 Apple 與您的設備進行通信時,字典已經不見了,因此設備無法將其識別為嚴重警報。
這就是通知服務擴展的用武之地。來自 Apple 的文檔:
UNNotificationServiceExtension 對象為 Notification Service 應用程序擴展提供入口點,它允許您在將遠程通知傳送給用戶之前自定義它的內容。 通知服務應用擴展不顯示任何自己的 UI。 相反,當適當類型的通知發送到用戶設備時,它會按需啟動。 您可以使用此擴展來修改通知的內容或下載與擴展相關的內容。
簡而言之,您可以攔截來自 Apple 的通知 JSON 有效負載,並在用戶看到它之前對其進行修改。
為了將信息從 OneSignal->Apple->Device 正確傳遞到設備,您需要:
1) 將您的 OneSignal 帳戶上的additional_data_is_root_payload
值設置為true
。 這是通過 OneSignal 上的更新應用程序 API 調用完成的。 我為此使用了郵遞員。 需要說明的是,這需要做一次,不需要每次進行通知 API 調用時都需要重復。
2) 在您的 OneSignal API 負載中,將mutable_content
參數設置為true
。
如上所述,您可以使用有效負載的 OneSignal data
參數中的值。 data
有效負載是一個開放字段,可用於您希望通過 OneSignal->Apple->Device 流傳遞的任何附加信息,並且確實會傳送到設備/應用程序,然后您可以根據需要對其進行解析。 在我的例子中,我們使用:
"data": {"CRITICAL_ALERT":"YES"}
數據負載是任意的,它只需要匹配您在通知服務擴展中所做的檢查。
然后我們在 XCode 中創建我們的通知服務擴展。 這里有一些關於創建擴展的很好的分步說明。 這是通過 XCode 完成的,因此如果您正在構建本機應用程序,只需通過您的應用程序的 XCode 項目即可完成。 如果您使用的是像 Adobe AIR 這樣的框架,它會稍微復雜一些,我將在另一篇文章中詳細說明。 請記住,通知服務擴展基本上是一個與父應用程序捆綁在一起的單獨“應用程序”。 它被編譯成一個擴展名為“appex”的文件,盡管它是一個單獨捆綁的二進制文件,但它是專門針對您的父應用程序的。
創建擴展后,您的 XCode 項目將有一個名為NotificationService.swift
的文件,其中包含一個包含didReceive
方法的類。 然后我們添加了這段代碼:
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent {
// Modify the notification content here...
if ((request.content.userInfo["CRITICAL_ALERT"] as? String) == "YES"){
bestAttemptContent.sound = UNNotificationSound.defaultCriticalSound(withAudioVolume: 1.0)
}
contentHandler(bestAttemptContent)
}
您可以看到我們檢查數據負載 ( request.content.userInfo
) 以查看CRITICAL_ALERT
鍵是否設置為YES
值。 如果是這樣,我們會在通知中添加“關鍵聲音”,從而有效地將其轉變為關鍵警報。 在本例中,我們使用 defaultCriticalSound 函數保持簡單,但如果您想定義自己的聲音,也可以使用 criticalSoundNamed。 如果您想為特定通知創建特定聲音,您還可以通過數據負載傳遞您想要用於警報的聲音,然后解析它並將其添加到通知服務擴展中。
在這一點上,一旦我們將應用程序部署到我們的設備上,我們就通過 OneSignal 界面對此進行了測試。 這可以通過登錄您的 OneSignal 帳戶,然后轉到“消息”->“新推送”並選擇您要將推送發送到的設備來訪問:
希望這對使用 OneSignal 進行關鍵警報的其他人有所幫助(並希望他們盡快更新他們的系統以不再需要通知服務擴展)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.