Ответ 1
Использование 20150708 решило его для меня в iOS 9.
Ссылка на SDK: https://developers.facebook.com/resources/FacebookSDKs-iOS-20150708.pkg
Он отлично работал для входа в logInWithReadPermissions в iOS 8, но как только после обновления до iOS 9 он продолжает открывать Safari или модальный UIWebView.
Есть ли у кого-то такая же проблема?
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login setLoginBehavior:FBSDKLoginBehaviorNative];
[login logInWithReadPermissions:@[@"public_profile",@"email"] fromViewController:nil handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
NSLog(@"");
}];
Использование 20150708 решило его для меня в iOS 9.
Ссылка на SDK: https://developers.facebook.com/resources/FacebookSDKs-iOS-20150708.pkg
Кажется, нет никакого способа получить предыдущее поведение, используя новинки FB SDK в iOS9+. Для этого вы можете использовать старый SDK. Здесь ответ от facebook на этот вопрос:
Теперь вы можете изменить loginBehavior на FBSDKLoginBehaviorSystemAccount, поэтому FBSDKLoginManager получает Facebook, зарегистрированный пользователем из настроек iOS Facebook;)
FBSDKLoginManager *fbLogin = [[FBSDKLoginManager alloc] init];
fbLogin.loginBehavior = FBSDKLoginBehaviorSystemAccount;
От FBSDKLoginManager:
Декларация: FBSDKLoginBehaviorSystemAccount
Описание. Если учетная запись недоступна для приложения (либо не настроена пользователем, либо определена SDK), это поведение возвращается к FBSDKLoginBehaviorNative.
Примечание. Если учетная запись недоступна для приложения (либо не настроена пользователем, либо определена SDK), это поведение возвращается к FBSDKLoginBehaviorNative.
Если вы хотите использовать последнюю версию SDK, а также собственное поведение входа на iOS 9
Изменить FBSDKServerConfiguration.m
функцию, чтобы всегда возвращать true
- (BOOL)useNativeDialogForDialogName:(NSString *)dialogName
{
return @YES;
}
Возвращение в Safari по-прежнему работает, если приложение Facebook не установлено
Я заметил, что в обоих списках изменений:
Facebook SDK для iOS Changelog v4.x
(v4.6.0 - 10 сентября 2015 г.) Кроме того, диалоги SDK, такие как Login, Like, Share Dialogs, автоматически определяют лучший пользовательский интерфейс на основе устройства, в том числе SFSafariViewController, а не Safari. Следуйте инструкциям нашего Руководства по подготовке к iOS 9.
Facebook SDK для iOS Changelog v3.x
(v3.24.0 - 10 сентября 2015 г.) Кроме того, диалоги SDK, такие как Login, Like, Share Dialogs, автоматически определяют лучший пользовательский интерфейс на основе устройства, в том числе SFSafariViewController, а не Safari. Следуйте инструкциям нашего Руководства по подготовке к iOS 9.
Я следовал за доком здесь: https://developers.facebook.com/docs/ios/ios9
после добавления пунктов 2 и 3 мое приложение переключается на собственное приложение facebook для входа в систему...
если вы хотите, чтобы модальная функция открывалась и запрашивала учетные данные в facebook отдельно от приложения Safari или Facebook, просто используйте последнюю версию sdk facebook и задайте поведение входа
FBSDKLoginManager *fbLogin = [[FBSDKLoginManager alloc] init];
[login setLoginBehavior:FBSDKLoginBehaviorWeb];
это сделает процесс выхода более удобным и менее запутанным для пользователей.
Использование этой версии с CocoaPods:
pod 'FBSDKCoreKit', '4.4.0'
pod 'FBSDKLoginKit', '4.4.0'
pod 'FBSDKShareKit', '4.4.0'
В быстрых случаях Когда выбранным вами поведение входа в систему является Web, затем откройте webView popUp. В браузере Safari нет переадресации входа в систему
// Try to login with permissions
let fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
fbLoginManager.loginBehavior = FBSDKLoginBehavior.Web
Вы хотите изменить поведение входа по умолчанию, как показано ниже.
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logOut];
login.loginBehavior = FBSDKLoginBehaviorSystemAccount;
[login logInWithReadPermissions:@[@"public_profile", @"email", @"gender",@"user_friends"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
{
if (error)
{
// Process error
}
else if (result.isCancelled)
{
// Handle cancellations
}
else
{
// Now that we are authorized to view public profile and email, request that data get data from 'me'
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields" : @"first_name, last_name,email,name,gender,birthday"}] startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error)
{
}];
}
}];
если у пользователя нет имени пользователя и пароля в facebook в приложении Настройки, тогда появится сафари.
РЕШЕНИЕ! iOS 9.2.1 Facebook SDK 4.10.0
Установите Facebook SDK через Cocoapods
Set:
FBSDKLoginManager * loginManager = [[FBSDKLoginManager alloc] init]; loginManager.loginBehavior = FBSDKLoginBehaviorNative;
В ~/FBSDKCoreKit/FBSDKServerConfigurationManager.m
Изменить:
NSOperatingSystemVersion iOS9Version = { .majorVersion = 9, .minorVersion = 0, .patchVersion = 0 };
BOOL useNativeFlow = ![FBSDKInternalUtility isOSRunTimeVersionAtLeast:iOS9Version];
To:
BOOL useNativeFlow = YES;
Изменить:
BOOL useNativeDialog = [serverConfiguration useNativeDialogForDialogName:FBSDKDialogConfigurationNameLogin];
To:
BOOL useNativeDialog = YES;
Найти в Pods:
BOOL useNativeDialog
& внести те же изменения, если вы хотите использовать другие функции. Например: App Invite.
Теперь приложение использует встроенное приложение Facebook для входа.
Это решение работает для меня. Надеюсь, что это поможет.
P.S. Не забывайте вносить изменения после обновления FB SDK.