本地推送通知、远程推送通知、激光推送


title : 本地推送通知、远程推送通知、激光推送
category : UI


本地推送通知、远程推送通知、激光推送

标签(空格分隔): IOS


[TOC]

概述

1.推送通知的作用:

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

2. 推送通知的呈现效果

1. 在屏幕顶部显示一块横幅(显示具体内容)
2. 在屏幕中间弹出一个UIAlertView(显示具体内容)
3. 在锁屏界面显示一块横幅(锁屏状态下,显示具体内容)
4. 呈现推送通知的同时,更新app图标的提醒数字(说明新内容的数量)
5. 播放音效(提醒作用)

具体效果如下

    1. 如图1-1 在屏幕顶部显示一块横幅
本地推送通知、远程推送通知、激光推送_第1张图片
image7.PNG
    1. 在屏幕中间弹出一个UIAlertView


      本地推送通知、远程推送通知、激光推送_第2张图片
      image8.PNG
  • 3.在锁屏时也可以照样呈现


    本地推送通知、远程推送通知、激光推送_第3张图片
    image9.PNG
  • 4.呈现推送通知的同时,还可以更新app图标的数字


    本地推送通知、远程推送通知、激光推送_第4张图片
    image10.PNG
  • 5.用户接收的推送通知,都会展示在“通知中心”,从屏幕顶部往下滑就能调出“通知中心”

本地推送通知、远程推送通知、激光推送_第5张图片
image11.PNG

推送通知的呈现效果设置

设置横幅显示还是UIAlertView具体显示效果是横幅还是UIAlertView取决于用户的设置,而不是程序的设置。设置方法为

本地推送通知、远程推送通知、激光推送_第6张图片
推送通知的呈现效果设置.png

其他用户权限提醒设置

1. 显示app图标数字
2. 播放音效
3. 锁屏显示
4. 显示在“通知中心”
本地推送通知、远程推送通知、激光推送_第7张图片
image16.PNG

其他注意点

  • 发出推送通知是,如果当前程序正在运行,那么推送通知就不会被呈现出来
  • 点击推送通知后,默认会自动打开发出推送通知的app
  • 即使app被完全退出,推送通知都能如期发出

本地推送通知(Local Notification)

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

本地推送通知的使用

创建并发出本地通知的流程

  • 两个必填参数fireDatealertBody
// 1.创建本地推送通知对象
UILocalNotification *localNote = [[UILocalNotification alloc] init];

// 2.设置本地推送通知内容(下面两个是必填参数)
// 2.1设置通知发出时间(触发后5秒钟后发出通知)
localNote.fireDate = [NSDate dateWithTimeIntervalSinceNow:5.0];
// 2.2 设置通知的内容
localNote.alertBody = @"吃饭了吗";

// 3.调用通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNote];

注意:在IOS8以后必须先注册本地通知用户设置

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 在IOS8中必须注册本地通知
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
        
        [application registerUserNotificationSettings:settings];
    }
    return YES;
}

本地通知的其他常用属性

// 设置有通知的提醒声音
// 这个是设置系统默认声音
localNote.soundName = UILocalNotificationDefaultSoundName;
// 这个是设置自定义声音
localNote.soundName = @"yaobuqi.wav";

// 通过点击通知进入应用的时候是否显示启动图标(注意:这里的启动图片名称随便写)
localNote.alertLaunchImage = @"这里随便写";

// 更改应用程序图标右上角的数字
localNote.applicationIconBadgeNumber = 998;

// 设置一些额外的通知数据
localNote.userInfo;

// 重复间隔(枚举类型)
localNote.repeatInterval;
// 重复间隔(可自定义设置)
localNote.repeatCalendar;

// 区域(用于定位功能:进入某个区域以后进行通知提醒)
localNote.region;
// 在这个区域的提醒次数(和上面的属性配合使用,如果设置为YES,就是进入这个区域永远只触发一次)
localNote.regionTriggersOnce;

// 设置锁屏状态下滑块的文字
localNote.alertAction;
// 决定上面的alertAction是否生效
localNote.hasAction;

// 设置通知中心的标题
localNote.alertTitle;

// 时区,如果不设置会以默认语言为默认时区
localNote.timeZone;

消除掉图标右上角提醒数字

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [application setApplicationIconBadgeNumber:0];
    return YES;
}

监听本地通知

需求:点击收到的通知后,跳转到指定的页面。应该分别在两个方法中设置

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

    if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]) {
        // 进入该方法说明是应用程序被杀死的情况下通过点击本地通知进入的该方法
        // 如果应用程序没有被杀死,通过点击本地通知只会进入didReceiveLocalNotification方法
    }
    return YES;
}

