iOS 13 Xcode 11: PKPushKit и APNS в одном приложении - PullRequest
0 голосов
/ 09 мая 2020

После 30 апреля 2020 года Apple не принимает сборки из Xcode 10. Он просит загрузить сборку для iOS 13 SDK. Я пробовал то же самое, и теперь у меня возникают сбои со следующей ошибкой.

[PKPushRegistry _terminateAppIfThereAreUnhandledVoIPPushes]

Мое приложение - это приложение для социальных сетей, которое содержит аудио / видеозвонки из Twilio, чат, сообщения каналов и многие другие функции. Он содержит уведомления Pu sh для нескольких целей. Теперь приложение либо не получает push-уведомления, либо аварийно завершает работу при получении pu sh (в фоновом или неактивном состоянии). При поиске я обнаружил, что не разрешаю использовать PushKit, если мое приложение не отображает экран входящего вызова Callkit ИЛИ приложение не обрабатывает уведомления VOIP. Мое приложение содержит оба типа уведомлений, то есть VOIP и Non VOIP. Итак, это означает, что я должен использовать оба уведомления, то есть PushKit и APNS.

Не могли бы вы помочь мне, как реализовать оба уведомления в одном приложении? Могу ли я достичь своей цели только с помощью PushKit? Какие изменения мне нужно внести в свое приложение для реализации? Любое другое решение?

Ищете ваши предложения.

1 Ответ

2 голосов
/ 13 мая 2020

Короткий ответ:

Вам нужно будет реализовать оба push-уведомления в своем приложении

Вы можете использовать PushKit только для push-уведомлений, которые представляют новые входящие вызовы в ваше приложение, и вы должны ВСЕГДА отображать экран CallKit с новым входящим вызовом, когда вы получаете pu sh через PushKit.

Для других уведомлений, которые вы, возможно, захотите отправить, вы должны использовать обычные push-уведомления.


Как это реализовать?

Во-первых, ваше приложение должно будет зарегистрироваться для обоих push-уведомлений с помощью Apple и получить оба токена pu sh.

Чтобы зарегистрироваться для VoIP, вы будете использовать PushKit:

class PushService {
    private var voipPushRegistry: PKPushRegistry?

    func registerForVoipPushes() {
        voipPushRegistry = PKPushRegistry(queue: DispatchQueue.main)
        voipPushRegistry!.delegate = self
        voipPushRegistry!.desiredPushTypes = Set([PKPushType.voIP])
    }
}

Используя PKPushRegistryDelegate, вы получаете токен VoIP:

extension PushService: PKPushRegistryDelegate {
    func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
        print("VoIP token: \(pushCredentials.token)")
    }
}

Для регистрации для регулярных пушей:

let center = UNUserNotificationCenter.current()
let options: UNAuthorizationOptions = [.alert, .badge, .sound];
center.requestAuthorization(options: options) {
    (granted, error) in
    guard granted else {
        return
    }

    DispatchQueue.main.async {
        UIApplication.shared.registerForRemoteNotifications()
    }
}

Вы получите свой обычный токен пушей you AppDelegate:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    print("Regular pushes token: \(deviceToken)")
}

Теперь, когда у вас есть оба токена, вы отправите их оба на свой сервер. Вам нужно будет реорганизовать серверную часть, чтобы принять оба токена и выбрать правильный для каждого типа pu sh, который вы отправляете своим пользователям.

Существует 4 различных типа push-уведомлений, которые вы можете отправлять:

  • VoIP (токен: VoIP): используйте его только для уведомления о входящем звонке. Без исключений.

  • Обычный (токен: Обычный): используйте его, когда вся информация, необходимая для написания сообщения уведомления, доступна на стороне вашего сервера. Ваше приложение не будет запускать какой-либо код при получении этого pu sh, iOS будет только представлять уведомление и не будет разбудить ваше приложение .

  • Расширение службы уведомлений (токен: обычный): вы можете использовать этот пу sh, когда вам нужна некоторая информация, доступная только на стороне клиента. Чтобы использовать его, просто добавьте флаг mutable-content: 1 к своему pu sh (на стороне сервера) и внедрите расширение приложения службы уведомлений в свое приложение. Когда iOS получил pu sh с этим флагом, он разбудит ваше расширение приложения и позволит вам запустить там некоторый код. Это не разбудит ваше приложение, но вы можете обмениваться информацией между вашим приложением и его расширением с помощью групп приложений или связки ключей. В этом уведомлении ВСЕГДА будет отображаться предупреждающий баннер.

  • Без звука (токен: Обычный): этот пу sh разбудит ваше приложение в фоновом режиме, позволяя вам запустить некоторые приходят, и вы можете не показывать баннер с уведомлением, если не хотите. Это означает, что вы можете использовать этот pu sh для запуска некоторого кода, и пользователь этого даже не заметит. Чтобы использовать его, добавьте флаг content-available: 1 к своему pu sh. Но будьте осторожны: приоритет этого pu sh действительно низкий. Тихие нажатия могут быть отложены или даже полностью проигнорированы.


Как обрабатывать нажатия в вашем приложении?

Отправки VoIP будут обрабатывается вашей реализацией PKPushRegistryDelegate.

extension PushService: PKPushRegistryDelegate {
    [...]

    func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType) {
        print("VoIP push received")
        //TODO: report a new incoming call through CallKit
    }
}

Уведомления о мутабельном содержимом будут обрабатываться вашим расширением службы уведомлений .

Тихие отправления будут обрабатываться вашим AppDelegate:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    print("Silent push received")
}
...