Simplified, the code is this:
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")
}
When this is called, it produces the following log statements:
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
(The large time difference between the statements above is due to me using the debugger to step through the internals of logInWithReadPermissions. Running without the debugger does not change the behavior.)
I have tried this on a device with the Facebook native app installed and me logged in, and I have tried this on a device without the native app where I had never accessed Facebook at all. I have also tried this on simulators. I get the same result.
I am assuming that this is a synchronous call, but just in case, I tried waiting indefinitely in the calling thread -- the handler is still never called, and nothing visible is happening on the device.
I turned on all the logging that I could find:
FBSDKSettings.setLoggingBehavior(
[FBSDKLoggingBehaviorAppEvents,
FBSDKLoggingBehaviorInformational,
FBSDKLoggingBehaviorAccessTokens,
FBSDKLoggingBehaviorUIControlErrors,
FBSDKLoggingBehaviorGraphAPIDebugWarning,
FBSDKLoggingBehaviorGraphAPIDebugInfo,
FBSDKLoggingBehaviorNetworkRequests,
FBSDKLoggingBehaviorCacheErrors,
FBSDKLoggingBehaviorDeveloperErrors])
Then, on startup, I am getting either this:
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
or this:
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";
}
Either way, my handler is never called, yet the logInWithReadPermissions function returns alright.
I have implemented all of the following in my 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)
}
I have these lines in my 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>
Anything I am missing in the above? If not, how do I go about debugging this further? Any logging that I can turn on or off? Anything in my app settings on either XCode or Facebook side anyone can think of that I could look at?
You said:
"I tried waiting indefinitely in the calling thread -- the handler is still never called, and nothing visible is happening on the device."
The call is definitely not synchronous, and if you keep the main thread busy in a tight wait loop, then it won't be able to "call you back".
Another thing to check is to make sure that your app delegate does not also implement
func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool {
If you implement this method in your app delegate, then the other implementation will be ignored:
func application(application: UIApplication,
openURL url: NSURL,
sourceApplication: String?,
annotation: AnyObject?) -> Bool
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With