/**
 *  收到本地通知后,并且应用程序在前台或进入前台时才调用本方法
 *  如果应用程序被杀死了以后,再通过点击通知进入前台的时候也不会调用该方法。这种情况下应该在didFinishLaunchingWithOptions方法中设置点击通知后的操作
 */
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    if (application.applicationState == UIApplicationStateInactive) {
        // 当应用程序进入前台的时候执行
        // 如果需要判断跳转到哪个页面,可以根据notification的userInfo传递过来的值来判断
        // 调试小技巧:如果想看应用程序退出后再进入前台是否执行了该方法,由于,退出应用程序后XCode就不再处于调试状态,所以不能通过打印来判断是否执行了该方法。但是可以通过给一个View添加一个控件来判断是否执行了该方法
    }
}

远程推送通知(Remote Notification)

基础知识

  • 远程服务器推送给客户端的通知
  • 远程推送服务,有称为APNs(Apple Push Notification Services)
  • 不管用户是打开还是关闭app,只要联网了,都能接收到服务器推送的远程服务
  • 所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接
    • 长连接:就是始终保存连接
      • 好处:服务器和客户端都可以给对方发送消息
      • 坏处:需要始终和服务器保存连接(高并发),比较消耗服务器资源
      • 作用:时间校准,系统和应用升级消息查找我的iphone,远程推送
    • 短连接
      • 好处:发送完消息以后就断开,可以节省服务器资源
      • 坏处:服务器不能主动向客户端发送消息

远程推送过程

- 1.获取用户A的`设备的UDID`(设备的唯一标识)和`应用的Bundle Identifier`(应用的唯一标识)发给APNs服务器
- 2.经过苹果加密生成一个deviceToken
- 3.发送用户A的deviceToken和用户的基本信息给QQ的服务器
- 4.QQ服务器接收到用户A的信息后存进数据库
- 5.当用户B发送消息给用户A时
    - 用户B先发送消息给QQ服务器
    - QQ服务器先查看用户A的app是否在前台
        - 如果在前台,直接发送消息给用户A
        - 如果没有在前台,QQ服务器会去数据库中查到用户A的deviceToken并把用户A的各种消息参数和deviceToken发送给APNs服务器
    - APNs服务器根据deviceToken来判断应该把消息推送给哪个用户的哪个应用程序

远程推送的开发必要条件

  • 1.开发远程推送通知需要做的操作步骤
    • 1.请求苹果获得deviceToken
    • 2.得到苹果返回的deviceToken
    • 3.发送deviceToken给公司的服务器
    • 4.监听用户对通知的点击
  • 2.调试IOS的远程推送功能,必备条件
    • 1.必须要有真机(因为需要获取deviceToken)
    • 2.调试推送通知需要的证书文件
      • xxx_devilopment.cer(测试证书):某台电脑就能调试某个app的推送服务
      • xxx.mobileprovision(描述文件):某台电脑就能利用某台设备调试某个程序
    • 3.发布具有推送服务的app
      • xxx_production.cer(证书):如果发布的程序中包含了推送服务,就必须安装这个证书
      • xxx.mobileprovision(描述文件):某台电脑就能发布某个程序

配置证书和描述文件的流程

开发流程

  • 1.注册远程通知,请求苹果获得deviceToken
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
        // IOS8.0的注册远程通知
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
        [application registerUserNotificationSettings:settings];
        [application registerForRemoteNotifications];
    }else{
        // IOS7.0的注册远程通知
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeSound];
    }
    return YES;
}
  • 2.获取deviceToken,并发送deviceToken给公司服务器
// 注册远程通知成功以后会回调该方法,来返回deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // 将获取到的deviceToken发送给服务器
    NSLog(@"%@",deviceToken);
    
}
  • 3.监听到远程通知后的操作
// 正常收到远程通知后调用该监听方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"%@",userInfo);
}

// 同时需要在该方法中也进行操作
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 在杀死应用程序的前提下通过点击推送通知进入应用前台会来到这个方法。在这里做一些操作(比如应用间的跳转)
    if (launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]) {
        // 进行应用间的跳转
    }
    return YES;
}

注意应用程序后台监听到远程推送通知时后台会自动调用的方法

// 当收到远程通知的时候在后台会自动调用该方法
// 即使用户不点击通知,也会自动执行该方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    // 告诉系统有新内容的更新
    completionHandler(UIBackgroundFetchResultNewData);
}
  • 该方法使用步骤:

    • 1.打开后台远程推送模式
    • 2.告诉系统是否有新内容的更新
    • 3.发送的通知有固定的格式
      • 必须包含 "content-avaliable":"这里随便写个字符串"
  • 打开后台模式

本地推送通知、远程推送通知、激光推送_第8张图片
开启后台远程通知模式.png
  • 服务器模拟软件:PushMeBaby
    • 使用方法:将测试证书改名为apns.cer并拖入该程序。运行即可

激光推送

你可能感兴趣的:(本地推送通知、远程推送通知、激光推送)