【问题标题】:Handling user notifications on iOS 10在 iOS 10 上处理用户通知
【发布时间】:2016-12-20 18:43:12
【问题描述】:

我无法确定用户何时点击 iOS 10 上的用户推送通知。

到目前为止,我一直在使用-[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:],它在何时调用

  • Case 1:应用处于活动状态,收到推送
  • Case 2:当用户点击收到的通知后启动应用程序时

这个方法cmets明确说

请注意,此行为与 application: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 实现旧的委托?

所以问题是,在不使用UserNotification 框架的情况下,在 iOS 10 上处理接收推送的用户交互的正确实现是什么。

干杯, 一月

【问题讨论】:

  • 如果你为 iOS 9 编译了应用程序,它应该是向后兼容的,因此理论上你可以忽略弃用通知,因为你的目标不是 iOS 10,而是 iOS 9,这种方法应该可以工作.我现在面临同样的问题,并且已经有一个 openradar,我建议你密切关注它,因为这种行为似乎是 iOS 10 beta 版本中的一个错误。 openradar.me/27822963
  • iOS 10 beta 7 中仍未修复
  • 相同的 iOS 10 beta 8 :/
  • iOS 10 GM 相同:/ 这是否意味着在 iOS 10 上我们必须使用在 iOS 10 上已弃用的回调????
  • 需要使用UseNotification框架。我已经为 iOS 10 实现了代码:stackoverflow.com/questions/39490605/…

标签: push-notification push ios10


【解决方案1】:

我们在这里遇到了同样的问题,我们只能通过使用此处给出的答案中的代码在 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 上再次开始工作。

我们还必须更改在推送通知上处理 application state behavior (UIApplicationStateActive, UIApplicationStateInactive and UIApplicationStateBackground) 的方式,因为它似乎在 iOS 10 上也发生了变化

编辑

  • 在最新的 iOS 10 版本上,应用程序状态行为似乎恢复正常。

【讨论】:

  • 应用状态在iOS10上是如何变化的?
  • 我们遇到了类似这里描述的问题:forums.developer.apple.com/thread/54415 但我还没有在 GM 上测试过,所以我无法确认这是否仍然是一个问题......
  • @andresk 你能告诉我当应用程序在后台并收到用户通知时执行哪个方法吗?
【解决方案2】:

这已在 iOS 10.1 Beta 1 中修复!!

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

【讨论】:

  • 它在 iOS 10.0.2 中已经被纠正了。如果有人得到一些关于它的官方信息,我会迟到!
  • 10.0.2 什么时候发布的?
  • iOS 10.0.2 已于 2016 年 10 月 14 日左右发布
  • 我使用的是 iOS 10.0.2,但问题仍然存在。 :(
  • 我遇到了同样的问题 10.1.1
【解决方案3】:

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

【讨论】:

  • 如果我理解正确的话。对于 iOS 10:当用户收到通知(不点击)时,2 个委托方法没有回调,您仍然必须使用未弃用的:-[AppDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]。对吗?
  • 可以在willPresentNotification函数@Honey中获取
  • @DungTran 是正确的。我前段时间问过这个问题。如果应用程序在前台,您将收到 2 个回调。我只是认为呼叫确认在语义上是不同的。 didReceiveRemoteNotitication 纯粹是为了接收...更多的是为了更新您的应用程序。 willPresent 更多用于通知
  • 是的,我测试过了。在 iOS 10 中,函数 didReceiveRemoteNotification 不会被 UserNotification 调用。
  • @DungTran 对不起,我的意思是application:didReceiveRemoteNotification:fetchCompletionHand‌ler
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 2020-02-23
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多