didUpdatePushCredentials не вызывается

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

Я реализовал APNS в приложении. Могут ли эти две службы конфликтовать?

Вот мои коды AppDelegate

- (void)application:(UIApplication *)application
    didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
    LOGI(@"%@", NSStringFromSelector(_cmd));

    //register for voip notifications
    self->pushRegistry = [[PKPushRegistry alloc] initWithQueue:dispatch_get_main_queue()];
    [self->pushRegistry setDelegate:self];
    [self->pushRegistry setDesiredPushTypes:[NSSet setWithObject:PKPushTypeVoIP]];

    NSLog(@"VoIP push registered");

}

#pragma mark - VoIP push methods

- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials:(PKPushCredentials *)credentials forType:(NSString *)type {
    NSLog(@"voip token: %@", credentials.token);
}

- (void)pushRegistry:(PKPushRegistry *)registry didReceiveIncomingPushWithPayload:(PKPushPayload *)payload forType:(NSString *)type {
    NSDictionary *payloadDict = [payload.dictionaryPayload valueForKey:@"aps"];
    NSString *message = (NSString *)[payloadDict valueForKey:@"alert"];

    if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) {
        UILocalNotification *localNotification = [[UILocalNotification alloc] init];
        localNotification.alertBody = [message stringByAppendingString:@" - voip"];
        localNotification.applicationIconBadgeNumber = 1;
        localNotification.soundName = @"notes_of_the_optimistic.caf";

        [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
    } else {
        dispatch_async(dispatch_get_main_queue(), ^{
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"VoIP notification" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            [alert show];
        });
    }


    NSLog(@"incoming voip notfication: %@", payload.dictionaryPayload);
}

- (void)pushRegistry:(PKPushRegistry *)registry didInvalidatePushTokenForType:(NSString *)type {
    NSLog(@"Voip token invalidate");
}
  • Я включил удаленные уведомления, сертификат и профили обеспечения установлены.
  • Я могу отправлять стандартные уведомления с помощью APNS.

Любое решение, чтобы заставить его работать?


person Morteza Soleimani    schedule 08.05.2016    source источник


Ответы (4)


Если вы используете более новый xcode (у меня xcode 9), то VOIP отсутствует в разделе «Фон» на вкладке «Возможности». Это предотвратит вызов didUpdatePushCredentials!

Хитрость в том, что вы должны войти в свой plist, а в Required Background Modes вам нужно добавить App provides Voice over IP services.

Я не могу поверить, что Apple сделала это с нами. Я потратил 8 часов рабочего дня на поиски этого простого решения.

введите описание изображения здесь

person BigCheesy    schedule 26.10.2017
comment
Я уже добавил это в файл info.plist. Но все же я получаю это. - person Kishan Vyas; 13.02.2018

Для меня решение состояло в том, чтобы включить:

введите здесь описание изображения

P.S. Я не забыл включить введите здесь описание изображения Но также важно было включить общие push-уведомления. Итак, полный код:

import UIKit
import PushKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        voipRegistration()

        return true
    }

    // Register for VoIP notifications
    func voipRegistration() {
        let mainQueue = DispatchQueue.main
        // Create a push registry object
        let voipRegistry: PKPushRegistry = PKPushRegistry(queue: mainQueue)
        // Set the registry's delegate to self
        voipRegistry.delegate = self
        // Set the push type to VoIP
        voipRegistry.desiredPushTypes = [.voIP]
    }

}

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

    func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType) {
        print("payload = \(payload.dictionaryPayload)")
    }
}
person Paul T.    schedule 09.08.2019

Используйте приведенный ниже код и убедитесь в следующих вещах.

**`**// Register for VoIP notifications**`**

- (void) voipRegistration {
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    // Create a push registry object
    _voipRegistry = [[PKPushRegistry alloc] initWithQueue: mainQueue];
    // Set the registry's delegate to self
    [_voipRegistry setDelegate:(id<PKPushRegistryDelegate> _Nullable)self];
    // Set the push type to VoIP
    _voipRegistry.desiredPushTypes = [NSSet setWithObject:PKPushTypeVoIP];
}

Вызов метода «Ниже» в didFinishLaunchingWithOptions

Другой способ делегирования

- (void)pushRegistry:(PKPushRegistry *)registry didUpdatePushCredentials: (PKPushCredentials *)credentials forType:(NSString *)type {
    // Register VoIP push token (a property of PKPushCredentials) with server

    if([credentials.token length] == 0) {
        NSLog(@"voip token NULL");
        return;
    }
    NSLog(@"%@",credentials.token);
}

//Убедитесь в этом в возможностях проекта

1)Фоновый режим включен

2) VOIP

3) Фоновая выборка

4)удаленное уведомление

5) Не забудьте импортировать делегата

в фоновом режиме

person Hitesh Surani    schedule 04.07.2016
comment
Я следовал тем же шагам, и Синч также упоминает эти шаги. Но все еще сталкивается с той же проблемой. - person Kishan Vyas; 20.02.2018

Возникла проблема с сертификатами.

Регенерированные и повторно импортированные сертификаты и проблема исправлена.

person Morteza Soleimani    schedule 18.02.2017
comment
@KishanVyas Когда вы создаете push-сертификат, ему нужен сертификат. Вы уверены, что выбрали правильный сертификат? - person Morteza Soleimani; 14.02.2018