处理iOS 10上的用户通知

26
我遇到了麻烦,无法确定用户在iOS 10上点击用户推送通知的时间。到目前为止,我一直在使用“- [UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]”,当:1.应用程序处于活动状态且收到推送,2.当用户点击接收到的通知后启动应用程序时,该方法被调用。这种方法的注释明确说明了这种行为与“application:didReceiveRemoteNotification:”相反,后者不会在这些情况下调用,并且如果实现了此方法,它将不会被调用。所有这些都按预期工作。但是,现在iOS 10已弃用此委托方法并引入了UserNotification框架,但我无法使用它,因为我仍在针对iOS 8和9. 当我的应用程序在iOS 10上运行,并在应用程序处于活动状态时收到推送(案例1),将正确调用“- [AppDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]”。同样,在iOS 10上,当用户通过点击通知来启动应用程序(案例2)时,此方法不被调用。我意识到,当我实现旧的“-[UIApplicationDelegate application:didReceiveRemoteNotification:]”时,它是在案例2中调用的。在iOS 8和9中,在案例2中,将调用“- [AppDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]”方法。这是否意味着我必须更新我的应用程序,并仅为iOS 10实现旧的委托?因此,问题是,在不使用UserNotification框架的情况下处理在iOS 10上收到的推送的用户交互的正确实现方式是什么。

1
如果您为iOS 9编译了应用程序,则应向后兼容,因此您可以理论上忽略弃用通知,因为您不会针对iOS 10,而是针对iOS 9,其中这些方法应该有效。我现在也面临同样的问题,已经有一个openradar来解决这个问题,建议您密切关注它,因为这种行为似乎是iOS 10 beta版本中的一个错误。http://www.openradar.me/27822963 - Felipe Sabino
1
iOS 10 beta 7仍未修复。 - Jan
1
同样适用于iOS 10 beta 8:/ - Jan
1
同样适用于iOS 10 GM :/ 这是否意味着在iOS 10上我们必须使用一个在iOS 10上已被弃用的回调函数? - Jan
1
需要使用UseNotification框架。我已经为iOS 10实现了代码:https://dev59.com/-VkS5IYBdhLWcg3ww45d?answertab=votes#tab-top - Ashish Shah
显示剩余14条评论
3个回答

24

iOS 10的Swift代码:

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)
}

1
你可以在 willPresentNotification 函数中获取它 @Honey - Jenny Tran
@DungTran没错。我之前问过这个问题。如果应用程序在前台,您将在接收到通知时获得2个回调。我只是认为这些回调的语义不同。didReceiveRemoteNotitication仅用于接收...它更多地用于更新您的应用程序。willPresent则更多用于通知 - mfaani
是的,我测试过了。在iOS 10中,使用UserNotification时,didReceiveRemoteNotification函数不会被调用。 - Jenny Tran
@DungTran 对不起,我是指 application:didReceiveRemoteNotification:fetchCompletionHand‌ler 方法。 <-- 这个被调用了! - mfaani
@DungTran,你能告诉我当应用程序在后台接收到用户通知时会执行哪个方法吗? - ArgaPK
显示剩余8条评论

15
我们在这里也遇到了同样的问题,只有通过使用此答案中提供的代码,我们才能够解决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)的方式,因为似乎在iOS 10上也发生了变化。

编辑:

  • 最新的iOS 10版本似乎已经恢复了应用程序状态的正常行为。

iOS10上应用程序状态是如何改变的? - Jan
我们遇到了类似于这里描述的问题:https://forums.developer.apple.com/thread/54415 但我还没有在GM上进行测试,所以我无法确认这是否仍然是一个问题... - andresk
@andresk,您能告诉我当应用程序在后台接收到用户通知时会执行哪个方法吗? - ArgaPK

13

iOS 10.1 Beta 1已经修复了这个问题!!

当用户点击通知时,-[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]方法会被正确调用。


似乎在iOS 10.0.2中已经进行了更正。如果有任何官方信息,请告知我! - Thomas Besnehard
iOS 10.0.2已于2016年10月14日左右发布。 - Thomas Besnehard
2
我正在使用iOS 10.0.2,问题仍然存在。:( - vilanovi
自从iOS 10.2.1发布以来,有人遇到过这个问题吗? - grane2212
@grane2212 今天我遇到了这个问题。 - dirtydanee
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接