ios 推送_ios推送 - CSDN
精华内容
参与话题
  • IOS的消息推送机制

    千次阅读 2017-08-15 13:42:28
    1、iOS推送是统一挂在苹果服务器上的,app安装的时候设备会把token分享给app,app的服务器根据这个token发消息给苹果,苹果根据token发给设备设备和苹果的连接由系统挂在流量上的tcp长连接实现,装再多app也只...

    1、iOS 的推送是统一挂在苹果服务器上的,app安装的时候设备会把token分享给app,app的服务器根据这个token发消息给苹果,苹果根据token发给设备

    设备和苹果的连接由系统挂在流量上的tcp长连接实现,装再多app也只需要挂这么一个连接就能保证推送,不像国产安卓app每个都要自己挂后台并且保持连接

    其实安卓也是有系统级的推送服务的,这个服务因为由一个不存在的服务商提供,所以没法用,你说怪谁?

    此外说到本地通知,iOS也有方案,app可以向系统请求注册本地通知,到时间了由系统自己发出来,也不需要app挂后台

    2、苹果的消息机制通俗的来讲就是这样:

    APP的厂商的消息发给苹果服务器,苹果服务器发给制定iOS设备

    所以iOS也会为信息推送留进程,但是只有iOS里的一个系统进程,APP不用留,你收到的通知和APP没有半分钱关系,这就是为什么iOS版的微信和QQ每次进入都有一段时间要收取消息。

    Android是这样:

    从APP服务器直接发给APP,APP用申请的弹窗权限给你弹出来

    所以每一个应用都得有个进程才能接收通知

    为啥会这样呢?

    其实Android也有一套系统级信息推送服务

    然而服务器是Google的,后面不用我说了吧

    3、Push的原理:
    Push 的工作机制可以简单的概括为下图
    这里写图片描述

    图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider。
    APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。
    上图可以分为三个阶段。
    第一阶段:Push服务器应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。
    第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
    第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。

    这里写图片描述

    从上图我们可以看到。
    1、首先是应用程序注册消息推送。
    2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
    3、应用程序将deviceToken发送给PUSH服务端程序。
    4、 服务端程序向APNS服务发送消息。
    5、APNS服务将消息发送给iPhone应用程序。

    展开全文
  • 前言iOS和Android上的实时消息推送差异很大,往小了说是技术实现的差异,往大了说是系统实现理念的不同。实时消息推送在移动端互联网时代很平常,也很重要,它的存在让智能...
        

    640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

    前言


    iOS和Android上的实时消息推送差异很大,往小了说是技术实现的差异,往大了说是系统实现理念的不同。实时消息推送在移动端互联网时代很平常,也很重要,它的存在让智能终端真正成为全时信息传播的工具。本文将从原理上谈谈两个平台上实时消息推送的区别。

    简要对比


    1iOS的实时消息推送


    iOS 系统的推送(APNS,即 Apple Push Notification Service)依托一个或几个系统常驻进程运作,是全局的(接管所有应用的消息推送),所以可看作是独立于应用之外,而且是设备和苹果服务器之间的通讯,而非应用的提供商服务器。你的例子里面,腾讯 QQ 的服务器(Provider)会给苹果公司对应的服务器(APNs)发出通知,然后再中转传送到你的设备(Devices)之上。当你接收到通知,打开应用,才开始从腾讯服务器接收数据,跟你之前看到通知里内容一样,但却是经由两个不同的通道而来。

    公众号推荐:

    640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

    2Android的实时消息推送


    而 Android,就不同,更像是传统桌面电脑系统做法。每个需要后台推送的应用有各自的单独后台进程,才能和各自的服务器通讯,交换数据。另外其实 Android 也有类似 APNS 的 GCM(Google Cloud Message),属于开发者可选,非强制。

    3小结


    所以你大概看出来区别,iOS 的消息推送机制面世之时是一种全新的解决方案(堪称平台中的平台),应用本身不能有常驻的后台进程,系统的开销少,内存使用更少,电量也更少(把更多的运算和资源开销放在云端,非设备端)。而 Android 的特点,虽然开销大,优点是更稳定快速,但不明显。

    技术原理


    640?wx_fmt=png


    在这里,你要寄送的快件儿就是你要发的“消息”,送达房间相当于最终“接收消息的App”,顺丰公司在北京的总站点相当于这里提到的“设备”,送达房间的房间号就相当于这个环节里面提到的“包名”。

    公众号推荐:

    640?wx_fmt=jpeg

    2iOS实时消息推送


    iOS的推送是通过苹果自己的APNs服务进行的,用户需要将device_token以及消息内容等推送信息交给APNs服务器,剩下的均由苹果自己来完成。iOS应用的推送大部分情况下都要依赖苹果生态提供的APNs(Apple Push Notification Service)服务。

    640?wx_fmt=png

    首先作为设备标识的device-token是由APNs颁发的,App开发者或者第三方推送平台(图中的Provider)做的工作是收集这个device-token,APNs的推送是要求基于APNs颁发的device-token来推送的。只有正确的device-token会被APNs接受,如果是一个错误的、或者无效的device-token(比如App已经卸载了),APNs就不会接受。

    640?wx_fmt=png

    接着开发者使用第三方推送平台(图中的Provider)在将推送内容与范围选定之后进行推送,第三方推送平台将信息提交给APNs,剩下的操作全部都由APNs来进行完成,整个过程第三方推送平台就不能控制了。但是如果提供的device_token是失效的(app被卸载、系统版本升级导致device_token变化等情况)那么推送过程就会被中断,频繁的断线重连甚至会被APNs认为是一直DoS攻击。

    640?wx_fmt=png


    下图是Android平台消息推送的简单示意图:

    640?wx_fmt=png

    开发者通过第三方推送服务提供商将信息直接下发给需要的设备,第三方推送服务提供商与设备建立一条长连接通道,并且将消息路由到APP中(图中的设备1与设备2),对于像设备3这种无网络连接或是没有成功建立长连接通道的设备,会在设备3连网且推送消息没有过期的情况下自动收到由第三方推送服务提供商推送过来的消息,保证消息不会丢失。

    实现上的差异所带来的直观感受


    1iOS的实时消息推送


    iOS 在系统级别有一个推送服务程序使用 5223 端口。使用这个端口的协议源于 Jabber 后来发展为 XMPP ,被用于 Gtalk 等 IM 软件中。

    640?wx_fmt=png 

    所以, iOS 的推送,可以不严谨的理解为:

    • 苹果服务器朝手机后台挂的一个 IM 服务程序发送的消息。

    • 然后,系统根据该 IM 消息识别告诉哪个 Apps 具体发生了什么事。

    • 然后,系统分别通知这些 Apps 。

    640?wx_fmt=png


    2Android的实时消息推送


    Apps 挂后台一直是 Android 引以为豪的特性(虽然我真的不知道是好处多还是坏处多。。),大家挂后台等待推送就成为技术选择。当然, Google 事后也提供类似苹果的推送方式了。倒也谈不上抄袭,毕竟苹果的整个技术实现也没有什么特别创新之处。

    用户的电池? Apps 的开发者不会站在系统层面考虑的。他会假设其他 Apps 没有那么“不自觉”。而 Google 不强制的结果就是:没人真正为用户的电池负责。

    但是, Google 的方案也并非全是悲剧:也因为整个技术方案非强制, Android 的 Apps 在接收到推送后的表现更为灵活。像 Line 的 Android 版本可以在推送通知的 Popup 上直接回复, iOS 就需要越狱才能做到了。

    结语


    强制和封闭,有时候并非坏事。他意味着做出这个决定的人,要为此负责。所以,如果说苹果的推送方案有何创新?

    我以为是超越技术,不惜让公司承担更多风险和责任的解决方案。(类似的还有 BB 的专用网络, Kindle 的全球 3G )。

    个人相信,担负起这些“额外”的责任,是值得的。只要是为了用户!

    640?wx_fmt=jpeg


    展开全文
  • IOS开发之实现App消息推送(最新)

    万次阅读 多人点赞 2016-06-20 14:45:52
    今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:...

    好久没有写过博客啦,今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6, IOS8, 以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很合适

    第一部分

    首先第一步当然是介绍一下苹果的推送机制(APNS)咯(ps:其实每一篇教程都有),先来看一张苹果官方对其推送做出解释的概要图。

    Provider是给你手机应用发出推送消息的服务器,而APNS(Apple Push Notification Service)则是苹果消息推送服务器。你本地的服务器当需要给应用推送一条消息的时候,先要将消息发出到苹果推送服务器,然后再由苹果推送服务器将消息发到安装了该应用的手机。

    接下来再看一张解释图:


    根据上图的逻辑我来给大家解释一下:

    1.你的IOS应用需要去注册APNS消息推送功能。

    2.当苹果APNS推送服收到来自你应用的注册消息就会返回一串device token给你(很重要)

    3.将应用收到的device Token传给你本地的Push服务器。

    4.当你需要为应用推送消息的时候,你本地的推送服务器会将消息,以及Device Token打包发送到苹果的APNS服

    5.APNS再将消息推送给目的iphone


    第二部分

    1.从证书颁发机构颁发证书

    打开你mac的钥匙串访问: 然后点击钥匙串访问


    随后它会弹出一个窗口用户电子邮件信息就填写你苹果开发者账号的名称即可(应该是一个邮件名称),点击保存到磁盘的选

    项,点击继续,显示如下:



    点击存储,文件名为:CertificateSigningRequest.certSigningRequest 随后将他放在一个文件夹中我们取名push吧!


    第三部分

    访问苹果开发者网址:https://developer.apple.com/


    选中MemberCenter选项,进入登陆页面,用你的苹果开发者账号登陆,过一会网页就会自动跳转到下图。

    点击红色所选部分内容进行下一步的操作。


    选择Certificates选项,设置证书,如图所示先解释一下:

     


    Development选项的作用顾名思义就是用来作为开发使用的证书,Production选项则是用来发布产品使用的,名称很陌生是不是,之

    前的开发者网页是没有这一选项的,可能是苹果把他修改了,用这个名称更加能让人理解吧(字面上解释就是产品么)。两个选项生

    成证书的步骤是一样的,现在我们使用开发者的选项进行证书的制作,步骤如下:选择Development选项:



    点击上面的加号选项,



    选择APNS选项(开发么当然是在沙盒环境下了,模拟真实情况),然后Continue



    这个AppID我们在下一部分讲如何生成,现在我用的是已经生成好的一个应用ID,继续Continue



    这边就要选择在钥匙串访问环节下载下来的CertificateSigningRequest.certSigningRequest文件了,选择并生成:


    点击下载,得到aps_development .cer,保存到push文件中去。


    第四部分

    新建一个AppID,选择网页上的AppIDs,然后点击右上角的 “加号



    App的取名只要按照苹果要求的就可以了



    然后BundleID是比较重要的,在提交审核以及测试(苹果的TestFlight)和付费环节都需要用到,也只需按照苹果要求来写就好了。



    接下来就是对你的应用需要使用苹果的哪些服务进行选择就行了,例如广告,游戏中心,推送,付费等等情况。


    最后选择“Submit”选项,在下一个界面中选择“done”选项,这样我们设置AppID的步骤我们就完成了。


    第五部分:生成Provisioning Profiles

    这个配置概要文件分为两种,一种是为开发使用的,还有一种则是为发布到appStore上面。


    创建发布版的ProvisioningProfile与开发版的流程相同,点击Development然后点击右上角的加号


    会进入选择何种配置概要文件的界面:



    我们现在时测试,所以选择“IOS App Development”的选项,在下面的Distribution发布选项中有两个选择,“App Store”以及

    “Ad hoc”,你可以根据下面的描述选择你发布所需的选项。点击Continue进入下一步。


    选择你上一步创建的AppID,点击Continue 进行下一步


    选择你的开发者账号,Continue进行下一步


    在这一步上选择你的设备(你只有在这一步上勾选了你的设备,你才能在设备上用这个签名进行调试)。关于如何将你的设备号添加

    进去也是非常简单的,选择左侧的"Devices",然后点击右上角的加号,在随后出来的页面上添加你设备的UUID(在XCode中可以查

    看到)以及name( 可以随便取,自己看的懂就行)然后Register一下,照着流程走到最后一步就完成了。

    好咱们继续回到上面的Provisioning Profile配置环节,当你选好了你的设备后点击“Continue”进入下一页,



    输入一个文件名(最好是起的能看懂是干嘛的,当然也可以随便起),点击“Generate”进入下一个页面,在这个页面中就会有一个下

    载按钮让你下载这个文件,我们把它下载下来放在Push文件夹中。


    第六部分

    好了,前期的准备工作都已经做完了,现在让我们开始推送吧!(吼吼)

    首先双击我们生成的 “aps_development .cer” 文件,进入钥匙串访问,找到我们的专用秘钥(根据在第二部分中从证书机构颁发证书操作中填写的常用名



    我在第二部分填写的是“silicon”,由于换了一台mac之前安装的没有了,之前没有截图,所以随便找了个图给大家看一下,凭大家的聪明才智应该不难理解吧。

    然后右击导出,会弹出如下所示的图。



    将他存储到push文件夹中,命名为“push.p12”,在这一步中导出会让你输入密码并验证,你可以自定义一个密码,例如abc123

    现在push文件夹中应该有几个文件“aps_development .cer” ,"push.p12",“CertificateSigningRequest.certSigningRequest”以及

    刚才下下来的配置概要文件。


    接下来我们打开终端将他们生成.pem文件

    1.把aps_development .cer文件生成.pcm文件,cd到push文件夹下



    2.把push.p12文件生成为.pem文件


    上边输入的密码则是你导出证书所设的密码,即abc123.接着还会让你输入.pem文件的密码,还是使用abc123好了,防止混淆。

    这样我们在push文件夹中就又得到了两个文件,PushChatCert.pem和PushChatKey.pem。


    3.把PushChatCert.pem和PushChatKey.pem合并为一个pem文件,



    在push文件夹中又多了一个ck.pem文件,以上我们把需要使用的文件都准备好了


    接下来就要测试一下啦,是不是很激动~

    为了测试证书工作的状况,我们可以使用“telnet gateway.sandbox.push.apple.com 2195”来检测一下,如果显示下图则表示成功了。



    然后,我们使用我们生成的证书和私钥来设置一个安全的链接去链接苹果服务器

    在终端输入如下命令:openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem

    需要输入密码(abc123 我们刚才所设置的)。

    然后他会返回一系列的数据,这里我就粘贴一部分啦:


    CONNECTED(00000003)

    depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa is incorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust Certification Authority - L1C

    verify error:num=20:unable to get local issuer certificate

    verify return:0

    ---

    Certificate chain

    。。。。。(省略)

    。。。。。(省略)

    。。。。。(省略)

        Start Time: 1416389389

        Timeout   : 300 (sec)

        Verify return code: 0 (ok)

    ---

    测试就到这里啦。。。


    第七部分

    1.建立推送项目

    //
    //  AppDelegate.m
    //  TestPushNotifiy
    //
    //  Created by silicon on 14-10-30.
    //  Copyright (c) 2014年 silicon. All rights reserved.
    //
    
    #import "AppDelegate.h"
    
    @implementation AppDelegate
    @synthesize mainView = _mainView;
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
        {
            //IOS8
            //创建UIUserNotificationSettings,并设置消息的显示类类型
            UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:nil];
            
            [application registerUserNotificationSettings:notiSettings];
            
        } else{ // ios7
            [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge										 |UIRemoteNotificationTypeSound										 |UIRemoteNotificationTypeAlert)];
        }
        
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        // Override point for customization after application launch.
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
        
        self.mainView = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
        self.window.rootViewController = self.mainView;
        return YES;
    }
    
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken{
        NSLog(@"---Token--%@", pToken);
    }
    
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
        
        NSLog(@"userInfo == %@",userInfo);
        NSString *message = [[userInfo objectForKey:@"aps"]objectForKey:@"alert"];
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
        
        [alert show];
    }
    
    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
    
        NSLog(@"Regist fail%@",error);
    }
    
    - (void)applicationWillResignActive:(UIApplication *)application
    {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
    }
    
    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }
    
    - (void)applicationWillEnterForeground:(UIApplication *)application
    {
        // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
    }
    
    - (void)applicationDidBecomeActive:(UIApplication *)application
    {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }
    
    - (void)applicationWillTerminate:(UIApplication *)application
    {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }
    
    @end
    

    在appdelegate.m中加入以上代码,

    if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)])
        {
            //IOS8
            //创建UIUserNotificationSettings,并设置消息的显示类类型
            UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:nil];
            
            [application registerUserNotificationSettings:notiSettings];
            
        } else{ // ios7
            [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge										 |UIRemoteNotificationTypeSound										 |UIRemoteNotificationTypeAlert)];
        }

    由于ios8的推送跟ios7及以下的不一样,所以需要加判断来注册消息推送。

    函数:

    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken{
        NSLog(@"---Token--%@", pToken);
    }


    会接收来自苹果服务器给你返回的deviceToken,然后你需要将它添加到你本地的推送服务器上。(很重要,决定你的设备能不能接收到推送消息)。

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
        
        NSLog(@"userInfo == %@",userInfo);
        NSString *message = [[userInfo objectForKey:@"aps"]objectForKey:@"alert"];
        
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
        
        [alert show];
    }

    这个函数则是当设备接收到来自苹果推送服务器的消息时触发的,用来显示推送消息。

    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
    
        NSLog(@"Regist fail%@",error);
    }

    当注册失败时,触发此函数。



    2.PHP服务端

    将simplepush.php这个推送脚本也放在push文件夹中

    <?php
    
    // ??????????deviceToken???????????????
    $deviceToken = 'c95f661371b085e2517b4c12cc76293522775e5fd9bb1dea17dd80fe85583b41';
    
    // Put your private key's passphrase here:
    $passphrase = 'abc123';
    
    // Put your alert message here:
    $message = 'My first push test!';
    
    
    
    $ctx = stream_context_create();
    stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
    stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
    
    // Open a connection to the APNS server
    //??????????
     //$fp = stream_socket_client(?ssl://gateway.push.apple.com:2195?, $err, $errstr, 60, //STREAM_CLIENT_CONNECT, $ctx);
    //?????????????appstore??????
    $fp = stream_socket_client(
    'ssl://gateway.sandbox.push.apple.com:2195', $err,
    $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
    
    if (!$fp)
    exit("Failed to connect: $err $errstr" . PHP_EOL);
    
    echo 'Connected to APNS' . PHP_EOL;
    
    // Create the payload body
    $body['aps'] = array(
    'alert' => $message,
    'sound' => 'default'
    );
    
    // Encode the payload as JSON
    $payload = json_encode($body);
    
    // Build the binary notification
    $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
    
    // Send it to the server
    $result = fwrite($fp, $msg, strlen($msg));
    
    if (!$result)
    echo 'Message not delivered' . PHP_EOL;
    else
    echo 'Message successfully delivered' . PHP_EOL;
    
    // Close the connection to the server
    fclose($fp);
    ?>

    deviceToken填写你接收到的token,passPhrase则填写你的ck.pem设置的密码。

    此刻就是见证奇迹的时候了,使用终端进入到push文件夹,在终端输入 php simplepush.php



    若显示以上提示则表示推送成功了。附上一张成功图。



    推送就到这边吧!

    感谢这篇博客的指导:http://blog.csdn.net/showhilllee/article/details/8631734


    simplepush.php以及XCode工程我会上传到我的资源里去,大家可以去那边下载。有什么不明白的地方大家可以留言或者私信我,我会第一之间回复的~



    大家可以关注我的微信公众号与我互动,相关问题也可以直接用公众号联系我:












    展开全文
  • ios中的推送功能实现

    千次阅读 2018-07-31 18:15:24
    图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用百度云推送服务作为Provider。 APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。 上图可以分为三个阶段。 ...

    转载自:https://www.jianshu.com/p/fda61af94d09

     

    一.推送原理

    • 图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用百度云推送服务作为Provider。
      APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。
      上图可以分为三个阶段。
      第一阶段:Push服务器应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。
      第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
      第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。
    • 从上图我们可以看到。
      1、首先是应用程序注册消息推送。
      2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
      3、应用程序将deviceToken发送给PUSH服务端程序。
      4、 服务端程序向APNS服务发送消息。
      5、APNS服务将消息发送给iPhone应用程序。
      无论是iPhone客户端跟APNS,还是Provider和APNS都需要通过证书进行连接的。下面我介绍一下几种用到的证书。

    二.创建本地请求证书文件--CertificateSigningRequest

    • 打开钥匙串-证书助理-从证书颁发机构请求证书

    • 填写邮箱和名称(无特殊要求可随意填写)-选择存储到磁盘
    • 选择继续-保存至桌面即可(此文件可长期重复使用,只作为本机器的一个识别作用)

    三.进入苹果开发者网站:https://developer.apple.com/

    • 依次选择Member Center - Certificates, Identifiers &Profiles - Certificates

    • 选择当前要设置通知的APP IDs
      PS:这里我以新建一个APP IDs为例,若公司已有项目APP IDs,则略过此步

    • 选择右上角"+"号创建一个APPID

    • 填写name以及Bundle ID

    • Bundle ID需要与Xcode里项目Bundle ID一致

    • 勾选push notification 并完成提交

    • 找到刚创建好的APP IDs,可以看到下面的通知选项处提示Configurable,表示证书还没配置,点击Edit进行编辑

    • 这里看到推送证书分为2个版本,一个开发模式,一个生产模式,即我们在开发测试时使用开发模式证书,发布上线后采用生产模式证书,两个都要创建(本次只作开发模式演示,当然创建生产版证书的步骤也是一样的)

    • Choose File选择最开始创建在桌面的Request文件


    • 创建证书OK后 下载到本地

    • 开发版和生产版证书都创建好后,此时这里已经都是启用状态了

    • 打开下载好的开发模式证书,可以在钥匙串中看到,右键将该证书导出成.p12格式文件


    • 证书密码可根据需求填写(可为空)

    • 这里请输入你电脑管理员密码

    • 导出的.p12格式文件如下

    • 接下来终端进入该文件目录下使用命令把此文件转成pem格式(因为后端需要上传pem格式文件验证)
      openssl pkcs12 -in TestPush_Dev.p12 -out Push_Dev.pem -nodes

    • 推送证书创建好了,接下来回到苹果开发者官网,按以下步骤创建Provisioning Profile文件


    •  
    • 选择该项目APP ID



    •  
    • 勾选测试授权的设备

    • 注意右侧的状态要Active才是可用的,若是invalid则需要Edit并重新下载一次

    • 到此我们开发模式所需要的证书和描述文件都创建好了

    四.进入百度云推送后台,登陆验证开发者身份,并创建一个推送应用

    • 选择iOS,并上传开发版证书(当然如果你同时也创建了生产版证书也可以上传验证)
    • 保存后,我们要用到的便是右侧的API KEY

    五.项目里配置百度云推送

    • 下载最新的百度云推送SDK,导入到工程,SDK需要以下库:Foundation.framework、CoreTelephony.framework、libz.dylib、SystemConfiguration.framework,请在工程中添加


    •  
    • 再次强调要修改Bundle ID与之前创建证书时所填Bundle ID一致
    • AppDelegate中导入BPush.h,并在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中添加如下代码,并修改apiKey为刚才创建应用所得apiKey,推送模式为开发模式

    <pre><code>`// iOS8 下需要使用新的 API

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
        UIUserNotificationType myTypes = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
    
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:myTypes categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    }else {
        UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound;
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
    }
    
    #warning 测试 开发环境 时需要修改BPushMode为BPushModeDevelopment 需要修改Apikey为自己的Apikey
    
    // 在 App 启动时注册百度云推送服务,需要提供 Apikey
    [BPush registerChannel:launchOptions apiKey:<#在百度云推送官网上注册后得到的apikey#> pushMode:BPushModeDevelopment withFirstAction:nil withSecondAction:nil withCategory:nil isDebug:YES];`</code></pre>
    
    • 添加如下3个方法

    <pre><code>`// 在 iOS8 系统中,还需要添加这个方法。通过新的 API 注册推送服务

    • (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
      {
      [application registerForRemoteNotifications];
      }
      `</code></pre>

    <pre><code>- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSLog(@"test:%@",deviceToken); [BPush registerDeviceToken:deviceToken]; [BPush bindChannelWithCompleteHandler:nil]; }</code></pre>

    <pre><code>`// 当 DeviceToken 获取失败时,系统会回调此方法

    • (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
      {
      NSLog(@"DeviceToken 获取失败,原因:%@",error);
      }`</code></pre>

    六.配置证书测试

    • 双击之前创建好的的TestPush_ProvisioningDev.mobileprovision描述文件,并在Xcode-Targets配置好证书


    • 这一步编译的时候容易failed,通常检查之前配置的provisioning文件状态是否为Active,若状态为Invalid,则需删除本地provisioning文件,clean,再次重新下载配置
    • 真机运行成功后,可看到控制端打印出获得到Device Token,以及APP提示时候开启通知


    •  

    七.创建通知测试

    • 在百度云推送后台创建一个通知测试,请选择开发模式

    • 现在我们就接收到刚才创建的通知了



     

    展开全文
  • iOS消息推送(Java实现)

    万次阅读 2016-05-26 15:50:58
    大概的意思就是,提供商把消息推送至苹果的推送服务器,再由苹果推送服务器将消息推送给手机客户端,或者反过来手机客户端把消息推送至苹果推送服务器,再由苹果推送服务将消息推送至提供商。这里提到的提供商可以是...
  • ——本地推送通知推送通知的作用?在App退到后台或者完全退出时,可以使用通知来告诉用户某件事情,比如推送新的聊天消息、新闻等通知对应的效果: 在主屏幕的顶端会出现通知消息 当手机锁屏时出现在锁屏界面,可以...
  • iOS推送流程(APNS)

    千次阅读 2017-12-04 14:33:15
    iOS推送流程(APNS)一、APNS(Apple Push Notification Service)苹果推送通知服务(APNs)是推送通知的网关,iPhone ipad 对于应用程序在后台运行有诸多限制,考虑到手机电池电量,应用不允许在后台进行过多的操作。...
  • iOS两种推送方式

    千次阅读 2019-05-06 17:08:16
    iOS两种推送方式 APNs(Apple Push Notification service =APNs)是Apple推送通知服务。2016年的WWDC,苹果上线了token验证的推送方式,通过获得一个认证密钥(APNs Auth Key)去生成服务器端token,并且token非常...
  • 细说 iOS 消息推送

    2020-06-09 17:37:09
    经常有同学问我们,iOS推送究竟怎么做啊,为什么我的设备总收不到推送呢,这里跟大家集中讨论一下iOS推送的实现细节。 APNS的推送机制 与Android上我们自己实现的推送服务不一样,Apple对设备的控制非常严格,...
  • 第二、确认你的推送证书是否已经过期 第三、确认你的APP_KEY是否和极光APP_KEY是否一致 第四、正确调用bindChannel,并成功返回appid、userid和channelid,而且appid请确认是正确的应用; 第五、确认代码与官方...
  • iOS开发之极光推送自定义推送声音

    万次阅读 热门讨论 2016-06-01 10:17:18
    项目中用到了自定义推送声音,于是就看了下官方文档。 官方文档上说: Preparing Custom Alert Sounds For remote notifications in iOS, you can specify a custom sound that iOS plays when it presents ...
  • iOS Apns推送消息Json格式

    万次阅读 2017-02-28 10:03:38
    iOS 10 之前 { "aps":{ "alert":"内容", "badge":1, "sound":"default" } } iOS 10之后 { "aps":{ "alert":{ "title":"标题 ", "subtitle":"子标题", "b
  • iOS已上线应用的推送证书过期的处理 前两天突然发现上线的应用收不到推送了,然后就开始找原因。代码检查了一遍没有问题,测试版的推送也是正常的,找了半天发现是推送的生产证书过期的原因,没办法只好重新申请...
  • IOS使用个推前台可以收到推送消息后台收不到,配置不做过多说明,请查看官方文档。主要在这里记录我遇到的两个大坑。 1,根据个推的文档进行配置 2,保证证书环境正确 3,查看个推常见问题页关于后台不能...
  • iOS 推送收不到通知

    千次阅读 2017-10-11 14:48:04
    iOS 推送收不到通知 一、准备工作 1、确认您的应用在苹果开发者网站上已经正确配置了APNs,并且下载安装了APNs证书; 2、请使用设备来测试推送。模拟器是获取不到device token的,所以不能进行绑定,当然也...
  • 在开发过程中, 如果顾客打开推送开关的时候,也已经向服务器发送指令,进行推送开关同步,给它说这个用户已经打开了A推送,现在服务器推送A推送给客户端, 这时候照说,客服端是可以收到通知的,但是客服端却没有...
  • 创建推送开发证书和生产证书,以及往极光推送官网上传证书的步骤方法
  • IOS推送声音设置

    万次阅读 2016-04-19 11:11:56
    关于推送,官方文档、各种第三方推送文档都很全,就跳过了。 由于自定义通知声音还是由 iOS 系统来播放的,所以对音频数据格式有限制,可以是如下: 对应音频文件格式是 aiff,wav,caf 文件,文件也必须放到 ...
  • 项目中测试环境下总是收不到推送消息,于是从客户端到后台 整体排查了一下 , 发现原来是 开发环境与生产环境 上 出了问题 . 之前一直都没有注意 这两个环境 , 仔细研究之后 , 整理一下 .  生产环境 : 打包后安装...
  • iOS远程推送之获取deviceToken

    万次阅读 2015-09-09 18:18:15
    远程推送的原理就是: 1手机或者说苹果自动将用户的UDID 和应用的 AppID发送到APNs,APNs返回一个deviceToken给iOS设备,同一个手机不同的应用会生成不同的deviceToken,同一个手机同一个应用只生成一个deviceToken...
1 2 3 4 5 ... 20
收藏数 46,624
精华内容 18,649
关键字:

ios 推送