iOS10全新方法实现推送+deviceToken无法获取或无效的解决

Xcode 8和iOS10正式版出来后,这个方法做了修改,也是之前也没发现这个参数有啥用:
UNNotificationCategory *category1 = [UNNotificationCategory categoryWithIdentifier:@"Category1" actions:@[action2,action1] minimalActions:@[action2,action1] intentIdentifiers:@[@"action1",@"action2"] options:UNNotificationCategoryOptionCustomDismissAction];
改成了:去掉了minimalActions:
UNNotificationCategory *category1 = [UNNotificationCategory categoryWithIdentifier:@"Category1" actions:@[action2,action1] intentIdentifiers:@[@"action1",@"action2"] options:UNNotificationCategoryOptionCustomDismissAction];


在开始之前需要打开一个推送开关,不然无法获取deviceToken,老项目或者出现deviceToken无效的情况。


iOS10全新方法实现推送+deviceToken无法获取或无效的解决_第1张图片


  

或许还应该打开这个

iOS10全新方法实现推送+deviceToken无法获取或无效的解决_第2张图片


新增了UserNotifications Framework
?
1
#import


?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- ( BOOL )application:(UIApplication *)application didFinishLaunchingWithOptions:( NSDictionary *)launchOptions {
  // Override point for customization after application launch.
  
  /* APP未启动,点击推送消息的情况下 iOS10遗弃UIApplicationLaunchOptionsLocalNotificationKey,使用代理UNUserNotificationCenterDelegate方法didReceiveNotificationResponse:withCompletionHandler:获取本地推送
     */
//    NSDictionary *localUserInfo = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
//    if (localUserInfo) {
//        NSLog(@"localUserInfo:%@",localUserInfo);
//        //APP未启动,点击推送消息
//    }
  NSDictionary *remoteUserInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
  if (remoteUserInfo) {
  NSLog (@ "remoteUserInfo:%@" ,remoteUserInfo);
  //APP未启动,点击推送消息,iOS10下还是跟以前一样在此获取
    }
  
  return YES ;
}



?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
- ( void )registerNotification{
     /*
      identifier:行为标识符,用于调用代理方法时识别是哪种行为。
      title:行为名称。
      UIUserNotificationActivationMode:即行为是否打开APP。
      authenticationRequired:是否需要解锁。
      destructive:这个决定按钮显示颜色,YES的话按钮会是红色。
      behavior:点击按钮文字输入,是否弹出键盘
      */
     UNNotificationAction *action1 = [UNNotificationAction actionWithIdentifier:@ "action1" title:@ "策略1行为1" options:UNNotificationActionOptionForeground];
     /*iOS9实现方法
     UIMutableUserNotificationAction * action1 = [[UIMutableUserNotificationAction alloc] init];
     action1.identifier = @"action1";
     action1.title=@"策略1行为1";
     action1.activationMode = UIUserNotificationActivationModeForeground;
     action1.destructive = YES;
      */
     
     UNTextInputNotificationAction *action2 = [UNTextInputNotificationAction actionWithIdentifier:@ "action2" title:@ "策略1行为2" options:UNNotificationActionOptionDestructive textInputButtonTitle:@ "textInputButtonTitle" textInputPlaceholder:@ "textInputPlaceholder" ];
     /*iOS9实现方法
         UIMutableUserNotificationAction * action2 = [[UIMutableUserNotificationAction alloc] init];
         action2.identifier = @"action2";
         action2.title=@"策略1行为2";
         action2.activationMode = UIUserNotificationActivationModeBackground;
         action2.authenticationRequired = NO;
         action2.destructive = NO;
         action2.behavior = UIUserNotificationActionBehaviorTextInput;//点击按钮文字输入,是否弹出键盘
     */
     
     UNNotificationCategory *category1 = [UNNotificationCategory categoryWithIdentifier:@ "Category1" actions:@[action2,action1] minimalActions:@[action2,action1] intentIdentifiers:@[@ "action1" ,@ "action2" ] options:UNNotificationCategoryOptionCustomDismissAction];
     //        UIMutableUserNotificationCategory * category1 = [[UIMutableUserNotificationCategory alloc] init];
     //        category1.identifier = @"Category1";
     //        [category1 setActions:@[action2,action1] forContext:(UIUserNotificationActionContextDefault)];
     
     UNNotificationAction *action3 = [UNNotificationAction actionWithIdentifier:@ "action3" title:@ "策略2行为1" options:UNNotificationActionOptionForeground];
     //        UIMutableUserNotificationAction * action3 = [[UIMutableUserNotificationAction alloc] init];
     //        action3.identifier = @"action3";
     //        action3.title=@"策略2行为1";
     //        action3.activationMode = UIUserNotificationActivationModeForeground;
     //        action3.destructive = YES;
     
     UNNotificationAction *action4 = [UNNotificationAction actionWithIdentifier:@ "action4" title:@ "策略2行为2" options:UNNotificationActionOptionForeground];
     //        UIMutableUserNotificationAction * action4 = [[UIMutableUserNotificationAction alloc] init];
     //        action4.identifier = @"action4";
     //        action4.title=@"策略2行为2";
     //        action4.activationMode = UIUserNotificationActivationModeBackground;
     //        action4.authenticationRequired = NO;
     //        action4.destructive = NO;
     
     UNNotificationCategory *category2 = [UNNotificationCategory categoryWithIdentifier:@ "Category2" actions:@[action3,action4] minimalActions:@[action3,action4] intentIdentifiers:@[@ "action3" ,@ "action4" ] options:UNNotificationCategoryOptionCustomDismissAction];
     //        UIMutableUserNotificationCategory * category2 = [[UIMutableUserNotificationCategory alloc] init];
     //        category2.identifier = @"Category2";
     //        [category2 setActions:@[action4,action3] forContext:(UIUserNotificationActionContextDefault)];
     
     
     [[UNUserNotificationCenter currentNotificationCenter] setNotificationCategories:[ NSSet setWithObjects:category1,category2, nil ]];
     [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert completionHandler:^( BOOL granted, NSError * _Nullable error) {
         NSLog (@ "completionHandler" );
     }];
     /*iOS9实现方法
     UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:[NSSet setWithObjects: category1,category2, nil]];
 
     [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
     */
     [[UIApplication sharedApplication] registerForRemoteNotifications];
     
     
     [UNUserNotificationCenter currentNotificationCenter].delegate = self ;
}



