Логин в 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)
}