26 - 推送

iOS中提供了2种推送通知:

  • 本地推送通知(Local Notification)
  • 远程推送通知(Remote Notification)

推送通知的作用

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

推送通知有5种不同的呈现效果

  • 在屏幕顶部显示一块横幅(显示具体内容)
  • 在屏幕中间弹出一个UIAlertView(显示具体内容)
  • 在锁屏界面显示一块横幅(锁屏状态下,显示具体内容)
  • 更新app图标的数字(说明新内容的数量)
  • 播放音效(提醒作用)

本地推送(Local Notification)

什么是本地推送通知

顾名思义,就是不需要联网就能发出的推送通知(不需要服务器的支持)

本地推送通知的使用场景

  • 常用来定时提醒用户完成一些任务;
  • 比如 : 清理垃圾、记账、买衣服、看电影、玩游戏

如何发出本地推送通知

// 创建本地推送通知对象
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
----------------------------------------------
// 设置本地推送通知属性
// 推送通知的触发时间(何时发出推送通知)
@property(nonatomic,copy) NSDate *fireDate;               这2个属性必须设置
// 推送通知的具体内容
@property(nonatomic,copy) NSString *alertBody;
----------------------------------------------
// 调度本地推送通知(调度完毕后,推送通知会在特地时间fireDate发出)
[[UIApplication sharedApplication] scheduleLocalNotification:ln];     

其他属性

// 在锁屏时显示的动作标题(完整标题:“滑动来” + 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;

// 立即发出本地推送通知
- (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] ,跟随手机的时区)

iOS 8.0之后的的变化

  • 在iOS 8.0之后如果要使用本地通知,需要得到用户的许可;
  • 在 didFinishLaunchingWithOptions方法中添加如下代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    // 判断版本号
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) {
        
        UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound |UIUserNotificationTypeAlert categories:nil];
        
        // 注册用户是否需要通知内容
        [application registerUserNotificationSettings:setting];
    }
    
    return YES;
}

以下是一段本地推送的简单代码

- (IBAction)localNote:(id)sender {

    // 创建本地通知对象
    UILocalNotification *localNotification = [[UILocalNotification alloc] init];
    
    localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:3.0];
    
    localNotification.alertBody = @"Hello,i`m notification";
    
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    
}

以下为展示效果

26 - 推送_第1张图片

相信大家都会遇到这样一个需求:

  • 根据点击的通知跳转到不同的页面里面
  • 比如正在用QQ和朋友聊天,但此时微信来了一条信息,那么点击通知后,需要直接跳转到微信的聊天界面,那这个该怎么实现呢?
  • 这时就要去系统的AppDelegate中做点事情了

首先我们先来了解一个AppDelegate中的方法

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
26 - 推送_第2张图片

26 - 推送_第3张图片
  • 从上面我们可以得出结论
  • 这个方法是App在进入前后,或者在前台的时候都会执行的方法
  • 所以我们需要通过这个方法监听到用户点击后,来完成跳转
  • 而且需要判断是否是正在进入前台的时候
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    if (application.applicationState == UIApplicationStateInactive) {
        // 跳转界面代码段
        // 可以根据UserInfo判断跳转到哪个界面
    }
}
  • 还有一种情况就是当用户杀死了App后
  • 就不能在didReceiveLocalNotification这个方法中进行跳转了,因为杀死了程序后,是不会调用这个方法的
  • 这个时候就需要在didFinishLaunchingWithOptions这个方法中跳转
  • 而且在这个方法中要判断是通过点击图标打开的,还是通过点击通知打开的应用程序
26 - 推送_第4张图片
LaunchOptions是一个字典,以下是存放的Key
NSString *const UIApplicationLaunchOptionsURLKey;
NSString *const UIApplicationLaunchOptionsSourceApplicationKey;
NSString *const UIApplicationLaunchOptionsRemoteNotificationKey;
NSString *const UIApplicationLaunchOptionsLocalNotificationKey;  <-可以通过这个key来判断
NSString *const UIApplicationLaunchOptionsAnnotationKey;
NSString *const UIApplicationLaunchOptionsLocationKey;
NSString *const UIApplicationLaunchOptionsNewsstandDownloadsKey;
NSString *const UIApplicationLaunchOptionsBluetoothCentralsKey;
NSString *const UIApplicationLaunchOptionsBluetoothPeripheralsKey;
NSString *const UIApplicationLaunchOptionsShortcutItemKey;
NSString *const UIApplicationLaunchOptionsUserActivityDictionaryKey;
NSString *const UIApplicationLaunchOptionsUserActivityTypeKey;

远程推送(Remote Notification)

什么是远程推送通知

顾名思义,就是从远程服务器推送给客户端的通知(需要联网)
远程推送服务,又称为APNs(Apple Push Notification Services)


为什么需要远程推送通知?

传统获取数据的局限性
只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容
远程推送通知可以解决以上问题
不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知


远程推送使用须知 :

  • 所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接
  • 什么是长连接 : 只要联网了,就一直建立连接
  • 长连接的作用 :
  • 时间校准
  • 系统升级
  • 查找我的iPhone
  • 长连接的好处 :
  • 数据传输速度快
  • 数据保持最新状态
  • 远程通知

26 - 推送_第5张图片

获得deviceToken的过程

26 - 推送_第6张图片

26 - 推送_第7张图片

从获得deviceToken到推送消息给设备的过程

26 - 推送_第8张图片

一.开发iOS程序的推送功能, iOS端需要做的事
1.请求苹果获得deviceToken
2.得到苹果返回的deviceToken
3.发送deviceToken给公司的服务器
4.监听用户对通知的点击

二:做远程通知提前做的操作:

  • 可以真机调试(Device Token)
  • 明确APPID
  • 给APPID配置两个整数
  • 远程推送专门配置一个描述文件

三:代码的实现

  • iOS7 和 iOS8 分别发送请求,请求DeviceToken
  • 获取DeviceToken代理方法
  • 将DeviceToken发送给服务器(或者发送给激光推送)
  • 通过didReceiveRemoteNotifications这个方法监听远程通知的点击
// 判断版本号
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 8.0) { //iOS8
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound categories:nil];
        [application registerUserNotificationSettings:settings];
        [application registerForRemoteNotifications];
    } else { // iOS7
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeNewsstandContentAvailability | UIRemoteNotificationTypeSound |UIRemoteNotificationTypeAlert];
    }
}

// 注册远程通知
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // 将DeviceToken传给服务器
    NSLog(@"%@", deviceToken.description);
}

你可能感兴趣的:(26 - 推送)