私は現在、SDKの4.0バージョンを使用してFacebookログインを実装しようとしていますが、これは3. +バージョンでも発生します。 logInWithReadPermissions(4.0バージョン)またはopenActiveSessionWithReadPermissions(3. +バージョン)を呼び出すと、ユーザーが選択を行う前に、クロージャー/ブロックがisCancelled(4.0バージョン)およびClosedFailedLogin(3. +バージョン)ですぐに呼び出されます(cancelまたはok)。私のplist設定のURLスキームに問題があるのではないかと思ったのですが、何度も確認したところ、すべてが正しいようです。誰かがこの問題を解決するためのアイデアを持っているのではないかと思っています。私のバンドルIDは正しく、シングルサインインがオンで、ネイティブアプリがFacebook開発コンソールで有効になっています。以下のサンプルコードと設定をご覧ください(バージョン4.0)。
ログイン呼び出し:
AppDelegate:
Plist:
問題が発生しましたが、回避策を見つけました。ログインマネージャーのログイン動作を設定して、電話でFacebookの詳細を使用できます。デフォルトの動作はFBSDKLoginBehaviorSystemNativeであり、最初にFacebookアプリを使用しようとし、それがない場合はWebモーダルを使用します。
そのようにして、動作していないように見えるURLを渡す代わりに、ログイン動作をFBSDKLoginBehaviorSystemAccountとして設定できます。 。
簡単に言えば、次のことを試してください。
let fbLoginManager = FBSDKLoginManager();
fbLoginManager.loginBehavior = FBSDKLoginBehaviorSystemAccount;
// call login method of choice here
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)
}
同じ問題のログインメソッドが常に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 update 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.およびSDK 4.17.で動作します。ありがとうございます。
AppDelegateに関数を追加しましたか?
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation)
}
私もこの問題を抱えています。 (プロジェクト構成の)App Bundle IDが、Facebookアプリのダッシュボードで構成されたApp Bundle IDと一致しないことがわかりました。バンドルIDを修正した後、ログインは正常に機能しました。
これが誰かを助けることを願っています。
このチュートリアルに従ってアプリにLoginButtonを追加するときに、非常によく似た問題が発生しました→ https://developers.facebook.com/docs/Swift/login 。
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)
}
間違った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)
サファリバンドルIDを明示的に渡す必要があったことに注意してください。そうしないと、FBアカウントのデリゲートはisCancelled = true
を取得します
私も過去1か月からこの問題に直面しています。 iOS 10でFacebookログインをFirebaseと統合していましたSwift 3.最後に、正常に実装できました。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を介してログインを提示した場合も同じことが起こります。
私の場合、React-Native、FacebookSDK、およびDeeplinkを一緒に使用する場合、AppDelegate.m内に必要なopenUrlは1つだけです。詳細説明は https://github.com/facebook/react-native-fbsdk/blob/master/README.md#32-ios-project にあります
同じ問題がありました。 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
}
2019年1月13日
私のために解決:
Podfile.lockを削除します
ポッドフォルダを削除
facebookポッドを置き換える Podfile内このバージョンで facebook
pod 'FBSDKCoreKit'、 '〜> 4.38.0'
ポッド 'FBSDKLoginKit'、 '〜> 4.38.0'
FacebookShareKitやFacebook用の他のものがあれば、使用しているのと同じバージョン4.38.0に変更する必要があることに注意してください。
ポッドインストールで端末を実行する
プロジェクトを開き、[製品]> [クリーンビルドフォルダー]に移動します
アプリを実行して試してください。
あなたのために働くなら、みんなに知らせてください。
元の投稿:https://github.com/facebookarchive/facebook-Swift-sdk/issues/298#issuecomment-44962668
乾杯。
私は同じ問題を抱えていて、ここでの他の答えはどれもうまくいきませんでした。 Facebookのドキュメントを注意深く読み、すべてが正しいことを確認しました。調査の結果、バージョン4.39.0以降のFBSDK自体に問題があることがわかりました。結局のところ、私はFBSDKバージョン4.40.0を使用していました。 FBSDKバージョン4.38.0に戻したところ、問題は完全に解決されました。
cocoapodsを使用している場合にFBSDKバージョン4.38.0に戻す方法を説明するリンクがあります
ただし、あなたが私のようなもので、cocoapodsを使用したくない場合は、 ここにFBSDKバージョン4.38.0をダウンロードするためのリンクがあります