我已经按照适用于 iOS 9 的 facebook-iso-sdk 4.8.0 文档中描述的每个步骤进行操作,但仍然无法在我的应用程序中对“login-with-facebook”执行应用程序切换,即使 facebook 应用程序是已经安装。
正如您在下面的屏幕截图中看到的,我已经修改了 info.plist,但仍然无法让 native 应用程序切换工作。
我还仔细检查了 info.plist 值中的拼写错误。我可以向你保证他们是正确的。
这是我的代码:-
if (![AppDelegate SharedInstance].login) {
[AppDelegate SharedInstance].login = [[FBSDKLoginManager alloc] init];
}
[AppDelegate SharedInstance].login.loginBehavior = FBSDKLoginBehaviorNative;
[[AppDelegate SharedInstance].login logInWithReadPermissions:@[@"public_profile",@"email",@"user_friends"] fromViewController:self handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
if (error) {
}
else if (result.isCancelled)
{
// Handle cancellations
}
else
{
NSLog(@"result.grantedPermissions == %@",result.grantedPermissions);
if (result.token)
{
[[[FBSDKGraphRequest alloc] initWithGraphPath:@"me" parameters:@{@"fields": @"id, name, email, first_name, last_name"}]
startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
if (!error) {
NSLog(@"fetched user:%@", result);
NSString *userImageURL = [NSString stringWithFormat:@"https://graph.facebook.com/%@/picture?type=large", [result objectForKey:@"id"]];
[dictFacebookDetail addEntriesFromDictionary:result];
[dictFacebookDetail setObject:userImageURL forKey:@"profilepic"];
NSLog(@"facebook login result --- %@",dictFacebookDetail);
[self performSelectorInBackground:@selector(CheckFacebookUser:) withObject:dictFacebookDetail];
}
}];
}
}
}];
我错过了什么?
最佳答案
我找到了解决方案,但您应该在 FBSDKLogin pod 中更改一些内容。我正在调试 Pod,我意识到 Facebook 在类 FBSDKServerConfiguration
中询问应用程序的服务器配置。它返回一个包含一些信息的 JSON 来为我们的应用程序配置 Pod。我意识到默认情况下 JSON 返回这个字典:
"ios_sdk_dialog_flows" = {
default = {
"use_native_flow" = 0;
"use_safari_vc" = 1;
};
message = {
"use_native_flow" = 1;
};
};
默认情况下 use_native_flow
为 0,因此当它在 userDefaults
中保存信息以供下次应用启动时使用。
因此,当应用程序调用 FBSDKLoginMananger
登录方法并检查此方法中的 loginBehaviour 时,变量 useNativeDialog
返回 NO。所以开关使用下一个案例。 案例 FBSDKLoginBehaviorBrowser:
- (void)logInWithBehavior:(FBSDKLoginBehavior)loginBehavior
{
.
.
...
switch (loginBehavior) {
case FBSDKLoginBehaviorNative: {
if ([FBSDKInternalUtility isFacebookAppInstalled]) {
[FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:^(FBSDKServerConfiguration *serverConfiguration, NSError *loadError) {
BOOL useNativeDialog = [serverConfiguration useNativeDialogForDialogName:FBSDKDialogConfigurationNameLogin];
if (useNativeDialog && loadError == nil) {
[self performNativeLogInWithParameters:loginParams handler:^(BOOL openedURL, NSError *openedURLError) {
if (openedURLError) {
[FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors
formatString:@"FBSDKLoginBehaviorNative failed : %@\nTrying FBSDKLoginBehaviorBrowser", openedURLError];
}
if (openedURL) {
completion(YES, FBSDKLoginManagerLoggerAuthMethod_Native, openedURLError);
} else {
[self logInWithBehavior:FBSDKLoginBehaviorBrowser];
}
}];
} else {
[self logInWithBehavior:FBSDKLoginBehaviorBrowser];
}
}];
break;
}
// intentional fall through.
}
case FBSDKLoginBehaviorBrowser: {
.
.
.
}
正如我们在代码中看到的,我们知道应用程序是否安装在这个if中,
if ([FBSDKInternalUtility isFacebookAppInstalled])
。
为了解决这个问题,我改变了这一行
BOOL useNativeDialog = [serverConfiguration useNativeDialogForDialogName:FBSDKDialogConfigurationNameLogin];
到
BOOL useNativeDialog = YES;
我知道这不是一个好的做法,如果我更新这个 Pod,它会改变,但至少在工作,我现在需要它。 我想我们可以在 facebook 开发人员管理站点中更改该配置,但我还没有找到任何东西。
关于ios - Facebook native 登录不会打开 facebook 应用程序,即使它已安装在设备中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33971727/