前言数组
以前接触过iOS上的推送服务,当时作的是在线推送,虽然已经有不少开发商提供集成的推送服务,但做为了解原理的方式也是一个不错的过程。服务器
最近打算应用本地通推送的功能,原本觉得会和在线推送同样麻烦,又要弄证书,又要提交验证,因此一直没动手。今天稍微了解后,发现本地推送就是很简单的一件事。app
介绍spa
本地推送是什么code
在线推送通常是经过服务器发送消息到对应设备,并由对应设备作出响应通知用户。而本地推送则是直接在本地由程序控制发送消息通知用户。因为减小了服务器以及验证设备的过程,因此本地推送其实就是一个简单的通知服务。对象
本地推送能作什么blog
GTD应用通常须要根据设定在规定时间通知用户完成某个任务。GTD的事务在本地基本都有备份,也固然是经过本地来通知用户什么时候应用完成任务。在这里,本地推送服务的做用就突显出来了。游戏
某些游戏,好比升级建筑装备等,通常都须要时间去完成,玩家不可能在游戏前一直等待。当升级结束,游戏在本地把通知推送给玩家,玩家响应并再次进入游戏,不只节约玩家的时间,也给游戏的激活带来更多的流量。事务
虽然本地推送不如在线推送的使用频率那么高,但仍是颇有用途的。资源
如何实现本地推送
添加通知
本地推送的实现很简单,更多的是自定义的过程。来看看下面的代码:
UILocalNotification *notification = [[UILocalNotification alloc] init]; // ARC环境 notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:3]; // 推送时间 notification.timeZone = [NSTimeZone defaultTimeZone]; notification.repeatInterval = 0; // 推送间隔 notification.soundName = UILocalNotificationDefaultSoundName; // 推送声音 notification.alertBody = @"Push Notification"; // 推送内容 notification.applicationIconBadgeNumber = 1; // 消息个数 notification.userInfo = [NSDictionary dictionaryWithObject:@"value" forKey:@"key"]; [[UIApplication sharedApplication] scheduleLocalNotification:notification];
实例化一个`UILocalNotification`对象,并根据具体的要求设置这个对象的属性。
`fireDate`表示推送的时间。`timeZone`是对应的时区。
`repeatInterval`表示推送的重复间隔,它的类型是`NSCalendarUnit`,能够用这个枚举值来赋值,表示天天、每周或每个月等。若是为0则表示不重复推送。
`soundName`是推送的声音,能够写上bundle资源里已有的音乐文件名称,这样就能够自定义推送的声音了。
`alertBody`是推送的内容。
`applicationIconBadgeNumber`表示显示在该应用图标上的消息个数。在接受消息后须要把这个属性重置。
`userInfo`能够存放通知的相关信息。
最后,经过调用`scheduleLocalNotification`达到推送通知的目的。
接收通知
接收推送通知更加容易,在`AppDelegate`的`didReceiveLocalNotification`方法中就能够接收了。
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification*)notification { NSLog(@"Notification : %@", notification.alertBody); // 输出推送信息 application.applicationIconBadgeNumber = 0; // 消息数置为0 }
上面在`didReceiveLocalNotification`方法中打印出了推送消息的内容,并把消息数置为0。固然也能够经过判断`notification`的具体信息显示弹窗、修改消息数等。
取消通知
NSArray *array = [[UIApplication sharedApplication] scheduledLocalNotifications]; // 获取本地推送数组 [[UIApplication sharedApplication] cancelLocalNotification:notification]; // 取消某个推送 [[UIApplication sharedApplication] cancelAllLocalNotifications]; // 取消全部推送
上面这段代码展现了几个API,但其中没有必然的调用关系。
`scheduledLocalNotifications`能够获取本地的推送数组,其中的每一个成员都是UILocalNotification,能够根据它们的userInfo区分推送的类型。
`cancelLocalNotification`能够取消某个具体的推送通知。好比取消经过`scheduledLocalNotifications`获取的某个通知。
`cancelAllLocalNotifications`则能够一次性取消全部的通知。
本地推送会有哪些坑
iOS8
在iOS8以后,要使用本地推送都须要为本地注册通知类型,不然没法接收到通知。具体的作法是在`AppDelegate`的`didFinishLaunchingWithOptions`中注册。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil]]; return YES; }
音乐
推送通知能够自定义音乐,但并非全部音乐均可以调用。目前只支持30秒的音乐,由于推送最多只能维持30秒。
声音
若是手机置为静音,则音乐没法播放。
若是在手机打开的时候显示通知,也不会播放音乐,甚至也不会震动。
applicationIconBadgeNumber
若是是从通知栏点击通知进入应用,会响应通知的回调,同时在回调中奖消息数置为0。
而若是是在有消息的状况下直接打开应用,并不会走通知回调的流程。
能够根据须要接入这部分逻辑。
总结
本地通知的处理仍是比较简单的。
闹钟的实现原理也是利用了本地通知,可是若是要考虑震动等问题,则会更加复杂。有须要再慢慢研究。