古语有云:书读百遍,其义自现。是很有一定道理的。
而在编程中,看过不如敲过,敲过不如理解,而很多代码的精髓要义,都是在我们写过很多遍之后就自然而然的理解了。
推送介绍
iOS 中的推送分为两种:本地推送和远程推送。与之对应两种通知分别是LocalNotification
和RemoteNotification
。今天介绍本地推送,因为本地推送不涉及到苹果的推送服务器,所以测试本地推送功能不需要开发者证书,甚至在模拟器上测试也可以。
总结
在App处于前台时,创建一个或者多个本地通知,然后到了设置好的时间,iPhone 的通知中心,就会在指定时间将本地通知推送(分发)到App。
-
我们都知道点击手机桌面的App图标启动时,
-[AppDelegate application:didFinishLaunchingWithOptions:]
的第二个参数 launchOptions都为nil。 -
但是如果App已经被系统Kill掉或者被我们自己完全退出的情况下,点击通知时,也会启动App,也会调用如下方法:
-[AppDelegate application:didFinishLaunchingWithOptions:]
不同的是的launchOptions参数中可以获取本地通知的信息。 获取本地通知的示例:
label.text = [launchOptions[UIApplicationLaunchOptionsLocalNotificationKey] description];
- 如果App处于后台,还没有被系统Kill掉,也没有被我们完全退出,则点击通知,不会调用
-[AppDelegate application:didFinishLaunchingWithOptions:]
,而是调用:
- (void)application:(UIApplication *)application didReceiveLocalNotification:(nonnull UILocalNotification *)notification
{
NSLog(@"点击了接收到了本地通知");
NSLog(@"%@",notification);
}
- 当App正处于前台活跃状态时,收到本地通知时,并不会弹出通知的消息,但是依然会调用下面这个方法:
- (void)application:(UIApplication *)application didReceiveLocalNotification:(nonnull UILocalNotification *)notification
{
NSLog(@"点击了接收到了本地通知");
NSLog(@"%@",notification);
// 我们可以在这里做一些提醒。
}
使用步骤
首先,是注册推送:
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:settings];
然后启动App会看到如下图所示的弹窗:
不管点击OK还是Don't Allow,都会进入如下方法:- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings
{
// 本地推送,这个方法可以不用写,也不用设置。
}
然后,在控制器中创建一个本地通知,并调用:
UILocalNotification *localNotice = [UILocalNotification new];
localNotice.fireDate = [NSDate dateWithTimeIntervalSinceNow:5.0];
localNotice.alertBody = @"测试发了3条新消息";
localNotice.alertAction = @"锁屏时的子标题";
localNotice.applicationIconBadgeNumber = 3;
self.localNotification = localNotice;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotice];
再然后,在AppDelegate 的两个方法中处理本地通知: 完整示例:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil];
[application registerUserNotificationSettings:settings];
if (launchOptions) {
/** 用一个label来显示通知 */
UILabel *label = [[UILabel alloc]init];
label.backgroundColor = [UIColor redColor];
label.frame = CGRectMake(0, 100, 320, 200);
label.numberOfLines = 0;
label.text = [launchOptions[UIApplicationLaunchOptionsLocalNotificationKey] description];
label.font = [UIFont systemFontOfSize:11];
[self.window.rootViewController.view addSubview:label];
//清空角标
application.applicationIconBadgeNumber = 0;
}
return YES;
}
另一个方法中的处理:
- (void)application:(UIApplication *)application didReceiveLocalNotification:(nonnull UILocalNotification *)notification
{
NSLog(@"点击了接收到了本地通知");
NSLog(@"%@",notification);
application.applicationIconBadgeNumber = 0;
}
其他常用API
取消(删除本地通知)
// 删除某个本地通知
[[UIApplication sharedApplication] cancelLocalNotification:self.localNotification];
// 删除所有的本地通知
[[UIApplication sharedApplication] cancelAllLocalNotifications];
// 获取将要执行的本地通知数组
NSArray *array = [UIApplication sharedApplication].scheduledLocalNotifications;
关于本地推送的属性介绍和使用:这篇文章讲的非常好