Skip to content

Commit

Permalink
push模块适配
Browse files Browse the repository at this point in the history
  • Loading branch information
wtto00 committed Oct 16, 2024
1 parent 3767215 commit 07a3fcb
Show file tree
Hide file tree
Showing 10 changed files with 413 additions and 50 deletions.
2 changes: 1 addition & 1 deletion docs/manifest.config.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ assignees: []
- [ ] `app-plus.distribute.sdkConfigs.maps`: 可选,JSON 对象,Maps(地图)模块三方 SDK 配置
- [x] `app-plus.distribute.sdkConfigs.oauth`: 可选,JSON 对象,OAuth(登录鉴权)模块三方 SDK 配置
- [ ] `app-plus.distribute.sdkConfigs.payment`: 可选,JSON 对象,Payment(支付)模块三方 SDK 配置
- [ ] `app-plus.distribute.sdkConfigs.push`: 可选,JSON 对象,Push(消息推送)模块三方 SDK 配置
- [x] `app-plus.distribute.sdkConfigs.push`: 可选,JSON 对象,Push(消息推送)模块三方 SDK 配置
- [x] `app-plus.distribute.sdkConfigs.share`: 可选,JSON 对象,Share(分享)模块三方 SDK 配置
- [x] `app-plus.distribute.sdkConfigs.speech`: 可选,JSON 对象,Speech(语音识别)模块三方 SDK 配置
- [ ] `app-plus.distribute.sdkConfigs.statics`: 可选,JSON 对象,Statistic(统计)模块三方 SDK 配置
Expand Down
6 changes: 4 additions & 2 deletions packages/cli/src/android/modules/geolocation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@ export function appendGeolocation(results: Results, manifest: ManifestConfig) {

appendService(results.androidManifest, {
'com.baidu.location.f': {
'android:enabled': 'true',
'android:process': ':remote',
properties: {
'android:enabled': 'true',
'android:process': ':remote',
},
},
})
}
Expand Down
196 changes: 193 additions & 3 deletions packages/cli/src/android/modules/push.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,201 @@
import { ManifestConfig } from '@uniapp-cli/common'
import { Log, ManifestConfig } from '@uniapp-cli/common'
import { Results } from '../prepare'
import { appendSet } from '../../utils/util'
import { appendActivity, appendMetaData, appendService } from '../templates/AndroidManifest.xml'
import { appendFeature } from '../templates/dcloud_properties.xml'
import { appendDependencies, appendPlugin } from '../templates/app-build.gradle'
import { extname, resolve } from 'node:path'
import { androidDir } from '../../utils/path'

export function appendPush(results: Results, manifest: ManifestConfig) {
const Push = manifest['app-plus']?.modules?.Push
if (!Push) return

const push = manifest['app-plus']?.distribute?.sdkConfigs?.push
// https://uniapp.dcloud.net.cn/unipush-v1.html
// https://nativesupport.dcloud.net.cn/AppDocs/usemodule/androidModuleConfig/push.html

if (push?.unipush?.version !== '2') {
Log.warn('不支持uniPush1.0版本。请改用2.0版本')
return
}

const { appid, appkey, appsecret, icons, offline, fcm, mi, meizu, hms, honor, oppo, vivo } = push.unipush

// HBuilderX 3.99及以上版本所需的libs仅为:
appendSet(results.libs, new Set(['aps-release.aar', 'aps-unipush-release.aar']))

results.appBuildGradle.manifestPlaceholders = {
...results.appBuildGradle.manifestPlaceholders,
GETUI_APPID: appid ?? '',
'plus.unipush.appid': appid ?? '',
'plus.unipush.appkey': appkey ?? '',
'plus.unipush.appsecret': appsecret ?? '',
'apk.applicationId': manifest['app-plus']?.distribute?.android?.packagename ?? '',
}

results.buildGradle.allRepositories.add('https://mvn.getui.com/nexus/content/repositories/releases')

appendDependencies(results.appBuildGradle, {
'com.getui:gtsdk:3.3.7.0': { exclude: { group: 'com.getui' } },
'com.getui:gtc-dcloud:3.2.16.7': {},
})

appendActivity(results.androidManifest, {
'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:host': 'io.dcloud.unipush',
'android:path': '/',
'android:scheme': 'unipush',
},
],
},
],
},
})

appendFeature(results.properties.features, {
name: 'Push',
value: 'io.dcloud.feature.aps.APSFeatureImpl',
module: {
unipush: 'io.dcloud.feature.unipush.GTPushService',
},
})
Object.assign(results.properties.services, {
push: 'io.dcloud.feature.aps.APSFeatureImpl',
})

if (icons?.small) {
const allSize = ['ldpi', 'mdpi', 'hdpi', 'xhdpi', 'xxhdpi'] as const
allSize.forEach((size) => {
if (icons.small?.[size]) {
results.filesCopy[resolve(global.projectRoot, 'src', icons.small?.[size])] = resolve(
androidDir,
'app/src/main/res',
`drawable-${size}`,
`push${extname(icons.small?.[size])}`,
)
}
})
}

