簡體   English   中英

在iOS 9中,本地Facebook應用程序無法通過Facebook登錄打開

[英]Native Facebook app does not open with Facebook login in iOS 9

我已經將iPhone 6 plus更新到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應用程序。

以下是新“Facebook登錄”的完整流程。


這是我修改我的Facebook登錄集成以使其在最新更新上工作的方式。

Xcode 7.xiOS 9Facebook SDK 4.x.

步驟1。 下載最新的Facebook SDK(包括重大更改)。

第2步。 FBSDKCoreKit.frameworkFBSDKLoginKit.framework添加到您的項目中。

步驟3。 現在轉到Project> Build Phases>添加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現在為白名單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。 現在我們需要修改Login Controller,我們在那里執行Login任務

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帖子和谷歌。

這是設計的。 Facebook仍然存在iOS9的一些問題。

請參閱Facebook團隊回復: https//developers.facebook.com/bugs/786729821439894/? search_id謝謝

最后我將我的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 vs native war”)。

@dan是對的。 為了在iOS 9上為用戶提供最佳體驗,新SDK會自動確定最佳登錄流程。 如果您在iOS 8或更早版本上運行,則仍會首選應用程序切換。

默認情況下,Safari視圖控制器位於Facebook SDK中。 對於那些想要恢復以前經驗的人,請參閱下文。 它僅適用於3.x SDK,這不適用於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提供了最佳的用戶體驗 - 他們認為或肯定地知道他們的用戶沒有登錄Safari中的Facebook,但確實登錄了Facebook App 。

在設置了本專欄中提到的所有必要的.plist密鑰之后,我使用了以下解決方案來解決登錄問題。

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

因此它始終在應用程序中登錄。

隨着iOS 9的發布,Apple對應用切換進行了一些重大改變。 這影響了與Facebook集成的iOS 9應用程序。 大多數人會在使用Facebook登錄的經驗中注意到這一點。 在使用最新SDK(v4.6和v3.24)的應用程序中,我們將使用Safari視圖控制器(SVC)而不是快速應用程序切換(FAS)來顯示流程,因為其他對話框插頁式廣告會為其添加額外的步驟在iOS 9上的FAS中登錄過程。此外,我們從超過250個應用程序中看到的數據表明,從長遠來看,這對於人們來說是最好的體驗。 請繼續閱讀以了解詳情。 https://developers.facebook.com/blog/post/2015/10/29/Facebook-Login-iOS9

Facebook改變了iOS9的Facebook登錄行為。

以下是Facebook博客文章的引用:

自iOS 9推出以來,我們一直在監控超過250個應用的數據和點擊率。 SVC登錄的點擊率(CTR)優於app-switch登錄的點擊率,並且以app-switch體驗的3倍速度提升。 這表明SVC體驗對於今天的人和開發人員來說更好,並且從長遠來看可能是最好的解決方案。 因此,最新的iOS SDK SDK使用SVC作為Login的默認體驗。

這對我有用。 將其添加到.plist

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

對於iOS9,我們需要為URL Schemes添加.plist密鑰。

我知道它已經老了。 但是您可以將此代碼放到您的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將通過本機應用程序登錄。

把這個放在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])
    }

.plist添加到.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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM