RN iOS推送实现流程

362 阅读2分钟

我正在参加「掘金·启航计划」

最近一段时间,接触到一个RN项目,比较古老,需要添加推送的功能。最开始使用的JPush,结果不适配RN的版本,又换成了阿里云的推送。以下是根据阿里云推送解决RN和iOS原生交互实现推送的过程。

  1. 配置iOS开发者账号里面的推送证书
  2. 按照阿里云推送的开发文档接入推送SDK。
  3. 获取到deviceToken,利用阿里云的控制台,实现自测。
//获取deviceToken的方法
/*
 *  APNs注册成功回调,将返回的deviceToken上传到CloudPush服务器
 */

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    [CloudPushSDK registerDevice:deviceToken withCallback:^(CloudPushCallbackResult *res) {
        if (res.success) {
            NSLog(@"Register deviceToken success, deviceToken: %@", [CloudPushSDK getApnsDeviceToken]);
        } else {
            NSLog(@"Register deviceToken failed, error: %@", res.error);
        }
    }];
}

自测没有问题的话,可以和服务端联调,和服务端联调的时候需要注意的点有:

  1. iOS的推送区分生产环境和开发环境,iOS自测环境一般都是开发环境,提醒服务端注意使用开发环境,否则推送不成功。
  2. 推送的方式有多种,指定终端,指定账号,设备别名(Alias,)设备标签(Tag),不同的推送方式,注册的时候传入的参数不同,需要注意。
  3. 上线之后需要部署到线上,调用生产环境,有些线上环境推送不成功就是环境的问题。
  4. 建议服务端部署两套环境,测试和线上分开,避免忘记切换环境,小公司的开发制度不是很完善,很容易犯一些低级错误。

设置别名的方法

业务需求是RN内部登录之后,利用userid设置推送别名,利用桥接的方法,在原生桥接文件里面获取到RN传递的useid,利用通知注册到推送里面。桥接代码如下:

//新建`RERNBridgeManager`的分类
#import <React/RCTBridgeModule.h>

@interface RCT_EXTERN_MODULE(RNBridgeManager, NSObject) 

// 接受RN传递过来的userID
RCT_EXTERN_METHOD(receiveUserID:(NSString*)userID)
// 有更多需求依次写入下方
@end
import UIKit
import React

@objc(RNBridgeManager)
class RNBridgeManager {
    
    //rn跳转到原生承载的rn
    @objc(receiveUserID:)
    func receiveUserID(userID: NSString) {
       //获取到userID之后,利用通知将userID传递到appdelegate里面,注册到阿里云
    }
}

RN中需要注意的点:调用iOS桥接文件方法的时候,需要判断是否是iOS端,否则方法调用不成功。