处理iOS 10上的用户通知

Jan*_*Jan 26 push push-notification ios10

我很难确定用户何时点击iOS 10上的用户推送通知.

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

  • Case 1:应用程序处于活动状态并且已收到推送
  • Case 2:当用户在录制收到的通知后启动应用程序时

这个方法明确说明了

请注意,此行为与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上处理所接收推送的用户交互的正确实现是什么.

欢呼声,Jan

Ada*_*don 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)
}
Run Code Online (Sandbox Code Playgroud)


and*_*esk 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) { 

            }];
       }
Run Code Online (Sandbox Code Playgroud)

通过此修复,我们的代码在iOS 9和10上再次开始工作.

我们还必须改变我们在推送通知上处理应用程序状态行为(UIApplicationStateActive,UIApplicationStateInactive和UIApplicationStateBackground)的方式,因为它似乎也在iOS 10上发生了变化

编辑:

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


Jan*_*Jan 13

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

-[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:]当用户点击一个通知是正确调用.

  • 我正在使用iOS 10.0.2,问题仍然存在.:( (2认同)