在使用以下环境时,我无法解决Facebook Login组件:
Xcode 8中的Swift 3.0 Facebook SDK for Swift(0.2.0) 在iOS 10上运行
我已按照所有必要步骤(iOS Getting Started和Swift Getting Started),即使是此处未提及的步骤,例如添加默认的AppDelegate方法,如下所示:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
FacebookCore.SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: [
.sourceApplication: application,
])
return true
}
private func application(app: UIApplication, openURL url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
return FacebookCore.SDKApplicationDelegate.shared.application(app, open: url, options: [
.sourceApplication: app,
])
}
@available(iOS 9.0, *)
private func application(application: UIApplication, openURL url: URL, sourceApplication: String?, annotation: AnyObject) -> Bool {
return FacebookCore.SDKApplicationDelegate.shared.application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
}
至于关于Facebook部分的Info.plist内容,我假设我有所有必需的标签,甚至其他一些似乎有助于解决这种情况的其他问题,在SO上的一些问题中找到:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>fb1619016601757957</string>
</array>
</dict>
</array>
<key>FacebookAppID</key>
<string>1619016601757957</string>
<key>FacebookDisplayName</key>
<string>Nossa Cidade</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
</array>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>facebook.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
</dict>
<key>fbcdn.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
</dict>
<key>akamaihd.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
</dict>
</dict>
</dict>
对于最后和核心部分,超级简化,我在登录控制器中附加了登录按钮逻辑。
override func viewDidLoad() {
super.viewDidLoad()
loginButton = LoginButton(readPermissions: [.publicProfile, .userFriends, .email])
loginButton.center = view.center
loginButton.frame.origin = CGPoint(x: loginButton.frame.origin.x,y: loginBtn.frame.origin.y + 80)
self.view.addSubview(loginButton)
loginButton.delegate = self
}
func loginButtonDidCompleteLogin(_ loginButton: LoginButton, result: LoginResult) {
switch result {
case .success(let grantedPermissions, _, let accessToken):
print("facebook success")
print(accessToken.authenticationToken)
break
case .cancelled:
print("facebook cancelled")
break
case .failed(let error):
print("facebook error")
break
}
}
func loginButtonDidLogOut(_ loginButton: LoginButton) {
print("User has logged out")
}
我已经经历了很多SO问题,Github问题,并且有一些开发人员遇到了与我相同的情况,没有对此错误的可能结果做出任何具体的回应。到底发生了什么,是我得到了一个很大的胖LoginResult.cancelled回调,而不是我想要的。
与此相关的控制台输出是:
-canOpenURL: failed for URL: "fbauth2:/" - error: "The operation couldn’t be completed. (OSStatus error -10814.)"
任何帮助将不胜感激。谢谢!
答案 0 :(得分:1)
我遇到了类似的问题,这是由于我的应用程序中的AppDelegate中的方法在完成登录后没有被Facebook调用。
基于tutorial here我认为您需要更改AppDelegate中的方法,如下所示:
import FacebookCore
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
...
return FacebookCore.SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
}
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return FacebookCore.SDKApplicationDelegate.shared.application(app, open: url, options: options)
}
进行此更改后,我发现Facebook在登录后切换回我的应用程序并且没有挂在白色屏幕上。