UNPKG

ylh-quick-app-ad-sdk

Version:

安装命令: 通过 `npm` 安装: ```sh npm install ylh-quick-app-ad-sdk ``` 通过 `yarn` 安装: ```sh yarn add ylh-quick-app-ad-sdk ```

253 lines (232 loc) 7.11 kB
/* eslint-disable import/no-unresolved */ import app from '@system.app'; import fetch from '@system.fetch'; import file from '@system.file'; import device from '@system.device'; import network from '@system.network'; import shortcut from '@system.shortcut'; import battery from '@system.battery'; import brightness from '@system.brightness'; import webview from '@system.webview'; import storage from '@system.storage'; import pkg from '@system.package'; import router from '@system.router'; import prompt from '@system.prompt'; import cipher from '@system.cipher'; import volume from '@system.volume'; import sensor from '@system.sensor'; import vibrator from '@system.vibrator'; import { classCallCheck, getCoreVersionByUrl, initYLHSDK, } from './utils'; import pkgConfig from './package.json'; const qaGlobal = Object.getPrototypeOf(global) || global; const { version } = pkgConfig; const REMOTE_JS_TYPE = { CORE: 'core', }; const FIRST_CORE_VERSION = 1070; const isSomeStubVersionScope = ({ entryVersion, localVersion }) => { // 版本号为三段式:例如1.6.1060、1.7.1070,去掉插件版本,只比较前2段版本是否一致 const lStabVersion = localVersion.replace(/\.\d+$/, ''); const eStabVersion = entryVersion.replace(/\.\d+$/, ''); return lStabVersion === eStabVersion; }; const getRemoteJSConfigInfo = ({ type, firstPublishUrl, stubVersion, firstPublishPluginVersion, isUseRemoteJS, validateFn = (localJsUrl) => { if (isUseRemoteJS) { return !isUseRemoteJS; } if (!localJsUrl) { return false; } const [localStubVersion, localPluginVersion] = getCoreVersionByUrl(localJsUrl); const isSameSdkVersion = isSomeStubVersionScope({ entryVersion: stubVersion, localVersion: localStubVersion, }); return isSameSdkVersion && localPluginVersion >= firstPublishPluginVersion; }, }) => { const coreInfo = { // 存放本地 JS 文件的 uri 地址 cacheUri: `internal://files/ylh-sdk-${type}/${stubVersion}`, // 本地 JS 不可用(没有或不符合 validateFn 条件)时,重新请求 JS 的远程地址 remoteUrl: firstPublishUrl, validateFn, }; return coreInfo; }; const coreInfo = getRemoteJSConfigInfo({ type: REMOTE_JS_TYPE.CORE, firstPublishUrl: `https://qzs.gdtimg.com/union/res/quick_app/plugin/ylh-sdk-core-v1.7.1070.min.js?d=${Date.now()}`, stubVersion: version, firstPublishPluginVersion: FIRST_CORE_VERSION, isUseRemoteJS: false, }); const system = { fetch, file, device, network, shortcut, battery, brightness, webview, storage, pkg, router, prompt, cipher, volume, sensor, vibrator, app, sdkVersion: version, BroadcastChannel, }; // 为加快运行速度,缓存promise const userPromiseCache = {}; const YLH_SDK_SUPPORT_MINI_PLATFORM_VER = 1100; export const isPlatformVersionCodeGreaterThen1100 = async () => { if (!userPromiseCache.platformPromise) { userPromiseCache.platformPromise = new Promise((resolve, reject) => { device.getInfo({ success: (deviceInfoInfo) => { const { platformVersionCode } = deviceInfoInfo; if (platformVersionCode < YLH_SDK_SUPPORT_MINI_PLATFORM_VER) { reject(new Error(JSON.stringify({ platform: platformVersionCode }))); } else { resolve(true); } }, fail: () => { reject(new Error(JSON.stringify({ platform: '未知' }))); }, }); }); } return userPromiseCache.platformPromise; }; /** * 加载远程 CDN JS 广告处理逻辑文件 * @returns Promise */ const fetchRemoteJS = ({ cacheUri, remoteUrl }) => new Promise((resolve, reject) => { let pollCount = 0; const errMessage = `${remoteUrl} 获取失败`; const pollFetch = () => { fetch.fetch({ url: remoteUrl, responseType: 'text', method: 'get', success: (res) => { const { code, data: jsCode } = res; if (code !== 200) { if (pollCount < 3) { pollCount += 1; // 重试之前等待1s钟 setTimeout(() => { pollFetch(); }, 1000); } else { reject(errMessage); } } else { resolve(jsCode); // 缓存最新 JS if (cacheUri) { file.writeText({ uri: cacheUri, text: { jsCode, jsUrl: remoteUrl }, }); } } }, fail: () => { // 当出现网络异常或者其他情况时,进行重试 if (pollCount < 3) { pollCount += 1; // 重试之前等待1s钟 setTimeout(() => { pollFetch(); }, 1000); } else { reject(errMessage); } }, }); }; pollFetch(); }); // 获取local JS,如果local JS不可用(没有或不符合validateFn条件)时,重新请求remoteUrl JS const getLocalJS = async ({ cacheUri, remoteUrl, validateFn }) => { try { const res = await file.readText({ uri: cacheUri, }); const { data = {} } = res || {}; const { jsCode, jsUrl } = JSON.parse(data.text || '{}'); if (validateFn(jsUrl)) { return jsCode; } } catch (err) { console.log('getLocalJS-err', err); } return fetchRemoteJS({ cacheUri, remoteUrl }); }; // 执行local JS, 如果没有,则从remoteUrl处获取后再执行 const executeLocalJS = async (params) => { getLocalJS(params).then((localJS) => { // eslint-disable-next-line no-new, no-new-func const func = new Function('$YLHSDK', localJS); func(qaGlobal.$YLHSDK); }).catch((err) => { console.log('executeLocalJS出错', err, params); }); }; /** * 快应用SDK入口函数 * @param {Object} $app 快应用 App 实例。注意$app和app的区别:$app-快应用实例,app-快应用文档提供的@system.app api。 */ export default function YLH_UNION_AD_SDK_STD($app, config = {}) { classCallCheck(this, YLH_UNION_AD_SDK_STD); // 聚合兼容优化:避免SDK出现两次初始化 if ($app.$def?.ylh_sdk) { return; } if (!config.appId) { console.error('必须传递appId,ylh_sdk才会正常运行'); return; } initYLHSDK($app); isPlatformVersionCodeGreaterThen1100().then(() => { qaGlobal.$YLHSDK = { $app, config, system: { ...system, telecom: require('@system.telecom'), // telecom 必须 大于 1080 版本 keyguard: require('@system.keyguard'), // keyguard 必须 大于 1090 版本 downloadTask: require('@system.downloadtask'), // downloadTask 必须 大于 1100 版本 }, fetchRemoteJS, localCore: { localCoreUri: coreInfo.cacheUri, getCoreVersionByUrl, }, }; executeLocalJS(coreInfo); }).catch((err) => { const errObj = err?.message ? JSON.parse(err.message) : {}; console.warn(`该机型的 minPlatformVersion 为${errObj.platform}, 小于${YLH_SDK_SUPPORT_MINI_PLATFORM_VER}, ylh_sdk 不会运行也不会导致快应用异常`); }); }