if (!offline) return

if (fcm) {
appendSet(results.libs, new Set(['aps-release.aar', 'aps-fcm-release.aar']))
// const sdkForGj = findLibSDK('sdk-for-gj-')
// if (sdkForGj) results.libs.add(sdkForGj)
// const fcmSdk = findLibSDK('fcm-')
// if (fcmSdk) results.libs.add(fcmSdk)
const googleServicesPath = resolve(global.projectRoot, 'src', fcm.googleServices ?? '')
results.filesCopy[googleServicesPath] = resolve(androidDir, 'app', 'google-services.json')
results.buildGradle.dependencies.add('com.google.gms:google-services:4.3.14')
appendPlugin(results.appBuildGradle, new Set(['com.google.gms.google-services']))
appendDependencies(results.appBuildGradle, {
'com.google.firebase:firebase-messaging:23.2.1': {},
})
appendService(results.androidManifest, {
'io.dcloud.feature.fcm.FCMVendorService': {
properties: {
'android:exported': 'false',
},
intentFilter: [
{
action: new Set(['com.google.firebase.MESSAGING_EVENT']),
},
],
},
})
appendMetaData(results.androidManifest, {
'com.google.firebase.messaging.default_notification_channel_id': { value: fcm.channelId },
'com.google.firebase.messaging.default_notification_icon': { value: '@drawable/push' },
})
appendFeature(results.properties.features, {
name: 'Push',
value: 'io.dcloud.feature.aps.APSFeatureImpl',
module: {
fcm: 'io.dcloud.feature.fcm.FCMPushService',
},
})
}
if (hms) {
// 华为
results.appBuildGradle.manifestPlaceholders.HUAWEI_APP_ID = hms.appid ?? ''
appendDependencies(results.appBuildGradle, {
'com.getui.opt:hwp:3.1.1': {},
'com.huawei.hms:push:6.11.0.300': {},
})
results.buildGradle.repositories.add('https://developer.huawei.com/repo/')
results.buildGradle.dependencies.add('com.huawei.agconnect:agcp:1.6.0.300')
results.buildGradle.allRepositories.add('https://developer.huawei.com/repo/')
appendPlugin(results.appBuildGradle, new Set(['com.android.application', 'com.huawei.agconnect']))
const agconnectServicesPath = resolve(global.projectRoot, 'src', hms.agconnectServices ?? '')
results.filesCopy[agconnectServicesPath] = resolve(androidDir, 'app', 'agconnect-services.json')
}
if (honor) {
// 荣耀
results.appBuildGradle.manifestPlaceholders.HONOR_APP_ID = honor.appid ?? ''
appendDependencies(results.appBuildGradle, {
'com.getui.opt:honor:3.6.0': {},
'com.hihonor.mcs:push:7.0.61.303': {},
})
results.buildGradle.repositories.add('https://developer.hihonor.com/repo/')
results.buildGradle.allRepositories.add('https://developer.hihonor.com/repo/')
}
if (meizu) {
// 魅族
results.appBuildGradle.manifestPlaceholders.MEIZU_APP_ID = meizu.appid ?? ''
results.appBuildGradle.manifestPlaceholders.MEIZU_APP_KEY = meizu.appkey ?? ''
appendDependencies(results.appBuildGradle, {
'com.getui.opt:mzp:3.2.3': {},
})
}
if (mi) {
// 小米
results.appBuildGradle.manifestPlaceholders.XIAOMI_APP_ID = mi.appid ?? ''
results.appBuildGradle.manifestPlaceholders.XIAOMI_APP_KEY = mi.appkey ?? ''
appendDependencies(results.appBuildGradle, {
'com.getui.opt:xmp:3.3.1': {},
})
}
if (oppo) {
// oppo
results.appBuildGradle.manifestPlaceholders.OPPO_APP_KEY = oppo.appkey ?? ''
results.appBuildGradle.manifestPlaceholders.OPPO_APP_SECRET = oppo.appsecret ?? ''
appendDependencies(results.appBuildGradle, {
'com.assist-v3:oppo:3.3.0': {},
'com.google.code.gson:gson:2.6.2': {},
'commons-codec:commons-codec:1.6': {},
'androidx.annotation:annotation:1.1.0': {},
})
appendActivity(results.androidManifest, {
'io.dcloud.PandoraEntry': {
properties: {},
intentFilter: [
{
action: new Set(['android.intent.action.oppopush']),
category: new Set(['android.intent.category.DEFAULT']),
},
],
},
})
appendDependencies(results.appBuildGradle, {
'com.assist-v3:oppo:3.3.0': {},
'com.google.code.gson:gson:2.6.2': {},
'commons-codec:commons-codec:1.6': {},
'androidx.annotation:annotation:1.1.0': {},
})
}
if (vivo) {
// vivo
results.appBuildGradle.manifestPlaceholders.VIVO_APP_ID = vivo.appid ?? ''
results.appBuildGradle.manifestPlaceholders.VIVO_APP_KEY = vivo.appkey ?? ''
appendDependencies(results.appBuildGradle, {
'com.assist-v3:vivo:3.1.1': {},
})
}
}
24 changes: 16 additions & 8 deletions packages/cli/src/android/templates/AndroidManifest.xml.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export interface AndroidManifest {
/** meta-data节点, key为android:name属性值 */
metaData?: Record<string, MetaData>
/** service节点, key为android:name属性值 */
service?: Record<string, NodeProperties>
service?: Record<string, Partial<Activity>>
}

