Логин в Facebook SDK никогда не вызывает мое приложение на iOS 9

Я следил за этим руководством по обновлению моего приложения, чтобы использовать SDK версии 5.0 для корректной работы при построении с помощью SDK iOS 9.

Когда я нажимаю кнопку входа в систему, появляется диспетчер представлений Safari (не следует ли перенаправлять его в приложение Facebook?), но после принятия разрешения контроллер просмотра Safari не будет уволен. Он загружает новую пустую страницу и сидит там, ничего не делая. Если я нажму кнопку "Готово", возвращается FBSDKLoginManagerLoginResult isCancelled.

Нормально ли, что SDK выбирает контроллер просмотра Safari через приложение Facebook? И почему я не получаю обратные вызовы после завершения входа?

Ответ 1

Оказывается, что в iOS 9, когда UIApplicationDelegate application:openURL:options: реализован, application:openURL:sourceApplication:annotation: не будет вызван.

Так что мне нужно было позвонить FBSDKApplicationDelegate application:openURL:sourceApplication:annotation: из 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]];
}

Ответ 2

Для 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. Если он все еще не работает, вам нужно установить делегаты и ваш info.plist, как это указано в FaceBook Docs. Надеюсь, это поможет!

Ответ 3

Для 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)
}

Ответ 4

Для тех из вас, кто испытывает эту же проблему с 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

для пользователей 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);
            }

}

Ответ 6

Я только что столкнулся с этой проблемой, спасибо @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])
}

Ответ 7

Вы выполнили следующие шаги?

- (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
 ];
}

Я думаю, вам не хватает того места, где вам нужно позвонить делегату приложений в делегат приложения. Второй метод жизненно важен, потому что он дает обратный вызов вашему приложению о том, что логин завершил работу в сафари пользователем

Ответ 8

Я использовал версию old 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];

Ответ 9

Для всех быстрых новичков, подобных мне, проблема заключалась в альтернативной реализации метода 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)
}

Ответ 10

Для тех, кто ищет помощь Swift по этой самой теме, для меня это работало.

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
        return FBSDKApplicationDelegate.sharedInstance().application(app, openURL: url, sourceApplication: UIApplicationOpenURLOptionsSourceApplicationKey, annotation: UIApplicationOpenURLOptionsAnnotationKey)
    }