• IOS 远程推送通知(UIRemoteNotification)


    ●  什么是远程推送通知

     ●  顾名思义,就是从远程服务器推送客户端的通知(需要联网)

    ●  远程推送服务,又称为APNs(Apple Push Notification Services)

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

    ●  传统获取数据的局限性

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

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

    远程推送通知使用须知

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

    什么是长连接
    只要联网了,就一直建立连接

     

    长连接的作用
    时间校准
    系统升级
    查找我的iPhone .....

    长连接的好处
    数据传输速度快
    数据保持最新状态

     

     

    远程推送流程

    获得DeviceToken的流程

    1.准备一堆证书(在哪台电脑上用哪台设备调试哪个应用)

    >1. CertificateSigningRequest.certSigningRequest:存储着电脑的信息

    >2. ios_development.cer :让电脑具备真机调试的功能

    >3. 利用设备UDID标识在Devices一栏中注册设备

     >4. 创建App ID(应用的唯一标识,Bundle Identifier)

     

    >5. 电脑调试证书 + 设备的UDID + App ID == 描述文件(mobileprovision)

     

    >6. 安装证书: ios_development.cer:电脑能真机调试

                         apple_mj_iphone5_heima_qq.mobileprovision
    能做的事情:
    能在某条电脑上利用某条设备调试某个应用


    >7.
    让某个应用增加推送功能(用到App ID + certSigningRequest)

    >8.
    App ID + certSigningRequest == aps_development.cer
    App ID + certSigningRequest == aps_production.cer
    最终会产生5个文件
    CertificateSigningRequest.certSigningRequest:描述电脑信息
    ios_development.cer:电脑调试证书(让电脑具备真机调试功能)
    apple_mj_iphone5_heima_qq.mobileprovision:描述文件

     

    (在哪台电脑上利用哪台设备调试哪个应用)、

    aps_development.cer:推送调试证书(在哪台电脑调试哪个应用的推送服务)

    aps_production.cer:推送发布证书

     

     配置应用的Bundle Identifier

    证书配置01 – 创建App ID

    ●  注意

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

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

    ●  目的是说明哪个App需要使用推送服务

    ●  为远程推送服务创建的App ID一定要是全称,不能带有*

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

    真机调试用的APNs SSL证书:要在哪台电脑上调试具有推送服务的App

     

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

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

    证书配置04 – 安装

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

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

     

    注册远程推送通知

    客户端如果想接收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);
     } 

    接收远程推送通知

    当设备接收到远程推送通知时
    如果程序是处于关闭状态,系统会在给用户展示远程推送通知的同时,将程序启动
    到后台,并调用AppDelegate的下面方法

     - (void)application:(UIApplication *)application

    didReceiveRemoteNotification:(NSDictionary *)userInfo
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
    

    可以在这个方法中做些数据下载操作,争取在用户点击通知前,就将数据下载完毕

    下载完毕要调用completionHandler这个block,告知下载完毕

    completionHandler(UIBackgroundFetchResultNewData);
    

     

    点击远程推送通知

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

    app并没有关闭,一直隐藏在后台

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

    - (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(UILocalNotification *)notification;
    

    app已经被关闭(进程已死)
    启动app,启动完毕会调用AppDelegate的下面方法

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

    launchOptions参数通过UIApplicationLaunchOptionsRemoteNotificationKey 取出远程推送通知对象

     

     

    实例:
    #import "HMAppDelegate.h"
    
    @implementation HMAppDelegate
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        // 注册远程通知服务(第一次注册服务的时候会弹出提醒框,让用户授权)
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
        
        
        
        UILabel *label = [[UILabel alloc] init];
        label.backgroundColor = [UIColor lightGrayColor];
        label.frame = CGRectMake(0, 100, 320, 300);
        label.font = [UIFont systemFontOfSize:15];
        label.numberOfLines = 0;
        [self.window.rootViewController.view addSubview:label];
        
        NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
        if (userInfo) {
            label.text = [userInfo description];
        } else {
            label.text = @"直接点击app图标启动的程序";
        }
        return YES;
    }
    
    /**
     *  获得了设备想DeviceToken
     */
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    {
        NSLog(@"注册远程通知成功----%@", deviceToken);
        /**
         1.将deviceToken发送给公司的服务器
        c330833f 248c4fed e87068b6 c4b90ee8 a2b57119 aac2b93d 3f2eb27f e7d44c8c
        c330833f 248c4fed e87068b6 c4b90ee8 a2b57119 aac2b93d 3f2eb27f e7d44c8c
         */
        
        /**
         2.
         */
    }
    
    /**
     *  接收到远程推送通知时就会调用
     */
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    {
        NSLog(@"接收到远程通知--%@", userInfo[@"userInfo"]);
    }
    @end
    View Code

  • 相关阅读:
    三道趣味题目
    iOS开发中使用静态库 .a 文件
    java Graphics2D 画图
    堆和栈的区别
    iOS开发中KVC、KVO简介
    GPUImage的简单使用
    OC中 self.view.frame.size.height = 100; 不能通过编译的原因
    Xcode7 低版本iOS系统上下有黑边的问题
    c语言数组赋值
    ELF interpreter /libexec/ld-elf32.so.1 not found
  • 原文地址:https://www.cnblogs.com/liuwj/p/6878797.html
Copyright © 2020-2023  润新知