如何在博览会管理的工作流中为android添加值app.json ?



我需要将这些添加到Android文件:

android:usesCleartextTraffic="true"<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

但是我正在使用管理工作流,我不知道如何将这些行添加到app.json文件。

我做了这个插件,似乎可以工作:

const { createRunOncePlugin, withAndroidManifest } = require('@expo/config-plugins');
const withAndroidManifestHavingBetterSecuritySettings = config => {
return withAndroidManifest(config, config => {
const androidManifest = config.modResults.manifest;
const mainApplication = androidManifest.application[0];
if(process.env.CHANNEL !== 'dev') {
androidManifest.$ = {
...androidManifest.$,
'xmlns:tools': 'http://schemas.android.com/tools',
};
mainApplication.$['tools:replace'] = 'android:usesCleartextTraffic';
mainApplication.$['android:usesCleartextTraffic'] = 'false';
}
return config;
});
};
module.exports = createRunOncePlugin(
withAndroidManifestHavingBetterSecuritySettings,
'withAndroidManifestHavingBetterSecuritySettings',
'1.0.0'
);

我有许多与合并AndroidManifest文件有关的问题,当"developmentClient": true在我的eas.json文件(与我的deveas配置文件相关)。我相信这与debug/AndroidManifest比main/AndroidManifest优先级更高的事实有关(虽然不确定)。因此,我的解决方案是在构建dev配置文件时不要忽略这些更改。无论如何,在开发版本中加强安全设置似乎没什么用。

所以我在这个问题上挣扎了一段时间,我能想到的唯一解决方案是将android应用程序的最小sdk版本从21设置为28。这是不理想的,因为我的应用程序现在不支持旧的android设备,但这样做默认的usesClearTextTraffic标志为false。

如果您的应用程序在expo中开发时运行良好,但在生成APK后某些功能不起作用,请尝试此操作。在我的例子中,APK登录时崩溃了,但与世博会一起开发的建筑工作正常。问题是流量是加密的,所以这就是为什么我在这里试图设置明文流量。我的问题是expoPushToken,在APK中它抛出了一个我没有捕捉到的异常(正如我之前所说的,用expo构建工作得很好,没有例外)。因此,如果发生异常,只需捕获它并将令牌设置为空字符串。这里是:

import * as Notifications from "expo-notifications";
export async function getDevicePushTokenForAPP() {
const pushToken = await Notifications.getExpoPushTokenAsync();
return pushToken.data;
}

然后,我添加了try and catch:

export async function getDevicePushTokenForAPP() {
try {
const pushToken = await Notifications.getExpoPushTokenAsync();
return pushToken.data;
} catch (e) {
return "";
}
}

现在,如果你再次构建APK (expo build:android),它应该工作正常,在我的情况下登录工作。但请注意,这只是为了测试目的,我需要APK快速显示给客户。(注意,当你上传到Playstore时,你需要的是bundle,而不是apk)。这是一个快速修复你测试APK;但如果没有代币,推送通知就无法工作。最后的解决方案是将firebase添加到您的项目中,现在这是强制性的,所以添加firebase并使用firebase唯一ID,您的推送通知将在您的APK中工作。我的结论是expo使用自己的ID与firebase通信,这就是为什么它在开发过程中工作,但APK不通过expo并试图直接连接firebase,但因为没有ID而崩溃。

你应该这样更新你的app.json:

"android": {
"usesCleartextTraffic": true,
uses-permission android:name
},

最新更新