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
JavaScript
/* 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 不会运行也不会导致快应用异常`);
});
}