Короткий ответ:
Вам нужно будет реализовать оба 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")
}