![](/img/trans.png)
[英]Facebook login in IOS works on emulator but not on device with native app installed
[英]Facebook native login is not opening facebook app even if it's installed in device?
我已经按照facebook-iso-sdk 4.8.0 for iOS 9的文档中描述的每个步骤进行了操作,但仍然无法在我的应用程序中使用“login-with-facebook”进行应用程序切换,即使已经安装了facebook app。
正如您在下面的屏幕截图中看到的,我已经修改了info.plist,但仍然无法让本机应用程序切换工作。
我还检查了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。 所以交换机使用下一个案例。 case 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, if ([FBSDKInternalUtility isFacebookAppInstalled])
。 为了解决这个问题,我改变了这一行
BOOL useNativeDialog = [serverConfiguration useNativeDialogForDialogName:FBSDKDialogConfigurationNameLogin];
至
BOOL useNativeDialog = YES;
我知道这不是一个好习惯,如果我更新这个Pod,它会改变,但至少是工作,我现在需要它。 我想我们可以在facebook开发者管理网站上更改该配置,但我还没有找到任何内容。
Facebook改变了iOS9的Facebook登录行为。
以下是Facebook博客文章的引用:
自iOS 9推出以来,我们一直在监控超过250个应用的数据和点击率。 SVC登录的点击率(CTR)优于app-switch登录的点击率,并且以app-switch体验的3倍速度提升。 这表明SVC体验对于今天的人和开发人员来说更好,并且从长远来看可能是最好的解决方案。 因此,最新的iOS SDK SDK使用SVC作为Login的默认体验。
typedef NS_ENUM(NSUInteger, FBSDKLoginBehavior)
{
/*!
@abstract This is the default behavior, and indicates logging in through the native
Facebook app may be used. The SDK may still use Safari instead.
*/
FBSDKLoginBehaviorNative = 0,
/*!
@abstract Attempts log in through the Safari or SFSafariViewController, if available.
*/
FBSDKLoginBehaviorBrowser,
/*!
@abstract Attempts log in through the Facebook account currently signed in through
the device Settings.
@note If the account is not available to the app (either not configured by user or
as determined by the SDK) this behavior falls back to \c FBSDKLoginBehaviorNative.
*/
FBSDKLoginBehaviorSystemAccount,
/*!
@abstract Attemps log in through a modal \c UIWebView pop up
@note This behavior is only available to certain types of apps. Please check the Facebook
Platform Policy to verify your app meets the restrictions.
*/
FBSDKLoginBehaviorWeb,
};
有很多行为可以访问fb login.try使用备用你喜欢的东西。
FBSDKLoginManager *loginmanager = [[FBSDKLoginManager alloc] init];
loginmanager.loginBehavior=FBSDKLoginBehaviorNative;
喜欢这个...希望这会对你有所帮助:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.