推送

推送通知

注意:这里说的推送通知跟NSNotification有所区别

  • NSNotification是抽象的,不可见的
  • 推送通知是可见的(能用肉眼看到)

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

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

推送通知的作用

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

推送通知的呈现效果

推送通知的呈现效果

推送通知的呈现效果推送通知的呈现效果-2

推送通知的呈现效果-3

推送通知的呈现效果总结

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

推送通知的呈现效果设置

推送通知的呈现效果设置

推送通知的呈现效果设置-2

推送通知的使用细节

  • 发出推送通知时,如果程序正运行在前台,那么推送通知就不会被呈现出来

  • 点击推送通知后,默认会自动打开发出推送通知的app

  • 不管app打开还是关闭,推送通知都能如期发出

本地推送通知

  • 什么是本地推送通知

    顾名思义,就是不需要联网就能发出的推送通知(不需要服务器的支持)
    
  • 本地推送通知的使用场景

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

如何发出本地推送通知

  • 创建本地推送通知对象

    UILocalNotification *ln = [[UILocalNotification alloc] init];
    
  • 设置本地推送通知属性

    • 推送通知的触发时间(何时发出推送通知)
      @property(nonatomic,copy) NSDate *fireDate;
      
    • 推送通知的具体内容
      @property(nonatomic,copy) NSString *alertBody;
      
    • 锁屏界面显示的小标题(完整小标题:“滑动来” + 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;
    
  • 立即发出本地推送通知(使用价值:app在后台运行的时候)

    -(void)presentLocalNotificationNow:(UILocalNotification *)notification;
    

iOS8之后本地通知有所改动

n iOS 8.0 and later, your application must register for user notifications using -[UIApplication registerUserNotificationSettings:] before being able to schedule and present UILocalNotifications

 // 1.创建本地推送通知
    UILocalNotification * ln = [[UILocalNotification alloc] init];

    UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
    UIUserNotificationSettings *mySettings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
    // 2.设置通知属性
    ln.alertTitle = @"孩子,你摊上大事了";
    ln.alertBody = @"老司机快停车:绝地武士原力觉醒了";
    // 通知第一次发出的时间
    ln.fireDate = [NSDate dateWithTimeIntervalSinceNow:5];

    // 3.调度通知(启动任务)
    [[UIApplication sharedApplication] scheduleLocalNotification:ln];

本地推送通知的其他属性

  • 每隔多久重复发一次推送通知

    @property(nonatomic) NSCalendarUnit repeatInterval;
    
  • 点击推送通知打开app时显示的启动图片

    @property(nonatomic,copy) NSString *alertLaunchImage;
    
  • 附加的额外信息

    @property(nonatomic,copy) NSDictionary *userInfo;
    
  • 时区

    @property(nonatomic,copy) NSTimeZone *timeZone;
    (一般设置为[NSTimeZone defaultTimeZone] ,跟随手机的时区)
    

点击本地推送通知

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

    1. app并没有关闭,一直隐藏在后台
      • 让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)
        -(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification;
        
    2. app已经被关闭(进程已死)
      • 启动app,启动完毕会调用AppDelegate的下面方法
        -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
        launchOptions参数通过UIApplicationLaunchOptionsLocalNotificationKey取出本地推送通知对象
        

远程推送通知

  • 什么是远程推送通知

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

    传统获取数据的局限性
    只要用户关闭了app,就无法跟app的服务器沟通,无法从服务器上获得最新的数据内容
    

远程推送通知可以解决以上问题 不管用户打开还是关闭app,只要联网了,都能接收到服务器推送的远程通知

远程推送通知使用须知

  • 所有的苹果设备,在联网状态下,都会与苹果的服务器建立长连接

  • 长连接的作用

    1. 时间校准
    2. 系统升级
    3. 查找我的iPhone
    4. .. ...
  • 长连接的好处

    1. 数据传输速度快
    2. 数据保持最新状态

DeviceToken处理流程

  1. 流程1 DeviceToken处理流程
  2. 流程2 DeviceToken处理流程-2

远程推送流程

远程推送流程

远程推送通知的流程

远程推送通知的流程

获得DeviceToken的流程

  1. 流程1 获得DeviceToken的流程
  2. 流程2 获得DeviceToken的流程-2
  3. 流程3 获得DeviceToken的流程-3
  4. 流程4 获得DeviceToken的流程-4
  5. 流程5 获得DeviceToken的流程-5
  6. 流程6 获得DeviceToken的流程-6
  7. 流程7 获得DeviceToken的流程-7
  8. 流程8 获得DeviceToken的流程-8

证书配置01 – 创建App ID

注意

远程推送只能在真机上测试!因此先要保证真机调试的环境没有问题

  • 远程推送的第一步是要创建App ID

    目的是说明哪个App需要使用推送服务
    为远程推送服务创建的App ID一定要是全称,不能带有*
    

    证书配置01 – 创建App ID

证书配置02 – 为App ID创建APNs SSL证书

真机调试用的APNs SSL证书:要在哪台电脑上调试具有推送服务的App 证书配置02 – 为App ID创建APNs SSL证书 发布程序用的APNs SSL证书:要在哪台电脑上发布具有推送服务的App 证书配置02 – 为App ID创建APNs SSL证书-2

  • 最终得到2个APNs SSL证书
    1. APNs Development iOS:真机调试用的证书
    2. APNs Production iOS:发布程序用的证书

证书配置02 – 为App ID创建APNs SSL证书-3

证书配置03 – 生成描述文件

  • 描述文件的作用是用来描述哪台设备要在哪台电脑上调试哪个程序

证书配置03 – 生成描述文件

证书配置04 – 安装

  • 最终会得到3个文件
    1. aps_development.cer:真机调试用的
    2. aps_production.cer:发布程序用的
    3. netease_news_iphone5_home.mobileprovision:描述文件

建议:先安装cer文件,再安装mobileprovision文件

证书配置04 – 安装

注册远程推送通知

  • 客户端如果想接收APNs的远程推送通知,必须先注册(得到用户的授权)

    • 一般在App启动完毕后就马上注册
      -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      {
      // 注册远程通知
         UIRemoteNotificationType type = UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound;
      [application registerForRemoteNotificationTypes:type];
      return YES;
      }
      // 如果是第一次注册,会弹出一个请求允许框
      
  • 注册成功后会调用AppDelegate的下面方法,得到设备的deviceToken

    -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
      NSLog(@"%@", deviceToken);
    }
    

