iOS 消息推送 详解
来源:互联网 发布:我的老婆是警花知君 编辑:程序博客网 时间:2024/06/03 21:25
什么是远程消息推送功能
APP向系统注册推送服务。
设备从APNs请求deviceToken。
通过代理方法将deviceToken返回给APP。
APP将deviceToken发送给应用后台服务器(Provider)。
应用后台服务器保存deviceToken,然后在需要推送通知的时候,给APNs发送信息,使用deviceToken标识所要送达的客户端。
APNs将后台服务器发过来的数据推送到设备。
设备将消息分发给应用程序。
环境配置
开发者账号。
iOS真机(iPhone、iPad、iPod)。
后台服务器。
网络。
到现在为止,我们已经生成了三个文件:
1、Push.certSigningRequest
2、Push.p12
3、aps_development.cer
接下来就是进行推送测试阶段:
下面先试一试第一种方法,使用PushMeBaby。这是一个开源的Mac小程序,将ApplicationDelegate.m中添上deviceToken和证书的位置。
- (id)init { self = [super init]; if(self != nil) { //55e231f0 86257e00 eed93ac6 47b52c78 12abe79f 9c9d1c67 4c770589 36c9a235 ---- 保留空格 self.deviceToken = @""; //推送内容,JSON格式 self.payload = @"{\"aps\":{\"alert\":\"乔帮主乔帮主乔帮主\",\"badge\":1}}"; //获取证书路径 self.certificate = [[NSBundle mainBundle] pathForResource:@"aps_development" ofType:@"cer"]; } return self;}
发送通知的后台应用程序如果用php, java 实现,除了需要知道deviceToken之外,还需要一个与APNS连接的证书。
这个证书可以通过我们前面生成的文件中得到。
$ cd ~/Desktop$ls aps_development.cerCertificateSigningRequest.certSigningRequestPushKey.p12
$ openssl x509 -in aps_development.cer -inform der -out PushCert.pem$ lsaps_development.cerCertificateSigningRequest.certSigningRequestPushCert.pemPushKey.p12
$ openssl pkcs12 -nocerts -out PushKey.pem -in PushKey.p12 Enter Import Password:MAC verified OKEnter PEM pass phrase:Verifying - Enter PEM pass phrase:
$ cat PushCert.pem PushKey.pem > ck.pem$ lsaps_development.cerCertificateSigningRequest.certSigningRequestck.pemPushCert.pemPushKey.pem PushKey.p12
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushCert.pem -key PushKey.pem
$ php simplepush.php Connected to APNSMessage successfully delivered2)JAVA来发送通知
1、将aps_development.cer转换成aps_development.pem格式
- openssl x509 -in aps_development.cer -inform DER -out aps_development.pem -outform PEM
2、将p12格式的私钥转换成pem
- openssl pkcs12 -nocerts -out Push_Noenc.pem -in Push.p12
3、创建p12文件
- openssl pkcs12 -export -in aps_development.pem -inkey Push_Noenc.pem -certfile Push.certSigningRequest -name "aps_development" -out aps_development.p12
这样我们就得到了在.net或java等后台应用程序中使用的证书文件:aps_development.p12
核心代码
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(); } }}
iOS端代码实现
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //判断是否注册了远程通知 if (![application isRegisteredForRemoteNotifications]) { UIUserNotificationSettings *uns = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:nil]; [application registerUserNotificationSettings:uns]; //注册远程通知 [application registerForRemoteNotifications]; } return YES;}//获取DeviceToken成功- (void)application:(UIApplication *)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{ NSLog(@"DeviceToken: {%@}",deviceToken); //这里进行的操作,是将Device Token发送到服务端} //注册消息推送失败- (void)application:(UIApplication *)applicationdidFailToRegisterForRemoteNotificationsWithError:(NSError *)error{ NSLog(@"Register Remote Notifications error:{%@}",[errorlocalizedDescription]);} //处理收到的消息推送- (void)application:(UIApplication *)applicationdidReceiveRemoteNotification:(NSDictionary *)userInfo{ NSLog(@"Receive remote notification : %@",userInfo); UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:@"推送成功!" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alert show]; [alert release];}
下面附上另外一份比较详细的文章,感谢这位博友分享http://blog.csdn.net/showhilllee/article/details/8631734
另一位博友的三篇文章:(
http://blog.sina.com.cn/s/blog_6afb7d800101fa29.html
http://blog.sina.com.cn/s/blog_6afb7d800101fafl.html
http://blog.sina.com.cn/s/blog_6afb7d800101faiz.html
)
以及另一位博友摘录的国外的文档:http://blog.csdn.net/kepoon/article/details/22384375
另附上对Certificate、App Id、Identifiers 和 Provisioning Profile理解的文章:http://www.th7.cn/Program/IOS/201406/218729.shtml
- iOS 消息推送 详解
- iOS消息推送详解
- IOS推送消息 php推送
- ios 推送消息 php推送
- ios 推送消息 极光推送/百度推送
- ios推送消息
- iOS消息推送
- iOS消息推送
- iOS推送消息实现
- iOS php消息推送
- IOS推送消息
- IOS消息推送
- iOS 消息推送
- ios消息推送
- IOS消息推送
- iOS 消息推送原理
- iOS 消息推送原理
- iOS 消息推送通知
- asp打开网站原理
- JAVA校验字符串中的每个字符是否都在GB2312字符集中
- [菜鸟学爪哇]Day 8
- android-open-project
- oracle的列操作
- iOS 消息推送 详解
- Android图片文件上传实例
- MySQL 读写分离与负载均衡
- 将 文件保存到服务器指定的位置 注意返回的是服务器地址
- OpenGL--光照
- 打印输入单词长度的直方图 (水平方向)程序分析
- 【Python】数据持久存储:pickel
- iOS 获取手机的型号,系统版本,软件名称,软件版本
- 求两个有序数组的中位数