几个小时以来我一直在解决这个问题,我正在将我的应用程序与 Dropbox 链接。我已经创建了演示应用程序,那里一切正常,但是当我合并到我的应用程序中时,openurl 委托返回 false,我在 dropbox 中创建了一个新应用程序,但仍然存在相同的问题。
错误日志是:
-canOpenURL: failed for URL: "dbapi-2://1/connect" - error: "This app is not allowed to query for scheme dbapi-2"
-canOpenURL: failed for URL: "dbapi-8-emm://1/connect" - error: "This app is not allowed to query for scheme dbapi-8-emm"
-canOpenURL: failed for URL: "dbapi-2://1/connect" - error: "This app is not allowed to query for scheme dbapi-2"
-canOpenURL: failed for URL: "dbapi-8-emm://1/connect" - error:"This app is not allowed to query for scheme dbapi-8-emm"
[ERROR] unable to verify link request
[ERROR] DropboxSDK: credentials not saved. Make sure you call -[DBSession handleOpenUrl:] in your app delegate's application:openURL:sourceApplication:annotation: method
应用委托中的代码:
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
if DBSession.shared().handleOpen(url as URL!) {
if DBSession.shared().isLinked() {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "didLinkToDropboxAccountNotification"), object: nil)
return true
}
}
return false
}
有关完整教程,请参阅此处
确保在 .plist 中添加LSApplicationQueriesSchemes
<key>LSApplicationQueriesSchemes</key>
<array>
<string>dbapi-2</string>
<string>dbapi-8-emm</string>
</array>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>db-APP_KEY</string>
</array>
</dict>
</array>
对于您的第二个错误:无法验证链接请求
func handleOpen(_ url: URL) -> Bool {
var expected: String = "(self.appScheme())://(kDBDropboxAPIVersion)/"
if !url.absoluteString.hasPrefix(expected) {
return false
}
var components: [Any] = url.path.pathComponents()
var methodName: String = components.count > 1 ? components[1] : nil
if methodName.isEqual("connect") {
var params: [AnyHashable: Any] = DBSession.parseURLParams(url.query)
var token: String? = (params["oauth_token"] as? String)
var secret: String? = (params["oauth_token_secret"] as? String)
var userId: String? = (params["uid"] as? String)
var state: String? = (params["state"] as? String)
var nonce: String? = UserDefaults.standard.object(forKey: kDBLinkNonce)
UserDefaults.standard.removeObject(forKey: kDBLinkNonce)
UserDefaults.standard.synchronize()
if !nonce.isEqual(state) {
DBLogError("unable to verify link request")
return false
}
self.updateAccessToken(token, accessTokenSecret: secret, for: userId)
}
if methodName.isEqual("cancel") {
DBLogInfo("DropboxSDK: user cancelled Dropbox link")
}
return true
}
不幸的是,其他答案都不起作用,我在 Dropbox 上删除了我的应用程序并创建了一个新应用程序,然后再次进行了所有处理瞧,一切正常。