gpt4 book ai didi

ios - OneSignal 上的关键警报支持不起作用

转载 作者:行者123 更新时间:2023-12-01 19:35:30 25 4
gpt4 key购买 nike

我们在 OneSignal 中使用新的 iOS 严重警报功能时遇到问题。我们拥有的应用程序是使用 Apache Flex 构建的,并且推送通知有效负载正在通过 Distriqt ANE 编译/生成并通过OneSignal iOS SDK发送.我们已获得 Apple 的严重警报批准,但在尝试通过 OneSignal 发送有效负载时,它不起作用。

Distriqt 团队内置了对关键警报的支持,这很棒,但是一旦通过 OneSignal 发送,有效负载就不会成功传递,也不会生成关键警报。需要明确的是,一般推送通知工作正常。

OneSignal 有 documentation on Critical Alerts ,尽管它过于简化。 payload needed to trigger Critical Alerts on iOS很清楚,但没有办法通过 OneSignal iOS SDK 构建这样的有效负载。

link ,我们执行了#1 (Update OneSignal App Payload Structure for iOS)但是 #2 is unclear .有效载荷需要看起来像什么?提供的代码并没有说清楚。此外,引用的“通知类别扩展”是什么?如果识别出该代码,我们此时需要做什么?

我们已联系 OneSignal,但未能成功了解如何成功构建此有效载荷。文档说“OneSignal SDK 支持的 iOS 功能”,但从他们的支持中,我们收到了以下信息:

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 通知服务扩展是解决方案。 The OneSignal documentation mentions this但细节要少得多。

当 Apple 引入严重警报时,他们更改了 sound与 APNS 有效负载一起传递的参数。以前,sound曾经只是一个字符串。例如:

{ 
“aps” : {
“sound” : “critical-alert-sound.wav”
}
}

对于严重警报,它是一本字典。例子:
{ 
“aps” : {
“sound” : {
“critical”: 1,
“name”: “critical-alert-sound.wav”,
“volume”: 1.0
}
}
}

字符串版本仍然有效并用于非关键警报。基于推理和测试,当通过 sound OneSignal 的参数,它只支持初始的“字符串”版本。当 OneSignal 将有效负载发送到 Apple 时,它​​会将其作为字符串传递,因此即使尝试将声音字典传递给 OneSignal 也无法正常工作,因为它在到达 Apple 之前已被解析。当 Apple 与您的设备进行通信时,字典已经消失,从而阻止设备将其识别为严重警报。

这是 Notification Service Extension进来。来自Apple的文档:

A UNNotificationServiceExtension object provides the entry point for a Notification Service app extension, which lets you customize the content of a remote notification before it is delivered to the user. A Notification Service app extension doesn't present any UI of its own. Instead, it is launched on demand when a notification of the appropriate type is delivered to the user’s device. You use this extension to modify the notification’s content or download content related to the extension.



简而言之,您可以拦截来自 Apple 的通知 JSON 有效负载,并在用户看到它之前对其进行修改。

为了使信息从 OneSignal->Apple->Device 正确传递到设备,您需要:

1) 设置 additional_data_is_root_payload将您 OneSignal 帐户上的值设为 true .这是通过 Update an App API call 完成的。在 OneSignal 上。我用了 Postman为了这。需要明确的是,这需要做一次,而不是每次调用通知 API 时都需要重复。

2) 在您的 OneSignal API 有效负载中,设置 mutable_content true 的参数.

如上所述,您可以使用 OneSignal data 中的值。载荷参数。 data有效负载是一个开放字段,可用于您想要通过 OneSignal->Apple->Device 流传递的任何附加信息,并且确实会传递到设备/应用程序,然后您可以根据需要对其进行解析。在我的示例中,我们使用:
"data": {"CRITICAL_ALERT":"YES"}

数据负载是任意的,它只需要匹配您在通知服务扩展中所做的检查。

然后我们在 XCode 中创建通知服务扩展。 There are some great step-by-step instructions here on creating an extension .这是通过 XCode 完成的,因此如果您正在构建 native 应用程序,只需通过您的 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 接口(interface)对此进行了测试。这可以通过登录您的 OneSignal 帐户,然后转到“消息”->“新推送”并选择您要发送推送到的设备来访问:

enter image description here

希望这对使用 OneSignal 进行严重警报的其他人有所帮助(并希望他们很快更新他们的系统以不再需要通知服务扩展)。

关于ios - OneSignal 上的关键警报支持不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60330080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com