iOS - 前后台 推送笔记

第一、远程推送

    1、注册推送通知

    目前支持iOS 10.0 以上版本:

   导入框架#import <UserNotifications/UserNotifications.h> 并实现代理

        if(@available(iOS10.0, *)) {

        [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionBadge|UNAuthorizationOptionSound|UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {

            NSLog(@"%@",error);

            if(!error) {

                NSLog(@"授权成功");

            }

        }];

        UNNotificationCategory* generalCategory = [UNNotificationCategory

                                                           categoryWithIdentifier:@"GENERAL"

                                                           actions:@[]

                                                           intentIdentifiers:@[]

                                                           options:UNNotificationCategoryOptionCustomDismissAction];

                // Create the custom actions for expired timer notifications.

                UNNotificationAction* snoozeAction = [UNNotificationAction

                                                      actionWithIdentifier:@"SNOOZE_ACTION"

                                                      title:@"Snooze"

                                                      options:UNNotificationActionOptionAuthenticationRequired];

                UNNotificationAction* stopAction = [UNNotificationAction

                                                    actionWithIdentifier:@"STOP_ACTION"

                                                    title:@"Stop"

                                                    options:UNNotificationActionOptionDestructive];

                UNNotificationAction* forAction = [UNNotificationAction

                                                    actionWithIdentifier:@"FOR_ACTION"

                                                    title:@"forAction"

                                                    options:UNNotificationActionOptionForeground];

                // Create the category with the custom actions.

                UNNotificationCategory* expiredCategory = [UNNotificationCategory

                                                           categoryWithIdentifier:@"TIMER_EXPIRED"

                                                           actions:@[snoozeAction, stopAction,forAction]

                                                           intentIdentifiers:@[]

                                                           options:UNNotificationCategoryOptionNone];

                // Register the notification categories.

                UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];

                [centersetDelegate:self];

                [centersetNotificationCategories:[NSSetsetWithObjects:generalCategory, expiredCategory,

                                                   nil]];

                [[UIApplication sharedApplication] registerForRemoteNotifications];

    }else {

    }

    2、获取deviceToken

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

{

    //保存deviceToken

    NSLog(@"register success: %@",deviceToken);

}

    3、生成测试环境、生产环境证书:

    4、注册deviceToken到后台服务

        [XXXNetManager  registDeviceToken:deviceToken];

    5、接收推送通知(APP在显示状态下接收,APP在后台或进程关闭下接收)

    //将要推送

- (void)userNotificationCenter:(UNUserNotificationCenter*)centerwillPresentNotification:(UNNotification*)notificationwithCompletionHandler:(void(^)(UNNotificationPresentationOptionsoptions))completionHandler__API_AVAILABLE(macos(10.14), ios(10.0), watchos(3.0), tvos(10.0))

{

    NSLog(@"%s",__func__);

    NSLog(@"%@",notification.request.content.userInfo);

}

//完成推送

- (void)userNotificationCenter:(UNUserNotificationCenter*)centerdidReceiveNotificationResponse:(UNNotificationResponse*)responsewithCompletionHandler:(void(^)(void))completionHandler__API_AVAILABLE(macos(10.14), ios(10.0), watchos(3.0))__API_UNAVAILABLE(tvos)

{

    NSLog(@"%s",__func__);

    NSLog(@"%@",response.notification.request.content.userInfo);

}

    6、读取aps:下的消息体,解析处理对应业务逻辑。

    UNNotificationRequest->UNNotificationContent->(NSDictionary *)userInfo

    使用SmartPush推送测试工具 测试:

第二、本地推送

    本地推送案例比较多,这里不再记录。

第三、在线消息

   1、 使用MQTT 发布、订阅方式 ,  根据与后台协商好的用户名、密码、心跳时间、QoS级别等发起连接。

2、连接状态检测:

-(void)handleEvent:(MQTTSession*)sessionevent:(MQTTSessionEvent)eventCodeerror:(NSError*)error{

    if (eventCode == MQTTSessionEventConnected) {

        NSLog(@"2222222 连接MQTT 成功");

    }else if (eventCode == MQTTSessionEventConnectionRefused){

        NSLog(@"MQTT 拒绝连接");

    }else if (eventCode ==MQTTSessionEventConnectionClosed){

        NSLog(@"MQTT 连接关闭");

    }else if(eventCode ==  MQTTSessionEventConnectionError){

        NSLog(@"MQTT 连接错误");

    }else if (eventCode == MQTTSessionEventProtocolError){

        NSLog(@"MQTT 协议错误");

    }else{

        NSLog(@"MQTT 其他错误");

    }

    if(error) {

        NSLog(@"连接报错 -- %@",error);

    }

}

