文档章节

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

豆花饭烧土豆
 豆花饭烧土豆
发布于 2016/11/15 00:03
字数 991
阅读 99
收藏 0

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无效的情况。




  

或许还应该打开这个



新增了UserNotifications Framework

?

1

#import <UserNotifications/UserNotifications.h>


 

?

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

}





还有推送插件开发

 

 

 

参考:http://blog.csdn.net/sharpyl/article/details/53135952

© 著作权归作者所有

共有 人打赏支持
豆花饭烧土豆
粉丝 14
博文 352
码字总数 92353
作品 0
深圳
iOS10推送通知(本地&远程)/Swift

iOS10本地通知 一.发送一个简单的本地通知 1.注册通知

秦无炎
2016/12/22
247
0
《小印记》iOS源码分享--极光推送实践篇

笔者这几天刚完成《小印记》的推送功能,今天特分享一下在做的过程中实际解决的问题。如果读者学到了有用的东西,希望能前往App Store下载《小印记》支持一下笔者,谢谢! 《小印记》iOS源码...

_子墨
2017/03/21
0
2
react-native 使用leanclound消息推送

iOS消息推送的基本流程 1.注册:为应用程序申请消息推送服务。此时你的设备会向APNs服务器发送注册请求。2. APNs服务器接受请求,并将deviceToken返给你设备上的应用程序 3.客户端应用程序将...

ding_ios
08/05
0
0
个推推送iOS版 常见问题详解

1、提交了.p12文件后多久可以测试? 提交后10分钟左右才可以测试,并不是立即生效的。 2、应用在后台时接收不到消息,即APNS消息接收不到? 1. 先去查看CID和APPID绑定是否正确。 2. 根据CID...

illy安智
2015/05/05
11.2K
2
iphone 推送服务--Apple Push Notification Service

iphone 推送服务--Apple Push Notification Service 分类: 推送服务2011-04-14 14:24 8398人阅读 评论(4) 收藏 举报

冯京宝
2012/07/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

五大云原生技术

云原生(Cloud-Native)是一种文化,更是一种潮流,它是云计算的一个必然导向,是让云成为云化战略成功的基石。云计算时代,云原生技术注定将对现代化应用的建设、交付与运维产生颠覆性的影响...

问题终结者
22分钟前
3
0
Android JNI开发系列(十二) JNI局部引用、全局引用和弱全局引用

JNI 局部引用、全局引用和弱全局引用 在JNI规范中定义了三种引用:局部引用(Local Reference)、全局引用(Global Reference)、弱全局引用(Weak Global Reference)。区别如下: 局部引用...

蔡小鹏
23分钟前
2
0
Android 实现类似考试座号表效果

类似于这种效果 1,新建一个Student类,用户添加学生信息 private int icon; private String name; private int age; private String sex ; private int id; publ...

lanyu96
29分钟前
1
0
聊聊storm的CustomStreamGrouping

序 本文主要研究一下storm的CustomStreamGrouping CustomStreamGrouping storm-2.0.0/storm-client/src/jvm/org/apache/storm/grouping/CustomStreamGrouping.java public interface CustomS......

go4it
38分钟前
2
0
编程中的各种闲谈

service 是否一定要定义 interface 在学习ssh(spring, struts2, hibernate)时,老师教在 service 层要定义接口,再去实现此接口,方便解耦。 在 spring 框架中,自身定义了很多接口,并且有不...

seal_90
39分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部