Skip to content

Commit 3aff029

Browse files
[url_launcher] migrating objc plugin to swift (flutter#4753)
This PR converts the iOS portion of the url_launcher plugin from objc to swift. *List which issues are fixed by this PR. You must list at least one issue.* flutter#119102
1 parent 45ed8c9 commit 3aff029

21 files changed

+751
-608
lines changed

packages/url_launcher/url_launcher_ios/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 6.2.1
2+
3+
* Migrates plugin from Objective-C to Swift.
4+
15
## 6.2.0
26

37
* Implements `supportsMode` and `supportsCloseForMode`.

packages/url_launcher/url_launcher_ios/example/ios/Runner.xcodeproj/project.pbxproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@
269269
97C146E61CF9000F007C117D /* Project object */ = {
270270
isa = PBXProject;
271271
attributes = {
272-
LastUpgradeCheck = 1300;
272+
LastUpgradeCheck = 1430;
273273
ORGANIZATIONNAME = "The Flutter Authors";
274274
TargetAttributes = {
275275
97C146ED1CF9000F007C117D = {
@@ -631,6 +631,7 @@
631631
baseConfigurationReference = 666BCD7C181C34F8BE58929B /* Pods-RunnerTests.debug.xcconfig */;
632632
buildSettings = {
633633
BUNDLE_LOADER = "$(TEST_HOST)";
634+
CLANG_ENABLE_MODULES = YES;
634635
CODE_SIGN_STYLE = Automatic;
635636
INFOPLIST_FILE = RunnerTests/Info.plist;
636637
LD_RUNPATH_SEARCH_PATHS = (
@@ -651,6 +652,7 @@
651652
baseConfigurationReference = D25C434271ACF6555E002440 /* Pods-RunnerTests.release.xcconfig */;
652653
buildSettings = {
653654
BUNDLE_LOADER = "$(TEST_HOST)";
655+
CLANG_ENABLE_MODULES = YES;
654656
CODE_SIGN_STYLE = Automatic;
655657
INFOPLIST_FILE = RunnerTests/Info.plist;
656658
LD_RUNPATH_SEARCH_PATHS = (

packages/url_launcher/url_launcher_ios/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<Scheme
3-
LastUpgradeVersion = "1300"
3+
LastUpgradeVersion = "1430"
44
version = "1.3">
55
<BuildAction
66
parallelizeBuildables = "YES"

packages/url_launcher/url_launcher_ios/example/ios/RunnerTests/URLLauncherTests.swift

Lines changed: 64 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -7,59 +7,52 @@ import XCTest
77

88
@testable import url_launcher_ios
99

10+
// Tests whether NSURL parsing is strict. When linking against the iOS 17 SDK or later,
11+
// NSURL uses a more lenient parser which will not return nil.
12+
private func urlParsingIsStrict() -> Bool {
13+
return URL(string: "b a d U R L") == nil
14+
}
15+
1016
final class URLLauncherTests: XCTestCase {
1117

12-
private func createPlugin() -> FLTURLLauncherPlugin {
18+
private func createPlugin() -> URLLauncherPlugin {
1319
let launcher = FakeLauncher()
14-
return FLTURLLauncherPlugin(launcher: launcher)
20+
return URLLauncherPlugin(launcher: launcher)
1521
}
1622

17-
private func createPlugin(launcher: FakeLauncher) -> FLTURLLauncherPlugin {
18-
FLTURLLauncherPlugin(launcher: launcher)
23+
private func createPlugin(launcher: FakeLauncher) -> URLLauncherPlugin {
24+
return URLLauncherPlugin(launcher: launcher)
1925
}
2026

2127
func testCanLaunchSuccess() {
22-
var error: FlutterError?
23-
let result = createPlugin().canLaunchURL("good://url", error: &error)
24-
25-
XCTAssertNotNil(result)
26-
XCTAssertTrue(result?.boolValue ?? false)
27-
XCTAssertNil(error)
28+
let result = createPlugin().canLaunchUrl(url: "good://url")
29+
XCTAssertEqual(result, .success)
2830
}
2931

3032
func testCanLaunchFailure() {
31-
var error: FlutterError?
32-
let result = createPlugin().canLaunchURL("bad://url", error: &error)
33-
34-
XCTAssertNotNil(result)
35-
XCTAssertFalse(result?.boolValue ?? true)
33+
let result = createPlugin().canLaunchUrl(url: "bad://url")
34+
XCTAssertEqual(result, .failure)
3635
}
3736

3837
func testCanLaunchFailureWithInvalidURL() {
39-
var error: FlutterError?
40-
let result = createPlugin().canLaunchURL("urls can't have spaces", error: &error)
41-
42-
if (error == nil) {
43-
// When linking against the iOS 17 SDK or later, NSURL uses a lenient parser, and won't
44-
// fail to parse URLs, so the test must allow for either outcome.
45-
XCTAssertNotNil(result)
46-
XCTAssertFalse(result?.boolValue ?? true)
47-
XCTAssertNil(error)
38+
let result = createPlugin().canLaunchUrl(url: "urls can't have spaces")
39+
40+
if urlParsingIsStrict() {
41+
XCTAssertEqual(result, .invalidUrl)
4842
} else {
49-
XCTAssertNil(result)
50-
XCTAssertNotNil(error)
51-
XCTAssertEqual(error?.code, "argument_error")
52-
XCTAssertEqual(error?.message, "Unable to parse URL")
53-
XCTAssertEqual(error?.details as? String, "Provided URL: urls can't have spaces")
43+
XCTAssertEqual(result, .failure)
5444
}
5545
}
5646

5747
func testLaunchSuccess() {
5848
let expectation = XCTestExpectation(description: "completion called")
59-
createPlugin().launchURL("good://url", universalLinksOnly: false) { result, error in
60-
XCTAssertNotNil(result)
61-
XCTAssertTrue(result?.boolValue ?? false)
62-
XCTAssertNil(error)
49+
createPlugin().launchUrl(url: "good://url", universalLinksOnly: false) { result in
50+
switch result {
51+
case .success(let details):
52+
XCTAssertEqual(details, .success)
53+
case .failure(let error):
54+
XCTFail("Unexpected error: \(error)")
55+
}
6356
expectation.fulfill()
6457
}
6558

@@ -68,11 +61,13 @@ final class URLLauncherTests: XCTestCase {
6861

6962
func testLaunchFailure() {
7063
let expectation = XCTestExpectation(description: "completion called")
71-
72-
createPlugin().launchURL("bad://url", universalLinksOnly: false) { result, error in
73-
XCTAssertNotNil(result)
74-
XCTAssertFalse(result?.boolValue ?? true)
75-
XCTAssertNil(error)
64+
createPlugin().launchUrl(url: "bad://url", universalLinksOnly: false) { result in
65+
switch result {
66+
case .success(let details):
67+
XCTAssertEqual(details, .failure)
68+
case .failure(let error):
69+
XCTFail("Unexpected error: \(error)")
70+
}
7671
expectation.fulfill()
7772
}
7873

@@ -81,22 +76,17 @@ final class URLLauncherTests: XCTestCase {
8176

8277
func testLaunchFailureWithInvalidURL() {
8378
let expectation = XCTestExpectation(description: "completion called")
84-
85-
createPlugin().launchURL("urls can't have spaces", universalLinksOnly: false) { result, error in
86-
if (error == nil) {
87-
// When linking against the iOS 17 SDK or later, NSURL uses a lenient parser, and won't
88-
// fail to parse URLs, so the test must allow for either outcome.
89-
XCTAssertNotNil(result)
90-
XCTAssertFalse(result?.boolValue ?? true)
91-
XCTAssertNil(error)
92-
} else {
93-
XCTAssertNil(result)
94-
XCTAssertNotNil(error)
95-
XCTAssertEqual(error?.code, "argument_error")
96-
XCTAssertEqual(error?.message, "Unable to parse URL")
97-
XCTAssertEqual(error?.details as? String, "Provided URL: urls can't have spaces")
79+
createPlugin().launchUrl(url: "urls can't have spaces", universalLinksOnly: false) { result in
80+
switch result {
81+
case .success(let details):
82+
if urlParsingIsStrict() {
83+
XCTAssertEqual(details, .invalidUrl)
84+
} else {
85+
XCTAssertEqual(details, .failure)
86+
}
87+
case .failure(let error):
88+
XCTFail("Unexpected error: \(error)")
9889
}
99-
10090
expectation.fulfill()
10191
}
10292

@@ -108,13 +98,17 @@ final class URLLauncherTests: XCTestCase {
10898
let plugin = createPlugin(launcher: launcher)
10999

110100
let expectation = XCTestExpectation(description: "completion called")
111-
plugin.launchURL("good://url", universalLinksOnly: false) { result, error in
112-
XCTAssertNil(error)
101+
plugin.launchUrl(url: "good://url", universalLinksOnly: false) { result in
102+
switch result {
103+
case .success(let details):
104+
XCTAssertEqual(details, .success)
105+
case .failure(let error):
106+
XCTFail("Unexpected error: \(error)")
107+
}
113108
expectation.fulfill()
114109
}
115110

116111
wait(for: [expectation], timeout: 1)
117-
118112
XCTAssertEqual(launcher.passedOptions?[.universalLinksOnly] as? Bool, false)
119113
}
120114

@@ -123,31 +117,35 @@ final class URLLauncherTests: XCTestCase {
123117
let plugin = createPlugin(launcher: launcher)
124118

125119
let expectation = XCTestExpectation(description: "completion called")
126-
127-
plugin.launchURL("good://url", universalLinksOnly: true) { result, error in
128-
XCTAssertNil(error)
120+
plugin.launchUrl(url: "good://url", universalLinksOnly: true) { result in
121+
switch result {
122+
case .success(let details):
123+
XCTAssertEqual(details, .success)
124+
case .failure(let error):
125+
XCTFail("Unexpected error: \(error)")
126+
}
129127
expectation.fulfill()
130128
}
131129

132130
wait(for: [expectation], timeout: 1)
133-
134131
XCTAssertEqual(launcher.passedOptions?[.universalLinksOnly] as? Bool, true)
135132
}
136133

137134
}
138135

139-
final private class FakeLauncher: NSObject, FULLauncher {
136+
final private class FakeLauncher: NSObject, Launcher {
140137
var passedOptions: [UIApplication.OpenExternalURLOptionsKey: Any]?
141138

142-
func canOpen(_ url: URL) -> Bool {
143-
return url.scheme == "good"
139+
func canOpenURL(_ url: URL) -> Bool {
140+
url.scheme == "good"
144141
}
145142

146143
func open(
147-
_ url: URL, options: [UIApplication.OpenExternalURLOptionsKey: Any] = [:],
148-
completionHandler: ((Bool) -> Void)? = nil
144+
_ url: URL,
145+
options: [UIApplication.OpenExternalURLOptionsKey: Any],
146+
completionHandler completion: ((Bool) -> Void)?
149147
) {
150148
self.passedOptions = options
151-
completionHandler?(url.scheme == "good")
149+
completion?(url.scheme == "good")
152150
}
153151
}

packages/url_launcher/url_launcher_ios/ios/Classes/FLTURLLauncherPlugin.h

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)