@swmansion/argent 0.23.0 → 0.23.1-next.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/README.md +1 -1
- package/bin/argent-android-devtools-0.1.0.apk +0 -0
- package/bin/darwin/ax-service +0 -0
- package/bin/darwin/tvos-ax-service +0 -0
- package/bin/darwin/tvos-hid-daemon +0 -0
- package/bin/tcp/ax-service +0 -0
- package/dist/cli-cmds.mjs +17 -2
- package/dist/installer.mjs +17 -2
- package/dist/ios-device-runner/ArgentRunner/ArgentRunner/RunnerHostApp.swift +37 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunner.xcodeproj/project.pbxproj +389 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunner.xcodeproj/xcshareddata/xcschemes/ArgentRunner.xcscheme +88 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunnerUITests/ArgentExceptionGuard.h +16 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunnerUITests/ArgentExceptionGuard.m +16 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunnerUITests/ArgentRunnerSession+Commands.swift +280 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunnerUITests/ArgentRunnerSession+Gestures.swift +149 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunnerUITests/ArgentRunnerSession+Screenshot.swift +21 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunnerUITests/ArgentRunnerSession+Snapshot.swift +327 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunnerUITests/ArgentRunnerSession+TextEntry.swift +157 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunnerUITests/ArgentRunnerSession.swift +410 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunnerUITests/ArgentRunnerUITests-Bridging-Header.h +1 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunnerUITests/CommandJournal.swift +134 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunnerUITests/MainThreadGate.swift +111 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunnerUITests/RunnerHTTPServer.swift +267 -0
- package/dist/ios-device-runner/ArgentRunner/ArgentRunnerUITests/RunnerProtocol.swift +331 -0
- package/dist/mcp-server.mjs +16 -1
- package/dist/tool-server.cjs +4224 -1388
- package/dylibs/libArgentInjectionBootstrap.dylib +0 -0
- package/dylibs/libKeyboardPatch.dylib +0 -0
- package/dylibs/libNativeDevtoolsIos.dylib +0 -0
- package/dylibs/tcp/libArgentInjectionBootstrap.dylib +0 -0
- package/dylibs/tcp/libKeyboardPatch.dylib +0 -0
- package/dylibs/tcp/libNativeDevtoolsIos.dylib +0 -0
- package/dylibs/tvos/libArgentInjectionBootstrap.dylib +0 -0
- package/dylibs/tvos/libKeyboardPatch.dylib +0 -0
- package/dylibs/tvos/libNativeDevtoolsIos.dylib +0 -0
- package/package.json +1 -1
- package/rules/argent.md +8 -3
- package/skills/argent-create-flow/SKILL.md +1 -0
- package/skills/argent-device-interact/SKILL.md +2 -0
- package/skills/argent-ios-device-interact/SKILL.md +18 -0
- package/skills/argent-ios-device-setup/SKILL.md +20 -0
- package/skills/argent-qa-flows/SKILL.md +2 -0
- package/skills/argent-screenshot-diff/SKILL.md +2 -0
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ Argent drives a growing set of targets through a single toolkit, each with the r
|
|
|
23
23
|
|
|
24
24
|
| Platform | Targets | Interaction |
|
|
25
25
|
| ----------------- | ----------------------------------------------------------------------- | ---------------- |
|
|
26
|
-
| **iOS** | Simulators
|
|
26
|
+
| **iOS** | Simulators and physical iPhones (USB) | Touch / gesture |
|
|
27
27
|
| **Android** | Emulators (AVDs) and physical devices over adb | Touch / gesture |
|
|
28
28
|
| **TV** | Apple TV (tvOS), Android TV / Google TV, Amazon Fire TV (Vega) | D-pad / remote |
|
|
29
29
|
| **Desktop & web** | Electron and Chromium apps (incl. React Native Web / Expo web) over CDP | Mouse / keyboard |
|
|
Binary file
|
package/bin/darwin/ax-service
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/bin/tcp/ax-service
CHANGED
|
Binary file
|
package/dist/cli-cmds.mjs
CHANGED
|
@@ -2290,6 +2290,18 @@ var FAILURE_CODES = {
|
|
|
2290
2290
|
SIMULATOR_COMMAND_REJECTED: "SIMULATOR_COMMAND_REJECTED",
|
|
2291
2291
|
SIMULATOR_COMMAND_ACK_TIMEOUT: "SIMULATOR_COMMAND_ACK_TIMEOUT",
|
|
2292
2292
|
SIMULATOR_COMMAND_TRANSPORT_FAILED: "SIMULATOR_COMMAND_TRANSPORT_FAILED",
|
|
2293
|
+
// Physical iOS devices: the XCUITest-runner blueprint lifecycle, the runner
|
|
2294
|
+
// command client, and the `xcrun devicectl` subprocess wrapper (simulators
|
|
2295
|
+
// use the SIMULATOR_* set).
|
|
2296
|
+
IOS_DEVICE_RUNNER_FACTORY_OPTIONS_MISSING: "IOS_DEVICE_RUNNER_FACTORY_OPTIONS_MISSING",
|
|
2297
|
+
IOS_DEVICE_RUNNER_NOT_READY: "IOS_DEVICE_RUNNER_NOT_READY",
|
|
2298
|
+
IOS_DEVICE_RUNNER_TERMINATED: "IOS_DEVICE_RUNNER_TERMINATED",
|
|
2299
|
+
IOS_DEVICE_RUNNER_EXITED: "IOS_DEVICE_RUNNER_EXITED",
|
|
2300
|
+
// The runner answered a command with an ok:false envelope.
|
|
2301
|
+
IOS_DEVICE_RUNNER_COMMAND_FAILED: "IOS_DEVICE_RUNNER_COMMAND_FAILED",
|
|
2302
|
+
// The usbmux or HTTP exchange with a reachable runner failed.
|
|
2303
|
+
IOS_DEVICE_RUNNER_TRANSPORT_FAILED: "IOS_DEVICE_RUNNER_TRANSPORT_FAILED",
|
|
2304
|
+
IOS_DEVICECTL_COMMAND_FAILED: "IOS_DEVICECTL_COMMAND_FAILED",
|
|
2293
2305
|
AX_QUERY_TIMEOUT: "AX_QUERY_TIMEOUT",
|
|
2294
2306
|
AX_DAEMON_READY_TIMEOUT: "AX_DAEMON_READY_TIMEOUT",
|
|
2295
2307
|
AX_DAEMON_EXITED_BEFORE_READY: "AX_DAEMON_EXITED_BEFORE_READY",
|
|
@@ -2460,6 +2472,7 @@ var FAILURE_CODES = {
|
|
|
2460
2472
|
KEYBOARD_KEY_UNSUPPORTED: "KEYBOARD_KEY_UNSUPPORTED",
|
|
2461
2473
|
KEYBOARD_CHARACTER_UNSUPPORTED: "KEYBOARD_CHARACTER_UNSUPPORTED",
|
|
2462
2474
|
KEYBOARD_TEXT_AND_KEY_COMBINED: "KEYBOARD_TEXT_AND_KEY_COMBINED",
|
|
2475
|
+
KEYBOARD_INPUT_NOT_FOCUSED: "KEYBOARD_INPUT_NOT_FOCUSED",
|
|
2463
2476
|
SECRET_PLACEHOLDER_UNKNOWN: "SECRET_PLACEHOLDER_UNKNOWN",
|
|
2464
2477
|
SCREENSHOT_DIFF_INPUT_INVALID: "SCREENSHOT_DIFF_INPUT_INVALID",
|
|
2465
2478
|
BOOT_DEVICE_TARGET_SELECTION_INVALID: "BOOT_DEVICE_TARGET_SELECTION_INVALID",
|
|
@@ -2504,7 +2517,9 @@ var FAILURE_COMMANDS = [
|
|
|
2504
2517
|
"electron",
|
|
2505
2518
|
"npm",
|
|
2506
2519
|
"npx",
|
|
2507
|
-
"unknown"
|
|
2520
|
+
"unknown",
|
|
2521
|
+
"devicectl",
|
|
2522
|
+
"xcodebuild"
|
|
2508
2523
|
];
|
|
2509
2524
|
var FAILURE_SIGNAL_NAMES = [
|
|
2510
2525
|
"SIGABRT",
|
|
@@ -7225,7 +7240,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
|
|
|
7225
7240
|
var SESSION_ID2 = randomUUID5();
|
|
7226
7241
|
function readCliVersion() {
|
|
7227
7242
|
if (true) {
|
|
7228
|
-
return "0.23.0";
|
|
7243
|
+
return "0.23.1-next.0";
|
|
7229
7244
|
}
|
|
7230
7245
|
return "0.0.0";
|
|
7231
7246
|
}
|
package/dist/installer.mjs
CHANGED
|
@@ -15625,6 +15625,18 @@ var FAILURE_CODES = {
|
|
|
15625
15625
|
SIMULATOR_COMMAND_REJECTED: "SIMULATOR_COMMAND_REJECTED",
|
|
15626
15626
|
SIMULATOR_COMMAND_ACK_TIMEOUT: "SIMULATOR_COMMAND_ACK_TIMEOUT",
|
|
15627
15627
|
SIMULATOR_COMMAND_TRANSPORT_FAILED: "SIMULATOR_COMMAND_TRANSPORT_FAILED",
|
|
15628
|
+
// Physical iOS devices: the XCUITest-runner blueprint lifecycle, the runner
|
|
15629
|
+
// command client, and the `xcrun devicectl` subprocess wrapper (simulators
|
|
15630
|
+
// use the SIMULATOR_* set).
|
|
15631
|
+
IOS_DEVICE_RUNNER_FACTORY_OPTIONS_MISSING: "IOS_DEVICE_RUNNER_FACTORY_OPTIONS_MISSING",
|
|
15632
|
+
IOS_DEVICE_RUNNER_NOT_READY: "IOS_DEVICE_RUNNER_NOT_READY",
|
|
15633
|
+
IOS_DEVICE_RUNNER_TERMINATED: "IOS_DEVICE_RUNNER_TERMINATED",
|
|
15634
|
+
IOS_DEVICE_RUNNER_EXITED: "IOS_DEVICE_RUNNER_EXITED",
|
|
15635
|
+
// The runner answered a command with an ok:false envelope.
|
|
15636
|
+
IOS_DEVICE_RUNNER_COMMAND_FAILED: "IOS_DEVICE_RUNNER_COMMAND_FAILED",
|
|
15637
|
+
// The usbmux or HTTP exchange with a reachable runner failed.
|
|
15638
|
+
IOS_DEVICE_RUNNER_TRANSPORT_FAILED: "IOS_DEVICE_RUNNER_TRANSPORT_FAILED",
|
|
15639
|
+
IOS_DEVICECTL_COMMAND_FAILED: "IOS_DEVICECTL_COMMAND_FAILED",
|
|
15628
15640
|
AX_QUERY_TIMEOUT: "AX_QUERY_TIMEOUT",
|
|
15629
15641
|
AX_DAEMON_READY_TIMEOUT: "AX_DAEMON_READY_TIMEOUT",
|
|
15630
15642
|
AX_DAEMON_EXITED_BEFORE_READY: "AX_DAEMON_EXITED_BEFORE_READY",
|
|
@@ -15795,6 +15807,7 @@ var FAILURE_CODES = {
|
|
|
15795
15807
|
KEYBOARD_KEY_UNSUPPORTED: "KEYBOARD_KEY_UNSUPPORTED",
|
|
15796
15808
|
KEYBOARD_CHARACTER_UNSUPPORTED: "KEYBOARD_CHARACTER_UNSUPPORTED",
|
|
15797
15809
|
KEYBOARD_TEXT_AND_KEY_COMBINED: "KEYBOARD_TEXT_AND_KEY_COMBINED",
|
|
15810
|
+
KEYBOARD_INPUT_NOT_FOCUSED: "KEYBOARD_INPUT_NOT_FOCUSED",
|
|
15798
15811
|
SECRET_PLACEHOLDER_UNKNOWN: "SECRET_PLACEHOLDER_UNKNOWN",
|
|
15799
15812
|
SCREENSHOT_DIFF_INPUT_INVALID: "SCREENSHOT_DIFF_INPUT_INVALID",
|
|
15800
15813
|
BOOT_DEVICE_TARGET_SELECTION_INVALID: "BOOT_DEVICE_TARGET_SELECTION_INVALID",
|
|
@@ -15839,7 +15852,9 @@ var FAILURE_COMMANDS = [
|
|
|
15839
15852
|
"electron",
|
|
15840
15853
|
"npm",
|
|
15841
15854
|
"npx",
|
|
15842
|
-
"unknown"
|
|
15855
|
+
"unknown",
|
|
15856
|
+
"devicectl",
|
|
15857
|
+
"xcodebuild"
|
|
15843
15858
|
];
|
|
15844
15859
|
var FAILURE_SIGNAL_NAMES = [
|
|
15845
15860
|
"SIGABRT",
|
|
@@ -16610,7 +16625,7 @@ var _CI_VENDOR_COUNT_FOR_TEST = vendors_default.length;
|
|
|
16610
16625
|
var SESSION_ID = randomUUID4();
|
|
16611
16626
|
function readCliVersion() {
|
|
16612
16627
|
if (true) {
|
|
16613
|
-
return "0.23.0";
|
|
16628
|
+
return "0.23.1-next.0";
|
|
16614
16629
|
}
|
|
16615
16630
|
return "0.0.0";
|
|
16616
16631
|
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import UIKit
|
|
2
|
+
|
|
3
|
+
/// Placeholder host application for the Argent runner's UI-test bundle.
|
|
4
|
+
///
|
|
5
|
+
/// It never participates in automation (every command targets another app by
|
|
6
|
+
/// bundle id), but XCUITest requires a host app to exist, and testmanagerd
|
|
7
|
+
/// launches it once when the session starts. The single black screen makes it
|
|
8
|
+
/// obvious on the device that the runner, not a user app, is frontmost.
|
|
9
|
+
@main
|
|
10
|
+
final class RunnerHostAppDelegate: UIResponder, UIApplicationDelegate {
|
|
11
|
+
var window: UIWindow?
|
|
12
|
+
|
|
13
|
+
func application(
|
|
14
|
+
_ application: UIApplication,
|
|
15
|
+
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
|
|
16
|
+
) -> Bool {
|
|
17
|
+
let controller = UIViewController()
|
|
18
|
+
controller.view.backgroundColor = .black
|
|
19
|
+
|
|
20
|
+
let label = UILabel()
|
|
21
|
+
label.text = "Argent Runner"
|
|
22
|
+
label.textColor = .white
|
|
23
|
+
label.font = .systemFont(ofSize: 22, weight: .semibold)
|
|
24
|
+
label.translatesAutoresizingMaskIntoConstraints = false
|
|
25
|
+
controller.view.addSubview(label)
|
|
26
|
+
NSLayoutConstraint.activate([
|
|
27
|
+
label.centerXAnchor.constraint(equalTo: controller.view.centerXAnchor),
|
|
28
|
+
label.centerYAnchor.constraint(equalTo: controller.view.centerYAnchor),
|
|
29
|
+
])
|
|
30
|
+
|
|
31
|
+
let window = UIWindow(frame: UIScreen.main.bounds)
|
|
32
|
+
window.rootViewController = controller
|
|
33
|
+
window.makeKeyAndVisible()
|
|
34
|
+
self.window = window
|
|
35
|
+
return true
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
// !$*UTF8*$!
|
|
2
|
+
{
|
|
3
|
+
archiveVersion = 1;
|
|
4
|
+
classes = {
|
|
5
|
+
};
|
|
6
|
+
objectVersion = 77;
|
|
7
|
+
objects = {
|
|
8
|
+
|
|
9
|
+
/* Begin PBXContainerItemProxy section */
|
|
10
|
+
A00000000000000000000025 /* PBXContainerItemProxy */ = {
|
|
11
|
+
isa = PBXContainerItemProxy;
|
|
12
|
+
containerPortal = A00000000000000000000001 /* Project object */;
|
|
13
|
+
proxyType = 1;
|
|
14
|
+
remoteGlobalIDString = A00000000000000000000011;
|
|
15
|
+
remoteInfo = ArgentRunner;
|
|
16
|
+
};
|
|
17
|
+
/* End PBXContainerItemProxy section */
|
|
18
|
+
|
|
19
|
+
/* Begin PBXFileReference section */
|
|
20
|
+
A00000000000000000000007 /* ArgentRunner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ArgentRunner.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
21
|
+
A00000000000000000000008 /* ArgentRunnerUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ArgentRunnerUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
22
|
+
/* End PBXFileReference section */
|
|
23
|
+
|
|
24
|
+
/* Begin PBXFileSystemSynchronizedRootGroup section */
|
|
25
|
+
A00000000000000000000009 /* ArgentRunner */ = {
|
|
26
|
+
isa = PBXFileSystemSynchronizedRootGroup;
|
|
27
|
+
path = ArgentRunner;
|
|
28
|
+
sourceTree = "<group>";
|
|
29
|
+
};
|
|
30
|
+
A00000000000000000000010 /* ArgentRunnerUITests */ = {
|
|
31
|
+
isa = PBXFileSystemSynchronizedRootGroup;
|
|
32
|
+
path = ArgentRunnerUITests;
|
|
33
|
+
sourceTree = "<group>";
|
|
34
|
+
};
|
|
35
|
+
/* End PBXFileSystemSynchronizedRootGroup section */
|
|
36
|
+
|
|
37
|
+
/* Begin PBXFrameworksBuildPhase section */
|
|
38
|
+
A00000000000000000000016 /* Frameworks */ = {
|
|
39
|
+
isa = PBXFrameworksBuildPhase;
|
|
40
|
+
buildActionMask = 2147483647;
|
|
41
|
+
files = (
|
|
42
|
+
);
|
|
43
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
44
|
+
};
|
|
45
|
+
A00000000000000000000023 /* Frameworks */ = {
|
|
46
|
+
isa = PBXFrameworksBuildPhase;
|
|
47
|
+
buildActionMask = 2147483647;
|
|
48
|
+
files = (
|
|
49
|
+
);
|
|
50
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
51
|
+
};
|
|
52
|
+
/* End PBXFrameworksBuildPhase section */
|
|
53
|
+
|
|
54
|
+
/* Begin PBXGroup section */
|
|
55
|
+
A00000000000000000000005 = {
|
|
56
|
+
isa = PBXGroup;
|
|
57
|
+
children = (
|
|
58
|
+
A00000000000000000000009 /* ArgentRunner */,
|
|
59
|
+
A00000000000000000000010 /* ArgentRunnerUITests */,
|
|
60
|
+
A00000000000000000000006 /* Products */,
|
|
61
|
+
);
|
|
62
|
+
sourceTree = "<group>";
|
|
63
|
+
};
|
|
64
|
+
A00000000000000000000006 /* Products */ = {
|
|
65
|
+
isa = PBXGroup;
|
|
66
|
+
children = (
|
|
67
|
+
A00000000000000000000007 /* ArgentRunner.app */,
|
|
68
|
+
A00000000000000000000008 /* ArgentRunnerUITests.xctest */,
|
|
69
|
+
);
|
|
70
|
+
name = Products;
|
|
71
|
+
sourceTree = "<group>";
|
|
72
|
+
};
|
|
73
|
+
/* End PBXGroup section */
|
|
74
|
+
|
|
75
|
+
/* Begin PBXNativeTarget section */
|
|
76
|
+
A00000000000000000000011 /* ArgentRunner */ = {
|
|
77
|
+
isa = PBXNativeTarget;
|
|
78
|
+
buildConfigurationList = A00000000000000000000012 /* Build configuration list for PBXNativeTarget "ArgentRunner" */;
|
|
79
|
+
buildPhases = (
|
|
80
|
+
A00000000000000000000015 /* Sources */,
|
|
81
|
+
A00000000000000000000016 /* Frameworks */,
|
|
82
|
+
A00000000000000000000017 /* Resources */,
|
|
83
|
+
);
|
|
84
|
+
buildRules = (
|
|
85
|
+
);
|
|
86
|
+
dependencies = (
|
|
87
|
+
);
|
|
88
|
+
fileSystemSynchronizedGroups = (
|
|
89
|
+
A00000000000000000000009 /* ArgentRunner */,
|
|
90
|
+
);
|
|
91
|
+
name = ArgentRunner;
|
|
92
|
+
packageProductDependencies = (
|
|
93
|
+
);
|
|
94
|
+
productName = ArgentRunner;
|
|
95
|
+
productReference = A00000000000000000000007 /* ArgentRunner.app */;
|
|
96
|
+
productType = "com.apple.product-type.application";
|
|
97
|
+
};
|
|
98
|
+
A00000000000000000000018 /* ArgentRunnerUITests */ = {
|
|
99
|
+
isa = PBXNativeTarget;
|
|
100
|
+
buildConfigurationList = A00000000000000000000019 /* Build configuration list for PBXNativeTarget "ArgentRunnerUITests" */;
|
|
101
|
+
buildPhases = (
|
|
102
|
+
A00000000000000000000022 /* Sources */,
|
|
103
|
+
A00000000000000000000023 /* Frameworks */,
|
|
104
|
+
A00000000000000000000024 /* Resources */,
|
|
105
|
+
);
|
|
106
|
+
buildRules = (
|
|
107
|
+
);
|
|
108
|
+
dependencies = (
|
|
109
|
+
A00000000000000000000026 /* PBXTargetDependency */,
|
|
110
|
+
);
|
|
111
|
+
fileSystemSynchronizedGroups = (
|
|
112
|
+
A00000000000000000000010 /* ArgentRunnerUITests */,
|
|
113
|
+
);
|
|
114
|
+
name = ArgentRunnerUITests;
|
|
115
|
+
packageProductDependencies = (
|
|
116
|
+
);
|
|
117
|
+
productName = ArgentRunnerUITests;
|
|
118
|
+
productReference = A00000000000000000000008 /* ArgentRunnerUITests.xctest */;
|
|
119
|
+
productType = "com.apple.product-type.bundle.ui-testing";
|
|
120
|
+
};
|
|
121
|
+
/* End PBXNativeTarget section */
|
|
122
|
+
|
|
123
|
+
/* Begin PBXProject section */
|
|
124
|
+
A00000000000000000000001 /* Project object */ = {
|
|
125
|
+
isa = PBXProject;
|
|
126
|
+
attributes = {
|
|
127
|
+
BuildIndependentTargetsInParallel = 1;
|
|
128
|
+
LastUpgradeCheck = 2600;
|
|
129
|
+
TargetAttributes = {
|
|
130
|
+
A00000000000000000000011 = {
|
|
131
|
+
CreatedOnToolsVersion = 26.0;
|
|
132
|
+
};
|
|
133
|
+
A00000000000000000000018 = {
|
|
134
|
+
CreatedOnToolsVersion = 26.0;
|
|
135
|
+
TestTargetID = A00000000000000000000011;
|
|
136
|
+
};
|
|
137
|
+
};
|
|
138
|
+
};
|
|
139
|
+
buildConfigurationList = A00000000000000000000002 /* Build configuration list for PBXProject "ArgentRunner" */;
|
|
140
|
+
developmentRegion = en;
|
|
141
|
+
hasScannedForEncodings = 0;
|
|
142
|
+
knownRegions = (
|
|
143
|
+
en,
|
|
144
|
+
Base,
|
|
145
|
+
);
|
|
146
|
+
mainGroup = A00000000000000000000005;
|
|
147
|
+
minimizedProjectReferenceProxies = 1;
|
|
148
|
+
preferredProjectObjectVersion = 77;
|
|
149
|
+
productRefGroup = A00000000000000000000006 /* Products */;
|
|
150
|
+
projectDirPath = "";
|
|
151
|
+
projectRoot = "";
|
|
152
|
+
targets = (
|
|
153
|
+
A00000000000000000000011 /* ArgentRunner */,
|
|
154
|
+
A00000000000000000000018 /* ArgentRunnerUITests */,
|
|
155
|
+
);
|
|
156
|
+
};
|
|
157
|
+
/* End PBXProject section */
|
|
158
|
+
|
|
159
|
+
/* Begin PBXResourcesBuildPhase section */
|
|
160
|
+
A00000000000000000000017 /* Resources */ = {
|
|
161
|
+
isa = PBXResourcesBuildPhase;
|
|
162
|
+
buildActionMask = 2147483647;
|
|
163
|
+
files = (
|
|
164
|
+
);
|
|
165
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
166
|
+
};
|
|
167
|
+
A00000000000000000000024 /* Resources */ = {
|
|
168
|
+
isa = PBXResourcesBuildPhase;
|
|
169
|
+
buildActionMask = 2147483647;
|
|
170
|
+
files = (
|
|
171
|
+
);
|
|
172
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
173
|
+
};
|
|
174
|
+
/* End PBXResourcesBuildPhase section */
|
|
175
|
+
|
|
176
|
+
/* Begin PBXSourcesBuildPhase section */
|
|
177
|
+
A00000000000000000000015 /* Sources */ = {
|
|
178
|
+
isa = PBXSourcesBuildPhase;
|
|
179
|
+
buildActionMask = 2147483647;
|
|
180
|
+
files = (
|
|
181
|
+
);
|
|
182
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
183
|
+
};
|
|
184
|
+
A00000000000000000000022 /* Sources */ = {
|
|
185
|
+
isa = PBXSourcesBuildPhase;
|
|
186
|
+
buildActionMask = 2147483647;
|
|
187
|
+
files = (
|
|
188
|
+
);
|
|
189
|
+
runOnlyForDeploymentPostprocessing = 0;
|
|
190
|
+
};
|
|
191
|
+
/* End PBXSourcesBuildPhase section */
|
|
192
|
+
|
|
193
|
+
/* Begin PBXTargetDependency section */
|
|
194
|
+
A00000000000000000000026 /* PBXTargetDependency */ = {
|
|
195
|
+
isa = PBXTargetDependency;
|
|
196
|
+
target = A00000000000000000000011 /* ArgentRunner */;
|
|
197
|
+
targetProxy = A00000000000000000000025 /* PBXContainerItemProxy */;
|
|
198
|
+
};
|
|
199
|
+
/* End PBXTargetDependency section */
|
|
200
|
+
|
|
201
|
+
/* Begin XCBuildConfiguration section */
|
|
202
|
+
A00000000000000000000003 /* Debug */ = {
|
|
203
|
+
isa = XCBuildConfiguration;
|
|
204
|
+
buildSettings = {
|
|
205
|
+
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
206
|
+
ARGENT_RUNNER_APP_BUNDLE_ID = com.argent.ios.runner;
|
|
207
|
+
ARGENT_RUNNER_TEST_BUNDLE_ID = "$(ARGENT_RUNNER_APP_BUNDLE_ID).uitests";
|
|
208
|
+
CLANG_ANALYZER_NONNULL = YES;
|
|
209
|
+
CLANG_ENABLE_MODULES = YES;
|
|
210
|
+
CLANG_ENABLE_OBJC_ARC = YES;
|
|
211
|
+
CLANG_ENABLE_OBJC_WEAK = YES;
|
|
212
|
+
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
213
|
+
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
214
|
+
CLANG_WARN_EMPTY_BODY = YES;
|
|
215
|
+
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
216
|
+
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
217
|
+
CLANG_WARN_INT_CONVERSION = YES;
|
|
218
|
+
CLANG_WARN_UNREACHABLE_CODE = YES;
|
|
219
|
+
COPY_PHASE_STRIP = NO;
|
|
220
|
+
DEBUG_INFORMATION_FORMAT = dwarf;
|
|
221
|
+
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
222
|
+
ENABLE_TESTABILITY = YES;
|
|
223
|
+
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
|
224
|
+
GCC_C_LANGUAGE_STANDARD = gnu17;
|
|
225
|
+
GCC_NO_COMMON_BLOCKS = YES;
|
|
226
|
+
GCC_OPTIMIZATION_LEVEL = 0;
|
|
227
|
+
GCC_PREPROCESSOR_DEFINITIONS = (
|
|
228
|
+
"DEBUG=1",
|
|
229
|
+
"$(inherited)",
|
|
230
|
+
);
|
|
231
|
+
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
232
|
+
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
233
|
+
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
234
|
+
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
235
|
+
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
|
|
236
|
+
ONLY_ACTIVE_ARCH = YES;
|
|
237
|
+
SDKROOT = iphoneos;
|
|
238
|
+
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
|
239
|
+
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
|
|
240
|
+
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
241
|
+
SWIFT_VERSION = 5.0;
|
|
242
|
+
TARGETED_DEVICE_FAMILY = 1;
|
|
243
|
+
};
|
|
244
|
+
name = Debug;
|
|
245
|
+
};
|
|
246
|
+
A00000000000000000000004 /* Release */ = {
|
|
247
|
+
isa = XCBuildConfiguration;
|
|
248
|
+
buildSettings = {
|
|
249
|
+
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
250
|
+
ARGENT_RUNNER_APP_BUNDLE_ID = com.argent.ios.runner;
|
|
251
|
+
ARGENT_RUNNER_TEST_BUNDLE_ID = "$(ARGENT_RUNNER_APP_BUNDLE_ID).uitests";
|
|
252
|
+
CLANG_ANALYZER_NONNULL = YES;
|
|
253
|
+
CLANG_ENABLE_MODULES = YES;
|
|
254
|
+
CLANG_ENABLE_OBJC_ARC = YES;
|
|
255
|
+
CLANG_ENABLE_OBJC_WEAK = YES;
|
|
256
|
+
CLANG_WARN_BOOL_CONVERSION = YES;
|
|
257
|
+
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
|
258
|
+
CLANG_WARN_EMPTY_BODY = YES;
|
|
259
|
+
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
260
|
+
CLANG_WARN_INFINITE_RECURSION = YES;
|
|
261
|
+
CLANG_WARN_INT_CONVERSION = YES;
|
|
262
|
+
CLANG_WARN_UNREACHABLE_CODE = YES;
|
|
263
|
+
COPY_PHASE_STRIP = NO;
|
|
264
|
+
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
|
265
|
+
ENABLE_NS_ASSERTIONS = NO;
|
|
266
|
+
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
|
267
|
+
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
|
268
|
+
GCC_C_LANGUAGE_STANDARD = gnu17;
|
|
269
|
+
GCC_NO_COMMON_BLOCKS = YES;
|
|
270
|
+
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
|
271
|
+
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
|
272
|
+
GCC_WARN_UNUSED_FUNCTION = YES;
|
|
273
|
+
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
274
|
+
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
|
|
275
|
+
SDKROOT = iphoneos;
|
|
276
|
+
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
|
|
277
|
+
SWIFT_COMPILATION_MODE = wholemodule;
|
|
278
|
+
SWIFT_VERSION = 5.0;
|
|
279
|
+
TARGETED_DEVICE_FAMILY = 1;
|
|
280
|
+
VALIDATE_PRODUCT = YES;
|
|
281
|
+
};
|
|
282
|
+
name = Release;
|
|
283
|
+
};
|
|
284
|
+
A00000000000000000000013 /* Debug */ = {
|
|
285
|
+
isa = XCBuildConfiguration;
|
|
286
|
+
buildSettings = {
|
|
287
|
+
CODE_SIGN_STYLE = Automatic;
|
|
288
|
+
CURRENT_PROJECT_VERSION = 1;
|
|
289
|
+
GENERATE_INFOPLIST_FILE = YES;
|
|
290
|
+
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = NO;
|
|
291
|
+
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
|
292
|
+
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
|
293
|
+
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
|
294
|
+
LD_RUNPATH_SEARCH_PATHS = (
|
|
295
|
+
"$(inherited)",
|
|
296
|
+
"@executable_path/Frameworks",
|
|
297
|
+
);
|
|
298
|
+
MARKETING_VERSION = 1.0;
|
|
299
|
+
PRODUCT_BUNDLE_IDENTIFIER = "$(ARGENT_RUNNER_APP_BUNDLE_ID)";
|
|
300
|
+
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
301
|
+
SWIFT_EMIT_LOC_STRINGS = YES;
|
|
302
|
+
};
|
|
303
|
+
name = Debug;
|
|
304
|
+
};
|
|
305
|
+
A00000000000000000000014 /* Release */ = {
|
|
306
|
+
isa = XCBuildConfiguration;
|
|
307
|
+
buildSettings = {
|
|
308
|
+
CODE_SIGN_STYLE = Automatic;
|
|
309
|
+
CURRENT_PROJECT_VERSION = 1;
|
|
310
|
+
GENERATE_INFOPLIST_FILE = YES;
|
|
311
|
+
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = NO;
|
|
312
|
+
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
|
313
|
+
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
|
314
|
+
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
|
315
|
+
LD_RUNPATH_SEARCH_PATHS = (
|
|
316
|
+
"$(inherited)",
|
|
317
|
+
"@executable_path/Frameworks",
|
|
318
|
+
);
|
|
319
|
+
MARKETING_VERSION = 1.0;
|
|
320
|
+
PRODUCT_BUNDLE_IDENTIFIER = "$(ARGENT_RUNNER_APP_BUNDLE_ID)";
|
|
321
|
+
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
322
|
+
SWIFT_EMIT_LOC_STRINGS = YES;
|
|
323
|
+
};
|
|
324
|
+
name = Release;
|
|
325
|
+
};
|
|
326
|
+
A00000000000000000000020 /* Debug */ = {
|
|
327
|
+
isa = XCBuildConfiguration;
|
|
328
|
+
buildSettings = {
|
|
329
|
+
CODE_SIGN_STYLE = Automatic;
|
|
330
|
+
CURRENT_PROJECT_VERSION = 1;
|
|
331
|
+
GENERATE_INFOPLIST_FILE = YES;
|
|
332
|
+
MARKETING_VERSION = 1.0;
|
|
333
|
+
PRODUCT_BUNDLE_IDENTIFIER = "$(ARGENT_RUNNER_TEST_BUNDLE_ID)";
|
|
334
|
+
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
335
|
+
SWIFT_EMIT_LOC_STRINGS = NO;
|
|
336
|
+
SWIFT_OBJC_BRIDGING_HEADER = "ArgentRunnerUITests/ArgentRunnerUITests-Bridging-Header.h";
|
|
337
|
+
TEST_TARGET_NAME = ArgentRunner;
|
|
338
|
+
};
|
|
339
|
+
name = Debug;
|
|
340
|
+
};
|
|
341
|
+
A00000000000000000000021 /* Release */ = {
|
|
342
|
+
isa = XCBuildConfiguration;
|
|
343
|
+
buildSettings = {
|
|
344
|
+
CODE_SIGN_STYLE = Automatic;
|
|
345
|
+
CURRENT_PROJECT_VERSION = 1;
|
|
346
|
+
GENERATE_INFOPLIST_FILE = YES;
|
|
347
|
+
MARKETING_VERSION = 1.0;
|
|
348
|
+
PRODUCT_BUNDLE_IDENTIFIER = "$(ARGENT_RUNNER_TEST_BUNDLE_ID)";
|
|
349
|
+
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
350
|
+
SWIFT_EMIT_LOC_STRINGS = NO;
|
|
351
|
+
SWIFT_OBJC_BRIDGING_HEADER = "ArgentRunnerUITests/ArgentRunnerUITests-Bridging-Header.h";
|
|
352
|
+
TEST_TARGET_NAME = ArgentRunner;
|
|
353
|
+
};
|
|
354
|
+
name = Release;
|
|
355
|
+
};
|
|
356
|
+
/* End XCBuildConfiguration section */
|
|
357
|
+
|
|
358
|
+
/* Begin XCConfigurationList section */
|
|
359
|
+
A00000000000000000000002 /* Build configuration list for PBXProject "ArgentRunner" */ = {
|
|
360
|
+
isa = XCConfigurationList;
|
|
361
|
+
buildConfigurations = (
|
|
362
|
+
A00000000000000000000003 /* Debug */,
|
|
363
|
+
A00000000000000000000004 /* Release */,
|
|
364
|
+
);
|
|
365
|
+
defaultConfigurationIsVisible = 0;
|
|
366
|
+
defaultConfigurationName = Release;
|
|
367
|
+
};
|
|
368
|
+
A00000000000000000000012 /* Build configuration list for PBXNativeTarget "ArgentRunner" */ = {
|
|
369
|
+
isa = XCConfigurationList;
|
|
370
|
+
buildConfigurations = (
|
|
371
|
+
A00000000000000000000013 /* Debug */,
|
|
372
|
+
A00000000000000000000014 /* Release */,
|
|
373
|
+
);
|
|
374
|
+
defaultConfigurationIsVisible = 0;
|
|
375
|
+
defaultConfigurationName = Release;
|
|
376
|
+
};
|
|
377
|
+
A00000000000000000000019 /* Build configuration list for PBXNativeTarget "ArgentRunnerUITests" */ = {
|
|
378
|
+
isa = XCConfigurationList;
|
|
379
|
+
buildConfigurations = (
|
|
380
|
+
A00000000000000000000020 /* Debug */,
|
|
381
|
+
A00000000000000000000021 /* Release */,
|
|
382
|
+
);
|
|
383
|
+
defaultConfigurationIsVisible = 0;
|
|
384
|
+
defaultConfigurationName = Release;
|
|
385
|
+
};
|
|
386
|
+
/* End XCConfigurationList section */
|
|
387
|
+
};
|
|
388
|
+
rootObject = A00000000000000000000001 /* Project object */;
|
|
389
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<Scheme
|
|
3
|
+
LastUpgradeVersion = "2600"
|
|
4
|
+
version = "1.7">
|
|
5
|
+
<BuildAction
|
|
6
|
+
parallelizeBuildables = "YES"
|
|
7
|
+
buildImplicitDependencies = "YES">
|
|
8
|
+
<BuildActionEntries>
|
|
9
|
+
<BuildActionEntry
|
|
10
|
+
buildForTesting = "YES"
|
|
11
|
+
buildForRunning = "YES"
|
|
12
|
+
buildForProfiling = "YES"
|
|
13
|
+
buildForArchiving = "YES"
|
|
14
|
+
buildForAnalyzing = "YES">
|
|
15
|
+
<BuildableReference
|
|
16
|
+
BuildableIdentifier = "primary"
|
|
17
|
+
BlueprintIdentifier = "A00000000000000000000011"
|
|
18
|
+
BuildableName = "ArgentRunner.app"
|
|
19
|
+
BlueprintName = "ArgentRunner"
|
|
20
|
+
ReferencedContainer = "container:ArgentRunner.xcodeproj">
|
|
21
|
+
</BuildableReference>
|
|
22
|
+
</BuildActionEntry>
|
|
23
|
+
</BuildActionEntries>
|
|
24
|
+
</BuildAction>
|
|
25
|
+
<TestAction
|
|
26
|
+
buildConfiguration = "Debug"
|
|
27
|
+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
28
|
+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
29
|
+
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
30
|
+
<Testables>
|
|
31
|
+
<TestableReference
|
|
32
|
+
skipped = "NO">
|
|
33
|
+
<BuildableReference
|
|
34
|
+
BuildableIdentifier = "primary"
|
|
35
|
+
BlueprintIdentifier = "A00000000000000000000018"
|
|
36
|
+
BuildableName = "ArgentRunnerUITests.xctest"
|
|
37
|
+
BlueprintName = "ArgentRunnerUITests"
|
|
38
|
+
ReferencedContainer = "container:ArgentRunner.xcodeproj">
|
|
39
|
+
</BuildableReference>
|
|
40
|
+
</TestableReference>
|
|
41
|
+
</Testables>
|
|
42
|
+
</TestAction>
|
|
43
|
+
<LaunchAction
|
|
44
|
+
buildConfiguration = "Debug"
|
|
45
|
+
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
46
|
+
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
47
|
+
launchStyle = "0"
|
|
48
|
+
useCustomWorkingDirectory = "NO"
|
|
49
|
+
ignoresPersistentStateOnLaunch = "NO"
|
|
50
|
+
debugDocumentVersioning = "YES"
|
|
51
|
+
debugServiceExtension = "internal"
|
|
52
|
+
allowLocationSimulation = "YES">
|
|
53
|
+
<BuildableProductRunnable
|
|
54
|
+
runnableDebuggingMode = "0">
|
|
55
|
+
<BuildableReference
|
|
56
|
+
BuildableIdentifier = "primary"
|
|
57
|
+
BlueprintIdentifier = "A00000000000000000000011"
|
|
58
|
+
BuildableName = "ArgentRunner.app"
|
|
59
|
+
BlueprintName = "ArgentRunner"
|
|
60
|
+
ReferencedContainer = "container:ArgentRunner.xcodeproj">
|
|
61
|
+
</BuildableReference>
|
|
62
|
+
</BuildableProductRunnable>
|
|
63
|
+
</LaunchAction>
|
|
64
|
+
<ProfileAction
|
|
65
|
+
buildConfiguration = "Release"
|
|
66
|
+
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
67
|
+
savedToolIdentifier = ""
|
|
68
|
+
useCustomWorkingDirectory = "NO"
|
|
69
|
+
debugDocumentVersioning = "YES">
|
|
70
|
+
<BuildableProductRunnable
|
|
71
|
+
runnableDebuggingMode = "0">
|
|
72
|
+
<BuildableReference
|
|
73
|
+
BuildableIdentifier = "primary"
|
|
74
|
+
BlueprintIdentifier = "A00000000000000000000011"
|
|
75
|
+
BuildableName = "ArgentRunner.app"
|
|
76
|
+
BlueprintName = "ArgentRunner"
|
|
77
|
+
ReferencedContainer = "container:ArgentRunner.xcodeproj">
|
|
78
|
+
</BuildableReference>
|
|
79
|
+
</BuildableProductRunnable>
|
|
80
|
+
</ProfileAction>
|
|
81
|
+
<AnalyzeAction
|
|
82
|
+
buildConfiguration = "Debug">
|
|
83
|
+
</AnalyzeAction>
|
|
84
|
+
<ArchiveAction
|
|
85
|
+
buildConfiguration = "Release"
|
|
86
|
+
revealArchiveInOrganizer = "YES">
|
|
87
|
+
</ArchiveAction>
|
|
88
|
+
</Scheme>
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#import <Foundation/Foundation.h>
|
|
2
|
+
|
|
3
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
4
|
+
|
|
5
|
+
/// Runs a block inside an Objective-C @try so the NSExceptions XCTest's
|
|
6
|
+
/// accessibility machinery throws (stale elements, AX server errors) surface
|
|
7
|
+
/// as a returned description instead of crashing the whole test process;
|
|
8
|
+
/// Swift cannot catch them on its own.
|
|
9
|
+
@interface ArgentExceptionGuard : NSObject
|
|
10
|
+
|
|
11
|
+
/// Returns nil when the block completed, otherwise "Name: reason".
|
|
12
|
+
+ (NSString *_Nullable)runCatching:(NS_NOESCAPE dispatch_block_t)block;
|
|
13
|
+
|
|
14
|
+
@end
|
|
15
|
+
|
|
16
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#import "ArgentExceptionGuard.h"
|
|
2
|
+
|
|
3
|
+
@implementation ArgentExceptionGuard
|
|
4
|
+
|
|
5
|
+
+ (NSString *_Nullable)runCatching:(NS_NOESCAPE dispatch_block_t)block {
|
|
6
|
+
@try {
|
|
7
|
+
block();
|
|
8
|
+
return nil;
|
|
9
|
+
} @catch (NSException *exception) {
|
|
10
|
+
NSString *name = exception.name ?: @"NSException";
|
|
11
|
+
NSString *reason = exception.reason ?: @"unhandled Objective-C exception";
|
|
12
|
+
return [NSString stringWithFormat:@"%@: %@", name, reason];
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
@end
|