ios 推送通知(转载)
//这篇文章写的不错。
http://www.iwebmobile.com/ios%E5%BC%80%E5%8F%91%EF%BC%9A%E6%8E%A8%E9%80%81%E9%80%9A%E7%9F%A5%E7%AE%80%E8%BF%B0%E5%8F%8A%E5%BC%80%E5%8F%91%E5%AE%9E%E8%B7%B5-%EF%BC%88%E9%87%8D%E8%A6%81%EF%BC%81%EF%BC%89/6/
?
?
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
?
在这个方法里添加上
?
UIRemoteNotificationType? types =? UIRemoteNotificationTypeSound|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert;
? ? [[UIApplication sharedApplication] registerForRemoteNotificationTypes:types];
这里表明 一共注册三种类型 badge,alert,和sound
?
会在第一次使用时候提醒用户是否接受推送,(只会提醒一次),当用户选择允许之后会在
?
-(void) application:(UIApplication *) application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
这个方法里取得设备的token号,然后发送给你们的服务器(因为token不是永远不变的,建议在程序轮询取一次,存好)
?
?
?
当用户选择不允许的时候或者此时使用模拟器的时候会实现该方法
?
-(void) application:(UIApplication *) application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
?
?
当用户正在使用该程序的时候,可以用一个alertview提醒用户,(主要是为了与自己服务器通信,取得一次最新数据)
?
-(void) application:(UIApplication *) application? didReceiveRemoteNotification:(NSDictionary *)userInfo
{
?
?? ?
? ? //当用户打开程序时候收到远程通知后执行 ?
? ?if (application.applicationState == UIApplicationStateActive) { ?
?
? ? ? ?UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"新消息提示" ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?message:[NSString stringWithFormat:@"\n%@", ?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [[userInfo objectForKey:@"aps"] objectForKey:@"alert"]] ?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?delegate:self ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?cancelButtonTitle:@"确定" ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?otherButtonTitles:nil]; ?
?? ? ? ?
?
?? ? ? ?
? ? ? ? [alertView show]; ?
?
? ? ? [alertView release]; ??
? ? ? ?
?? ? ? ?
? ? } ?
?? ? ? ?
}
?在这里与服务器通信-(void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
?
}
??
另外:
可以在这个方法里面把icon图标数字变为零,(这个主要根据软件需要)
- (void)applicationDidBecomeActive:(UIApplication *)application{
? ? [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
??
}
?
?
?
?
?
?
?
?
?
在理想情况下,您将令牌与一些标记用户的信息(如在您的系统中的个人用户名)相关联,使您的服务器知道稍后要将消息发送给谁。(您可以将它想 像为类似于将电话号码与个人姓名相关联。)如果您没有将令牌与自己的用户标识信息关联,您仍然可以将消息发送到这些设备,但您不能为每个用户自定义消息, 因为您所拥有的是一个目标设备的字母令牌字符串。
服务器应该将令牌及其相关的标识信息保存在数据库中。在大多数应用程序中,它被保存在用户配置文件数据库中。
List<Device> inactiveDevices = Push.feedback("keypair.p12", "password", false);/* remove inactive devices from your own list of devices */
不要将资源浪费在将消息发送到已删除您的应用程序的设备,或选择不接收通知的设备,这一点很重要。
回页首
其他考虑事项
推送通知不能在 iOS 模拟器上进行测试;您必须将应用程序部署到实际设备上对其进行测试。因为用于对消息进行身份验证的数字证书被捆绑到应用程序的配置概要文件,您需要使用在 开发或临时分发应用程序中的开发证书进行测试。在应用程序通过审批并在 App Store 中提供后,您必须切换到生产证书。
此外,重要的是要理解,为大数据库中的用户定制和发送推送消息是一项资源密集型工作。例如,每 5 秒遍历一次一个百万用户级的数据库,以确定 10 个当时需要收到消息的用户,这成本非常高。服务器端的基础架构需要精心的设计和规划,以支持对大量用户的频繁推送通知。相反,一次向一百万个用户发送推送 消息会产生大量的流量,因此通过使用一个线程池可以更好地处理这一场景,而不是阻止一个单独线程。JavaPNS 库提供一个简单的 API,它使用线程池,可以同时将消息推送给大量设备。
回页首
结束语
推送技术让您的服务器应用程序绕过电信运营商,并直接通过 Internet 向 iOS 设备的应用程序发送消息。虽然实现推送通知并非小事(客户端 SSL 证书对 Apple 服务器的身份验证需求很复杂),但是来自 Urban Airship 和 JavaPNS 等第三方的帮助可以使发送通知更加容易。SMS 和 MMS 有自己的位置,并且仍然比推送技术更可靠,但您可以通过实现推送消息使您的 iOS 应用程序更加丰富,提供更多的功能。
?
?
?
?
?
?