对OneSignal的严重警报支持不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对OneSignal的严重警报支持不起作用相关的知识,希望对你有一定的参考价值。

我们在将新的ios严重警报功能与OneSignal结合使用时遇到麻烦。我们拥有的应用程序是使用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,但在了解如何成功构造此有效负载方面一直没有成功。该文档说“ 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通知服务扩展是解决方案。 The OneSignal documentation mentions this,但细节要少得多。


[Apple引入严重警报时,他们更改了APNS有效负载传递的sound参数。以前,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的文档:

UNNotificationServiceExtension对象提供Notification Services应用程序扩展的入口点,使用该扩展程序,您可以在将远程通知传递给用户之前自定义远程通知的内容。 Notification Service应用程序扩展程序不呈现其自己的任何UI。而是在将适当类型的通知传递到用户设备时按需启动。您可以使用此扩展程序来修改通知的内容或下载与该扩展程序相关的内容。

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


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

1]将OneSignal帐户上的additional_data_is_root_payload值设置为true。这是通过OneSignal上的Update an App API call完成的。我为此使用了Postman。需要明确的是,此操作必须执行一次,而不必在每次进行通知API调用时都重复执行。

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

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

"data": {"CRITICAL_ALERT":"YES"}

数据有效载荷是任意的,只需要匹配您在Notification Service Extension中进行的检查即可。


然后,我们在XCode中创建我们的Notification Service Extension。 There are some great step-by-step instructions here on creating an extension。这是通过XCode完成的,因此,如果您要构建本机应用程序,则只需通过您的应用程序的XCode项目即可完成。如果您使用的是Adobe AIR之类的框架,则要复杂得多,我将在另一篇文章中详细介绍。请记住,Notification Service Extension本质上是与父应用程序捆绑在一起的独立“应用程序”。它被编译成扩展名为'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。如果您想为特定的通知创建特定的声音,您还可以通过数据有效负载传递要用于警报的声音,然后将其解析并添加到Notification Service扩展中。


此时,将应用程序部署到设备后,我们通过OneSignal界面对此进行了测试。可以通过登录您的OneSignal帐户,然后转到“消息”->“新推送”并选择要将推送发送到的设备来进行访问:

enter image description here

希望这对使用OneSignal进行严重警报的其他人有帮助(并希望他们尽快更新其系统,从而不再需要Notification Service Extension)。

以上是关于对OneSignal的严重警报支持不起作用的主要内容,如果未能解决你的问题,请参考以下文章

OneSignal.setSubscription(true) 在 Android 上不起作用?

Ionic - OneSignal 在 iOS 13.x 上不起作用

ios:当应用程序处于焦点时禁用警报通知(OneSignal)

Onesignal,Ionic App:单击通知时打开特定视图不起作用

Ionic 5 电容器:使用 ONESIGNAL 的推送通知在 iOS 上不起作用

onRequestPermissionsResult 在片段中不起作用