You might see that the Dropbox Community team have been busy working on some major updates to the Community itself! So, here is some info on what’s changed, what’s staying the same and what you can expect from the Dropbox Community overall.
Forum Discussion
CarolinaK
8 years agoHelpful | Level 6
SwiftyDropbox "unlinkClients" not present in package, can't clear session
Hi,
I've recently noticed that I can't get rid of a session with my ios app. When I call `print(DropboxClientsManager.authorizedClient.debugDescription)` even when I call DropboxClientsManager...
- 8 years ago
This is what I used to delete all keychains from the app:
func deleteAllKeysForSecClass(_ secClass: CFTypeRef) { let dict: [NSString : Any] = [kSecClass : secClass] let result = SecItemDelete(dict as CFDictionary) assert(result == noErr || result == errSecItemNotFound, "Error deleting keychain data (\(result))") }
deleteAllKeysForSecClass(kSecClassGenericPassword) deleteAllKeysForSecClass(kSecClassInternetPassword) deleteAllKeysForSecClass(kSecClassCertificate) deleteAllKeysForSecClass(kSecClassKey) deleteAllKeysForSecClass(kSecClassIdentity)
CarolinaK
Helpful | Level 6
I should note that the session still persists even when I uninstall and re-install the app.
Also the docs say you should call DropboxClient.unlinkClients but I can't find that on the package code, only
DropboxClientsManager.unlinkClients()
works
Greg-DB
8 years agoDropbox Staff
Thanks for the report. Calling DropboxClientsManager.unlinkClients() should remove the stored access tokens in the keychain and reset the stored authorizedClient, so what you're describing is unexpected. (Also, thanks for the note about the documentation. I'll ask the team to update that to correctly reflect DropboxClientsManager.unlinkClients.)
Are you seeing this issue on multiple devices? Do you get any error/output in the log when calling DropboxClientsManager.unlinkClients()?
Are you seeing this issue on multiple devices? Do you get any error/output in the log when calling DropboxClientsManager.unlinkClients()?
- CarolinaK8 years agoHelpful | Level 6
Hi, thanks for the fast reply. I didn't see any errors when I used an iPad (model A1403) , but I tried an iPod (A1421) the login flow works just fine, it goes straight to the login form. Other users have reported this error on a similar iPad and iPad pro. We're all on iOS version 9.3.5.
- Greg-DB8 years agoDropbox Staff
Thanks, since this is only occurring on some devices, there may be something device-specific, or specific to certain instances or versions of your app.
Is there anything unusual about how your app is set up with respect to the Keychain? It sounds like perhaps the SDK isn't able to clear the access tokens from the keychain as intended when calling unlinkClients. (That's what I was looking for when asking for error messages.)
If you can share the relevant code snippets, or ideally a sample project that demonstrates the issue, that would be helpful.
Alternatively, can you try running this earlier than applicationWillTerminate? From the documentation there:
"Your implementation of this method has approximately five seconds to perform any tasks and return. If the method does not return before time expires, the system may kill the process altogether."
If that takes a long time to run for some reason, it may not complete in time.
- CarolinaK8 years agoHelpful | Level 6
Hi,
these are code snippets in AppDelegate.swift containing Dropbox login/logout functionality
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { UIApplication.shared.isStatusBarHidden = true // Setup Drobox app Key DropboxClientsManager.setupWithAppKey(dropboxKey) return true } func applicationDidFinishLaunching(_ application: UIApplication) { if DropboxClientsManager.authorizedClient != nil { storyBoard = UIStoryboard(name: Constants.controllerName.mainController, bundle: nil) tabBarViewController = storyBoard.instantiateViewController(withIdentifier: Constants.controllerName.tabBar) as! UITabBarController tabBarViewController.delegate = self window?.rootViewController = tabBarViewController switchController(tabBarViewController) } else { switchController(loginViewController) } } func applicationWillTerminate(_ application: UIApplication) { DropboxClientsManager.unlinkClients() self.sessionCleanup(entity: "EntityName") } func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool { // Manage Dropbox redirect to Login if let authResult = DropboxClientsManager.handleRedirectURL(url) { switch authResult { case .success: print("Info: Success! User is logged into Dropbox.") UserDefaults.standard.set(true, forKey: "HasLaunchedOnce") UserDefaults.standard.synchronize() case .cancel: print("Cance: Authorization flow was manually canceled by user!") case .error(_, let description): print("Error: \(description)") } } return true }
About Dropbox API Support & Feedback
Find help with the Dropbox API from other developers.
5,911 PostsLatest Activity: 9 hours agoIf you need more help you can view your support options (expected response time for an email or ticket is 24 hours), or contact us on X or Facebook.
For more info on available support options for your Dropbox plan, see this article.
If you found the answer to your question in this Community thread, please 'like' the post to say thanks and to let us know it was useful!