我正在参加「掘金·启航计划」
最近一段时间,接触到一个RN项目,比较古老,需要添加推送的功能。最开始使用的JPush,结果不适配RN的版本,又换成了阿里云的推送。以下是根据阿里云推送解决RN和iOS原生交互实现推送的过程。
- 配置iOS开发者账号里面的推送证书
- 按照阿里云推送的开发文档接入推送SDK。
- 获取到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);
}
}];
}
自测没有问题的话,可以和服务端联调,和服务端联调的时候需要注意的点有:
- iOS的推送区分生产环境和开发环境,iOS自测环境一般都是开发环境,提醒服务端注意使用开发环境,否则推送不成功。
- 推送的方式有多种,指定终端,指定账号,设备别名(Alias,)设备标签(Tag),不同的推送方式,注册的时候传入的参数不同,需要注意。
- 上线之后需要部署到线上,调用生产环境,有些线上环境推送不成功就是环境的问题。
- 建议服务端部署两套环境,测试和线上分开,避免忘记切换环境,小公司的开发制度不是很完善,很容易犯一些低级错误。
设置别名的方法
业务需求是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端,否则方法调用不成功。