#FacebookLikeView
FacebookLikeView is a Facebook Like button that fits nicely into your native iOS application. It integrates with the Facebook iOS SDK so that already-authenticated users can "like" with a single tap, and unauthenticated users can are prompted with the native login dialog.
It comes with some caveats; it's not officially supported by Facebook, and it requires your application to use the in-app auth dialog rather than single sign-on via Safari or the Facebook app.
To see FacebookLikeView in action, build the included FacebookLikeViewDemo
project.
#Getting Started
-
If you haven't already installed the Facebook iOS SDK, add the files in the
FBConnect
directory to your project. -
Add the files in the
FacebookLikeView
directory to your Xcode project. -
Instantiate a FacebookLikeView programmatically or in a nib. Either way works!
-
Set the URL to be liked, plus any other attributes you'd like to customize. Make sure the
layout
you choose fits within the view's bounds._facebookLikeView.href = [NSURL URLWithString:@"http://www.yardsellr.com"]; _facebookLikeView.layout = @"button_count"; _facebookLikeView.showFaces = NO;
-
Set a delegate that implements
facebookLikeViewRequiresLogin:
. It should call-[Facebook authorize:delegate:]
and then reload the FacebookLikeView once login is complete._facebookLikeView.delegate = self; ... - (void)facebookLikeViewRequiresLogin:(FacebookLikeView *)aFacebookLikeView { [_facebook authorize:[NSArray array] delegate:self]; } - (void)fbDidLogin { [_facebookLikeView load]; }
-
Finally, call
-[FacebookLikeView load]
before you display the view. You should also call this method any time the user signs in or out of Facebook, and after modifying any of the FacebookLikeView's properties.
#More Callbacks
You may want to be notified when a user likes or dislikes you. Just implement the following methods in FacebookLikeView's delegate:
- (void)facebookLikeViewDidLike:(FacebookLikeView *)aFacebookLikeView;
- (void)facebookLikeViewDidUnlike:(FacebookLikeView *)aFacebookLikeView;
To avoid showing the Like button before it's completely rendered, try hiding your FacebookLikeView until you receive this callback:
- (void)facebookLikeViewDidRender:(FacebookLikeView *)aFacebookLikeView;
#Staying Logged In Since the shared cookie store in an iOS application is not guaranteed to persist when the app terminates, FacebookLikeView is liable to prompt the user to log in multiple times over multiple uses of the app. If you'd rather have the user log in just once, you need to persist cookies between launches.
Here's one way to implement that in the application delegate:
#define SavedHTTPCookiesKey @"SavedHTTPCookies"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSData *cookiesData = [[NSUserDefaults standardUserDefaults]
objectForKey:SavedHTTPCookiesKey];
if (cookiesData) {
NSArray *cookies = [NSKeyedUnarchiver unarchiveObjectWithData:cookiesData];
for (NSHTTPCookie *cookie in cookies)
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
}
...
}
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSData *cookiesData = [NSKeyedArchiver archivedDataWithRootObject:
[[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]];
[[NSUserDefaults standardUserDefaults] setObject:cookiesData
forKey:SavedHTTPCookiesKey];
}
#How It Works
FacebookLikeView is just a UIWebView that contains the same XFBML one would use to display a Like button in a web-based application. Since FacebookLikeView shares cookies with all other UIWebViews in your app, a user that has already signed in using Facebook's in-app auth dialog does not need to sign in again to use this Like button. FacebookLikeView does not have access to cookies owned by Safari or the Facebook app, so it monkeypatches the Facebook iOS SDK to never use those apps for auth.
Unlike a plain UIWebView, FacebookLikeView does not allow itself be redirected away from the Like button. If redirected to the Facebook login page, it ignores the redirect and calls the delegate method facebookLikeViewRequiresLogin:
so that you may present the native login dialog instead.
FacebookLikeView monitors like/unlike events using event.subscribe. When one of those events fires, a bit of JavaScript running inside the web view encodes the event data into a URL request that is intercepted by native code, which then calls the appropriate delegate method.
#Caveats
FacebookLikeView is not supported by Facebook and will break if certain undocumented parameters change. In particular, FacebookLikeView assumes that the URL of the Facebook login redirect does not change and that only content from domains facebook.com
and fbcdn.net
should ever be loaded.
FacebookLikeView is also not guaranteed to work with future versions of the Facebook iOS SDK. To ensure compatibility, use the snapshot of the SDK contained in the FBConnect
directory.