Push Notification系列归纳:git
1.Push Notification简介和证书说明及生成配置github
2.Push Notification的iOS处理代码和Provider详解数据库
3.Push Notification的移动客户端定位服务服务器
正文: app
Push Notification的iOS处理代码和Provider详解框架
这一篇文档主要描述代码实现推送通知,在最后补充一些本身在整个过程当中遇到的一些问题,供之后参考,也给其余朋友一个提醒。ide
1、应用程序的处理代码工具
这里就假定已经建立了一个iOS的App,名称就暂设为MyPushNotification吧。。。测试
处理推送通知的代码,主要在AppDelegate.m里,故在上述假定的项目中能够找到MyPushNotificationAppDelegate.m文件。url
示例代码:
1 //本地服务器地址 2 3 #define provider_server @"http://*******" 4 5 //应用启动时候注册推送通知服务,第一次安装时系统会自动提示用户 6 7 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 8 9 //注册推送通知功能 10 11 [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)]; 12 13 //将标记数字置为0,则不显示 14 15 application.applicationIconBadgeNumber = 0; 16 17 } 18 19 20 21 //接收从苹果服务器返回的惟一的DeviceToken,而后发送给本身的服务端 22 23 - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 24 25 NSString* device_token = [NSString stringWithFormat:@"%@",deviceToken]; 26 27 NSString* device_name = [[UIDevice currentDevice] name]; 28 29 NSString* device_version = [[UIDevice currentDevice] systemVersion]; 30 31 NSString* device_type = [[UIDevice currentDevice] model]; 32 33 NSString *strUrl = [NSString stringWithFormat:@"%@?action=registerDevices&device_token=%@&device_name=%@&device_version=%@&device_type=%@", 34 35 provider_server,device_token,device_name,device_version,device_type]; 36 37 strUrl = [strUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 38 39 NSURL *url = [NSURL URLWithString:strUrl]; 40 41 42 43 NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url]; 44 45 //发送URL请求 46 47 NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 48 49 } 50 51 52 53 //程序处于启动状态,或者在后台运行时,会接收到推送消息 54 55 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 56 57 { 58 59 if ([[userInfo objectForKey:@"aps"] objectForKey:@"alert"]!=NULL) { 60 61 if(application.applicationState ==UIApplicationStateActive){ 62 63 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"舒适提示" 64 65 message:[NSString stringWithFormat:@"\n%@", 66 67 [[userInfo objectForKey:@"aps"] objectForKey:@"alert"]] 68 69 delegate:self 70 71 cancelButtonTitle:@"OK" 72 73 otherButtonTitles:nil]; 74 [alertView show]; 75 76 [alertView release]; 77 78 79 80 } 81 82 } 83 84 }
这里重点列出了几个值得注意的代理方法,固然,还能够实现更多的代理来丰富推送通知功能。
为了测试,我在实现
-(void)application:(UIApplication*)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
方法的时候,直接采用了控制台NSLog输出DeviceToken,而后将获得的字符串复制,以便在Provider中使用,由于暂时尚未搭建好本地服务器,没法采用发送url请求的方式。
只须要这几个方法就能够简单处理推送通知了。
2、Provider详解
终于说到Provider了,看了不少资料,对于这一块的介绍都不是很详细,大多都是一笔带过。
确实,目前最有效的办法是直接采用开源框架来处理,我这里也不例外,可是仍是想多说一下这方面的心得。
首先,推荐两个开源框架:
(1) Mac OS X系统下的PushMeBaby
https://github.com/zomfg/PushMeBaby-OneMoreTime-Again
这个框架的优点就是能够直接在Mac环境里使用,采用的证书为apns***.cer,详情参考上一篇的证书说明。不须要生成p12文件。使用方法简单快速,添加本身的证书文件到资源目录下,而后直接替换框架代码里面的证书变量和DeviceToken就能够了。
(2) Windows系统下的PushSharp https://github.com/Redth/PushSharp
这个框架的优点在于可适用于多终端,这意味着,可扩展性更强,不论是向什么终端设备推送,均可以实现。跟上一个框架相比,须要采用p12文件做为推送条件,注意该框架要求提供p12文件的密码,这属于上一篇证书说明中生成p12文件的内容了。
从公司的长远考虑,我采用了研究这个框架。
代码修改说明:在项目PushSharp.Sample的Program.cs中将不用的终端类型代码注释,修改“APPLE NOTIFICATIONS”下面的代码,注意修改变量appleCert的p12证书和push.RegisterAppleService中的证书密码,最后将push.QueueNotification中的DeviceToken参数改成目标字符串,就大功告成了。
先运行客户端应用程序,而后运行命令行程序后,就能够看到推送过程了。
提醒:在编译PushSharp项目时,可能会出现一堆错误提醒,别担忧,极可能是因为没有开启“NuGet”。在VS中,工具——选项——包管理器——常规,选中“容许NuGet在生成期间下载缺乏的程序包”。再次等待编译就能够了。
可是无论采用哪一个框架,实现思路都是同样的:
(1) 搭建本地服务器,配置环境和数据库
(2) 接收客户端发送来的DeviceToken,并对其进行妥善管理
(3) 以证书为凭据,将目标DeviceToken和消息内容发送给APNS,请求推送通知服务
(4) 可处理当客户端接收到APNS推送的消息后发来的url请求,并作相应处理。完成整个推送过程。
3、配置或者编译过程当中遇到的错误
看到这里,无非两个结果嘛,若是成功了,能够不用往下看了,可是不成功的话,下面的内容或许能够帮你找到问题所在。
错误:
iOS推送消息证书错误-Code=3000 "未找到应用程序的“aps-environment”的权利字符串"
这个错误应该会很广泛,涉及的疑点比较多。
到此,Push Notification总结系列就能够结束了,可是和别人比较,总要有新内容才算进步嘛,因此在这个总结里面,加入了第三篇,定位服务的提供。并且这个功能确定和推送服务是一块儿的,由于推送内容的本地化要求和按区域区分,定位服务就必不可少了。
因此,下一篇就总结一下本身研究定位服务的心得。