iOS消息推送机制的实现


iOS消息推送的工作机制可以简单的用下图来概括:


 

Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务器。

 

上图可以分为三个阶段:

第一阶段:应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。 

第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。 

第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。

iOS消息推送机制的实现_第1张图片

 

从上图我们可以看到:

1、应用程序注册消息推送。

2、iOS从APNS Server获取device token,应用程序接收device token。

3、应用程序将device token发送给PUSH服务端程序。

4、服务端程序向APNS服务发送消息。

5、APNS服务将消息发送给iPhone应用程序。

 

无论是iPhone客户端和APNS,还是Provider和APNS,都需要通过证书进行连接。

 

下面我介绍一下几种用到的证书。

 

一、CSR文件

 

1、生成Certificate Signing Request(CSR)


iOS消息推送机制的实现_第2张图片

 

2、填写你的邮箱和常用名称,并选择保存到硬盘。


iOS消息推送机制的实现_第3张图片

 

点击继续:


iOS消息推送机制的实现_第4张图片

 

这样就在本地生成了一个Push.certSigningRequest文件。

 

二、p12文件

 

1、导出密钥。


iOS消息推送机制的实现_第5张图片


iOS消息推送机制的实现_第6张图片

 

2、输入你的密码。

 

iOS消息推送机制的实现_第7张图片

 

这样就生成了一个Push.p12文件。

 

三、SSL certificate文件

 

1、用你付过费的帐号登录到iOS Provisioning Portal,并新建一个App ID,这个过程可以参考:iOS应用的真机调试,这样就会生成下面这条记录:


 

2、点击右侧的Configure:


iOS消息推送机制的实现_第8张图片

 

3、点击Development Push SSL Certificate一行后的Configure:

 

iOS消息推送机制的实现_第9张图片

 

4、点击Continue:


iOS消息推送机制的实现_第10张图片

 

5、选择前面生成好的Push.certSigningRequest文件,点击Generate,出现如下所示的页面:


iOS消息推送机制的实现_第11张图片

 

6、点击Continue:


iOS消息推送机制的实现_第12张图片

 

7、点击Download,并将文件命名为aps_developer_identity.cer。

 

8、点击Done,你会发现状态变成了Enabled:


iOS消息推送机制的实现_第13张图片

 

注意:有的App ID的Apple Push Notification service列是灰色的,并且不允许使用Configure按钮,这是因为APNS不支持带通配符的App ID。

 

到现在为止,我们已经生成了三个文件:

 

1、Push.certSigningRequest

2、Push.p12

3、aps_developer_identity.cer



二、  编写Client App客户端的关键代码,如下: 


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

self.window = [[[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]] autorelease]; self.window.backgroundColor = [UIColorwhiteColor];     

[self.windowmakeKeyAndVisible]; //消息推送支持的类型


UIRemoteNotificationType types =  (UIRemoteNotificationTypeBadge      |UIRemoteNotificationTypeSound      |UIRemoteNotificationTypeAlert); //注册消息推送 

    [[UIApplicationsharedApplication] registerForRemoteNotificationTypes:types];   returnYES;

 }   


//获取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:{%@}",[error localizedDescription]); 

}   


//处理收到的消息推送 
- (void)application:(UIApplication *)application  didReceiveRemoteNotification:(NSDictionary *)userInfo

 { 
NSLog(@"Receive remote notification : %@",userInfo); UIAlertView *alert =  
    [[UIAlertViewalloc] initWithTitle:@"温馨提示" message:@"推送成功!" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];   

  [alertshow]; 

 }   

 

 String deviceToken = 

"3a20764942e9cb4c4f6249274f12891946bed26131b686b8aa95322faff0ad46"

;

 

System.

out

.println(

"Push Start deviceToken:"

 

三、编写Provider服务端关键代码,如下: 
importjavapns.back.PushNotificationManager; 

importjavapns.back.SSLConnectionHelper; 

importjavapns.data.Device; 

importjavapns.data.PayLoad;   


publicclassMainSend {  

publicstaticvoid main(String[] args) throws Exception   { 
try         { 
//从客户端获取的deviceToken             

String deviceToken = "3a20764942e9cb4c4f6249274f12891946bed26131b686b8aa95322faff0ad46"; 

System.out.println("Push Start deviceToken:" + deviceToken); //定义消息模式 

PayLoadpayLoad = newPayLoad(); 

payLoad.addAlert("消息推送测试!"); 

payLoad.addBadge(4); 


payLoad.addSound("default"); //注册deviceToken 


PushNotificationManagerpushManager = 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();      

   } 

 } 
}

你可能感兴趣的:(ios,推送,token,苹果)