cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Announcements
Want to learn some quick and useful tips to make your day easier? Check out how Calvin uses Replay to get feedback from other teams at Dropbox here.

Dropbox API Support & Feedback

Find help with the Dropbox API from other developers.

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

iOS - Problems connecting from own app to Dropbox when Dropbox App is installed

iOS - Problems connecting from own app to Dropbox when Dropbox App is installed

gcarl
Explorer | Level 4

Dear community,

 

since a few days I have the following strange situation.

 

I have developed an app for iOS which can store data on the Dropbox. The connection is set up as described in the manuals with the right settings in info.plist and the SceneDelegate (see below).

 

Everything works fine as long as the Dropbox app is not installed on the device. As soon as the Dropbox app is on the device my app doesn't get a  connection to the dropbox to exchange data. When launching my app it calls Dropbox to ask if I allow the access of my app. As soon as I confirm this, the return to my app doesn't work properly and the connection breaks. It seems that the  DropboxClientsManager.authorizedClient is not properly set.

The error is reproducible - removing Dropbox app: all works, installing Dropbox app: problem is there.

 

Does anyone have an idea, what I can do to fix it? I would assume that I have to change some settings?

My current settings are:

info.plist:

<key>LSApplicationQueriesSchemes</key>

<array>

<string>dbapi-8-emm</string>

<string>dbapi-2</string>

</array>

<key>CFBundleURLTypes</key>

<array>

<dict>

<key>CFBundleURLName</key>

<string></string>

<key>CFBundleURLSchemes</key>

<array>

<string>db-**************</string>

</array>

</dict>

</array>

 

and in the sceneDelegate:

// MARK: - Dropbox

    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {

        if let url = URLContexts.first?.url {

            let oauthCompletion: DropboxOAuthCompletion = {

              if let authResult = $0 {

                  switch authResult {

                  case .success:

                      print("Success! User is logged into DropboxClientsManager.")

                  case .cancel:

                      print("Authorization flow was manually canceled by user!")

                  case .error(_, let description):

                      print("Error: \(String(describing: description))")

                  }

              }

            }

            DropboxClientsManager.handleRedirectURL(url, completion: oauthCompletion)

        }

    }

 

 

Thanks for your support

Regards gcarl

10 Replies 10

Greg-DB
Dropbox Staff

Thanks for the report! Can you also share:

muthulingam
Explorer | Level 3

Hi Sir,

i am facing the similar issue ..... 

 

1) if "dropbox" app was already installed, then as per the documents, "This launches the official Dropbox iOS app (if installed), authenticates via the official app, then redirects back into the SDK" ... but it does not happens

 

2) if "dropbox" app was not installed, then there is no problem.(it shows the Authentication screen)

 

->> i followed exact steps which you guys are described in the tutorials ...  (thats why it is working for "non Dropbox app installed" iOS devices.

 

here is the code snippets related to authentication workflow

 

in AppDelegate.m  (in objective c)

 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{     

      [PhotoPickerEngine.sharedEngine setupSocialNetworks];

}

- (BOOL)application😞UIApplication *)app openURL😞NSURL *)url options😞NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options

