Skip to main content

Shiply iOS 远程配置 SDK 集成

一、 接入指引

1.1 配置CocoaPods依赖

通过 Cocoapods 的 Podfile 集成 ShiplyRDelivery.xcframework

# 添加镜像源
source 'https://cdn.cocoapods.org/'
pod 'ShiplyRDelivery', '1.3.5.1'
# 或
pod 'ShiplyRDelivery', :git => 'https://e.coding.net/tencent-tds/shiply/ShiplyRDelivery.git', :tag => '1.3.5.1'
# 进阶:
# ShiplyRDelivery.podspec 声明了以下依赖,您可根据 App 实际情况锁定依赖库的版本,以避免自动升级 SDK 带来的风险
pod 'MMKV', '1.2.16'
pod 'YYModel', '1.0.4'
pod 'RaftInterface', '0.0.20'

1.2 创建 RDelivery 实例

可参考 Demo 工程(公开仓库 )进行体验和接入。
RDelivery 支持多实例,您可以使用单例持有 RDelivery 实例,并在 application:didFinishLaunchingWithOptions: 方法中进行初始化。最简设置

#import <UIKit/UIDevice.h>
#import <ShiplyRDelivery/RDeliveryJsonModelImpl.h>
#import <ShiplyRDelivery/RDNetworkImpl.h>
#import <ShiplyRDelivery/RDLoggerImpl.h>
#import <ShiplyRDelivery/RDMMKVFactoryImpl.h>
// SDK 支持通过依赖注入来替换网络、日志、存储等组件,您可以使用这些默认实现。
RDeliveryDepends *depends = [RDeliveryDepends new]; //初始化注入依赖
depends.httpImpl = [RDNetworkImpl sharedInstance]; //注入网络实现
depends.logImpl = [RDLoggerImpl sharedInstance]; //注入日志实现,默认的日志组件RLoggerImpl为NSLog实现的,建议业务注入自己的日志组件
depends.kvImpl = [RDMMKVFactoryImpl sharedInstance]; //注入存储实现
depends.jsonModelImpl = [RDeliveryJsonModelImpl sharedInstance];
//初始化SDK设置
RDeliverySDKSettings *setting = [RDeliverySDKSettings settingWithAppId:kRDeliveryDemoAppid //在 Shiply Web页面申请的项目的 appid
appKey:kRDeliveryDemoAppkey //在 Shiply Web页面申请的项目的 appkey
guid:kRDeliveryDemoGuid1 //业务自己的user ID,用于配置按号码包规则的匹配
depends:depends];
//设备标识(您的唯一设备标识符)
setting.qimei = kRDeliveryDemoQimei;
//使用的环境的id(默认是正式环境,也可不填写)
setting.envId = RDeliveryReleaseEnvId;
// 设置配置的自动更新策略,默认为不自动更新
setting.updateMode = RDCONFIG_UPDATE_MODE_APP_START | // 启动时更新
RDCONFIG_UPDATE_MODE_SCHEDUAL | // 定时更新
RDCONFIG_UPDATE_MODE_NETWORK_CHANGE; // 网络从无网络切换为联网时更新
setting.systemVersion = [UIDevice currentDevice].systemVersion; //系统版本号
self.rdeliverySDK = [RDeliverySDK createSDKWithSettings:setting];

1.2.1 组件依赖注入和替换

RDelivery SDK 支持关键组件依赖注入,并提供了默认的网络(依赖NSURLSession)、存储(依赖MMKV)、以及日志(依赖NSLog)组件。接入方可以通过实现相关组件协议的方式,将自定义功能的组件注入给 SDK 使用。

  • 网络协议(RAFTNetworkProtocol)

  • 存储协议(RAFTKVStorageProtocol、RAFTKVStorageFactoryProtocol)

  • 日志协议(RAFTLogProtocol)

  • JSON模型转换协议(RDeliveryYYModelProtocol)
    常见的需要自定义依赖注入组件的场景:

  • 打印 RDelivery SDK 日志

  • RDelivery 使用 YYModel 作为 JSON 转换工具,但接入方希望使用其他 JSON 库

  • 接入方使用了修改版的 MMKV 或 YYModel 等库,接入 RDelivery 时产生依赖冲突

  • 接入方在 App 中全局初始化 initializeMMKV,不希望在 RDelivery 初始化时再次同步调用 initializeMMKV。
    如何替换组件?
    以替换 jsonModelImpl 为例,你可以拷贝 RDeliveryJsonModelImpl 的 .h 和 .m 文件,修改类名 XXXJsonModelImpl,然后实现 RDeliveryYYModelProtocol 协议的 modelToJSONData: 和 modelWithJSON:classType 方法。

