Expo App.json.添加权限选项(maxSdk, useSdk)



问题:

但是Android权限有一些变化,需要为不同的sdk指定不同的权限。例如:蓝牙

参见底部的蓝牙示例。

现在在App.json上的工作方式示例

在App Expo App.json Permission中,我只能添加一个可以在每个版本的Android上使用的直接权限。

我想做什么

但是我想使用Expo工作流,在App.json上设置并自动生成Android Manifest。但我不知道如何添加额外的选项,如maxSdk: 30

当前工作区我可以手动设置生成文件的权限。这是有效的。但在一个新的项目预构建,它可以被覆盖,我需要重新编辑文件。

<manifest>
<!-- Request legacy Bluetooth permissions on older devices. -->
<uses-permission android:name="android.permission.BLUETOOTH"
android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
android:maxSdkVersion="30" />
<!-- Needed only if your app looks for Bluetooth devices.
If your app doesn't use Bluetooth scan results to derive physical
location information, you can strongly assert that your app
doesn't derive physical location. -->
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<!-- Needed only if your app makes the device discoverable to Bluetooth
devices. -->
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<!-- Needed only if your app communicates with already-paired Bluetooth
devices. -->
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- Needed only if your app uses Bluetooth scan results to derive physical location. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
...
</manifest>

好了,我找到了一个使用Expo配置插件的解决方案。

最重要的是,在你的Expo配置/app.config.js;在android部分,您可以添加android API 31+所需的新权限:

permissions: ["BLUETOOTH", "BLUETOOTH_CONNECT"]

这对我来说似乎很好。

对于传统支持,或者如果你有问题[像我一样],如果传统蓝牙被添加,即使沿着新的BLUETOOTH_CONNECT,你的应用程序崩溃,例如,使用这个配置插件。

创建一个新文件:withModifyBluetoothPermission.js:

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const config_plugins_1 = require("@expo/config-plugins");
const withModifyBluetoothPermission = (config) => {
return (0, config_plugins_1.withAndroidManifest)(config, (config) => {
config.modResults = withModifyBluetoothPlatform(config.modResults);
return config;
});
};
function withModifyBluetoothPlatform(androidManifest) {
if (!Array.isArray(androidManifest.manifest["uses-permission"])) {
androidManifest.manifest["uses-permission"] = [];
}
if (androidManifest.manifest["uses-permission"].find((item) => item.$["android:name"] === "android.permission.BLUETOOTH")) {
config_plugins_1.AndroidConfig.Manifest.ensureToolsAvailable(androidManifest);
androidManifest.manifest["uses-permission"] = androidManifest.manifest["uses-permission"].filter((item) => item.$["android:name"] !== "android.permission.BLUETOOTH");
androidManifest.manifest["uses-permission"]?.push({
$: {
"android:name": "android.permission.BLUETOOTH",
"android:maxSdkVersion": "30",
},
});
}
return androidManifest;
}
exports.default = withModifyBluetoothPermission;

创建后,将其添加到Expo Config/app.config.js中,如:

plugins: [
["./config_plugins/withModifyBluetoothPermission"],
]

请注意,我只是修改蓝牙,使其具有所需的maxSdk选项,对于其余的,也许你可以根据上面的config-plugin修改它们。