zoukankan      html  css  js  c++  java
  • 本地推送通知

    推送通知的作用:

    可以让不在前台运行的app 告知用户app内部发生了什么事情

    推送通知的呈现效果:

    • 1.在屏幕顶部显示一条横幅
    • 2.在屏幕中间弹出一个UIAlertView
    • 3.锁屏状态下也可以呈现

    4.呈现推送通知的同时还可以更新app图标的数字

    5.播放音效

    用户接收的通知 都会展示在通知中心  如何打开通知中心:从屏幕顶部往下滑 就可以打开通知中心

    推送通知的呈现效果设置:

    1.显示横幅还是UIAlerView 取决于用户的设置

    2.用户也可以决定是否要开启以下4个功能:

    • 是否显示app图标数字
    • 播放音效
    • 锁屏显示
    • 是否显示在通知中心

    推送通知的使用细节:

    1. 发送推送通知时 如果程序正运行在前台 那么推送通知就不会被呈现出来
    2. 点击推送通知后 默认会自动打开发出推送通知的app
    3. 不管app打开还是关闭 推送通知照样能正常发出

    本地推送通知

    本地推送通知: 不需要联网就能发出的推送通知 不需要服务器的支持

    本地推送通知的使用场景: 常用来提醒用户完成一些任务 (如:买衣服,玩游戏 app软件的提醒用户)

    如何发出本地通知代码如下:

    以下代码适用于IOS7:

      //1.创建本地通知对象
        UILocalNotification *notification = [[UILocalNotification alloc] init];
        
    //    NSDate *currentDate   = [NSDate date];
    //    notification.timeZone = [NSTimeZone defaultTimeZone]; // 使用本地时区
    //    notification.fireDate = [currentDate dateByAddingTimeInterval:5.0];
        
        //2.设置通知属性
    //    local.soundName = @"1.wav"; //播放音效 这个只有在真机上面才会有效
        notification.alertBody = @"客官,你好久没来了,进来看看,可好?";  //中间显示的内容
        
        //3.通知第一次发出的时间
        notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
        
        //4.启动通知
        [[UIApplication sharedApplication] scheduleLocalNotification:notification];

    在IOS8中请在AppDelegate的:-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中加入如下代码即可:

        if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){
            [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
        }
        else {
            [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge];
        }

    如何判断用户是点击app图标启动程序 还是点击本地通知  启动程序

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

    1. app并没有被关闭 一直隐藏在后台
    • 让app进入前台会调用AppDelegate的下面的方法(并非重新启动)
    /**
     *  当用户点击本地通知进入App的时候调用(注意这个时候app并没有被关闭)
     */
    - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification

       2.app已经被关闭 (进程已经死了)

    •   启动app,启动完毕会调用AppDelegate下面的方法
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

     代码如下:

    appDelegate里面的代码:
    
    
    #import "ViewController.h"
    #import "AppDelegate.h"
    
    @interface AppDelegate ()
    /**label**/
    @property(nonatomic,weak)UILabel *label;
    
    @end
    
    @implementation AppDelegate
    
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
        if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){
            [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound categories:nil]];
        }
        else {
            [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge];
        }
        
        //创建label
        UILabel *label = [[UILabel alloc] init];
        label.backgroundColor = [UIColor redColor];
        label.frame = CGRectMake(0, 100, 100, 100);
        label.font = [UIFont systemFontOfSize:11];
        label.numberOfLines = 0;
        
        //拿到当前主窗口的view
        [[[self.window.rootViewController.childViewControllers firstObject] view] addSubview:label];
    
        //添加到窗口的跟控制器上面
    //    [self.window.rootViewController.view addSubview:label];
        
        //判断用户是点击本地通知启动的程序 还是直接点击app图标启动的程序
        UILocalNotification *note = launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];
        
        if (note) { //如果这个key有值  说明用户是点击本地通知启动的程序
            label.text =@"点击本地通知启动的程序";
            
            //拿到目标控制器
            ViewController *vc = [self.window.rootViewController.childViewControllers firstObject];
            //跳转到目标控制器
            [vc performSegueWithIdentifier:@"home2detail" sender:note];
            
            
        }else{ //用户直接点击app图标启动的程序
            label.text = @"点击app图标启动的程序";
        }
        self.label = label;
        
        return YES;
    }
    
    /**
     *  当用户点击本地通知进入App的时候调用以及通知发出的时候也会调用这个方法(注意这个时候app并没有被关闭)
     */
    - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
    {
        self.label.text = @"点击通知再次回到前台";
        
        //判断应用程序的状态  如果是前台 直接退出  不跳转
        if (application.applicationState == UIApplicationStateActive)  return;
        
        // 如果应用程序在后台的时候才需要跳转
        
        //拿到目标控制器
        ViewController *vc = [self.window.rootViewController.childViewControllers firstObject];
        //跳转到目标控制器
        [vc performSegueWithIdentifier:@"home2detail" sender:notification];
        
    }
    
    @end
    模拟发送通知界面的代码
    
    
    #import "ViewController.h"
    #import "DetailViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
    }
    - (IBAction)send {
        
        //1.创建本地通知对象
        UILocalNotification *notification = [[UILocalNotification alloc] init];
        
        //2.设置通知属性
       //local.soundName = @"1.wav"; //播放音效 这个只有在真机上面才会有效
        notification.alertBody = @"客官,你好久没来了,进来看看,可好?";  //中间显示的内容
        notification.applicationIconBadgeNumber = 15; //设置app图标数字
        notification.alertAction =@"查看一下吧!"; //设置锁屏界面 最底部的小文字 (滑动来+ alertAction)
        
        //设置通知的额外信息
        notification.userInfo =  @{
                                @"title" : @"重大新闻",
                                @"time": @"2014-08-31",
                                @"content":@"这里真的很好 你可以多玩玩啊"
                                };
        
        //设置启动图片
        notification.alertLaunchImage = @"Default";
        
        //试着重复发出通知的时间间隔
    //    notification.repeatInterval = NSCalendarUnitMinute;
        
        //设置时区 为当前手机设置的时区
        notification.timeZone = [NSTimeZone defaultTimeZone];
        
        //3.通知第一次发出的时间
        notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];
        
        //4.启动通知 在规定的时间发出调度通知
        [[UIApplication sharedApplication] scheduleLocalNotification:notification];
        
        //直接发出通知
    //    [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
        
    }
    - (IBAction)cancle {
        
        //获得所有等待被发出(启动)的通知
        NSArray *notes = [UIApplication sharedApplication].scheduledLocalNotifications;
        NSLog(@"%@",notes);
        
        //取消所有通知
        [[UIApplication sharedApplication] cancelAllLocalNotifications];
    }
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UILocalNotification*)sender
    {
        
        //拿到目标控制器
        DetailViewController *desVc = segue.destinationViewController;
        desVc.content = sender.userInfo;
       
    }
    
    @end
    通知内容详情页代码:
    
    .h文件代码:
    #import <UIKit/UIKit.h>
    
    @interface DetailViewController : UIViewController
    
    /**通知内容**/
    @property(nonatomic,strong)NSDictionary *content;
    
    @end
    
    
    .m文件代码
    
    #import "DetailViewController.h"
    
    @interface DetailViewController ()
    @property (weak, nonatomic) IBOutlet UILabel *detailLabel;
    
    @end
    
    @implementation DetailViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        self.detailLabel.text = self.content[@"content"];
    }
    
    @end

      

  • 相关阅读:
    hdu 5146 Sequence
    hdu 1232 畅通工程
    hdu 1213 How Many Tables
    hdu 2822 Dogs
    hdu 1242 Rescue
    hdu 5101 Select
    hdu 1873 看病要排队
    hdu 5112 A Curious Matt
    hdu 5154 Harry and Magical Computer
    hdu 1548 A strange lift
  • 原文地址:https://www.cnblogs.com/syios/p/4774217.html
Copyright © 2011-2022 走看看