Integrate Huawei Maven repository and AGConnect plugin into settings.gradle using the withSettingsGradle helper. This ensures the necessary repositories and plugin management are correctly configured for Huawei Push services.
161 lines
5.4 KiB
JavaScript
161 lines
5.4 KiB
JavaScript
const {
|
|
withAppBuildGradle,
|
|
withProjectBuildGradle,
|
|
withSettingsGradle,
|
|
withDangerousMod,
|
|
withAndroidManifest,
|
|
} = require('@expo/config-plugins');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const withHuaweiPush = (config, options = {}) => {
|
|
const { jpushVersion = '5.8.0' } = options;
|
|
|
|
config = withSettingsGradle(config, (config) => {
|
|
const contents = config.modResults.contents;
|
|
|
|
if (!contents.includes('developer.huawei.com/repo')) {
|
|
if (contents.includes('pluginManagement')) {
|
|
config.modResults.contents = contents.replace(
|
|
/(pluginManagement\s*\{[\s\S]*?repositories\s*\{)/,
|
|
`$1\n maven { url 'https://developer.huawei.com/repo/' }`
|
|
);
|
|
}
|
|
if (!config.modResults.contents.includes('developer.huawei.com/repo')) {
|
|
config.modResults.contents =
|
|
`pluginManagement {\n repositories {\n maven { url 'https://developer.huawei.com/repo/' }\n }\n}\n` +
|
|
config.modResults.contents;
|
|
}
|
|
}
|
|
|
|
if (!config.modResults.contents.includes("id 'com.huawei.agconnect'")) {
|
|
if (config.modResults.contents.includes('pluginManagement')) {
|
|
config.modResults.contents = config.modResults.contents.replace(
|
|
/(pluginManagement\s*\{)/,
|
|
`$1\n plugins {\n id 'com.huawei.agconnect' version '1.9.1.301' apply false\n }`
|
|
);
|
|
}
|
|
}
|
|
|
|
if (!config.modResults.contents.includes('developer.huawei.com/repo')) {
|
|
const depMgmtPattern = /dependencyResolutionManagement\s*\{[\s\S]*?repositories\s*\{/;
|
|
if (depMgmtPattern.test(config.modResults.contents)) {
|
|
config.modResults.contents = config.modResults.contents.replace(
|
|
depMgmtPattern,
|
|
`$&\n maven { url 'https://developer.huawei.com/repo/' }`
|
|
);
|
|
}
|
|
}
|
|
|
|
return config;
|
|
});
|
|
|
|
config = withProjectBuildGradle(config, (config) => {
|
|
const contents = config.modResults.contents;
|
|
|
|
if (!contents.includes('developer.huawei.com/repo')) {
|
|
config.modResults.contents = contents.replace(
|
|
/(repositories\s*\{)/g,
|
|
(match) => {
|
|
return match + `\n maven { url 'https://developer.huawei.com/repo/' }`;
|
|
}
|
|
);
|
|
}
|
|
|
|
return config;
|
|
});
|
|
|
|
config = withProjectBuildGradle(config, (config) => {
|
|
const contents = config.modResults.contents;
|
|
|
|
if (!contents.includes('com.huawei.agconnect:agcp')) {
|
|
if (contents.includes('buildscript')) {
|
|
const depsPattern = /(buildscript\s*\{[\s\S]*?dependencies\s*\{)/;
|
|
if (depsPattern.test(contents)) {
|
|
config.modResults.contents = contents.replace(
|
|
depsPattern,
|
|
`$1\n classpath 'com.huawei.agconnect:agcp:1.9.1.301'`
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!config.modResults.contents.includes('developer.huawei.com/repo')) {
|
|
const bsRepoPattern = /(buildscript\s*\{[\s\S]*?repositories\s*\{)/;
|
|
if (bsRepoPattern.test(config.modResults.contents)) {
|
|
config.modResults.contents = config.modResults.contents.replace(
|
|
bsRepoPattern,
|
|
`$1\n maven { url 'https://developer.huawei.com/repo/' }`
|
|
);
|
|
}
|
|
}
|
|
|
|
return config;
|
|
});
|
|
|
|
config = withAppBuildGradle(config, (config) => {
|
|
const contents = config.modResults.contents;
|
|
|
|
if (!contents.includes('com.huawei.agconnect')) {
|
|
const applyPluginPattern = /apply plugin:\s*['"]com\.google\.gms\.google-services['"]/;
|
|
if (applyPluginPattern.test(contents)) {
|
|
config.modResults.contents = contents.replace(
|
|
applyPluginPattern,
|
|
`apply plugin: 'com.google.gms.google-services'\napply plugin: 'com.huawei.agconnect'`
|
|
);
|
|
} else {
|
|
const lastApplyPlugin = /apply plugin:[^\n]*(?:\n)/g;
|
|
const matches = contents.match(lastApplyPlugin);
|
|
if (matches && matches.length > 0) {
|
|
const lastMatch = matches[matches.length - 1];
|
|
const lastIndex = contents.lastIndexOf(lastMatch);
|
|
config.modResults.contents =
|
|
contents.slice(0, lastIndex + lastMatch.length) +
|
|
"apply plugin: 'com.huawei.agconnect'\n" +
|
|
contents.slice(lastIndex + lastMatch.length);
|
|
} else {
|
|
config.modResults.contents = contents + "\napply plugin: 'com.huawei.agconnect'\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!contents.includes('cn.jiguang.sdk.plugin:huawei')) {
|
|
const depsPattern = /dependencies\s*\{/;
|
|
if (depsPattern.test(config.modResults.contents)) {
|
|
config.modResults.contents = config.modResults.contents.replace(
|
|
depsPattern,
|
|
`dependencies {\n implementation 'cn.jiguang.sdk.plugin:huawei:${jpushVersion}'`
|
|
);
|
|
}
|
|
}
|
|
|
|
return config;
|
|
});
|
|
|
|
config = withDangerousMod(config, [
|
|
'android',
|
|
async (config) => {
|
|
const appDir = path.join(config.modRequest.platformProjectRoot, 'app');
|
|
const srcFile = path.join(config.modRequest.projectRoot, 'plugins', 'agconnect-services.json');
|
|
const destFile = path.join(appDir, 'agconnect-services.json');
|
|
|
|
if (fs.existsSync(srcFile)) {
|
|
fs.copyFileSync(srcFile, destFile);
|
|
console.log('[withHuaweiPush] copied agconnect-services.json to android/app/');
|
|
} else {
|
|
console.warn('[withHuaweiPush] agconnect-services.json not found at project root');
|
|
}
|
|
|
|
return config;
|
|
},
|
|
]);
|
|
|
|
config = withAndroidManifest(config, (config) => {
|
|
return config;
|
|
});
|
|
|
|
return config;
|
|
};
|
|
|
|
module.exports = withHuaweiPush;
|