iOS8以前的遠程通知想必大家都非常熟悉了,這裡不做過多介紹,直接介紹iOS8中的交互式遠程通知。
一、通過調用 [[UIApplicationsharedApplication]registerForRemoteNotifications];來實現
application:didRegisterForRemoteNotificationsWithDeviceToken:和application:didFailToRegisterForRemoteNotificationsWithError:的回調
二、設置 UIUserNotificationAction和UIMutableUserNotificationCategory
UIUserNotificationAction的設置:
UIMutableUserNotificationAction *cancelAction = [[UIMutableUserNotificationAction alloc] init]; [cancelAction setIdentifier:@"CancelNotificationActionIdentifier"]; [cancelAction setTitle:@"Cancel"]; [cancelAction setActivationMode:UIUserNotificationActivationModeBackground]; [cancelAction setAuthenticationRequired:YES]; [cancelAction setDestructive:YES];
identifier
User notificaton aciton的唯一標示
title
User notificaton aciton button的顯示標題
activationMode
UIUserNotificationActivationModeForeground 激活App並打開到前台展示
UIUserNotificationActivationModeBackground 在後台激活App,測試時發現如果沒有啟動App(App不在後台也沒有打開),那麼執行這種模式下的操作,App不會打開;如果App已經在前台了,那麼執行這種模式下的操作,App依然在前台。
authenticationRequired
如果設置為YES,執行這個操作的時候必須解鎖設備,反之,無需解鎖。
如果activationMode為UIUserNotificationActivationModeForeground時,authenticationRequired被作為YES處理。
測試時發現,如果用戶設備有密碼,在鎖屏時authenticationRequired設置為YES執行操作時需要用戶輸入密碼,如果設置為NO則不需要用戶輸入密碼,如果用戶設備沒有密碼,那麼無論如何設置都不需要輸入密碼。
destructive
標示操作按鈕是否為紅色,只有在鎖屏和從通知中心向左滑動出現時才有這種突出顯示,在頂部消息展示時沒有這種突出效果。
UIMutableUserNotificationCategory的設置:
UIMutableUserNotificationCategory *notificationCategory = [[UIMutableUserNotificationCategory alloc] init]; [notificationCategory setIdentifier:@"NotificationCategoryIdentifier"]; [notificationCategory setActions:@[acceptAction, cancelAction] forContext:UIUserNotificationActionContextDefault];
identifier
category的唯一標示,identifier的值與payload(從服務器推送到客戶端的內容)中category值必須一致。
actions
UIUserNotificationAction 數組,如果設置為nil,那麼將不會顯示操作按鈕。
context
UIUserNotificationActionContextDefault 通知操作的默認Context,在這種情況下,你可以指定4個自定義操作。(還未驗證)
UIUserNotificationActionContextMinimal 通知操作的最小Context,在這種情況下,你可以指定2個自定義操作。(還未驗證)
UIUserNotificationType notificationTypes = (UIUserNotificationTypeAlert| UIUserNotificationTypeSound| UIUserNotificationTypeBadge); NSSet *categoriesSet = [NSSet setWithObject:notificationCategory]; UIUserNotificationSettings *notificationSettings = [UIUserNotificationSettings settingsForTypes:notificationTypes categories:categoriesSet];設置通知所支持的類型和Category,這裡沒有難點,不過多解釋。
四、注冊通知 registerUserNotificationSettings
[[UIApplication sharedApplication] registerUserNotificationSettings:notificationSettings];在iOS8中通過以上方式注冊通知,可以根據操作系統版本做區分處理
五、處理回調事件
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler { if([identifier isEqualToString:@"CancelNotificationActionIdentifier"]) { NSLog(@"You chose cancel action."); } else if ([identifier isEqualToString:@"AcceptNotificationActionIdentifier"]) { NSLog(@"You chose accept action."); } if(completionHandler) { completionHandler(); } }
application
收到通知的對象
identifier
UIUserNotificationAction的唯一標示
userInfo
payload的內容
completionHandler
當執行完指定的操作後,必須在最後調用這個方法
我測試用的paload是
{ aps = { alert = "Thank you very much"; badge = 1; category = NotificationCategoryIdentifier; sound = "ping.caf"; }; }