ios - FBSDKLoginManager.loginWithReadPermissions 不在 iOS 上调用处理程序

标签 ios facebook swift

简化一下,代码是这样的:

func login() {
     NSLog("Will login with read permissions")
     FBSDKLoginManager().logInWithReadPermissions(
            ["public_profile"],
            handler: {
                (result: FBSDKLoginManagerLoginResult!, error: NSError!) -> Void in
                    NSLog("Handler is called")
            })
     NSLog("Returning from login")
}

调用时,它会生成以下日志语句:

2015-05-25 11:35:07.886 MyApp[1213:646722] Will login with read permissions
2015-05-25 11:44:22.048 MyApp[1213:646722] Returning from login

(上述语句之间的较大时间差异是由于我使用调试器单步执行 logInWithReadPermissions 的内部结构。在没有调试器的情况下运行不会改变行为。)

我已经在安装了 Facebook native 应用程序并登录的设备上尝试过此操作,我也曾在没有 native 应用程序的设备上尝试过此操作,但我根本没有访问过 Facebook。我也在模拟器上试过这个。我得到了相同的结果。

我假设这是一个同步调用,但为了以防万一,我尝试在调用线程中无限期地等待——处理程序仍然没有被调用,并且设备上没有发生任何可见的事情。

我打开了我能找到的所有日志记录:

FBSDKSettings.setLoggingBehavior(
   [FBSDKLoggingBehaviorAppEvents,
    FBSDKLoggingBehaviorInformational,
    FBSDKLoggingBehaviorAccessTokens,
    FBSDKLoggingBehaviorUIControlErrors,
    FBSDKLoggingBehaviorGraphAPIDebugWarning,
    FBSDKLoggingBehaviorGraphAPIDebugInfo,
    FBSDKLoggingBehaviorNetworkRequests,
    FBSDKLoggingBehaviorCacheErrors,
    FBSDKLoggingBehaviorDeveloperErrors])

然后,在启动时,我得到以下任一信息:

2015-05-25 11:35:01.320 MyApp[1213:646722] FBSDKLog: Request <#1111>:
  URL:  https://graph.facebook.com/v2.3
  Method:   POST
  UserAgent:    FBiOSSDK.4.1.0
  MIME: multipart/form-data; boundary=3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f
  Body (w/o attachments):   
    batch_app_id:   140xxxxxxxxxxxxx
    batch:  [{"relative_url":"140xxxxxxxxxxxxx?debug=info&fields=app_events_feature_bitmask%2Cname%2Cios_dialog_configs%2Csupports_implicit_sdk_logging%2Cgdpv4_nux_enabled%2Cgdpv4_nux_content%2Cios_supports_system_auth%2Cios_sdk_error_categories&format=json&include_headers=false&sdk=ios","method":"GET"},{"relative_url":"140xxxxxxxxxxxxx?debug=info&fields=app_events_feature_bitmask%2Cname%2Cios_dialog_configs%2Csupports_implicit_sdk_logging%2Cgdpv4_nux_enabled%2Cgdpv4_nux_content%2Cios_supports_system_auth%2Cios_sdk_error_categories&format=json&include_headers=false&sdk=ios","method":"GET"}]

2015-05-25 11:35:01.321 MyApp[1213:646722] FBSDKLog: Request <#1111>:
  URL:  https://graph.facebook.com/v2.3
  Method:   POST
  UserAgent:    FBiOSSDK.4.1.0
  MIME: multipart/form-data; boundary=3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f

2015-05-25 11:35:01.329 MyApp[1213:646722] FBSDKLog: FBSDKTimeSpentData Restore: {"numInterruptions":0,"lastSuspendTime":1432544336,"secondsSpentInCurrentSession":3}
2015-05-25 11:35:01.363 MyApp[1213:646722] FBSDKLog: FBSDKAppEvents: Recording event @ 1432578901: {
    "_eventName" = "fb_mobile_activate_app";
    "_logTime" = 1432578901;
    "_ui" = UIAlertController;
    "fb_mobile_launch_source" = Unclassified;
}
2015-05-25 11:35:01.364 MyApp[1213:646722] FBSDKLog: FBSDKAppEvents Persist: Read 0 event states. First state has 0 events
2015-05-25 11:35:01.364 MyApp[1213:646722] FBSDKLog: FBSDKAppEvents Persist: Clearing
2015-05-25 11:35:01.365 MyApp[1213:646722] FBSDKLog: FBSDKAppEvents: Recording event @ 1432578901: {
    "_eventName" = "fb_mobile_deactivate_app";
    "_logTime" = 1432578901;
    "_ui" = UIAlertController;
    "_valueToSum" = 3;
    "fb_mobile_app_interruptions" = 0;
    "fb_mobile_launch_source" = Unclassified;
    "fb_mobile_time_between_sessions" = "session_quanta_5";
}
2015-05-25 11:35:01.781 MyApp[1213:646722] FBSDKLog: FBSDKURLConnection <#1114>:
  Duration: 460 msec