?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#pragma mark -
 
- ( void )application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings NS_AVAILABLE_IOS (8_0) __TVOS_PROHIBITED{
     NSLog (@ "didRegisterUserNotificationSettings" );
}
 
- ( void )application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:( NSData *)deviceToken NS_AVAILABLE_IOS (3_0){
     NSLog (@ "deviceToken:%@" ,deviceToken);
     NSString *deviceTokenSt = [[[[deviceToken description]
                                  stringByReplacingOccurrencesOfString:@ "<" withString:@ "" ]
                                 stringByReplacingOccurrencesOfString:@ ">" withString:@ "" ]
                                stringByReplacingOccurrencesOfString:@ " " withString:@ "" ];
     NSLog (@ "deviceTokenSt:%@" ,deviceTokenSt);
}
 
- ( void )application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:( NSError *)error NS_AVAILABLE_IOS (3_0){
     NSLog (@ "didFailToRegisterForRemoteNotificationsWithError:%@" ,error);
}
 
/*iOS9使用方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo NS_DEPRECATED_IOS(3_0, 10_0, "Use UserNotifications Framework's -[UNUserNotificationCenterDelegate willPresentNotification:withCompletionHandler:] or -[UNUserNotificationCenterDelegate didReceiveNotificationResponse:withCompletionHandler:] for user visible notifications and -[UIApplicationDelegate application:didReceiveRemoteNotification:fetchCompletionHandler:] for silent remote notifications"){
     
}
*/
 
- ( void )userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:( void (^)(UNNotificationPresentationOptions))completionHandler{
     NSLog (@ "willPresentNotification:%@" ,notification.request.content.title);
     
     // 这里真实需要处理交互的地方
     // 获取通知所带的数据
     NSString *notMess = [notification.request.content.userInfo objectForKey:@ "aps" ];
     
}
 
- ( void )userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:( void (^)())completionHandler{
     //在没有启动本App时,收到服务器推送消息,下拉消息会有快捷回复的按钮,点击按钮后调用的方法,根据identifier来判断点击的哪个按钮
     NSString *notMess = [response.notification.request.content.userInfo objectForKey:@ "aps" ];
     NSLog (@ "didReceiveNotificationResponse:%@" ,response.notification.request.content.title);
//    response.notification.request.identifier
}
 
//远程推送APP在前台
- ( void )application:(UIApplication *)application didReceiveRemoteNotification:( NSDictionary *)userInfo fetchCompletionHandler:( void (^)(UIBackgroundFetchResult))completionHandler{
     NSLog (@ "didReceiveRemoteNotification:%@" ,userInfo);
}




还有推送插件开发

iOS10全新方法实现推送+deviceToken无法获取或无效的解决_第3张图片
 


iOS10全新方法实现推送+deviceToken无法获取或无效的解决_第4张图片 


转:http://www.cocoachina.com/bbs/read.php?tid=1686948

你可能感兴趣的:(iOS,特性)