ここでしばらく苦労していますが、おそらくこれは私の間違いですが、どこにも見つかりません。これに対する答えです。
いくつかの方法で PushKit を実装しましたが、どれも効果的ではありませんでした。
正しいバックグラウンド モードを追加し、コールバックを正しい方法で実装し、didUpdatePushCredentials
正常に呼び出されるようにしました...
しかし、credentials: PKPushCredentials!
変数は私にエラーポインターを与えています...それはnullではありません... nilではありません...何もありません...単に値がありません...割り当てられたガベージです...そのため.. EXC_BREAKPOINT を受け取っています..
3つの異なるデバイスで試しました...同じ動作...
VoIP プッシュ用の証明書は既に作成しています...
私はさまざまな方法でそれを行いました:
- didRegisterForRemotePushNotification の後に void Push Registry オブジェクトを作成する
- リモート プッシュ通知に登録せずにプッシュ レジストリを作成することで...
- メイン、グローバル、およびカスタム キューを使用してレジストリを作成することにより..
いつも同じ...
コードは次のとおりです。
extension AppDelegate : PKPushRegistryDelegate {
func registerForVoipPush() {
self.registry = PKPushRegistry(queue:nil)
if self.registry != nil {
self.registry!.delegate = self
self.registry!.desiredPushTypes = Set<String>(arrayLiteral: PKPushTypeVoIP)
}
//let notificationSettings = UIUserNotificationSettings(forTypes: [.Alert, .Badge, .Sound], categories:nil)
//UIApplication.sharedApplication().registerUserNotificationSettings(notificationSettings)
}
func pushRegistry(registry: PKPushRegistry!, didUpdatePushCredentials credentials: PKPushCredentials!, forType type: String!) {
//print out the VoIP token. We will use this to test the nofications.
NSLog("voip token: \(credentials.token)")
if credentials != nil {
let username = NSUserDefaults.standardUserDefaults().objectForKey("username") as? String
if username != nil {
ServerDefinitions.subscribeForPush(username!, token: NSString(data: credentials.token, encoding: NSUTF8StringEncoding) as! String, callback: { (retMsg) -> Void in
print(retMsg)
})
}
}
}
func pushRegistry(registry: PKPushRegistry!, didReceiveIncomingPushWithPayload payload: PKPushPayload!, forType type: String!) {
let payloadDict = payload.dictionaryPayload["aps"] as? Dictionary<String, String>
let message = payloadDict?["alert"]
//present a local notifcation to visually see when we are recieving a VoIP Notification
if UIApplication.sharedApplication().applicationState == UIApplicationState.Background {
let localNotification = UILocalNotification();
localNotification.alertBody = message
localNotification.applicationIconBadgeNumber = 1;
localNotification.soundName = UILocalNotificationDefaultSoundName;
UIApplication.sharedApplication().presentLocalNotificationNow(localNotification);
}
else {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
print("Incoming Call")
})
}
NSLog("incoming voip notfication: \(payload.dictionaryPayload)")
}
func pushRegistry(registry: PKPushRegistry!, didInvalidatePushTokenForType type: String!) {
NSLog("token invalidated")
}
}
編集:
上記のコードは AppDelegate の拡張であり、コードを分離するためだけに作成されているため、読みやすくなっていることに注意してください。
var registry : PKPushRegistry?
AppDelegateにも追加しました。これを機能させるにはregisterForVoipPush()
、コードのどこかで呼び出す必要があります。私の場合は、ボタンから行いました。
私を助けてください!