Push-уведомление с iOS 10

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

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

Ответ 1

Для iOS 10 с использованием xCode 8 GM.

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

1) В целевых целях в разделе "Возможности" нажмите "Push Notifications", чтобы добавить 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.

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

Сначала перейдите к целевому назначению приложения. Выберите "Возможности" и убедитесь, что "Push Notifications" включен и что "Удаленные уведомления выбраны в режиме" Фоновые режимы ".

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

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

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
var token = ""
for i in 0..<deviceToken.count {
    token = token + String(format: "%02.2hhx", arguments: [deviceToken[i]])
}
print(token)

}

Ответ 5

Быстрая версия 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) {

    }

Ответ 6

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

Ответ 7

В 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), чтобы получить ошибку, если регистрация запустилась.