{

NSString *urlString = [[[url absoluteString] componentsSeparatedByString:@":"] objectAtIndex:0];

if ([urlString isEqualToString:@"db-xxxxxxxxxx”])

{

[PhotoPickerEngine.sharedEngine handleRedirectURLWithUrl:url]; //dropbox to handle

 

}

}

 

 

//swift code 

@objc public func setupSocialNetworks()

{        

       

DropboxClientsManager.setupWithAppKey(“APP_KEY”)

               

}

 

@objc public func handleRedirectURL( url: URL)

{

        

        DropboxClientsManager.handleRedirectURL(url, completion: { (authResult) in

            switch authResult {

            case .success(let token):

                print("Success! User is logged into Dropbox with token: \(token)")

                EventHub.post(DropboxLoginEvent())

                UserDefaults.standard.set(token.accessToken, forKey: Constants.keyAccessTokenDropbox)

            case .cancel:

                print("User canceld OAuth flow.")

            case .error(let error, let description):

                print("Error \(error): \(String(describing: description))")

            case .none:

                break

            }

        })

    }

 

 

  the version number of the Dropbox SDK    : 6.0.3

  the version number of the Dropbox iOS app : 258.2.2

  the version number of iOS : 15.0.1

 

can you please help me how to fix this issue?

 

Thanks ,

muthulingam

 

 

Greg-DB
Dropbox Staff

[Cross-linking for reference: https://github.com/dropbox/SwiftyDropbox/issues/345 ]

 

@muthulingam Thanks for the report. I just tried reproducing this with the same version of the Dropbox SwiftyDropbox SDK and Dropbox app, but it worked successfully for me. My test device is on iOS 15.0.2 though, so it may be worth updating your iOS installation to see if that helps.

 

Can you elaborate on what you mean when you say "but it does not happens"? What output/error do you get?

 

By the way, the latest version of the Dropbox SwiftyDropbox 8.2.0. I recommend updating to that, and updating your code to the latest version of the authorization flow as documented.

gcarl
Explorer | Level 4

I'm using the following authorization flow, my App is set up in Dropbox with a permanent token:

 

DropboxClientsManager.authorizeFromController(UIApplication.shared, controller: self, openURL: {(url: URL) -> Void in UIApplication.shared.open(url, options: [:], completionHandler: nil)})

 

I tried it with your alternative authorization flow as published too, but the result is the same.

 

The newest SDK version, I can install via cocoaPod is 7.0.1. Astonishingly I can either install version 8.2.0 via CocoaPods ( pod 'SwiftyDropbox', '>=8.0.0' creates an error, only 

pod 'SwiftyDropbox', '>=7.0.0' works and leads to 7.0.1) nor via Swift Package Manager with the published link (the link is not found).

 

iOS-Version is 15.0

Greg-DB
Dropbox Staff

@gcarl While either should technically work, you should use the newer "authorizeFromControllerV2" method as shown here, instead of "authorizeFromController". Is that what you're referring to when you say "alternative authorization flow"?

 

In any case, I've been unable to reproduce the issue in my own testing, even with the same version of the SDK. You didn't mention which version number of the Dropbox iOS app you have installed though, so please do share that. You can find it in the settings section of the app.

 

Also, when you run in to this issue, do you get any error or output, such as in the UI or in the Xcode console?

 

Finally, I also can't reproduce the SDK installation issues you mentioned. If you're still seeing those, can you share the full error/output for those?

gcarl
Explorer | Level 4

Dear greg-db,

 

thanks for your support. Unfortunately, I can't manage it.

I'm using the DropboxApp version 258.2.2.

SwiftyDropbox SDK-version is 7.0.1

 

For the authorization I use the "authorizeFromControllerV2" as described:

 

func connectDropbox(withRequest request: Dropboxrequest) {

        let scopeRequest = ScopeRequest(scopeType: .user, scopes: ["files.content.write"], includeGrantedScopes: false)

            DropboxClientsManager.authorizeFromControllerV2(

                UIApplication.shared,

                controller: self,

                loadingStatusDelegate: nil,

                openURL: { (url: URL) -> Void in UIApplication.shared.open(url, options: [:], completionHandler: nil) },

                scopeRequest: scopeRequest

            )

    }

 

and the functions within AppDelegate and in SceneDelegate are as described in the manual:

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {

         let oauthCompletion: DropboxOAuthCompletion = {

          if let authResult = $0 {

              switch authResult {

              case .success:

                    print("Success! User is logged into DropboxClientsManager.")

              case .cancel:

                  print("Authorization flow was manually canceled by user!")

              case .error(_, let description):

                  print("Error: \(String(describing: description))")

              }

          }

        }

 

        for context in URLContexts {

            // stop iterating after the first handle-able url

            if DropboxClientsManager.handleRedirectURL(context.url, completion: oauthCompletion) { break }

        }

    }

 

 

When trying to read or write a file to Dropbox I'm always referred to the Authorization Screen from the Dropbox and I'm asked if I want to give access permission for my app.

Furthermore I got the following messages:

 

021-11-05 17:16:15.392198+0000 Kochbuch[36069:5578791] [connection] nw_read_request_report [C4] Receive failed with error "Software caused connection abort"

2021-11-05 17:16:15.411732+0000 Kochbuch[36069:5578791] Task <F851E3DF-4C19-444C-AB1B-82ACB996ACD8>.<4> HTTP load failed, 36/0 bytes (error code: -1005 [1:53])

2021-11-05 17:16:15.412911+0000 Kochbuch[36069:5579146] Task <F851E3DF-4C19-444C-AB1B-82ACB996ACD8>.<4> finished with error [-1005] Error Domain=NSURLErrorDomain Code=-1005 "Die Netzwerkverbindung wurde unterbrochen." UserInfo={_kCFStreamErrorCodeKey=53, NSUnderlyingError=0x2806e0840 {Error Domain=kCFErrorDomainCFNetwork Code=-1005 "(null)" UserInfo={_kCFStreamErrorCodeKey=53, _kCFStreamErrorDomainKey=1}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <F851E3DF-4C19-444C-AB1B-82ACB996ACD8>.<4>, _NSURLErrorRelatedURLSessionTaskErrorKey=(

    "LocalDataTask <F851E3DF-4C19-444C-AB1B-82ACB996ACD8>.<4>"

), NSLocalizedDescription=Die Netzwerkverbindung wurde unterbrochen., NSErrorFailingURLStringKey=https://api.dropbox.com/oauth2/token, NSErrorFailingURLKey=https://api.dropbox.com/oauth2/token, _kCFStreamErrorDomainKey=1}

Error: nil

Greg-DB
Dropbox Staff

Thanks for following up and sharing that error output. That particular error code indicates that the network connection was lost. (The https://api.dropbox.com/oauth2/token address is used by the last step of the authorization flow, to call the Dropbox severs to retrieve the access token.)

 

Is there anything on your network connection/device that may be interfering with the connection to api.dropbox.com, such as firewall, proxy, VPN, anti-virus, etc.?

gcarl
Explorer | Level 4

Dear greg-db,

 

thanks for your immediate reply. I'm really fascinated how quick you always answer and appreciate it very much. Thanks for this too.

To your question: no I don't have any additional firewalls, -settings etc in my network or on my phone which could interfere. And the problem occurs independent if I use my iPhone in my WLAN or only with mobile data. Furthermore, the Dropbox-App itself has no problems to connect and to browse - and the same applies, if I use my app without the Dropbox-App installed. In this case I have a stable connection to my Dropbox account and can browse, read and write files without any problems.

Greg-DB
Dropbox Staff

@gcarl Thanks for confirming that. Unfortunately it's not clear why that would be failing, but this issue looks similar to this report. Are you able to reproduce the same properties they mentioned though, such as differences across devices, and being able to work around the issue by waiting?

Need more support?
Who's talking

Top contributors to this post

  • User avatar
    gcarl Explorer | Level 4
  • User avatar
    Greg-DB Dropbox Staff
What do Dropbox user levels mean?