Compare commits

...
Author SHA1 Message Date
semantic-release-bot fc16d69ba6 chore: 2.0.0
## @config-plugins/react-native-pdf [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-08-04)

### ⚠ BREAKING CHANGES

* add SDK 45 support (#79)

### Features

* add SDK 45 support ([#79](https://github.com/expo/config-plugins/issues/79)) ([96c72dd](https://github.com/expo/config-plugins/commit/96c72dda469ace2b9eafd38ba4d21f1bcd2e3cdf))

### Other chores

* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
2022-08-04 16:53:20 +00:00
Fabrizio Rizzonelli bf11a17a81 docs: added expo-appcenter to the list of plugin (#95) 2022-08-04 18:50:24 +02:00
semantic-release-bot b3c6210ffc chore: 2.0.1
### @config-plugins/react-native-ble-plx [2.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-07-25)

### Bug Fixes

* **react-native-ble-plx:** Added new Bluetooth specific permission for Android 12 (SDK 31). ([#91](https://github.com/expo/config-plugins/issues/91)) ([d3df63f](https://github.com/expo/config-plugins/commit/d3df63fbb2344251b9b371959de3ce6e4b9ab0cd))
2022-07-25 12:57:23 +00:00
Tom d3df63fbb2 fix(react-native-ble-plx): Added new Bluetooth specific permission for Android 12 (SDK 31). (#91)
* fix(react-native-ble-plx): Added new Bluetooth specific permission for Android SDK 31.

Expo SDK 45 targets Android SDK 31 which requires new Bluetooth specific permissions. Without these new permissions Android 12 (SDK 31) devices don't get access to BLE.

* Update README.md

* chore(react-native-ble-plx): Added `tools:targetApi="31"` to Android Manifest (for Lint).
2022-07-25 14:54:10 +02:00
12 changed files with 277 additions and 31 deletions

No files matched your search

+1
View File
@@ -43,6 +43,7 @@ More out-of-tree plugins which can be used to configure more packages.
- [@allboatsrise/expo-marketingcloudsdk](https://www.npmjs.com/package/@allboatsrise/expo-marketingcloudsdk) (for use with `react-native-marketingcloudsdk`)
- [@ouvio/react-native-background-location-plugin](https://www.npmjs.com/package/@ouvio/react-native-background-location-plugin) (for use with `react-native-background-location-plugin`)
- [expo-community-flipper](https://www.npmjs.com/package/expo-community-flipper) (for use with Flipper)
- [expo-appcenter](https://www.npmjs.com/package/expo-appcenter) (for use with `appcenter`)
### No Plugin Required
@@ -1,3 +1,10 @@
### @config-plugins/react-native-ble-plx [2.0.1](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-07-25)
### Bug Fixes
* **react-native-ble-plx:** Added new Bluetooth specific permission for Android 12 (SDK 31). ([#91](https://github.com/expo/config-plugins/issues/91)) ([d3df63f](https://github.com/expo/config-plugins/commit/d3df63fbb2344251b9b371959de3ce6e4b9ab0cd))
## @config-plugins/react-native-ble-plx [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-05-27)
+1
View File
@@ -30,6 +30,7 @@ Next, rebuild your app as described in the ["Adding custom native code"](https:/
The plugin provides props for extra customization. Every time you change the props or plugins, you'll need to rebuild (and `prebuild`) the native app. If no extra properties are added, defaults will be used.
- `isBackgroundEnabled` (_boolean_): Enable background BLE support on Android. Adds `<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>` to the `AndroidManifest.xml`. Default `false`.
- `neverForLocation` (_boolean_): Set to true only if you can strongly assert that your app never derives physical location from Bluetooth scan results. The location permission will be still required on older Android devices. Note, that some BLE beacons are filtered from the scan results. Android SDK 31+. Default `false`. *WARNING: This parameter is experimental and BLE might not work. Make sure to test before releasing to production.*
- `modes` (_string[]_): Adds iOS `UIBackgroundModes` to the `Info.plist`. Options are: `peripheral`, and `central`. Defaults to undefined.
- `bluetoothAlwaysPermission` (_string | false_): Sets the iOS `NSBluetoothAlwaysUsageDescription` permission message to the `Info.plist`. Setting `false` will skip adding the permission. Defaults to `Allow $(PRODUCT_NAME) to connect to bluetooth devices`.
- `bluetoothPeripheralPermission` (_string | false_): Sets the iOS `NSBluetoothPeripheralUsageDescription` permission message to the `Info.plist`. Setting `false` will skip adding the permission. Defaults to `Allow $(PRODUCT_NAME) to connect to bluetooth devices`.
+1
View File
@@ -3,6 +3,7 @@ import { BackgroundMode } from "./withBLEBackgroundModes";
export { BackgroundMode };
declare const _default: ConfigPlugin<void | {
isBackgroundEnabled?: boolean | undefined;
neverForLocation?: boolean | undefined;
modes?: BackgroundMode[] | undefined;
bluetoothAlwaysPermission?: string | false | undefined;
bluetoothPeripheralPermission?: string | false | undefined;
+7 -2
View File
@@ -11,9 +11,10 @@ const pkg = { name: "react-native-ble-plx", version: "UNVERSIONED" }; //require(
* Apply BLE configuration for Expo SDK 42 projects.
*/
const withBLE = (config, props = {}) => {
var _a;
var _a, _b;
const _props = props || {};
const isBackgroundEnabled = (_a = _props.isBackgroundEnabled) !== null && _a !== void 0 ? _a : false;
const neverForLocation = (_b = _props.neverForLocation) !== null && _b !== void 0 ? _b : false;
// iOS
config = withBluetoothPermissions_1.withBluetoothPermissions(config, _props);
config = withBLEBackgroundModes_1.withBLEBackgroundModes(config, _props.modes || []);
@@ -21,8 +22,12 @@ const withBLE = (config, props = {}) => {
config = config_plugins_1.AndroidConfig.Permissions.withPermissions(config, [
"android.permission.BLUETOOTH",
"android.permission.BLUETOOTH_ADMIN",
"android.permission.BLUETOOTH_CONNECT", // since Android SDK 31
]);
config = withBLEAndroidManifest_1.withBLEAndroidManifest(config, { isBackgroundEnabled });
config = withBLEAndroidManifest_1.withBLEAndroidManifest(config, {
isBackgroundEnabled,
neverForLocation,
});
return config;
};
exports.default = config_plugins_1.createRunOncePlugin(withBLE, pkg.name, pkg.version);
+21 -3
View File
@@ -1,17 +1,35 @@
import { ConfigPlugin, AndroidConfig } from "@expo/config-plugins";
declare type InnerManifest = AndroidConfig.Manifest.AndroidManifest["manifest"];
declare type ManifestPermission = InnerManifest["permission"];
declare type ExtraTools = {
"tools:targetApi"?: string;
};
declare type ManifestUsesPermissionWithExtraTools = {
$: AndroidConfig.Manifest.ManifestUsesPermission["$"] & ExtraTools;
};
declare type AndroidManifest = {
manifest: InnerManifest & {
permission?: ManifestPermission;
"uses-permission"?: InnerManifest["uses-permission"];
"uses-permission-sdk-23"?: InnerManifest["uses-permission"];
"uses-permission"?: ManifestUsesPermissionWithExtraTools[];
"uses-permission-sdk-23"?: ManifestUsesPermissionWithExtraTools[];
"uses-feature"?: InnerManifest["uses-feature"];
};
};
export declare const withBLEAndroidManifest: ConfigPlugin<{
isBackgroundEnabled: boolean;
neverForLocation: boolean;
}>;
export declare function addFineControlPermissionToManifest(androidManifest: AndroidManifest): AndroidManifest;
/**
* Add location permissions
* - 'android.permission.ACCESS_COARSE_LOCATION' for Android SDK 28 (Android 9) and lower
* - 'android.permission.ACCESS_FINE_LOCATION' for Android SDK 29 (Android 10) and higher.
* From Android SDK 31 (Android 12) it might not be required if BLE is not used for location.
*/
export declare function addLocationPermissionToManifest(androidManifest: AndroidManifest, neverForLocationSinceSdk31: boolean): AndroidManifest;
/**
* Add 'android.permission.BLUETOOTH_SCAN'.
* Required since Android SDK 31 (Android 12).
*/
export declare function addScanPermissionToManifest(androidManifest: AndroidManifest, neverForLocation: boolean): AndroidManifest;
export declare function addBLEHardwareFeatureToManifest(androidManifest: AndroidConfig.Manifest.AndroidManifest): AndroidConfig.Manifest.AndroidManifest;
export {};
+53 -8
View File
@@ -1,10 +1,11 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.addBLEHardwareFeatureToManifest = exports.addFineControlPermissionToManifest = exports.withBLEAndroidManifest = void 0;
exports.addBLEHardwareFeatureToManifest = exports.addScanPermissionToManifest = exports.addLocationPermissionToManifest = exports.withBLEAndroidManifest = void 0;
const config_plugins_1 = require("@expo/config-plugins");
const withBLEAndroidManifest = (config, { isBackgroundEnabled }) => {
const withBLEAndroidManifest = (config, { isBackgroundEnabled, neverForLocation }) => {
return config_plugins_1.withAndroidManifest(config, (config) => {
config.modResults = addFineControlPermissionToManifest(config.modResults);
config.modResults = addLocationPermissionToManifest(config.modResults, neverForLocation);
config.modResults = addScanPermissionToManifest(config.modResults, neverForLocation);
if (isBackgroundEnabled) {
config.modResults = addBLEHardwareFeatureToManifest(config.modResults);
}
@@ -12,22 +13,66 @@ const withBLEAndroidManifest = (config, { isBackgroundEnabled }) => {
});
};
exports.withBLEAndroidManifest = withBLEAndroidManifest;
function addFineControlPermissionToManifest(androidManifest) {
var _a;
// Add `<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"/>` to the AndroidManifest.xml
/**
* Add location permissions
* - 'android.permission.ACCESS_COARSE_LOCATION' for Android SDK 28 (Android 9) and lower
* - 'android.permission.ACCESS_FINE_LOCATION' for Android SDK 29 (Android 10) and higher.
* From Android SDK 31 (Android 12) it might not be required if BLE is not used for location.
*/
function addLocationPermissionToManifest(androidManifest, neverForLocationSinceSdk31) {
if (!Array.isArray(androidManifest.manifest["uses-permission-sdk-23"])) {
androidManifest.manifest["uses-permission-sdk-23"] = [];
}
const optMaxSdkVersion = neverForLocationSinceSdk31
? {
"android:maxSdkVersion": "30",
}
: {};
if (!androidManifest.manifest["uses-permission-sdk-23"].find((item) => item.$["android:name"] === "android.permission.ACCESS_COARSE_LOCATION")) {
androidManifest.manifest["uses-permission-sdk-23"].push({
$: {
"android:name": "android.permission.ACCESS_COARSE_LOCATION",
...optMaxSdkVersion,
},
});
}
if (!androidManifest.manifest["uses-permission-sdk-23"].find((item) => item.$["android:name"] === "android.permission.ACCESS_FINE_LOCATION")) {
(_a = androidManifest.manifest["uses-permission-sdk-23"]) === null || _a === void 0 ? void 0 : _a.push({
androidManifest.manifest["uses-permission-sdk-23"].push({
$: {
"android:name": "android.permission.ACCESS_FINE_LOCATION",
...optMaxSdkVersion,
},
});
}
return androidManifest;
}
exports.addFineControlPermissionToManifest = addFineControlPermissionToManifest;
exports.addLocationPermissionToManifest = addLocationPermissionToManifest;
/**
* Add 'android.permission.BLUETOOTH_SCAN'.
* Required since Android SDK 31 (Android 12).
*/
function addScanPermissionToManifest(androidManifest, neverForLocation) {
var _a;
if (!Array.isArray(androidManifest.manifest["uses-permission"])) {
androidManifest.manifest["uses-permission"] = [];
}
if (!androidManifest.manifest["uses-permission"].find((item) => item.$["android:name"] === "android.permission.BLUETOOTH_SCAN")) {
config_plugins_1.AndroidConfig.Manifest.ensureToolsAvailable(androidManifest);
(_a = androidManifest.manifest["uses-permission"]) === null || _a === void 0 ? void 0 : _a.push({
$: {
"android:name": "android.permission.BLUETOOTH_SCAN",
...(neverForLocation
? {
"android:usesPermissionFlags": "neverForLocation",
}
: {}),
"tools:targetApi": "31",
},
});
}
return androidManifest;
}
exports.addScanPermissionToManifest = addScanPermissionToManifest;
// Add this line if your application always requires BLE. More info can be found on: https://developer.android.com/guide/topics/connectivity/bluetooth-le.html#permissions
function addBLEHardwareFeatureToManifest(androidManifest) {
var _a;
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@config-plugins/react-native-ble-plx",
"version": "2.0.0",
"version": "2.0.1",
"description": "Config plugin to auto configure react-native-ble-plx on prebuild",
"main": "build/withBLE.js",
"types": "build/withBLE.d.ts",
@@ -2,31 +2,98 @@ import { AndroidConfig, XML } from "@expo/config-plugins";
import { resolve } from "path";
import {
addLocationPermissionToManifest,
addScanPermissionToManifest,
addBLEHardwareFeatureToManifest,
addFineControlPermissionToManifest,
} from "../withBLEAndroidManifest";
const { readAndroidManifestAsync } = AndroidConfig.Manifest;
const sampleManifestPath = resolve(__dirname, "fixtures/AndroidManifest.xml");
describe("addFineControlPermissionToManifest", () => {
it(`adds element`, async () => {
describe("addLocationPermissionToManifest", () => {
it(`adds elements`, async () => {
let androidManifest = await readAndroidManifestAsync(sampleManifestPath);
androidManifest = await addFineControlPermissionToManifest(androidManifest);
expect(androidManifest.manifest["uses-permission-sdk-23"]).toStrictEqual([
{ $: { "android:name": "android.permission.ACCESS_FINE_LOCATION" } },
]);
androidManifest = addLocationPermissionToManifest(androidManifest, false);
expect(androidManifest.manifest["uses-permission-sdk-23"]).toContainEqual({
$: {
"android:name": "android.permission.ACCESS_COARSE_LOCATION",
},
});
expect(androidManifest.manifest["uses-permission-sdk-23"]).toContainEqual({
$: {
"android:name": "android.permission.ACCESS_FINE_LOCATION",
},
});
// Sanity
expect(XML.format(androidManifest)).toMatch(
/<uses-permission-sdk-23 android:name="android\.permission\.ACCESS_COARSE_LOCATION"\/>/
);
expect(XML.format(androidManifest)).toMatch(
/<uses-permission-sdk-23 android:name="android\.permission\.ACCESS_FINE_LOCATION"\/>/
);
});
it(`adds elements with SDK limit`, async () => {
let androidManifest = await readAndroidManifestAsync(sampleManifestPath);
androidManifest = addLocationPermissionToManifest(androidManifest, true);
expect(androidManifest.manifest["uses-permission-sdk-23"]).toContainEqual({
$: {
"android:name": "android.permission.ACCESS_COARSE_LOCATION",
"android:maxSdkVersion": "30",
},
});
expect(androidManifest.manifest["uses-permission-sdk-23"]).toContainEqual({
$: {
"android:name": "android.permission.ACCESS_FINE_LOCATION",
"android:maxSdkVersion": "30",
},
});
// Sanity
expect(XML.format(androidManifest)).toMatch(
/<uses-permission-sdk-23 android:name="android\.permission\.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30"\/>/
);
expect(XML.format(androidManifest)).toMatch(
/<uses-permission-sdk-23 android:name="android\.permission\.ACCESS_FINE_LOCATION" android:maxSdkVersion="30"\/>/
);
});
});
describe("addScanPermissionToManifest", () => {
it(`adds element`, async () => {
let androidManifest = await readAndroidManifestAsync(sampleManifestPath);
androidManifest = addScanPermissionToManifest(androidManifest, false);
expect(androidManifest.manifest["uses-permission"]).toContainEqual({
$: {
"android:name": "android.permission.BLUETOOTH_SCAN",
"tools:targetApi": "31",
},
});
// Sanity
expect(XML.format(androidManifest)).toMatch(
/<uses-permission android:name="android\.permission\.BLUETOOTH_SCAN" tools:targetApi="31"\/>/
);
});
it(`adds element with 'neverForLocation' attribute`, async () => {
let androidManifest = await readAndroidManifestAsync(sampleManifestPath);
androidManifest = addScanPermissionToManifest(androidManifest, true);
expect(androidManifest.manifest["uses-permission"]).toContainEqual({
$: {
"android:name": "android.permission.BLUETOOTH_SCAN",
"android:usesPermissionFlags": "neverForLocation",
"tools:targetApi": "31",
},
});
// Sanity
expect(XML.format(androidManifest)).toMatch(
/<uses-permission android:name="android\.permission\.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" tools:targetApi="31"\/>/
);
});
});
describe("addBLEHardwareFeatureToManifest", () => {
it(`adds element`, async () => {
let androidManifest = await readAndroidManifestAsync(sampleManifestPath);
androidManifest = await addBLEHardwareFeatureToManifest(androidManifest);
androidManifest = addBLEHardwareFeatureToManifest(androidManifest);
expect(androidManifest.manifest["uses-feature"]).toStrictEqual([
{
+7 -1
View File
@@ -18,12 +18,14 @@ const pkg = { name: "react-native-ble-plx", version: "UNVERSIONED" }; //require(
*/
const withBLE: ConfigPlugin<{
isBackgroundEnabled?: boolean;
neverForLocation?: boolean;
modes?: BackgroundMode[];
bluetoothAlwaysPermission?: string | false;
bluetoothPeripheralPermission?: string | false;
} | void> = (config, props = {}) => {
const _props = props || {};
const isBackgroundEnabled = _props.isBackgroundEnabled ?? false;
const neverForLocation = _props.neverForLocation ?? false;
// iOS
config = withBluetoothPermissions(config, _props);
@@ -33,8 +35,12 @@ const withBLE: ConfigPlugin<{
config = AndroidConfig.Permissions.withPermissions(config, [
"android.permission.BLUETOOTH",
"android.permission.BLUETOOTH_ADMIN",
"android.permission.BLUETOOTH_CONNECT", // since Android SDK 31
]);
config = withBLEAndroidManifest(config, { isBackgroundEnabled });
config = withBLEAndroidManifest(config, {
isBackgroundEnabled,
neverForLocation,
});
return config;
};
@@ -8,20 +8,38 @@ type InnerManifest = AndroidConfig.Manifest.AndroidManifest["manifest"];
type ManifestPermission = InnerManifest["permission"];
// TODO: add to `AndroidManifestAttributes` in @expo/config-plugins
type ExtraTools = {
// https://developer.android.com/studio/write/tool-attributes#toolstargetapi
"tools:targetApi"?: string;
};
type ManifestUsesPermissionWithExtraTools = {
$: AndroidConfig.Manifest.ManifestUsesPermission["$"] & ExtraTools;
};
type AndroidManifest = {
manifest: InnerManifest & {
permission?: ManifestPermission;
"uses-permission"?: InnerManifest["uses-permission"];
"uses-permission-sdk-23"?: InnerManifest["uses-permission"];
"uses-permission"?: ManifestUsesPermissionWithExtraTools[];
"uses-permission-sdk-23"?: ManifestUsesPermissionWithExtraTools[];
"uses-feature"?: InnerManifest["uses-feature"];
};
};
export const withBLEAndroidManifest: ConfigPlugin<{
isBackgroundEnabled: boolean;
}> = (config, { isBackgroundEnabled }) => {
neverForLocation: boolean;
}> = (config, { isBackgroundEnabled, neverForLocation }) => {
return withAndroidManifest(config, (config) => {
config.modResults = addFineControlPermissionToManifest(config.modResults);
config.modResults = addLocationPermissionToManifest(
config.modResults,
neverForLocation
);
config.modResults = addScanPermissionToManifest(
config.modResults,
neverForLocation
);
if (isBackgroundEnabled) {
config.modResults = addBLEHardwareFeatureToManifest(config.modResults);
}
@@ -29,23 +47,84 @@ export const withBLEAndroidManifest: ConfigPlugin<{
});
};
export function addFineControlPermissionToManifest(
androidManifest: AndroidManifest
/**
* Add location permissions
* - 'android.permission.ACCESS_COARSE_LOCATION' for Android SDK 28 (Android 9) and lower
* - 'android.permission.ACCESS_FINE_LOCATION' for Android SDK 29 (Android 10) and higher.
* From Android SDK 31 (Android 12) it might not be required if BLE is not used for location.
*/
export function addLocationPermissionToManifest(
androidManifest: AndroidManifest,
neverForLocationSinceSdk31: boolean
) {
// Add `<uses-permission-sdk-23 android:name="android.permission.ACCESS_FINE_LOCATION"/>` to the AndroidManifest.xml
if (!Array.isArray(androidManifest.manifest["uses-permission-sdk-23"])) {
androidManifest.manifest["uses-permission-sdk-23"] = [];
}
const optMaxSdkVersion = neverForLocationSinceSdk31
? {
"android:maxSdkVersion": "30",
}
: {};
if (
!androidManifest.manifest["uses-permission-sdk-23"].find(
(item) =>
item.$["android:name"] === "android.permission.ACCESS_COARSE_LOCATION"
)
) {
androidManifest.manifest["uses-permission-sdk-23"].push({
$: {
"android:name": "android.permission.ACCESS_COARSE_LOCATION",
...optMaxSdkVersion,
},
});
}
if (
!androidManifest.manifest["uses-permission-sdk-23"].find(
(item) =>
item.$["android:name"] === "android.permission.ACCESS_FINE_LOCATION"
)
) {
androidManifest.manifest["uses-permission-sdk-23"]?.push({
androidManifest.manifest["uses-permission-sdk-23"].push({
$: {
"android:name": "android.permission.ACCESS_FINE_LOCATION",
...optMaxSdkVersion,
},
});
}
return androidManifest;
}
/**
* Add 'android.permission.BLUETOOTH_SCAN'.
* Required since Android SDK 31 (Android 12).
*/
export function addScanPermissionToManifest(
androidManifest: AndroidManifest,
neverForLocation: boolean
) {
if (!Array.isArray(androidManifest.manifest["uses-permission"])) {
androidManifest.manifest["uses-permission"] = [];
}
if (
!androidManifest.manifest["uses-permission"].find(
(item) => item.$["android:name"] === "android.permission.BLUETOOTH_SCAN"
)
) {
AndroidConfig.Manifest.ensureToolsAvailable(androidManifest);
androidManifest.manifest["uses-permission"]?.push({
$: {
"android:name": "android.permission.BLUETOOTH_SCAN",
...(neverForLocation
? {
"android:usesPermissionFlags": "neverForLocation",
}
: {}),
"tools:targetApi": "31",
},
});
}
+16
View File
@@ -1,3 +1,19 @@
## @config-plugins/react-native-pdf [2.0.0](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-08-04)
### ⚠ BREAKING CHANGES
* add SDK 45 support (#79)
### Features
* add SDK 45 support ([#79](https://github.com/expo/config-plugins/issues/79)) ([96c72dd](https://github.com/expo/config-plugins/commit/96c72dda469ace2b9eafd38ba4d21f1bcd2e3cdf))
### Other chores
* publish packages [no-ci] ([0c7b413](https://github.com/expo/config-plugins/commit/0c7b413a765e4b1ff92b9e3edc2b62077c41ce46))
### @config-plugins/react-native-pdf [1.0.2](https://github.com/expo/config-plugins/compare/@config-plugins/[email protected]...@config-plugins/[email protected]) (2022-03-22)