Skip to content

Commit 0449f91

Browse files
authored
[MBL-2829] Stop trying to open unrecognized ksr urls in safari (#2635)
* Stop trying to open unrecognized ksr urls in safari * Add firebase crashlytics non-fatal logging
1 parent 4debedf commit 0449f91

File tree

2 files changed

+73
-4
lines changed

2 files changed

+73
-4
lines changed

Kickstarter-iOS/AppDelegateViewModel.swift

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import FirebaseCrashlytics
12
import KsApi
23
import Library
34
import Prelude
@@ -550,13 +551,11 @@ public final class AppDelegateViewModel: AppDelegateViewModelType, AppDelegateVi
550551
.filter { $0 == .tab(.me) }
551552
.ignoreValues()
552553

553-
let resolvedRedirectUrl = Signal.merge(
554+
self.goToMobileSafari = Signal.merge(
554555
deepLinkUrl,
555556
urlFromBraze
556557
)
557-
.filter { Navigation.deepLinkMatch($0) == nil }
558-
559-
self.goToMobileSafari = resolvedRedirectUrl
558+
.filter(shouldOpenUrlInBrowser)
560559

561560
let projectRootLink = Signal.merge(projectLink, projectPreviewLink)
562561
.filter { _, subpage, _, _ in subpage == .root }
@@ -1026,6 +1025,28 @@ private func deviceToken(fromData data: Data) -> String {
10261025
.joined()
10271026
}
10281027

1028+
private func shouldOpenUrlInBrowser(_ url: URL) -> Bool {
1029+
// If url has a deeplink match, never attempt to open the url in the browser.
1030+
if Navigation.deepLinkMatch(url) != nil {
1031+
return false
1032+
}
1033+
// Never attempt to open `ksr` urls in the browser; they'll redirect straight back to our app.
1034+
if let scheme = url.scheme, scheme == "ksr" {
1035+
print(
1036+
"Error: Unable to open 'ksr' deeplink. Please doublecheck that the url "
1037+
+ "is included in the list of deeplinks and that you're not trying to "
1038+
+ "use a staging url in prod (or vice versa)."
1039+
)
1040+
let error = NSError(domain: "Kickstarter.Deeplink", code: 0, userInfo: [
1041+
NSLocalizedDescriptionKey: "Unable to open unsupported ksr deeplink."
1042+
])
1043+
Crashlytics.crashlytics().record(error: error)
1044+
return false
1045+
}
1046+
// Otherwise, open url in browser.
1047+
return true
1048+
}
1049+
10291050
private func navigation(fromPushEnvelope envelope: PushEnvelope) -> Navigation? {
10301051
if let activity = envelope.activity {
10311052
switch activity.category {

Kickstarter-iOS/AppDelegateViewModelTests.swift

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2571,6 +2571,54 @@ final class AppDelegateViewModelTests: TestCase {
25712571
self.presentViewController.assertValues([])
25722572
}
25732573

2574+
func testGoToMobileSafari_unrecognizedDeeplink() {
2575+
self.vm.inputs.applicationDidFinishLaunching(
2576+
application: UIApplication.shared,
2577+
launchOptions: [:]
2578+
)
2579+
2580+
let url = URL(string: "https://fake-url.com")!
2581+
_ = self.vm.inputs.applicationOpenUrl(application: nil, url: url, options: [:])
2582+
2583+
self.goToMobileSafari.assertLastValue(url)
2584+
}
2585+
2586+
func testGoToMobileSafari_deeplinkFound() {
2587+
self.vm.inputs.applicationDidFinishLaunching(
2588+
application: UIApplication.shared,
2589+
launchOptions: [:]
2590+
)
2591+
2592+
let url = URL(string: "https://kickstarter.com/activity")!
2593+
_ = self.vm.inputs.applicationOpenUrl(application: nil, url: url, options: [:])
2594+
2595+
self.goToMobileSafari.assertDidNotEmitValue()
2596+
}
2597+
2598+
func testGoToMobileSafari_ksrUnrecognizedDeeplink() throws {
2599+
self.vm.inputs.applicationDidFinishLaunching(
2600+
application: UIApplication.shared,
2601+
launchOptions: [:]
2602+
)
2603+
2604+
let url = URL(string: "ksr://fake-url.com")!
2605+
_ = self.vm.inputs.applicationOpenUrl(application: nil, url: url, options: [:])
2606+
2607+
self.goToMobileSafari.assertDidNotEmitValue()
2608+
}
2609+
2610+
func testGoToMobileSafari_ksrDeeplinkFound() {
2611+
self.vm.inputs.applicationDidFinishLaunching(
2612+
application: UIApplication.shared,
2613+
launchOptions: [:]
2614+
)
2615+
2616+
let url = URL(string: "https://kickstarter.com/activity")!
2617+
_ = self.vm.inputs.applicationOpenUrl(application: nil, url: url, options: [:])
2618+
2619+
self.goToMobileSafari.assertDidNotEmitValue()
2620+
}
2621+
25742622
func testRemoteConfigClientConfiguredNotification_Success() {
25752623
let mockService = MockService(serverConfig: ServerConfig.staging)
25762624

0 commit comments

Comments
 (0)