远程推送比本地推送要麻烦的对。
做远程推送的条件:
1.真机(必须有真机调试证书)
2.有推送证书
3.有一台服务器
那么对于对于没有服务器,但是也想测试远程推送的盆友们来说。pushmebaby就是一个很好的代替品了!
附上地址:http://vdisk.weibo.com/s/zfhMNTK9gK_N2
二.Apple Push Notification的工作机制
自己的客户端发送消息到自己应用软件的apns,apns发送消息到你的手机。这个是根据令牌识别的。手机在发送消息到你的应用软件。
- 首先是应用程序注册消息推送。
- IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
- 应用程序将deviceToken发送给PUSH服务端程序(Provider)。
- 服务端程序向APNS服务发送消息。
- APNS服务将消息发送给iPhone应用程序。
1. Provider是指某个iPhone软件的Push服务器,是我们将要开发的服务器。
2. APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。
附上图已助于理解:
注册通知:
[application registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
这个推送通知这三个参数的分别是,app上的脚标,badge,
需要实现的代理方法:
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
NSLog(@"%@",deviceToken);
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"%@" , [error localizedDescription]);
}
#pragma mark 程序被挂起的时候调用的代理
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
UILabel *label = (UILabel *)[self.window viewWithTag:100] ;
label.backgroundColor = [UIColor yellowColor];
NSLog(@"%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]);
NSLog(@"%@",[[userInfo objectForKey:@"aps"] objectForKey:@"other"]);
label.text = [[userInfo objectForKey:@"aps"] objectForKey:@"other"];
}
第一个代理方法是用于接受apns返回的唯一token值的。
第二个代理方法是用于推送出现错误调用的
第三个方法是内容被apns推送到设备上时调用(程序处于挂起状态的时候调用)。
另外如果你的程序如果退出了,但是apns正好这个时候把消息推送给你了,那么你就需要在这么操作:
#pragma mark 当程序推出时,推送通知用launchOptions获取
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 100, 320, 150)];
label.backgroundColor = [UIColor redColor];
label.tag = 100;
label.textColor = [UIColor blueColor];
[self.window addSubview:label];
NSDictionary *pushDic = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
//
if (pushDic) {
label.backgroundColor = [UIColor purpleColor];
label.text = [[pushDic objectForKey:@"aps"] objectForKey:@"alert"];
}
//注册通知
[application registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
[self.window makeKeyAndVisible];
return YES;
}
程序推出后通知消息由
didFinishLaunchingWithOptions接受,返回的内容是一个字典,存在launchOptions字典中,关键字是
UIApplicationLaunchOptionsRemoteNotificationKey.
接下来介绍pushmebaby的使用:
<img src="https://img-blog.csdn.net/20140809112021915?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlvbmc0NjYyMTI4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
打开后类目如上,打开appdelegate,
/*
* @只需要修改init方法
* 1、修改token
* 2、修改所需要的内容
* 3、如果aps证书(push SSL证书)错误,运行时程序崩溃
*/
- (id)init {
self = [super init];
if(self != nil) {
<p class="p1"><span class="s1"> </span>// <span class="s2">设备令牌</span></p><p class="p2"><span class="s1"><span> </span><span> </span></span><span class="s3">self</span><span class="s1">.</span><span class="s4">deviceToken</span><span class="s1"> = </span>@"11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111"<span class="s1">;</span></p><span style="font-family: Arial, Helvetica, sans-serif;"></span>
// 负载信息,key必须是aps
self.payload = @"{\"aps\":{\"alert\":\"好无聊\",\"badge\":6,\"sound\":\"呵呵.caf\",\"newID\":\"4987\", \"other\":\"我爱nba\",}}";
// 证书
self.certificate = [[NSBundle mainBundle] pathForResource:@"aps_development" ofType:@"cer"];
NSLog(@"certificate : %@", self.certificate);
}
return self;
}
先要设置令牌,令牌就是在通知的第一个代理方法中apns返回的token值。
后面的payload就是推送的详细内容。
还有就是必须要倒日推送证书,而且导入的时候要加入编译。不然会有问题。
如何加入编译,在导入的时候 有一栏是Add to targets 勾上就ok。
然后运行:
会出现这个,然后点push就ok。
如果编译器是64位,需要改称32位,附图:
修改后,指点在scheme这里选择32位编译器就ok。
运行流程是:
1.先打开自己的远程推送app,在真机上跑起来,(注意:如果需要播放声音,要把文件拖到你的app中,而不是pushmebaby或者服务器)
2.获取了token之后,在pushmebaby里填入,并且拖入证书,修改好payload。
3.运行pushmebaby,推送消息出去就ok。