Skip to content

Commit

Permalink
fix: Scene deeplink navigation (#1436)
Browse files Browse the repository at this point in the history
  • Loading branch information
adrien-coye authored Feb 18, 2025
2 parents 040f015 + 20f001c commit d5cc76a
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 19 deletions.
50 changes: 31 additions & 19 deletions kDrive/SceneDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate, AccountManagerDel
@LazyInjectService var backgroundTasksService: BackgroundTasksServiceable
@LazyInjectService var appNavigable: AppNavigable
@LazyInjectService var appRestorationService: AppRestorationServiceable
@LazyInjectService var deeplinkParser: DeeplinkParsable

var shortcutItemToProcess: UIApplicationShortcutItem?

Expand Down Expand Up @@ -68,20 +69,26 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate, AccountManagerDel
return
}

guard userActivity.activityType == SceneActivityIdentifier.mainSceneActivityType else {
Log.sceneDelegate("unsupported user activity type:\(userActivity.activityType)")
return
}
Task {
guard await !continueWebActivityIfPossible(scene, userActivity: userActivity) else {
return
}

scene.userActivity = userActivity
guard userActivity.activityType == SceneActivityIdentifier.mainSceneActivityType else {
Log.sceneDelegate("unsupported user activity type:\(userActivity.activityType)")
return
}

guard let userInfo = userActivity.userInfo else {
Log.sceneDelegate("activity has no metadata to process")
return
}
scene.userActivity = userActivity

guard let userInfo = userActivity.userInfo else {
Log.sceneDelegate("activity has no metadata to process")
return
}

Log.sceneDelegate("restore from \(userActivity.activityType)")
Log.sceneDelegate("selectedIndex:\(userInfo[SceneRestorationKeys.selectedIndex.rawValue])")
Log.sceneDelegate("restore from \(userActivity.activityType)")
Log.sceneDelegate("selectedIndex:\(userInfo[SceneRestorationKeys.selectedIndex.rawValue])")
}
}

private func prepareWindowScene(_ windowScene: UIWindowScene) {
Expand Down Expand Up @@ -217,11 +224,22 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate, AccountManagerDel
}

Task {
let success = await DeeplinkParser().parse(url: url)
let success = await deeplinkParser.parse(url: url)
Log.sceneDelegate("scene open url: \(url) success: \(success)")
}
}

@discardableResult
private func continueWebActivityIfPossible(_ scene: UIScene, userActivity: NSUserActivity) async -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let incomingURL = userActivity.webpageURL else {
Log.sceneDelegate("the scene continue userActivity - is not NSUserActivityTypeBrowsingWeb", level: .error)
return false
}

return await deeplinkParser.parse(url: incomingURL)
}

// MARK: - Handoff support

func scene(_ scene: UIScene, willContinueUserActivityWithType userActivityType: String) {
Expand All @@ -231,13 +249,7 @@ final class SceneDelegate: UIResponder, UIWindowSceneDelegate, AccountManagerDel
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
Log.sceneDelegate("scene continue userActivity")
Task {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let incomingURL = userActivity.webpageURL else {
Log.sceneDelegate("scene continue userActivity - invalid activity", level: .error)
return
}

await UniversalLinksHelper.handleURL(incomingURL)
await continueWebActivityIfPossible(scene, userActivity: userActivity)
}
}

Expand Down
3 changes: 3 additions & 0 deletions kDriveCore/DI/FactoryService.swift
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ public enum FactoryService {
},
Factory(type: DeeplinkServiceable.self) { _, _ in
DeeplinkService()
},
Factory(type: DeeplinkParsable.self) { _, _ in
DeeplinkParser()
}
]
return services
Expand Down
4 changes: 4 additions & 0 deletions kDriveCore/Utils/DeeplinkParser.swift
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ public struct DeeplinkParser: DeeplinkParsable {
}

public func parse(url: URL) async -> Bool {
guard await !UniversalLinksHelper.handleURL(url) else {
return true
}

guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true),
let params = components.queryItems else {
Log.sceneDelegate("Failed to open URL: Invalid URL", level: .error)
Expand Down

0 comments on commit d5cc76a

Please sign in to comment.