export const defaultAndroidManifest: AndroidManifest = {
Expand Down Expand Up @@ -115,8 +115,11 @@ export function appendPermissions(manifest: AndroidManifest, permissions: Androi
manifest.permissions = mergeRecord(manifest.permissions, permissions)
}

export function mergeActivity(activity1?: Record<string, Activity>, activity2?: Record<string, Activity>) {
const activity: Record<string, Activity> = {}
export function mergeActivity<T extends Activity | Partial<Activity> = Activity>(
activity1?: Record<string, T>,
activity2?: Record<string, T>,
) {
const activity: Record<string, T> = {}
for (const name in activity1) {
if (activity2?.[name]) {
activity[name] = {
Expand All @@ -126,7 +129,7 @@ export function mergeActivity(activity1?: Record<string, Activity>, activity2?:
},
intentFilter: [...(activity1[name].intentFilter ?? []), ...(activity2[name].intentFilter ?? [])],
metaData: mergeRecord(activity1[name].metaData, activity2[name].metaData),
}
} as T
} else {
activity[name] = activity1[name]
}
Expand All @@ -153,7 +156,7 @@ export function mergeAndroidManifest(manifest1: Partial<AndroidManifest>, manife
application: { ...manifest1.application, ...manifest2.application },
activity: mergeActivity(manifest1.activity, manifest2.activity),
metaData: mergeRecord(manifest1.metaData, manifest2.metaData),
service: mergeRecord<NodeProperties>(manifest1.service, manifest2.service),
service: mergeActivity(manifest1.service, manifest2.service),
hasTaskAffinity: manifest2.hasTaskAffinity ?? manifest1.hasTaskAffinity,
}
return manifest
Expand Down Expand Up @@ -202,7 +205,8 @@ function generatePermissions(permissions: AndroidManifest['permissions'] = {}) {
return permissionXML.join('\n ')
}

function generateProperties(properties: NodeProperties, space = 8) {
function generateProperties(properties?: NodeProperties, space = 8) {
if (!properties) return ''
const propertiesXML: string[] = []
Object.keys(properties).forEach((name) => {
propertiesXML.push(`${name}="${properties[name]}"`)
Expand Down Expand Up @@ -262,6 +266,7 @@ function generateActivity(activity: AndroidManifest['activity']) {
const activityXml: string[] = []
Object.keys(activity).forEach((name) => {
activityXml.push(`<activity
android:name="${name}"
${generateProperties(activity[name].properties, 12)}>
${generateIntentFilter(activity[name].intentFilter, 12)}
${genderateMetaData(activity[name].metaData, 12)}
Expand All @@ -270,10 +275,13 @@ function generateActivity(activity: AndroidManifest['activity']) {
return activityXml.join('\n\n ')
}

function generateService(service: Record<string, NodeProperties> = {}, space = 8) {
function generateService(service: Record<string, Partial<Activity>> = {}, space = 8) {
const services: string[] = []
Object.keys(service).forEach((name) => {
services.push(`<service android:name="${name}" ${generateProperties(service[name])} />`)
services.push(`<service android:name="${name}" ${generateProperties(service[name].properties)}>
${generateSpace(space + 4)}${generateIntentFilter(service[name].intentFilter, space + 4)}
${generateSpace(space + 4)}${genderateMetaData(service[name].metaData, space + 4)}
${generateSpace(space)}</service>`)
})
return services.join(`\n${generateSpace(space)}`)
}
Expand Down
5 changes: 5 additions & 0 deletions packages/cli/src/android/templates/app-build.gradle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@ function mergeField<T extends keyof AppBuildGradle>(
return buildGradle2?.[fieldName] ?? buildGradle1?.[fieldName]
}

export function appendPlugin(buildGradle: AppBuildGradle, plugins?: Set<string>) {
if (!buildGradle.plugins) buildGradle.plugins = plugins
else appendSet(buildGradle.plugins, plugins)
}

export function mergeDependencies(
dependencies1?: Record<string, AppBuildGradleDependency>,
dependencies2?: Record<string, AppBuildGradleDependency>,
Expand Down
Loading

0 comments on commit 07a3fcb

Please sign in to comment.