Подтвердить что ты не робот

Родное приложение для 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, установленное на устройстве.

4b9b3361

Ответ 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.

Ответ 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>