文档章节

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

豆花饭烧土豆
 豆花饭烧土豆
发布于 2016/11/15 00:03
字数 991
阅读 99
收藏 0
点赞 0
评论 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
博文 339
码字总数 83750
作品 0
深圳
iOS10推送通知(本地&远程)/Swift

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

秦无炎 ⋅ 2016/12/22 ⋅ 0

个推推送iOS版 常见问题详解

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

illy安智 ⋅ 2015/05/05 ⋅ 2

iphone 推送服务--Apple Push Notification Service

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

冯京宝 ⋅ 2012/07/17 ⋅ 0

iOS远程推送

最近在做基于环信的及时通讯项目,项目中必不可少的用到了远程推送功能,在我解决推送问题的过程中遇到了一些坑,同时也获得了不少的经验. 在个人理解以及查阅资料的基础上将远程推送相关的知识...

zh_iOS ⋅ 2016/07/14 ⋅ 0

iOS Apns远程推送

iOS Apns远程推送 远程推送应用配置过程 一. 创建支持远程推送功能的App ID 添加App ID 设置Bundle ID,不能设置通配ID 勾选远程通知选项,可以在配置App ID的时候勾选,也可以在原有App ID的...

linweida ⋅ 2016/09/17 ⋅ 0

iOS10适配远程推送

iOS10正式版发布之后,网上各种适配XCode8以及iOS10的文章满天飞。但对于iOS10适配远程推送的文章却不多。iOS10对于推送的修改还是非常大的,新增了UserNotifications Framework,今天就结合...

北方人在上海 ⋅ 2016/09/18 ⋅ 0

iOS 10推送适配问题 报错获取不到deviceToken

自从iOS10更新之后,各种权限更麻烦了、之前一直用激光推送,这次换友盟,加上iOS10踩了个大坑。 此处多了一条 这里可以不用理会 项目中多了一个文件 这里写上开发就行,听说上架会自己变成发...

山里来的 ⋅ 2016/11/30 ⋅ 0

iOS10本地通知UserNotifications快速入门

https://www.jianshu.com/p/5713fa2bfece iOS10更新变动最大的就是通知这部分了,新版通知变得更加统一,使用更加方便,设计更加自由。以前本地通知和远程推送是分开的,虽然这些到了iOS10都...

wakice ⋅ 2017/12/25 ⋅ 0

最清晰的ios消息推送机制教程

研究了一下Apple Push Notification Service,实现的很简单,很环保.原理如下 财大气粗的苹果提供了一堆服务器,每个ios设备和这些服务器保持了一个长连接,ios版本更新提示,手机时钟校准什么的都...

whj ⋅ 2014/03/16 ⋅ 0

iOS开发,推送消息 steps

概述:推送过程简介 一、App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请。若注册成功,回调函数application:(...

召唤攻城狮 ⋅ 2015/03/30 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何使用serverchan微信推送告警

之前实现推送告警信息到微信的方法有如下几种: 1、通过企业公众号实现----收费: 2、通过QQ邮箱,在微信平台上开启收到邮件进行提醒; 3、第三方告警平台API,一般也是收费的; 不过最近看文...

问题终结者 ⋅ 33分钟前 ⋅ 0

TCP的RPC

RPC就是远程方法调用(Remote Process Call ),包含了客户端和服务端,涉及了对象的序列化传输。 1.服务端启动,注册远程调用的类2.客户端发送请求信息包含类、方法、参数的一些信息、序列化传...

Cobbage ⋅ 54分钟前 ⋅ 0

IOS-UI UI初步代码布局添加事件

ISO开发界面,UI是必须学习的一部分,其实很早之前想学来了,一直没有沉下心来学习。看到IOS的代码风格和布局就别扭的不行,跟java代码和android布局比较显得不是那么方便,所以一直到现在。...

京一 ⋅ 今天 ⋅ 0

浅谈OpenDaylight的二次开发

OpenDaylight作为一款开源SDN网络控制器,依托于强大的社区支持以及功能特性,成为了目前主流的SDN网络控制器开发平台。在比较稳定的OpenDaylight Helium版本中,已经为开发者提供了大量的网...

wangxuwei ⋅ 今天 ⋅ 0

API 开发中可选择传递 token 接口遇到的一个坑

在做 API 开发时,不可避免会涉及到登录验证,我使用的是jwt-auth 在登录中会经常遇到一个token过期的问题,在config/jwt.php默认设置中,这个过期时间是一个小时,不过为了安全也可以设置更...

等月人 ⋅ 今天 ⋅ 0

Java NIO之文件处理

程序要操作本地操作系统的一个文件,可以分为以下三个部分: 对文件位置的操作 对文件的操作 对文件内容的操作 其中,对文件内容的操作在 Java NIO之Channel 中已经有了介绍,通过FileChann...

士别三日 ⋅ 今天 ⋅ 0

Maven的pom.xml配置文件详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.......

小海bug ⋅ 今天 ⋅ 0

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 今天 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 今天 ⋅ 0

Redis入门详解(转)

Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis应用场景 Redis总结 Redis简介: Redi...

xiaoyaoyoufang ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部