From 78f5abaccdf81d41ded93a4f6919bf8789587e4f Mon Sep 17 00:00:00 2001 From: wtto00 Date: Tue, 15 Oct 2024 02:21:02 +0800 Subject: [PATCH] =?UTF-8?q?android=E6=96=87=E4=BB=B6=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .prettierrc | 7 + packages/cli/src/android/prepare.ts | 180 +++- .../android/templates/AndroidManifest.xml.ts | 223 +++-- .../src/android/templates/app-build.gradle.ts | 134 ++- .../android/templates/dcloud_control.xml.ts | 18 + packages/cli/src/app-plus/check.ts | 286 +++--- packages/common/src/manifest.config.ts | 942 +++++++++--------- 7 files changed, 1013 insertions(+), 777 deletions(-) create mode 100644 .prettierrc create mode 100644 packages/cli/src/android/templates/dcloud_control.xml.ts diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..3b2ce05 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "printWidth": 120, + "singleQuote": true, + "semi": false, + "trailingComma": "all", + "arrowParens": "always" +} diff --git a/packages/cli/src/android/prepare.ts b/packages/cli/src/android/prepare.ts index 7f334a2..3464959 100644 --- a/packages/cli/src/android/prepare.ts +++ b/packages/cli/src/android/prepare.ts @@ -1,17 +1,173 @@ -import type { AndroidManifest } from "./templates/AndroidManifest.xml"; -import type { AppBuildGradle } from "./templates/app-build.gradle"; -import type { BuildGradle } from "./templates/build.gradle"; -import type { Properties } from "./templates/dcloud_properties.xml"; -import type { Strings } from "./templates/strings.xml"; +import type { ManifestConfig } from '@uniapp-cli/common' +import { mergeActivity, mergeAndroidManifest, mergeRecord, type AndroidManifest } from './templates/AndroidManifest.xml' +import { mergeAppBuildGradle, mergeDependencies, type AppBuildGradle } from './templates/app-build.gradle' +import { mergeBuildGradle, type BuildGradle } from './templates/build.gradle' +import { mergeProperties, type Properties } from './templates/dcloud_properties.xml' +import type { Strings } from './templates/strings.xml' +import { mergeControl, type Control } from './templates/dcloud_control.xml' +import { resolve } from 'path' +import { readdirSync } from 'fs' +import { appendSet } from '../utils/util' export interface Results { - androidManifest: AndroidManifest; + androidManifest: AndroidManifest /** 所需要的依赖文件 */ - libs: Set; + libs: Set /** 要写入的的文件 */ - files: Record; - appBuildGradle: AppBuildGradle; - buildGradle: BuildGradle; - properties: Properties; - strings: Strings; + files: Record + appBuildGradle: AppBuildGradle + buildGradle: BuildGradle + properties: Properties + control: Control + strings: Strings +} + +function createEmptyRsults() { + return { + androidManifest: { + application: {}, + activity: {}, + }, + libs: new Set(), + files: {}, + appBuildGradle: {}, + buildGradle: { + repositories: new Set(), + dependencies: new Set(), + allRepositories: new Set(), + }, + properties: { + features: {}, + services: {}, + }, + control: { + appid: '', + }, + strings: {}, + } as Results +} + +export function mergeResults(results1: Results, results2: Results) { + const libs = new Set() + appendSet(libs, results1.libs) + appendSet(libs, results2.libs) + return { + androidManifest: mergeAndroidManifest(results1.androidManifest, results2.androidManifest), + libs, + files: { ...results1.files, ...results2.files }, + appBuildGradle: mergeAppBuildGradle(results1.appBuildGradle, results2.appBuildGradle), + buildGradle: mergeBuildGradle(results1.buildGradle, results2.buildGradle), + properties: mergeProperties(results1.properties, results2.properties), + control: mergeControl(results1.control, results2.control), + strings: { ...results1.strings, ...results2.strings }, + } as Results +} + +export function getDefaultLibs() { + const libs = new Set(['lib.5plus.base-release.aar', 'uniapp-v8-release.aar', 'breakpad-build-release.aar']) + + const libsPath = resolve(global.projectRoot, 'node_modules/uniapp-android/SDK/libs') + const files = readdirSync(libsPath, { encoding: 'utf8' }) + + const androidGifDrawableRelease = files.find((file) => file.startsWith('android-gif-drawable-release@')) + if (androidGifDrawableRelease) libs.add(androidGifDrawableRelease) + + const oaidSdk = files.find((file) => file.startsWith('oaid_sdk_')) + if (oaidSdk) libs.add(oaidSdk) + + return libs +} + +export function prepare(manifest: ManifestConfig): Results { + const results = createEmptyRsults() + + // name + results.strings['app_name'] = manifest.name ?? 'My UniApp' + // appid + results.control.appid = manifest.appid ?? '' + // versionName + results.appBuildGradle.versionName = manifest.versionName + // versionCode + results.appBuildGradle.versionCode = manifest.versionCode + // installApkSdk + if (manifest['app-plus']?.distribute?.android?.installApkSdk !== false) { + results.libs.add('install-apk-release.aar') + } + + const { + dcloud_appkey, + packagename, + schemes, + compileSdkVersion, + minSdkVersion, + targetSdkVersion, + abiFilters, + forceDarkAllowed, + } = manifest['app-plus']?.distribute?.android || {} + if (dcloud_appkey) { + results.androidManifest.metaData = mergeRecord(results.androidManifest.metaData, { + dcloud_appkey: { value: dcloud_appkey }, + }) + } + if (packagename) { + results.appBuildGradle.applicationId = packagename + results.androidManifest.package = packagename + } + results.appBuildGradle.compileSdkVersion = compileSdkVersion || 30 + results.appBuildGradle.minSdkVersion = minSdkVersion || 21 + results.appBuildGradle.targetSdkVersion = targetSdkVersion || 30 + results.appBuildGradle.abiFilters = new Set(abiFilters) + + if (schemes) { + const schemesArray = schemes.split(',').map((scheme) => scheme.trim()) + schemesArray.forEach((scheme) => { + results.androidManifest.activity['io.dcloud.PandoraEntry'].intentFilter = [] + results.androidManifest.activity = mergeActivity(results.androidManifest.activity, { + 'io.dcloud.PandoraEntry': { + properties: {}, + intentFilter: [ + { + action: new Set(['android.intent.action.VIEW']), + category: new Set(['android.intent.category.DEFAULT', 'android.intent.category.BROWSABLE']), + data: [{ 'android:scheme': scheme }], + }, + ], + }, + }) + }) + } + + if (forceDarkAllowed) { + results.androidManifest.metaData = mergeRecord(results.androidManifest.metaData, { + DCLOUD_DARK_MODE: { value: 'auto' }, + }) + } + + return results +} + +export function prepareUTS(uniModulesPath: string): Results { + const results = createEmptyRsults() + + const modules = readdirSync(uniModulesPath, { encoding: 'utf8' }) + if (modules.length > 0) { + results.libs.add('utsplugin-release.aar') + + results.appBuildGradle.dependencies = mergeDependencies(results.appBuildGradle.dependencies, { + 'com.squareup.okhttp3:okhttp:3.12.12': {}, + 'androidx.core:core-ktx:1.6.0': {}, + 'org.jetbrains.kotlin:kotlin-stdlib:1.8.10': {}, + 'org.jetbrains.kotlin:kotlin-reflect:1.6.0': {}, + 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.8': {}, + 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.8': {}, + 'com.github.getActivity:XXPermissions:18.0': {}, + }) + + modules.forEach((uts) => { + results.appBuildGradle.dependencies = mergeDependencies(results.appBuildGradle.dependencies, { + [`:${uts}`]: { project: true }, + }) + }) + } + return results } diff --git a/packages/cli/src/android/templates/AndroidManifest.xml.ts b/packages/cli/src/android/templates/AndroidManifest.xml.ts index 19b262e..96e5710 100644 --- a/packages/cli/src/android/templates/AndroidManifest.xml.ts +++ b/packages/cli/src/android/templates/AndroidManifest.xml.ts @@ -1,114 +1,131 @@ -import { generateSpace } from "../../utils/space"; +import { generateSpace } from '../../utils/space' -export type NodeProperties = Record; +export type NodeProperties = Record export interface MetaData { - resource?: string; - value?: string; + resource?: string + value?: string } export interface ActivityIntentFilter { /** intent-filter节点属性 */ - properties?: NodeProperties; + properties?: NodeProperties /** action节点 */ - action: Set; + action: Set /** category节点 */ - category?: Set; + category?: Set /** data节点 */ - data?: NodeProperties[]; + data?: NodeProperties[] } export interface Activity { /** activity节点属性 */ - properties: NodeProperties; - intentFilter?: ActivityIntentFilter[]; - metaData?: Record; + properties: NodeProperties + intentFilter?: ActivityIntentFilter[] + metaData?: Record } export interface AndroidManifest { - package?: string; + package?: string /** * 权限列表 * - true: 包含此权限 * - false: 移除此权限,tools:node="remove" */ - permissions?: Record; + permissions?: Record /** application节点属性 */ - application: NodeProperties; + application: NodeProperties /** key为android:name属性值 */ - activity: Record; + activity: Record /** meta-data节点, key为android:name属性值 */ - metaData?: Record; + metaData?: Record /** service节点, key为android:name属性值 */ - service?: Record; + service?: Record } export const defaultAndroidManifest: AndroidManifest = { + permissions: { + // 为了兼容android 13 新的权限要求,需要在AndroidManifest.xml 中新增下面的权限声明,以适配图片选择功能。 + 'android.permission.READ_MEDIA_IMAGES': true, + 'android.permission.READ_MEDIA_VIDEO': true, + }, application: { - "android:name": "io.dcloud.application.DCloudApplication", - "android:allowClearUserData": "true", - "android:icon": "@drawable/icon", - "android:label": "@string/app_name", - "android:largeHeap": "true", - "android:debuggable": "true", + 'android:name': 'io.dcloud.application.DCloudApplication', + 'android:allowClearUserData': 'true', + 'android:icon': '@drawable/icon', + 'android:label': '@string/app_name', + 'android:largeHeap': 'true', + 'android:debuggable': 'true', }, activity: { - "io.dcloud.PandoraEntry": { + 'io.dcloud.PandoraEntry': { properties: { - "android:configChanges": "orientation|keyboardHidden|keyboard|navigation", - "android:label": "@string/app_name", - "android:launchMode": "singleTask", - "android:hardwareAccelerated": "true", - "android:theme": "@style/TranslucentTheme", - "android:screenOrientation": "user", - "android:windowSoftInputMode": "adjustResize", + 'android:configChanges': 'orientation|keyboardHidden|keyboard|navigation', + 'android:label': '@string/app_name', + 'android:launchMode': 'singleTask', + 'android:hardwareAccelerated': 'true', + 'android:theme': '@style/TranslucentTheme', + 'android:screenOrientation': 'user', + 'android:windowSoftInputMode': 'adjustResize', }, intentFilter: [ { - action: new Set(["android.intent.action.MAIN"]), - category: new Set(["android.intent.category.LAUNCHER"]), + action: new Set(['android.intent.action.MAIN']), + category: new Set(['android.intent.category.LAUNCHER']), }, ], }, + 'io.dcloud.PandoraEntryActivity': { + properties: { + 'android:launchMode': 'singleTask', + 'android:configChanges': + 'orientation|keyboardHidden|screenSize|mcc|mnc|fontScale|keyboard|smallestScreenSize|screenLayout|screenSize|uiMode', + 'android:hardwareAccelerated': 'true', + 'android:permission': 'com.miui.securitycenter.permission.AppPermissionsEditor', + 'android:screenOrientation': 'user', + 'android:theme': '@style/DCloudTheme', + 'android:windowSoftInputMode': 'adjustResize', + }, + }, }, -}; +} /** false优先 */ function mergePermissions(permissions1?: Record, permissions2?: Record) { - const permissions: Record = {}; + const permissions: Record = {} for (const key in permissions1) { if (permissions1[key] === false || permissions2?.[key] === false) { - permissions[key] = false; + permissions[key] = false } else { - permissions[key] = permissions2?.[key] ?? permissions1[key]; + permissions[key] = permissions2?.[key] ?? permissions1[key] } } for (const key in permissions2) { - if (permissions[key] === false) continue; + if (permissions[key] === false) continue if (permissions[key] === undefined) { - permissions[key] = permissions2[key]; + permissions[key] = permissions2[key] } else if (permissions2[key] === false) { - permissions[key] = false; + permissions[key] = false } } - return permissions; + return permissions } -function mergeRecord(record1?: Record, record2?: Record) { - const metaData: Record = {}; +export function mergeRecord(record1?: Record, record2?: Record) { + const metaData: Record = {} for (const name in record1) { - metaData[name] = { ...record1[name], ...record2?.[name] }; + metaData[name] = { ...record1[name], ...record2?.[name] } } for (const name in record2) { if (!metaData[name]) { - metaData[name] = record2[name]; + metaData[name] = record2[name] } } - return metaData; + return metaData } -function mergeActivity(activity1?: Record, activity2?: Record) { - const activity: Record = {}; +export function mergeActivity(activity1?: Record, activity2?: Record) { + const activity: Record = {} for (const name in activity1) { if (activity2?.[name]) { activity[name] = { @@ -118,17 +135,17 @@ function mergeActivity(activity1?: Record, activity2?: Record< }, intentFilter: [...(activity1[name].intentFilter ?? []), ...(activity2[name].intentFilter ?? [])], metaData: mergeRecord(activity1[name].metaData, activity2[name].metaData), - }; + } } else { - activity[name] = activity1[name]; + activity[name] = activity1[name] } } for (const name in activity2) { if (!activity[name]) { - activity[name] = activity2[name]; + activity[name] = activity2[name] } } - return activity; + return activity } export function mergeAndroidManifest(manifest1: Partial, manifest2: Partial) { @@ -138,8 +155,8 @@ export function mergeAndroidManifest(manifest1: Partial, manife activity: mergeActivity(manifest1.activity, manifest2.activity), metaData: mergeRecord(manifest1.metaData, manifest2.metaData), service: mergeRecord(manifest1.service, manifest2.service), - }; - return manifest; + } + return manifest } export function generateAndroidManifest(manifest: AndroidManifest) { @@ -158,97 +175,97 @@ export function generateAndroidManifest(manifest: AndroidManifest) { ${generateService(manifest.service, 8)} -`; +` } function getPermissionTag(permission: string) { - if (permission.startsWith("android.permission")) return "uses-permission"; - if (permission.startsWith("android.hardware")) return "uses-feature"; - return ""; + if (permission.startsWith('android.permission')) return 'uses-permission' + if (permission.startsWith('android.hardware')) return 'uses-feature' + return '' } -function generatePermissions(permissions: AndroidManifest["permissions"] = {}) { - const permissionXML: string[] = []; +function generatePermissions(permissions: AndroidManifest['permissions'] = {}) { + const permissionXML: string[] = [] Object.keys(permissions).forEach((name) => { - const tag = getPermissionTag(name); + const tag = getPermissionTag(name) if (tag) { - permissionXML.push(`<${tag} android:name="${name}" ${permissions[name] ? "" : 'tools:node="remove" '}/>`); + permissionXML.push(`<${tag} android:name="${name}" ${permissions[name] ? '' : 'tools:node="remove" '}/>`) } - }); - return permissionXML.join("\n "); + }) + return permissionXML.join('\n ') } function generateProperties(properties: NodeProperties, space = 8) { - const propertiesXML: string[] = []; + const propertiesXML: string[] = [] Object.keys(properties).forEach((name) => { - propertiesXML.push(`${name}="${properties[name]}"`); - }); - return propertiesXML.join(`\n${generateSpace(space)}`); + propertiesXML.push(`${name}="${properties[name]}"`) + }) + return propertiesXML.join(`\n${generateSpace(space)}`) } function generateSet(tag: string, set?: Set, space = 16) { - if (!set) return ""; - const xml: string[] = []; - [...set].forEach((name) => { - xml.push(`<${tag} android:name="${name}" />`); - }); - return xml.join(`\n${generateSpace(space)}`); + if (!set) return '' + const xml: string[] = [] + ;[...set].forEach((name) => { + xml.push(`<${tag} android:name="${name}" />`) + }) + return xml.join(`\n${generateSpace(space)}`) } function generateIntentFilter(filters: ActivityIntentFilter[] = [], space = 12) { - const filtersXML: string[] = []; - const spaces = generateSpace(space); - const spacesSecond = spaces + " "; + const filtersXML: string[] = [] + const spaces = generateSpace(space) + const spacesSecond = spaces + ' ' filters.forEach((filter) => { - const filterProperties = filter.properties ? `\n${spacesSecond}${generateProperties(filter.properties)}` : ""; + const filterProperties = filter.properties ? `\n${spacesSecond}${generateProperties(filter.properties)}` : '' - const children: string[] = [generateSet("action", filter.action)]; - const category = generateSet("category", filter.category); - if (category) children.push(category); + const children: string[] = [generateSet('action', filter.action)] + const category = generateSet('category', filter.category) + if (category) children.push(category) if (filter.data) { filter.data.forEach((data) => { - children.push(``); - }); + children.push(``) + }) } filtersXML.push(` ${spacesSecond}${children.join(`\n${spacesSecond}`)} -${spaces}`); - }); - return filtersXML.join(`\n${spaces}`); +${spaces}`) + }) + return filtersXML.join(`\n${spaces}`) } function genderateMetaData(metaData: Record = {}, space = 12) { - const metaDataXML: string[] = []; + const metaDataXML: string[] = [] Object.keys(metaData).forEach((name) => { - const properties: string[] = []; - const { resource, value } = metaData[name]; + const properties: string[] = [] + const { resource, value } = metaData[name] if (resource) { - properties.push(`android:resource="${resource}"`); + properties.push(`android:resource="${resource}"`) } if (value) { - properties.push(`android:value="${value}"`); + properties.push(`android:value="${value}"`) } - metaDataXML.push(``); - }); - return metaDataXML.join(`\n${generateSpace(space)}`); + metaDataXML.push(``) + }) + return metaDataXML.join(`\n${generateSpace(space)}`) } -function generateActivity(activity: AndroidManifest["activity"]) { - const activityXml: string[] = []; +function generateActivity(activity: AndroidManifest['activity']) { + const activityXml: string[] = [] Object.keys(activity).forEach((name) => { activityXml.push(` ${generateIntentFilter(activity[name].intentFilter, 12)} ${genderateMetaData(activity[name].metaData, 12)} - `); - }); - return activityXml.join("\n\n "); + `) + }) + return activityXml.join('\n\n ') } function generateService(service: Record = {}, space = 8) { - const services: string[] = []; + const services: string[] = [] Object.keys(service).forEach((name) => { - services.push(``); - }); - return services.join(`\n${generateSpace(space)}`); + services.push(``) + }) + return services.join(`\n${generateSpace(space)}`) } diff --git a/packages/cli/src/android/templates/app-build.gradle.ts b/packages/cli/src/android/templates/app-build.gradle.ts index 8a13764..cda9579 100644 --- a/packages/cli/src/android/templates/app-build.gradle.ts +++ b/packages/cli/src/android/templates/app-build.gradle.ts @@ -1,102 +1,131 @@ -import { generateSpace } from "../../utils/space"; -import { appendSet } from "../../utils/util"; +import { generateSpace } from '../../utils/space' +import { appendSet } from '../../utils/util' export interface AppBuildGradleDependency { exclude?: { - group: string; - }; + group: string + } + project?: boolean } export interface AppBuildGradle { - dependencies?: Record; - manifestPlaceholders?: Record; - plugins?: Set; - compileSdkVersion?: number; - applicationId?: string; - minSdkVersion?: number; - targetSdkVersion?: number; - versionCode?: number; - versionName?: string; - abiFilters?: Set; + dependencies?: Record + manifestPlaceholders?: Record + plugins?: Set + compileSdkVersion?: number + applicationId?: string + minSdkVersion?: number + targetSdkVersion?: number + versionCode?: number + versionName?: string + abiFilters?: Set } export const defaultAppBuildGradle: AppBuildGradle = { - plugins: new Set(["com.android.application"]), + plugins: new Set(['com.android.application']), dependencies: { - "androidx.recyclerview:recyclerview:1.0.0": {}, - "com.facebook.fresco:fresco:2.5.0": {}, - "com.facebook.fresco:animated-gif:2.5.0": {}, + 'androidx.recyclerview:recyclerview:1.0.0': {}, + 'com.facebook.fresco:fresco:2.5.0': {}, + 'com.facebook.fresco:animated-gif:2.5.0': {}, - "androidx.appcompat:appcompat:1.0.0": {}, - "androidx.legacy:legacy-support-v4:1.0.0": {}, - "com.github.bumptech.glide:glide:4.9.0": {}, - "com.alibaba:fastjson:1.2.83": {}, - "androidx.webkit:webkit:1.3.0": {}, + 'androidx.appcompat:appcompat:1.0.0': {}, + 'androidx.legacy:legacy-support-v4:1.0.0': {}, + 'com.github.bumptech.glide:glide:4.9.0': {}, + 'com.alibaba:fastjson:1.2.83': {}, + 'androidx.webkit:webkit:1.3.0': {}, }, -}; + compileSdkVersion: 30, + minSdkVersion: 21, + targetSdkVersion: 30, + versionName: '1.0.0', + versionCode: 1000000, +} function mergeField( fieldName: T, buildGradle1?: AppBuildGradle, buildGradle2?: AppBuildGradle, ): AppBuildGradle[T] { - return buildGradle2?.[fieldName] ?? buildGradle1?.[fieldName]; + return buildGradle2?.[fieldName] ?? buildGradle1?.[fieldName] +} + +export function mergeDependencies( + dependencies1?: Record, + dependencies2?: Record, +) { + const dependencies: Record = {} + for (const name in dependencies1) { + if (!dependencies2?.[name]) { + dependencies[name] = dependencies1[name] + } else if (!dependencies1[name].exclude?.group || !dependencies2[name].exclude?.group) { + dependencies[name] = {} + } else { + dependencies[name] = { exclude: { group: dependencies2[name].exclude?.group } } + } + } + for (const name in dependencies2) { + if (dependencies[name]) continue + dependencies[name] = dependencies2[name] + } + return dependencies } export function mergeAppBuildGradle(buildGradle1?: AppBuildGradle, buildGradle2?: AppBuildGradle) { const buildGradle: AppBuildGradle = { - compileSdkVersion: mergeField("compileSdkVersion", buildGradle1, buildGradle2), - applicationId: mergeField("applicationId", buildGradle1, buildGradle2), - minSdkVersion: mergeField("minSdkVersion", buildGradle1, buildGradle2), - targetSdkVersion: mergeField("targetSdkVersion", buildGradle1, buildGradle2), - versionCode: mergeField("versionCode", buildGradle1, buildGradle2), - versionName: mergeField("versionName", buildGradle1, buildGradle2), + compileSdkVersion: mergeField('compileSdkVersion', buildGradle1, buildGradle2), + applicationId: mergeField('applicationId', buildGradle1, buildGradle2), + minSdkVersion: mergeField('minSdkVersion', buildGradle1, buildGradle2), + targetSdkVersion: mergeField('targetSdkVersion', buildGradle1, buildGradle2), + versionCode: mergeField('versionCode', buildGradle1, buildGradle2), + versionName: mergeField('versionName', buildGradle1, buildGradle2), abiFilters: new Set(), plugins: new Set(), manifestPlaceholders: { ...buildGradle1?.manifestPlaceholders, ...buildGradle2?.manifestPlaceholders, }, - dependencies: {}, - }; - appendSet(buildGradle.abiFilters!, buildGradle1?.abiFilters); - appendSet(buildGradle.abiFilters!, buildGradle2?.abiFilters); - appendSet(buildGradle.plugins!, buildGradle1?.plugins); - appendSet(buildGradle.plugins!, buildGradle2?.plugins); + dependencies: mergeDependencies(buildGradle1?.dependencies, buildGradle2?.dependencies), + } + appendSet(buildGradle.abiFilters!, buildGradle1?.abiFilters) + appendSet(buildGradle.abiFilters!, buildGradle2?.abiFilters) + appendSet(buildGradle.plugins!, buildGradle1?.plugins) + appendSet(buildGradle.plugins!, buildGradle2?.plugins) for (const dependencie in buildGradle1?.dependencies) { if (buildGradle2?.dependencies?.[dependencie]) { } } - return buildGradle; + return buildGradle } function genderateAppBuildGradlePlugins(plugins?: Set) { - if (!plugins) return ""; - const xml: string[] = []; + if (!plugins) return '' + const xml: string[] = [] for (const plugin of plugins) { - xml.push(`apply plugin: '${plugin}`); + xml.push(`apply plugin: '${plugin}`) } - return xml.join("\n"); + return xml.join('\n') } function genderateAppBuildGradleManifestPlaceholders(manifestPlaceholders?: Record) { - const xml: string[] = []; + const xml: string[] = [] for (const key in manifestPlaceholders) { - xml.push(`"${key}": "${manifestPlaceholders[key]}",`); + xml.push(`"${key}": "${manifestPlaceholders[key]}",`) } - return xml.join(`\n${generateSpace(16)}`); + return xml.join(`\n${generateSpace(16)}`) } function genderateAppBuildGradleDependencies(dependencies?: Record) { - const xml: string[] = []; + const xml: string[] = [] for (const name in dependencies) { if (dependencies[name].exclude?.group) { - xml.push(`implementation('${name}'){ exclude(group: '${dependencies[name].exclude.group}') }`); + xml.push(`implementation('${name}'){ exclude(group: '${dependencies[name].exclude.group}') }`) + } else if (dependencies[name].project) { + xml.push(`implementation project('${name}')`) } else { - xml.push(`implementation '${name}'`); + xml.push(`implementation '${name}'`) } } - return xml.join(`\n${generateSpace(4)}`); + return xml.join(`\n${generateSpace(4)}`) } export function genderateAppBuildGradle(buildGradle: AppBuildGradle) { @@ -113,7 +142,7 @@ android { versionName "${buildGradle.versionName}" multiDexEnabled true ndk { - abiFilters ${[...(buildGradle.abiFilters || [])]?.map((item) => `'${item}'`).join(", ")} + abiFilters ${[...(buildGradle.abiFilters || [])]?.map((item) => `'${item}'`).join(', ')} } manifestPlaceholders = [ ${genderateAppBuildGradleManifestPlaceholders(buildGradle.manifestPlaceholders)} @@ -163,10 +192,9 @@ repositories { } } dependencies { - implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation fileTree(include: ['*.aar'], dir: 'libs') + implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: []) ${genderateAppBuildGradleDependencies(buildGradle.dependencies)} } -`; +` } diff --git a/packages/cli/src/android/templates/dcloud_control.xml.ts b/packages/cli/src/android/templates/dcloud_control.xml.ts new file mode 100644 index 0000000..bce5178 --- /dev/null +++ b/packages/cli/src/android/templates/dcloud_control.xml.ts @@ -0,0 +1,18 @@ +export interface Control { + appid: string +} + +export function mergeControl(control1?: Control, control2?: Control) { + return { + appid: control2?.appid || control1?.appid || '', + } as Control +} + +export function genderateDcloudControl(control: Control) { + return ` + + + + +` +} diff --git a/packages/cli/src/app-plus/check.ts b/packages/cli/src/app-plus/check.ts index efb21d1..15eb745 100644 --- a/packages/cli/src/app-plus/check.ts +++ b/packages/cli/src/app-plus/check.ts @@ -1,213 +1,217 @@ -import { AppPlusOS, type ManifestConfig } from "@uniapp-cli/common"; +import { AppPlusOS, type ManifestConfig } from '@uniapp-cli/common' export function checkConfig(manifest: ManifestConfig, os = AppPlusOS.Android) { if (!manifest) { - throw Error("文件manifest.json解析失败"); + throw Error('文件manifest.json解析失败') } // name if (!manifest.name) { - throw Error("请在文件manifest.json中配置应用名称: name"); + throw Error('请在文件manifest.json中配置应用名称: name') } // appid if (!manifest.appid) { - throw Error("请在文件manifest.json中配置应用appid: appid"); + throw Error('请在文件manifest.json中配置应用appid: appid') } // versionName if (!manifest.versionName) { - throw Error("请在文件manifest.json中配置应用版本号: versionName"); + throw Error('请在文件manifest.json中配置应用版本号: versionName') } // versionCode if (!manifest.versionCode) { - throw Error("请在文件manifest.json中配置应用版本码: versionCode"); + throw Error('请在文件manifest.json中配置应用版本码: versionCode') } // dcloud_appkey if ( - (os === AppPlusOS.Android && !manifest["app-plus"]?.distribute?.android?.dcloud_appkey) || - (os === AppPlusOS.iOS && !manifest["app-plus"]?.distribute?.ios?.dcloud_appkey) + (os === AppPlusOS.Android && !manifest['app-plus']?.distribute?.android?.dcloud_appkey) || + (os === AppPlusOS.iOS && !manifest['app-plus']?.distribute?.ios?.dcloud_appkey) ) { - throw Error(`请在文件manifest.json中配置应用Appkey: app-plus.distribute.${os}.dcloud_appkey`); + throw Error(`请在文件manifest.json中配置应用Appkey: app-plus.distribute.${os}.dcloud_appkey`) } // packagename - if (os === AppPlusOS.Android && !manifest["app-plus"]?.distribute?.android?.packagename) { - throw Error(`请在文件manifest.json中配置应用包名: app-plus.distribute.android.packagename`); + if (os === AppPlusOS.Android && !manifest['app-plus']?.distribute?.android?.packagename) { + throw Error(`请在文件manifest.json中配置应用包名: app-plus.distribute.android.packagename`) } - if (os === AppPlusOS.iOS && !manifest["app-plus"]?.distribute?.ios?.appid) { - throw Error(`请在文件manifest.json中配置应用包名: app-plus.distribute.ios.appid`); + if (os === AppPlusOS.iOS && !manifest['app-plus']?.distribute?.ios?.appid) { + throw Error(`请在文件manifest.json中配置应用包名: app-plus.distribute.ios.appid`) } + if (os === AppPlusOS.Android && !manifest['app-plus']?.distribute?.android?.abiFilters?.length) { + throw Error(`请在文件manifest.json中配置应用所支持的CPU类型: app-plus.distribute.android.abiFilters`) + } + // OAuth - const { OAuth, Share, Payment, Geolocation, Maps, Statistic } = manifest["app-plus"]?.modules || {}; - const { oauth, share, payment, geolocation, maps, statics } = manifest["app-plus"]?.distribute?.sdkConfigs || {}; + const { OAuth, Share, Payment, Geolocation, Maps, Statistic } = manifest['app-plus']?.modules || {} + const { oauth, share, payment, geolocation, maps, statics } = manifest['app-plus']?.distribute?.sdkConfigs || {} - let oauthWeixinAppid = ""; - let oauthWeixinLink = ""; - let oauthQQAppid = ""; - let oauthQQLink = ""; - let oauthSinaAppKey = ""; - let oauthSinaRedirectUri = ""; - let oauthSinaLink = ""; + let oauthWeixinAppid = '' + let oauthWeixinLink = '' + let oauthQQAppid = '' + let oauthQQLink = '' + let oauthSinaAppKey = '' + let oauthSinaRedirectUri = '' + let oauthSinaLink = '' if (OAuth) { if (oauth?.weixin) { - oauthWeixinAppid = oauth.weixin.appid ?? ""; + oauthWeixinAppid = oauth.weixin.appid ?? '' if (!oauthWeixinAppid) { throw Error( - "您配置了微信登陆,请在文件manifest.json中配置微信登陆的Appid: app-plus.distribute.sdkConfigs.oauth.weixin.appid", - ); + '您配置了微信登陆,请在文件manifest.json中配置微信登陆的Appid: app-plus.distribute.sdkConfigs.oauth.weixin.appid', + ) } if (os == AppPlusOS.iOS) { - oauthWeixinLink = oauth.weixin.UniversalLinks ?? ""; + oauthWeixinLink = oauth.weixin.UniversalLinks ?? '' if (!oauthWeixinLink) { throw Error( - "您配置了微信登陆,请在文件manifest.json中配置微信登陆的iOS平台通用链接: app-plus.distribute.sdkConfigs.oauth.weixin.UniversalLinks", - ); + '您配置了微信登陆,请在文件manifest.json中配置微信登陆的iOS平台通用链接: app-plus.distribute.sdkConfigs.oauth.weixin.UniversalLinks', + ) } } } if (oauth?.qq) { - oauthQQAppid = oauth.qq.appid ?? ""; + oauthQQAppid = oauth.qq.appid ?? '' if (!oauthQQAppid) { throw Error( - "您配置了QQ登陆,请在文件manifest.json中配置QQ登陆的Appid: app-plus.distribute.sdkConfigs.oauth.qq.appid", - ); + '您配置了QQ登陆,请在文件manifest.json中配置QQ登陆的Appid: app-plus.distribute.sdkConfigs.oauth.qq.appid', + ) } if (os == AppPlusOS.iOS) { - oauthQQLink = oauth.qq.UniversalLinks ?? ""; + oauthQQLink = oauth.qq.UniversalLinks ?? '' if (!oauthQQLink) { throw Error( - "您配置了QQ登陆,请在文件manifest.json中配置QQ登陆的iOS平台通用链接: app-plus.distribute.sdkConfigs.oauth.qq.UniversalLinks", - ); + '您配置了QQ登陆,请在文件manifest.json中配置QQ登陆的iOS平台通用链接: app-plus.distribute.sdkConfigs.oauth.qq.UniversalLinks', + ) } } } if (oauth?.sina) { - oauthSinaAppKey = oauth.sina.appkey ?? ""; - oauthSinaRedirectUri = oauth.sina.redirect_uri ?? ""; + oauthSinaAppKey = oauth.sina.appkey ?? '' + oauthSinaRedirectUri = oauth.sina.redirect_uri ?? '' if (!oauthSinaAppKey) { throw Error( - "您配置了新浪微博登陆,请在文件manifest.json中配置新浪微博登陆的AppKey: app-plus.distribute.sdkConfigs.oauth.sina.appkey", - ); + '您配置了新浪微博登陆,请在文件manifest.json中配置新浪微博登陆的AppKey: app-plus.distribute.sdkConfigs.oauth.sina.appkey', + ) } if (!oauthSinaRedirectUri) { throw Error( - "您配置了新浪微博登陆,请在文件manifest.json中配置新浪微博登陆的回调页地址: app-plus.distribute.sdkConfigs.oauth.sina.redirect_uri", - ); + '您配置了新浪微博登陆,请在文件manifest.json中配置新浪微博登陆的回调页地址: app-plus.distribute.sdkConfigs.oauth.sina.redirect_uri', + ) } if (os == AppPlusOS.iOS) { - oauthSinaLink = oauth.sina.UniversalLinks ?? ""; + oauthSinaLink = oauth.sina.UniversalLinks ?? '' if (!oauthSinaLink) { throw Error( - "您配置了新浪微博登陆,请在文件manifest.json中配置新浪微博登陆的iOS平台通用链接: app-plus.distribute.sdkConfigs.oauth.sina.UniversalLinks", - ); + '您配置了新浪微博登陆,请在文件manifest.json中配置新浪微博登陆的iOS平台通用链接: app-plus.distribute.sdkConfigs.oauth.sina.UniversalLinks', + ) } } } if (oauth?.google) { if (os === AppPlusOS.iOS && !oauth.google.clientid) { throw Error( - "您配置了Google登陆,请在文件manifest.json中配置Google登陆的iOS平台客户端ID: app-plus.distribute.sdkConfigs.oauth.google.clientid", - ); + '您配置了Google登陆,请在文件manifest.json中配置Google登陆的iOS平台客户端ID: app-plus.distribute.sdkConfigs.oauth.google.clientid', + ) } } if (oauth?.facebook) { if (!oauth.facebook.appid) { throw Error( - "您配置了Facebook登陆,请在文件manifest.json中配置Facebook登陆的应用编号: app-plus.distribute.sdkConfigs.oauth.facebook.appid", - ); + '您配置了Facebook登陆,请在文件manifest.json中配置Facebook登陆的应用编号: app-plus.distribute.sdkConfigs.oauth.facebook.appid', + ) } if (!oauth.facebook.client_token) { throw Error( - "您配置了Facebook登陆,请在文件manifest.json中配置Facebook登陆的client_token: app-plus.distribute.sdkConfigs.oauth.facebook.client_token", - ); + '您配置了Facebook登陆,请在文件manifest.json中配置Facebook登陆的client_token: app-plus.distribute.sdkConfigs.oauth.facebook.client_token', + ) } } if (oauth?.univerify) { if (!oauth.univerify.appid) { throw Error( - "您配置了一键登陆,请在文件manifest.json中配置一键登陆的Appid: app-plus.distribute.sdkConfigs.oauth.univerify.appid\n请前往https://dev.dcloud.net.cn/一键登录->基础配置->一键登录应用ID获取", - ); + '您配置了一键登陆,请在文件manifest.json中配置一键登陆的Appid: app-plus.distribute.sdkConfigs.oauth.univerify.appid\n请前往https://dev.dcloud.net.cn/一键登录->基础配置->一键登录应用ID获取', + ) } } } - let shareWeixinAppid = ""; - let shareWeixinLink = ""; - let shareQQAppid = ""; - let shareQQLink = ""; - let shareSinaAppKey = ""; - let shareSinaRedirectUri = ""; - let shareSinaLink = ""; + let shareWeixinAppid = '' + let shareWeixinLink = '' + let shareQQAppid = '' + let shareQQLink = '' + let shareSinaAppKey = '' + let shareSinaRedirectUri = '' + let shareSinaLink = '' if (Share) { if (share?.weixin) { - shareWeixinAppid = share.weixin.appid ?? ""; + shareWeixinAppid = share.weixin.appid ?? '' if (!shareWeixinAppid) { throw Error( - "您配置了微信分享,请在文件manifest.json中配置微信分享的Appid: app-plus.distribute.sdkConfigs.share.weixin.appid", - ); + '您配置了微信分享,请在文件manifest.json中配置微信分享的Appid: app-plus.distribute.sdkConfigs.share.weixin.appid', + ) } if (os == AppPlusOS.iOS) { - shareWeixinLink = share.weixin.UniversalLinks ?? ""; + shareWeixinLink = share.weixin.UniversalLinks ?? '' if (!shareWeixinLink) { throw Error( - "您配置了微信分享,请在文件manifest.json中配置微信分享的iOS平台通用链接: app-plus.distribute.sdkConfigs.share.weixin.UniversalLinks", - ); + '您配置了微信分享,请在文件manifest.json中配置微信分享的iOS平台通用链接: app-plus.distribute.sdkConfigs.share.weixin.UniversalLinks', + ) } } } if (share?.qq) { - shareQQAppid = share.qq.appid ?? ""; + shareQQAppid = share.qq.appid ?? '' if (!shareQQAppid) { throw Error( - "您配置了QQ分享,请在文件manifest.json中配置QQ分享的Appid: app-plus.distribute.sdkConfigs.share.qq.appid", - ); + '您配置了QQ分享,请在文件manifest.json中配置QQ分享的Appid: app-plus.distribute.sdkConfigs.share.qq.appid', + ) } if (os == AppPlusOS.iOS) { - shareQQLink = share.qq.UniversalLinks ?? ""; + shareQQLink = share.qq.UniversalLinks ?? '' if (!shareQQLink) { throw Error( - "您配置了QQ分享,请在文件manifest.json中配置QQ分享的iOS平台通用链接: app-plus.distribute.sdkConfigs.share.qq.UniversalLinks", - ); + '您配置了QQ分享,请在文件manifest.json中配置QQ分享的iOS平台通用链接: app-plus.distribute.sdkConfigs.share.qq.UniversalLinks', + ) } } } if (share?.sina) { - shareSinaAppKey = share.sina.appkey ?? ""; - shareSinaRedirectUri = share.sina.redirect_uri ?? ""; + shareSinaAppKey = share.sina.appkey ?? '' + shareSinaRedirectUri = share.sina.redirect_uri ?? '' if (!shareSinaAppKey) { throw Error( - "您配置了新浪微博分享,请在文件manifest.json中配置新浪微博分享的AppKey: app-plus.distribute.sdkConfigs.share.sina.appkey", - ); + '您配置了新浪微博分享,请在文件manifest.json中配置新浪微博分享的AppKey: app-plus.distribute.sdkConfigs.share.sina.appkey', + ) } if (!shareSinaRedirectUri) { throw Error( - "您配置了新浪微博分享,请在文件manifest.json中配置新浪微博分享的回调页地址: app-plus.distribute.sdkConfigs.share.sina.redirect_uri", - ); + '您配置了新浪微博分享,请在文件manifest.json中配置新浪微博分享的回调页地址: app-plus.distribute.sdkConfigs.share.sina.redirect_uri', + ) } if (os == AppPlusOS.iOS) { - shareSinaLink = share.sina.UniversalLinks ?? ""; + shareSinaLink = share.sina.UniversalLinks ?? '' if (!shareSinaLink) { throw Error( - "您配置了新浪微博分享,请在文件manifest.json中配置新浪微博分享的iOS平台通用链接: app-plus.distribute.sdkConfigs.share.sina.UniversalLinks", - ); + '您配置了新浪微博分享,请在文件manifest.json中配置新浪微博分享的iOS平台通用链接: app-plus.distribute.sdkConfigs.share.sina.UniversalLinks', + ) } } } } - let paymentWeixinAppid = ""; - let paymentWeixinLink = ""; + let paymentWeixinAppid = '' + let paymentWeixinLink = '' if (Payment) { if (payment?.weixin && payment.weixin.__platform__?.includes(os)) { - paymentWeixinAppid = payment.weixin.appid ?? ""; + paymentWeixinAppid = payment.weixin.appid ?? '' if (!paymentWeixinAppid) { throw Error( - "您配置了微信支付,请在文件manifest.json中配置微信支付的Appid: app-plus.distribute.sdkConfigs.payment.weixin.appid", - ); + '您配置了微信支付,请在文件manifest.json中配置微信支付的Appid: app-plus.distribute.sdkConfigs.payment.weixin.appid', + ) } if (os == AppPlusOS.iOS) { - paymentWeixinLink = payment.weixin.UniversalLinks ?? ""; + paymentWeixinLink = payment.weixin.UniversalLinks ?? '' if (!paymentWeixinLink) { throw Error( - "您配置了微信支付,请在文件manifest.json中配置微信支付的iOS平台通用链接: app-plus.distribute.sdkConfigs.payment.weixin.UniversalLinks", - ); + '您配置了微信支付,请在文件manifest.json中配置微信支付的iOS平台通用链接: app-plus.distribute.sdkConfigs.payment.weixin.UniversalLinks', + ) } } } @@ -218,28 +222,28 @@ export function checkConfig(manifest: ManifestConfig, os = AppPlusOS.Android) { ) { throw Error( `您配置了Paypal支付,请在文件manifest.json中配置Paypal支付的返回URL地址: app-plus.distribute.sdkConfigs.payment.paypal.${ - os === AppPlusOS.Android ? "returnURL_android" : "returnURL_ios" + os === AppPlusOS.Android ? 'returnURL_android' : 'returnURL_ios' }`, - ); + ) } } if (payment?.stripe && payment.stripe.__platform__?.includes(os)) { if (os === AppPlusOS.iOS && !payment.stripe.returnURL_ios) { throw Error( - "您配置了Stripe支付,请在文件manifest.json中配置Stripe支付的返回URL地址: app-plus.distribute.sdkConfigs.payment.stripe.returnURL_ios", - ); + '您配置了Stripe支付,请在文件manifest.json中配置Stripe支付的返回URL地址: app-plus.distribute.sdkConfigs.payment.stripe.returnURL_ios', + ) } } } - let geolocationBaiduAppKey = ""; + let geolocationBaiduAppKey = '' if (Geolocation) { if (geolocation?.amap) { if (geolocation.amap.__platform__?.includes(os)) { if (!geolocation.amap.name) { throw Error( - "您配置了高德定位,请在文件manifest.json中配置高德定位的用户名: app-plus.distribute.sdkConfigs.geolocation.amap.name", - ); + '您配置了高德定位,请在文件manifest.json中配置高德定位的用户名: app-plus.distribute.sdkConfigs.geolocation.amap.name', + ) } if ( (os == AppPlusOS.Android && !geolocation.amap.appkey_android) || @@ -247,25 +251,25 @@ export function checkConfig(manifest: ManifestConfig, os = AppPlusOS.Android) { ) { throw Error( `您配置了高德定位,请在文件manifest.json中配置高德定位的AppKey: app-plus.distribute.sdkConfigs.geolocation.amap.${ - os === AppPlusOS.Android ? "appkey_android" : "appkey_ios" + os === AppPlusOS.Android ? 'appkey_android' : 'appkey_ios' }`, - ); + ) } } } if (geolocation?.baidu) { if (geolocation.baidu.__platform__?.includes(os)) { geolocationBaiduAppKey = - (os == AppPlusOS.Android ? geolocation.baidu.appkey_android : geolocation.baidu.appkey_ios) ?? ""; + (os == AppPlusOS.Android ? geolocation.baidu.appkey_android : geolocation.baidu.appkey_ios) ?? '' if ( (os == AppPlusOS.Android && !geolocation.baidu.appkey_android) || (os == AppPlusOS.iOS && !geolocation.baidu.appkey_ios) ) { throw Error( `您配置了百度定位,请在文件manifest.json中配置百度定位的AppKey: app-plus.distribute.sdkConfigs.geolocation.baidu.${ - os === AppPlusOS.Android ? "appkey_android" : "appkey_ios" + os === AppPlusOS.Android ? 'appkey_android' : 'appkey_ios' }`, - ); + ) } } } @@ -279,9 +283,9 @@ export function checkConfig(manifest: ManifestConfig, os = AppPlusOS.Android) { ) { throw Error( `您配置了友盟统计,请在文件manifest.json中配置友盟统计的AppKey: app-plus.distribute.sdkConfigs.statics.umeng.${ - os === AppPlusOS.Android ? "appkey_android" : "appkey_ios" + os === AppPlusOS.Android ? 'appkey_android' : 'appkey_ios' }`, - ); + ) } if ( (os === AppPlusOS.Android && !statics.umeng.channelid_android) || @@ -289,9 +293,9 @@ export function checkConfig(manifest: ManifestConfig, os = AppPlusOS.Android) { ) { throw Error( `您配置了友盟统计,请在文件manifest.json中配置友盟统计的渠道ID: app-plus.distribute.sdkConfigs.statics.umeng.${ - os === AppPlusOS.Android ? "channelid_android" : "channelid_ios" + os === AppPlusOS.Android ? 'channelid_android' : 'channelid_ios' }`, - ); + ) } } if (statics?.google) { @@ -301,37 +305,37 @@ export function checkConfig(manifest: ManifestConfig, os = AppPlusOS.Android) { ) { throw Error( `您配置了Google统计,请在文件manifest.json中配置Google统计的配置文件位置: app-plus.distribute.sdkConfigs.statics.google.${ - os === AppPlusOS.Android ? "config_android" : "config_ios" + os === AppPlusOS.Android ? 'config_android' : 'config_ios' }`, - ); + ) } } } - let mapsBaiduAppKey = ""; + let mapsBaiduAppKey = '' if (Maps) { if (maps?.amap) { if (!maps.amap.name) { throw Error( - "您配置了高德地图,请在文件manifest.json中配置高德地图的用户名: app-plus.distribute.sdkConfigs.maps.amap.name", - ); + '您配置了高德地图,请在文件manifest.json中配置高德地图的用户名: app-plus.distribute.sdkConfigs.maps.amap.name', + ) } if ((os == AppPlusOS.Android && !maps.amap.appkey_android) || (os == AppPlusOS.iOS && !maps.amap.appkey_ios)) { throw Error( `您配置了高德地图,请在文件manifest.json中配置高德地图的AppKey: app-plus.distribute.sdkConfigs.maps.amap.${ - os === AppPlusOS.Android ? "appkey_android" : "appkey_ios" + os === AppPlusOS.Android ? 'appkey_android' : 'appkey_ios' }`, - ); + ) } } if (maps?.baidu) { - mapsBaiduAppKey = (os == AppPlusOS.Android ? maps.baidu.appkey_android : maps.baidu.appkey_ios) ?? ""; + mapsBaiduAppKey = (os == AppPlusOS.Android ? maps.baidu.appkey_android : maps.baidu.appkey_ios) ?? '' if ((os == AppPlusOS.Android && !maps.baidu.appkey_android) || (os == AppPlusOS.iOS && !maps.baidu.appkey_ios)) { throw Error( `您配置了百度地图,请在文件manifest.json中配置百度地图的AppKey: app-plus.distribute.sdkConfigs.maps.baidu.${ - os === AppPlusOS.Android ? "appkey_android" : "appkey_ios" + os === AppPlusOS.Android ? 'appkey_android' : 'appkey_ios' }`, - ); + ) } } if (maps?.google) { @@ -341,9 +345,9 @@ export function checkConfig(manifest: ManifestConfig, os = AppPlusOS.Android) { ) { throw Error( `您配置了Google地图,请在文件manifest.json中配置Google地图的APIKey: app-plus.distribute.sdkConfigs.maps.google.${ - os === AppPlusOS.Android ? "APIKey_android" : "APIKey_ios" + os === AppPlusOS.Android ? 'APIKey_android' : 'APIKey_ios' }`, - ); + ) } } } @@ -351,78 +355,78 @@ export function checkConfig(manifest: ManifestConfig, os = AppPlusOS.Android) { // 微信SDK的appid应保持一致 if (oauthWeixinAppid && shareWeixinAppid && oauthWeixinAppid !== shareWeixinAppid) { throw Error( - "微信登陆和微信分享的Appid需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.weixin.appid, app-plus.distribute.sdkConfigs.share.weixin.appid", - ); + '微信登陆和微信分享的Appid需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.weixin.appid, app-plus.distribute.sdkConfigs.share.weixin.appid', + ) } if (shareWeixinAppid && paymentWeixinAppid && shareWeixinAppid !== paymentWeixinAppid) { throw Error( - "微信分享和微信支付的Appid需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.share.weixin.appid, app-plus.distribute.sdkConfigs.payment.weixin.appid", - ); + '微信分享和微信支付的Appid需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.share.weixin.appid, app-plus.distribute.sdkConfigs.payment.weixin.appid', + ) } if (oauthWeixinAppid && paymentWeixinAppid && oauthWeixinAppid !== paymentWeixinAppid) { throw Error( - "微信登陆和微信支付的Appid需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.weixin.appid, app-plus.distribute.sdkConfigs.payment.weixin.appid", - ); + '微信登陆和微信支付的Appid需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.weixin.appid, app-plus.distribute.sdkConfigs.payment.weixin.appid', + ) } // 微信SDK的通用链接应保持一致 if (oauthWeixinLink && shareWeixinLink && oauthWeixinLink !== shareWeixinLink) { throw Error( - "微信登陆和微信分享的iOS平台通用链接需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.weixin.UniversalLinks, app-plus.distribute.sdkConfigs.share.weixin.UniversalLinks", - ); + '微信登陆和微信分享的iOS平台通用链接需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.weixin.UniversalLinks, app-plus.distribute.sdkConfigs.share.weixin.UniversalLinks', + ) } if (shareWeixinLink && paymentWeixinLink && shareWeixinLink !== paymentWeixinLink) { throw Error( - "微信分享和微信支付的iOS平台通用链接需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.share.weixin.UniversalLinks, app-plus.distribute.sdkConfigs.payment.weixin.UniversalLinks", - ); + '微信分享和微信支付的iOS平台通用链接需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.share.weixin.UniversalLinks, app-plus.distribute.sdkConfigs.payment.weixin.UniversalLinks', + ) } if (oauthWeixinLink && paymentWeixinLink && oauthWeixinLink !== paymentWeixinLink) { throw Error( - "微信登陆和微信支付的iOS平台通用链接需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.weixin.UniversalLinks, app-plus.distribute.sdkConfigs.payment.weixin.UniversalLinks", - ); + '微信登陆和微信支付的iOS平台通用链接需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.weixin.UniversalLinks, app-plus.distribute.sdkConfigs.payment.weixin.UniversalLinks', + ) } // QQ登录和QQ分享的appid应保持一致 if (oauthQQAppid && shareQQAppid && oauthQQAppid !== shareQQAppid) { throw Error( - "QQ登陆和QQ分享的Appid需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.qq.appid, app-plus.distribute.sdkConfigs.share.qq.appid", - ); + 'QQ登陆和QQ分享的Appid需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.qq.appid, app-plus.distribute.sdkConfigs.share.qq.appid', + ) } // QQ登录和QQ分享的通用链接应保持一致 if (oauthQQLink && shareQQLink && oauthQQLink !== shareQQLink) { throw Error( - "QQ登陆和QQ分享的iOS平台通用链接需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.qq.UniversalLinks, app-plus.distribute.sdkConfigs.share.qq.UniversalLinks", - ); + 'QQ登陆和QQ分享的iOS平台通用链接需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.qq.UniversalLinks, app-plus.distribute.sdkConfigs.share.qq.UniversalLinks', + ) } // 微博登录和微博分享的appkey和redirect_uri和通用链接应保持一致 if (oauthSinaAppKey && shareSinaAppKey && oauthSinaAppKey !== shareSinaAppKey) { throw Error( - "新浪微博登陆和新浪微博分享的AppKey需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.sina.appkey, app-plus.distribute.sdkConfigs.share.sina.appkey", - ); + '新浪微博登陆和新浪微博分享的AppKey需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.sina.appkey, app-plus.distribute.sdkConfigs.share.sina.appkey', + ) } if (oauthSinaRedirectUri && shareSinaRedirectUri && oauthSinaRedirectUri !== shareSinaRedirectUri) { throw Error( - "新浪微博登陆和新浪微博分享的回调页地址需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.sina.redirect_uri, app-plus.distribute.sdkConfigs.share.sina.redirect_uri", - ); + '新浪微博登陆和新浪微博分享的回调页地址需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.sina.redirect_uri, app-plus.distribute.sdkConfigs.share.sina.redirect_uri', + ) } if (oauthSinaLink && shareSinaLink && oauthSinaLink !== shareSinaLink) { throw Error( - "新浪微博登陆和新浪微博分享的iOS平台通用链接需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.sina.UniversalLinks, app-plus.distribute.sdkConfigs.share.sina.UniversalLinks", - ); + '新浪微博登陆和新浪微博分享的iOS平台通用链接需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.oauth.sina.UniversalLinks, app-plus.distribute.sdkConfigs.share.sina.UniversalLinks', + ) } // 百度地图和百度定位appKey应保持一致 if (geolocationBaiduAppKey && mapsBaiduAppKey && geolocationBaiduAppKey !== mapsBaiduAppKey) { - const fieldName = os === AppPlusOS.Android ? "appkey_android" : "appkey_ios"; + const fieldName = os === AppPlusOS.Android ? 'appkey_android' : 'appkey_ios' throw Error( `百度地图和百度定位的AppKey需要配置一致,请在文件manifest.json中检查配置: app-plus.distribute.sdkConfigs.geolocation.baidu.${fieldName}, app-plus.distribute.sdkConfigs.maps.baidu.${fieldName}`, - ); + ) } // 高德定位与高德地图SDK集成冲突 需要注意 如果集成地图无须再配置定位 if (Map && maps?.amap?.name && Geolocation && geolocation?.amap?.name) { throw Error( - "您已经配置了高德地图,无需再配置高德定位,此两项冲突,请在文件manifest.json中删除配置项: app-plus.distribute.sdkConfigs.geolocation.amap", - ); + '您已经配置了高德地图,无需再配置高德定位,此两项冲突,请在文件manifest.json中删除配置项: app-plus.distribute.sdkConfigs.geolocation.amap', + ) } } diff --git a/packages/common/src/manifest.config.ts b/packages/common/src/manifest.config.ts index 6bc205a..3825e80 100644 --- a/packages/common/src/manifest.config.ts +++ b/packages/common/src/manifest.config.ts @@ -4,150 +4,150 @@ export interface NetworkTimeout { * 单位为 ms * 默认为 60000 */ - request?: number; + request?: number /** * uni.connectSocket 超时时间 * 单位为 ms * 默认为 60000 */ - connectSocket?: number; + connectSocket?: number /** * uni.uploadFile 超时时间 * 单位为 ms * 默认为 60000 */ - uploadFile?: number; + uploadFile?: number /** * uni.downloadFile 超时时间 * 单位为 ms * 默认为 60000 */ - downloadFile?: number; + downloadFile?: number } export interface UniStatistics { /** * 是否开启 uni 统计 * 默认为 false */ - enable?: boolean; + enable?: boolean /** * uni 统计版本 * 默认为 1 */ - version?: "1" | "2"; + version?: '1' | '2' /** * 是否开启统计调试模式 * 生产阶段务必关闭 * 默认为 false */ - debug?: boolean; + debug?: boolean /** * 前端数据上报周期 * 默认为 10 */ - reportInterval?: number; + reportInterval?: number /** 采集项配置 */ collectItems?: { /** * 是否开启推送 PushClientID 的采集 * 默认为 false */ - uniPushClientID?: boolean; - }; + uniPushClientID?: boolean + } } -export interface SimpleUniStatistics extends Pick {} +export interface SimpleUniStatistics extends Pick {} /** PNG格式的图片 */ -export type PNG = `${string}.png` | `${string}.PNG`; +export type PNG = `${string}.png` | `${string}.PNG` /** App图标配置 */ export interface AppPlusIcons { /** Android平台 */ android?: { /** 2K屏设备程序图标,分辨率要求192x192 */ - xxxhdpi?: PNG; + xxxhdpi?: PNG /** 1080P高分屏设备程序图标,分辨率要求144x144 */ - xxhdpi?: PNG; + xxhdpi?: PNG /** 720P高分屏设备程序图标,分辨率要求96x96 */ - xhdpi?: PNG; + xhdpi?: PNG /** 高分屏设备程序图标,分辨率要求72x72 */ - hdpi?: PNG; + hdpi?: PNG /** 普通屏设备程序图标,分辨率要求48x48,这类设备很少见,可以不配置 */ - mdpi?: PNG; + mdpi?: PNG /** 大屏设备程序图标,分辨率要求48x48,这类设备很少见,可以不配置 */ - ldpi?: PNG; - }; + ldpi?: PNG + } /** iOS平台 */ ios?: { /** App Store图标路径,分辨率要求1024x1024 */ - appstore?: PNG; + appstore?: PNG /** iPad设备程序图标 */ ipad?: { /** iOS7+设备程序主图标,分辨率要求76x76 */ - app?: PNG; + app?: PNG /** iOS7+高分屏设备程序主图标,分辨率要求152x152 */ - "app@2x"?: PNG; + 'app@2x'?: PNG /** iOS7+设备通知栏图标,分辨率要求20x20 */ - notification?: PNG; + notification?: PNG /** iOS7+高分屏设备通知栏图标,分辨率要求40x40 */ - "notification@2x"?: PNG; + 'notification@2x'?: PNG /** iOS9+ iPad Pro(12.9英寸)设备程序主图标,分辨率要求167x167 */ - "proapp@2x"?: PNG; + 'proapp@2x'?: PNG /** iOS5+设备Settings设置图标,分辨率要求29x29 */ - settings?: PNG; + settings?: PNG /** iOS5+高分屏设备Settings设置图标,分辨率要求58x58 */ - "settings@2x"?: PNG; + 'settings@2x'?: PNG /** iOS7+设备Spotlight搜索图标,分辨率要求40x40 */ - spotlight?: PNG; + spotlight?: PNG /** iOS7+高分屏设备Spotlight搜索图标,分辨率要求80x80 */ - "spotlight@2x"?: PNG; - }; + 'spotlight@2x'?: PNG + } /** iPhone设备程序图标 */ iphone?: { /** iOS7+设备程序主图标,分辨率要求120x120 */ - "app@2x"?: PNG; + 'app@2x'?: PNG /** iOS7+设备程序主图标,分辨率要求180x180 */ - "app@3x"?: PNG; + 'app@3x'?: PNG /** iOS7+设备通知栏图标,分辨率要求40x40 */ - "notification@2x"?: PNG; + 'notification@2x'?: PNG /** iOS7+设备通知栏图标,分辨率要求60x60 */ - "notification@3x"?: PNG; + 'notification@3x'?: PNG /** iOS7+设备Settings设置图标,分辨率要求58x58 */ - "settings@2x"?: PNG; + 'settings@2x'?: PNG /** iOS7+设备Settings设置图标,分辨率要求87x87 */ - "settings@3x"?: PNG; + 'settings@3x'?: PNG /** iOS7+设备Spotlight搜索图标,分辨率要求80x80 */ - "spotlight@2x"?: PNG; + 'spotlight@2x'?: PNG /** iOS7+设备Spotlight搜索图标,分辨率要求120x120 */ - "spotlight@3x"?: PNG; - }; - }; + 'spotlight@3x'?: PNG + } + } } export enum PermissionRequest { - ALWAYS = "always", - ONCE = "once", - NONE = "none", + ALWAYS = 'always', + ONCE = 'once', + NONE = 'none', } export interface AppPlusDistributeAndroid { /** * 从3.1.10版本开始使用App离线SDK需要申请Appkey * @see https://nativesupport.dcloud.net.cn/AppDocs/usesdk/appkey.html */ - dcloud_appkey?: string; + dcloud_appkey?: string /** Android平台云端打包的包名 */ - packagename?: string; + packagename?: string /** Android平台云端打包使用的签名证书文件路径 */ - keystore?: string; + keystore?: string /** Android平台云端打包使用的签名证书的密码,要求证书存储密码和证书密码相同 */ - password?: string; + password?: string /** Android平台云端打包使用的证书别名 */ - aliasname?: string; + aliasname?: string /** Android平台App注册的scheme,多个scheme使用“,”分割,详情参考:Android平台设置UrlSchemes */ - schemes?: string; + schemes?: string /** Android平台App支持的cpu类型,详情参考:Android平台设置CPU类型 */ - abiFilters?: string[]; + abiFilters?: string[] /** Android平台App使用的权限 */ - permissions?: string[]; + permissions?: string[] /** 是否自定义Android权限配置 */ - custompermissions?: boolean; + custompermissions?: boolean /** Android平台应用启动时申请读写手机存储权限策略配置,详情参考:Android平台应用启动时读写手机存储权限策略,支持request、prompt属性 * @see https://ask.dcloud.net.cn/article/36549 */ @@ -160,14 +160,14 @@ export interface AppPlusDistributeAndroid { * - once?: 应用第一次启动时申请,用户可以拒绝 * - always?: 应用每次启动都申请,并且用户必须允许,用户拒绝时会弹出以下提示框引导用户重新允许 */ - request?: PermissionRequest; + request?: PermissionRequest /** * 字符串类型,可选,用户拒绝时弹出提示框上的内容。 * 默认值为:应用保存运行状态等信息,需要获取读写手机存储(系统提示为访问设备上的照片、媒体内容和文件)权限,请允许。 * 设置自定义键名称为“dcloud_permission_write_external_storage_message”。 */ - prompt?: string; - }; + prompt?: string + } /** Android平台应用启动时申请读取设备信息权限配置,详情参考:Android平台应用启动时访问设备信息(如IMEI)权限策略,支持request、prompt属性 * @see https://ask.dcloud.net.cn/article/36549 */ @@ -178,59 +178,65 @@ export interface AppPlusDistributeAndroid { * - once?: 应用第一次启动时申请,用户可以拒绝 * - always?: 应用每次启动都申请,并且用户必须允许,用户拒绝时会弹出以下提示框引导用户重新允许 */ - request?: PermissionRequest; + request?: PermissionRequest /** * 字符串类型,可选,用户拒绝时弹出提示框上的内容。 * 默认值为:为保证您正常、安全地使用,需要获取设备识别码(部分手机提示为获取手机号码)使用权限,请允许。 * 设置自定义键名称为“dcloud_permission_read_phone_state_message”。 */ - prompt?: string; - }; + prompt?: string + } + compileSdkVersion?: number /** Android平台最低支持版本,详情参考:Android平台设置minSdkVersion * @see https://uniapp.dcloud.net.cn/tutorial/app-android-minsdkversion.html */ - minSdkVersion?: string; + minSdkVersion?: number /** Android平台目标版本,详情参考:Android平台设置targetSdkVersion * @see https://uniapp.dcloud.net.cn/tutorial/app-android-targetsdkversion.html */ - targetSdkVersion?: string; + targetSdkVersion?: number /** Android平台云端打包时build.gradle的packagingOptions配置项, * @example * "packagingOptions": ["doNotStrip '/armeabi-v7a/.so'","merge '**\/LICENSE.txt'"] */ - packagingOptions?: string[]; + packagingOptions?: string[] /** * @deprecated * uni-app使用的JS引擎,可取值v8、jsc,将废弃,后续不再支持jsc引擎 */ - jsEngine?: "v8" | "jsc"; + jsEngine?: 'v8' | 'jsc' /** 是否开启Android调试开关 */ - debuggable?: boolean; + debuggable?: boolean /** 应用的默认语言 */ - locale?: string; + locale?: string /** 是否强制允许暗黑模式 */ - forceDarkAllowed?: boolean; + forceDarkAllowed?: boolean /** 是否支持分屏调整窗口大小 */ - resizeableActivity?: boolean; + resizeableActivity?: boolean /** 是否设置android:taskAffinity,详见 */ - hasTaskAffinity?: boolean; + hasTaskAffinity?: boolean /** Android平台云端打包时build.gradle的buildFeatures配置项,[详见](https://developer.android.google.cn/reference/tools/gradle-api/7.1/com/android/build/api/dsl/BuildFeatures) */ buildFeatures?: { - aidl?: boolean; - buildConfig?: boolean; - compose?: boolean; - prefab?: boolean; - renderScript?: boolean; - resValues?: boolean; - shaders?: boolean; - viewBinding?: boolean; - }; + aidl?: boolean + buildConfig?: boolean + compose?: boolean + prefab?: boolean + renderScript?: boolean + resValues?: boolean + shaders?: boolean + viewBinding?: boolean + } /** 延迟初始化UniPush的配置,当配置此项值为manual后UniPush不会初始化, * 直到首次调用getPushClientId、getClientInfo、getClientInfoAsync时才会初始化, * 注:一旦调用获取cid的方法后,下次App启动就不再延迟初始化UniPush了。(manual为延迟,其他值表示不延迟。) */ - pushRegisterMode?: "manual"; + pushRegisterMode?: 'manual' /** 是否支持获取OAID,默认值为true,[详见](https://uniapp.dcloud.net.cn/collocation/manifest-app.html#enableoaid) */ - enableOAID?: boolean; + enableOAID?: boolean + /** + * 是否集成install-apk-release.aar,默认为true集成 + * HBuilder X 3.8.7及以上版本新增库install-apk-release.aar,上架谷歌应用市场不能包含此库 + */ + installApkSdk?: boolean } /** * 功能模块 @@ -238,29 +244,29 @@ export interface AppPlusDistributeAndroid { */ export interface AppPlusModules { /** 登录授权 */ - OAuth?: {}; + OAuth?: {} /** BLE蓝牙 */ - Bluetooth?: {}; + Bluetooth?: {} /** 语音识别 */ - Speech?: {}; + Speech?: {} /** 调用相机拍照,访问或修改相册 */ - Camera?: {}; + Camera?: {} /** 社交分享 */ - Share?: {}; + Share?: {} /** 获取位置信息 */ - Geolocation?: {}; + Geolocation?: {} /** 消息推送 */ - Push?: {}; + Push?: {} /** 统计 */ - Statistic?: {}; + Statistic?: {} /** 调用相机扫码功能 */ - Barcode?: {}; + Barcode?: {} /** 系统通讯录 */ - Contacts?: {}; + Contacts?: {} /** 访问系统人脸识别 */ - FaceID?: {}; + FaceID?: {} /** 指纹识别 */ - Fingerprint?: {}; + Fingerprint?: {} /** * 实人认证 * - 为对抗攻击,实人认证SDK返回的错误原因比较模糊。 @@ -270,46 +276,46 @@ export interface AppPlusModules { * @see https://uniapp.dcloud.net.cn/tutorial/app-facialRecognitionVerify.html * @see https://doc.dcloud.net.cn/uniCloud/frv/intro.html */ - FacialRecognitionVerify?: {}; + FacialRecognitionVerify?: {} /** iBeacon */ - iBeacon?: {}; + iBeacon?: {} /** 直播推流 */ - LivePusher?: {}; + LivePusher?: {} /** 地图 */ - Maps?: {}; + Maps?: {} /** 短彩邮件消息 */ - Messaging?: {}; + Messaging?: {} /** 支付 */ - Payment?: {}; + Payment?: {} /** 录音 */ - Record?: {}; + Record?: {} /** * 安全网络 * - 安全网络暂未支持离线打包,后续会提供离线打包的方案 * @see https://doc.dcloud.net.cn/uniCloud/secure-network.html */ - SecureNetwork?: {}; + SecureNetwork?: {} /** SQLite数据库 */ - SQLite?: {}; + SQLite?: {} /** 视频播放 */ - VideoPlayer?: {}; + VideoPlayer?: {} /** * Android X5 Webview(腾讯TBS) * - CPU类型配置不支持“x86” * @see https://uniapp.dcloud.net.cn/tutorial/app-android-x5.html */ - "Webview-x5"?: {}; + 'Webview-x5'?: {} /** * iOS UIWebview, * - 使用UIWebview模块后应用无法通过App Store审核 * @see https://uniapp.dcloud.net.cn/tutorial/app-ios-uiwebview.html#uiwebview * @see https://nativesupport.dcloud.net.cn/AppDocs/usemodule/iOSModuleConfig/uiwebview.html */ - UIWebview?: {}; + UIWebview?: {} } export enum AppPlusOS { - iOS = "ios", - Android = "android", + iOS = 'ios', + Android = 'android', } export interface AppPlusDistributeSdkConfigs { oauth?: { @@ -318,14 +324,14 @@ export interface AppPlusDistributeSdkConfigs { * @see https://uniapp.dcloud.net.cn/tutorial/app-oauth-weixin.html */ weixin?: { - appid?: string; - UniversalLinks?: string; - }; + appid?: string + UniversalLinks?: string + } /** * 苹果登录 * @see https://uniapp.dcloud.net.cn/tutorial/app-oauth-apple.html */ - apple?: {}; + apple?: {} /** * uni一键登录 */ @@ -333,323 +339,323 @@ export interface AppPlusDistributeSdkConfigs { /** * GETUI_APPID与GY_APP_ID对[应开发者中心](https://dev.dcloud.net.cn/)一键登录->基础配置->一键登录应用ID(离线打包使用),GETUI_APPID与GY_APP_ID取值相同。 */ - appid?: string; - }; + appid?: string + } /** * QQ登录 * @see https://uniapp.dcloud.net.cn/tutorial/app-oauth-qq.html */ qq?: { - appid?: string; - UniversalLinks?: string; - }; + appid?: string + UniversalLinks?: string + } /** * 新浪微博登录 * @see https://uniapp.dcloud.net.cn/tutorial/app-oauth-weibo.html */ sina?: { - appkey?: string; - redirect_uri?: string; - UniversalLinks?: string; - }; + appkey?: string + redirect_uri?: string + UniversalLinks?: string + } /** * Google登录 * @see https://uniapp.dcloud.net.cn/tutorial/app-oauth-google.html */ google?: { - clientid?: string; - }; + clientid?: string + } /** * Facebook登录 * @see https://uniapp.dcloud.net.cn/tutorial/app-oauth-facebook.html */ facebook?: { - appid?: string; - client_token?: string; + appid?: string + client_token?: string /** * Android端在4.31版本后Facebook登录SDK默认携带com.google.android.gms.permission.AD_ID权限, * 如未使用广告相关功能在GooglePlay上架时会遇到审核问题,需要手动删除掉此权限,[删除权限文档](https://uniapp.dcloud.net.cn/tutorial/app-nativeresource-android.html#removepermissions) */ - permission_ad_remove?: boolean; - }; + permission_ad_remove?: boolean + } /** * 华为登录 * @see https://uniapp.dcloud.net.cn/tutorial/app-oauth-huawei.html */ - huawei?: {}; - }; + huawei?: {} + } ad?: { /** 腾讯优量 */ - gdt?: {}; + gdt?: {} /** 快手广告联盟 */ - ks?: {}; + ks?: {} /** 快手内容联盟 */ - "ks-content"?: {}; + 'ks-content'?: {} /** Sigmob广告联盟 */ - sigmob?: {}; + sigmob?: {} /** 华为广告联盟 */ - hw?: {}; + hw?: {} /** 百度百青藤广告联盟 */ - bd?: {}; + bd?: {} /** Google AdMob谷歌广告 */ - gg?: {}; + gg?: {} /** 海外穿山甲 */ - pg?: {}; + pg?: {} /** Octopus章鱼移动广告 */ - zy?: {}; + zy?: {} /** AdScope倍孜广告 */ - bz?: {}; + bz?: {} /** 穿山甲GroMore */ - gm?: {}; - }; + gm?: {} + } share?: { weixin?: { - appid?: string; - UniversalLinks?: string; - }; + appid?: string + UniversalLinks?: string + } sina?: { - appkey?: string; - redirect_uri?: string; - UniversalLinks?: string; - }; + appkey?: string + redirect_uri?: string + UniversalLinks?: string + } qq?: { - appid?: string; - UniversalLinks?: string; - }; - }; + appid?: string + UniversalLinks?: string + } + } /** 定位 */ geolocation?: { /** OS自带的系统定位 */ system?: { - __platform__?: AppPlusOS[]; - }; + __platform__?: AppPlusOS[] + } /** 高德定位 */ amap?: { - name?: string; - __platform__?: AppPlusOS[]; - appkey_ios?: string; - appkey_android?: string; - }; + name?: string + __platform__?: AppPlusOS[] + appkey_ios?: string + appkey_android?: string + } /** 百度定位 */ baidu?: { - __platform__?: AppPlusOS[]; - appkey_ios?: string; - appkey_android?: string; - }; - }; + __platform__?: AppPlusOS[] + appkey_ios?: string + appkey_android?: string + } + } statics?: { umeng?: { - appkey_ios?: string; - channelid_ios?: string; - appkey_android?: string; - channelid_android?: string; - }; + appkey_ios?: string + channelid_ios?: string + appkey_android?: string + channelid_android?: string + } google?: { - config_ios?: string; - config_android?: string; - }; - }; + config_ios?: string + config_android?: string + } + } push?: { unipush?: { - offline?: boolean; + offline?: boolean icons?: { small?: { - ldpi?: string; - mdpi?: string; - hdpi?: string; - xhdpi?: string; - xxhdpi?: string; - }; - }; - hms?: {}; - oppo?: {}; - vivo?: {}; - mi?: {}; - version?: "2"; - meizu?: {}; - honor?: {}; - fcm?: {}; - }; - }; + ldpi?: string + mdpi?: string + hdpi?: string + xhdpi?: string + xxhdpi?: string + } + } + hms?: {} + oppo?: {} + vivo?: {} + mi?: {} + version?: '2' + meizu?: {} + honor?: {} + fcm?: {} + } + } maps?: { google?: { - APIKey_ios?: string; - APIKey_android?: string; - }; + APIKey_ios?: string + APIKey_android?: string + } amap?: { - name?: string; - appkey_ios?: string; - appkey_android?: string; - }; + name?: string + appkey_ios?: string + appkey_android?: string + } baidu?: { - appkey_ios?: string; - appkey_android?: string; - }; - }; + appkey_ios?: string + appkey_android?: string + } + } payment?: { - appleiap?: {}; + appleiap?: {} alipay?: { - __platform__?: AppPlusOS[]; - }; + __platform__?: AppPlusOS[] + } weixin?: { - __platform__?: AppPlusOS[]; - appid?: string; - UniversalLinks?: string; - }; + __platform__?: AppPlusOS[] + appid?: string + UniversalLinks?: string + } paypal?: { - __platform__?: AppPlusOS[]; - returnURL_ios?: string; - returnURL_android?: string; - }; + __platform__?: AppPlusOS[] + returnURL_ios?: string + returnURL_android?: string + } stripe?: { - __platform__?: AppPlusOS[]; - returnURL_ios?: string; - }; - google?: {}; - }; + __platform__?: AppPlusOS[] + returnURL_ios?: string + } + google?: {} + } } export interface AppPlusDistributeIOS { /** * 从3.1.10版本开始使用App离线SDK需要申请Appkey * @see https://nativesupport.dcloud.net.cn/AppDocs/usesdk/appkey.html */ - dcloud_appkey?: string; + dcloud_appkey?: string /** iOS平台云端打包使用的Bundle ID */ - appid?: string; + appid?: string /** iOS平台云端打包使用的profile文件路径 */ - mobileprovision?: string; + mobileprovision?: string /** iOS平台云端打包使用的证书文件路径 */ - p12?: string; + p12?: string /** iOS打包使用的证书密码 */ - password?: string; + password?: string /** iOS支持的设备类型,可取值iphone(仅支持iPhone设备)、ipad(仅支持iPad设备)、universal(同时支持iPhone和iPad设备) */ - devices?: string; + devices?: string /** 应用访问白名单列表,多个白名单使用“,”分割,详情参考:iOS设置应用访问白名单 */ - urlschemewhitelist?: string; + urlschemewhitelist?: string /** Android平台App注册的scheme,多个scheme使用“,”分割,详情参考:iOS设置应用UrlSchemes */ - urltypes?: string; + urltypes?: string /** 应用后台运行模式,详情参考:[iOS设置应用后台运行能力](https://uniapp.dcloud.io/tutorial/app-ios-uibackgroundmodes) */ - UIBackgroundModes?: string; + UIBackgroundModes?: string /** * @deprecated * 依赖的系统库,已废弃,推荐使用uni原生插件扩展使用系统依赖库 */ - frameworks?: string[]; + frameworks?: string[] /** iOS支持的最低版本 */ - deploymentTarget?: string; + deploymentTarget?: string /** iOS隐私信息访问的许可描述 */ privacyDescription?: { /** 可选,字符串类型,系统相册读取权限描述 */ - NSPhotoLibraryUsageDescription?: string; + NSPhotoLibraryUsageDescription?: string /** 可选,字符串类型,系统相册写入权限描述 */ - NSPhotoLibraryAddUsageDescription?: string; + NSPhotoLibraryAddUsageDescription?: string /** 可选,字符串类型,摄像头使用权限描述 */ - NSCameraUsageDescription?: string; + NSCameraUsageDescription?: string /** 可选,字符串类型,麦克风使用权限描述 */ - NSMicrophoneUsageDescription?: string; + NSMicrophoneUsageDescription?: string /** 可选,字符串类型,运行期访问位置权限描述 */ - NSLocationWhenInUseUsageDescription?: string; + NSLocationWhenInUseUsageDescription?: string /** 可选,字符串类型,后台运行访问位置权限描述 */ - NSLocationAlwaysUsageDescription?: string; + NSLocationAlwaysUsageDescription?: string /** 可选,字符串类型,运行期后后台访问位置权限描述 */ - NSLocationAlwaysAndWhenInUseUsageDescription?: string; + NSLocationAlwaysAndWhenInUseUsageDescription?: string /** 可选,字符串类型,使用日历权限描述 */ - NSCalendarsUsageDescription?: string; + NSCalendarsUsageDescription?: string /** 可选,字符串类型,使用通讯录权限描述 */ - NSContactsUsageDescription?: string; + NSContactsUsageDescription?: string /** 可选,字符串类型,使用蓝牙权限描述 */ - NSBluetoothPeripheralUsageDescription?: string; + NSBluetoothPeripheralUsageDescription?: string /** 可选,字符串类型,后台使用蓝牙权限描述 */ - NSBluetoothAlwaysUsageDescription?: string; + NSBluetoothAlwaysUsageDescription?: string /** 可选,字符串类型,系统语音识别权限描述 */ - NSSpeechRecognitionUsageDescription?: string; + NSSpeechRecognitionUsageDescription?: string /** 可选,字符串类型,系统提醒事项权限描述 */ - NSRemindersUsageDescription?: string; + NSRemindersUsageDescription?: string /** 可选,字符串类型,使用运动与健康权限描述 */ - NSMotionUsageDescription?: string; + NSMotionUsageDescription?: string /** 可选,字符串类型,使用健康更新权限描述 */ - NSHealthUpdateUsageDescription?: string; + NSHealthUpdateUsageDescription?: string /** 可选,字符串类型,使用健康分享权限描述 */ - NSHealthShareUsageDescription?: string; + NSHealthShareUsageDescription?: string /** 可选,字符串类型,使用媒体资料库权限描述 */ - NSAppleMusicUsageDescription?: string; + NSAppleMusicUsageDescription?: string /** 可选,字符串类型,使用NFC权限描述 */ - NFCReaderUsageDescription?: string; + NFCReaderUsageDescription?: string /** 可选,字符串类型,访问临床记录权限描述 */ - NSHealthClinicalHealthRecordsShareUsageDescription?: string; + NSHealthClinicalHealthRecordsShareUsageDescription?: string /** 可选,字符串类型,访问HomeKit权限描述 */ - NSHomeKitUsageDescription?: string; + NSHomeKitUsageDescription?: string /** 可选,字符串类型,访问Siri权限描述 */ - NSSiriUsageDescription?: string; + NSSiriUsageDescription?: string /** 可选,字符串类型,使用FaceID权限描述 */ - NSFaceIDUsageDescription?: string; + NSFaceIDUsageDescription?: string /** 可选,字符串类型,访问本地网络权限描述 */ - NSLocalNetworkUsageDescription?: string; + NSLocalNetworkUsageDescription?: string /** 可选,字符串类型,跟踪用户活动权限描述 */ - NSUserTrackingUsageDescription?: string; - }; + NSUserTrackingUsageDescription?: string + } /** 是否使用广告标识 */ - idfa?: boolean; + idfa?: boolean /** 应用的能力配置(Capabilities) */ capabilities?: { - entitlements: object; - plists: object; - }; + entitlements: object + plists: object + } /** 应用的CFBundleName名称,默认值为HBuilder */ - CFBundleName?: string; + CFBundleName?: string /** 编译时支持的CPU指令,可取值arm64、arm64e、armv7、armv7s、x86_64 */ - validArchitectures?: ("arm64" | "arm64e" | "armv7" | "armv7s" | "x86_64")[]; + validArchitectures?: ('arm64' | 'arm64e' | 'armv7' | 'armv7s' | 'x86_64')[] /** 使用“Push(消息推送)”模块时申请系统推送权限模式,设置为manual表示调用push相关API时申请,设置为其它值表示应用启动时自动申请 */ - pushRegisterMode?: string; + pushRegisterMode?: string /** 设置为manual表示同意隐私政策后再获取相关隐私信息,设置为其它值表示应用启动时自动获取详见 */ - privacyRegisterMode?: string; + privacyRegisterMode?: string } export interface AppPlus { /** 编译器兼容性配置 */ compatible?: { /** 是否忽略运行环境与编译环境不一致的问题 */ - ignoreVersion?: boolean; + ignoreVersion?: boolean /** * 运行环境版本号 * 可以使用英文逗号分割 */ - runtimeVersion?: string; + runtimeVersion?: string /** 编译环境版本号 */ - compilerVersion?: string; - }; + compilerVersion?: string + } /** 启动界面信息 */ splashscreen?: { /** * 是否等待首页渲染完毕后再关闭启动界面 * 默认为 true */ - alwaysShowBeforeRender?: boolean; + alwaysShowBeforeRender?: boolean /** * 是否自动关闭启动界面 * 默认为 true */ - autoclose?: boolean; + autoclose?: boolean /** * 是否在程序启动界面显示加载 * 默认为 true */ - waiting?: boolean; + waiting?: boolean /** 是否使用原生提示框 */ - useOriginalMsgbox?: boolean; + useOriginalMsgbox?: boolean /** * 未知属性,但是uni默认配置中有该属性 */ - delay?: number; - }; + delay?: number + } /** 重力感应、横竖屏配置 */ - screenOrientation?: ("portrait-primary" | "portrait-secondary" | "landscape-primary" | "landscape-secondary")[]; + screenOrientation?: ('portrait-primary' | 'portrait-secondary' | 'landscape-primary' | 'landscape-secondary')[] /** APP 权限模块 */ - modules?: AppPlusModules; + modules?: AppPlusModules /** APP 发布信息 */ distribute?: { /** Android 专用配置 */ - android?: AppPlusDistributeAndroid; + android?: AppPlusDistributeAndroid /** iOS 专用配置 */ - ios?: AppPlusDistributeIOS; + ios?: AppPlusDistributeIOS /** * App图标配置 * @@ -661,63 +667,63 @@ export interface AppPlus { * - 系统没有对图标分辨率进行限制,按照建议的分辨率配置即可 * - 图片支持透明区域,建议使用圆角图标 */ - icons?: AppPlusIcons; + icons?: AppPlusIcons /** * SDK 配置 * 仅打包生效 */ - sdkConfigs?: AppPlusDistributeSdkConfigs; + sdkConfigs?: AppPlusDistributeSdkConfigs /** * Android使用原生隐私政策提示框 * * @see https://uniapp.dcloud.net.cn/tutorial/app-privacy-android.html# */ splashscreen?: { - useOriginalMsgbox?: boolean; - }; - }; + useOriginalMsgbox?: boolean + } + } /** * nvue 编译模式 * 默认为 weex * 建议使用 uni-app */ - nvueCompiler?: "weex" | "uni-app"; + nvueCompiler?: 'weex' | 'uni-app' /** * nvue 样式编译模式 * 默认为 weex * 建议使用 uni-app */ - nvueStyleCompiler?: "weex" | "uni-app"; + nvueStyleCompiler?: 'weex' | 'uni-app' /** 运行框架 */ - renderer?: "native"; + renderer?: 'native' /** * nvue 首页启动模式 * 默认为 normal */ - nvueLaunchMode?: "normal" | "fast"; + nvueLaunchMode?: 'normal' | 'fast' /** nvue 页面布局初始配置 */ nvue?: { /** * flex 项目的排列方向 * 默认为 column */ - "flex-direction"?: "row" | "row-reverse" | "column" | "column-reverse"; - }; + 'flex-direction'?: 'row' | 'row-reverse' | 'column' | 'column-reverse' + } /** uni 统计配置项 */ - uniStatistics?: SimpleUniStatistics; + uniStatistics?: SimpleUniStatistics /** 优化配置 */ optimization?: { /** * 是否开启分包配置 * 为 true 时必须设置 app-plus.runmode 为 liberate */ - subPackages?: boolean; - }; + subPackages?: boolean + } /** * 运行模式 * 分包时必须设置 liberate */ - runmode?: "normal" | "liberate"; + runmode?: 'normal' | 'liberate' /** * 系统 webview 低于指定版本时,会弹出提示,或者下载 x5 内核后继续启动 * Android 支持 @@ -727,7 +733,7 @@ export interface AppPlus { * 最小 webview 版本 * 当低于最小版本要求时,显示弹框提示,点击确定退出应用 */ - minUserAgentVersion?: string; + minUserAgentVersion?: string /** * x5 内核配置 * 启用 Android X5 Webview 模块后生效 @@ -737,69 +743,69 @@ export interface AppPlus { * 超时时间 * 默认为 3000 */ - timeOut?: number; + timeOut?: number /** * 是否在非 WiFi 网络环境时弹框询问用户是否确认下载 X5 内核 * 默认为 false,即不弹框询问 */ - showTipsWithoutWifi?: boolean; + showTipsWithoutWifi?: boolean /** * 是否允许用户在非 WiFi 网络时直接下载 X5 内核 * 默认为 false,此时 showTipsWithoutWifi 为 true 时弹框询问用户,showTipsWithoutWifi 为 false 时不下载 * true 时不弹框询问用户 */ - allowDownloadWithoutWiFi?: boolean; - }; - }; - [x: string]: any; + allowDownloadWithoutWiFi?: boolean + } + } + [x: string]: any } export interface H5 { /** * 页面标题 * 默认使用顶层 name 字段 */ - title?: string; + title?: string /** 相对于应用根目录的 index.html 模板路径 */ - template?: string; + template?: string /** 路由设置 */ router?: { /** * 路由跳转模式 * 默认为 hash */ - mode?: "hash" | "history"; + mode?: 'hash' | 'history' /** * 应用基础路径 * 默认为 / */ - base?: string; - }; + base?: string + } /** 加载相关设置 */ async?: { /** * 页面 JavaScript 加载时使用的组件,需注册为全局组件 * 默认为 AsyncLoading */ - loading?: string; + loading?: string /** * 页面 JavaScript 加载失败时使用的组件,需注册为全局组件 * 默认为 AsyncError */ - error?: string; + error?: string /** * 显示加载中组件的延时时间,如果在延时内加载完成,则不会显示加载中组件 * 单位为 ms * 默认为 200 * */ - delay?: number; + delay?: number /** * 加载超时时间,如果超时,则显示加载失败组件 * 单位为 ms * 默认为 60000 */ - timeout?: number; - }; + timeout?: number + } /** * dev server 设置 */ @@ -808,450 +814,450 @@ export interface H5 { * 是否启用 HTTPS 协议 * 默认为 false */ - https?: boolean; + https?: boolean /** * 是否禁用 host 检查 * 默认为 false */ - disableHostCheck?: boolean; - }; + disableHostCheck?: boolean + } /** 引用资源的地址前缀,仅发布时生效 */ - publicPath?: string; + publicPath?: string /** SDK 配置 */ - sdkConfigs?: Record; + sdkConfigs?: Record /** 优化配置 */ optimization?: { /** * 资源预获取 * 默认为 false */ - prefetch?: boolean; + prefetch?: boolean /** * 资源预加载 * 默认为 false */ - preload?: boolean; + preload?: boolean /** 摇树优化 */ treeShaking?: { /** * 是否开启摇树优化 * 默认为 false */ - enable?: boolean; - }; - }; + enable?: boolean + } + } /** uni 统计配置项 */ - uniStatistics?: SimpleUniStatistics; - [x: string]: any; + uniStatistics?: SimpleUniStatistics + [x: string]: any } export interface QuickappWebview { /** 应用图标,推荐尺寸 192x192 */ - icon?: string; + icon?: string /** 应用包名 */ - package?: string; + package?: string /** 最小平台支持,快应用联盟最低 1063,快应用华为最低 1070 */ - minPlatformVersion?: number; + minPlatformVersion?: number /** 版本名称 */ - versionName?: string; + versionName?: string /** 版本号 */ - versionCode?: number; - [x: string]: any; + versionCode?: number + [x: string]: any } export interface QuickappWebviewUnion { /** 最小平台支持,最低 1063 */ - minPlatformVersion?: number; + minPlatformVersion?: number } export interface QuickappWebviewHuawei { /** 最小平台支持,最低 1070 */ - minPlatformVersion?: number; + minPlatformVersion?: number } export interface MpWeixin { /** 微信小程序的 appid */ - appid?: string; + appid?: string /** * 微信小程序项目设置 * 更多信息查看 */ setting?: { /** 是否启用 ES6 转 ES5 */ - es6?: boolean; + es6?: boolean /** * 是否使用增强编译 * * {@see https://developers.weixin.qq.com/community/develop/doc/0002ce07a58000a57c5da5e6456c09 regeneratorRuntime 相关报错排查指引} */ - es7?: boolean; + es7?: boolean /** 是否使用增强编译 */ - enhance?: boolean; + enhance?: boolean /** 上传代码时样式是否自动补全 */ - postcss?: boolean; + postcss?: boolean /** 上传代码时是否自动压缩脚本文件 */ - minified?: boolean; + minified?: boolean /** 上传代码时是否自动压缩样式文件 */ - minifyWXSS?: boolean; + minifyWXSS?: boolean /** 上传代码时是否自动压缩 WXML 文件 */ - minifyWXML?: boolean; + minifyWXML?: boolean /** 上传时是否代码保护 */ - uglifyFileName?: boolean; + uglifyFileName?: boolean /** 上传时是否过滤无依赖文件 */ - ignoreUploadUnusedFiles?: boolean; + ignoreUploadUnusedFiles?: boolean /** 是否自动运行体验评分 */ - autoAudits?: boolean; + autoAudits?: boolean /** 是否检查安全域名和 TLS 版本 */ - urlCheck?: boolean; + urlCheck?: boolean /** 是否启用代码自动热重载 */ - compileHotReLoad?: boolean; + compileHotReLoad?: boolean /** 是否启用数据预拉取 */ - preloadBackgroundData?: boolean; + preloadBackgroundData?: boolean /** 是否启用懒注入占位组件调试 */ - lazyloadPlaceholderEnable?: boolean; + lazyloadPlaceholderEnable?: boolean /** 小游戏项目有效,是否开启静态资源服务器 */ - useStaticServer?: boolean; + useStaticServer?: boolean /** 预览及真机调试的时主包、分包体积上限是否调整为小程序 4M、小游戏 8M */ - bigPackageSizeSupport?: boolean; + bigPackageSizeSupport?: boolean /** 增强编译 Babel 的配置项 */ babelSetting?: { /** * Babel 辅助函数的输出目录 * 默认为 `@babel/runtime` */ - outputPath?: string; + outputPath?: string /** 需要跳过 Babel 编译(包括代码压缩)处理的文件或目录 */ - ignore?: string[]; - }; + ignore?: string[] + } /** 编译插件配置 */ - useCompilerPlugins?: false | string[]; + useCompilerPlugins?: false | string[] /** 将 JS 编译成 ES5 时,是否禁用严格模式 */ - disableUseStrict?: boolean; + disableUseStrict?: boolean /** * 上传时是否带上 sourcemap * 默认为 true */ - uploadWithSourceMap?: boolean; + uploadWithSourceMap?: boolean /** 在小游戏插件项目中,是否启用 以本地目录为插件资源来源 特性 */ - localPlugins?: boolean; + localPlugins?: boolean /** 是否手动配置构建 npm 的路径 */ - packNpmManually?: boolean; + packNpmManually?: boolean /** 仅 packNpmManually 为 true 时生效 */ packNpmRelationList?: { /** node_modules 源对应的 package.json */ - packageJsonPath?: string; + packageJsonPath?: string /** node_modules 的构建结果目标位置 */ - miniprogramNpmDistDir?: string; - }[]; + miniprogramNpmDistDir?: string + }[] /** 是否使用工具渲染 CoverView */ - coverView?: boolean; + coverView?: boolean /** * 预览、真机调试和本地模拟器等开发阶段是否过滤无依赖文件 * 默认为 true */ - ignoreDevUnusedFiles?: boolean; + ignoreDevUnusedFiles?: boolean /** 是否检查键名 */ - checkInvalidKey?: boolean; + checkInvalidKey?: boolean /** 是否开启调试器 WXML 面板展示 shadow-root */ - showShadowRootInWxmlPanel?: boolean; + showShadowRootInWxmlPanel?: boolean /** 是否开启小程序独立域调试特性 */ - useIsolateContext?: boolean; + useIsolateContext?: boolean /** * 是否开启模拟器预先载入小程序的某些资源 * 设置为 false 时会导致 useIsolateContext 失效 */ - useMultiFrameRuntime?: boolean; + useMultiFrameRuntime?: boolean /** 是否启用 API Hook 功能 */ - useApiHook?: boolean; + useApiHook?: boolean /** 是否在额外的进程处理一些小程序 API */ - useApiHostProcess?: boolean; + useApiHostProcess?: boolean /** 小游戏有效,是否开启局域网调试服务器 */ - useLanDebug?: boolean; + useLanDebug?: boolean /** 是否在游戏引擎项目中开启支持引用 node 原生模块的底层加速特性 */ - enableEngineNative?: boolean; + enableEngineNative?: boolean /** 是否在本地设置中展示传统的 ES6 转 ES5 开关(对应 es6),增强编译开关 (对应 enhance) */ - showES6CompileOption?: boolean; + showES6CompileOption?: boolean /** 是否检查 SiteMap 索引 */ - checkSiteMap?: boolean; - }; + checkSiteMap?: boolean + } /** * 是否启用插件功能页 * 默认为 false */ - functionalPages?: boolean; + functionalPages?: boolean /** 需要在后台使用的能力 */ - requiredBackgroundModes?: ("audio" | "location")[]; + requiredBackgroundModes?: ('audio' | 'location')[] /** 使用到的插件 */ - plugins?: Record; + plugins?: Record /** * 是否支持 iPad 上屏幕旋转 * 默认为 false */ - resizable?: boolean; + resizable?: boolean /** 需要跳转的微信小程序列表 */ - navigateToMiniProgramAppIdList?: string[]; + navigateToMiniProgramAppIdList?: string[] /** 接口权限设置 */ - permission?: Record; + permission?: Record /** Worker 代码目录 */ - workers?: string; + workers?: string /** 优化配置 */ optimization?: { /** 是否开启分包优化 */ - subPackages?: boolean; - }; + subPackages?: boolean + } /** 云开发代码目录 */ - cloudfunctionRoot?: string; + cloudfunctionRoot?: string /** uni 统计配置项 */ - uniStatistics?: SimpleUniStatistics; + uniStatistics?: SimpleUniStatistics /** * Vue2 作用域插槽编译模式 * 默认为 auto */ - scopedSlotsCompiler?: "auto" | "legacy" | "augmented"; + scopedSlotsCompiler?: 'auto' | 'legacy' | 'augmented' /** * 是否合并组件虚拟节点外层属性 * 目前仅支持 style、class 属性 */ - mergeVirtualHostAttributes?: boolean; + mergeVirtualHostAttributes?: boolean /** 要半屏跳转的小程序 appid */ - embeddedAppIdList?: string[]; + embeddedAppIdList?: string[] /** 地理位置相关接口 */ - requiredPrivateInfos?: string[]; + requiredPrivateInfos?: string[] /** 目前仅支持值 requiredComponents,代表开启小程序按需注入特性 */ - lazyCodeLoading?: "requiredComponents"; - [x: string]: any; + lazyCodeLoading?: 'requiredComponents' + [x: string]: any } export interface MpAlipay { /** 使用到的插件 */ - plugins?: Record; + plugins?: Record /** * 是否启用 component2 编译 * 默认为 true */ - component2?: boolean; + component2?: boolean /** * 是否启用小程序基础库 2.0 构建 * 默认为 true */ - enableAppxNg?: boolean; + enableAppxNg?: boolean /** * 是否开启 axml 严格语法检查 * 默认为 false */ - axmlStrictCheck?: boolean; + axmlStrictCheck?: boolean /** * 是否启用多进程编译 * 默认为 false */ - enableParallelLoader?: boolean; + enableParallelLoader?: boolean /** * 是否压缩编译产物,仅在真机预览/真机调试时生效 * 默认为 false */ - enableDistFileMinify?: boolean; + enableDistFileMinify?: boolean /** uni 统计配置项 */ - uniStatistics?: SimpleUniStatistics; + uniStatistics?: SimpleUniStatistics /** * Vue2 作用域插槽编译模式 * 默认为 auto */ - scopedSlotsCompiler?: "auto" | "legacy" | "augmented"; + scopedSlotsCompiler?: 'auto' | 'legacy' | 'augmented' /** * 是否合并组件虚拟节点外层属性 * 目前仅支持 style、class 属性 */ - mergeVirtualHostAttributes?: boolean; + mergeVirtualHostAttributes?: boolean /** 目前仅支持值 requiredComponents,代表开启小程序按需注入特性 */ - lazyCodeLoading?: "requiredComponents"; - [x: string]: any; + lazyCodeLoading?: 'requiredComponents' + [x: string]: any } export interface MpBaidu { /** 百度小程序的 appid */ - appid?: string; + appid?: string /** 需要在后台使用的能力 */ - requiredBackgroundModes?: "audio"[]; + requiredBackgroundModes?: 'audio'[] /** 预请求的所有 url 的列表 */ - prefetches?: string[]; + prefetches?: string[] /** 优化配置 */ optimization?: { /** 是否开启分包优化 */ - subPackages?: boolean; - }; + subPackages?: boolean + } /** uni 统计配置项 */ - uniStatistics?: SimpleUniStatistics; + uniStatistics?: SimpleUniStatistics /** * Vue2 作用域插槽编译模式 * 默认为 auto */ - scopedSlotsCompiler?: "auto" | "legacy" | "augmented"; - [x: string]: any; + scopedSlotsCompiler?: 'auto' | 'legacy' | 'augmented' + [x: string]: any } export interface MpToutiao { /** 字节跳动小程序的 appid */ - appid?: string; + appid?: string /** 字节跳动小程序小程序项目设置 */ setting?: { /** 是否启用 ES6 转 ES5 */ - es6?: boolean; + es6?: boolean /** 上传代码时样式是否自动补全 */ - postcss?: boolean; + postcss?: boolean /** 上传代码时是否自动压缩脚本文件 */ - minified?: boolean; + minified?: boolean /** 是否检查安全域名和 TLS 版本 */ - urlCheck?: boolean; + urlCheck?: boolean /** 修改文件的时候是否自动编译 */ - autoCompile?: boolean; + autoCompile?: boolean /** 下次编译是否模拟更新 */ - mockUpdate?: boolean; + mockUpdate?: boolean /** 是否启动自定义处理命令 */ - scripts?: boolean; + scripts?: boolean /** 是否开启宿主登录模拟 */ - mockLogin?: boolean; - }; + mockLogin?: boolean + } /** 需要跳转的字节跳动小程序列表 */ - navigateToMiniProgramAppIdList?: string[]; + navigateToMiniProgramAppIdList?: string[] /** 优化配置 */ optimization?: { /** 是否开启分包优化 */ - subPackages?: boolean; - }; + subPackages?: boolean + } /** uni 统计配置项 */ - uniStatistics?: SimpleUniStatistics; + uniStatistics?: SimpleUniStatistics /** * Vue2 作用域插槽编译模式 * 默认为 auto */ - scopedSlotsCompiler?: "auto" | "legacy" | "augmented"; - [x: string]: any; + scopedSlotsCompiler?: 'auto' | 'legacy' | 'augmented' + [x: string]: any } export interface MpLark { /** 飞书小程序的 appid */ - appid?: string; + appid?: string /** 飞书小程序小程序项目设置 */ setting?: { /** 是否启用 ES6 转 ES5 */ - es6?: boolean; + es6?: boolean /** 是否启用脚本代码自动压缩 */ - minified?: boolean; + minified?: boolean /** 是否启用样式自动补全 */ - postcss?: boolean; + postcss?: boolean /** 是否检查安全域名和 TLS 版本 */ - urlCheck?: boolean; + urlCheck?: boolean /** Babel 的配置项 */ babelSetting?: { /** 需要跳过 Babel 编译(包括代码压缩)处理的文件或目录 */ - ignore?: string[]; - }; - }; + ignore?: string[] + } + } /** uni 统计配置项 */ - uniStatistics?: SimpleUniStatistics; + uniStatistics?: SimpleUniStatistics /** * Vue2 作用域插槽编译模式 * 默认为 auto */ - scopedSlotsCompiler?: "auto" | "legacy" | "augmented"; - [x: string]: any; + scopedSlotsCompiler?: 'auto' | 'legacy' | 'augmented' + [x: string]: any } export interface MpQq { /** QQ 小程序的 appid */ - appid?: string; + appid?: string /** 需要在后台使用的能力 */ - requiredBackgroundModes?: "audio"[]; + requiredBackgroundModes?: 'audio'[] /** 需要跳转的 QQ 小程序列表 */ - navigateToMiniProgramAppIdList?: string[]; + navigateToMiniProgramAppIdList?: string[] /** 接口权限设置 */ - permission?: Record; + permission?: Record /** Worker 代码目录 */ - workers?: string; + workers?: string /** 需要打开群资料卡的群号列表 */ - groupIdList?: string[]; + groupIdList?: string[] /** 优化配置 */ optimization?: { /** 是否开启分包优化 */ - subPackages?: boolean; - }; + subPackages?: boolean + } /** uni 统计配置项 */ - uniStatistics?: SimpleUniStatistics; + uniStatistics?: SimpleUniStatistics /** * Vue2 作用域插槽编译模式 * 默认为 auto */ - scopedSlotsCompiler?: "auto" | "legacy" | "augmented"; - [x: string]: any; + scopedSlotsCompiler?: 'auto' | 'legacy' | 'augmented' + [x: string]: any } export interface MpKuaishou { /** 快手小程序的 appid */ - appid?: string; + appid?: string /** 优化配置 */ optimization?: { /** 是否开启分包优化 */ - subPackages?: boolean; - }; + subPackages?: boolean + } /** uni 统计配置项 */ - uniStatistics?: SimpleUniStatistics; + uniStatistics?: SimpleUniStatistics /** * Vue2 作用域插槽编译模式 * 默认为 auto */ - scopedSlotsCompiler?: "auto" | "legacy" | "augmented"; - [x: string]: any; + scopedSlotsCompiler?: 'auto' | 'legacy' | 'augmented' + [x: string]: any } export interface ManifestConfig { /** 应用名称,安装 APP 后显示的名称 */ - name?: string; + name?: string /** * 应用标识,由 DCloud 云端分配 * 更多信息查看 */ - appid?: string; + appid?: string /** 应用描述 */ - description?: string; + description?: string /** * 当前默认语言 * 默认为 auto */ - locale?: string; + locale?: string /** 版本名称,在云打包和生成 wgt 资源时使用 */ - versionName?: string; + versionName?: string /** 版本号 */ - versionCode?: string; + versionCode?: number /** * 是否转换 px 为 rpx * 默认为 true * 建议使用 false */ - transformPx?: boolean; + transformPx?: boolean /** 网络超时时间 */ - networkTimeout?: NetworkTimeout; + networkTimeout?: NetworkTimeout /** * 是否开启 debug 模式 * 默认为 false */ - debug?: boolean; + debug?: boolean /** * uni 统计配置 * 更多信息查看 */ - uniStatistics?: UniStatistics; + uniStatistics?: UniStatistics /** APP 特有配置 */ - "app-plus"?: AppPlus; + 'app-plus'?: AppPlus /** H5 特有配置 */ - h5?: H5; + h5?: H5 /** 快应用特有配置 */ - "quickapp-webview"?: QuickappWebview; + 'quickapp-webview'?: QuickappWebview /** 快应用联盟特有配置 */ - "quickapp-webview-union"?: QuickappWebviewUnion; + 'quickapp-webview-union'?: QuickappWebviewUnion /** 快应用华为特有配置 */ - "quickapp-webview-huawei"?: QuickappWebviewHuawei; + 'quickapp-webview-huawei'?: QuickappWebviewHuawei /** 微信小程序特有配置 */ - "mp-weixin"?: MpWeixin; + 'mp-weixin'?: MpWeixin /** 支付宝小程序特有配置 */ - "mp-alipay"?: MpAlipay; + 'mp-alipay'?: MpAlipay /** 百度小程序特有配置 */ - "mp-baidu"?: MpBaidu; + 'mp-baidu'?: MpBaidu /** 字节跳动小程序特有配置 */ - "mp-toutiao"?: MpToutiao; + 'mp-toutiao'?: MpToutiao /** 飞书小程序特有配置 */ - "mp-lark"?: MpLark; + 'mp-lark'?: MpLark /** QQ 小程序特有配置 */ - "mp-qq"?: MpQq; + 'mp-qq'?: MpQq /** 快手小程序特有配置 */ - "mp-kuaishou"?: MpKuaishou; - [x: string]: any; + 'mp-kuaishou'?: MpKuaishou + [x: string]: any }