iOS 推送(本地推送)推送介绍总结使用步骤其他常用API

古语有云:书读百遍,其义自现。是很有一定道理的。

而在编程中,看过不如敲过,敲过不如理解,而很多代码的精髓要义,都是在我们写过很多遍之后就自然而然的理解了。


推送介绍

iOS 中的推送分为两种:本地推送和远程推送。与之对应两种通知分别是LocalNotificationRemoteNotification。今天介绍本地推送,因为本地推送不涉及到苹果的推送服务器,所以测试本地推送功能不需要开发者证书,甚至在模拟器上测试也可以。

总结

在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;

关于本地推送的属性介绍和使用:这篇文章讲的非常好

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏非典型技术宅

iOS四大对象之AppDelegate及UIApplicationMain函数/程序启动过程1. AppDelegate应用程序代理2. UIApplicationMain函数/程序启动过程

15450
来自专栏一“技”之长

iOS网络编程之三——NSURLConnection的简单使用

    在iOS7后,NSURLSession基本代替了NSURLConnection进行网络开发,在iOS9后,NSURLConnection相关方法被完全的...

8610
来自专栏iOS开发攻城狮的集散地

Url Scheme实现APP间通信、分享

接下来就以我之前写的UIActivityViewController系统原生分享-仿简书分享和iOS开源小项目-WSL两个Demo为例,让我们看下怎么可以让UI...

26580
来自专栏ShaoYL

程序启动的完整过程

465150
来自专栏.NET开发那点事

angularjs的表单验证

angularjs内置了常用的表单验证指令,比如min,require等。下面是演示: <!DOCTYPE html> <html> <head> ...

19960
来自专栏iOS开发随笔

Unity项目嵌入现有iOS项目的方法

31570
来自专栏一“技”之长

Swift学习第二练——Swift项目时光电影

    很早以前的一个OC的练习项目,用swift重新写了一遍,因为xcode版本的更新对swift的兼容度也在不断改变,此版本适用于xcode6.1。

10050
来自专栏xx_Cc的学习总结专栏

iOS-控制器View的创建和生命周期

35360
来自专栏進无尽的文章

基础篇-UIApplication、UIWindow以及程序的启动流程看我就够了

这篇文章主要介绍下有关UIApplication、UIWindow以及程序的启动流程,通过这篇文章,相信你会更加理解iOS 的应用启动过程以及app应用级别的相...

12420
来自专栏iOS开发攻城狮的集散地

Url Scheme实现APP间通信、分享

20750

扫码关注云+社区

领取腾讯云代金券