我目前正在尝试使用4.0版本的SDK实现Facebook登录,这也适用于3. +版本。当我调用 logInWithReadPermissions (4.0版)或 openActiveSessionWithReadPermissions (3. +版本)时。在用户可以进行选择之前,立即使用 isCancelled (4.0版本)和 ClosedFailedLogin (3. +版本)调用闭包/块(取消或确定)。我认为这可能是我的plist设置中的URL Scheme的一个问题,但我一遍又一遍地检查它,一切似乎都是正确的。只是想知道是否有人可能有任何解决这个问题的想法。我的Bundle ID是正确的,在Facebook开发控制台中启用了单点登录,启用了本机应用程序。请参阅下面的示例代码和配置(4.0版本)。
登录电话:
的AppDelegate:
plist中:
答案 0 :(得分:14)
使用Facebook SDK版本4,我只需将其添加到iOS 10&amp ;;上的应用程序委托中。 Swift 3使身份验证工作。在此之前,我也只取消了登录。
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return SDKApplicationDelegate.shared.application(app, open: url, options: options)
}
答案 1 :(得分:9)
我遇到了一些问题,但我找到了一个解决方法。您可以设置登录管理器的登录行为以使用手机上的Facebook详细信息。默认行为是FBSDKLoginBehaviorSystemNative,它首先尝试使用Facebook应用程序,然后如果不存在,则使用Web模式。
而不是那样做并传递似乎不起作用的网址,您可以将登录行为设置为 FBSDKLoginBehaviorSystemAccount 。
长话短说,试试:
let fbLoginManager = FBSDLoginManager();
fbLoginManager.loginBehavior = FBSDKLoginBehaviorSystemAccount;
// call login method of choice here
答案 2 :(得分:6)
我有同样的问题登录方法总是返回 canacelled 然后我在 info.plist
中添加以下内容<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>akamaihd.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>facebook.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>fbcdn.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
</array>
并在 AppDelegate 更新 didFinishLaunching 方法并添加如下所示的新方法
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
}
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool
{
return SDKApplicationDelegate.shared.application(app, open: url, options: options)
}
登录方法如下:
@objc func loginButtonClicked() {
let loginManager = LoginManager()
loginManager.loginBehavior = .systemAccount
loginManager.logIn([ .publicProfile,.userFriends,.email ], viewController: self) { loginResult in
switch loginResult {
case .failed(let error):
print(error)
case .cancelled:
print("User cancelled login.")
case .success(let grantedPermissions, let declinedPermissions, let accessToken):
print("Logged in!")
//Do further code...
}
}
}
它适用于 Swift 3.0 和 SDK 4.17.0 ,我希望它对您有用谢谢。
答案 3 :(得分:5)
您是否向AppDelegate添加了功能?
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}
答案 4 :(得分:3)
我也遇到了这个问题。事实证明,应用程序包ID(在项目配置中)与Facebook应用程序仪表板中配置的应用程序包ID不匹配。修复bundle id后,登录工作正常。
希望这有助于某人。
答案 5 :(得分:3)
按照本教程→https://developers.facebook.com/docs/swift/login在我的应用中添加LoginButton时遇到了类似的问题。
点击Facebook Connect按钮并完成授权后,它将始终返回状态&#39;已取消&#39;。 我尝试了很多解决方案,最后工作如下:
在 AppDelegate.swift 中,添加以下2个功能:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
return SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
}
func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return SDKApplicationDelegate.shared.application(application, open: url, options: options)
}
答案 6 :(得分:2)
我发现正在调用错误的AppDelegate方法。它正在呼叫
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {...
而不是
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {...
所以我必须将它添加到第一个AppDelegate方法(被调用的方法):
return FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: "com.apple.mobilesafari", annotation: nil)
请注意,我必须明确传递safari包ID,否则FB帐户代表将获得isCancelled = true
答案 7 :(得分:1)
我过去1个月也遇到过这个问题。我正在ios 10 swift 3中将facebook登录与firebase集成。最后,我能够成功实现它。我通过在AppDelegate文件中进行以下更改来纠正它。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
FIRApp.configure()
FBSDKApplicationDelegate.sharedInstance().application(application, didFinishLaunchingWithOptions: launchOptions)
return true
}
@available(iOS 9.0, *)
func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any])
-> Bool {
var shouldOpen :Bool = FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String!,annotation: options[UIApplicationOpenURLOptionsKey.annotation])
return shouldOpen
}
// for iOS below 9.0
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
var shouldOpen :Bool = FBSDKApplicationDelegate.sharedInstance().application(application,open: url as URL!,sourceApplication: sourceApplication,annotation: annotation)
return shouldOpen
}
我希望它可以帮助别人
在运行10.2
的ios 10.2仿真器,iPhone 6 Plus上进行了测试答案 8 :(得分:1)
我的问题是由于我模态地呈现了一个加载视图控制器,当视图消失时我被解雇了。由于FBSDK在转换到Safari或应用程序时调用了viewWillDisappear方法,因此它关闭了视图和FB登录屏幕。如果您通过UIAlertController提交登录,则会发生同样的事情。
答案 9 :(得分:1)
2019年1月13日
为我解决:
删除Podfile.lock
删除Pods文件夹
在此Pod文件中用此版本的 替换您的Podfile中的Facebook Pod 。
pod'FBSDKCoreKit','〜> 4.38.0'
pod'FBSDKLoginKit','〜> 4.38.0'
现在请注意,如果您拥有FacebookShareKit或其他用于Facebook的内容,则必须将其更改为您使用的相同版本,即4.38.0
使用pod install运行终端
打开您的项目,转到“产品”>“清理构建文件夹”
运行该应用并尝试。
为我工作,如果对您有用,请大家知道。
原始帖子: https://github.com/facebookarchive/facebook-swift-sdk/issues/298#issuecomment-449626683
欢呼。
答案 10 :(得分:0)
我有同样的问题。不要混用 FBSDKApplicationDelegate 和 SDKApplicationDelegate
使用AppDelegate中的下一个Swift 4代码解决它:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
SDKApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
return true
}
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
let appId = SDKSettings.appId
if url.scheme != nil && url.scheme!.hasPrefix("fb\(appId)") && url.host == "authorize" { // facebook
return SDKApplicationDelegate.shared.application(app, open: url, options: options)
}
return false
}
答案 11 :(得分:0)
就我而言,结合使用React-Native,FacebookSDK和Deeplink,我只需要在AppDelegate.m中拥有一个openUrl。更详细的说明在https://github.com/facebook/react-native-fbsdk/blob/master/README.md#32-ios-project
中答案 12 :(得分:0)
我遇到了同样的问题,这里没有其他答案对我有用。我仔细阅读了Facebook文档,以确保我做的一切正确。经过研究,我发现这是FBSDK本身的问题,从4.39.0版开始。事实证明,我一直在使用FBSDK版本4.40.0。当我恢复为FBSDK版本4.38.0时,此问题已完全解决。
Here's a link which explains how to revert to FBSDK version 4.38.0 if you are using cocoapods
但是,如果您像我一样,不想使用可可足类,here is a link to download FBSDK version 4.38.0