Response Size: 1 kB
  MIME type: application/json
2015-05-25 11:35:01.783 MyApp[1213:646722] FBSDKLog: Response <#1111>
Duration: 461 msec
Size: 2011 kB
Response Body:
(
        {
        body =         {
            "app_events_feature_bitmask" = 1;
            "gdpv4_nux_content" = "New! You're in control - choose what info you want to share with apps.";
            "gdpv4_nux_enabled" = 0;
            id = 140xxxxxxxxxxxxx;
            "ios_dialog_configs" =             {
                data =                 (
                                        {
                        name = like;
                        url = "/connect/dialog/MPlatformLikeJSDialog";
                        versions =                         (
                            20140410
                        );
                    },
                                        {
                        name = appinvites;
                        url = "/connect/dialog/MPlatformAppInvitesJSDialog";
                        versions =                         (
                            20140410
                        );
                    }
                );
            };
            "ios_sdk_error_categories" =             (
                                {
                    items =                     (
                                                {
                            code = 102;
                        },
                                                {
                            code = 190;
                        }
                    );
                    name = login;
                    "recovery_message" = "Please log into this app again to reconnect your Facebook account.";
                    "recovery_options" =                     (
                        OK,
                        Cancel
                    );
                },
                                {
                    items =                     (
                                                {
                            code = 341;
                        },
                                                {
                            code = 9;
                        },
                                                {
                            code = 2;
                        },
                                                {
                            code = 4;
                        },
                                                {
                            code = 17;
                        }
                    );
                    name = transient;
                    "recovery_message" = "The server is temporarily busy, please try again.";
                    "recovery_options" =                     (
                        OK
                    );
                }
            );
            "ios_supports_system_auth" = 1;
            name = MyApp;
            "supports_implicit_sdk_logging" = 1;
        };
        code = 200;
    },
        {
        body =         {
            "app_events_feature_bitmask" = 1;
            "gdpv4_nux_content" = "New! You're in control - choose what info you want to share with apps.";
            "gdpv4_nux_enabled" = 0;
            id = 140xxxxxxxxxxxxx;
            "ios_dialog_configs" =             {
                data =                 (
                                        {
                        name = like;
                        url = "/connect/dialog/MPlatformLikeJSDialog";
                        versions =                         (
                            20140410
                        );
                    },
                                        {
                        name = appinvites;
                        url = "/connect/dialog/MPlatformAppInvitesJSDialog";
                        versions =                         (
                            20140410
                        );
                    }
                );
            };
            "ios_sdk_error_categories" =             (
                                {
                    items =                     (
                                                {
                            code = 102;
                        },
                                                {
                            code = 190;
                        }
                    );
                    name = login;
                    "recovery_message" = "Please log into this app again to reconnect your Facebook account.";
                    "recovery_options" =                     (
                        OK,
                        Cancel
                    );
                },
                                {
                    items =                     (
                                                {
                            code = 341;
                        },
                                                {
                            code = 9;
                        },
                                                {
                            code = 2;
                        },
                                                {
                            code = 4;
                        },
                                                {
                            code = 17;
                        }
                    );
                    name = transient;
                    "recovery_message" = "The server is temporarily busy, please try again.";
                    "recovery_options" =                     (
                        OK
                    );
                }
            );
            "ios_supports_system_auth" = 1;
            name = MyApp;
            "supports_implicit_sdk_logging" = 1;
        };
        code = 200;
    }
)

2015-05-25 11:35:01.841 MyApp[1213:646722] FBSDKLog: Dynamically loaded library at /System/Library/Frameworks/Accounts.framework/Accounts

