iOS的本地推送和远程推送

(文章转载自:http://www.zhangfei.tk/2015/10/12/%E6%8E%A8%E9%80%81/

iOS的本地推送和远程推送

推送也叫推送通知,是在iOS 3.0以后被引入的功能。是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径。有远程推送和本地推送之分。本地推送就是由应用程序发起的推送通知,不经过服务器。远程推送是由服务器发送的消息经过苹果的APNS(Apple Push Notification Service)服务远程推送给设备。

关于推送

推送也叫推送通知,是在iOS 3.0以后被引入的功能。是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径。有远程推送和本地推送之分。本地推送就是由应用程序发起的推送通知,不经过服务器。远程推送是由服务器发送的消息经过苹果的APNS(Apple Push Notification Service)服务远程推送给设备。

本地推送

本地推送不依赖服务器,只需要在程序里面写好触发推送通知的逻辑就可以了。添加一个本地通知的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
UILocalNotification *localNotification = [[UILocalNotification alloc] init];//初始化本地通知
if (localNotification != nil) {
NSDate *now = [NSDate new];
localNotification.fireDate = [now dateByAddingTimeInterval:15];//15秒后通知
localNotification.repeatInterval = kCFCalendarUnitHour;//循环次数,kCFCalendarUnitHour一小时一次
localNotification.timeZone = [NSTimeZone defaultTimeZone];//UILocalNotification激发时间是否根据时区改变而改变
localNotification.applicationIconBadgeNumber += 1;//应用的红色数字
localNotification.soundName = UILocalNotificationDefaultSoundName;//声音,可以换成自己的,如:alarm.soundName = @"myMusic.caf"
localNotification.alertBody = @"我是通知内容";//提示信息 弹出提示框
localNotification.alertAction = @"打开";//解锁按钮文字,就是在锁屏情况下有一个‘滑动来XXX’,这儿的XXX就是这里所设置的alertAction。如果不设置就是@“查看”
localNotification.hasAction = YES;//是否显示额外的按钮,为no时alertAction的设置不起作用,hasAction默认是YES
//通知的额外信息,不会展示出来,是用来判断通知是哪一条的额外信息
NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"xiaofei" forKey:@"birthday"];
localNotification.userInfo = infoDict;//添加额外的信息
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];//添加本地通知
}

如果想要取消本地推送,可以用下面的代码进行取消,既可以通过获取userInfo信息取消特定的消息,也可以取消全部的消息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
UIApplication *app = [UIApplication sharedApplication];
NSArray* localNotifications = [app scheduledLocalNotifications];//获取当前应用所有的通知
if (localNotifications) {
for (UILocalNotification* notification in localNotifications) {
NSDictionary *dic = notification.userInfo;
if (dic) {
NSString* key = [dic objectForKey:@"key"];
if ([key isEqualToString:@"name"]) {
//取消推送 (指定一个取消)
[app cancelLocalNotification:notification];
break;
}
}
}
}
//取消当前应用所有的推送
//[app cancelAllLocalNotifications];

收到消息后该如何处理呢?不管是在程序正在使用或者退出的状态下,都是通过UIApplication的代理方法进行处理,该方法如下:

1
2
3
4
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
//处理收到的通知...
application.applicationIconBadgeNumber = 0;//应用程序角标清零
}

远程推送

iOS的远程通知和安卓不一样,iOS要通过苹果公司提供的推送服务(APNS)才能把想要推送的消息从服务器那边推送到iPhone设备上。因此还得和苹果的APNS打交道。要在程序中添加推送服务需要配置不少东西,具体步骤如下:

给应用程序的App ID添加Push Notifications服务—>配置对应的证书—>配置对应Provisioning Profiles文件—>获取Device Token—>服务器端通过deviceToken和APNS建立SSL连接—>服务器端给APNS服务器发送推送消息

配置Push Notifications服务和相应证书请参考教你一步一步获取App ID,配置文件Provisioning Profiles文件请移步教你一步一步获取Provisioning Profiles

获取deviceToken需要在程序里面用代码来解决。首先注册远程推送通知,通过UIApllication的代理方法获取,代码如下:

1
2
3
4
5
6
7
8
9
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
UIUserNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:myTypes categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
else{
UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound;
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
}

注意:在iOS8以后还要添加下面的方法

1
2
3
4
5
#ifdef __IPHONE_8_0
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{
[application registerForRemoteNotifications];
}
#endif

注册成功以后通过UIApplication的代理方法获取deviceToken。获取deviceToken的格式是这样的:75e84eed c0451b39 5d8eec91 03154347 3ad56aee 97f8f565 9f027842 b78f8c77,并且要注意把deviceToken给后台的时候要去掉两边的尖括号和中间的空格。

1
2
3
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
NSLog(@"deviceToken:%@",deviceToken);
}

但是如果注册远程通知失败后会调用下面的代理方法。

1
2
3
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
NSLog(@"注册失败,错误是:%@",error);
}

程序正在使用或者退出的状态下,都会调用UIApplication的代理方法进行处理,该方法如下:

1
2
3
4
5
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
//处理通知...
NSLog(@"Receive remote notification : %@",userInfo);
application.applicationIconBadgeNumber = 0;
}

推送远程消息

如果写demo的话,可以用SmartPush进行模拟测试。想了解SmartPush的详细使用请移步到使用SmartPush进行iOS远程推送测试。如果你会Python的话,你可以参考一下这个代码来推送消息。

总结

  • 关于推送流程可以参考苹果官方文档,那里有详细的流程解释。
  • 在进行推送处理时要注意点击程序图标进入程序和点击消息进入程序是不同的,前者不会调用代理方法,需要从didFinishLaunchingWithOptions:方法的参数`launchOptions进行判断处理。
posted @ 2016-01-13 12:58  我叫南部21号  阅读(284)  评论(0)    收藏  举报