@appium/coresim 1.12.0 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/lib/src/commands/permissions.d.ts +15 -7
- package/lib/src/commands/permissions.d.ts.map +1 -1
- package/lib/src/commands/permissions.js +299 -5
- package/lib/src/commands/permissions.js.map +1 -1
- package/lib/src/types.d.ts +6 -4
- package/lib/src/types.d.ts.map +1 -1
- package/package.json +3 -4
- package/prebuilds/darwin-arm64/@appium+coresim.node +0 -0
- package/src/commands/permissions.ts +324 -10
- package/src/coresim.mm +7 -0
- package/src/types.ts +6 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [1.13.0](https://github.com/appium/appium-ios/compare/@appium/coresim@1.12.0...@appium/coresim@1.13.0) (2026-10-15)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
* restore the notifications permission and the `all` permissions key ([#38](https://github.com/appium/appium-ios/issues/38)) ([d374250](https://github.com/appium/appium-ios/commit/d374250c24a99d8f91b6d83a77afcc771e00c9b1))
|
|
11
|
+
|
|
12
|
+
|
|
6
13
|
## [1.12.0](https://github.com/appium/appium-ios/compare/@appium/coresim@1.11.1...@appium/coresim@1.12.0) (2026-10-12)
|
|
7
14
|
|
|
8
15
|
### Features
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { NativeSimctl } from '../native-simctl.js';
|
|
2
|
-
import type
|
|
2
|
+
import { type SimPermissionService, type SimPermissionStatus } from '../types.js';
|
|
3
3
|
declare module '../native-simctl.js' {
|
|
4
4
|
interface NativeSimctl {
|
|
5
|
-
grantPermission(udid: string, service: SimPermissionService, bundleId: string, status?: 'granted' | 'limited'): Promise<void>;
|
|
5
|
+
grantPermission(udid: string, service: SimPermissionService, bundleId: string, status?: 'granted' | 'limited' | 'critical'): Promise<void>;
|
|
6
6
|
revokePermission(udid: string, service: SimPermissionService, bundleId: string): Promise<void>;
|
|
7
7
|
resetPermission(udid: string, service: SimPermissionService, bundleId: string): Promise<void>;
|
|
8
8
|
getPermission(udid: string, service: SimPermissionService, bundleId: string): Promise<SimPermissionStatus>;
|
|
@@ -13,15 +13,20 @@ declare module '../native-simctl.js' {
|
|
|
13
13
|
* simulator's own TCC (privacy) database — see CLAUDE.md for why this bypasses CoreSimulator's own
|
|
14
14
|
* privacy API.
|
|
15
15
|
*
|
|
16
|
+
* `notifications` isn't a TCC row: it is written to SpringBoard's BulletinBoard store instead. On a
|
|
17
|
+
* booted device SpringBoard is restarted to load it, which terminates every running app; a shut down
|
|
18
|
+
* device picks it up on its next boot.
|
|
19
|
+
*
|
|
16
20
|
* @param udid — UDID of the target device
|
|
17
|
-
* @param service — permission to grant, e.g. `"camera"`, `"contacts"`, `"photos"`
|
|
21
|
+
* @param service — permission to grant, e.g. `"camera"`, `"contacts"`, `"photos"`, `"notifications"`
|
|
18
22
|
* @param bundleId — bundle identifier of the app the permission applies to
|
|
19
23
|
* @param status — defaults to `'granted'`. `'limited'` ("selected photos" access) is only valid
|
|
20
|
-
* for the `photos` service
|
|
24
|
+
* for the `photos` service, `'critical'` (critical alerts allowed too) — for `notifications`.
|
|
21
25
|
*/
|
|
22
|
-
export declare function grantPermission(this: NativeSimctl, udid: string, service: SimPermissionService, bundleId: string, status?: 'granted' | 'limited'): Promise<void>;
|
|
26
|
+
export declare function grantPermission(this: NativeSimctl, udid: string, service: SimPermissionService, bundleId: string, status?: 'granted' | 'limited' | 'critical'): Promise<void>;
|
|
23
27
|
/**
|
|
24
|
-
* Revokes a previously granted privacy permission from the given app.
|
|
28
|
+
* Revokes a previously granted privacy permission from the given app. For `notifications`, a booted
|
|
29
|
+
* device's SpringBoard is restarted, see {@link grantPermission}.
|
|
25
30
|
*
|
|
26
31
|
* @param udid — UDID of the target device
|
|
27
32
|
* @param service — permission to revoke (see {@link grantPermission})
|
|
@@ -29,7 +34,9 @@ export declare function grantPermission(this: NativeSimctl, udid: string, servic
|
|
|
29
34
|
*/
|
|
30
35
|
export declare function revokePermission(this: NativeSimctl, udid: string, service: SimPermissionService, bundleId: string): Promise<void>;
|
|
31
36
|
/**
|
|
32
|
-
* Resets a privacy permission for the given app to its default (unprompted) state.
|
|
37
|
+
* Resets a privacy permission for the given app to its default (unprompted) state. For
|
|
38
|
+
* `notifications`, the app's section is removed from SpringBoard's store and a booted device's
|
|
39
|
+
* SpringBoard is restarted, see {@link grantPermission}.
|
|
33
40
|
*
|
|
34
41
|
* @param udid — UDID of the target device
|
|
35
42
|
* @param service — permission to reset (see {@link grantPermission})
|
|
@@ -45,6 +52,7 @@ export declare function resetPermission(this: NativeSimctl, udid: string, servic
|
|
|
45
52
|
* @param service — permission to check (see {@link grantPermission})
|
|
46
53
|
* @param bundleId — bundle identifier of the app the permission applies to
|
|
47
54
|
* @returns `'unset'` if the app has never been prompted/decided for this permission
|
|
55
|
+
* @throws {Error} for `notifications`: reading it isn't supported
|
|
48
56
|
*/
|
|
49
57
|
export declare function getPermission(this: NativeSimctl, udid: string, service: SimPermissionService, bundleId: string): Promise<SimPermissionStatus>;
|
|
50
58
|
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/commands/permissions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/commands/permissions.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAiB,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAC,MAAM,aAAa,CAAC;AAchG,OAAO,QAAQ,qBAAqB,CAAC;IACnC,UAAU,YAAY;QACpB,eAAe,CACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAC1C,OAAO,CAAC,IAAI,CAAC,CAAC;QACjB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/F,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9F,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;KAC5G;CACF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,SAAS,GAAG,SAAS,GAAG,UAAsB,GACrD,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAQf;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,YAAY,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,oBAAoB,EAC7B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,CAAC,CAQ9B"}
|
|
@@ -1,26 +1,53 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { once } from 'node:events';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
import { fs, plist } from '@appium/support';
|
|
7
|
+
import { waitForCondition } from 'asyncbox';
|
|
8
|
+
import { SimDeviceState } from '../types.js';
|
|
1
9
|
import { runCatchingAsync } from '../utils/index.js';
|
|
10
|
+
const execFileAsync = promisify(execFile);
|
|
11
|
+
const NOTIFICATIONS_SERVICE = 'notifications';
|
|
12
|
+
const SPRINGBOARD_SERVICE = 'com.apple.SpringBoard';
|
|
13
|
+
// The `sectionInfoVersionNumber` of the BulletinBoard stores SpringBoard writes (iOS 18 and 26).
|
|
14
|
+
const BULLETIN_BOARD_STORE_VERSION = 2;
|
|
15
|
+
const SPRINGBOARD_RESTART_TIMEOUT_MS = 30000;
|
|
16
|
+
// The last pending notifications update of each BulletinBoard store, see withStoreLock.
|
|
17
|
+
const storeUpdates = new Map();
|
|
2
18
|
/**
|
|
3
19
|
* Grants a privacy permission to the given app on the given device, by writing directly to the
|
|
4
20
|
* simulator's own TCC (privacy) database — see CLAUDE.md for why this bypasses CoreSimulator's own
|
|
5
21
|
* privacy API.
|
|
6
22
|
*
|
|
23
|
+
* `notifications` isn't a TCC row: it is written to SpringBoard's BulletinBoard store instead. On a
|
|
24
|
+
* booted device SpringBoard is restarted to load it, which terminates every running app; a shut down
|
|
25
|
+
* device picks it up on its next boot.
|
|
26
|
+
*
|
|
7
27
|
* @param udid — UDID of the target device
|
|
8
|
-
* @param service — permission to grant, e.g. `"camera"`, `"contacts"`, `"photos"`
|
|
28
|
+
* @param service — permission to grant, e.g. `"camera"`, `"contacts"`, `"photos"`, `"notifications"`
|
|
9
29
|
* @param bundleId — bundle identifier of the app the permission applies to
|
|
10
30
|
* @param status — defaults to `'granted'`. `'limited'` ("selected photos" access) is only valid
|
|
11
|
-
* for the `photos` service
|
|
31
|
+
* for the `photos` service, `'critical'` (critical alerts allowed too) — for `notifications`.
|
|
12
32
|
*/
|
|
13
33
|
export async function grantPermission(udid, service, bundleId, status = 'granted') {
|
|
14
34
|
return runCatchingAsync(async () => {
|
|
15
35
|
if (status === 'limited' && service !== 'photos') {
|
|
16
36
|
throw new Error(`'limited' is only a valid status for the 'photos' service, not '${service}'`);
|
|
17
37
|
}
|
|
38
|
+
if (service === NOTIFICATIONS_SERVICE) {
|
|
39
|
+
return await setNotificationsAccess.call(this, udid, bundleId, status === 'critical' ? 'critical' : 'granted');
|
|
40
|
+
}
|
|
41
|
+
if (status === 'critical') {
|
|
42
|
+
throw new Error(`'critical' is only a valid status for the 'notifications' service, not '${service}'`);
|
|
43
|
+
}
|
|
18
44
|
const tccIdentifier = toTCCIdentifier(service);
|
|
19
45
|
return (await this._findDevice(udid)).grantPermission(tccIdentifier, bundleId, status);
|
|
20
46
|
});
|
|
21
47
|
}
|
|
22
48
|
/**
|
|
23
|
-
* Revokes a previously granted privacy permission from the given app.
|
|
49
|
+
* Revokes a previously granted privacy permission from the given app. For `notifications`, a booted
|
|
50
|
+
* device's SpringBoard is restarted, see {@link grantPermission}.
|
|
24
51
|
*
|
|
25
52
|
* @param udid — UDID of the target device
|
|
26
53
|
* @param service — permission to revoke (see {@link grantPermission})
|
|
@@ -28,12 +55,17 @@ export async function grantPermission(udid, service, bundleId, status = 'granted
|
|
|
28
55
|
*/
|
|
29
56
|
export async function revokePermission(udid, service, bundleId) {
|
|
30
57
|
return runCatchingAsync(async () => {
|
|
58
|
+
if (service === NOTIFICATIONS_SERVICE) {
|
|
59
|
+
return await setNotificationsAccess.call(this, udid, bundleId, 'denied');
|
|
60
|
+
}
|
|
31
61
|
const tccIdentifier = toTCCIdentifier(service);
|
|
32
62
|
return (await this._findDevice(udid)).revokePermission(tccIdentifier, bundleId);
|
|
33
63
|
});
|
|
34
64
|
}
|
|
35
65
|
/**
|
|
36
|
-
* Resets a privacy permission for the given app to its default (unprompted) state.
|
|
66
|
+
* Resets a privacy permission for the given app to its default (unprompted) state. For
|
|
67
|
+
* `notifications`, the app's section is removed from SpringBoard's store and a booted device's
|
|
68
|
+
* SpringBoard is restarted, see {@link grantPermission}.
|
|
37
69
|
*
|
|
38
70
|
* @param udid — UDID of the target device
|
|
39
71
|
* @param service — permission to reset (see {@link grantPermission})
|
|
@@ -41,6 +73,9 @@ export async function revokePermission(udid, service, bundleId) {
|
|
|
41
73
|
*/
|
|
42
74
|
export async function resetPermission(udid, service, bundleId) {
|
|
43
75
|
return runCatchingAsync(async () => {
|
|
76
|
+
if (service === NOTIFICATIONS_SERVICE) {
|
|
77
|
+
return await setNotificationsAccess.call(this, udid, bundleId, 'unset');
|
|
78
|
+
}
|
|
44
79
|
const tccIdentifier = toTCCIdentifier(service);
|
|
45
80
|
return (await this._findDevice(udid)).resetPermission(tccIdentifier, bundleId);
|
|
46
81
|
});
|
|
@@ -54,9 +89,13 @@ export async function resetPermission(udid, service, bundleId) {
|
|
|
54
89
|
* @param service — permission to check (see {@link grantPermission})
|
|
55
90
|
* @param bundleId — bundle identifier of the app the permission applies to
|
|
56
91
|
* @returns `'unset'` if the app has never been prompted/decided for this permission
|
|
92
|
+
* @throws {Error} for `notifications`: reading it isn't supported
|
|
57
93
|
*/
|
|
58
94
|
export async function getPermission(udid, service, bundleId) {
|
|
59
95
|
return runCatchingAsync(async () => {
|
|
96
|
+
if (service === NOTIFICATIONS_SERVICE) {
|
|
97
|
+
throw new Error(`The status of the '${NOTIFICATIONS_SERVICE}' permission cannot be read`);
|
|
98
|
+
}
|
|
60
99
|
const tccIdentifier = toTCCIdentifier(service);
|
|
61
100
|
return (await this._findDevice(udid)).getPermission(tccIdentifier, bundleId);
|
|
62
101
|
});
|
|
@@ -64,7 +103,7 @@ export async function getPermission(udid, service, bundleId) {
|
|
|
64
103
|
// Maps a friendly service name to the internal TCC service identifier its row in the simulator's
|
|
65
104
|
// own TCC.db is keyed on (see native/tcc_privacy.h). `location` is deliberately absent: it isn't a
|
|
66
105
|
// plain TCC row (CoreLocation simulation has its own subsystem), so it isn't supported by this
|
|
67
|
-
// TCC.db-based implementation.
|
|
106
|
+
// TCC.db-based implementation. `notifications` isn't a TCC row either, see setNotificationsAccess.
|
|
68
107
|
const SERVICE_TO_TCC_IDENTIFIER = {
|
|
69
108
|
calendar: 'kTCCServiceCalendar',
|
|
70
109
|
camera: 'kTCCServiceCamera',
|
|
@@ -88,4 +127,259 @@ function toTCCIdentifier(service) {
|
|
|
88
127
|
}
|
|
89
128
|
return identifier;
|
|
90
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* `notifications` isn't a TCC row: SpringBoard keeps it per app in its BulletinBoard store
|
|
132
|
+
* (`Library/BulletinBoard/VersionedSectionInfo.plist`), reads that file only on its own start and
|
|
133
|
+
* rewrites it from memory from time to time (e.g. a few seconds after it starts). So SpringBoard of
|
|
134
|
+
* a booted device is paused while the app's section is written, then restarted with the store kept
|
|
135
|
+
* immutable until the old process is gone. The new SpringBoard loads the change and terminates
|
|
136
|
+
* every running app. A shut down device only gets the file, SpringBoard loads it on boot.
|
|
137
|
+
*/
|
|
138
|
+
async function setNotificationsAccess(udid, bundleId, status) {
|
|
139
|
+
const device = await this._findDevice(udid);
|
|
140
|
+
const storePath = path.join(device.dataPath(), 'Library', 'BulletinBoard', 'VersionedSectionInfo.plist');
|
|
141
|
+
await withStoreLock(storePath, async () => {
|
|
142
|
+
const springBoard = device.state() === SimDeviceState.Booted ? new SpringBoard(this, udid) : undefined;
|
|
143
|
+
await springBoard?.pause();
|
|
144
|
+
let written = false;
|
|
145
|
+
try {
|
|
146
|
+
written = await writeNotificationsSection(storePath, bundleId, status);
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
if (!written) {
|
|
150
|
+
springBoard?.resume();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (!springBoard || !written) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
await setImmutable(storePath, true);
|
|
157
|
+
try {
|
|
158
|
+
await springBoard.restart();
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
await setImmutable(storePath, false);
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Runs `update` once every earlier update of the same store has settled: concurrent updates for
|
|
167
|
+
* different apps would otherwise read the same store, and the last write would drop the other app's
|
|
168
|
+
* section. Only the calls made by this process are serialized.
|
|
169
|
+
*/
|
|
170
|
+
async function withStoreLock(storePath, update) {
|
|
171
|
+
const result = (storeUpdates.get(storePath) ?? Promise.resolve()).then(update);
|
|
172
|
+
const settled = result.catch(() => { });
|
|
173
|
+
storeUpdates.set(storePath, settled);
|
|
174
|
+
try {
|
|
175
|
+
await result;
|
|
176
|
+
}
|
|
177
|
+
finally {
|
|
178
|
+
if (storeUpdates.get(storePath) === settled) {
|
|
179
|
+
storeUpdates.delete(storePath);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Adds, replaces or (`unset`) removes the app's section. The store is replaced atomically, so a
|
|
185
|
+
* failed write leaves the previous one intact. A device that has never been booted has no store yet:
|
|
186
|
+
* it is created with just this section, and SpringBoard adds the rest on boot.
|
|
187
|
+
*
|
|
188
|
+
* @returns `false` if there was nothing to write (`unset` without a store)
|
|
189
|
+
*/
|
|
190
|
+
async function writeNotificationsSection(storePath, bundleId, status) {
|
|
191
|
+
let store;
|
|
192
|
+
if (await fs.exists(storePath)) {
|
|
193
|
+
store = (await plist.parsePlistFile(storePath));
|
|
194
|
+
}
|
|
195
|
+
else if (status === 'unset') {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
await fs.mkdir(path.dirname(storePath), { recursive: true });
|
|
200
|
+
store = { sectionInfoVersionNumber: BULLETIN_BOARD_STORE_VERSION };
|
|
201
|
+
}
|
|
202
|
+
const sectionInfo = store.sectionInfo ?? {};
|
|
203
|
+
if (status === 'unset') {
|
|
204
|
+
delete sectionInfo[bundleId];
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
sectionInfo[bundleId] = buildNotificationsSectionInfo(bundleId, status);
|
|
208
|
+
}
|
|
209
|
+
store.sectionInfo = sectionInfo;
|
|
210
|
+
// In the same directory, so that the rename is atomic.
|
|
211
|
+
const tmpPath = `${storePath}.${randomUUID()}.tmp`;
|
|
212
|
+
try {
|
|
213
|
+
await fs.writeFile(tmpPath, plist.createPlist(store, false), { flag: 'wx' });
|
|
214
|
+
await fs.rename(tmpPath, storePath);
|
|
215
|
+
}
|
|
216
|
+
catch (err) {
|
|
217
|
+
await fs.unlink(tmpPath).catch(() => { });
|
|
218
|
+
throw err;
|
|
219
|
+
}
|
|
220
|
+
return true;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Builds the NSKeyedArchiver-encoded `BBSectionInfo` of `bundleId`, the same archive
|
|
224
|
+
* AppleSimulatorUtils writes (SetNotificationsPermission.m). SpringBoard migrates its
|
|
225
|
+
* `allowsNotifications` flag to the current `authorizationStatus` when it loads the section.
|
|
226
|
+
*/
|
|
227
|
+
function buildNotificationsSectionInfo(bundleId, status) {
|
|
228
|
+
const nil = { UID: 0 };
|
|
229
|
+
return plist.createBinaryPlist({
|
|
230
|
+
$version: 100000,
|
|
231
|
+
$objects: [
|
|
232
|
+
'$null',
|
|
233
|
+
{
|
|
234
|
+
suppressFromSettings: false,
|
|
235
|
+
suppressedSettings: 0,
|
|
236
|
+
hideWeeApp: false,
|
|
237
|
+
sectionID: { UID: 2 },
|
|
238
|
+
displayName: { UID: 5 },
|
|
239
|
+
icon: nil,
|
|
240
|
+
displaysCriticalBulletins: false,
|
|
241
|
+
subsections: nil,
|
|
242
|
+
sectionInfoSettings: { UID: 3 },
|
|
243
|
+
$class: { UID: 7 },
|
|
244
|
+
sectionCategory: 0,
|
|
245
|
+
subsectionPriority: 0,
|
|
246
|
+
version: { UID: 6 },
|
|
247
|
+
managedSectionInfoSettings: nil,
|
|
248
|
+
appName: { UID: 5 },
|
|
249
|
+
sectionType: 0,
|
|
250
|
+
factorySectionID: nil,
|
|
251
|
+
dataProviderIDs: nil,
|
|
252
|
+
subsectionID: nil,
|
|
253
|
+
filters: nil,
|
|
254
|
+
pathToWeeAppPluginBundle: nil,
|
|
255
|
+
},
|
|
256
|
+
bundleId,
|
|
257
|
+
{
|
|
258
|
+
pushSettings: 63,
|
|
259
|
+
showsInNotificationCenter: true,
|
|
260
|
+
allowsNotifications: status !== 'denied',
|
|
261
|
+
showsOnExternalDevices: true,
|
|
262
|
+
contentPreviewSetting: 0,
|
|
263
|
+
carPlaySetting: 0,
|
|
264
|
+
$class: { UID: 4 },
|
|
265
|
+
showsInLockScreen: true,
|
|
266
|
+
alertType: 1,
|
|
267
|
+
criticalAlertSetting: status === 'critical' ? 2 : 0,
|
|
268
|
+
},
|
|
269
|
+
{ $classname: 'BBSectionInfoSettings', $classes: ['BBSectionInfoSettings', 'NSObject'] },
|
|
270
|
+
bundleId,
|
|
271
|
+
0,
|
|
272
|
+
{ $classname: 'BBSectionInfo', $classes: ['BBSectionInfo', 'NSObject'] },
|
|
273
|
+
],
|
|
274
|
+
$archiver: 'NSKeyedArchiver',
|
|
275
|
+
$top: { root: { UID: 1 } },
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
async function setImmutable(filePath, immutable) {
|
|
279
|
+
try {
|
|
280
|
+
await execFileAsync('chflags', [immutable ? 'uchg' : 'nouchg', filePath]);
|
|
281
|
+
}
|
|
282
|
+
catch { }
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* SpringBoard of a booted device: the process that owns the BulletinBoard store, see
|
|
286
|
+
* setNotificationsAccess. The simulator shares the host kernel, so it is signalled directly.
|
|
287
|
+
*/
|
|
288
|
+
class SpringBoard {
|
|
289
|
+
simctl;
|
|
290
|
+
udid;
|
|
291
|
+
pausedPid;
|
|
292
|
+
constructor(simctl, udid) {
|
|
293
|
+
this.simctl = simctl;
|
|
294
|
+
this.udid = udid;
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Pauses the running SpringBoard so that it cannot rewrite the BulletinBoard store. It can be in
|
|
298
|
+
* the middle of a restart, hence the retries.
|
|
299
|
+
*/
|
|
300
|
+
async pause() {
|
|
301
|
+
try {
|
|
302
|
+
await waitForCondition(async () => {
|
|
303
|
+
const pid = await this.pid().catch(() => undefined);
|
|
304
|
+
if (pid && sendSignal(pid, 'SIGSTOP')) {
|
|
305
|
+
this.pausedPid = pid;
|
|
306
|
+
}
|
|
307
|
+
return Boolean(this.pausedPid);
|
|
308
|
+
}, { waitMs: SPRINGBOARD_RESTART_TIMEOUT_MS, intervalMs: 300 });
|
|
309
|
+
}
|
|
310
|
+
catch { }
|
|
311
|
+
if (!this.pausedPid) {
|
|
312
|
+
throw new Error(`${SPRINGBOARD_SERVICE} is not running`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
/** Lets the paused SpringBoard run again. */
|
|
316
|
+
resume() {
|
|
317
|
+
if (this.pausedPid) {
|
|
318
|
+
sendSignal(this.pausedPid, 'SIGCONT');
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Replaces the paused SpringBoard with a new one: asks launchd to stop it (launchd starts a new
|
|
323
|
+
* one right away), resumes it so that it can exit, then waits for the new process.
|
|
324
|
+
*/
|
|
325
|
+
async restart() {
|
|
326
|
+
const previousPid = this.pausedPid;
|
|
327
|
+
try {
|
|
328
|
+
await this.stop();
|
|
329
|
+
}
|
|
330
|
+
finally {
|
|
331
|
+
this.resume();
|
|
332
|
+
this.pausedPid = undefined;
|
|
333
|
+
}
|
|
334
|
+
try {
|
|
335
|
+
await waitForCondition(async () => {
|
|
336
|
+
const pid = await this.pid().catch(() => undefined);
|
|
337
|
+
return Number.isInteger(pid) && pid !== previousPid;
|
|
338
|
+
}, { waitMs: SPRINGBOARD_RESTART_TIMEOUT_MS, intervalMs: 300 });
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
throw new Error(`${SPRINGBOARD_SERVICE} did not restart within ${SPRINGBOARD_RESTART_TIMEOUT_MS}ms`);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
async pid() {
|
|
345
|
+
return (await this.simctl.listProcesses(this.udid)).find(({ name }) => name === SPRINGBOARD_SERVICE)?.pid;
|
|
346
|
+
}
|
|
347
|
+
async stop() {
|
|
348
|
+
// Bare name: resolved against the guest runtime's own bin dirs, like in listProcesses.
|
|
349
|
+
const proc = await this.simctl.spawnProcess(this.udid, 'launchctl', {
|
|
350
|
+
arguments: ['launchctl', 'stop', SPRINGBOARD_SERVICE],
|
|
351
|
+
});
|
|
352
|
+
let stderr = '';
|
|
353
|
+
proc.stdout.resume();
|
|
354
|
+
proc.stderr.on('data', (chunk) => {
|
|
355
|
+
stderr += chunk;
|
|
356
|
+
});
|
|
357
|
+
const streamError = Promise.race([once(proc.stdout, 'error'), once(proc.stderr, 'error')]).then(([err]) => {
|
|
358
|
+
throw err;
|
|
359
|
+
});
|
|
360
|
+
const [[code, signal]] = await Promise.race([
|
|
361
|
+
Promise.all([once(proc, 'exit'), once(proc.stderr, 'end')]),
|
|
362
|
+
streamError,
|
|
363
|
+
]);
|
|
364
|
+
if (code !== 0) {
|
|
365
|
+
const reason = signal ? `signal ${signal}` : `exit code ${code}`;
|
|
366
|
+
throw new Error(`'launchctl stop ${SPRINGBOARD_SERVICE}' failed with ${reason}${stderr.trim() ? `: ${stderr.trim()}` : ''}`);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* @returns `false` if the process no longer exists
|
|
372
|
+
*/
|
|
373
|
+
function sendSignal(pid, name) {
|
|
374
|
+
try {
|
|
375
|
+
process.kill(pid, name);
|
|
376
|
+
return true;
|
|
377
|
+
}
|
|
378
|
+
catch (err) {
|
|
379
|
+
if (err?.code === 'ESRCH') {
|
|
380
|
+
return false;
|
|
381
|
+
}
|
|
382
|
+
throw err;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
91
385
|
//# sourceMappingURL=permissions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/commands/permissions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../../src/commands/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AACvC,OAAO,EAAC,IAAI,EAAC,MAAM,aAAa,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,SAAS,EAAC,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAC,EAAE,EAAE,KAAK,EAAC,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAC,gBAAgB,EAAC,MAAM,UAAU,CAAC;AAG1C,OAAO,EAAC,cAAc,EAAsD,MAAM,aAAa,CAAC;AAChG,OAAO,EAAC,gBAAgB,EAAC,MAAM,mBAAmB,CAAC;AAEnD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAC9C,MAAM,mBAAmB,GAAG,uBAAuB,CAAC;AACpD,iGAAiG;AACjG,MAAM,4BAA4B,GAAG,CAAC,CAAC;AACvC,MAAM,8BAA8B,GAAG,KAAK,CAAC;AAE7C,wFAAwF;AACxF,MAAM,YAAY,GAAG,IAAI,GAAG,EAAyB,CAAC;AAgBtD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAEnC,IAAY,EACZ,OAA6B,EAC7B,QAAgB,EAChB,SAA6C,SAAS;IAEtD,OAAO,gBAAgB,CAAC,KAAK,IAAI,EAAE;QACjC,IAAI,MAAM,KAAK,SAAS,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,mEAAmE,OAAO,GAAG,CAAC,CAAC;QACjG,CAAC;QACD,IAAI,OAAO,KAAK,qBAAqB,EAAE,CAAC;YACtC,OAAO,MAAM,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACjH,CAAC;QACD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,2EAA2E,OAAO,GAAG,CAAC,CAAC;QACzG,CAAC;QACD,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/C,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAEpC,IAAY,EACZ,OAA6B,EAC7B,QAAgB;IAEhB,OAAO,gBAAgB,CAAC,KAAK,IAAI,EAAE;QACjC,IAAI,OAAO,KAAK,qBAAqB,EAAE,CAAC;YACtC,OAAO,MAAM,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/C,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAEnC,IAAY,EACZ,OAA6B,EAC7B,QAAgB;IAEhB,OAAO,gBAAgB,CAAC,KAAK,IAAI,EAAE;QACjC,IAAI,OAAO,KAAK,qBAAqB,EAAE,CAAC;YACtC,OAAO,MAAM,sBAAsB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1E,CAAC;QACD,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/C,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAEjC,IAAY,EACZ,OAA6B,EAC7B,QAAgB;IAEhB,OAAO,gBAAgB,CAAC,KAAK,IAAI,EAAE;QACjC,IAAI,OAAO,KAAK,qBAAqB,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,sBAAsB,qBAAqB,6BAA6B,CAAC,CAAC;QAC5F,CAAC;QACD,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC/C,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;AACL,CAAC;AAED,iGAAiG;AACjG,mGAAmG;AACnG,+FAA+F;AAC/F,mGAAmG;AACnG,MAAM,yBAAyB,GAAmE;IAChG,QAAQ,EAAE,qBAAqB;IAC/B,MAAM,EAAE,mBAAmB;IAC3B,QAAQ,EAAE,wBAAwB;IAClC,MAAM,EAAE,mBAAmB;IAC3B,MAAM,EAAE,gBAAgB;IACxB,OAAO,EAAE,mBAAmB;IAC5B,YAAY,EAAE,yBAAyB;IACvC,UAAU,EAAE,uBAAuB;IACnC,MAAM,EAAE,mBAAmB;IAC3B,MAAM,EAAE,mBAAmB;IAC3B,SAAS,EAAE,sBAAsB;IACjC,IAAI,EAAE,iBAAiB;IACvB,MAAM,EAAE,8BAA8B;IACtC,YAAY,EAAE,yBAAyB;CACxC,CAAC;AAEF,SAAS,eAAe,CAAC,OAAuD;IAC9E,MAAM,UAAU,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,IAAI,OAAO,+CAA+C,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9G,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;GAOG;AACH,KAAK,UAAU,sBAAsB,CAEnC,IAAY,EACZ,QAAgB,EAChB,MAAmD;IAEnD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,4BAA4B,CAAC,CAAC;IACzG,MAAM,aAAa,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvG,MAAM,WAAW,EAAE,KAAK,EAAE,CAAC;QAC3B,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,yBAAyB,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,WAAW,EAAE,MAAM,EAAE,CAAC;YACxB,CAAC;QACH,CAAC;QACD,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,MAAM,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;gBAAS,CAAC;YACT,MAAM,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,aAAa,CAAC,SAAiB,EAAE,MAA2B;IACzE,MAAM,MAAM,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/E,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvC,YAAY,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC;IACf,CAAC;YAAS,CAAC;QACT,IAAI,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,OAAO,EAAE,CAAC;YAC5C,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,yBAAyB,CACtC,SAAiB,EACjB,QAAgB,EAChB,MAAmD;IAEnD,IAAI,KAAoF,CAAC;IACzF,IAAI,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/B,KAAK,GAAG,CAAC,MAAM,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,CAAiB,CAAC;IAClE,CAAC;SAAM,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;SAAM,CAAC;QACN,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAC;QAC3D,KAAK,GAAG,EAAC,wBAAwB,EAAE,4BAA4B,EAAC,CAAC;IACnE,CAAC;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;IAC5C,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,WAAW,CAAC,QAAQ,CAAC,GAAG,6BAA6B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1E,CAAC;IACD,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;IAChC,uDAAuD;IACvD,MAAM,OAAO,GAAG,GAAG,SAAS,IAAI,UAAU,EAAE,MAAM,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC,CAAC,CAAC;QAC3E,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACzC,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,6BAA6B,CAAC,QAAgB,EAAE,MAAyC;IAChG,MAAM,GAAG,GAAG,EAAC,GAAG,EAAE,CAAC,EAAC,CAAC;IACrB,OAAO,KAAK,CAAC,iBAAiB,CAAC;QAC7B,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE;YACR,OAAO;YACP;gBACE,oBAAoB,EAAE,KAAK;gBAC3B,kBAAkB,EAAE,CAAC;gBACrB,UAAU,EAAE,KAAK;gBACjB,SAAS,EAAE,EAAC,GAAG,EAAE,CAAC,EAAC;gBACnB,WAAW,EAAE,EAAC,GAAG,EAAE,CAAC,EAAC;gBACrB,IAAI,EAAE,GAAG;gBACT,yBAAyB,EAAE,KAAK;gBAChC,WAAW,EAAE,GAAG;gBAChB,mBAAmB,EAAE,EAAC,GAAG,EAAE,CAAC,EAAC;gBAC7B,MAAM,EAAE,EAAC,GAAG,EAAE,CAAC,EAAC;gBAChB,eAAe,EAAE,CAAC;gBAClB,kBAAkB,EAAE,CAAC;gBACrB,OAAO,EAAE,EAAC,GAAG,EAAE,CAAC,EAAC;gBACjB,0BAA0B,EAAE,GAAG;gBAC/B,OAAO,EAAE,EAAC,GAAG,EAAE,CAAC,EAAC;gBACjB,WAAW,EAAE,CAAC;gBACd,gBAAgB,EAAE,GAAG;gBACrB,eAAe,EAAE,GAAG;gBACpB,YAAY,EAAE,GAAG;gBACjB,OAAO,EAAE,GAAG;gBACZ,wBAAwB,EAAE,GAAG;aAC9B;YACD,QAAQ;YACR;gBACE,YAAY,EAAE,EAAE;gBAChB,yBAAyB,EAAE,IAAI;gBAC/B,mBAAmB,EAAE,MAAM,KAAK,QAAQ;gBACxC,sBAAsB,EAAE,IAAI;gBAC5B,qBAAqB,EAAE,CAAC;gBACxB,cAAc,EAAE,CAAC;gBACjB,MAAM,EAAE,EAAC,GAAG,EAAE,CAAC,EAAC;gBAChB,iBAAiB,EAAE,IAAI;gBACvB,SAAS,EAAE,CAAC;gBACZ,oBAAoB,EAAE,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACpD;YACD,EAAC,UAAU,EAAE,uBAAuB,EAAE,QAAQ,EAAE,CAAC,uBAAuB,EAAE,UAAU,CAAC,EAAC;YACtF,QAAQ;YACR,CAAC;YACD,EAAC,UAAU,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,eAAe,EAAE,UAAU,CAAC,EAAC;SACvE;QACD,SAAS,EAAE,iBAAiB;QAC5B,IAAI,EAAE,EAAC,IAAI,EAAE,EAAC,GAAG,EAAE,CAAC,EAAC,EAAC;KACvB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,SAAkB;IAC9D,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,WAAW;IAII;IACA;IAJX,SAAS,CAAqB;IAEtC,YACmB,MAAoB,EACpB,IAAY;QADZ,WAAM,GAAN,MAAM,CAAc;QACpB,SAAI,GAAJ,IAAI,CAAQ;IAC5B,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC;YACH,MAAM,gBAAgB,CACpB,KAAK,IAAI,EAAE;gBACT,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBACpD,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,CAAC;oBACtC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC;gBACvB,CAAC;gBACD,OAAO,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACjC,CAAC,EACD,EAAC,MAAM,EAAE,8BAA8B,EAAE,UAAU,EAAE,GAAG,EAAC,CAC1D,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,GAAG,mBAAmB,iBAAiB,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,MAAM;QACJ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO;QACX,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC;YACH,MAAM,gBAAgB,CACpB,KAAK,IAAI,EAAE;gBACT,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBACpD,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,WAAW,CAAC;YACtD,CAAC,EACD,EAAC,MAAM,EAAE,8BAA8B,EAAE,UAAU,EAAE,GAAG,EAAC,CAC1D,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,GAAG,mBAAmB,2BAA2B,8BAA8B,IAAI,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,GAAG;QACf,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAC,IAAI,EAAC,EAAE,EAAE,CAAC,IAAI,KAAK,mBAAmB,CAAC,EAAE,GAAG,CAAC;IAC1G,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,uFAAuF;QACvF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE;YAClE,SAAS,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,mBAAmB,CAAC;SACtD,CAAC,CAAC;QACH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE;YACxG,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;YAC3D,WAAW;SACZ,CAAC,CAAC;QACH,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC,CAAC,aAAa,IAAI,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CACb,mBAAmB,mBAAmB,iBAAiB,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5G,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,GAAW,EAAE,IAAoB;IACnD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,EAAE,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/lib/src/types.d.ts
CHANGED
|
@@ -79,11 +79,12 @@ export interface SimBootInfo {
|
|
|
79
79
|
export type SimPermissionStatus = 'unset' | 'denied' | 'granted' | 'limited';
|
|
80
80
|
/**
|
|
81
81
|
* A privacy permission grantable via `NativeSimctl.grantPermission`/`revokePermission`/
|
|
82
|
-
* `resetPermission`. Each is backed by a row in the simulator's own TCC
|
|
83
|
-
* `location` isn't included since CoreLocation simulation has its own
|
|
84
|
-
* row (see CLAUDE.md).
|
|
82
|
+
* `resetPermission`. Each except `notifications` is backed by a row in the simulator's own TCC
|
|
83
|
+
* (privacy) database — `location` isn't included since CoreLocation simulation has its own
|
|
84
|
+
* subsystem, not a plain TCC row (see CLAUDE.md). `notifications` is SpringBoard's own setting:
|
|
85
|
+
* changing it restarts SpringBoard, and its status can't be read back via `getPermission`.
|
|
85
86
|
*/
|
|
86
|
-
export type SimPermissionService = 'calendar' | 'camera' | 'contacts' | 'faceid' | 'health' | 'homekit' | 'medialibrary' | 'microphone' | 'motion' | 'photos' | 'reminders' | 'siri' | 'speech' | 'usertracking';
|
|
87
|
+
export type SimPermissionService = 'calendar' | 'camera' | 'contacts' | 'faceid' | 'health' | 'homekit' | 'medialibrary' | 'microphone' | 'motion' | 'notifications' | 'photos' | 'reminders' | 'siri' | 'speech' | 'usertracking';
|
|
87
88
|
/**
|
|
88
89
|
* A device's renderable display, as returned by `NativeSimctl.getDisplays()`.
|
|
89
90
|
*/
|
|
@@ -371,6 +372,7 @@ export interface NativeDeviceHandle {
|
|
|
371
372
|
deviceTypeIdentifier(): string;
|
|
372
373
|
runtimeIdentifier(): string;
|
|
373
374
|
runtimeRootPath(): string;
|
|
375
|
+
dataPath(): string;
|
|
374
376
|
boot(options?: Record<string, unknown>): Promise<void>;
|
|
375
377
|
getBootStatus(): Promise<SimBootInfo | null>;
|
|
376
378
|
shutdown(): Promise<void>;
|
package/lib/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@appium/coresim",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.13.0",
|
|
4
4
|
"description": "Native bindings to CoreSimulator.framework for Apple platform simulator control",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/appium/appium-ios/issues"
|
|
@@ -54,13 +54,12 @@
|
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@appium/tsconfig": "^1.2.0",
|
|
57
|
-
"@types/node": "^26.6.
|
|
57
|
+
"@types/node": "^26.6.5",
|
|
58
58
|
"prebuildify": "^6.0.1"
|
|
59
59
|
},
|
|
60
60
|
"engines": {
|
|
61
61
|
"node": "^20.19.0 || ^22.12.0 || >=24.0.0",
|
|
62
62
|
"npm": ">=10"
|
|
63
63
|
},
|
|
64
|
-
"gypfile": true
|
|
65
|
-
"gitHead": "9093de3b79fba810459e0cb42c1aee3e9d30fbe5"
|
|
64
|
+
"gypfile": true
|
|
66
65
|
}
|
|
Binary file
|
|
@@ -1,14 +1,34 @@
|
|
|
1
|
+
import {execFile} from 'node:child_process';
|
|
2
|
+
import {randomUUID} from 'node:crypto';
|
|
3
|
+
import {once} from 'node:events';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import {promisify} from 'node:util';
|
|
6
|
+
|
|
7
|
+
import {fs, plist} from '@appium/support';
|
|
8
|
+
import {waitForCondition} from 'asyncbox';
|
|
9
|
+
|
|
1
10
|
import type {NativeSimctl} from '../native-simctl.js';
|
|
2
|
-
import type
|
|
11
|
+
import {SimDeviceState, type SimPermissionService, type SimPermissionStatus} from '../types.js';
|
|
3
12
|
import {runCatchingAsync} from '../utils/index.js';
|
|
4
13
|
|
|
14
|
+
const execFileAsync = promisify(execFile);
|
|
15
|
+
|
|
16
|
+
const NOTIFICATIONS_SERVICE = 'notifications';
|
|
17
|
+
const SPRINGBOARD_SERVICE = 'com.apple.SpringBoard';
|
|
18
|
+
// The `sectionInfoVersionNumber` of the BulletinBoard stores SpringBoard writes (iOS 18 and 26).
|
|
19
|
+
const BULLETIN_BOARD_STORE_VERSION = 2;
|
|
20
|
+
const SPRINGBOARD_RESTART_TIMEOUT_MS = 30000;
|
|
21
|
+
|
|
22
|
+
// The last pending notifications update of each BulletinBoard store, see withStoreLock.
|
|
23
|
+
const storeUpdates = new Map<string, Promise<void>>();
|
|
24
|
+
|
|
5
25
|
declare module '../native-simctl.js' {
|
|
6
26
|
interface NativeSimctl {
|
|
7
27
|
grantPermission(
|
|
8
28
|
udid: string,
|
|
9
29
|
service: SimPermissionService,
|
|
10
30
|
bundleId: string,
|
|
11
|
-
status?: 'granted' | 'limited',
|
|
31
|
+
status?: 'granted' | 'limited' | 'critical',
|
|
12
32
|
): Promise<void>;
|
|
13
33
|
revokePermission(udid: string, service: SimPermissionService, bundleId: string): Promise<void>;
|
|
14
34
|
resetPermission(udid: string, service: SimPermissionService, bundleId: string): Promise<void>;
|
|
@@ -21,30 +41,41 @@ declare module '../native-simctl.js' {
|
|
|
21
41
|
* simulator's own TCC (privacy) database — see CLAUDE.md for why this bypasses CoreSimulator's own
|
|
22
42
|
* privacy API.
|
|
23
43
|
*
|
|
44
|
+
* `notifications` isn't a TCC row: it is written to SpringBoard's BulletinBoard store instead. On a
|
|
45
|
+
* booted device SpringBoard is restarted to load it, which terminates every running app; a shut down
|
|
46
|
+
* device picks it up on its next boot.
|
|
47
|
+
*
|
|
24
48
|
* @param udid — UDID of the target device
|
|
25
|
-
* @param service — permission to grant, e.g. `"camera"`, `"contacts"`, `"photos"`
|
|
49
|
+
* @param service — permission to grant, e.g. `"camera"`, `"contacts"`, `"photos"`, `"notifications"`
|
|
26
50
|
* @param bundleId — bundle identifier of the app the permission applies to
|
|
27
51
|
* @param status — defaults to `'granted'`. `'limited'` ("selected photos" access) is only valid
|
|
28
|
-
* for the `photos` service
|
|
52
|
+
* for the `photos` service, `'critical'` (critical alerts allowed too) — for `notifications`.
|
|
29
53
|
*/
|
|
30
54
|
export async function grantPermission(
|
|
31
55
|
this: NativeSimctl,
|
|
32
56
|
udid: string,
|
|
33
57
|
service: SimPermissionService,
|
|
34
58
|
bundleId: string,
|
|
35
|
-
status: 'granted' | 'limited' = 'granted',
|
|
59
|
+
status: 'granted' | 'limited' | 'critical' = 'granted',
|
|
36
60
|
): Promise<void> {
|
|
37
61
|
return runCatchingAsync(async () => {
|
|
38
62
|
if (status === 'limited' && service !== 'photos') {
|
|
39
63
|
throw new Error(`'limited' is only a valid status for the 'photos' service, not '${service}'`);
|
|
40
64
|
}
|
|
65
|
+
if (service === NOTIFICATIONS_SERVICE) {
|
|
66
|
+
return await setNotificationsAccess.call(this, udid, bundleId, status === 'critical' ? 'critical' : 'granted');
|
|
67
|
+
}
|
|
68
|
+
if (status === 'critical') {
|
|
69
|
+
throw new Error(`'critical' is only a valid status for the 'notifications' service, not '${service}'`);
|
|
70
|
+
}
|
|
41
71
|
const tccIdentifier = toTCCIdentifier(service);
|
|
42
72
|
return (await this._findDevice(udid)).grantPermission(tccIdentifier, bundleId, status);
|
|
43
73
|
});
|
|
44
74
|
}
|
|
45
75
|
|
|
46
76
|
/**
|
|
47
|
-
* Revokes a previously granted privacy permission from the given app.
|
|
77
|
+
* Revokes a previously granted privacy permission from the given app. For `notifications`, a booted
|
|
78
|
+
* device's SpringBoard is restarted, see {@link grantPermission}.
|
|
48
79
|
*
|
|
49
80
|
* @param udid — UDID of the target device
|
|
50
81
|
* @param service — permission to revoke (see {@link grantPermission})
|
|
@@ -57,13 +88,18 @@ export async function revokePermission(
|
|
|
57
88
|
bundleId: string,
|
|
58
89
|
): Promise<void> {
|
|
59
90
|
return runCatchingAsync(async () => {
|
|
91
|
+
if (service === NOTIFICATIONS_SERVICE) {
|
|
92
|
+
return await setNotificationsAccess.call(this, udid, bundleId, 'denied');
|
|
93
|
+
}
|
|
60
94
|
const tccIdentifier = toTCCIdentifier(service);
|
|
61
95
|
return (await this._findDevice(udid)).revokePermission(tccIdentifier, bundleId);
|
|
62
96
|
});
|
|
63
97
|
}
|
|
64
98
|
|
|
65
99
|
/**
|
|
66
|
-
* Resets a privacy permission for the given app to its default (unprompted) state.
|
|
100
|
+
* Resets a privacy permission for the given app to its default (unprompted) state. For
|
|
101
|
+
* `notifications`, the app's section is removed from SpringBoard's store and a booted device's
|
|
102
|
+
* SpringBoard is restarted, see {@link grantPermission}.
|
|
67
103
|
*
|
|
68
104
|
* @param udid — UDID of the target device
|
|
69
105
|
* @param service — permission to reset (see {@link grantPermission})
|
|
@@ -76,6 +112,9 @@ export async function resetPermission(
|
|
|
76
112
|
bundleId: string,
|
|
77
113
|
): Promise<void> {
|
|
78
114
|
return runCatchingAsync(async () => {
|
|
115
|
+
if (service === NOTIFICATIONS_SERVICE) {
|
|
116
|
+
return await setNotificationsAccess.call(this, udid, bundleId, 'unset');
|
|
117
|
+
}
|
|
79
118
|
const tccIdentifier = toTCCIdentifier(service);
|
|
80
119
|
return (await this._findDevice(udid)).resetPermission(tccIdentifier, bundleId);
|
|
81
120
|
});
|
|
@@ -90,6 +129,7 @@ export async function resetPermission(
|
|
|
90
129
|
* @param service — permission to check (see {@link grantPermission})
|
|
91
130
|
* @param bundleId — bundle identifier of the app the permission applies to
|
|
92
131
|
* @returns `'unset'` if the app has never been prompted/decided for this permission
|
|
132
|
+
* @throws {Error} for `notifications`: reading it isn't supported
|
|
93
133
|
*/
|
|
94
134
|
export async function getPermission(
|
|
95
135
|
this: NativeSimctl,
|
|
@@ -98,6 +138,9 @@ export async function getPermission(
|
|
|
98
138
|
bundleId: string,
|
|
99
139
|
): Promise<SimPermissionStatus> {
|
|
100
140
|
return runCatchingAsync(async () => {
|
|
141
|
+
if (service === NOTIFICATIONS_SERVICE) {
|
|
142
|
+
throw new Error(`The status of the '${NOTIFICATIONS_SERVICE}' permission cannot be read`);
|
|
143
|
+
}
|
|
101
144
|
const tccIdentifier = toTCCIdentifier(service);
|
|
102
145
|
return (await this._findDevice(udid)).getPermission(tccIdentifier, bundleId);
|
|
103
146
|
});
|
|
@@ -106,8 +149,8 @@ export async function getPermission(
|
|
|
106
149
|
// Maps a friendly service name to the internal TCC service identifier its row in the simulator's
|
|
107
150
|
// own TCC.db is keyed on (see native/tcc_privacy.h). `location` is deliberately absent: it isn't a
|
|
108
151
|
// plain TCC row (CoreLocation simulation has its own subsystem), so it isn't supported by this
|
|
109
|
-
// TCC.db-based implementation.
|
|
110
|
-
const SERVICE_TO_TCC_IDENTIFIER: Record<SimPermissionService, string> = {
|
|
152
|
+
// TCC.db-based implementation. `notifications` isn't a TCC row either, see setNotificationsAccess.
|
|
153
|
+
const SERVICE_TO_TCC_IDENTIFIER: Record<Exclude<SimPermissionService, 'notifications'>, string> = {
|
|
111
154
|
calendar: 'kTCCServiceCalendar',
|
|
112
155
|
camera: 'kTCCServiceCamera',
|
|
113
156
|
contacts: 'kTCCServiceAddressBook',
|
|
@@ -124,7 +167,7 @@ const SERVICE_TO_TCC_IDENTIFIER: Record<SimPermissionService, string> = {
|
|
|
124
167
|
usertracking: 'kTCCServiceUserTracking',
|
|
125
168
|
};
|
|
126
169
|
|
|
127
|
-
function toTCCIdentifier(service: SimPermissionService): string {
|
|
170
|
+
function toTCCIdentifier(service: Exclude<SimPermissionService, 'notifications'>): string {
|
|
128
171
|
const identifier = SERVICE_TO_TCC_IDENTIFIER[service];
|
|
129
172
|
if (!identifier) {
|
|
130
173
|
throw new Error(
|
|
@@ -133,3 +176,274 @@ function toTCCIdentifier(service: SimPermissionService): string {
|
|
|
133
176
|
}
|
|
134
177
|
return identifier;
|
|
135
178
|
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* `notifications` isn't a TCC row: SpringBoard keeps it per app in its BulletinBoard store
|
|
182
|
+
* (`Library/BulletinBoard/VersionedSectionInfo.plist`), reads that file only on its own start and
|
|
183
|
+
* rewrites it from memory from time to time (e.g. a few seconds after it starts). So SpringBoard of
|
|
184
|
+
* a booted device is paused while the app's section is written, then restarted with the store kept
|
|
185
|
+
* immutable until the old process is gone. The new SpringBoard loads the change and terminates
|
|
186
|
+
* every running app. A shut down device only gets the file, SpringBoard loads it on boot.
|
|
187
|
+
*/
|
|
188
|
+
async function setNotificationsAccess(
|
|
189
|
+
this: NativeSimctl,
|
|
190
|
+
udid: string,
|
|
191
|
+
bundleId: string,
|
|
192
|
+
status: 'granted' | 'denied' | 'critical' | 'unset',
|
|
193
|
+
): Promise<void> {
|
|
194
|
+
const device = await this._findDevice(udid);
|
|
195
|
+
const storePath = path.join(device.dataPath(), 'Library', 'BulletinBoard', 'VersionedSectionInfo.plist');
|
|
196
|
+
await withStoreLock(storePath, async () => {
|
|
197
|
+
const springBoard = device.state() === SimDeviceState.Booted ? new SpringBoard(this, udid) : undefined;
|
|
198
|
+
await springBoard?.pause();
|
|
199
|
+
let written = false;
|
|
200
|
+
try {
|
|
201
|
+
written = await writeNotificationsSection(storePath, bundleId, status);
|
|
202
|
+
} finally {
|
|
203
|
+
if (!written) {
|
|
204
|
+
springBoard?.resume();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
if (!springBoard || !written) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
await setImmutable(storePath, true);
|
|
211
|
+
try {
|
|
212
|
+
await springBoard.restart();
|
|
213
|
+
} finally {
|
|
214
|
+
await setImmutable(storePath, false);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Runs `update` once every earlier update of the same store has settled: concurrent updates for
|
|
221
|
+
* different apps would otherwise read the same store, and the last write would drop the other app's
|
|
222
|
+
* section. Only the calls made by this process are serialized.
|
|
223
|
+
*/
|
|
224
|
+
async function withStoreLock(storePath: string, update: () => Promise<void>): Promise<void> {
|
|
225
|
+
const result = (storeUpdates.get(storePath) ?? Promise.resolve()).then(update);
|
|
226
|
+
const settled = result.catch(() => {});
|
|
227
|
+
storeUpdates.set(storePath, settled);
|
|
228
|
+
try {
|
|
229
|
+
await result;
|
|
230
|
+
} finally {
|
|
231
|
+
if (storeUpdates.get(storePath) === settled) {
|
|
232
|
+
storeUpdates.delete(storePath);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Adds, replaces or (`unset`) removes the app's section. The store is replaced atomically, so a
|
|
239
|
+
* failed write leaves the previous one intact. A device that has never been booted has no store yet:
|
|
240
|
+
* it is created with just this section, and SpringBoard adds the rest on boot.
|
|
241
|
+
*
|
|
242
|
+
* @returns `false` if there was nothing to write (`unset` without a store)
|
|
243
|
+
*/
|
|
244
|
+
async function writeNotificationsSection(
|
|
245
|
+
storePath: string,
|
|
246
|
+
bundleId: string,
|
|
247
|
+
status: 'granted' | 'denied' | 'critical' | 'unset',
|
|
248
|
+
): Promise<boolean> {
|
|
249
|
+
let store: {sectionInfoVersionNumber?: number; sectionInfo?: Record<string, Uint8Array>};
|
|
250
|
+
if (await fs.exists(storePath)) {
|
|
251
|
+
store = (await plist.parsePlistFile(storePath)) as typeof store;
|
|
252
|
+
} else if (status === 'unset') {
|
|
253
|
+
return false;
|
|
254
|
+
} else {
|
|
255
|
+
await fs.mkdir(path.dirname(storePath), {recursive: true});
|
|
256
|
+
store = {sectionInfoVersionNumber: BULLETIN_BOARD_STORE_VERSION};
|
|
257
|
+
}
|
|
258
|
+
const sectionInfo = store.sectionInfo ?? {};
|
|
259
|
+
if (status === 'unset') {
|
|
260
|
+
delete sectionInfo[bundleId];
|
|
261
|
+
} else {
|
|
262
|
+
sectionInfo[bundleId] = buildNotificationsSectionInfo(bundleId, status);
|
|
263
|
+
}
|
|
264
|
+
store.sectionInfo = sectionInfo;
|
|
265
|
+
// In the same directory, so that the rename is atomic.
|
|
266
|
+
const tmpPath = `${storePath}.${randomUUID()}.tmp`;
|
|
267
|
+
try {
|
|
268
|
+
await fs.writeFile(tmpPath, plist.createPlist(store, false), {flag: 'wx'});
|
|
269
|
+
await fs.rename(tmpPath, storePath);
|
|
270
|
+
} catch (err) {
|
|
271
|
+
await fs.unlink(tmpPath).catch(() => {});
|
|
272
|
+
throw err;
|
|
273
|
+
}
|
|
274
|
+
return true;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Builds the NSKeyedArchiver-encoded `BBSectionInfo` of `bundleId`, the same archive
|
|
279
|
+
* AppleSimulatorUtils writes (SetNotificationsPermission.m). SpringBoard migrates its
|
|
280
|
+
* `allowsNotifications` flag to the current `authorizationStatus` when it loads the section.
|
|
281
|
+
*/
|
|
282
|
+
function buildNotificationsSectionInfo(bundleId: string, status: 'granted' | 'denied' | 'critical'): Buffer {
|
|
283
|
+
const nil = {UID: 0};
|
|
284
|
+
return plist.createBinaryPlist({
|
|
285
|
+
$version: 100000,
|
|
286
|
+
$objects: [
|
|
287
|
+
'$null',
|
|
288
|
+
{
|
|
289
|
+
suppressFromSettings: false,
|
|
290
|
+
suppressedSettings: 0,
|
|
291
|
+
hideWeeApp: false,
|
|
292
|
+
sectionID: {UID: 2},
|
|
293
|
+
displayName: {UID: 5},
|
|
294
|
+
icon: nil,
|
|
295
|
+
displaysCriticalBulletins: false,
|
|
296
|
+
subsections: nil,
|
|
297
|
+
sectionInfoSettings: {UID: 3},
|
|
298
|
+
$class: {UID: 7},
|
|
299
|
+
sectionCategory: 0,
|
|
300
|
+
subsectionPriority: 0,
|
|
301
|
+
version: {UID: 6},
|
|
302
|
+
managedSectionInfoSettings: nil,
|
|
303
|
+
appName: {UID: 5},
|
|
304
|
+
sectionType: 0,
|
|
305
|
+
factorySectionID: nil,
|
|
306
|
+
dataProviderIDs: nil,
|
|
307
|
+
subsectionID: nil,
|
|
308
|
+
filters: nil,
|
|
309
|
+
pathToWeeAppPluginBundle: nil,
|
|
310
|
+
},
|
|
311
|
+
bundleId,
|
|
312
|
+
{
|
|
313
|
+
pushSettings: 63,
|
|
314
|
+
showsInNotificationCenter: true,
|
|
315
|
+
allowsNotifications: status !== 'denied',
|
|
316
|
+
showsOnExternalDevices: true,
|
|
317
|
+
contentPreviewSetting: 0,
|
|
318
|
+
carPlaySetting: 0,
|
|
319
|
+
$class: {UID: 4},
|
|
320
|
+
showsInLockScreen: true,
|
|
321
|
+
alertType: 1,
|
|
322
|
+
criticalAlertSetting: status === 'critical' ? 2 : 0,
|
|
323
|
+
},
|
|
324
|
+
{$classname: 'BBSectionInfoSettings', $classes: ['BBSectionInfoSettings', 'NSObject']},
|
|
325
|
+
bundleId,
|
|
326
|
+
0,
|
|
327
|
+
{$classname: 'BBSectionInfo', $classes: ['BBSectionInfo', 'NSObject']},
|
|
328
|
+
],
|
|
329
|
+
$archiver: 'NSKeyedArchiver',
|
|
330
|
+
$top: {root: {UID: 1}},
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
async function setImmutable(filePath: string, immutable: boolean): Promise<void> {
|
|
335
|
+
try {
|
|
336
|
+
await execFileAsync('chflags', [immutable ? 'uchg' : 'nouchg', filePath]);
|
|
337
|
+
} catch {}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* SpringBoard of a booted device: the process that owns the BulletinBoard store, see
|
|
342
|
+
* setNotificationsAccess. The simulator shares the host kernel, so it is signalled directly.
|
|
343
|
+
*/
|
|
344
|
+
class SpringBoard {
|
|
345
|
+
private pausedPid: number | undefined;
|
|
346
|
+
|
|
347
|
+
constructor(
|
|
348
|
+
private readonly simctl: NativeSimctl,
|
|
349
|
+
private readonly udid: string,
|
|
350
|
+
) {}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Pauses the running SpringBoard so that it cannot rewrite the BulletinBoard store. It can be in
|
|
354
|
+
* the middle of a restart, hence the retries.
|
|
355
|
+
*/
|
|
356
|
+
async pause(): Promise<void> {
|
|
357
|
+
try {
|
|
358
|
+
await waitForCondition(
|
|
359
|
+
async () => {
|
|
360
|
+
const pid = await this.pid().catch(() => undefined);
|
|
361
|
+
if (pid && sendSignal(pid, 'SIGSTOP')) {
|
|
362
|
+
this.pausedPid = pid;
|
|
363
|
+
}
|
|
364
|
+
return Boolean(this.pausedPid);
|
|
365
|
+
},
|
|
366
|
+
{waitMs: SPRINGBOARD_RESTART_TIMEOUT_MS, intervalMs: 300},
|
|
367
|
+
);
|
|
368
|
+
} catch {}
|
|
369
|
+
if (!this.pausedPid) {
|
|
370
|
+
throw new Error(`${SPRINGBOARD_SERVICE} is not running`);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/** Lets the paused SpringBoard run again. */
|
|
375
|
+
resume(): void {
|
|
376
|
+
if (this.pausedPid) {
|
|
377
|
+
sendSignal(this.pausedPid, 'SIGCONT');
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* Replaces the paused SpringBoard with a new one: asks launchd to stop it (launchd starts a new
|
|
383
|
+
* one right away), resumes it so that it can exit, then waits for the new process.
|
|
384
|
+
*/
|
|
385
|
+
async restart(): Promise<void> {
|
|
386
|
+
const previousPid = this.pausedPid;
|
|
387
|
+
try {
|
|
388
|
+
await this.stop();
|
|
389
|
+
} finally {
|
|
390
|
+
this.resume();
|
|
391
|
+
this.pausedPid = undefined;
|
|
392
|
+
}
|
|
393
|
+
try {
|
|
394
|
+
await waitForCondition(
|
|
395
|
+
async () => {
|
|
396
|
+
const pid = await this.pid().catch(() => undefined);
|
|
397
|
+
return Number.isInteger(pid) && pid !== previousPid;
|
|
398
|
+
},
|
|
399
|
+
{waitMs: SPRINGBOARD_RESTART_TIMEOUT_MS, intervalMs: 300},
|
|
400
|
+
);
|
|
401
|
+
} catch {
|
|
402
|
+
throw new Error(`${SPRINGBOARD_SERVICE} did not restart within ${SPRINGBOARD_RESTART_TIMEOUT_MS}ms`);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
private async pid(): Promise<number | undefined> {
|
|
407
|
+
return (await this.simctl.listProcesses(this.udid)).find(({name}) => name === SPRINGBOARD_SERVICE)?.pid;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
private async stop(): Promise<void> {
|
|
411
|
+
// Bare name: resolved against the guest runtime's own bin dirs, like in listProcesses.
|
|
412
|
+
const proc = await this.simctl.spawnProcess(this.udid, 'launchctl', {
|
|
413
|
+
arguments: ['launchctl', 'stop', SPRINGBOARD_SERVICE],
|
|
414
|
+
});
|
|
415
|
+
let stderr = '';
|
|
416
|
+
proc.stdout.resume();
|
|
417
|
+
proc.stderr.on('data', (chunk: Buffer) => {
|
|
418
|
+
stderr += chunk;
|
|
419
|
+
});
|
|
420
|
+
const streamError = Promise.race([once(proc.stdout, 'error'), once(proc.stderr, 'error')]).then(([err]) => {
|
|
421
|
+
throw err;
|
|
422
|
+
});
|
|
423
|
+
const [[code, signal]] = await Promise.race([
|
|
424
|
+
Promise.all([once(proc, 'exit'), once(proc.stderr, 'end')]),
|
|
425
|
+
streamError,
|
|
426
|
+
]);
|
|
427
|
+
if (code !== 0) {
|
|
428
|
+
const reason = signal ? `signal ${signal}` : `exit code ${code}`;
|
|
429
|
+
throw new Error(
|
|
430
|
+
`'launchctl stop ${SPRINGBOARD_SERVICE}' failed with ${reason}${stderr.trim() ? `: ${stderr.trim()}` : ''}`,
|
|
431
|
+
);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/**
|
|
437
|
+
* @returns `false` if the process no longer exists
|
|
438
|
+
*/
|
|
439
|
+
function sendSignal(pid: number, name: NodeJS.Signals): boolean {
|
|
440
|
+
try {
|
|
441
|
+
process.kill(pid, name);
|
|
442
|
+
return true;
|
|
443
|
+
} catch (err: any) {
|
|
444
|
+
if (err?.code === 'ESRCH') {
|
|
445
|
+
return false;
|
|
446
|
+
}
|
|
447
|
+
throw err;
|
|
448
|
+
}
|
|
449
|
+
}
|
package/src/coresim.mm
CHANGED
|
@@ -619,6 +619,12 @@ class NativeDevice : public Napi::ObjectWrap<NativeDevice> {
|
|
|
619
619
|
return Napi::String::New(info.Env(), coresim::RuntimeRootPath(runtime).UTF8String);
|
|
620
620
|
});
|
|
621
621
|
}
|
|
622
|
+
Napi::Value DataPath(const Napi::CallbackInfo& info) {
|
|
623
|
+
return CatchToJs(info.Env(), [&]() -> Napi::Value {
|
|
624
|
+
NSString* dataPath = coresim::DeviceDataPath(device_);
|
|
625
|
+
return Napi::String::New(info.Env(), dataPath == nil ? "" : dataPath.UTF8String);
|
|
626
|
+
});
|
|
627
|
+
}
|
|
622
628
|
|
|
623
629
|
// Bridges SimDevice's GCD-completion-block-based bootAsyncWithOptions:completionQueue:
|
|
624
630
|
// completionHandler: — this is what replaces the CLI's bootstatus poll-until-timeout race with
|
|
@@ -1724,6 +1730,7 @@ void NativeDevice::Init(Napi::Env env) {
|
|
|
1724
1730
|
InstanceMethod<&NativeDevice::DeviceTypeIdentifier>("deviceTypeIdentifier"),
|
|
1725
1731
|
InstanceMethod<&NativeDevice::RuntimeIdentifier>("runtimeIdentifier"),
|
|
1726
1732
|
InstanceMethod<&NativeDevice::RuntimeRootPath>("runtimeRootPath"),
|
|
1733
|
+
InstanceMethod<&NativeDevice::DataPath>("dataPath"),
|
|
1727
1734
|
InstanceMethod<&NativeDevice::Boot>("boot"),
|
|
1728
1735
|
InstanceMethod<&NativeDevice::GetBootStatus>("getBootStatus"),
|
|
1729
1736
|
InstanceMethod<&NativeDevice::Shutdown>("shutdown"),
|
package/src/types.ts
CHANGED
|
@@ -87,9 +87,10 @@ export type SimPermissionStatus = 'unset' | 'denied' | 'granted' | 'limited';
|
|
|
87
87
|
|
|
88
88
|
/**
|
|
89
89
|
* A privacy permission grantable via `NativeSimctl.grantPermission`/`revokePermission`/
|
|
90
|
-
* `resetPermission`. Each is backed by a row in the simulator's own TCC
|
|
91
|
-
* `location` isn't included since CoreLocation simulation has its own
|
|
92
|
-
* row (see CLAUDE.md).
|
|
90
|
+
* `resetPermission`. Each except `notifications` is backed by a row in the simulator's own TCC
|
|
91
|
+
* (privacy) database — `location` isn't included since CoreLocation simulation has its own
|
|
92
|
+
* subsystem, not a plain TCC row (see CLAUDE.md). `notifications` is SpringBoard's own setting:
|
|
93
|
+
* changing it restarts SpringBoard, and its status can't be read back via `getPermission`.
|
|
93
94
|
*/
|
|
94
95
|
export type SimPermissionService =
|
|
95
96
|
| 'calendar'
|
|
@@ -101,6 +102,7 @@ export type SimPermissionService =
|
|
|
101
102
|
| 'medialibrary'
|
|
102
103
|
| 'microphone'
|
|
103
104
|
| 'motion'
|
|
105
|
+
| 'notifications'
|
|
104
106
|
| 'photos'
|
|
105
107
|
| 'reminders'
|
|
106
108
|
| 'siri'
|
|
@@ -424,6 +426,7 @@ export interface NativeDeviceHandle {
|
|
|
424
426
|
deviceTypeIdentifier(): string;
|
|
425
427
|
runtimeIdentifier(): string;
|
|
426
428
|
runtimeRootPath(): string;
|
|
429
|
+
dataPath(): string;
|
|
427
430
|
boot(options?: Record<string, unknown>): Promise<void>;
|
|
428
431
|
getBootStatus(): Promise<SimBootInfo | null>;
|
|
429
432
|
shutdown(): Promise<void>;
|