推送

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

2016-03-28  本文已影响600人  袁俊亮技术博客

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


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

标签(空格分隔): IOS


[TOC]

概述

1.推送通知的作用:

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

2. 推送通知的呈现效果

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

具体效果如下

image7.PNG image11.PNG

推送通知的呈现效果设置

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

推送通知的呈现效果设置.png

其他用户权限提醒设置

1. 显示app图标数字
2. 播放音效
3. 锁屏显示
4. 显示在“通知中心”
image16.PNG

其他注意点

本地推送通知(Local Notification)

本地推送通知的使用

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

// 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)

基础知识

远程推送过程

- 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来判断应该把消息推送给哪个用户的哪个应用程序

远程推送的开发必要条件

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

开发流程

- (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;
}
// 注册远程通知成功以后会回调该方法,来返回deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // 将获取到的deviceToken发送给服务器
    NSLog(@"%@",deviceToken);
    
}
// 正常收到远程通知后调用该监听方法
- (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);
}
开启后台远程通知模式.png

激光推送

上一篇 下一篇

猜你喜欢

热点阅读