Bhu*_*tre 52 facebook objective-c ios facebook-login ios9
我已经将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"
Run Code Online (Sandbox Code Playgroud)
我正在使用以下方法来执行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];
}
Run Code Online (Sandbox Code Playgroud)
我在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>
Run Code Online (Sandbox Code Playgroud)
请让我知道我在这里缺少什么.首先它正在检查iPhone device Setting-> Facebook credentials但从未打开Facebook应用程序进行登录.似乎它无法识别设备上安装的Facebook应用程序.
swi*_*Boy 54
以下是新"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文件中有以下内容
Run Code Online (Sandbox Code Playgroud)<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来说是必须的
Run Code Online (Sandbox Code Playgroud)<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方案
Run Code Online (Sandbox Code Playgroud)<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语句,(删除旧语句).
Run Code Online (Sandbox Code Playgroud)#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];
}
Run Code Online (Sandbox Code Playgroud)
步骤-6.现在我们需要修改Login Controller,我们在那里执行Login任务
6.1在Login ViewController.m中添加这些导入
Run Code Online (Sandbox Code Playgroud)#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];
Run Code Online (Sandbox Code Playgroud)
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"];
}
}
}];
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}];
}
}
Run Code Online (Sandbox Code Playgroud)
步骤-7.现在你可以建立项目,你应该到屏幕下方.
希望这会帮助你们.
参考文献:感谢Facebook文档,Stackoverflow帖子和谷歌.
小智 33
这是设计的.Facebook仍然存在iOS9的一些问题.
请参阅Facebook团队回复:https://developers.facebook.com/bugs/786729821439894/? search_id 谢谢
Mik*_*e.R 11
最后我将我的Podfile更改为以前的FB版本:
来自:
pod 'FBSDKCoreKit'
pod 'FBSDKLoginKit'
pod 'FBSDKShareKit'
至:
pod 'FBSDKCoreKit','~>4.5.1'
pod 'FBSDKLoginKit','~>4.5.1'
pod 'FBSDKShareKit','~>4.5.1'
Run Code Online (Sandbox Code Playgroud)
从我的角度来看,Facebook应检查用户的最后一次登录,并根据它触发正确的登录流程.(并让小型开发人员远离"web vs native war").
| 归档时间: |
|
| 查看次数: |
43602 次 |
| 最近记录: |