如何在应用程序处于后台时处理iOS远程通知

我正在通过苹果推送通知处理iOS推送通知function,现在我正在获得适当的通知,而我的应用程序在后台或前台,但我想在我的应用程序处于后台时处理远程通知,基本上当我的应用程序在后台时它只是显示来自有效负载的警报消息。实际上我只是想自定义我的远程通知。

码:

- (BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions { // Override point for customization after application launch. if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) { // [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; [[UIApplication sharedApplication] registerForRemoteNotifications]; } else { [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)]; } return YES; } - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { NSLog(@"Did Register for Remote Notifications with Device Token (%@)", error); } - (void)application:(UIApplication )application didRegisterForRemoteNotificationsWithDeviceToken:(NSData )deviceToken { NSLog(@"Did Register for Remote Notifications with Device Token (%@)", deviceToken); } -(void)application:(UIApplication )application didReceiveRemoteNotification:(NSDictionary )userInfo fetchCompletionHandler:(void (UIBackgroundFetchResult))completionHandler { NSDictionary * aps=[userInfo valueForKey"aps"]; NSLog(@"did recevie %@",aps); NSLog(@"userinfo details %@",[aps valueForKey"alert"]); } 

首先,在iOS 10中,您必须在AppDelegate.h文件中设置UNUserNotificationCenterDelegate

 @interface AppDelegate : UIResponder  

之后在AppDelegate.m编写这样的代码

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.1) { // iOS 7.1 or earlier. Disable the deprecation warnings. UIRemoteNotificationType allNotificationTypes = (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge); [application registerForRemoteNotificationTypes:allNotificationTypes]; [[UIApplication sharedApplication] registerForRemoteNotifications]; } else { // iOS 8 or later // [START register_for_notifications] if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) { UIUserNotificationType allNotificationTypes = (UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge); UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:allNotificationTypes categories:nil]; [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; [[UIApplication sharedApplication] registerForRemoteNotifications]; [application registerForRemoteNotifications]; } else { // iOS 10 or later #if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge; [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:authOptions completionHandler:^(BOOL granted, NSError * _Nullable error) { } ]; // For iOS 10 display notification (sent via APNS) [[UNUserNotificationCenter currentNotificationCenter] setDelegate:self]; [[UIApplication sharedApplication] registerForRemoteNotifications]; return YES; } 

现在为iOS10以下版本实现此方法

  - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))handler { NSLog(@"Notification received: %@", userInfo); if( SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO( @"10.0" ) ) { NSLog( @"iOS version >= 10. Let NotificationCenter handle this one." ); return; } NSLog( @"HANDLE PUSH, didReceiveRemoteNotification: %@", userInfo ); else{ handler( UIBackgroundFetchResultNewData ); } } 

Apple在iOS10中引入了这两种方法来接收推送通知。

也写这些方法

  // Receive displayed notifications for iOS 10 devices. #if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler { NSDictionary *userInfo = notification.request.content.userInfo; NSLog(@"%@", userInfo); completionHandler( UNNotificationPresentationOptionAlert ); } -(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{ NSLog(@"Userinfo %@",response.notification.request.content.userInfo); // completionHandler(UNNotificationPresentationOptionAlert); } 

而已。

尝试这个