Skip to content

Instantly share code, notes, and snippets.

@exce11ent
Created November 14, 2017 12:57
Show Gist options
  • Save exce11ent/976a74c8b328900d012ce9abd8fbe59f to your computer and use it in GitHub Desktop.
Save exce11ent/976a74c8b328900d012ce9abd8fbe59f to your computer and use it in GitHub Desktop.
Part of AppDelegate.swift
func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey: Any]) -> Bool {
if let dynamiclink = DynamicLinks.dynamicLinks()?.dynamicLink(fromCustomSchemeURL: url) {
handleLink(link: dynamiclink)
return true
}
return false
}
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
guard let dynamicLinks = DynamicLinks.dynamicLinks(),
let incomingURL = userActivity.webpageURL else {
return false
}
AppRouter.presentSplashScreen()
let handled = dynamicLinks.handleUniversalLink(incomingURL) { [weak self] (dynamiclink, error) in
guard let strongSelf = self else { return }
if let dynamiclink = dynamiclink, let _ = dynamiclink.url {
strongSelf.handleLink(link: dynamiclink)
} else if let error = error {
print("DynamicLink error: \(error)")
Crashlytics.sharedInstance().recordError(error)
self?.window?.rootViewController?.alert(error: error)
}
}
return handled
}
private func handleLink(link: DynamicLink) {
let parser = InviteLinkParser(link: link)
let linkType = parser.parse()
// If dynamic link has unknown format - do not handle it
if case .unknown = linkType {
return
}
// If user was in a demo mode - try to sign out
if let currentUserId = Auth.auth().currentUser?.uid {
if currentUserId == Configuration.demoDietitian || currentUserId == Configuration.demoPatient {
do {
try Auth.auth().signOut()
AppState.shared.clear()
} catch {
Crashlytics.sharedInstance().recordError(MyError.signOutError)
}
} else { // Do not start onboarding, if invite link was opened by a user, that is already authorized in the app.
// just open default screen
startupResolver?.moveUser(with: currentUserId)
return
}
}
// Handle link depending on recognized pattern
switch linkType {
case .dietitian(let model):
AppRouter.startOnboarding(OnboardingBuilder { builder in
builder.role = model.role
builder.phone = model.phone
builder.dietitianId = model.dietitian
builder.firstName = model.firstName
builder.lastName = model.lastName
})
case .patient(let model):
AppRouter.startOnboarding(OnboardingBuilder { builder in
builder.role = model.role
builder.phone = nil
builder.dietitianId = model.dietitian
builder.firstName = nil
builder.lastName = nil
})
case .demo(let demoCode):
let manager = DemoManager()
manager.setupDemoWith(code: demoCode, completion: { (mode) in
switch mode {
case .fixedDietitian:
AppRouter.goToPatients()
AppState.shared.connectionMonitor = ConnectionStateHandler(sender: Configuration.demoDietitian)
AppAnalytics.setUserRole(role: .demo)
case .fixedPatient(let data):
guard let data = data else { break }
AppState.shared.connectionMonitor = ConnectionStateHandler(sender: Configuration.demoPatient)
AppRouter.goToConversation(ConversationBuilder { builder in
builder.role = .patient
builder.senderId = data.patientId
builder.receiverId = data.dietitianId
builder.conversationId = data.conversationId
})
AppAnalytics.setUserRole(role: .demo)
case .unknown:
break
default:
break
}
})
break
case .unknown:
break
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment