iOS应用中的OneSignal VoIP通知

很多人知道并使用多平台推送通知服务OneSignal。 这篇文章介绍了如何从服务接收VoIP通知。 Internet协议语音(VoIP)应用程序使用户可以使用Internet连接而不是设备的蜂窝服务来拨打和接听电话。

主要问题是OneSignal SDK仅通过调用next来为通常的远程通知在SDK中注册令牌。

OneSignal.initWithLaunchOptions(launchOptions, 
appId: "YOUR_APP_ID",
handleNotificationAction: nil,
settings: onesignalInitSettings)

众所周知,使用VoIP通知,开发人员需要使用PushKit实施令牌注册。

 // Link to the PushKit framework 
import PushKit
// Link to the PushKit framework
import PushKit
// Trigger VoIP registration on launch
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
self.voipRegistration()
return true
}
// Trigger VoIP registration on launch
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
self.voipRegistration()
return true
}
// Trigger VoIP registration on launch
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
self.voipRegistration()
return true
}
// Register for VoIP notifications
func voipRegistration {
let mainQueue = dispatch_get_main_queue()
// Register for VoIP notifications
func voipRegistration {
let mainQueue = dispatch_get_main_queue()
// Register for VoIP notifications
func voipRegistration {
let mainQueue = dispatch_get_main_queue()
// Create a push registry object
let voipRegistry: PKPushRegistry = PKPushRegistry(mainQueue)
// Create a push registry object
let voipRegistry: PKPushRegistry = PKPushRegistry(mainQueue)
// Create a push registry object
let voipRegistry: PKPushRegistry = PKPushRegistry(mainQueue)
// Set the registry's delegate to self
voipRegistry.delegate = self
// Set the registry's delegate to self
voipRegistry.delegate = self
// Set the registry's delegate to self
voipRegistry.delegate = self
// Set the push type to VoIP
voipRegistry.desiredPushTypes = [PKPushTypeVoIP]
}
// Set the push type to VoIP
voipRegistry.desiredPushTypes = [PKPushTypeVoIP]
}
// Set the push type to VoIP
voipRegistry.desiredPushTypes = [PKPushTypeVoIP]
}
// Handle updated push credentials
func pushRegistry(registry: PKPushRegistry!, didUpdatePushCredentials credentials: PKPushCredentials!, forType type: String!) {
// Register VoIP push token (a property of PKPushCredentials) with server
}
// Handle updated push credentials
func pushRegistry(registry: PKPushRegistry!, didUpdatePushCredentials credentials: PKPushCredentials!, forType type: String!) {
// Register VoIP push token (a property of PKPushCredentials) with server
}

不幸的是,OneSignal SDK不支持PushKit注册。 但是他们在REST API中有一个方法。 此方法用于向OneSignal注册新设备。 如果已经使用指定的标识符注册了设备,则这将更新现有设备记录,而不是创建新的记录。 因此,问题得以解决,我们需要手动实现POST请求。

通过curl的示例:

 curl --include \ 
--request POST \
--header "Content-Type: application/json" \
--data-binary "{\"app_id\" : \"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\",
\"identifier\":\"ce777617da7f548fe7a9ab6febb56cf39fba6d382000c0395666288d961ee566\",
\"language\":\"en\",
\"timezone\":-28800,
\"game_version\":\"1.0\",
\"device_os\":\"7.0.4\",
\"device_type\":0,
\"device_model\":\"iPhone 8,2\",
\"tags\":{\"a\":\"1\",\"foo\":\"bar\"}}" \
https://onesignal.com/api/v1/players

我希望可以在Swift或Obj C中轻松实现此方法,因此我不会发布代码。 让我知道你是否需要它。

仍然存在一个问题,如果应用程序必须同时支持两种通知方式,该怎么办。 我的意思是VoIP,例如,通话和消息是通常的通知。 该解决方案很简单,它的实现仅通过PushKit接收消息,但是应用程序必须检测什么是呼叫,什么是消息,并取决于它来决定。 如果是消息,则仅应用程序必须发送本地通知,如果有呼叫,则该应用程序将使用CallKit SDK进行下一步。

描述了主要思想,如果您有任何疑问,请随时问我。