简化,代码是这样的: func login() { NSLog("Will login with read permissions") FBSDKLoginManager().logInWithReadPermissions( ["public_profile"], handler: { (result: FBSDKLoginManagerLoginResult!, error: NSError!) - Void in NSLog("Han
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原生应用程序并且我已登录的设备上试过这个,我在没有本机应用程序的设备上试过这个,我从来没有访问过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.”
这个调用绝对不是同步的,如果你让主线程忙于紧密的等待循环,那么它将无法“回电”.
要检查的另一件事是确保您的应用程序委托也没有实现
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
如果在app delegate中实现此方法,则将忽略其他实现:
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool