簡體   English   中英

OneSignal 上的關鍵警報支持不起作用

[英]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 項目即可完成。 如果您使用的是像 Adob​​e 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM