Родное приложение для Facebook не открывается с входом в Facebook в iOS 9
Я обновил iPhone 6 плюс к бета-версии iOS 9 и пытался выполнить вход в Facebook, но каждый раз, когда он представлял UIWebView с формой входа в Facebook.
У меня есть Facebook sdk
FB_IOS_SDK_VERSION_STRING @"3.24.0"
FB_IOS_SDK_TARGET_PLATFORM_VERSION @"v2.2"
И я использую следующие методы для входа в Facebook
NSArray *permissions = @[@"email",@"user_birthday",@"public_profile"];
FBSessionStateHandler completionHandler = ^(FBSession *session, FBSessionState status, NSError *error) {
[self sessionStateChanged:session state:status error:error];
};
if ([FBSession activeSession].state == FBSessionStateCreatedTokenLoaded) {
// we have a cached token, so open the session
[[FBSession activeSession]openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent
fromViewController:nil
completionHandler:completionHandler];
} else {
[self clearAllUserInfo];
[[NSURLCache sharedURLCache] removeAllCachedResponses];
// create a new facebook session
FBSession *fbSession = [[FBSession alloc] initWithPermissions:permissions];
[FBSession setActiveSession:fbSession];
[fbSession openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent
fromViewController:nil
completionHandler:completionHandler];
}
У меня есть следующая настройка в файле plist
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fbapi20130214</string>
<string>fbapi20130410</string>
<string>fbapi20130702</string>
<string>fbapi20131010</string>
<string>fbapi20131219</string>
<string>fbapi20140410</string>
<string>fbapi20140116</string>
<string>fbapi20150313</string>
<string>fbapi20150629</string>
<string>fb-messenger-api20140430</string>
<string>fbauth</string>
<string>fbauth2</string>
<array>
Пожалуйста, дайте мне знать, чего я здесь не хватает. Сначала он проверяет iPhone device Setting-> Facebook credentials
, но никогда не открывает приложение Facebook для входа. Кажется, он не распознает приложение Facebook, установленное на устройстве.
Ответы
Ответ 1
Ниже приведен полный процесс для нового входа в систему Facebook.
вот как я переработал мою интеграцию с Facebook, чтобы заставить ее работать с последним обновлением.
Xcode 7.x, iOS 9, Facebook SDK 4.x
Шаг-1. Загрузите последнюю версию SDK для Facebook (она включает в себя значительные изменения).
Шаг-2. Добавьте FBSDKCoreKit.framework и FBSDKLoginKit.framework в свой проект.
Шаг-3. Теперь перейдите в Project > Build Phases > add SafariServices.framework
Шаг-4. В файле info.plist есть три изменения.
4.1 Убедитесь, что вы указали ниже в файле info.plist
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string><your fb id here eg. fbxxxxxx></string>
</array>
</dict>
</array>
<key>FacebookAppID</key>
<string><your FacebookAppID></string>
<key>FacebookDisplayName</key>
<string><Your_App_Name_Here></string>
4.2 Теперь добавьте ниже для White-List Facebook Servers, это необходимо для iOS 9
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>facebook.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>fbcdn.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
<key>akamaihd.net</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
4.3 Добавление схем URL
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
</array>
Шаг-5. Теперь откройте файл AppDelegate.m
5.1 Добавьте ниже операторы импорта (удалите старый).
#import <FBSDKLoginKit/FBSDKLoginKit.h>
#import <FBSDKCoreKit/FBSDKCoreKit.h>
5.2 обновление после следующих методов
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
return [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation];
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
[FBSDKAppEvents activateApp];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return [[FBSDKApplicationDelegate sharedInstance] application:application
didFinishLaunchingWithOptions:launchOptions];
}
Шаг-6. Теперь нам нужно изменить наш контроллер входа, где мы выполняем задачу входа
6.1 Добавьте эти импорты в Login ViewController.m
#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginKit.h>
6.2 Добавить кнопку входа в Facebook
FBSDKLoginButton *loginButton = [[FBSDKLoginButton alloc] init];
loginButton.center = self.view.center;
[self.view addSubview:loginButton];
6.3 Кнопка "Вход в систему" нажмите
-(IBAction)facebookLogin:(id)sender
{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
if ([FBSDKAccessToken currentAccessToken])
{
NSLog(@"Token is available : %@",[[FBSDKAccessToken currentAccessToken]tokenString]);
[self fetchUserInfo];
}
else
{
[login logInWithReadPermissions:@[@"email"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error)
{
if (error)
{
NSLog(@"Login process error");
}
else if (result.isCancelled)
{
NSLog(@"User cancelled login");
}
else
{
NSLog(@"Login Success");
if ([result.grantedPermissions containsObject:@"email"])
{
NSLog(@"result is:%@",result);
[self fetchUserInfo];
}
else
{
[SVProgressHUD showErrorWithStatus:@"Facebook email permission error"];
}
}
}];
}
}
6.4 Получить информацию о пользователе (имя, адрес электронной почты и т.д.)
-(void)fetchUserInfo
{
if ([FBSDKAccessToken currentAccessToken])
{
NSLog(@"Token is available : %@",[[FBSDKAccessToken currentAccessToken]tokenString]);
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, email"}]
startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
if (!error)
{
NSLog(@"results:%@",result);
NSString *email = [result objectForKey:@"email"];
NSString *userId = [result objectForKey:@"id"];
if (email.length >0 )
{
//Start you app Todo
}
else
{
NSLog(@"Facebook email is not verified");
}
}
else
{
NSLog(@"Error %@",error);
}
}];
}
}
Шаг-7. Теперь вы можете создать проект, вы должны получить ниже экрана.
![введите описание изображения здесь]()
Надеюсь, это поможет вам, ребята.
Ссылки. Благодаря документам Facebook, сообщениям Stackoverflow и Google.
Ответ 2
Это по дизайну. Facebook все еще имеет некоторые проблемы с iOS9.
Смотрите команду Facebook: https://developers.facebook.com/bugs/786729821439894/?search_id Спасибо
Ответ 3
В итоге я изменил свой подфайл на предыдущую версию FB:
От:
pod 'FBSDKCoreKit'
pod 'FBSDKLoginKit'
pod 'FBSDKShareKit'
TO:
pod 'FBSDKCoreKit','~>4.5.1'
pod 'FBSDKLoginKit','~>4.5.1'
pod 'FBSDKShareKit','~>4.5.1'
С моей точки зрения, Facebook должен проверить последний логин пользователя и на основе этого вызвать правильный поток входа. (и не допускать, чтобы мелкие разработчики не попали в "сеть против родной войны" ).
Ответ 4
@dan - это правильно. Чтобы обеспечить лучший опыт для пользователей на iOS 9, новый SDK автоматически определяет лучший входной поток. Если вы работаете на iOS 8 или более ранних версиях, переключатель приложений по-прежнему будет предпочтительнее.
Ответ 5
Safari View Controller по умолчанию используется в SDK для Facebook.
Для тех из вас, кто хочет вернуться к предыдущему опыту, см. Ниже. Он работает только для SDK 3.x, это не будет работать на 4.x.
Если вы хотите, чтобы v3.x SDK (протестированный на v3.24.1) работал, как и раньше (без открытия Safari View Controller и вместо этого вместо этого переключился на приложение), вызовите этот код где-нибудь в начале приложения, например. didFinishLaunchingWithOptions:
SEL useSafariSel = sel_getUid("useSafariViewControllerForDialogName:");
SEL useNativeSel = sel_getUid("useNativeDialogForDialogName:");
Class FBDialogConfigClass = NSClassFromString(@"FBDialogConfig");
Method useSafariMethod = class_getClassMethod(FBDialogConfigClass, useSafariSel);
Method useNativeMethod = class_getClassMethod(FBDialogConfigClass, useNativeSel);
IMP returnNO = imp_implementationWithBlock(^BOOL(id me, id dialogName) {
return NO;
});
method_setImplementation(useSafariMethod, returnNO);
IMP returnYES = imp_implementationWithBlock(^BOOL(id me, id dialogName) {
return YES;
});
method_setImplementation(useNativeMethod, returnYES);
Он запускает два метода из FBDialogConfig.
Не забудьте импортировать заголовок objc/runtime.h:
#import <objc/runtime.h>
@SimonCross Некоторые люди просто не хотят понимать, что Safari View Controller обеспечивает лучший пользовательский интерфейс - они думают или знают наверняка, что их пользователи не вошли в Facebook в Safari, но наверняка вошли в систему приложение Facebook.
Ответ 6
После установки всех необходимых ключей .plist, как указано в этом столбце,
Я использовал следующее решение, чтобы выйти из проблемы с регистрацией.
var fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
fbLoginManager.loginBehavior = FBSDKLoginBehavior.Web
Чтобы он всегда включался в приложение.
Ответ 7
С выпуском iOS 9 Apple внесла некоторые существенные изменения в переключение приложений. Это повлияло на приложения iOS 9, интегрированные с Facebook. Большинство людей заметят это в своем опыте, используя Facebook Login. В приложениях, которые используют новейший SDK (v4.6 и v3.24), мы будем обрабатывать поток с использованием Safari View Controller (SVC) вместо быстрого переключения приложений (FAS) из-за дополнительных межстраничных диалоговых окон, которые добавляют дополнительные шаги к процесс входа в систему FAS на iOS 9. Кроме того, данные, которые мы видели из более чем 250 приложений, показывают, что это лучший опыт для людей в долгосрочной перспективе. Пожалуйста, прочитайте подробнее.
https://developers.facebook.com/blog/post/2015/10/29/Facebook-Login-iOS9
Ответ 8
Facebook изменил поведение входа в Facebook для iOS9.
Вот цитата из сообщение в блоге Facebook:
Мы отслеживали данные и CTR для более чем 250 приложений за последние 6 недель с момента запуска iOS 9. Скорость перехода по клику (CTR) в SVC Login превосходит CTR входа в приложение-переключатель и улучшается с 3-кратной скоростью работы приложения-переключателя. Это указывает на то, что опыт SVC лучше для людей и разработчиков сегодня, и, вероятно, будет лучшим решением в долгосрочной перспективе. По этой причине последний Facebook SDK для iOS использует SVC как опыт по умолчанию для входа.
Ответ 9
Это сработало для меня. Добавьте это в свой .plist
.
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fb</string>
</array>
Для iOS9 нам нужно добавить ключ к нашим .plist
для URL-схем.
Ответ 10
Я знаю, что он старый. Но вы можете поместить этот код в свой application:(UIApplication *)application didFinishLaunchingWithOptions:
SEL useNativeSel = sel_getUid("useNativeDialogForDialogName:");
Class FBSDKServerConfiguration = NSClassFromString(@"FBSDKServerConfiguration");
Method useNativeMethod = class_getInstanceMethod(FBSDKServerConfiguration, useNativeSel);
IMP returnYES = imp_implementationWithBlock(^BOOL(id me, id dialogName) {
return YES;
});
method_setImplementation(useNativeMethod, returnYES);
И FacebookSDK
войдет через собственное приложение, когда приложение будет установлено вместо браузера.
Ответ 11
Поместив это в appdelegate, я решил проблему
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])
}
Ответ 12
Добавление ниже строк в файл .plist
помогло мне:
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fbapi20130214</string>
<string>fbapi20130410</string>
<string>fbapi20130702</string>
<string>fbapi20131010</string>
<string>fbapi20131219</string>
<string>fbapi20140410</string>
<string>fbapi20140116</string>
<string>fbapi20150313</string>
<string>fbapi20150629</string>
<string>fbauth</string>
<string>fbauth2</string>
<string>fb-messenger-api20140430</string>
</array>