一、创建证书
1 点击钥匙图标
2 在菜单栏中依次选择:钥匙串访问?偏好设置?证书选项卡,下面两项全部选关闭
3 生成证书请求:钥匙串访问?证书助理?从证书颁发机构请求证书
4 输入两个电子邮件地址和常用名称。电子邮件地址是你注册AppleID。
a) 常用名称输入你在苹果网站注册的名称,其它名称没试过,不知道行不行。
b) 选择“存储到磁盘”。保存后的名称应该为:CertificateSigningRequest.certSigningRequest
c) 保存到磁盘后在你的钥匙串访问窗口应该会出两个密钥,一个公钥密钥,一个专用密钥,红色部分就是你在上面输入的常用名。
二、生成证书
1,在苹果开发者官网进入到下面这个页面,是Certificates,Identifiers&Profiles块,后面有链接(https://developer.apple.com/account/ios/certificate/certificateList.action)
后面点击添加,选择IOS Development,然后还会让你选择一个.certSigningRequest文件(就是刚才生成的机构证书)。完成后会生成开发者证书.cer文件,下载到mac电脑,双击安装。
openssl pkcs12 -in CertificateName.p12 -out CertificateName.pem -nodes
三,在开发者官网申请APP IDS
1,上面那个搞定了,这个就更容易了。注意一点Bundle ID的设置最后是要跟你app工程的Bundle Identifiler一致,命名规范“com.团队名.app名”。
下面我选择了wildcard App ID,Explicit App ID应该也是可以的
原理:这就是对应着你现在开发的app应用,有多少个应用,就该需要多少个app id
四,在开发者官网申请Devices授权
1,name就是你设备主人的名字,随便命名。
2,UDID就是你设备的id,很长。教你一个方法,用数据线插在mac上,打开xcode,进入到Window/Devices中,你就可以看到Identifier,复制,然后粘贴过去。
原理:就是添加可测试设备,有几台设备,就要添加多少次
五,在开发者官网生成描述配置文件 .mobileprovision文件
1,前面完成了,这个也不多说了,操作类似。就是要选择 cer,选择app id,选择devices。也就是这一步就是把你的mac,app,iphone连接起来的操作。
完成后,下载,双击安装。
六,开始配置xcode(3个地方)
1,配置Bundle Identifier,跟刚才在开发者官网设置的app IDS的identifier一致(刚才已经说过一次了)
2,配置Code Signing Identity,设置Debug为Iphone Developer
3,在左上角把模拟器换成真机,然后运行,就可以看到结果了
上面是创建证书的方法。参考:http://www.cnblogs.com/MartinLi841538513/articles/3831726.html/http://blog.csdn.net/quanqinyang/article/details/21695323
下面就开始我们的推送之路吧
1、首先到developer.apple.com上去下载自己创建的推送证书,certificate栏中。下载apns的证书(分为开发和生产),下载开发的证书可以了,app上线后把服务端的证书换成生产的就可以了。点击下载的证书就会出现在钥匙串中。
生成.p12文件如下图
生成pem格式的证书
打开终端,进入到你保存.p12文件的目录
openssl pkcs12 -in CertificateName.p12 -out CertificateName.pem -nodes
这样你就会看一个.pem文件,开发和生产一样的方法
2、到xcode中设置证书,Code Signing中设置成开发证书,这样是为了能接收到服务器发来的通知消息。
3、在Appdelegate.m文件中配置客户端的代码:
注册远程通知类型
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) { [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; [[UIApplication sharedApplication] registerForRemoteNotifications]; } else { [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; } }
实现委托方法
<span style="color:#333333;">- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken { NSString *tokenString = [[[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""]; // 向自己的服务器注册deviceToken }</span>
失败回调方法
<span style="color:#333333;">- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error { NSLog(@"Failed to get device token, error: %@", error); }</span>
处理接收到远程通知的方法
<span style="color:#333333;">- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary *)userInfo { //这里可以根据userInfo中的内容作一些页面的跳转,最大256个字节 }</span>
清除通知的方法:
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
[[UIApplication sharedApplication] cancelAllLocalNotifications];
根据项目要求放到不同的方法中。
applicationDidBecomeActive和didFinishLaunchingWithOptions
ios8以下远程通知不支持在通知栏中单条清除,本地通知支持单条的清除
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification*)notification { [[UIApplication sharedApplication] cancelLocalNotification:notification]; }
ios8中新增不少功能,后面会在介绍。