-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathapp.plugin.js
More file actions
96 lines (85 loc) · 2.85 KB
/
app.plugin.js
File metadata and controls
96 lines (85 loc) · 2.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
const {
withAndroidManifest,
withInfoPlist,
createRunOncePlugin,
} = require('@expo/config-plugins');
const {Description, Android, Ios} = require('./app.plugin.utils');
const pack = require('./package.json');
/**
* @param {import("@expo/config-plugins").ExportedConfigWithProps} config
* @param {Record<String, any>} props
*/
function withLocationAndroid(config, props = {}) {
return withAndroidManifest(config, resource => {
const manifest = resource.modResults.manifest;
manifest['uses-permission'] = manifest['uses-permission'] || [];
Android.addPermission(
manifest['uses-permission'],
'android.permission.ACCESS_FINE_LOCATION',
);
Android.addPermission(
manifest['uses-permission'],
'android.permission.ACCESS_COARSE_LOCATION',
);
if (props.background) {
Android.addPermission(
manifest['uses-permission'],
'android.permission.ACCESS_BACKGROUND_LOCATION',
);
Android.addPermission(
manifest['uses-permission'],
'android.permission.FOREGROUND_SERVICE',
);
Android.addPermission(
manifest['uses-permission'],
'android.permission.FOREGROUND_SERVICE_LOCATION',
);
Android.addPermission(
manifest['uses-permission'],
'android.permission.POST_NOTIFICATIONS',
);
manifest.application[0].service = manifest.application[0].service || [];
Android.addService(manifest.application[0].service, {
'android:name': '.RNLocationForeground',
'android:exported': 'false',
'android:foregroundServiceType': 'location',
});
}
return resource;
});
}
/**
* @param {import("@expo/config-plugins").ExportedConfigWithProps} config
* @param {Record<String, any>} props
*/
function withLocationIos(config, props = {}) {
return withInfoPlist(config, resource => {
const info = resource.modResults;
const values = {
foreground: {
key: 'NSLocationWhenInUseUsageDescription',
value: props?.foregroundDescription || Description.foreground,
},
background: {
key: 'NSLocationAlwaysAndWhenInUseUsageDescription',
value: props?.backgroundDescription || Description.background,
},
};
Ios.addPermission(info, values.foreground.key, values.foreground.value);
if (props.background) {
Ios.addPermission(info, values.background.key, values.background.value);
info.UIBackgroundModes = info.UIBackgroundModes || [];
Ios.addBackgroundMode(info.UIBackgroundModes, 'location');
}
return resource;
});
}
/**
* @type {import("@expo/config-plugins").ConfigPlugin<Record<string, any>>}
*/
const withLocation = (config, props) => {
config = withLocationAndroid(config, props);
config = withLocationIos(config, props);
return config;
};
module.exports = createRunOncePlugin(withLocation, pack.name, pack.version);