Facebook登录总是在取消时返回。 (iOS Swift)

时间:2015-03-28 19:12:05

标签: ios facebook swift facebook-ios-sdk

我目前正在尝试使用4.0版本的SDK实现Facebook登录,这也适用于3. +版本。当我调用 logInWithReadPermissions (4.0版)或 openActiveSessionWithReadPermissions (3. +版本)时。在用户可以进行选择之前,立即使用 isCancelled (4.0版本)和 ClosedFailedLogin (3. +版本)调用闭包/块(取消确定)。我认为这可能是我的plist设置中的URL Scheme的一个问题,但我一遍又一遍地检查它,一切似乎都是正确的。只是想知道是否有人可能有任何解决这个问题的想法。我的Bundle ID是正确的,在Facebook开发控制台中启用了单点登录,启用了本机应用程序。请参阅下面的示例代码和配置(4.0版本)。

登录电话: Login Call

的AppDelegate: AppDelegate

plist中: Plist

13 个答案:

答案 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

相关问题