zoukankan      html  css  js  c++  java
  • (九十六)借助APNS实现远程通知、后台任务

    APNS全称为Apple Push Notification Service,可以实现在app不启动时也能通过服务器推送到iOS端特定设备的功能。

    APNS的实现原理为先发送设备的UDID和应用的Bundle Identifier到APNS服务器,APNS加密后生成一个deviceToken,这个deviceToken是给特定UDID的设备(必须安装了相应的应用)发送推送消息的依据。要发送通知,只需要按照特定格式向APNS发送deviceToken和通知内容。

    要实现远程通知,必须成为开发者,然后配置远程调试证书,最后获取deviceToken,进行调试。

    下面从配置证书开始,一步一步介绍APNS的使用步骤。

    【远程调试证书的配置】

    登陆Member Center,选择Certificates,Identifiers & Profiles这一项,再点击Certificates文件夹进入证书配置。

    ①首先要配置App IDs,APNS禁止使用模糊的App ID,因此必须为应用指定一个明确的ID用于通知。

    点击App IDs,然后点击右侧的+进入证书创建,填写Name、Bundle ID(不要使用通配符,要明确),注意最后选择Push Notifications。

    然后Continue一步步完成创建。


    ②配置远程调试证书,点击左侧Certificates中的All,然后点击右侧的+,开始创建,注意有两个选项:

    现在选中的这一项是调试证书,下面的那个是发布证书,调试时只配置第一个即可,发布时只需要再重新配置一个发布证书即可完成。

    配置证书需要选择一个SCR文件,这个文件来自电脑,创建方法如下。

    打开Application,选择Keychain Access,然后在顶部菜单栏按下图选择:

    在弹出的对话框中随意填写即可,注意保存方式选择Saved To Disk即可保存到电脑中。

    然后选择这个SCR,即可创建出远程调试证书,下载安装即可。

    注意:在有配置更改时,需要重新生成一下Profiles,点击Provisioning Profiles下面的All,点击右侧的+,一步步的选择App ID、开发者、设备等之后,就可以生成,下载后双击会跳转到Xcode,这就代表安装成功

    经过这些步骤就完成了证书的配置。


    【deviceToken的获取】

    因为只有真机才有UDID,因此无法用模拟器得到deviceToken,苹果在iOS8以后更改了获取方法,还需要主动请求授权,代码如下。

    if ([[UIDevice currentDevice].systemVersion doubleValue] < 8.0) {
        [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge];
    }else{
        [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil]]; // categories用户在通知中心回复消息等。
        // 主动要求授权
        [application registerForRemoteNotifications];
    }

    接收deviceToken有两个方法,一个用于接收token,一个用于接收error。

    // 获取到用户当前的deviceToken时调用
    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
        
        NSLog(@"%@",deviceToken);
        
    }
    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
        
        NSLog(@"%@",error);
        
    }
    如果配置没问题,则在设备上允许之后就能打印出deviceToken,一般用法是把token保存到服务器的数据库中以便发送通知。


    【发送通知】

    要发送通知,比较复杂,为了调试可以下载pushMeBaby,可以模拟推送服务器发送消息。

    因为工程较老,因此编译会报错,只需要把报错的那句注视掉就可以使用了。

    发送通知需要deviceToken和cer文件,cer就是刚才配的调试证书,把它添加到工程中,注意勾选Add Target,注意文件名应该和init方法中的相同,改为apns.cer。

    self.certificate = [[NSBundle mainBundle] pathForResource:@"apns" ofType:@"cer"];

    修改init中的deviceToken为刚才打印的,注意是<>内的部分,不要包含<和>。

    启动软件,界面如下:

    点击Push即可发送。


    【接收通知】

    在iOS8之前,是不支持真后台的,所谓真后台是指的应用程序在后台也能处理UI操作。

    下面先介绍iOS8之前的通知。

    ①App启动,在后台,如果点击了Push,会显示一条通知,如果点击这条通知,会打开App,并且调用下面的方法:

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
    
        // userInfo就是发送的JSON数据体。
        
    }
    ②App启动,在前台,不会现实通知,但是仍然会调用上面的方法。

    ③App关闭,如果点击了Push,会显示一条通知,点击通知会启动App,不会调用上面的方法,但是可以从didFinishLaunchingWithOptions:方法的launchOptions的UIApplicationLaunchOptionsRemoteNotificationKey键的值是个字典,里面存着的也是JSON数据体。

    【后台任务】

    从iOS8开始,可以在后台更新UI,要使用这个功能,要打开开关,并且Push的内容也有改变。

    ①首先按照下图打开Background Modes开关,勾选remote notifications。

    ②接收到远程通知时,如果App在运行,会调用下面的方法:

    // 接收到远程通知就会调用, iOS8使用这个来处理后台消息(非通知)
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
        
        completionHandler(UIBackgroundFetchResultNewData); // 必须要回调,告诉系统是否成功,以便系统在成功时才处理UI。
        
    }
    注意回调通知系统是否处理成功,以便系统更新UI,无论是前台还是后台,均可以在这里更新UI。

  • 相关阅读:
    Debian 9 卸载图形界面命令
    Spring Boot 整合 swagger2 自动生成 RESTFul API 文档
    SAP 官网中文帮助文件&BP中文资料汇总
    CO配置步骤清单
    FI / CO 配置步骤清单
    SD从零开始71 业务信息仓库(BW)
    SD从零开始67-70 后勤信息系统中的标准分析, 信息结构, 信息的更新规则, 建立统计数据
    SD从零开始66 数据仓库的概念
    SD从零开始65 框架协议(Outline Agreement)
    SD从零开始64-特异的业务交易(Special Business Transactions)
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154096.html
Copyright © 2011-2022 走看看