对于我正在开发的应用程序,我正在添加Facebook Login SDK。我之前已经为其他应用程序做过这样的事情,但我在这个应用程序中遇到了一些意想不到的行为。出于某种原因,安装后第一次启动应用程序时,按(自定义)Facebook登录按钮无法打开预期会出现的Safari登录屏幕。永远不会调用登录事件的处理程序,这使我甚至无法显示错误。
以前有人见过这个吗?
代码: AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[FBSDKApplicationDelegate sharedInstance] application:application
didFinishLaunchingWithOptions:launchOptions];
// Some other setup code
return YES;
}
- (BOOL) application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<NSString *,id> *)options
{
BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:app
openURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]
];
handled |= [GIDSignIn.sharedInstance handleURL:url
sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
return handled;
}
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
{
BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation];
handled |= [GIDSignIn.sharedInstance handleURL:url sourceApplication:sourceApplication annotation:annotation];
return handled;
}
自定义Facebook身份验证器:
-(void)authenticate: (UIViewController *) viewController onCompletion: (void (^)(NSMutableDictionary *bundle, NSError *error))completion {
successBundle = [BundleUtils generateBundle:YES];
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logInWithReadPermissions: permissions
fromViewController:viewController
handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
// Never Reached
}];
}
以及相关的info.plist部分(其中自定义变量在UserDefined变量中为每个正在使用的构建配置声明)
<plist version="1.0">
<dict>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>fb${FacebookAppId}</string>
</array>
</dict>
</array>
<key>FacebookAppID</key>
<string>${FacebookAppId}</string>
<key>FacebookDisplayName</key>
<string>${FacebookAppName}</string>
<key>LSApplicationQueriesSchemes</key>
<array>
<string>fbapi</string>
<string>fb-messenger-api</string>
<string>fbauth2</string>
<string>fbshareextension</string>
</array>
</dict>
</plist>
任何人都能看到我失踪的东西?
答案 0 :(得分:0)
我发现了问题。由于我在身份验证功能中实例化了FBLoginManager,因此在loginWithPermissions
仍在处理时将取消分配。但是,这导致对登录管理器的弱引用不再具有适当的值。
将FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
移动到initalizer并在整个会话中存储登录修复了我的问题。事实上,这只发生在第一次设置时可能与需要更长时间才能完成相关,这增加了登录被解除分配的可能性。