簡體   English   中英

Facebook 登錄總是被取消。 (iOS Swift)

[英]Facebook login always comes back as cancelled. (iOS Swift)

我目前正在嘗試使用 4.0 版本的 SDK 實現 Facebook 登錄,3.+ 版本也會發生這種情況。 當我調用logInWithReadPermissions (4.0 版)或openActiveSessionWithReadPermissions (3.+ 版)時。 在用戶可以進行選擇(取消確定)之前,使用isCancelled (4.0 版本)和ClosedFailedLogin (3.+ 版本)立即調用閉包/塊。 我認為我的 plist 設置中的 URL Scheme 可能有問題,但我已經一遍又一遍地檢查它,一切似乎都是正確的。 只是想知道是否有人對解決這個問題有任何想法。 我的 Bundle ID 是正確的,單點登錄已啟用,本機應用程序已啟用,在 Facebook 開發控制台中。 請參閱下面的一些示例代碼和配置(4.0 版本)。

登錄電話:登錄呼叫

應用委托:應用程序委托

列表:列表

使用 Facebook SDK 版本 4,我只需要將它添加到 iOS 10 和 Swift 3 上的應用程序委托中即可進行身份驗證。 在此之前,我也只取消了登錄。

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return SDKApplicationDelegate.shared.application(app, open: url, options: options)
}

我遇到了一些問題,但我找到了解決方法。 您可以設置登錄管理器的登錄行為以使用手機上的 Facebook 詳細信息。 默認行為是 FBSDKLoginBehaviorSystemNative,它首先嘗試使用 Facebook 應用程序,然后如果它不存在,則使用網絡模式。

您可以將登錄行為設置為FBSDKLoginBehaviorSystemAccount ,而不是這樣做並傳遞似乎不起作用的網址。

長話短說,試試:

let fbLoginManager = FBSDKLoginManager();
fbLoginManager.loginBehavior = FBSDKLoginBehaviorSystemAccount;
// call login method of choice here

我有同樣的問題登錄方法總是返回取消然后我在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.0SDK 4.17.0 中對我有用,我希望它對你有用,謝謝。

您是否向 AppDelegate 添加了函數?

func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
        return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}

按照本教程→ https://developers.facebook.com/docs/swift/login在我的應用程序中添加 LoginButton 時,我遇到了非常類似的問題。

單擊 Facebook Connect 按鈕並完成授權后,它始終返回“已取消”狀態。 我嘗試了很多解決方案,最終以下方法奏效:

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)
}

我也遇到了這個問題。 結果發現應用程序包 ID(在項目配置中)與 Facebook 應用程序儀表板中配置的應用程序包 ID 不匹配。 修復 bundle id 后,登錄工作正常。

希望這可以幫助某人。

我發現調用了錯誤的 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

過去 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
    }

我希望它可以幫助其他人

在 ios 10.2 模擬器、運行 10.2 的 iPhone 6 Plus 上測試

我的問題是由我模態地呈現加載視圖控制器引起的,當視圖消失時我被解雇了。 由於 FBSDK 在轉換到 Safari 或應用程序時調用 viewWillDisappear 方法,因此它會關閉視圖和 FB 登錄屏幕。 如果您通過 UIAlertController 顯示登錄信息,也會發生同樣的事情。

更新 2020-10-09:

FBSDK 4.38.0 版本使用 UIWebView,目前蘋果已經停產,12 月份完全停產。

原來的:

我遇到了同樣的問題,這里的其他答案都不適合我。 我仔細閱讀了 Facebook 文檔,以確保我所做的一切都是正確的。 經過一番研究,我發現這是 FBSDK 本身從 4.39.0 版本開始的一個問題。 事實證明,我一直在使用 FBSDK 4.40.0 版。 當我恢復到 FBSDK 版本 4.38.0 時,問題完全解決。

這是一個鏈接,它解釋了如何在使用 cocoapods 時恢復到 FBSDK 版本 4.38.0

然而,如果你像我一樣不喜歡使用 cocoapods,這里是下載 FBSDK 版本 4.38.0 的鏈接

2019 年 1 月 13 日

為我解決:

刪除 Podfile.lock
刪除 Pods 文件夾
用這個版本的 facebook替換Podfile 中的 facebook pods

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

干杯。

我遇到過同樣的問題。 不要混合使用FBSDKApplicationDelegateSDKApplicationDelegate

使用 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
}

在我將 React-Native、FacebookSDK 和 Deeplink 一起使用的情況下,我只需要在 AppDelegate.m 中有一個 openUrl。 更多細節解釋在https://github.com/facebook/react-native-fbsdk/blob/master/README.md#32-ios-project

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM