Ответ 1
Это было исправлено в iOS 10.1 Beta 1!!
-[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]
корректно вызывается, когда пользователь нажимает на уведомление.
У меня возникают проблемы, когда пользователь нажимает на уведомление пользователя на 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
.
веселит, Ян
Это было исправлено в iOS 10.1 Beta 1!!
-[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]
корректно вызывается, когда пользователь нажимает на уведомление.
Быстрый код для 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)
}
Мы столкнулись с одной и той же проблемой, и мы смогли решить эту проблему только в выпуске 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
ИЗМЕНИТЬ