• 远程推送哪些事


    一、什么叫做远程推送通知(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
    

      

    将来的自己,会感谢现在不放弃的自己!
  • 相关阅读:
    c++继承与多态
    逻辑运算符
    页面分栏布局
    js中的三大特殊数据:undefined,null,NaN
    逻辑分支中if小括号中的隐式转换
    最小高度的兼容方法
    js数据类型的转换
    ognl.OgnlException: target is null for setProperty(null, "goodsSize", [Ljava.lang.String;@c3bb5。
    解决拦截器的对于参数传递无效问题
    引用外部js乱码问题
  • 原文地址:https://www.cnblogs.com/TheYouth/p/5348397.html
Copyright © 2020-2023  润新知