ios消息推送_ios推送消息 - CSDN
  • iOS消息推送接收处理

    2018-08-09 00:29:06
    首先要说明两个概念:本地...以下有处理推送的三种状态:一.APP没有被杀掉进程的时候,会根据是本地通知还是远程推送来调用不同的函数//本地通知-(void)application:(UIApplication*)application didReceiv...
        

    首先要说明两个概念:本地通知和远程推送。本地通知是由本地应用触发的,接收会比较及时。远程推送是通过苹果的APNs发送到应用客户端的。

    以下有处理推送的三种状态:

    一.APP没有被杀掉进程的时候,会根据是本地通知还是远程推送来调用不同的函数

    //本地通知

    -(void)application:(UIApplication*)application didReceiveLocalNotification:(UILocalNotification*)notification {

    ...

    }

    //远程推送

    - (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo {

    ...

    }

    //远程推送时苹果官方文档更推荐使用这个

    - (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo fetchCompletionHandler:(void(^)(UIBackgroundFetchResult))completionHandler

    {

    }

    二.APP在杀掉进程的时候,当我们通过通知进入APP时,会调用下面的函数

    - (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {

    //检查是否从通知启动

    if(launchOptions)

    {

    NSDictionary* remoteNotification=[launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

    NSLog(@"remoteNotification%@",remoteNotification);

    }

    }

    三.判断接收消息时的状态

    //当应用程序在激活状态时接到通知,会是如下状态

    if(application.applicationState == UIApplicationStateActive) {

    ...

    //当应用程序在后台挂起时接到通知,用户进入应用后,会是如下状态

    }else if(application.applicationState == UIApplicationStateInactive) {

    ...

    }

    在我们了解了以上三点后,就可以根据不同的情况处理推送消息了。

    天伦物业项目的要求是不管APP在什么状态点击推送都要跳转到相应的页面,这个时候我们通过第一点和第二点会调用的函数,解析收到的消息字典获取不同的type值,做相应的跳转。

    我完成的仟询项目的要求是APP在活跃状态下是不处理推送的,我们接收到消息的情况下,可以通过第三点来判断APP状态做相应的处理

    文/zyh1158(简书作者)

    原文链接:http://www.jianshu.com/p/4126ce0fe13f

    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

    展开全文
  • 今天就由本菜鸟给大家做一个简单的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消息推送机制

    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 消息推送

    2019-07-11 14:16:13
    经常有同学问我们,iOS推送究竟怎么做啊,为什么我的设备总收不到推送呢,这里跟大家集中讨论一下iOS推送的实现细节。 APNS的推送机制 与Android上我们自己实现的推送服务不一样,Apple对设备的控制非常严格,...

    原文:https://segmentfault.com/a/1190000000520755

    经常有同学问我们,iOS上推送究竟怎么做啊,为什么我的设备总收不到推送呢,这里跟大家集中讨论一下iOS上推送的实现细节。

    APNS的推送机制

    与Android上我们自己实现的推送服务不一样,Apple对设备的控制非常严格,消息推送的流程必须要经过APNs:
    remote_notif_simple_2x

    这里 Provider 是指某个应用的Developer,当然如果开发者使用AVOS Cloud的服务,把发送消息的请求委托给我们,那么这里的Provider就是AVOS Cloud的推送服务程序了。上图可以分为三步:
    第一步:AVOS Cloud推送服务程序把要发送的消息、目的设备的唯一标识打包,发给APNs。
    第二步:APNs在自身的已注册Push服务的应用列表中,查找有相应标识的设备,并把消息发送到设备。
    第三步:iOS系统把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知

    为了实现消息推送,有两点非常重要:
    1,App的推送证书
    要能够完整实现一条消息推送,需要我们在App ID中打开Push Notifications,需要我们准备好Provisioning Profile和SSL证书,并且一定要注意Development和Distribution环境是需要分开的。最后,把SSL证书导入到AVOS Cloud平台,就可以尝试远程消息推送了。具体的操作流程可以参考我们的使用指南:iOS推送证书设置指南
    2,设备标识DeviceToken
    知道了谁要推送,或者说要推送给哪个App之后,APNs还需要知道推到哪台设备上,这就是设备标识的作用。获取设备标识的流程如下:

    第一步:App打开推送开关,用户要确认TA希望获得该App的推送消息
    第二步:App获得一个DeviceToken
    第三步:App将DeviceToken保存起来,这里就是通过[AVInstallation saveInBackground]将DeviceToken保存到AVOS Cloud
    第四步:当某些特定事件发生,开发者委托AVOS Cloud来发送推送消息,这时候AVOS Cloud的推送服务器就会给APNs发送一则推送消息,APNs最后消息送到用户设备

    推送相关的几个概念

    消息类型

    一条消息推送过来,可以有如下几种表现形式:

    • 显示一个alert或者banner,展现具体内容
    • 在应用icon上提示一个新到消息数
    • 播放一段声音
    • 开发者可以在每次推送的时候设置,在推送达到用户设备时开发者也可以选择不同的提示方式。

      本地消息通知

      iOS上有两种消息通知,一种是本地消息(Local Notification),一种是远程消息(Push Notification,也叫Remote Notification),设计这两种通知的目的都是为了提醒用户,现在有些什么新鲜的事情发生了,吸引用户重新打开应用。
      本地消息什么时候有用呢?譬如你正在做一个To-do的工具类应用,对于用户加入的每一个事项,都会有一个完成的时间点,用户可以要求这个To-do应用在事项过期之前的某一个时间点提醒一下TA。为了达到这一目的,App就可以调度一个本地通知,在时间点到了之后发出一个Alert消息或者其他提示。
      我们在处理推送消息的时候,也可以综合运用这两种方式。

      代码里面如何实现推送

      首先,我们要获取DeviceToken。

      App需要每次启动的时候都去注册远程通知——通过调用UIApplication的registerForRemoteNotificationTypes:方法,传递给它你希望支持的消息类型参数即可,例如:

      
       

      如果注册成功,APNs会返回给你设备的token,iOS系统会把它传递给app delegate代理——application:didRegisterForRemoteNotificationsWithDeviceToken:方法,你应该在这个方法里面把token保存到AVOS Cloud后台,例如:

      
       

      如果注册失败,application:didFailToRegisterForRemoteNotificationsWithError:方法会被调用,通过NSError参数你可以看到具体的出错信息,例如:

      
       

      请注意,注册流程需要在app每次启动时调用,这并不不会带来额外的负担,因为iOS操作系统在第一次获得了有效的device token之后,会本地缓存起来,以后app再调用registerForRemoteNotificationTypes:的时候会立刻返回,并不会再进行网络请求。另外,app层面不应该对device token进行缓存,因为device token也有可能变化——如果用户重装了操作系统,那么APNs再次给出的device token就会和之前的不一样,又或者是,用户restore了原来的backup到新的设备上,那么原来的device token也会失效。

      其次,我们要处理收到消息之后的回调

      我们可以设想一下消息通知的几种使用场景:
      1,在app没有被启动的时候,接收到了消息通知。这时候操作系统会按照默认的方式来展现一个alert消息,在app icon上标记一个数字,甚至播放一段声音。
      2,用户看到消息之后,点击了一下action按钮或者点击了应用图标
      如果action按钮被点击了,系统会通过调用application:didFinishLaunchingWithOptions:这个代理方法来启动应用,并且会把notification的payload数据传递进去。
      如果应用图标被点击了,系统也一样会调用application:didFinishLaunchingWithOptions:这个代理方法来启动应用,唯一不同的是这时候启动参数里面不会有任何notification的信息。
      示例代码如下:

      
       

      3,如果远程消息发送过来的时候,app正在运行,这时候会发生什么呢?
      app代理的application:didReceiveRemoteNotification:方法会被调用,同时远程消息中的payload数据会作为参数传递进去。
      示例代码如下:

      
       

      常见问题FAQ

      我能推送长消息吗

      不能,APNs限制了每个notification的payload最大长度是256字节,超长的消息是不能发送的。

      推送怎么加声音提醒

      消息推送是可以指定声音的。譬如你可以对正面的反馈使用欢快的声音,对负面的反馈使用低沉一点的声音,都可以达到别出心裁让人眼前一亮的目的。
      你需要先放一些aiff、wav或者caf音频文件到app的资源文件中,然后在推送的时候指定不同的音频文件名就可以了。

      推送的Badge是怎么回事

      推送并不一定会导致应用图标上红色数字增加,是否显示这一数字,显示成多少,都取决于开发者自己。
      在发送推送消息的时候,我们可以选择是否递增这一数字;如果不选择这一项,那么消息推送并不会导致应用图标上红色数字的出现。

      好,现在问题来了,这个数字如果搞出来了,怎么让它消失掉呢?
      其实我们只需要在任何时候设置 UIApplication.applicationIconBadgeNumber 属性为0,就可以让这个数字消失掉。
      一般我们会选择在应用启动的时候(application:didFinishLaunchingWithOptions:方法中),或者干脆一点,在应用每次被切换到前台的时候(applicationWillEnterForeground:方法中),调用这一行代码,即可立刻清除掉Badge数字了。

      AVOS Cloud平台发出去的通知格式究竟是什么样子的

      对于每一条推送消息,都包含一个payload,通常是组成了一个JSON的Dictionary,这其中必不可少的是aps属性,它对应的value也是一个Dictionary,包含下面一些内容:

    • alert消息(文本或Dictionary)
    • 应用图标上的红色数字
    • 播放的声音文件名
    • 在由推送激活的app打开事件中,application:didFinishLaunchingWithOptions:的options参数就是这个大的Dictionary对象。
      
       

      这里要注意的时alert部分,它的值可以是一个String(文本消息),也可以是一个JSON的Dictionary。当它是文本消息的时候,系统就会把这些文字显示到一个alertview中;如果它也是由一个JSON Dictionary组成的话,其格式如下:

    • body
    • action-loc-key
    • loc-key
    • loc-args
    • launch-image
    • body部分就是alertView中将要展现出来的文本消息,loc-属性主要是用来实现本地化消息,launch-image只是app主bundle里的一个图片文件的名称,一般来说我们不指定这一属性。

      如何显示本地化的消息

      有两种办法可以实现推送消息的本地化:
      1,在推送的payload中使用loc-key和loc-args来指定进行本地化,这样Provider方只需要按照统一的格式来发送即可,消息的解析和组装则由客户端来完成。
      2,如果推送的payload里面不包含loc-key/loc-args信息,那么Provider方就需要自己做本地化处理,然后给不同的device发送不同的消息,为了做到这一点,还需要app在上传device token的时候也把用户的语言设置信息传回来。
      目前,因为AVOS Cloud主要就是瞄准中国大陆市场和海外中文用户,所以我们在推送上还不提供多语言支持。

      应用该怎么响应推送消息

      上面说的处理流程,只能简单展示一下远程消息,激活用户让他们重新回到app中来。但是有时候,我们希望带给用户更好的使用体验,譬如如果我们告诉用户:张三刚刚评论了你的照片。这时候用户如果点击action按钮进入app,我们是展示具体的评论页面为好,还是展示通常的启动页面然后让用户自己去找张三的评论好?我想负责任的开发者都会选择前者:)

      要做到灵活响应不同类型的通知消息,我们需要在通知的payload中增加更多信息,而不能仅仅只有alert出来的文字信息。对于AVOS Cloud消息推送平台来讲,就需要开发者使用更高级功能的JSON格式。譬如我们发送这样的json字符串
      {"action":{"type":4},"alert":"hello, everyone”} 最终在app内会收到这样的UserInfo Dictionary:

      
       

      “hello, everyone”会显示到alertView中,但是整个Dictionary会通过launchOptions传递给application: didFinishLaunchingWithOptions: 方法,这样我们在程序里面就可以对不同的消息实现不同的跳转了。

    展开全文
  • 由于客户的应用需求,要求在应用软件种加入消息推送的提示,根据提示信息打开响应的连接。 故对apple的消息推送机制做了一番研究。 消息推送首先需要几个必要的东西: 1 SLL证书(申请证书的过程不在详述,...

    由于客户的应用需求,要求在应用软件种加入消息推送的提示,根据提示信息打开响应的连接。


    故对apple的消息推送机制做了一番研究。

    消息推送首先需要几个必要的东西:

    1 SLL证书(申请证书的过程不在详述,只是注意需要消息推送应用程序的apple ID一定不能用通配符,这里有2个SLL证书一个用于调试一个用于发布)

    2 DeviceToken(这个实际上是一串64位的字符串,每个手机是唯一的;但是开发者profile和发布者profile获取到的不同)

    3 推送消息的服务器,简称Provider


    有了以上东西就可以开始进行消息推送的开发了。

    流程如下

    1 iPhone-》send deviceToken -》Provider 

    2 Provider -》send message and DeviceToken -》APNS(苹果的消息推送服务器)

    3 APNS (根据DeviceToken)-》send message -》iPhone Notifications -》 your APP


    以上流程第一条,获取DeviceToken的方法为,在APPDelegate类中重写方法

    - (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
    {
        NSLog(@"DeviceToken is: %@", deviceToken);
    }

    将获取到的DeviceToken发送到Provider,一般是一个服务器Provider。


    第二条。Provider根据不同的条件发送不同的消息到不同的DeviceToken+信息到APNS。这里我们可以根据不通的DeviceToken来定制用户权限。

    比如一共有 A B C D E5个消息,iPhone1 只想获取 A B的消息 iPhone2想获取C D E的消息,这里我们就可以在iPhone想Provider注册DeviceToken的时候定制权限。

    具体的Provider代码可参考PushMeBaby那个Demo。

    苹果的APNS服务器地址有2个分别为:

    测试的服务器地址:gateway.sandbox.push.apple.com 端口2195 
    产品推送服务器地址:gateway.push.apple.com 端口 2195


    第三条。APNS根据不同的DeviceToken将消息发送到不通的iPhone上。


    至此我们就可以收到对应的消息在iPhone的通知中。


    详细的生成ssl证书以及p12文件的步骤参考网址如下:

    点击打开链接



    展开全文
  • 在实现消息推送之前先提及几个于推送相关概念,如下图:1、 Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服务端[消息的发起者]);...
  • iOS 消息推送Demo

    2020-07-29 14:18:49
    iOS 消息推送 苹果官方的消息推送方式 , APNS 需要证书的 客户端代码
  • ios消息推送源码,包括php服务端,做apns的朋友可以直接使用。xcode6.1 做的一个demo
  • 这里记录下iOS消息推送shi'x
  • ios 消息推送简介

    2018-01-26 09:12:59
    消息推送流程 手机系统会一直保持与苹果APNs一个通信 ...当打开App时候,会从苹果Apns得到一个toKen ...苹果APNs得到后再根据这个toKen推送得到的消息给我们的ios设备 我们得到toKen后就知
  • 大概的意思就是,提供商把消息推送至苹果的推送服务器,再由苹果推送服务器将消息推送给手机客户端,或者反过来手机客户端把消息推送至苹果推送服务器,再由苹果推送服务将消息推送至提供商。这里提到的提供商可以是...
  • iOS推送消息是许多iOS应用都具备的功能,今天在给应用加推送功能,在生成证书的过程中,发生了各种令人蛋痛的事。下面就把步骤拿出来分享下: iOS消息推送的工作机制可以简单的用下图来概括:   Provider...
  • 与Android上我们自己实现的推送服务不一样,Apple对设备的控制非常严格,消息推送的流程必须要经过APNs: 这里 Provider 是指某个应用的Developer,当然如果开发者使用信鸽的服务,把发送消息的请求委托给信鸽,...
  • IOS消息推送机制 ios消息推送主要主流有两种方式,一种是基于javaapns.jar和javaPNS.jar的开源的消息推送,javaPNS.jar支持多线程。 第一种:基于javaapns.jar的实现如下:
  • 自己按着网上搜寻的消息推送,结果好多都没写清楚,导致第一次用消息推送的同志们很苦恼,我当时就栽在下载过证书和文件后,没有双击安装。费解啊! 所以,在这把自己认为很完善的步骤整理出来,供大家享用。   ...
  • ios消息推送客户端和服务端实现带代码(java)
  • PHP实现IOS消息推送

    2017-09-08 20:08:34
    IOS推送消息是许多IOS应用都具备的功能,最近也在研究这个功能,参考了很多资料终于搞定了,下面就把步骤拿出来分享下:       iOS消息推送的工作机制可以简单的用下图来概括:   Provider是指某个...
  •  IOS中使用本地通知为你的APP添加提示用户功能 首先,我们先要明白一个概念,这里的本地通知是UILocalNotification类,和系统的NSNotificationCenter通知中心是完全不同的概念。 一、我们可以通过本地通知做...
  • IOS消息推送(VOIP)

    2017-07-16 23:28:05
    IOS消息推送(VOIP)IOS消息推送VOIP 生成证书 CSR文件 创建 App ID 创建IOS push开发证书 从钥匙串访问中导出密钥 处理证书 客户端实现push能力 代码中请求push能力 客户端获取deviceToken 客户端接收消息 Payload...
  • 声明:我先前也没有接触过这个IOS推送,自己研究了两天,通过百度,对比各个框架的优缺点,最后选择了这个框架,有说的不对的地方,还希望指出来,当然现在很多公司都是采用第三方平台的方式来推送,这里不介绍。...
1 2 3 4 5 ... 20
收藏数 45,823
精华内容 18,329
关键字:

ios消息推送