web-dev-qa-db-ja.com

Facebook SDKログインがiOS 9でアプリケーションをコールバックすることはありません

this に従って、iOS 9 SDKでビルドされたときに正しく機能するようにFacebook SDK 4.6を使用するようにアプリケーションを更新します。

ここでログインボタンをタップすると、Safariビューコントローラーが表示されます(Facebookアプリにリダイレクトされないはずですか?)が、許可を受け入れた後、Safariビューコントローラーが消えることはありません。新しい空白ページをロードし、何もせずにそこに座っています。 [完了]ボタンをタップすると、返されるFBSDKLoginManagerLoginResultisCancelledはtrueです。

SDKがFacebookアプリよりもSafari View Controllerを選択するのは正常ですか?そして、ログインが完了した後にコールバックを取得しないのはなぜですか?

65

UIApplicationDelegateapplication:openURL:options:が実装されている、application:openURL:sourceApplication:annotation:は呼び出されません。

だから私がしなければならなかったことはFBSDKApplicationDelegate 's application:openURL:sourceApplication:annotation: from UIApplicationDelegateapplication:openURL:options:

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options {
    return [[FBSDKApplicationDelegate sharedInstance] application:app
                                                      openURL:url
                                            sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                                                   annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
}
132

Swiftこれは私のために働いていました(AppDelegate.Swiftに追加):

@available(iOS 9.0, *)
func application(application: UIApplication,openURL url: NSURL, options: [String: AnyObject]) -> Bool {
return FBSDKApplicationDelegate.sharedInstance().application(application, 
     openURL: url, 
     sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as! String,
     annotation: options [UIApplicationOpenURLOptionsAnnotationKey])
}

そして

@available(iOS, introduced=8.0, deprecated=9.0)
func application(application: UIApplication,openURL url: NSURL, sourceApplication: String?, annotation: AnyObject) -> Bool {  
return FBSDKApplicationDelegate.sharedInstance().application(application,
     openURL: url,
     sourceApplication: sourceApplication!,
     annotation: annotation)
}

いずれの場合も、import FBSDKCoreKit他のimportステートメントと。

基本的にGoogle SignInが使用するもの。それでも動作しない場合は、FaceBook Docsで指定されているようにデリゲートとinfo.plistを設定する必要があります。これがお役に立てば幸いです!

32
David

Swift 3&Facebook SDK 4.16.0:

AppDelegate.Swiftに次のコードを追加します

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
}
15
Johnny Tsoi

IOS10でこれと同じ問題が発生している方のために、私はこれを追加しました:

@available(iOS 9.0, *)
func application(_ application: UIApplication, openURL url: URL, sourceApplication: String?, annotation: AnyObject) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(application, open: url, sourceApplication: sourceApplication, annotation: annotation)
}

これは動作するはずですが、今のところはただの回避策です

5
CommittedEel

@Heshamの修正に感謝します。

Swift3の修正は次のとおりです。

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(
        app,
        open: url,
        sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String,
        annotation: options[UIApplicationOpenURLOptionsKey.annotation])
}
3
RichAppz

xamarinユーザーの場合:

public override bool OpenUrl(UIApplication application, NSUrl url, string sourceApplication, NSObject annotation)
        {

            OnUrlProtocolDetected(url.ToString());
            if (url.AbsoluteString.StartsWith("fb"))
            {
                return ApplicationDelegate.SharedInstance.OpenUrl(application, url, sourceApplication, annotation);
            }

}
3
Abdullah Tahan

Total Swift私のような初心者の場合、問題はapplication()メソッドの代替実装でした:

作業バージョン:

 func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(
        application,
        open: url,
        sourceApplication: sourceApplication,
        annotation: annotation)
}

非動作バージョン(どこからコピーされた)

func application(application: UIApplication, openURL url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    return FBSDKApplicationDelegate.sharedInstance().application(
        application,
        open: url,
        sourceApplication: sourceApplication,
        annotation: annotation)
}
1
victor

これらの手順を実行しましたか?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 return [[FBSDKApplicationDelegate sharedInstance] application:application
didFinishLaunchingWithOptions:launchOptions];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
  return [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation
 ];
}

App DelegateでアプリケーションDelegateを呼び出すポイントを逃していると思います。 2番目の方法は、ユーザーがサファリでログインを終了したことをアプリケーションにコールバックするために不可欠です。

1
Saheb Roy

古い3.24バージョンを使用していて、_iOS 9_で同様の問題に直面していました。

appDelegateメソッド- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotationでそれが見つかりました

だった

_return [FBSession.activeSession handleOpenURL:url];_

代わりに

_return [FBAppCall handleOpenURL:url sourceApplication:sourceApplication];_

1
Jakub Truhlář