Upgrade to Pro — share decks privately, control downloads, hide ads and more …

websdk_1_.pdf

YY EFox Team
December 26, 2018
29

 websdk_1_.pdf

YY EFox Team

December 26, 2018
Tweet

Transcript

  1. 亟待解决 1. 统一用法 2. 减少if/else 3. 异常统一处理,不影响主流程 4. 重写接口,统一管理 5.

    增加扩展性 1. Cef接入的SDK没有AOP控制,用法不统一 2. PC跟Web交互方式不一致,过多的if/else,代码阅读效率不高 3. 没有统一错误处理 4. SDK分布各个模块,没有直观的SDK接口列表 表现 那么
  2. 探索一 PC window.YY === Object Web window.YY === undefined Other

    window.YY === Other Instance 表现 1. 环境用户自定义,并根据当前环境接入不同的SDK 2. SDK只作call处理 那么
  3. 探索二 1. If (YY && YY.Sdk && YY.Sdk.xxx) {} 2.

    Else if( Cef && Cef.Sdk && Cef.Sdk.xxx) {} 3. Else … 表现 那么 1. 按不同环境统一管理SDK 2. SDK按接口方式命名与使用 3. 不同环境执行不同逻辑
  4. WebSDK SDK Implements Environment PC win: { getUserInfo() { return

    YY.win.getUserInfo() } } Web win: { getUserInfo() { return {} } } WebSDKBOM.config() WebSDK(‘win.getVersion’) 根据环境选择SDK 初始化SDK 调用后回调实现的SDK
  5. 代码实现思路解析 1. 初始化SDK,将SDK放至全局instance 2. 其它配置(统一报错处理,日志打印等) config (setting: any = [])

    init (key: String, …args: any[] ) 1. key, Sdk目标获取的值,如 ‘win.overlay’ 2. args,参数 3. 通过把key进行split(`.`)拆分,得到数据后,进行遍历 key.split(`.`).forEach(item => {}) 4. 迭代SDK后,结果为函数则回调,非函数则返回 return sdk(…args) / sdk
  6. 代码 config(setting: any = {}): void { __mergeEnv(setting) // 覆盖数据

    } init(key: string, ...args: any[]) { instance.key = key instance.args = args try { if (!(key && /^([a-zA-Z])/.test(key))) { return instance._catchError(MsgConfig.call(instance, 'KEY_INPUT')) } const _tmpKeysArray = key.replace(/\[/g, '.').replace(/\]/g, '').split('.') let _tmpSdk: any = instance._config.sdk for (let item of _tmpKeysArray) { _tmpSdk = _tmpSdk[item] if (_tmpSdk === null || _tmpSdk === undefined) { return instance._catchError(MsgConfig.call(instance, 'KEY_NOT_FIND')) } if (typeof _tmpSdk === 'function') { return _tmpSdk(...args) } } return _tmpSdk } catch (error) { error = Object.assign({}, MsgConfig.call(instance, 'CATCH'), {error}) return instance._catchError(error) } }
  7. QA