在连接成功后,发起订阅:

一次性订阅多个主题  @"%@/test/#"

MQTT主题(Topic)支持’+’, ‘#’的通配符,’+’通配一个层级,’#’通配多个层级(必须在末尾)

解释一下,#表示,test下面的所有主题,假如你有5个主题,你这样就可以一次性订阅完成,然后你在返回的数据中,判断对应的主题处理数据就可以了.

第四、离线消息

使用MQTTSessionManager 初始化 并实现代理,具体细节如下:

self.manager = [[MQTTSessionManager alloc]init];

    self.manager.delegate = self;

    self.manager.subscriptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:MQTTQosLevelExactlyOnce] forKey:[NSString stringWithFormat:@"%@/#",self.base]];

    [self.manager connectTo:kMQTTHost //服务器地址

                       port:kMQTTPort//服务端端口号

                        tls:false  //是否使用tls协议,mosca是支持tls的,如果使用了要设置成true

                  keepalive:60  //心跳时间,单位秒,每隔固定的时间发送心跳包

                      clean:false  //session是否清除,这个需要注意,如果是false,代表保持登录,如果客户端离线了再次登录就可以接收到离线消息。注意:QoS为1和QoS为2,并需订阅和发送一致

                       auth:true //是否使用登录验证,和下面的user和pass参数组合使用

                       user:self.uid  //用户名

                       pass:self.password  //密码

                       will:false  //异常离线消息体。自定义的异常离线消息,约定好格式就可以了

                  willTopic:@""  //如果客户端异常离线发送的消息,当前参数是哪个topic用来传输异常离线消息,这里的异常离线消息都指的是客户端掉线后发送的掉线消息

                    willMsg:nil  //具体内容

                    willQos:0  //接收离线消息的级别 0、1、2

             willRetainFlag:false  //只有在为true时, Will Qos和 Will retain 才会被读取,此时消息体payload中要出现Will Topic 和Will Message具体内容,否则,Will QoS和 Will Retain 值会被忽略掉

               withClientId:nil  //客户端id,需要特别指出的是这个id需要全局唯一,因为服务器是根据这个来区分不同的客户端的,默认情况下一个id登录后,假如有另外的连接以这个id登录,上一个连接会被踢下线。

             securityPolicy:nil  //消息通信的安全策略设置

               certificates:nil  //证书数组

              protocolLevel:MQTTProtocolVersion311  //协议等级设置

             connectHandler:^(NSError*error) {

        if(error) {

            NSLog(@"error === %@",error);

        }

    }];

}

五、Java 使用Pushy 实现Apns 推送消息:

Pushy是用于发送APN(iOS,MacOS和Safari)推送通知的Java库。它由Turo的工程师编写和维护。

Pushy使用Apple的基于HTTP / 2的APN协议发送推送通知,并支持TLS和基于令牌的身份验证。

原文链接:https://blog.csdn.net/qq_28483283/article/details/80514161


六、Java MqttWk  实现在线消息订阅:

    基于 nutzboot + netty + redis + kafka 实现的MQTT服务broker

    详细细节说明请看链接: https://gitee.com/wizzer/MqttWk#mqttwk-by-netty

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容

  • 介绍一下iOS10的通知新功能,用户体验的提升和开发者能够发挥的地方非常多,使得iOS更具有竞争力。 1.iOS ...
    F麦子阅读 3,815评论 3 4
  • iOS 消息推送 之前没怎么关注 这块 今天要做消息推送 就做个记录 也算是知识的总结啦 理一理头绪 我们要做这件...
    微笑城_cbe9阅读 958评论 0 0
  • 总体内容1.推送通知的介绍2.本地通知3.远程通知4.极光推送的使用 一、推送通知的介绍 1.1、推送通知的作用:...
    IIronMan阅读 5,114评论 4 34
  • 许多集成的步骤个推官网都有了,这里只写关于推送的远程推送和本地通知的步骤和代码。APP在后台时:走苹果的APNS通...
    AllureJM阅读 2,717评论 1 9
  • 夜莺2517阅读 127,718评论 1 9