远程推送哪些事

一、什么叫做远程推送通知(what)

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

二、为什么需要远程推送通知?(why)

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

三、使用远程推送(how)

  3.1什么是长连接

1、长连接:只要联网了,就一直建立连接。
2、长连接的作用:
        时间校准、系统升级、查找我的iPhone。
3、长连接的好处:
        数据传输速度快、数据保持最新状态。        

  3.2推送调试工具

PushMeBaby 工具
    使用方法:1.工程中导入推送证证书。
                   2.更改 ApplicationDelegate 中init方法中的对应值,修改deviceToken及推        
              送的内容。
                   3.运行,点击推送Push。
                   4.推送成功程序右上角就会相应数字的角标。

  

  3.3收到推送通知收到的回调

(1)前台和后台的推送回调这个代理方法(退出的设置在didFinishLaunchingWithOptions方法中)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
(2)前台、后台和退出的推送都会调用这个代理方法(iOS 7之后可用)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler;

  3.4远程推送通知原理

远程推送通知必须要真机调试,因为真机才有UDID,才能够生成deviceToken.
应用的Bundle ID必须在苹果开发者中心创建,并且生成真机调试证书(.cer文件或.p12文件),推送通知调试证书(.cer文件或.p12文件)和profile描述文件(.mobileprovision文件).
如果是要打包测试和发布,必须生成打包测试推送通知证书和发布推送通知证书.

  3.5远程推送客户端流程

1、需要配置真机调试证书, 推送测试证书
2、请求苹果获得deviceToken
想苹果请求deviceToken
iOS 8.0之后必须请求授权
获取当前设备的UDID, 以及, app bundle id , 向苹果服务器发送请求, 获取deviceToken
// 远程推送APNs必须使用真机调试,并且必须使用付费的开发者账号配置好对应的bundle ID和真机推送证书

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

    // 向苹果请求DeviceToken
    [self requestDeviceToken];

    return YES;
}

// ------------------------------------------------------------------------
// 向苹果请求DeviceToken
- (void)requestDeviceToken
{
    // iOS 8.0之后必须请求授权
    if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {

        // 1.请求授权
        UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:setting];

        // 2.自动获取当前设备的UDID, 以及, app bundle id , 向苹果服务器发送请求, 获取deviceToken
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    } else {
        // iOS 8.0之前不用请求授权
        // 2.自动获取当前设备的UDID, 以及, app bundle id , 向苹果服务器发送请求, 获取deviceToken
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
    }
}

  3.监听APNs苹果服务器响应的deviceToken(目的是为了配置PushMeBaby中的DeviceToken)

// ----------------------------------------------------------------------------
// 当我们调用对应的api, 发送请求, 获取deviceToken , 苹果服务器响应之后, 就会调用这个方法, 把deviceToken 传给我们
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    // 获取到DeviceToken时,将deviceToken值写入到第三方APNs推送服务器PushMeBaby(使用Socket编写的调试服务器),可以在GitHub上下载
    NSLog(@"%@", deviceToken);
}

// ----------------------------------------------------------------------------
// 当获取DeviceToken失败是会调用该方法
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    NSLog(@"注册失败: %@", error.localizedDescription);
}

  4.客户端监听远程推送通知的点击

/ ----------------------------------------------------------------------------
// 监听远程推送通知点击(优先级较低),接收到通知,用户点击进入才会调用该方法
/**
 当接收到推送通知之后, 并且满足一下条件
 app 在前台时 ,会调用该方法
 app 从后台进入到前台 (App一开始在后台, app 锁屏),点击通知会调用该方法
 app 完全退出
 如果app 完全退出, 这时候,如果用户点击通知, 打开APP , 不会调用这个方法
 */
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    NSLog(@"接收到远程推送通知");

//    UISwitch *sw = [[UISwitch alloc] init];
//    [self.window.rootViewController.view addSubview:sw];
}

// ----------------------------------------------------------------------------
// 监听远程推送通知点击(优先级较高),一接收到通知就会立即调用该方法
/**
    当接收到推送通知之后, 并且满足一下条件
    当我们实现, 这个方法时, 上面一个方法不再执行
    计时APP 完全退出, 也会调用这个方法
    completionHandler : 统计我们处理的时间, 耗电量, 刷新预览图片

    效果: 当用户收到通知之后, 即使没有点击也会调用这个方法
    条件: 1 .需要勾选后台模式 remote notification,在后台
    2. 必须保证发送的推送通知格式, 包括  "content-available":"随便传"
    3. 执行completionHandler 回调代码块
    {"aps" :
        {
            "alert" : "This is some fancy message.",
            "badge":1,
            "content-available":"随便传"
        }
    }
*/

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSLog(@"fetchCompletionHandler: 接收到远程推送通知");

    UISwitch *sw = [[UISwitch alloc] init];
    [self.window.rootViewController.view addSubview:sw];


    completionHandler(UIBackgroundFetchResultNewData);
}

@end

  3.6常见错误 

 

 

 

 

二、极光推送配置设置

1. 首先进入苹果开发者中心,创建证书,包括,调试(真机测试)证书(开发和发布),这两个证书将用在xcode中,

2.再创建推送证书,需要导出钥匙串文件.cer,也是发布推送证书和开发推送证书,并且在push Notifications 勾选,表示允许推送。

3.需要创建appid,创建的时候需要设置xcode的bundle ID(bundle id 又包括完整的如,www.xxx.dddd,带*号的如,www.xxx.*,一般还是用完整的),

4.证书都创建好了以后,创建配置文件,也是包括开发和发布的。

5.导出双击下载好的证书,还是导出p12文件,创建极光推送账号,上传开发和生产环境的p12文件。

详情请看:http://www.tuicool.com/articles/jEvqQvr 史上最全的远程推送之极光推送

极光推送的集成
JPush iOS SDK 集成指南
链接: http://docs.jpush.io/guideline/ios_guide/
JPush iOS SDK 教程
链接: http://docs.jpush.io/client/ios_tutorials/
JPush SDK下载
链接: https://www.jpush.cn/common/products

  

 

posted @ 2016-04-02 21:45  TheYouth  阅读(352)  评论(0编辑  收藏  举报