您的位置:首页 > 移动开发

iOS如何让APP删除后不接受APNS推送消息

2014-12-22 09:49 218 查看
首先简单说下iOS APNS:

Apple 使用公共密钥数字证书对来自 iOS应用程序的推送请求进行身份验证,所以您首先需要创建身份验证密钥,并向 Apple 注册它们。我将在下一节中花相当长的篇幅来直接介绍这一点。

接下来,需要确定安装该应用程序并选择接收该应用程序的推送通知的每台设备。工作顺序如下:

1.iOS 应用程序中的一个警告对话框会请求用户的许可,以接收推送通知。

2.如果用户授予权限,iOS 应用程序会联系 Apple
Push Notification服务 (APNs) 获得一个 ID字符串,以惟一地标识在此设备上安装的这个应用程序。(您可以将 ID 看作类似于传统消息场景中的收件人电话号码)。

3.iOS 应用程序将 ID上传到您的服务器应用程序。

4.当服务器应用程序需要发送推送消息时,它对 Apple 的推送服务器进行身份验证,然后使用从步骤2 和 3中获得的 ID 指定消息的收件人。

如果收件人设备在线,它接收并处理消息。如果设备离线,那么消息将会排队,然后当设备下一次在线时交付。

APNS也使您的服务器应用程序可以定期验证您所保存的应用程序 ID列表。这使您有机会删除那些在后来删除应用程序或修改其推送选择状态的用户和 ID。

请求和保存设备令牌

您的 iOS 应用程序需要请求用户许可,在它所安装的设备上接收推送通知。通常情况下,您可以通过一个简单的 API调用在应用程序代理中实现这一点,如下:

[[UIApplication sharedApplication]
registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)];


如果用户授予许可,应用程序会自动联系 APNS 服务器获取设备令牌。令牌使 APNS可以将该特定设备上所安装的这个特定应用程序识别为一个消息目的地。这个过程是自动的,并且在后台执行。您不需要为它编写任何代码。

在 APNS 服务器响应后,应用程序代理中的 didRegisterForRemoteNotificationsWithDeviceToken方法被调用,并将设备令牌作为一个调用参数传递进来。您必须保存设备令牌并将它上传到自己的推送通知服务器,如下:

- (void)application:(UIApplication*)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken {

NSString *tokenStr = [deviceToken description];
NSString *pushToken = [[[[tokenStr
stringByReplacingOccurrencesOfString:@"<</span>" withString:@""]
stringByReplacingOccurrencesOfString:@">" withString:@""]
stringByReplacingOccurrencesOfString:@" " withString:@""] retain];

// Save the token to server

NSString *urlStr = [NSString stringWithFormat:@"https://%@/push_token", RINGFULDOMAIN];
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];

[req setHTTPMethod:@"POST"];
[req setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-type"];
NSMutableData *postBody = [NSMutableData data];
[postBody appendData:[[NSString stringWithFormat:@"username=%@", username]
dataUsingEncoding:NSUTF8StringEncoding]];
[postBody appendData:[[NSString stringWithFormat:@"&token=%@",
pushToken] dataUsingEncoding:NSUTF8StringEncoding]];

[req setHTTPBody:postBody];
[[NSURLConnection alloc] initWithRequest:req delegate:nil];
}


在理想情况下,您将令牌与一些标记用户的信息(如在您的系统中的个人用户名)相关联,使您的服务器知道稍后要将消息发送给谁。(您可以将它想像为类似于将电话号码与个人姓名相关联。)如果您没有将令牌与自己的用户标识信息关联,您仍然可以将消息发送到这些设备,但您不能为每个用户自定义消息,因为您所拥有的是一个目标设备的字母令牌字符串。

服务器应该将令牌及其相关的标识信息保存在数据库中。在大多数应用程序中,它被保存在用户配置文件数据库中。

发送一个推送消息

要发送一个推送消息,您的服务器要查找即将发送消息的目标应用程序 ID 列表,根据收件人的用户配置文件为每个收件人个性化消息

联系 APNS 消息服务器,APNS 服务器的 Web服务 API 很复杂。对 Java开发人员来说幸运的是,开源 JavaPNS 库可以使其使用变得更简单。JavaPNS和下载和文档链接参见 参考资料。下面代码显示了如何使用 JavaPNS 库向设备发送类似于短信的消息:

String[] devices = {"token1", "token2};
List<</span>PushedNotification> notifications
= Push.alert("Hello World!", "keypair.p12", "password", false, devices);


JavaPNS 库的主界面方法是在 Push类中的静态方法。APNS 允许您在消息中嵌入各种内容。请参阅 iOS推送消息指南,获取所支持的负载类型的完整清单(参见 参考资料)。Push类为每种类型的消息提供方便的方法,并且它将消息的转换为 APNS 服务器接受的JavaScript
Object Notation (JSON)格式。在 清单3 中,keypair.p12 是从 KeyChain
Access导出的 p12 文件,password是p12 文件的密码。devices阵列是从 iOS 应用程序接收的设备令牌列表。所有这些设备都将收到这个推送消息。在参数中的false值指定该消息应发送到 APNS 开发服务器(沙箱),而不是其生产服务器。(回忆一下,您通常为沙箱创建一个 p12密钥对,为生产服务器创建一个不同的密钥对。)

方法调用返回的值是一个 PushedNotification对象的列表,您可以用它来确定推送交付的状态,如图所示:

for (PushedNotification notification : notifications) {
if (notification.isSuccessful()) {

} else {
String invalidToken = notification.getDevice().getToken();

}
}


如果通知对象告诉您,有某个设备令牌不再处于激活状态,例如,如果用户从设备中删除了该应用程序,或在应用程序设置中禁用了通知,您应该从数据库中删除该令牌,以便您不会再向它发送消息。

保持最新的活动设备令牌列表的另一种方式,是让您的服务器应用程序定期检查 APNS服务器。清单 5显示了如何查询 APNS 反馈服务,使用 JavaPNS从 APNS 沙箱接收一个无效设备令牌的列表:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: