zoukankan      html  css  js  c++  java
  • IOS 本地推送(UILocalNotification)

    推送通知

    注意:这里说的推送通知NSNotification有所区别
    NSNotification是抽象的,不可见的
    推送通知是可见的(能用肉眼看到)

    iOS中提供了2种推送通知

    • ●  本地推送通知(Local Notification)

    • ●  远程推送通知(Remote Notification)

    推送通知的作用

     推送通知的作用

    可以让不在前台运行的app,告知用户app内部发生了什么事情
    推送通知的呈现效果总结
    总结一下,推送通知有5种不同的呈现效果
    在屏幕顶部显示一块横幅(显示具体内容)
    在屏幕中间弹出一个UIAlertView(显示具体内容)
    在锁屏界面显示一块横幅(锁屏状态下,显示具体内容)
    更新app图标的数字(说明新内容的数量)
    播放音效(提醒作用)
    推送通知的使用细节

     发出推送通知时,如果程序正运行在前台,那么推送通知就不会被呈现出来

    点击推送通知后,默认会自动打开发出推送通知的app
    不管app打开还是关闭,推送通知都能如期发出
    本地推送通知
    什么是本地推送通知
    顾名思义,就是不需要联网就能发出的推送通知(不需要服务器的支持)

     

    本地推送通知的使用场景
    常用来定时提醒用户完成一些任务,比如
    清理垃圾、记账、买衣服、看电影、玩游戏

    如何发出本地推送通知

    创建本地推送通知对象
    UILocalNotification *ln = [[UILocalNotification alloc] init];

    设置本地推送通知属性
    推送通知的触发时间(何时发出推送通知)

    @property(nonatomic,copy) NSDate *fireDate;
    推送通知的具体内容
    @property(nonatomic,copy) NSString *alertBody;
    锁屏界面显示的小标题(完整小标题:滑动来+ alertAction)

    @property(nonatomic,copy) NSString *alertAction;
    音效文件名
    @property(nonatomic,copy) NSString *soundName;
    app图标数字
    @property(nonatomic) NSInteger applicationIconBadgeNumber;

     

    调度本地推送通知(调度完毕后,推送通知会在特地时间fireDate发出)
    [[UIApplication sharedApplication] scheduleLocalNotification:ln];

     

    得被调度的所有本地推送通知(等待发出的通知)

    @property(nonatomic,copy) NSArray *scheduledLocalNotifications;

    (已经发出且过期的推送通知就算调度结束,会自动从这个数组中移除)
    

    取消调度本地推送通知
    - (void)cancelLocalNotification:(UILocalNotification *)notification;

    - (void)cancelAllLocalNotifications;

    立即发出本地推送通知(使用价值:app在后台运行的时候)

    - (void)presentLocalNotificationNow:(UILocalNotification *)notification;

    本地推送通知的其他属性

    每隔多久重复发一次推送通知
    @property(nonatomic) NSCalendarUnit repeatInterval;

    点击推送通知打开app时显示的启动图片

    @property(nonatomic,copy) NSString *alertLaunchImage;

    附加的额外信息
    @property(nonatomic,copy) NSDictionary *userInfo;

    时区
    @property(nonatomic,copy) NSTimeZone *timeZone;

    (一般设置为[NSTimeZone defaultTimeZone] ,跟随手机的时区)

     

    点击本地推送通知

    当用户点击本地推送通知,会自动打开app,这里有2种情况

    app并没有关闭,一直隐藏在后台

    app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)

    - (void)application:(UIApplication *)application
    didReceiveLocalNotification:(UILocalNotification *)notification;
    

    app已经被关闭(进程已死)
    启动app,启动完毕会调用AppDelegate的下面方法

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

    launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey 取出本地推送通知对象

     实例:

    #import "HMAppDelegate.h"
    #import "HMViewController.h"
    
    @interface HMAppDelegate()
    @property (nonatomic, weak) UILabel *label;
    @end
    
    @implementation HMAppDelegate
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        // Override point for customization after application launch.
    //    NSLog(@"------didFinishLaunchingWithOptions---%@");
        
        UILabel *label = [[UILabel alloc] init];
        label.backgroundColor = [UIColor redColor];
        label.frame = CGRectMake(0, 100, 200, 100);
        label.font = [UIFont systemFontOfSize:11];
        label.numberOfLines = 0;
        [[[self.window.rootViewController.childViewControllers firstObject] view] addSubview:label];
        
        UILocalNotification *note = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
        if (note) {
            label.text = @"点击本地通知启动的程序";
            
            HMViewController *homeVc = [self.window.rootViewController.childViewControllers firstObject];
            [homeVc performSegueWithIdentifier:@"home2detail" sender:note];
        } else {
            label.text = @"直接点击app图标启动的程序";
        }
        self.label = label;
        return YES;
    }
    
    /**
     *  当用户点击本地通知进入app的时候调用 、通知发出的时候(app当时并没有被关闭)
     */
    - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
    {
    //    self.label.text = [NSString stringWithFormat:@"点击通知再次回到前台---%d", application.applicationState];
        // 程序正处在前台运行,直接返回
        if (application.applicationState == UIApplicationStateActive) return;
        
        HMViewController *homeVc = [self.window.rootViewController.childViewControllers firstObject];
        [homeVc performSegueWithIdentifier:@"home2detail" sender:notification];
    }
    
    @end
    View Code
    #import "HMViewController.h"
    #import "HMDetailViewController.h"
    
    @interface HMViewController ()
    - (IBAction)schedule;
    - (IBAction)cancel;
    @end
    
    @implementation HMViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    }
    
    - (IBAction)schedule2 {
        // 1.创建本地推送通知对象
        UILocalNotification *ln = [[UILocalNotification alloc] init];
        
        // 2.设置通知属性
        
        // 音效文件名
        ln.soundName = @"buyao.wav";
        
        // 通知的具体内容
        ln.alertBody = @"重大新闻:xxxx xxxx被调查了....";
        
        // 锁屏界面显示的小标题("滑动来" + alertAction)
        ln.alertAction = @"查看新闻吧";
        
        // 设置app图标数字
        ln.applicationIconBadgeNumber = 10;
        
        [[UIApplication sharedApplication] presentLocalNotificationNow:ln];
    }
    
    - (IBAction)schedule {
        // 1.创建本地推送通知对象
        UILocalNotification *ln = [[UILocalNotification alloc] init];
        
        // 2.设置通知属性
        // 音效文件名
        ln.soundName = @"buyao.wav";
        
        // 通知的具体内容
        ln.alertBody = @"重大新闻:xxxx xxxx被调查了....";
        
        // 锁屏界面显示的小标题("滑动来" + alertAction)
        ln.alertAction = @"查看新闻吧";
        
        // 通知第一次发出的时间(5秒后发出)
        ln.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
        // 设置时区(跟随手机的时区)
        ln.timeZone = [NSTimeZone defaultTimeZone];
        
        // 设置app图标数字
        ln.applicationIconBadgeNumber = 5;
        
        // 设置通知的额外信息
        ln.userInfo = @{
                        @"icon" : @"test.png",
                        @"title" : @"重大新闻",
                        @"time" : @"2014-08-14 11:19",
                        @"body" : @"重大新闻:答复后即可更换就肯定会尽快赶快回家的疯狂估计很快将发的"
                        };
        
        // 设置启动图片
        ln.alertLaunchImage = @"Default";
        
        // 设置重复发出通知的时间间隔
    //    ln.repeatInterval = NSCalendarUnitMinute;
        
        // 3.调度通知(启动任务)
        [[UIApplication sharedApplication] scheduleLocalNotification:ln];
    }
    
    - (IBAction)cancel {
        NSArray *notes = [UIApplication sharedApplication].scheduledLocalNotifications;
        NSLog(@"%@", notes);
    //    [[UIApplication sharedApplication] cancelAllLocalNotifications];
    }
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UILocalNotification *)note
    {
        HMDetailViewController *detailVc = segue.destinationViewController;
        detailVc.userInfo = note.userInfo;
    }
    @end
    View Code

     

  • 相关阅读:
    C# 验证IP地址、Email格式、URl网址
    如何创建、安装和调试Windows服务
    C#发送Email邮件方法总结
    C#调用java类、jar包方法。
    未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序
    在已经存在的表上创建索引
    Windows下的.NET+ Memcached安装
    把表从Access2007导出到Sql Server
    FusionCharts参数说明
    Sublime Text 3 之配置package control
  • 原文地址:https://www.cnblogs.com/liuwj/p/6878755.html
Copyright © 2011-2022 走看看