1

Xcode 9.2、Swift 4.0 を使用して VoIP アプリケーションを作成しています。iOS の最小バージョンは 10.3 です。iPhone がスリープ モード (WhatsApp や Viber のように) でも着信を受けたいです。そのために CallKit を使用する必要があることは既にわかっています。しかし、プッシュ通知を正しく受信する方法がわかりません。つまり、それらを受け取る方法は2つあります。最初は AppDelegate.swift にあります。見てください (このメソッドは機能しています):

import UIKit
import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        //Getting permissions for Notifications
        //222
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
        }
        application.registerForRemoteNotifications()
        //222

        return true
    }

    //For PUSH Notifications settings

    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        print("NOTIFICATION ERROR: \(error)")
    }

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let pushToken = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}).lowercased()
    }

    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        // Receiving call?
    }

}

しかし、私が何をしていても、iPhone がスリープ状態の場合、着信はトリガーされません。最近、PUSH 通知を受け取る別の方法があることを知りました。見てください:

import UIKit
import CallKit
import PushKit

class ViewController: UIViewController, CXProviderDelegate, PKPushRegistryDelegate {

    override func viewDidLoad() {
        let registry = PKPushRegistry(queue: nil)
        registry.delegate = self
        registry.desiredPushTypes = [PKPushType.voIP]
    }

    func providerDidReset(_ provider: CXProvider) {
    }

    func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
        action.fulfill()
    }

    func provider(_ provider: CXProvider, perform action: CXEndCallAction) {
        action.fulfill()
    }

    func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
        print(pushCredentials.token.map { String(format: "%02.2hhx", $0) }.joined())
    }

    func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
        // Receive call?
    }

}

問題は、最初の方法でこの PUSH トークンがあることです: 9bcf73ac3d6a68be07c26d8b6a972f5b716cd5308f1a19048b62d19b9b8d4bd1

2 番目のメソッドは、次の PUSH トークンを返します。

そして、それらは等しくありません!どうすればいいの?したがって、主な質問は、PUSH 通知を受信する方法と、AppDelegate メソッドと PushKit メソッドの違いと、どのトークンが正しいかということです。

助けてくれてありがとう!

4

2 に答える 2