![](/img/trans.png)
[英]IOS 9 Swift - Parse Facebook login does not open native Facebook App
[英]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.x , iOS 9 , Facebook SDK 4.x.
步驟1。 下載最新的Facebook SDK(包括重大更改)。
第2步。 將FBSDKCoreKit.framework和FBSDKLoginKit.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.