Проблема с push-уведомлениями в iOS 10

Я разработал одно приложение, в котором реализовал push-уведомления. В настоящее время он живет в магазине Apple. До iOS 9 push работает нормально, но после iOS 10 не работает.

В чем проблема с кодом?

6 ответов

Решение

Для iOS 10 используется xCode 8 GM.

Я решил свою проблему с помощью следующих шагов, используя xCode 8 GM для iOS 10:

1) В целях в разделе "Возможности" включите push-уведомления, чтобы добавить права на push-уведомления.

2) Внедрите UserNotifications.framework в свое приложение. Импортируйте UserNotifications.framework в ваш AppDelegate.

#import <UserNotifications/UserNotifications.h>
@interface AppDelegate : UIResponder   <UIApplicationDelegate,UNUserNotificationCenterDelegate>

@end

3) В методе didFinishLaunchingWithOptions назначьте UIUserNotificationSettings и реализовать UNUserNotificationCenter делегировать.

#define SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

if(SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(@"10.0")){
    UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
    center.delegate = self;
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert | UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error){
         if( !error ){
             [[UIApplication sharedApplication] registerForRemoteNotifications];
         }
     }];  
}

return YES;
}

4) Теперь, наконец, реализуем эти два метода делегата.

// ============ Для iOS 10=============

-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{

    //Called when a notification is delivered to a foreground app. 

    NSLog(@"Userinfo %@",notification.request.content.userInfo);

    completionHandler(UNNotificationPresentationOptionAlert);
}

-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{

   //Called to let your app know which action was selected by the user for a given notification.

   NSLog(@"Userinfo %@",response.notification.request.content.userInfo);

}

Пожалуйста, оставьте код таким, какой вы его используете для iOS 9. Добавляйте только строки кода для поддержки Push-уведомлений для iOS 10 с помощью UserNotifications.framework.

До iOS 10 все работало нормально, в моем случае только настройки возможностей вызывают эту проблему.

Он должен быть включен для push-уведомлений.

У меня была проблема с тихими push-уведомлениями iOS10. В iOS9 и более ранних версиях отправка push-уведомлений с дополнительными полями данных, но пустыми aps Атрибут в данных работал нормально. Но в iOS10 push-уведомление с пустым aps Атрибут вообще не затрагивает метод делегата приложения didReceiveRemoteNotification, что означает, что все мои тихие push-уведомления (уведомления, которые мы просто используем для запуска действий, когда приложение открыто) перестали работать в iOS10.

Мне удалось это исправить, не отправляя обновление в мое приложение, добавив хотя бы один атрибут в aps часть push-уведомления, в моем случае я просто добавил badge: 0 и мои тихие push-уведомления снова начали работать в iOS10. Надеюсь, это поможет кому-то еще!

Быстрая 3 версия кода @Ashish Shah:

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

//notifications
        if #available(iOS 10.0, *) {
            let center  = UNUserNotificationCenter.current()
            center.delegate = self
            center.requestAuthorization(options: [.sound, .alert, .badge]) { (granted, error) in
                if error == nil{
                    UIApplication.shared.registerForRemoteNotifications()
                }
            }
        } else {
            // Fallback on earlier versions
        }

        return true
    }
    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

    }

    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

    }

Не забывайте, что при тестировании вы должны использовать sandbox адрес для ваших уведомлений для работы.

На iOS приложение обращается к клиенту для авторизации, чтобы получить push-предупреждения, вызвав registerUserNotificationSettings: стратегия для UIApplication,

Приложение вызывает registerForRemoteNotifications: техника для UIApplication (iOS) или стратегия registerForRemoteNotificationTypes: из NSApplication (OS X).

Приложение выполняет application:didRegisterForRemoteNotificationsWithDeviceToken: техника для UIApplicationDelegate (iOS) или NSApplicationDelegate (OS X), чтобы получить единственный в своем роде токен гаджета, созданный с помощью push-преимущества.

Приложение выполняет application:didFailToRegisterForRemoteNotificationsWithError: техника для UIApplicationDelegate (iOS) или NSApplicationDelegate (OS X), чтобы получить ошибку, если регистрация провалилась.

Другие вопросы по тегам