APNs --Apple Push Notification Service
(图片来源--
apple 开发文档)
要对做IOSAPP的码农特别推荐这个服务,相对于其它第三方框架更易于调用。
[iPhone ]APNs 服务
标注: APNs 苹果推送服务器
Device 安装带有推送服务程序的iPhone手机
Provider 程序服务器,把需要推送的信息发给 APNs
DeviceToken 在Device第一次连接APNs时,由APNs生成的经过加密的连接认证信息。在以后的连接中,无论时Provider到APNs还是APNs到Device 都需要 DeviceToken作为认证。
Payload 需要推送的消息的主体内容。
alert-alert消息的消息体,按键标题等
badge
-显示在程序icon右上角的数字,sound-声音提示文件的文件名,该声音资源文件要在程序包中。
整体流程大体分为五个步骤:
1: Device --> 连接--> APNs 获取 DeviceToken
2: Device -->连接-- > Provider 提供 DeviceToken
3: Provider侦测需要push的消息生成Notification信息
4: Provider侦把要push的消息推送到APNs
5: APNs把该消息推送到手机
使用方法:
为了获取deviceToken
第一步:获取认证书Certificates.p12 [注释:.p12 文件,文件名可以随便取]
该Certificates.p12 认证书 是用于服务器与APNs服务器SSL 连接时的认证,而获取p12的前提是获取APNs Assistant
1:每个程序都要在apple开发中心生成 App ID.
2:单击app id 的后面的 Configure
3: 在新的页面中,勾选Enable Push Notification Services , 而后点击Configure ,随后出现APNs Assistant,APNs助手会引导生成你的程序与APNs服务器进行SSL连接的认证书App ID specific Client SSL certificate[注释:一般文件名为“ aps_developer_identity.cer” 可修改]
4:APNs助手会引导你保存SSL certificate到你的硬盘,保存好后双击,安装到你的keychain
5: 执行完以上四步,可以点击Done,关闭APNs助手。
6:启动Keychain Access程序,查看刚才安装的认证,name 为apple Development/Production push Services。。。
导出--即获得Certificates.p12 保存好给 Provider 服务器使用
第二步:iPhone 端
iPhone provisioning 以开启了PUSH功能App ID 生成相应的provisioning。
iPhone需要用到的方法函数如下:
//注册启用 push
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge /*|UIRemoteNotificationTypeSound*/)];
//用该判断 程序是不是通过push消息启动的
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
//iPhone 从APNs服务器获取deviceToken后激活该方法
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
//注册push功能失败 后 返回错误信息,执行相应的处理
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err
注意:
deviceToken的处理
[[devToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]
调测试方法:
Device
调试运行iPhone端程序,以获取deviceToken 为成功标志。
Provider
网上有个共开发测试的Provider程序:
PushMeBaby:
使用的方法是,
1;拷贝注册获取的SSL certificate文件【.cer文件】重命名为 apns.cer 添加到PushMeBaby资源文件夹中
2: 运行,输入 iPhone端获取的deviceToken
3: 推送
以Device 程序获得相应消息为成功标志。
From:http://hi.baidu.com/hh20040410/item/fb6d3f9a2287448a59146177
服务端jar包:
bcprov-jdk16-145-1.jar
commons-io-2.0.1.jar
commons-lang-2.5.jar
javapns-jdk16-163.jar
log4j-1.2.16.jar
服务端代码:
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 = "/home/pencho/workspace/apns_iphone/";
String certificatePath = (path + "test.p12");
// certificatePath 步骤一中生成的*.p12文件位置
String certificatePassword = "maya";
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();
}
}
}