web-dev-qa-db-ja.com

iOS 9でFacebookログインでネイティブFacebookアプリが開かない

IPhone 6プラスをiOS 9ベータ版に更新し、Facebookログインを実行しようとしましたが、そのたびにFacebookログインフォームでUIWebViewを表示しています。

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アプリを認識しないようです。

52

以下は新しい「Facebookログイン」の完全なプロセスです。


これが、最新のアップデートで動作するようにFacebook Login統合を修正した方法です。

Xcode 7.xiOS 9Facebook SDK 4.x

ステップ1。最新のFacebook SDKをダウンロードします(大きな変更が含まれています)。

ステップ2。 FBSDKCoreKit.frameworkFBSDKLoginKit.frameworkをプロジェクトに追加します。

ステップ-3。プロジェクト>ビルドフェーズ> add SafariServices.frameworkに移動します

ステップ-4。 info.plistの3つの変更確認する必要があります。

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ホワイトリストFacebookサーバーに以下を追加します。これは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ステートメントを追加します(古いステートメントを削除します)。

#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ログインでこれらのインポートを追加します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。これでプロジェクトをビルドできます。画面の下に表示されます。

enter image description here

これが皆さんに役立つことを願っています。

References:Facebookドキュメント、Stackoverflowの投稿、Googleに感謝します。

54
swiftBoy

これは仕様です。 FacebookにはまだiOS9に問題があります。

Facebookチームの回答をご覧ください: https://developers.facebook.com/bugs/786729821439894/?search_id ありがとう

33
user3492452

最後に、Podfileを以前のFBバージョンに変更しました。
から:

pod 'FBSDKCoreKit' pod 'FBSDKLoginKit' pod 'FBSDKShareKit'
に:

pod 'FBSDKCoreKit','~>4.5.1'
pod 'FBSDKLoginKit','~>4.5.1'
pod 'FBSDKShareKit','~>4.5.1'

私の観点からは、Facebookはユーザーの最後のログインをチェックし、それに基づいて正しいログインフローをトリガーする必要があります(そして、小さな開発者を「Web対ネイティブウォー」から守ります)。

11
Mike.R

Safari View ControllerはFacebook SDKのデフォルトです。以前のエクスペリエンスに戻したい場合は、以下を参照してください。3.xSDKでのみ機能し、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の2つのメソッドを切り替えます。

Objc/runtime.hヘッダーをインポートすることを忘れないでください:

#import <objc/runtime.h>

@ SimonCrossは、Safari View Controllerが最高のユーザーエクスペリエンスを提供していることを理解したくないだけです。 Facebookアプリで。

4

@ダンは正しい。 iOS 9のユーザーに最高のエクスペリエンスを提供するために、新しいSDKは最適なログインフローを自動的に決定します。 iOS 8以前で実行している場合、アプリの切り替えが引き続き優先されます。

4
Chris Pan

このコラムで述べたように必要なすべての.plistキーを設定した後、次の解決策を使用してログインの問題を解決しました。

var fbLoginManager : FBSDKLoginManager = FBSDKLoginManager()
fbLoginManager.loginBehavior = FBSDKLoginBehavior.Web

そのため、常にアプリケーションでログインします。

3
user5503563

IOS 9のリリースで、Appleはアプリの切り替えにいくつかの重要な変更を導入しました。これは、Facebookに統合されたiOS 9アプリに影響を与えています。ほとんどの人は、Facebookログインを使用した経験でこれに気付くでしょう。最新のSDK(v4.6およびv3.24)を使用するアプリでは、追加のダイアログインタースティシャルが追加のステップを追加するため、高速アプリ切り替え(FAS)の代わりにSafari View Controller(SVC)を使用してフローを表示しますiOS 9のFASでのログインプロセス。さらに、250を超えるアプリから見たデータは、これが長期的に人々にとって最高のエクスペリエンスであることを示しています。詳細をお読みください。 https://developers.facebook.com/blog/post/2015/10/29/Facebook-Login-iOS9

2

FacebookはiOS9のFacebookログイン動作を変更しました。

Facebookブログ投稿 からの引用です:

IOS 9のリリース以来、過去6週間にわたって250を超えるアプリのデータとCTRを監視しています。 SVCログインのクリックスルーレート(CTR)は、アプリスイッチログインのCTRよりも優れており、アプリスイッチエクスペリエンスの3倍の速度で向上しています。これは、SVCエクスペリエンスが今日の人々と開発者にとってより優れており、長期的には最適なソリューションになる可能性があることを示しています。このため、iOS用の最新のFacebook SDKは、ログインのデフォルトエクスペリエンスとしてSVCを使用します。

2
Haroun SMIDA

私はそれが古いことを知っています。ただし、このコードを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はネイティブアプリからログインします。

1
vien vu

これは私のために働いた。これを.plistに追加します。

<key>LSApplicationQueriesSchemes</key>
    <array>
        <string>fb</string>
    </array>

IOS9の場合、URLスキームの.plistにキーを追加する必要があります。

1
Sushil Sharma

これを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])
    }
0
Chanchal Raj