iOS推送大家经常会用到,最近我也用到了,再此记录以下push的整个流程


1.首先打开本地的“钥匙串访问” ==>证书助理==>从证书颁发机构求证书




2.填写证书信息,输入邮件地址,填写常用名称,重要的是选择“存储到本地磁盘”




3.点击继续保存到本地桌面,储存的默认名称为:"CertificateSigningRequest.certSigningRequest"




创建一个App ID


4.打开“http://developer.apple.com/devcenter/ios/index.action”




5.选择“App IDs” ==>New App ID




6.输入identify,如果证书已经存在绑定你的证书编号,不存在生成一个新的,输入你的应用程序唯一标识ID(如epub360.com.ArtsCool2)然后提交保存




7.App ID创建成功




创建证书


8.点击上图中的Configure后




9.选中“ Enable for Apple Push Notification service”,点击Configure。现在会看到苹果推送通知服务的SSL证书助理




10.点击Choose File选择上面第3步生成的“"CertificateSigningRequest.certSigningRequest"文件




11.你的SSL证书将生成




12.点击"download",下载完成后双击此文件




创建证书


13.返回iPhone Development Program Portal,点击New Profile,
填写配置文件名称,App ID选中刚刚创建的ArtsCool2,选中所有的设备,点击提交




14.点击下载这个证书,这个证书默认名称为“XXX.mobileprovision”




配置一个设备

15.连接你的设备,开启Xcode ==>Winow==>Organizer,把“XXX.mobileprovision”拖入设备中




创建一个你的应用


16.创建一个你的应用程序,如ArtsCool2,把aps_developer_identity.cer加入你的工程




17.修改Targets 




18.选择证书




19.在ArtsCool2AppDelegate.m文件中加入如下代码:

@implementation ArtsCool2AppDelegate

 @synthesize window;
 @synthesize viewController;

 - (void)applicationDidFinishLaunching:(UIApplication *)application {    
     [window addSubview:viewController.view];
     [window makeKeyAndVisible];

     NSLog(@"Registering for push notifications...");    
     [[UIApplication sharedApplication] 
         registerForRemoteNotificationTypes:
         (UIRemoteNotificationTypeAlert | 
          UIRemoteNotificationTypeBadge | 
          UIRemoteNotificationTypeSound)];
        application.applicationIconBadgeNumber = 0; //程序开启,设置UIRemoteNotificationTypeBadge标识为0

 }

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

     NSString *str = [NSString 
         stringWithFormat:@"Device Token=%@",deviceToken];
     NSLog(str);

 }

 - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { 

     NSString *str = [NSString stringWithFormat: @"Error: %@", err];
     NSLog(str);    

 }

 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

     for (id key in userInfo) {
         NSLog(@"key: %@, value: %@", key, [userInfo objectForKey:key]);
     }    

 }

 - (void)dealloc {
     [viewController release];
     [window release];
     [super dealloc];
 }

 @end


20.运行程序,你会看到




21.退出你的程序你将看到




创建推送通知的服务器


服务器发送通知需要:deviceToken和APNS连接的证书。

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

     NSString *str = [NSString 
         stringWithFormat:@"Device Token=%@",deviceToken];
     NSLog(str);
 }


在ArtsCool2AppDelegate已经获取了deviceToken,我们通过NSURLRequest方式回传给服务器。


APNS连接的证书生成


21.打开“钥匙访问串”,导出我们刚刚加入的证书,命名为:cert.p12




22.选中钥匙图标导出命名为:key.p12




23.使用OpenSSL生成Pyton和APNS通信的证书文件

openssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12
 openssl pkcs12 -nocerts -out key.pem -in key.p12


如果你想刪除 passphase在key.pem私鑰,這樣做


openssl rsa -in key.pem -out key.unencrypted.pem


24.然后把证书和密钥结合起来


cat cert.pem key.unencrypted.pem > ck.pem


26.以下是Python主要代码

python代码中引用了开源库APNSWrapper
http:///p/apns-python-wrapper/downloads/list deviceToken = 'Qun\xaa\xd4R\x11zu\x07\x04\x9dG\xe6\x96j&\x95Y\x9d\x91~\xcc`z\n\x88O\xc0\x9c\xf6\xca' 

 # create wrapper
 wrapper = APNSNotificationWrapper('ck.pem', True)

 # create message
 message = APNSNotification()
 message.token(deviceToken)
 message.badge(5)

 # add message to tuple and send it to APNS server
 wrapper.append(message)
 wrapper.notify()


如果以上没有配置成功,错误信息如: Error: Error Domain=NSCocoaErrorDomainCode=3000 UserInfo=0x1655c0 "未找到应用程序的“aps-environment”的权利字符串"

解决方法:


1.查看证书是不是有.*


2.看看Push是否被关闭 


3.一定要按照先后顺序配置 


4.项目的Identify名称一定要和App ID中的对应