# ABCtimeReadingBookSDKDemo **Repository Path**: kong09/ABCtimeReadingBookSDKDemo ## Basic Information - **Project Name**: ABCtimeReadingBookSDKDemo - **Description**: ABCtimeReadingBookSDKDemo_common - **Primary Language**: Objective-C - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-09-29 - **Last Updated**: 2021-06-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #ABC Reading SDK(iOS)开发文档 ##1.适用范围 适用于iOS8.0及以上操作系统 ##2.快速集成 手动集成: * 选择 `File --> Add Files to “Your Project”` * 选择整个ABCtimeReadingBookSDK文件夹(包含`ABCtimeReadingBookSDK.framework`、`ATReadingBookImages.bundle`、`ATReadingBookLottieJSONs.bundle`、 `ATReadingBookResourceData.bundle`、`ATReadingBookSound.bundle`) * 勾选 `Copy items if needed` * 说明:ABCtimeReadingBookSDK中需要宿主App实现ABCtimeReadingBookProtocol协议中涉及的代理方法来完成跟读打分,我们提供一套完整的跟读打分机制,需要把VoiceEvalSDK整个文件夹Copy到项目中(包含`ATVoiceEvalManager.h/m`、`TALVoiceEvalSDK.framework`、`SingSound.bundle`),ATVoiceEvalManager封装了跟读打分SDK,完成开始跟读、结束跟读、取消跟读等操作。当然如果您的App中有自己的跟读打分的SDK,只需要手动实现ABCtimeReadingBookProtocol协议中的代理方法即可。 * 除此之外,宿主App还需要通过pod引入SDK需要的第三方库 - pod 'SSZipArchive', '~> 2.1.1' - pod 'JSONModel', '~> 1.7.0' - pod 'lottie-ios', '~> 2.5.3' - pod 'SDWebImage', '~> 5.0' - pod 'YYText', '~> 1.0.7' - pod 'Objective-LevelDB', '~> 2.1.5' - pod 'AliyunOSSiOS', '~> 2.10.7' * 注:提供了只支持真机设备的framework包,位置:~/ABCtimeReadingBookSDKDemo/ABCtimeReadingBookSDK/ABCtimeReadingBookSDK-iphoneos.framework * 注:VoiceEvalSDK语音评测SDK和TalkingData有冲突,同时使用的话初始化配置TD时必须关闭反作弊功能:[TalkingData setAntiCheatingEnabled:NO]; Pods集成: > 条件:当前宿主工程没有使用TALVoiceEvalSDK.framework 或 SingSound(先声)提供的SDK > > 特点:低聚合,可对TALVoiceEvalSDK.framework自主包装使用. > > pod install 安装ATReadingBookSDK 1.0.0版本,并且把VoiceEvalSDK整个文件夹Copy到项目中(包含`ATVoiceEvalManager.h/m`、`TALVoiceEvalSDK.framework`、`SingSound.bundle`完成集成 > > 说明:Pods中包含文件 > > > - `ABCtimeReadingBookSDK.framework` > > - `ATReadingBookImages.bundle` > > - `ATReadingBookLottieJSONs.bundle` > > - `ATReadingBookResourceData.bundle` > > - `ATReadingBookSound.bundle` - pod 'ATReadingBookSDK', '~> 2.1.5' ##3.注册AppID & AppSecret & 设置服务器环境 ``` typedef NS_ENUM(NSUInteger, EATServerType) { // 服务器环境类型; EATServerTypePreRelease = 0, // 预发布测试环境; EATServerTypeProduction, // 正式环境; }; /** ABCtimeReadingBookSDK注册; @param appID 主App在ABCtime的业务ID; @param appSecret 主App在ABCtime对应的秘钥; @param serverType 服务器环境配置; */ + (void) registAppID:(NSString *) appID appSecret:(NSString *) appSecret serverType:(EATServerType) serverType; ``` ##4.进入SDK读书页面 ``` typedef NS_ENUM(NSUInteger, EATInterfaceOrientation) { EATInterfaceOrientationLandscapeLeft = 1, EATInterfaceOrientationLandscapeRight, }; /** 初始化sdk的交互VC @param parentViewController 父亲viewController, 用来present ABCtime绘本界面; @param userId 对应的用户id @param delegate 宿主App需要实现的delegate */ - (void)setParentViewController:(__kindof UIViewController *)parentViewController deviceOrientation:(EATInterfaceOrientation)deviceOrientation withUserId:(NSString *) userId delegate:(id)delegate; ``` ##5.SDK Public类说明 ###5.1 ABCtimeReadingBookProtocol ① 开始录音,pageContent由SDK传到宿主App,开始打分 ``` /** 开始录音 @param pageContent 录音内容 */ - (void)at_startRecordWithPageContent:(NSString *)pageContent; ``` ② 结束录音,宿主App返回本次跟读得分给SDK ``` /** 跟读打分回调block @param evalResultDic 跟读结果 格式:@{@"score" : 跟读得分, @"audioPath" : 本次录音地址} @param success 是否成功 */ typedef void(^ATVoiceEvalCompletedBlock)(NSDictionary *evalResultDic ,BOOL success); /** 结束录音并等待App返回打分结果 @param complete 打分结果block */ - (void)at_endRecordWithComplete:(ATVoiceEvalCompletedBlock)complete; ``` ③ 取消本次录音,不接收本次跟读打分结果 ``` /** 取消本次录音(结束本次跟读打分不接收分数) */ - (void)at_cancelRecord; ``` ④ 退出SDK ``` @optional /** 从SDK退出 */ - (void)at_leaveSDK; ``` ⑤ 宿主工程可以通过这个方法自定义书架各level对应的背景图片 ``` typedef NS_ENUM(NSUInteger, EATBookLevel) { EATBookLevel_aa = 0, EATBookLevel_A, EATBookLevel_B, EATBookLevel_C, EATBookLevel_D, EATBookLevel_E, EATBookLevel_F, EATBookLevel_G, }; /** 获取书架不同level的背景图片 @param bookLevel 绘本等级枚举 aa ~ G @return 背景图片 */ - (UIImage *)at_bookShelfBackgroundImageForLevel:(EATBookLevel)bookLevel; ``` ###5.2 ATReadingBookManager ① 注册AppID && AppSecret 建议在ApplicationDidFinishLauching里面调用 ``` /** ABCtimeReadingBookSDK注册; @param appID 主App在ABCtime的业务ID; @param appSecret 主App在ABCtime对应的秘钥; */ + (void) registAppID:(NSString *) appID appSecret:(NSString *) appSecret; ``` ② 生成单例对象 ``` /** ABCtime入口单例; @return 单例对象; */ + (ATReadingBookManager *) sharedInstance; ``` ③ 获取所有绘本的level信息 ``` /** 获取所有绘本的level信息 "levelID" = 4; //level唯一标识 "levelName" = A; //level名称 @return level列表 */ + (NSArray *) getAllBookLevelList; ``` ④ 宿主App进入SDK调用的初始化方法 ``` /** 初始化sdk的交互VC @param parentViewController 父亲viewController, 用来present ABCtime绘本界面; @param userId 对应的用户id @param delegate 宿主App需要实现的delegate */ - (void)setParentViewController:(__kindof UIViewController *)parentViewController withUserId:(NSString *) userId delegate:(id)delegate; ``` ⑤ 获取服务器环境 ``` typedef NS_ENUM(NSUInteger, EATServerType) { // 服务器环境类型; EATServerTypePreRelease = 0, // 预发布测试环境; EATServerTypeProduction, // 正式环境; }; 获取服务器环境 @return 服务器环境type */ + (EATServerType)getServerType; ``` ⑥ 从SDK点击开通VIP按钮跳转到宿主App的支付界面 ``` /** 支付页面的触发; @param userID 用户id; @param levelID 绘本level等级id; @param atNavigationController sdk主导航; */ typedef void(^kATReadingBookPaymentBlock)(NSString *userID, NSString *levelID, UINavigationController *atNavigationController); //展示支付页面的回调; @property(nonatomic, copy) kATReadingBookPaymentBlock paymentEnterBlock; ``` ⑦ 支付成功调用SDK开通权限接口 ``` typedef NS_ENUM(NSInteger, EATSubTimeType) { EATSubTimeTypeHalfYear = 1, // 半年 EATSubTimeTypeYear = 2, // 1年 EATSubTimeTypeMonth = 3, // 1个月 }; /** 宿主App支付页面 >> 调用开通权限接口, <重复购买, 后台累加有效期> 在支付页面支付完毕后调用 @param transactionID 订单id @param userID 用户id @param levelID 开通levelID(购买全level的话传@"1000") @param subTimeType 开通类型 半年、一年、一个月 */ - (void)paymentSuccessWithTransaction:(NSString *) transactionID userID:(NSString *) userID levelID:(NSString *) levelID subTimeType:(EATSubTimeType) subTimeType; ``` ⑧ 取消订单后回调给SDK ``` /** 取消订单的回调; @param success 是否订单取消成功; */ typedef void(^kATReadingBookCancelTransactionBlock)(BOOL success, NSError *error); /** 取消level绘本的服务; @param transactionID 购买level服务的订单号; @param completedBlock 取消成功失败的回调; */ - (void)cancelLevelServiceWithTransaction:(NSString *) transactionID completed:(kATReadingBookCancelTransactionBlock) completedBlock; ``` ⑨ 兑换VIP ``` /** 兑换开通VIP错误码 - EATRedeemErrorCodeInvalidParameters: 参数无效 <<< 参数为空字符串或nil - EATRedeemErrorCodeExpired: 兑换码已过期 - EATRedeemErrorCodeNotExist: 兑换码不存在 - EATRedeemErrorCodeInvalidCode: 兑换码无效 <<< 1.兑换码被退回 2.用单level兑换码来开通全量level会返回兑换码无效 - EATRedeemErrorCodeFailed: 兑换失败 <<< SDK调用兑换接口失败,请用户重试即可 - EATRedeemErrorCodeUsed: 兑换码已使用 */ typedef NS_ENUM(NSUInteger, EATRedeemErrorCode) { EATRedeemErrorCodeInvalidParameters = -999, EATRedeemErrorCodeExpired = 1205, EATRedeemErrorCodeNotExist = 1206, EATRedeemErrorCodeInvalidCode = 1207, EATRedeemErrorCodeFailed = 1208, EATRedeemErrorCodeUsed = 1209, }; /** 兑换页面的触发 @param userID 用户id @param levelID 绘本level等级id @param atNavigationController sdk主导航 */ typedef void(^ATReadingBookRedeemBlock)(NSString *userID, NSString *levelID, UINavigationController *atNavigationController); /** 兑换结果回调 @param isSuccess 是否兑换成功 @param error 错误信息 */ typedef void(^ATReadingBookRedeemResultBlock)(BOOL isSuccess, NSError *error); /** 宿主App兑换页面 >> 调用兑换接口, <重复购买,后台累加有效期> @param code 兑换码 @param userID 用户ID @param levelID 兑换levelID @param resultBlock 开通结果异步回调block */ - (void)at_redeemWithCode:(NSString *)code userID:(NSString *)userID levelID:(NSString *)levelID completion:(ATReadingBookRedeemResultBlock)resultBlock; /** 取消兑换VIP操作 */ - (void)at_cancelRedeemRequest; ```