本地推送

  • 可以让不在前台运行的APP, 告知用户APP内部发送了什么事情; 简单来说就是程序不在线或程序在后台想要接收消息, 那么就要用到推送通知来实现 ;
  • 效果:

     - 在屏幕顶部显示一块横幅(QQ)
    

    这里写图片描述

     - 在屏幕中间显示一个alertview(闹钟, 本地推送, 不需要网络)
    

    这里写图片描述

     - 锁屏时也照样呈现 
    

    这里写图片描述

     - 呈现推送通知的同时, 还可以更新APP图标数字
    

    这里写图片描述

     - 用户接受的推送通知, 都会展示在通知中心
    

    这里写图片描述

本地推送Local Notification


来自本地通知头文件:
In iOS 8.0 and later, your application must register for user notifications using -[UIApplication registerUserNotificationSettings:] before being able to schedule and present UILocalNotifications
在IOS8.0及以后, 你的应用在定制和展示通知之前必须注册用户通知.

由此: 本地通知分为4个步骤-创建, 注册, 定制, 展示

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //0.注册
    UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound categories:nil];


    [[UIApplication sharedApplication]registerUserNotificationSettings:setting];

    //1.创建一个通知
    UILocalNotification *local = [[UILocalNotification alloc]init];

    //初始化 5秒
    local.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];

    // 提示主题
    local.alertBody = @"女神:在吗?";

    // 图标数字
    local.applicationIconBadgeNumber = 11;

    local.soundName = UILocalNotificationDefaultSoundName;

    // 是否显示 滑动按钮
    local.hasAction = YES;

    // 滑动来解锁的按钮文字
    local.alertAction = @"聊天";

    // 携带参数
    local.userInfo = @{@"name":@"女神" , @"info":@"在吗?" , @"qq": @"110"};


    //2.定制  //3.展示
    [[UIApplication sharedApplication]scheduleLocalNotification:local];
}

现在运行程序我们可以看到:
//1.定制 之后程序在前台 没显示横幅 图标文字 改了 直接接收通知
//2.程序在后台 显示横幅 有通知
//3.程序死了 显示横幅 有通知
//4.点击了横幅 程序启动
//5.不点横幅 不发生事情

那么接下来我们验证:
//1.程序活着 或者 程序 死了 是否能接收通知
//2.点击横幅 是否是接收通知(内容)

**处理程序在前台或在后台的跳转**

// 接收到通知会调用这个方法
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    // 程序死了, 不会在控制台打印, 想验证是否接收到了通知, 采用添加控件的调试方法
    UILabel *lable = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 44)];
    lable.backgroundColor = [UIColor redColor];
    [self.window.rootViewController.view addSubview:lable];

     // 对于死了的程序这么验证不够严谨, 因为View可能不存在啦
    // 因此我们考虑采用写入本地文件或者更改图标文字
    [UIApplication sharedApplication].applicationIconBadgeNumber = 2;

   // 数据通过userInfo携带过来
    NSLog(@"%@",notification.userInfo);
    //跳转聊天界面
    [self jumpToChatWith:notification.userInfo];
}

总结:
//死了:
点击横幅没有来到这个方法

//活着
//1.前台: 默认直接接收(没有横幅) 来到这个方法
//2.后台: 点击恒幅就会接收 会来到这个方法

**处理程序从死到生: 点击图标/接收通知 的界面跳转**

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    //更改图标文字
    //[UIApplication sharedApplication].applicationIconBadgeNumber = 22;
    //接收通知  还是  点击图标?
    UILabel *lable = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 300, 300)];
    lable.backgroundColor = [UIColor redColor];
    lable.numberOfLines = 0;

    //显示通知

    [self.window.rootViewController.view addSubview:lable];

    if (launchOptions == nil) { //点击图标

    }else if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]){ //接收通知
        //跳转界面
        UILocalNotification *local = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];

        lable.text = [NSString stringWithFormat:@"%@",local.userInfo];

        [self jumpToChatWith:local.userInfo];
    }else{ //其他

    }
    return YES;
}

界面跳转

//接收到通知之后跳转界面
- (void)jumpToChatWith:(NSDictionary *)userInfo
{

    CZChatViewController *chat = [[UIStoryboard storyboardWithName:@"chat" bundle:nil] instantiateInitialViewController];

    NSLog(@"%@",self.window.rootViewController);

    self.window.rootViewController = chat;    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值