无法在 iOS 上使用 Facebook 登录(SDK 无法构建身份验证 URL)
Unable to login with Facebook on iOS (SDK can't build auth URL)
我的具有 "Login with Facebook" 功能的全功能应用程序昨天停止工作了,原因不明。
我深入研究错误,发现由于某种原因无法在内部构建身份验证 URL,整个过程失败。
问题出在 FBSDKInternalUtility
class 中的 + (NSURL *)URLWithScheme:(NSString *)scheme host:(NSString *)host path:(NSString *)path queryParameters:(NSDictionary *)queryParameters error:(NSError *__autoreleasing *)errorRef
方法。
在第 430 行,它尝试构建 URL:
NSURL *URL = [[NSURL alloc] initWithString:[NSString stringWithFormat:
@"%@://%@%@%@",
scheme ?: @"",
host ?: @"",
path ?: @"",
queryString ?: @""]];
我已经逐步完成了代码。 scheme
、host
、path
和 queryString
均已设置。虽然它 returns nil
而不是 URL。我试过用空查询字符串调用该方法,它实际上构建了 URL。出于某种原因,queryString
导致 URL 无法正确构建。
这是 queryString
:(我已将我的应用 ID 替换为 123456789)
(lldb) po queryString
?auth_type=rerequest&client_id=123456789&default_audience=friends&display=touch&e2e={%22init%22%3A70747.196361124996}&fbapp_pres=1&redirect_uri=fb123456789%3A%2F%2Fauthorize%2F&response_type=token%2Csigned_request&return_scopes=true&scope=user_birthday%2Cemail%2Cuser_friends%2Cuser_photos&sdk=ios&sdk_version=4.39.0&state={%22challenge%22%3A%22yi8jE3mok79u9BheN8dzCMCviGY%253D%22%2C%220_auth_logger_id%22%3A%22329202ED-2F9B-4DBC-A191-E2C720D9779C%22%2C%22com.facebook.sdk_client_state%22%3Atrue%2C%223_method%22%3A%22sfvc_auth%22}
这可能是什么原因造成的?几天前它还在工作。
在模拟器上出现同样的错误后,我更详细地检查了对我的应用程序所做的更改。这是最新的 Facebook SDK (4.39)。我 运行 一个 pod update
来更新一些其他的 pods,这也将 Facebook SDK 从 4.38.1 更新到 4.39。
我恢复到 4.38.1,问题消失了。换句话说,Facebook SDK 4.39 破坏了他们自己的登录功能,实际上使他们自己的 SDK 变得无用。
如下强制使用旧版本修复了问题:
pod 'FBSDKCoreKit', '~> 4.38.1'
pod 'FBSDKLoginKit', '~> 4.38.1'
我的具有 "Login with Facebook" 功能的全功能应用程序昨天停止工作了,原因不明。
我深入研究错误,发现由于某种原因无法在内部构建身份验证 URL,整个过程失败。
问题出在 FBSDKInternalUtility
class 中的 + (NSURL *)URLWithScheme:(NSString *)scheme host:(NSString *)host path:(NSString *)path queryParameters:(NSDictionary *)queryParameters error:(NSError *__autoreleasing *)errorRef
方法。
在第 430 行,它尝试构建 URL:
NSURL *URL = [[NSURL alloc] initWithString:[NSString stringWithFormat:
@"%@://%@%@%@",
scheme ?: @"",
host ?: @"",
path ?: @"",
queryString ?: @""]];
我已经逐步完成了代码。 scheme
、host
、path
和 queryString
均已设置。虽然它 returns nil
而不是 URL。我试过用空查询字符串调用该方法,它实际上构建了 URL。出于某种原因,queryString
导致 URL 无法正确构建。
这是 queryString
:(我已将我的应用 ID 替换为 123456789)
(lldb) po queryString
?auth_type=rerequest&client_id=123456789&default_audience=friends&display=touch&e2e={%22init%22%3A70747.196361124996}&fbapp_pres=1&redirect_uri=fb123456789%3A%2F%2Fauthorize%2F&response_type=token%2Csigned_request&return_scopes=true&scope=user_birthday%2Cemail%2Cuser_friends%2Cuser_photos&sdk=ios&sdk_version=4.39.0&state={%22challenge%22%3A%22yi8jE3mok79u9BheN8dzCMCviGY%253D%22%2C%220_auth_logger_id%22%3A%22329202ED-2F9B-4DBC-A191-E2C720D9779C%22%2C%22com.facebook.sdk_client_state%22%3Atrue%2C%223_method%22%3A%22sfvc_auth%22}
这可能是什么原因造成的?几天前它还在工作。
在模拟器上出现同样的错误后,我更详细地检查了对我的应用程序所做的更改。这是最新的 Facebook SDK (4.39)。我 运行 一个 pod update
来更新一些其他的 pods,这也将 Facebook SDK 从 4.38.1 更新到 4.39。
我恢复到 4.38.1,问题消失了。换句话说,Facebook SDK 4.39 破坏了他们自己的登录功能,实际上使他们自己的 SDK 变得无用。
如下强制使用旧版本修复了问题:
pod 'FBSDKCoreKit', '~> 4.38.1'
pod 'FBSDKLoginKit', '~> 4.38.1'