- (nullable NSData *)modelToJSONData:(nonnull id)object {
return [object yy_modelToJSONData];
}
- (nonnull id)modelWithJSON:(nonnull NSString *)json classType:(nonnull Class)cls {
return [cls yy_modelWithJSON:json];
}

最后将 XXXJsonModelImpl 单例注入,完成依赖替换。

RDeliveryDepends *depends = [RDeliveryDepends new];
depends.jsonModelImpl = [XXXJsonModelImpl sharedInstance]; //注入json模型转化默认实现

1.2.2 打印 SDK 日志(重要)

为了方便定位问题,建议业务方创建 RDelivery 实例时注入业务自定义的日志实现,以便在线上版本可以输出RDelivery的日志,具体可以参考 RDLoggerImpl 的实现,将NSLog部分改成用业务方的日志组件输出。

RDeliveryDepends *depends = [RDeliveryDepends new];
depends.logImpl = [XXXLoggerImpl sharedInstance]; // 你实现的日志依赖注入

1.2.3 其他可选设置

#import "sys/utsname.h"
// 设置默认更新间隔,如果不设置,默认4小时。设置更新策略包含RDCONFIG_UPDATE_MODE_SCHEDUAL时才生效
setting.updateDuration = 14400.0;
// 设置自定义属性
setting.profiles = @{@"key": @"value",
@"age": @"25",
@"name":@"tom",
};
struct utsname systemInfo;
uname(&systemInfo);
NSString *deviceType = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
setting.deviceType = deviceType; //设备型号
//如果某些业务代码在初始化阶段就会读配置,可能存在读取的时候配置还未加载完成的情况。此类业务可以实现RDConfigEventListener协议,并添加监听者,在onConfigInfoInited方法中读取配置
[self.rdeliverySDK addConfigEventListener:self];

1.3 使用配置和开关

1.3.1 配置开关的缺省值

  • 带defaultValue参数的配置,如果获取到配置为空,将会返回将defaultValue作为默认值返回;

  • 不带defaultValue参数的配置,如果获取到配置为空,将返回对应的空值(对象返回nil,int返回0等)

1.3.2 获取配置值

当远端不存在这个配置开关key,或未拉到该配置,或web上未设置该key的配置值时,会返回 defaultValue。

NSString *stringValue = [self.rdeliverySDK stringValueWithKey:configKey defaultValue:@"{\"k1\":\"v1\"}"];

1.3.3 获取开关值

当远端不存在这个配置开关key,或未拉到该配置,或者web上该key的开关值为「未设置」时,会返回 defaultValue。

BOOL isSwitchOn = [self.rdeliverySDK isSwitchOn:configKey defaultValue:NO];

1.3.4 获取配置对象(RDConfigInfo类型)

RDConfigInfo *info = [self.rdeliverySDK configInfoWithKey:configKey];

1.4 手动拉取 RDelivery 远程配置开关

您也可以手动调用拉取RDelivery远程配置的接口:

1.4.1 拉取全量配置

[self.rdeliverySDK updateConfigWithCompleteHandler:^(NSError * _Nullable error) {
if (!error) {
NSLog(@"拉取成功");
}
}];

1.4.2 按场景id拉取配置

[self.rdeliverySDK updateConfigWithSceneId:@"100080" completeHandler:^(NSArray<RDConfigInfo *> * _Nonnull configInfoArray, NSError * _Nullable error) {
if (!error) {
NSLog(@"拉取成功,配置数:%lu", (unsigned long)configInfoArray.count);
}
}];

1.4.3 拉取单个配置

[self.rdeliverySDK updateConfigWithKey:@"testA" completeHandler:^(RDConfigInfo * _Nonnull configInfo, NSError * _Nullable error) {
if (!error) {
NSLog(@"拉取成功,配置内容:%@", configInfo.stringValue);
}
}];

二、API介绍

  • 对外接口:RDeliverySDK.h

  • SDK 初始化设置项:RDeliverySDKSettings.h

  • 配置值更新协议:RDConfigInfoListener.h

  • 配置启动加载、业务读取协议:RDConfigEventListener.h