![](/img/trans.png)
[英]Swift 5 - Facebook Login: LoginManager() always return cancelled
[英]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.0和SDK 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
干杯。
我遇到過同樣的問題。 不要混合使用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
}
在我將 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.