一、帮助文档参考:php
https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ProvisioningDevelopment.html#//apple_ref/doc/uid/TP40008194-CH104-SW1html
https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/CommunicatingWIthAPS.html#//apple_ref/doc/uid/TP40008194-CH101-SW1node
二、服务器证书文件生成文档:ios
http://fecbob.pixnet.net/blog/post/39286091-蘋果推送apnsweb
三、APNS全流程:json
http://www.cnblogs.com/gpwzw/archive/2012/03/31/apple_push_notification_services_tutorial_part_1-2.htmlxcode
四、Google描述APNS:服务器
https://code.google.com/p/apns-php/wiki/CertificateCreationapp
五、APNs之我见:iphone
整个流程中的角色: apple push notification server(aServer), the third push notification server(mServer), APP, iphone(device)
目的:aServer将mServer发送过来的通知推送到device上
条件:1. mServer证书,由于aServer须要区分是谁发送通知过来
2. APP证书,由于aServer一样须要知道通知是对应于哪一个APP的
3. device token, aServer须要知道将通知发送到哪一个地址
六、实际操做流程
1)生成.certSigningRequest文件。方法:apple developer website->APP IDs->选择你须要建立push通知的bundle id编辑Push Notifications那项。有具体文档说明如何生成.certSigningRequest文件
2) 获得aps_development.cer(或者distribution也行)。上传.certSigningRequest文件文件后,apple会自动生成aps_development.cer文件,直接下载而后双击便装进了keychain中
3)生成apns-dev.p12(固然能够是其余名字)文件。在keychain中选择aps_development.cer,右键导出为.p12格式即可
4)生成apns-dev.pem文件。此文件能够直接发给server端用即可。使用此命令(参照上面google的文档):
openssl pkcs12 -in apns-dev.p12 -out apns-dev.pem -nodes -clcerts
5)xcode工程设置:注意provisioning profile 的bundleID必定要和aps_development.cer证书的bundleID是同样的
6) 在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中register push notification
if (!TARGET_IPHONE_SIMULATOR && ![[NSUserDefaults standardUserDefaults] objectForKey:DeviceTokenKey]) {
NSLog(@"Registering for push notifications...");
if([[[UIDevice currentDevice] systemVersion] floatValue] > 7.1)
[[UIApplication sharedApplication] registerForRemoteNotifications];
else
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
}
7) push notification delegate
#pragma mark -
#pragma mark Push Notification
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
NSLog(@"deviceToken: %@", deviceToken);
if (deviceToken != nil)
{
NSString *deviceTokenString = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<" withString:@""]
stringByReplacingOccurrencesOfString:@">" withString:@""]
stringByReplacingOccurrencesOfString:@" " withString:@""];
if (deviceTokenString) {
NSLog(@"deviceTokenString = %@", deviceTokenString);
[[NSUserDefaults standardUserDefaults] setObject:deviceTokenString forKey:DeviceTokenKey];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
LogError(@"Error in registration. Error: %@", error);
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSLog(@"receive notification date:%@, server send notification info:%@", [NSDate date], userInfo);
NSString * jsonStr = [userInfo objectForKey:@"acme"];
NSData *data = [jsonStr dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary * parsedData = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:CloudSeverPushNotification object:parsedData];
// [[CloudDriverManager shared] startCloudSync];
}