使用 SDK

初始化

使用组件前,需要完成的基本初始化操作。

前置条件

  • 若要通过组件初始化,必须先完成 SDK 集成,详情请参见 集成 SDK
  • 请确保启动后在云指令组件 TMFInstruction 初始化之前初始化本组件。

引入头文件

#import "TMFDistribution.h"

初始化

早期版本应用发布任务推拉是依赖数据同步组件来完成的,从公有云版本起,应用发布支持直接使用移动网关来实现任务推拉,可以解除任务推拉对数据同步组件的依赖。不过本次协议调整对新版服务有依赖,考虑到私有化客户不同的服务版本,SDK侧做了兼容,同时保留了两套协议实现,客户在初始化时根据自身服务情况指定协议版本即可。

+ (instancetype)sharedManager;
- (void)initialize;
/**
 @brief 应用发布推送协议
 */
typedef NS_ENUM(NSInteger, TMFDistributionPushPassagePolicy) {
    TMFDistributionPushPassagePolicyConch   = 0,    // default 旧协议
    TMFDistributionPushPassagePolicyShark   = 1,
};
/**
 *  @brief  使新协议传入回调
 *
 *  @note 初始化时SDK未拉取更新单,需要App调用自动/手动检查更新
 */
- (void)initWithDistributionHandler:(TMFDistributionHandler)handler
             TMFDistributionPushMsg:(TMFDistributionPushPassagePolicy)pushMsg;

初始化示例

// AppDelegate.m

[[TMFDistributionManager sharedManager] initialize];
// 新协议
[[TMFDistributionManager sharedManager] initWithDistributionHandler:nil TMFDistributionPushMsg:TMFDistributionPushPassagePolicyShark];

发布监听

对发布更新监听,弹出更新推送弹窗。 主动拉取支持两种方式:

  • 自动检查更新:该方式会检查弹窗频率限制,更新结果通过初始化传入的TMFDistributionHandler回调给开发者。
  • 手动检查更新:该方式不会检查弹窗评率限制,检查更新结果会通过独立设置的TMFDistributionSharkCallBack回调给开发者。使用场景是应用内的检查更新菜单,由用户触发。

前置条件

若要执行发布监听,必须先完成组件初始化,详情请参见 初始化

监听设置

通过实现监听接口,通过接口回调,监听应用发布更新。

接口定义

- (void)setDidReceiveDistributionHandler:(TMFDistributionHandler)handler;

其中,TMFDistributionHandler 的定义如下:

typedef void (^TMFDistributionHandler)(
    TMFDistributionInfo * _Nullable info, 
    TMFDistributionCompletionBlock completionHandler
);

其中,TMFDistributionCompletionBlock 的定义如下:

typedef void (^TMFDistributionCompletionBlock)(
    BOOL updated
);
  • 参数
参数 类型 描述 必选
handler TMFDistributionHandler(block) 监听回调,详见下方“handler 回调” Y
  • handler 回调
参数 类型 描述 必选
info TMFDistributionInfo * 更新数据对象,用于储存当次更新的数据信息,请参见 数据对象 N
completionHandler TMFDistributionCompletionBlock(block) 业务操作回调,通知组件是否同意发起更新,详见下方“completionHandler 回调” Y
  • completionHandler 回调
参数 类型 描述 必选
updated BOOL 自定义 Handler 的完成回调,在自定义 Handler 中调用,通知组件是否同意发起更新 Y

数据对象

数据对象支持复制,序列化。

@interface TMFDistributionInfo : NSObject <NSCoding, NSCopying>

@property (nonatomic, assign) BOOL updatesForcibly;         ///< 是否强制更新
@property (nonatomic, assign) NSInteger noticeTimeInterval; ///< 更新提示周期
@property (nonatomic, retain) NSURL *appStoreURL;           ///< 更新的 App Store 链接
@property (nonatomic, copy) NSString *buildNumberString;    ///< 更新 Build 号
@property (nonatomic, copy, nullable) NSString *distributionTitle;   ///< 更新标题
@property (nonatomic, copy, nullable) NSString *featureDescription;  ///< 更新的功能描述

@end
  • 属性
属性 类型 描述 权限
updatesForcibly BOOL 是否强制更新 readwrite
noticeTimeInterval NSInteger 更新提示周期 readwrite
appStoreURL NSURL * 更新的 app store 链接 readwrite
buildNumberString NSString * 更新版本号 readwrite
distributionTitle NSString * 更新标题 readwrite
featureDescription NSString * 更新的功能描述 readwrite

监听示例

下面是开启并自定义发布处理的示例:

