7

ここでしばらく苦労していますが、おそらくこれは私の間違いですが、どこにも見つかりません。これに対する答えです。

いくつかの方法で 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()、コードのどこかで呼び出す必要があります。私の場合は、ボタンから行いました。

私を助けてください!

4

2 に答える 2