this に従って、iOS 9 SDKでビルドされたときに正しく機能するようにFacebook SDK 4.6を使用するようにアプリケーションを更新します。
ここでログインボタンをタップすると、Safariビューコントローラーが表示されます(Facebookアプリにリダイレクトされないはずですか?)が、許可を受け入れた後、Safariビューコントローラーが消えることはありません。新しい空白ページをロードし、何もせずにそこに座っています。 [完了]ボタンをタップすると、返されるFBSDKLoginManagerLoginResult
のisCancelled
はtrueです。
SDKがFacebookアプリよりもSafari View Controllerを選択するのは正常ですか?そして、ログインが完了した後にコールバックを取得しないのはなぜですか?
UIApplicationDelegate
のapplication:openURL:options:
が実装されている、application:openURL:sourceApplication:annotation:
は呼び出されません。
だから私がしなければならなかったことはFBSDKApplicationDelegate
's application:openURL:sourceApplication:annotation:
from UIApplicationDelegate
のapplication: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]];
}
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を設定する必要があります。これがお役に立てば幸いです!
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)
}
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)
}
これは動作するはずですが、今のところはただの回避策です
@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])
}
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);
}
}
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)
}
これらの手順を実行しましたか?
- (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番目の方法は、ユーザーがサファリでログインを終了したことをアプリケーションにコールバックするために不可欠です。
古い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];
_