iOS:消息推送原理及实现归纳

移动开发 iOS
Provider[服务端]把要发送的消息,目的iOS设备标识打包,发送给APNS;APNS在自身的已注册Push服务的iOS设备列表中,查找有相应标识的iOS设备,并将消息发送到iOS设备;iOS设备把发送的消息传递给对应的应用程序,并且按照设定弹出Push通知。

一、消息推送原理:

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

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客户端的关键代码,如下:

 - ( 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 ]; 
}  
  • 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.

(3)编写Provider服务端关键代码,如下:

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 ( ) ; 
        } 
    } 
}  
  • 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.

注意:如果Provider服务端为Objective-C实现的话,就不需要*.p12证书。

责任编辑:闫佳明 来源: oschina
相关推荐

2017-09-05 15:30:00

JavascriptSocket.ioNode.js

2021-02-05 07:28:11

SpringbootNettyWebsocke

2020-09-22 08:52:50

平台实现消息

2024-04-07 09:41:18

SignalR实时通信开发

2024-09-02 09:31:19

2018-07-26 15:18:41

阿里JavaKafka架构

2022-12-25 10:47:52

2023-09-19 15:33:50

Web实时消息推送

2015-12-02 15:29:32

HTTP网络协议代理原理

2015-12-02 14:10:56

HTTP网络协议代理原理

2022-03-17 08:55:43

本地线程变量共享全局变量

2021-06-10 08:29:15

Rollup工具前端

2023-12-18 09:39:13

PreactHooks状态管理

2017-11-23 09:23:05

消息推送系统存储

2021-03-26 08:16:32

SpringbootWebsocket前端

2024-08-18 14:09:24

2017-07-04 12:26:14

ARARKit

2009-09-22 17:13:53

Hibernate O

2025-01-16 07:10:00

2020-06-09 11:35:30

Vue 3响应式前端
点赞
收藏

51CTO技术栈公众号