获得权限后 Facebook 登录让 Safari 空白页面打开而不是重定向到 iOS 10 和 iOS 11 中的我的应用程序
Facebook login after get permissions let Safari blank page open instead of redirect to my app in iOS 10 and iOS 11
我正在我的应用程序中实施 Facebook 登录。
除 Facebook 获得权限后重定向到我的应用程序外,一切正常属性。
处理打开 Safari 空白页面而不是重定向到我的应用程序。我在许多论坛和其他 Stack Overflow 问题中阅读了关于 iOS 9 中类似问题的问题,该问题已在 AppDelegate 中使用此代码修复:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id>
*)options {
return [[FBSDKApplicationDelegate sharedInstance]
application:application
openURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
}
return YES;
}
我已经检查过,当我授予 Facebook 权限时,这段代码可以正常工作,但仍然不会重定向到我的应用程序,只会重定向到一个新的 Safari 空白页面,我唯一的选择是按 OK 或 Done 按钮在 loginManager 方法中将我发送到 用户取消请求 案例
有我的FBLoginManger代码
self.manager =[[FBSDKLoginManager alloc] init];
NSArray *facebookPermissions = @[@"email", @"public_profile", @"user_friends"];
if ([FBSDKAccessToken currentAccessToken] != nil) {
[self.manager logOut];
//return
}
[self.manager logInWithReadPermissions: facebookPermissions fromViewController: self handler: ^(FBSDKLoginManagerLoginResult* result, NSError* error ) {
if (error != nil) {
//According to Facebook:
//Errors will rarely occur in the typical login flow because the login dialog
//presented by Facebook via single sign on will guide the users to resolve any errors.
NSLog(@"FACEBOOK LOGIN ERROR %@", error);
// Process error
[self.manager logOut];
} else if (result.isCancelled) {
// Handle cancellations
[self.manager logOut];
} else {
// If you ask for multiple permissions at once, you
// should check if specific permissions missing
BOOL allPermsGranted = true;
NSArray *grantedPermissions = [[result grantedPermissions] allObjects];
NSString *lastObject = [grantedPermissions lastObject];
for (NSString *permission in facebookPermissions) {
for (NSString* grantedPerm in grantedPermissions) {
NSRange range = [permission rangeOfString:grantedPerm];
if ((range.length == 0) && (grantedPerm == lastObject)) {
allPermsGranted = false;
} else {
break;
}
}
}
if (allPermsGranted) {
// Do work
//NSString * fbToken = [[result token] tokenString];
NSString * fbUserID = [[result token] userID];
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
initWithGraphPath:@"/me"
parameters:@{@"fields": @"id,name,email"}
HTTPMethod:@"GET"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
if (error == nil) {
NSDictionary *dict = @{
@"email" : [result objectForKey:@"email"] ,
@"providerID" : fbUserID,
@"username" : [result objectForKey:@"name"],
@"provider" : @"facebook"
};
NSLog(@"DICT %@", dict);
[self.delegate loginWithCredentials:dict];
[self logUserLoggedInWithFacebookEvent];
} else {
NSLog(@"ERROR FACEBOOK %@", error);
}
}];
} else {
//The user did not grant all permissions requested
//Discover which permissions are granted
//and if you can live without the declined ones
NSLog(@"FACEBOOK LOGIN ERROR");
[self.manager logOut];
}
}
}];
方法被调用但总是落入result.isCancelled
情况
我已经解决了删除 FBLoginButton 并将其替换为与调用 FBLoginManager 函数的 IBAction 关联的 UIButton 的错误。
答案是基于这个问题
以及 @MuraliMohan
的回答
我正在我的应用程序中实施 Facebook 登录。
除 Facebook 获得权限后重定向到我的应用程序外,一切正常属性。
处理打开 Safari 空白页面而不是重定向到我的应用程序。我在许多论坛和其他 Stack Overflow 问题中阅读了关于 iOS 9 中类似问题的问题,该问题已在 AppDelegate 中使用此代码修复:
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id>
*)options {
return [[FBSDKApplicationDelegate sharedInstance]
application:application
openURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
}
return YES;
}
我已经检查过,当我授予 Facebook 权限时,这段代码可以正常工作,但仍然不会重定向到我的应用程序,只会重定向到一个新的 Safari 空白页面,我唯一的选择是按 OK 或 Done 按钮在 loginManager 方法中将我发送到 用户取消请求 案例
有我的FBLoginManger代码
self.manager =[[FBSDKLoginManager alloc] init];
NSArray *facebookPermissions = @[@"email", @"public_profile", @"user_friends"];
if ([FBSDKAccessToken currentAccessToken] != nil) {
[self.manager logOut];
//return
}
[self.manager logInWithReadPermissions: facebookPermissions fromViewController: self handler: ^(FBSDKLoginManagerLoginResult* result, NSError* error ) {
if (error != nil) {
//According to Facebook:
//Errors will rarely occur in the typical login flow because the login dialog
//presented by Facebook via single sign on will guide the users to resolve any errors.
NSLog(@"FACEBOOK LOGIN ERROR %@", error);
// Process error
[self.manager logOut];
} else if (result.isCancelled) {
// Handle cancellations
[self.manager logOut];
} else {
// If you ask for multiple permissions at once, you
// should check if specific permissions missing
BOOL allPermsGranted = true;
NSArray *grantedPermissions = [[result grantedPermissions] allObjects];
NSString *lastObject = [grantedPermissions lastObject];
for (NSString *permission in facebookPermissions) {
for (NSString* grantedPerm in grantedPermissions) {
NSRange range = [permission rangeOfString:grantedPerm];
if ((range.length == 0) && (grantedPerm == lastObject)) {
allPermsGranted = false;
} else {
break;
}
}
}
if (allPermsGranted) {
// Do work
//NSString * fbToken = [[result token] tokenString];
NSString * fbUserID = [[result token] userID];
FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]
initWithGraphPath:@"/me"
parameters:@{@"fields": @"id,name,email"}
HTTPMethod:@"GET"];
[request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) {
if (error == nil) {
NSDictionary *dict = @{
@"email" : [result objectForKey:@"email"] ,
@"providerID" : fbUserID,
@"username" : [result objectForKey:@"name"],
@"provider" : @"facebook"
};
NSLog(@"DICT %@", dict);
[self.delegate loginWithCredentials:dict];
[self logUserLoggedInWithFacebookEvent];
} else {
NSLog(@"ERROR FACEBOOK %@", error);
}
}];
} else {
//The user did not grant all permissions requested
//Discover which permissions are granted
//and if you can live without the declined ones
NSLog(@"FACEBOOK LOGIN ERROR");
[self.manager logOut];
}
}
}];
方法被调用但总是落入result.isCancelled
情况
我已经解决了删除 FBLoginButton 并将其替换为与调用 FBLoginManager 函数的 IBAction 关联的 UIButton 的错误。
答案是基于这个问题