iOS Facebook自定义登录首次安装时无响应

时间:2016-09-28 15:39:46

标签: ios objective-c facebook login

对于我正在开发的应用程序,我正在添加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>

任何人都能看到我失踪的东西?

1 个答案:

答案 0 :(得分:0)

我发现了问题。由于我在身份验证功能中实例化了FBLoginManager,因此在loginWithPermissions仍在处理时将取消分配。但是,这导致对登录管理器的弱引用不再具有适当的值。

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];移动到initalizer并在整个会话中存储登录修复了我的问题。事实上,这只发生在第一次设置时可能与需要更长时间才能完成相关,这增加了登录被解除分配的可能性。