或者这个:

2015-05-25 12:04:59.336 MyApp[1221:650047] FBSDKLog: FBSDKTimeSpentData Restore: {"numInterruptions":0,"lastSuspendTime":1432544336,"secondsSpentInCurrentSession":3}
2015-05-25 12:04:59.343 MyApp[1221:650047] FBSDKLog: FBSDKAppEvents: Recording event @ 1432580699: {
    "_eventName" = "fb_mobile_activate_app";
    "_logTime" = 1432580699;
    "_ui" = UIAlertController;
    "fb_mobile_launch_source" = Unclassified;
}
2015-05-25 12:04:59.344 MyApp[1221:650047] FBSDKLog: FBSDKAppEvents Persist: Read 0 event states. First state has 0 events
2015-05-25 12:04:59.344 MyApp[1221:650047] FBSDKLog: FBSDKAppEvents Persist: Clearing
2015-05-25 12:04:59.345 MyApp[1221:650047] FBSDKLog: FBSDKAppEvents: Recording event @ 1432580699: {
    "_eventName" = "fb_mobile_deactivate_app";
    "_logTime" = 1432580699;
    "_ui" = UIAlertController;
    "_valueToSum" = 3;
    "fb_mobile_app_interruptions" = 0;
    "fb_mobile_launch_source" = Unclassified;
    "fb_mobile_time_between_sessions" = "session_quanta_5";
}

无论哪种方式,我的处理程序都不会被调用,但 logInWithReadPermissions 函数返回正常。

我已经在我的 AppDelegate 中实现了以下所有内容:

func application(application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

   FBSDKApplicationDelegate.sharedInstance().application(
       application,
       didFinishLaunchingWithOptions: launchOptions)
}

func applicationDidBecomeActive(application: UIApplication) {
    FBSDKAppEvents.activateApp()
}

func application(application: UIApplication,
                 openURL url: NSURL,
                 sourceApplication: String?,
                 annotation: AnyObject?) -> Bool {

    return FBSDKApplicationDelegate.sharedInstance().application(
        application,
        openURL: url,
        sourceApplication: sourceApplication,
        annotation: annotation)
}

我的 Info.plist 中有这些行:

<array>
    <dict>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>fb140xxxxxxxxxxxxx</string>
        </array>
    </dict>
</array>
<key>FacebookAppID</key>
<string>140xxxxxxxxxxxxx</string>
<key>FacebookDisplayName</key>
<string>MyApp</string>

上面有什么我遗漏的吗?如果没有,我该如何进一步调试呢?我可以打开或关闭任何日志记录吗?我在 XCode 或 Facebook 端的应用程序设置中有任何人能想到我可以查看的内容吗?

最佳答案

你说:

"I tried waiting indefinitely in the calling thread -- the handler is still never called, and nothing visible is happening on the device."

这个调用绝对不是同步的,如果你让主线程在一个紧凑的等待循环中忙碌,那么它就无法“给你回电话”。

另一件要检查的事情是确保您的应用程序委托(delegate)没有同时实现

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {

如果您在应用委托(delegate)中实现此方法,则其他实现将被忽略:

func application(application: UIApplication,
                 openURL url: NSURL,
                 sourceApplication: String?,
                 annotation: AnyObject?) -> Bool

关于ios - FBSDKLoginManager.loginWithReadPermissions 不在 iOS 上调用处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30444761/

相关文章:

android - 如何为新项目禁用 Firestore 数据存储模式并切换到 native 模式

java - 使用图形 API 获取用户相册中的照片的链接是什么?

android - 安装 facebook 应用程序后,Facebook 登录不起作用

ios - 如何减少此流代码中的能量影响

在方法中用作类型的 Swift 协议(protocol)不接受相同协议(protocol)的实例

ios - EXC_BAD_ACCESS 使用 gmaps sdk 1.9.0,Xcode 6.4,在 8.3 设备上运行

ios - CoreBluetooth 状态保存 : correct way to restore CBCentralManager

php - Facebook 发送按钮以一种奇怪的方式弹出 - 如何修复它

ios - 无法将类对象分配给 Swift 3 中另一个类对象的字典成员

ios - 确定细胞的当前状态