Подтвердить что ты не робот

Обработка уведомлений пользователей на iOS 10

У меня возникают проблемы, когда пользователь нажимает на уведомление пользователя на iOS 10.

До сих пор я использовал -[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:], который вызывается, когда

  • Case 1: приложение активно и нажимается
  • Case 2: когда пользователь запустил приложение после записи полученного уведомления

Этот метод явно указывает

Обратите внимание, что это поведение отличается от приложения: didReceiveRemoteNotification:, которое не вызывается в этих случаях и которое не будет вызываться, если этот метод реализован.

Вся эта работа, как и ожидалось.

Теперь iOS 10 отказался от этого метода делегата и представил структуру UserNotification, которую я не могу использовать, поскольку я все еще нацелен на iOS 8 и 9.

Когда мое приложение запущено на iOS 10, и нажатие на него будет получено, пока приложение активно (Case 1), -[AppDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] вызывается правильно.

Снова на iOS 10, когда пользователь запускает приложение, нажав на уведомление (Case 2), этот метод не называется.

Я понимаю, что когда я реализую более старый -[UIApplicationDelegate application:didReceiveRemoteNotification:], он получает вызов в Case 2

В iOS 8 и 9 в Case 2 вызывается метод -[AppDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:].

Означает ли это, что мне нужно обновить мое приложение и реализовать старый делегат только для iOS 10?

Итак, вопрос в том, какова правильная реализация обработки пользовательского взаимодействия полученного push на iOS 10 без использования структуры UserNotification.

веселит, Ян

4b9b3361

Ответ 1

Это было исправлено в iOS 10.1 Beta 1!!

-[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] корректно вызывается, когда пользователь нажимает на уведомление.

Ответ 2

Быстрый код для iOS 10:

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

    if #available(iOS 10.0, *) {
        let center = UNUserNotificationCenter.currentNotificationCenter()
        center.delegate = self
    }

    // ...

    return true
}

@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) {

    print(response.notification.request.content.userInfo)        
}

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

    print(notification.request.content.userInfo)
}

Ответ 3

Мы столкнулись с одной и той же проблемой, и мы смогли решить эту проблему только в выпуске iOS 10 GM, используя код ответа, приведенный здесь: https://forums.developer.apple.com/thread/54332

     - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {  

           NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion];
           if (version.majorVersion == 10 && version.minorVersion == 0) {
              [self application: application 
   didReceiveRemoteNotification: userInfo    
         fetchCompletionHandler: ^(UIBackgroundFetchResult result) { 

            }];
       }

С этим исправлением наш код снова начал работать как на iOS 9, так и на 10.

Нам также пришлось изменить способ обработки поведения приложения (UIApplicationStateActive, UIApplicationStateInactive и UIApplicationStateBackground) в push-уведомлениях, поскольку, похоже, он также изменено на iOS 10

ИЗМЕНИТЬ

  • Кажется, что поведение приложений в нормальном режиме в последних версиях iOS 10.