zoukankan      html  css  js  c++  java
  • iOS 消息推送原理及实现总结 分类: ios技术 2015-03-01 09:22 70人阅读 评论(0) 收藏

    在实现消息推送之前先提及几个于推送相关概念,如下图:

    1、 Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服务端[消息的发起者]);
    2、 APNS:Apple Push Notification Service[苹果消息推送服务器];
    3、 iPhone:用来接收APNS下发下来的消息;
    4、 Client App:IOS设备上的应用程序,用来接收iphone传递APNS下发的消息到制定的一个客户端 app[消息的最终响应者];
    上图可以分为三个阶段:
    阶段一:Provider[服务端]把要发送的消息,目的IOS设备标识打包,发送给APNS;
    阶段二:APNS在自身的已注册Push服务的IOS设备列表中,查找有相应标识的IOS设备,并将消息发送到IOS设备;
    阶段三:IOS设备把发送的消息传递给对应的应用程序,并且按照设定弹出Push通知。
    具体过程,如下图:

    1、 [Client App]注册消息推送;
    2、 [Client App]跟[APNS Service]要deviceToken, Client App接收deviceToken;
    3、 [Client App]将deviceToken发送给[Provider]Push服务端程序;
    4、 当Push服务端程序满足发送消息条件了,[Provider]向[APNS Service]发送消息;
    5、 [APNS Service]将消息发送给[Client App].

    二、消息推送实现:

    1、 生成*.certSigningRequest文件,步骤如下:
    [MacBookà应用程序à实用工具à钥匙串访问à证书助手à从证书机构求证书?à证书信息(用户电子邮箱地址{填写您的邮箱,如:your@email.com},常用名称{任意,如:PushDemo},请求是:{单选,选择‘存储到磁盘’})à继续à保存],这时会在您指定的地方生成你指定的文件,默认为CertificateSigningRequest.certSigningRequest文件,这里命名为:PushDemo.certSigningRequest.在此*.certSigningRequest已经生成,具体操作步骤如下面两张图所示。

    如果生成成功,则会在[钥匙串访问|登录|密钥]栏目中列出与*.certSigningRequest关联的密钥,这里是PushDemo,如下图所示:

    2、 新建一个App ID(在苹果开发者账号中配置)
    (1) 登录iOS Dev Center,登录成功后,点击(iOS Provisioning Portal对应链接),如下图所示:

    (2) 创建New App ID[App IDsàManageàNew App ID]( Description{填写您对此App ID 的描述,如:iShop},Bundle Seed ID(App ID Prefix){选择绑定App ID前缀,如:默认选择Generate New},Bundle Identifier(App ID Suffix){填写绑定App ID后缀,如:com.yourcorp.iShop}),如下图所示:

    这样就会生成下面这条记录,如下图所示:

    (3) 配置上一步中生成的App ID,让其支持消息推送[点击2-6中的Configureà选中Enable for Apple Push Notification serviceà点击Configure],如下图所示:

    (4) Generate a Certificate Signing Request(生成部署请求认证)[点击上图中的2ConfigureàContinueà步骤1生成的*certSigningRequest文件(这里是iShop. certSigningRequest)à Generateà生成完成后将其下载下来,命名为:aps_developer_identity.cer],双击aps_developer_identity.cer证书{将证书与密钥关联,并将证书导入到MacBook中},如下图所示:

    (5) 创建Development Provisioning Profiles[开发许可配置文件](Provisioning| Development|New Profile),具体操作流程如下图所示:

    点击上图中Submit,生成Development Provisioning Profiles[开发许可配置文件],这里是:iShopDevprofile.mobileprovision如下图所示:

    下载此开发许可证书(用于联机调试)。
    总结,到现在为止,我们已经生成:A:*.certSigningRequest文件(在步骤(4)中使用,用于生成证书B)、B: aps_developer_identity.cer证书(在Provider[Push服务器]服务端应用使用)、C:*..mobileprovision开发许可配置文件(在Client App客户端应用联机调试使用)。

    至此,消息推送的配置已经全部完成,接下来的工作就是编写Provider[Push服务器]服务端应用和Client App客户端应用的程序。

    三、Provider服务端的实现

    在这里只是简单讲述Provider服务端(JAVA实现)步骤如下:

    (1) 制作Provider服务端所需要的*.p12文件:
    在上面的实现的(4) 部分的图所展示的密钥、证书,我们并没有使用到它,那么为什么要展示出来呢,猜猜是为什么?为制作*.p12文件?哈哈,您猜对了,下面我们就利用它来制作*.p12文件,步骤:([MacBookà应用程序à实用工具à钥匙串访问[钥匙串:登录,种类:证书]à选择刚刚生成的证书(Apple Development IOS Services:*******)à菜单à文件à导出项目…à[存储为:任意文件名(如:iPush),文件格式:默认(个人信息交换(.p12))]à输入密码以进行导出[密码:任意,验证:与密码同一]à输入MACBook登录密码à允许à最终生成。

    关键步骤如下图:


    (2) 编写Client App客户端的关键代码,如下:

    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
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen]bounds]] autorelease];
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
        //消息推送支持的类型
        UIRemoteNotificationType types =
        (UIRemoteNotificationTypeBadge
         |UIRemoteNotificationTypeSound
         |UIRemoteNotificationTypeAlert);
        //注册消息推送
        [[UIApplication sharedApplication]registerForRemoteNotificationTypes:types]; 
        return YES;
    }
     
    //获取DeviceToken成功
    - (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
        NSLog(@"DeviceToken: {%@}",deviceToken);
        //这里进行的操作,是将Device Token发送到服务端
    }
     
    //注册消息推送失败
    - (void)application:(UIApplication *)application
    didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
    {
        NSLog(@"Register Remote Notifications error:{%@}",[errorlocalizedDescription]);
    }
     
    //处理收到的消息推送
    - (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)userInfo
    {
        NSLog(@"Receive remote notification : %@",userInfo);
        UIAlertView *alert =
        [[UIAlertView alloc] initWithTitle:@"温馨提示"
                                   message:@"推送成功!"
                                  delegate:nil
                         cancelButtonTitle:@"确定"
                         otherButtonTitles:nil];
        [alert show];
        [alert release];
    }
    (3)编写Provider服务端关键代码,如下:

    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
    import javapns.back.PushNotificationManager;
    import javapns.back.SSLConnectionHelper;
    import javapns.data.Device;
    import javapns.data.PayLoad;
     
    public class MainSend
    {
        public static void main(String[] args) throws Exception
        {
            try
            {
                //从客户端获取的deviceToken
                String deviceToken = "3a20764942e9cb4c4f6249274f12891946bed26131b686b8aa95322faff0ad46";
                System.out.println("Push Start deviceToken:" + deviceToken);
                //定义消息模式
                PayLoad payLoad = new PayLoad();
                payLoad.addAlert("消息推送测试!");
                payLoad.addBadge(4);
                payLoad.addSound("default");
                //注册deviceToken
                PushNotificationManager pushManager = PushNotificationManager.getInstance();
                pushManager.addDevice("iPhone", deviceToken);
                //连接APNS
                String host = "gateway.sandbox.push.apple.com";
                int port = 2195;
                String path = "/Users/iMilo/Work.localized/iShop/project/service/iPush/";
                String certificatePath = (path + "src/ipush/iPush.p12");
                //certificatePath 步骤一中生成的*.p12文件位置
                String certificatePassword = "Love24mm";
                pushManager.initializeConnection(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);
                //发送推送
                Device client = pushManager.getDevice("iPhone");
                pushManager.sendNotification(client, payLoad);
                //停止连接APNS
                pushManager.stopConnection();
                //删除deviceToken
                pushManager.removeDevice("iPhone");
                System.out.println("Push End");
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
        }
    }


  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/liuqixu/p/4684005.html
Copyright © 2011-2022 走看看