本地推送通知

推送通知的作用:

可以让不在前台运行的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

  

原文地址:https://www.cnblogs.com/syios/p/4774217.html