架构库 李嘉文的架构规范

ingameSDK

ingameSDK是数据开发组研发的一款内置浏览器,具体的使用方法接口如下:


前沿

SDK包括Android与iOS版,2个版本都覆写了浏览器的alert、confirm、prompt弹框,并提供了统一的JS接口,使用时需加载JS文件:

<script type="text/javascript" src="https://ossweb-img.qq.com/htdocs/weiguanwang/browser_adapt.js"></script>

在browser_adapt.js里暴露了全局变量customBrowserInterface的一组接口

为了避免出现白屏,加载第一个页面时会出现菊花状的进度条,微社区一般都是单页面应用

微社区自研浏览器SDK的兼容性:

  1. Android下兼容X5浏览器、系统自带的WebView,优先使用X5浏览器,加载X5浏览器失败时就使用系统自带的WebView

  2. 使用X5浏览器时需指定activity的android:process=":ingame_inner_webview",采用新进程来启动X5浏览器,不然会获取JNIEnv失败

  3. iOS下兼容UIWebView、WKWebView,iOS8.2及后续版本使用WKWebView(从iOS8开始才有WKWebView,iOS8.2之前会偶现白屏问题),其他版本使用UIWebView

  4. 覆写了浏览器的prompt弹框(传特定JSON格式的参数时不会出现prompt弹框),JS与SDK之间的交互通过prompt来实现,因此browser_adapt.js中的接口的返回值都是字符串

  5. 调用browser_adapt.js中的接口时,如果SDK中没有对应的接口,就会返回空串"",以此可以处理JS与SDK之间的兼容性

JS与SDK之间的交互通过prompt来实现的原因如下:

  1. Android下可用WebView的addJavascriptInterface来暴露接口给JS,但Android4.2之前通过反射机制JS可访问任意java类的函数,存在安全漏洞

  2. iOS7之前在UIWebView的shouldStartLoadWithRequest里处理交互,但JS调用无法获取返回值;iOS7及后续版本的UIWebViingameew可用JavaScriptCore,JS调用能获取返回值

  3. iOS8及后续版本可以使用WKWebView,但JS调用无法获取返回值

  4. 微社区的JS调用浏览器接口时需获取返回值,考虑到安全性、兼容性以及代码的可维护性,JS与SDK之间的交互通过prompt来实现

接口对象名称customBrowserInterface,调用示例:customBrowserInterface.closeWebview()
具体接口列表如下:

接口名方法描述
浏览器版本getCustomUserAgent()腾讯视频播放器会根据navigator.userAgent来判断如何播放视频,为了不干扰视频播放,修改navigator.userAgent时只是在末尾添加了空格 + 自定义串("Android TIEM Ingame Browser/0.5"、"iOS TIEM Ingame Browser/0.5",其中0.5为版本号,会动态变化)
浏览器版本getVersion()判断customBrowserInterface.getCustomUserAgent()的返回值中的版本号,微社区自研浏览器SDK根据这个版本号来实现各版本之间的兼容
是否是微社区自研浏览器isCustomBrowser()返回值:true: 是 false: 不是
分享到QQ空间sendToQQ(1, title, desc, url, imgUrl)第一个参数固定为1,其他参数依次为标题、描述、点击后的跳转链接、图片的url,从第二个参数开始如果不需要某个参数可置为空串"",而不是null。如果没有出现分享界面,请检查imgUrl是否以https://开头,iOS下的app默认不允许直接加载http资源
分享到QQ好友sendToQQ(2, title, desc, url, imgUrl)第一个参数固定为2,其他参数请参考"分享到QQ空间"
分享到微信朋友圈sendToWeixinWithUrl(1, title, desc, url, imgUrl);第一个参数固定为1,其他参数请参考"分享到QQ空间"
分享给微信好友sendToWeixinWithUrl(2, title, desc, url, imgUrl);第一个参数固定为2,其他参数请参考"分享到QQ空间"
是否装了微信isPlatformInstalled(1)返回值:"1": 安装了"0": 没有安装
是否装了QQisPlatformInstalled(2)返回值:"1": 安装了 "0": 没有安装
登录的帐号类型getAccountType()返回值:"1": 安装了 "0": 没有安装
实时获取当前的网络状态getNetworkType()返回值: "没有网络"、"WIFI"、"4G"、"3G"、"2G"、"未知网络"
当前的操作系统isAndroid()返回值:"1": Android "0": iOS
返回游戏closeWebview()-
隐藏浏览器UIhideUi()浏览器新开页面时默认会5秒(王者荣耀微社区改版前首页加载时延为4秒多,改版后为2秒多)后显示UI,在这5秒期间页面可调用此接口取消UI的展示,如果超过5秒后调用就是直接隐藏UI。这样就可以确保页面出现异常而无法调用customBrowserInterface.hideUi()时,用户可以看到浏览器的UI,就可以返回上一个页面,如果无法返回上一个页面那就直接返回游戏。为了不遮挡页面,影响操作,UI可以拖动
查看加密的设备信息getDeviceInfo(1)加密后的设备信息,可在后台解密
查看原始的设备信息getDeviceInfo(0)返回值: Android下的返回值: '{"osSystem":"", "osVersion":"", "deviceModel":"", "deviceName":"", "deviceTradeMark":"", "deviceManufacturer":"", "deviceImei":""}' iOS下的返回值: '{"osSystem":"", "osVersion":"", "deviceModel":"", "deviceIdfa":"", "deviceName":""}' 注:返回值是JSON格式的字符串
生成快捷方式addShortcut()Android下的调用方式: customBrowserInterface.addShortcut(name, imgUrl, url);iOS下的调用方式: customBrowserInterface.addShortcut(url);注:name是快捷方式的名称,imgUrl是快捷方式的图标的url,Android下的url是快捷方式跳转的链接地址,iOS下的url是获取mobileconfig文件的链接地址。iOS下生成快捷方式是用Safari加载mobileconfig文件,根据mobileconfig文件进行安装,安装完毕就生成了快捷方式。Android下生成快捷方式不同于iOS,无需安装,但不一定会成功,部分手机禁止生成快捷方式,部分手机会被手机管家阻止,需要通过手机管家里的权限管理进行配置