手把手教你实现iOS 远程推送

当我们的手机在关闭状态下仍然能收到各种通知,那是我们下载安装的App主动提示到来的新信息,下面是我手机通知中心的部分截图:


IMG_72BF35D8E9A7-1.jpeg

众说周知,iOS远程推送通过APNs实现。APNs是Apple Push Notification service的简称,它由Apple独家提供。远程推送的服务的实现依据的是服务器和客户端的长连接,信息通过服务器主动推送(push)给客户端(我们的手机)。其中Android基于开源的理念,推送策略由第三方自定义,方便的同时也造成了市场上推送技术五花八门的存在。而iOS的推送必须通过Apple的服务器来实现,虽然市面上常用的有极光,环信,融云等第三方的存在,但是它们都是基于Apple的APNs, 优化集成推送的前端工作,最后仍然需要将推送证书和设备标志DeviceToken发送给Apple的服务器来实现远程推送。

制作推送证书

iOS工程开发指引中对推送流程的概括如下


image.png

服务端的Provider通过APNs将信息推送给Client App经过两步:

1 Provider -> APNs   //需要苹果机构颁发的证书
2 APNs     -> Client   //需要DeviceToken标志App

制作证书之前,介绍一下iOS的设计理念: 基于闭环和安全的思考,苹果公司要求使用APNs服务的开发者,提供开发时的Mac设备、App的ID和运行App的手机,通过对三者的联合检查,基本上能保证确认App的唯一性,保证对AppStore的管理的安全性和可靠性。

首先,我们在苹果开发者中心,注册自己的App的唯一ID:

image.png

继续直至Done.

然后制作和AppID相绑定的CER证书


image.png

点击continue:

image.png

点击continue,能够看到需要创建CSR证书,下面有详细创建步骤,这一步可以绑定开发设备Mac。英文很简单,和创建发布证书时在「钥匙串访问」中的操作一样。

image.png

在「钥匙串访问」中能得到CSR文件

Snip20171207_21.png

上传CSR文件


Snip20171207_22.png

直至Done,下载CER文件:


image.png

双击安装到本机Mac。
image.png

在「钥匙串访问」我的证书中,能看到安装后的结果:


image.png

可以将证书导出,单独存放。以后别人需要,方便直接发送。

打开AppID的PushNotification功能


image.png

Snip20171207_30.png

现在,证书已经制作好了,然后我们在对应的工程中愉快的使用了。

在工程中使用证书

确认Target的Identify和Signing:


Snip20171207_31.png

iOS10中,改进了推送的代理方法,增加了3DTouch效果。下面以iOS10的新方法在AppDelegate添加接受通知的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    
    if (@available(iOS 10.0, *)) {
        
        [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:(UNAuthorizationOptionBadge|UNAuthorizationOptionSound|UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            NSLog(@"%@", error);
        }];
        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];
        [center setDelegate:self];
        [center setNotificationCategories:[NSSet setWithObjects:generalCategory, expiredCategory,
                                           nil]];
        
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    } else {

    }
    return YES;
}

#pragma mark - UNUserNotificationCenterDelegate

- (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{ 
    NSLog(@"%s", __func__);
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler{
    NSLog(@"%s", __func__);
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken {
    //保存deviceToken
    NSLog(@"regisger success:%@",pToken);
}

iOS的远程推送需要在真机上调试,如果注册成功,就能在didRegisterForRemoteNotificationsWithDeviceToken方法中获取APNs返回的DeviceToken,在打印栏可以看到。

使用SmartPush调试

使用SmartPush可以在电脑上方便的模拟APNs推送。运行程序,选择我们生成的证书和填上打印栏获得的DeviceToken,就能在我们的App中看到APNs推送来的带有3DTouch功能的通知。

image.png
IMG_0039.PNG
喜欢和关注都是对我的鼓励和支持~

参考文档:
http://www.jianshu.com/p/5a4b88874f3a
http://blog.csdn.net/showhilllee/article/details/8631734
https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html#//apple_ref/doc/uid/TP40008194-CH8-SW1

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