// 注册自定义 Handler
[[TMFDistributionManager sharedManager] setDidReceiveDistributionHandler:^(TMFDistributionInfo * _Nullable info,
                                                                 TMFDistributionCompletionBlock  _Nonnull completionHandler) {
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:info.distributionTitle
                                          message:info.featureDescription
                                          preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel
                                   handler:^(UIAlertAction * _Nonnull action) {
                                       completionHandler(NO);
                                   }];
    UIAlertAction *updateAction = [UIAlertAction actionWithTitle:@"更新" style:UIAlertActionStyleDefault
                                   handler:^(UIAlertAction * _Nonnull action) {
                                       if ([[UIApplication sharedApplication] canOpenURL:info.appStoreURL]) {
                                           [[UIApplication sharedApplication] openURL:info.appStoreURL];
                                       }
                                       completionHandler(YES);
                                   }];
    [alertController addAction:updateAction];
    if (!info.updatesForcibly) {
        [alertController addAction:cancelAction];
    }

    // 弹出弹窗
    UIViewController *rootController = [UIApplication sharedApplication].keyWindow.rootViewController;
    [rootController presentViewController:alertController animated:YES completion:nil];
}];

新协议下的自动检查更新:

// 注册自动拉取弹窗处理 并且使用SDK默认弹窗
    [[TMFDistributionManager sharedManager] autoCheckForUpdatesDistributionHandler:nil];

新协议下的主动检查更新:

// 注册自动拉取弹窗处理 并且使用自定义弹窗
[[TMFDistributionManager sharedManager] drivingCheckForUpdatesDistributionHandler:^(TMFDistributionInfo * _Nullable distributionInfo, NSError * _Nullable error, TMFDistributionCompletionBlock  _Nullable completionHandler) {


            if (error) {
                UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"TMFDistribution"
                                                                                         message:[NSString stringWithFormat:@"没有获取到更新单失败\n error = %@",error]
                                                                                  preferredStyle:UIAlertControllerStyleAlert];
                [alertController addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]];
                [self presentViewController:alertController animated:YES completion:nil];
                return;
            }

            UIAlertController *alertController = [UIAlertController alertControllerWithTitle:distributionInfo.distributionTitle
                                                                                     message:distributionInfo.featureDescription
                                                                              preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel
                                                                 handler:^(UIAlertAction * _Nonnull action) {

            }];
            UIAlertAction *updateAction = [UIAlertAction actionWithTitle:@"更新" style:UIAlertActionStyleDefault
                                                                 handler:^(UIAlertAction * _Nonnull action) {
                                                                     [self _jumpAppStoreWithURL:distributionInfo.appStoreURL];
                                                                 }];
            [alertController addAction:updateAction];
            if (!distributionInfo.updatesForcibly) {
                [alertController addAction:cancelAction];
            }

            // 弹出弹窗
            [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alertController animated:YES completion:nil];

        }];

下面是默认和自定义的监听到发布更新后的弹窗,其中左侧为强制更新,右侧为非强制更新。

distribution_screen_shot

数据查询

组件提供数据查询属性,可供业务查询最近一次更新信息

前提条件

若要查询更新数据,必须先完成组件初始化,详情请参见 初始化

相关接口

@property (nonatomic, readonly, nullable) TMFDistributionInfo *distributionInfo;

使用示例

下面是获取上一次更新数据并弹窗展示的示例:

TMFDistributionInfo *distributionInfo = [TMFDistributionManager sharedManager].distributionInfo;
NSMutableString *message = [NSMutableString string];
[message appendFormat:@"【更新 Build 号】 %@\n", distributionInfo.buildNumberString];
[message appendFormat:@"【App Store 链接】 %@\n", distributionInfo.appStoreURL.absoluteString];
[message appendFormat:@"【更新标题】 %@\n", distributionInfo.distributionTitle];
[message appendFormat:@"【更新描述】 %@\n", distributionInfo.featureDescription];
[message appendFormat:@"【更新提示周期】 %ld秒\n", (long)distributionInfo.noticeTimeInterval];
[message appendFormat:@"【是否强制更新】 %@\n", distributionInfo.updatesForcibly ? @"是" : @"否"];

UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"TMFDistribution" 
                                      message:message 
                                      preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle:@"OK" 
                            style:UIAlertActionStyleDefault 
                            handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];

日志

组件提供日志接口,可供业务黑盒调试

前提条件

若要配置日志,必须先完成组件初始化,详情请参见 初始化

相关接口

@property (class, nonatomic, assign) TMFDistributionLogLevel logLevels;

日志等级

typedef NS_OPTIONS(NSUInteger, TMFDistributionLogLevel) {
    TMFDistributionLogLevelNone  = 0,        ///< 无日志
    TMFDistributionLogLevelInfo  = 1 << 0,   ///< 普通日志
    TMFDistributionLogLevelWarn  = 1 << 1,   ///< 警告日志
    TMFDistributionLogLevelError = 1 << 2,   ///< 错误日志

    TMFDistributionLogLevelAll   = 0xFF,     ///< 全部日志
};

日志示例

下面是在 AppDelegate.m 中配置组件日志的示例:

// AppDelegate.m

#if DEBUG
[TMFDistribution setLogLevels:TMFDistributionLogLevelAll];
#elif
[TMFDistribution setLogLevels:TMFDistributionLogLevelNone];
#endif

下面是只输出警告+错误的日志配置示例:

[TMFDistribution setLogLevels:(TMFDistributionLogLevelWarn | TMFDistributionLogLevelError)];
Copyright © 2013-2023 Tencent Cloud. all right reserved,powered by GitbookUpdate Time 2023-08-31 14:46:07

results matching ""

    No results matching ""