接收远程推送通知

  • 当设备接收到远程推送通知时
    1. 如果程序是处于关闭状态,系统会在给用户展示远程推送通知的同时,将程序启动到后台,并调用AppDelegate的下面方法
      -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
      // 可以在这个方法中做些数据下载操作,争取在用户点击通知前,就将数据下载完毕
      // 下载完毕要调用completionHandler这个block,告知下载完毕
      completionHandler(UIBackgroundFetchResultNewData);
      

点击远程推送通知

  • 当用户点击远程推送通知,会自动打开app,这里有2种情况
    1. app并没有关闭,一直隐藏在后台

      让app进入前台,并会调用AppDelegate的下面方法(并非重新启动app)

      -(void)application:(UIApplication *)application didReceiveRemoteNotification:(UILocalNotification *)notification;
      
    2. app已经被关闭(进程已死)

      启动app,启动完毕会调用AppDelegate的下面方法

      -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;
      launchOptions参数通过UIApplicationLaunchOptionsRemoteNotificationKey取出远程推送通知对象
      

官方文档

有关推送通知的更多知识,可以参考苹果官方文档

官方文档

远程推送的内容格式(服务器推送给客户端的内容格式---JSON)

官方文档-2

推送配置APNs

推送-1

推送-2

推送-3

推送-4

推送-5

推送-6

推送-7

推送-8

推送-9

推送-10

推送-11

推送-12

推送-13

推送-14

推送-15

推送-16

推送-17

推送-18

推送-19

推送-20

推送-21

推送-22

推送-23

推送-24

推送-25

#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 1.注册远程通知
    UIUserNotificationType type = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
    UIUserNotificationSettings * setting = [UIUserNotificationSettings settingsForTypes:type categories:nil];
    [application registerUserNotificationSettings:setting];

    return YES;
}

/**
 *  注册通知之后会回调这个方法,跟网速有关:获得设备的DeviceToken
 */
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {

    NSLog(@"注册远程通知成功:%@",deviceToken);

    /**
     *  将deviceToken发送到公司的服务器
     */
}

// 这样是可以获取deviceToken,但是你需要每次都要获取之后发送给服务器。
@end

PushMeBaby

  • PushMeBaby是一款用来测试ANPs的开源Mac项目
    • 它充当了服务器的作用,用法非常简单
    • 它负责将内容提交给苹果的APNs服务器,苹果的APNs服务器再将内容推送给用户的设备
    • PushMeBaby主页

PushMeBaby

PushMeBaby的使用步骤

  • 注释掉不要的错误 PushMeBaby的使用步骤-1
  • 填写必要信息

      deviceToken:用于找到设备的令牌
      payload:推送的内容
    

PushMeBaby的使用步骤-2

  • 将真机调试的推送证书改为名apns.cer,添加到PushMeBaby项目中

PushMeBaby的使用步骤-3

  • command + R启动程序,然后点击Push

    接下来就可以在设备上接收到远程推送通知

PushMeBaby的使用步骤-4

JPush

  • JPush:https://www.jpush.cn
  • iOS SDK继承步骤:http://docs.jpush.cn/pages/viewpage.action?pageId=2621727

  • 什么是JPush

    一套远程推送解决方案,支持android和iOS两个平台
    它能够快捷地为iOS App增加推送功能,减少集成APNs需要的工作量、开发复杂度
    更多的信息,可以参考JPush官方网站:[https://www.jpush.cn](https://www.jpush.cn)
    集成iOS SDK的步骤可以参考:[http://docs.jpush.cn/pages/viewpage.action?pageId=2621727](http://docs.jpush.cn/pages/viewpage.action?pageId=2621727)
    

JPush的集成步骤

  • 注册帐号,创建应用

JPush的集成步骤-1

  • 填写iOS App的必要信息

JPush的集成步骤-2

  • iOS开发证书和iOS生产证书必须是p12格式的交换证书

JPush的集成步骤-3

利用JPush发送通知

  • JPush会自动记录和管理所有安装过此app的设备deviceToken

  • 利用JPush,可以轻易地给所有设备发送远程推送通知

利用JPush发送通知

results matching ""

    No results matching ""