Apple Push Notification service

摘要:
Bundleidentifier-˃ProvisionProfile-˃AppID-˃EnableforApplePushNotificationservice-˃PushSSLCertificate Visible,尽管iOS应用程序不需要加载下载的证书,但实际上它也有相应的证书,仅通过Bundleidentiifier进行标识。IOS设备可以订阅或取消订阅应用程序中的APNS消息通知:*AppDelegate中的didFinishLaunchingWithOptions:method。m、 或在其他*ViewController中的触发事件中。米。

  APNS是iOS的消息推送机制,网上有很好的资料,请查看最后的参考列表,这里强调一些关键步骤。

Apple Push Notification service第1张

一、生成证书。

  与苹果的APNS Server交互涉及到iOS设备和提供Push服务的Provider,它们均需要证书进行验证。iOS设备与APNS的交互是通过底层进行的,应用程序本身并不需要引用什么证书,但是你的应用是否能够成功注册消息通知,会与你项目中的Bundle identifier有关,你指定的Bundle identifier所属的Provisioning Profile下的AppID必须开通了"Enable for Apple Push Notification service",如下图:

Apple Push Notification service第2张

从图可见,分开了Development和Production,生成Provider证书时,如果是开发环境生成Development的证书,如果是生产环境生成Production的证书。

Bundle identifier --> Provision Profile --> AppID --> Enable for Apple Push Notification service --> Push SSL Certificate

可见,虽然iOS应用并不需要加载下载下来的证书,但实际上它也是存在与其对应的证书的,只是通过Bundle identifier标识。

注意,如果之前没有为对应的AppID开通APNS,此时就需要下载新的Provision Profile并重新安装,重装Profile的方法很简单,打开Organizer窗口,删除对应的Provision Profile文件,然后把新下载的文件拖拉到窗口中就OK了。

  如果要在应用程序中调试通过还需要做些配置,否则会出现如下错误:

“no valid aps-environment entitlement found for application”

我们打开刚才下载下来的新Provision Profile文件,其中有一段配置:

    <key>Entitlements</key>
<dict>
<key>application-identifier</key>
<string>7C57XDWF8L.com.xxx.appname</string>
<key>aps-environment</key>
<string>development</string>
<key>get-task-allow</key>
<true/>
<key>keychain-access-groups</key>
<array>
<string>7C57XDWF8L.*</string>
</array>
</dict>

我们需要在iOS项目中添加Entitlements配置,步骤如下:

1、开启并添加配置。

.xcodeproj --> Summary --> Entitlements节 --> 选中"Enable Entitlements"

些时会自动生成一个${PRODUCT_NAME}.entitlements的文件,在文件中添加键值对:

Key  Type     Value
get-task-allow  Bollean     YES
aps-environment  String  development  这行是必须的
application-identifier  String  7C57XDWxxx.com.xxx.appname
keychain-access-groups  Array

  Item0 String 7C57XDWxxx.*

2、也可以指定使用Entitlements.entitlements文件,通过以下方法添加文件:

New Files --> Code Siging --> Entitlements --> Next...

文件的内容和上述相同,在配置中选择此文件即可。

3、订阅和退订。

iOS设备对APNS进行订阅或退订消息通知的行为,可以在*AppDelegate.m中的application:didFinishLaunchingWithOptions:方法进行,也可以在别的*ViewController.m的某个触发事件中进行。

订阅:

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

退订:

 [[UIApplication sharedApplication] unregisterForRemoteNotifications];

如果想要避免每次启动都执行订阅和接收DeviceToken的操作,可以进行如下判断:

if([[UIApplication sharedApplication] enabledRemoteNotificationTypes]
{
  [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge
| 
    UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}

这样可能只会在第一次安装程序的时候才会订阅并接收到DeviceToken,如果后来调用了unregisterForRemoteNotifications,也不会再次执行了。

4、Delegate方法。

当调用registerForRemoteNotifications方法,或者应用程序接收到来源自于APNS的通知时都会触发相关的delegate方法,因为这些delegate方法定义在UIApplicationDelegate中,所以实现需要做在*AppDelegate.m类中。例如:

//注册push服务
- (void)application:(UIApplication *) application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *) deviceToken {
NSString
*token = [[deviceToken description] stringByTrimmingCharactersInSet:
    
[NSCharacterSet characterSetWithCharactersInString:@"<>"]]; //去掉"<>"
    token = [[token description] stringByReplacingOccurrencesOfString:@" " withString:@""];//去掉中间空格
NSLog(@"deviceToken: %@", token);
}

//注册push服务失败
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(
@"Error in registration for APNS. Error: %@", error);
}

//接收到push消息
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(
@"收到推送消息 : %@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
UIAlertView
* alert = [[UIAlertView alloc] initWithTitle:@"推送通知"
message:[[userInfo objectForKey:
@"aps"] objectForKey:@"alert"]
delegate:self
cancelButtonTitle:
@"关闭"
otherButtonTitles:
@"更新状态",nil];
[alert show];
[alert release];
}

注意:通过 application:didRegisterForRemoteNotificationsWithDeviceToken:获取到DeviceToken后需要推送给提供Push服务的Provider,Provider保存好此应用的uuid对应的token,以便在发送消息的时候使用。

如何生成.NET所需证书的可以根据这里的步骤来做。

二、Provider开发。

可以通过apns-sharp这个开源库进行开发,另外还有很多相关的文章详细解说其开发原理,例如这几篇文章:
Local and Push Notification Programming Guide: About Local Notifications and Push Notifications
Local and Push Notification Programming Guide: Provider Communication with Apple Push Notification Service
Programming Apple Push Notification Services 
Apple Push Notification Service
另外,还有PushMeBaby供XCode下开发测试的Provider




免责声明:文章转载自《Apple Push Notification service》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇msysgit中文问题C# socket编程第三篇下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MFC消息处理流程概述 .

Win32下的消息流程清晰明了,但在MFC下,由于封装的缘故,隐藏的有点深,对一般的开发人员而言,就不甚明了喽。本文试图粗略展示出MFC下消息处理的基本流程。 一、先看一下Win32下的消息处理流程 每一个线程都对应有一个消息队列,利用API函数GetMessage从消息队列中获取消息,然后利用TranslateMessage翻译消息(主要是一些...

Spring Cloud集成相关优质项目推荐

Spring Cloud Config 配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git以及Subversion。 Spring Cloud Bus 事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。 Eureka 云端服务发现,一个基于...

Wpf发送接收 win32消息

#region WPF发送和接收win32消息 public const int WM_GETTEXT = 0x0D; public const int WM_SETTEXT = 0x0C; public const int WM_SIZEING = 0x0214; public const...

HTTP协议头字段

一、基础篇HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响...

用redis解决多用户同时编辑同一条数据问题

1,场景再现 场景:总公司可以给分公司下发今年的规划任务(可能只是写了个规划大纲),分公司收到后,进行详细的规划补充,然后提交。 比如规划表: CREATE TABLE `sys_plan` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', `branch_offince_id` int(11)...

微信开发之消息接收--视频消息(八)

一、消息格式 <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1357290913&l...