diff --git a/App/client-ios/Resources/client-ios.entitlements b/App/client-ios/Resources/client-ios.entitlements index 88e463326dd0fda0a358f095f60612c555c77d3b..c5460225092202a6000d72287bc8888a6f72e8d4 100644 --- a/App/client-ios/Resources/client-ios.entitlements +++ b/App/client-ios/Resources/client-ios.entitlements @@ -4,6 +4,10 @@ <dict> <key>aps-environment</key> <string>development</string> + <key>com.apple.developer.associated-domains</key> + <array> + <string>applinks:xx.network</string> + </array> <key>com.apple.developer.icloud-container-identifiers</key> <array> <string>iCloud.xxm-cloud</string> diff --git a/Sources/App/AppDelegate.swift b/Sources/App/AppDelegate.swift index 9b4a816dad120c5e01dbd428933a4161d71a1feb..40780f6fa7e0066ef993d1c6a519d5417a319357 100644 --- a/Sources/App/AppDelegate.swift +++ b/Sources/App/AppDelegate.swift @@ -142,21 +142,32 @@ public class AppDelegate: UIResponder, UIApplicationDelegate { open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:] ) -> Bool { - if let username = getUsernameFromInvitationDeepLink(url) { - let router = try! DependencyInjection.Container.shared.resolve() as PushRouter - router.navigateTo(.search(username: username), {}) - return true - } else { - return dropboxService.handleOpenUrl(url) + dropboxService.handleOpenUrl(url) + } + + public func application( + _ application: UIApplication, + continue userActivity: NSUserActivity, + restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void + ) -> Bool { + guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, + let incomingURL = userActivity.webpageURL, + let username = getUsernameFromInvitationDeepLink(incomingURL) else { + return false } + + let router = try! DependencyInjection.Container.shared.resolve() as PushRouter + router.navigateTo(.search(username: username), {}) + return true } } func getUsernameFromInvitationDeepLink(_ url: URL) -> String? { if let components = URLComponents(url: url, resolvingAgainstBaseURL: false), - components.scheme == "xxnetwork", - components.host == "messenger", - let queryItem = components.queryItems?.first(where: { $0.name == "invitation" }), + components.scheme == "https", + components.host == "xx.network", + components.path == "/messenger/invitation", + let queryItem = components.queryItems?.first(where: { $0.name == "username" }), let username = queryItem.value { return username } diff --git a/Sources/MenuFeature/ViewModels/MenuViewModel.swift b/Sources/MenuFeature/ViewModels/MenuViewModel.swift index 98bc5d74b66c3e85e43ea5f9b7a21129db7cd55d..20a9ebd2565fefcb3b49756e8a60023902c6d879 100644 --- a/Sources/MenuFeature/ViewModels/MenuViewModel.swift +++ b/Sources/MenuFeature/ViewModels/MenuViewModel.swift @@ -42,6 +42,6 @@ final class MenuViewModel { } var referralDeeplink: String { - "xxnetwork://messenger?invitation=\(username)" + "https://xx.network/messenger/invitation?username=\(username)" } } diff --git a/Tests/AppTests/General/InvitationTests.swift b/Tests/AppTests/General/InvitationTests.swift index 146c885afab3c85686cc5f216c8e85ff851911b5..d29258e324a1d6da30fb6dc1f695dfe347115be7 100644 --- a/Tests/AppTests/General/InvitationTests.swift +++ b/Tests/AppTests/General/InvitationTests.swift @@ -3,19 +3,33 @@ import XCTest @testable import App final class AppDelegateTests: XCTestCase { - func test_invitationDeeplink() { - XCTAssertNil( - getUsernameFromInvitationDeepLink(URL(string: "http://messenger?invitation=john_doe")!) - ) - - XCTAssertNotEqual( - getUsernameFromInvitationDeepLink(URL(string: "xxnetwork://messenger?invitation=the_rock")!), - "john_doe" - ) - - XCTAssertEqual( - getUsernameFromInvitationDeepLink(URL(string: "xxnetwork://messenger?invitation=john_doe")!), - "john_doe" - ) + func test_invitationUniversalLink() { + XCTAssertNil(getUsernameFromInvitationDeepLink( + URL(string: "https://xx.network/messenger/invite?username=some")! + )) + + XCTAssertNil(getUsernameFromInvitationDeepLink( + URL(string: "http://xx.network/messenger/invitation?username=some")! + )) + + XCTAssertNil(getUsernameFromInvitationDeepLink( + URL(string: "https://network.xx/messenger/invitation?username=some")! + )) + + XCTAssertEqual(getUsernameFromInvitationDeepLink( + URL(string: "https://xx.network/messenger/invitation?username=brad")! + ), "brad") + + XCTAssertNil(getUsernameFromInvitationDeepLink( + URL(string: "https://xx.network/messenger/invitation?password=value")! + )) + + XCTAssertNil(getUsernameFromInvitationDeepLink( + URL(string: "https://xx.network/xxmessenger/invitation?username=some")! + )) + + XCTAssertNotEqual(getUsernameFromInvitationDeepLink( + URL(string: "https://xx.network/messenger/invitation?username=anderson")! + ), "silva") } }