Using APIs Application APIs for a Facebook shared link from an iOS application

I honestly spent hours trying to get it to work. Unfortunately, Facebook and the Application Connection Documentation are not clear enough. Even the App Links video from F8 .

Application Requirements:

  • Share the link to FB as an open diagram that users can click to transfer them directly to my application and perform certain tasks (my application needs to get certain parameters from the link).
  • Share the link to the FB without entering the FB (i.e., through the "Sharing" dialog) and switch to the native FOS application for iOS, and not to API calls).

Progress achieved:

I use the following code to create a hosted link to the application (since I only have mobile content) on the FB website under the "Publish SDK for iOS" section.

NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: @"{My app name}", @"name", {custom URL}, @"al:iphone:url", @"{app store ID}", @"al:iphone:app_store_id", @"{My app name}", @"al:iphone:app_name", @"{\"should_fallback\": false}", @"web", fbAccessToken, @"access_token", nil ]; /* make the API call */ [FBRequestConnection startWithGraphPath:@"/{FB app id}/app_link_hosts" parameters:params HTTPMethod:@"POST" completionHandler:^( FBRequestConnection *connection, id result, NSError *error ) { /* handle the result */ NSLog(@"Result = %@",result); if(error) NSLog(@"error = %@",error); }]; 

Then I send the OG history to FB (these posts are fine, but without the correct url)

 // Create OG object id<FBGraphObject> object = [FBGraphObject openGraphObjectForPostWithType:@"{app name}:{FB object_name}" title:@"Test Link" image:@"https://cdn3.iconfinder.com/data/icons/picons-social/57/56-apple-512.png" // hosted wallpaper with unique id for background url:nil // Assuming I need to put the url to the app link host object here?? description:@"Click to on this test link!"]; // Create an action id<FBOpenGraphAction> action = (id<FBOpenGraphAction>)[FBGraphObject graphObject]; // Link the object to the action [action setObject:object forKey:@"{FB object name}"]; // Check if the Facebook app is installed and we can present the share dialog FBOpenGraphActionParams *params = [[FBOpenGraphActionParams alloc] init]; params.action = action; params.actionType = @"{app name}:{FB action name}"; // If the Facebook app is installed and we can present the share dialog if([FBDialogs canPresentShareDialogWithOpenGraphActionParams:params]) { // Show the share dialog [FBDialogs presentShareDialogWithOpenGraphAction:action actionType:@"{app name}:{FB action name}" previewPropertyName:@"{FB object name}" handler:^(FBAppCall *call, NSDictionary *results, NSError *error) { if(error) { // An error occurred, we need to handle the error // See: https://developers.facebook.com/docs/ios/errors NSLog(@"Error publishing story: %@", error.description); } else { // Success NSLog(@"result %@", results); } }]; } 

To handle the incoming URL when someone clicks on a link in the FB OG history, I added the following code to AppDelegate.m according to the FB documentation - see Handling Inbound Links

 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { BOOL urlWasHandled = [FBAppCall handleOpenURL:url sourceApplication:sourceApplication fallbackHandler: ^(FBAppCall *call) { // Parse the incoming URL to look for a target_url parameter NSString *query = [url query]; NSDictionary *params = [self parseURLParams:query]; // Check if target URL exists NSString *appLinkDataString = [params valueForKey:@"al_applink_data"]; if (appLinkDataString) { NSError *error = nil; NSDictionary *applinkData = [NSJSONSerialization JSONObjectWithData:[appLinkDataString dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&error]; if (!error && [applinkData isKindOfClass:[NSDictionary class]] && applinkData[@"target_url"]) { NSString *targetURLString = applinkData[@"target_url"]; // Show the incoming link in an alert // Your code to direct the user to the // appropriate flow within your app goes here [[[UIAlertView alloc] initWithTitle:@"Received link:" message:targetURLString delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; } } }]; return urlWasHandled; } // A function for parsing URL parameters - (NSDictionary*)parseURLParams:(NSString *)query { NSArray *pairs = [query componentsSeparatedByString:@"&"]; NSMutableDictionary *params = [[NSMutableDictionary alloc] init]; for (NSString *pair in pairs) { NSArray *kv = [pair componentsSeparatedByString:@"="]; NSString *val = [[kv objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; [params setObject:val forKey:[kv objectAtIndex:0]]; } return params; } 

Could anyone get this job? I still do not understand how the hosted link to the application works, and where to put it (I assume that it should go in the "url" parameter when calling the FBGraphObject openGraphObjectForPostWithType method.

I really do not want to create a website to store all the URLs and add App Link meta tags (I would have to do all this with the application, since each link to the application will be dynamic and unique for each user who generates it from application).

Please, help!

+8
ios facebook opengraph applinks
source share
3 answers

Using MingLi from FB, I managed to get it to work with the following code:

 - (void)shareToOpenGraphCountdownInvite { NSURL *url = [NSURL URLWithString:@"https://graph.facebook.com/oauth/access_token?grant_type=client_credentials&client_id={insert your FB app ID here}&client_secret={insert client secret here}"]; NSString *fullToken = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; NSArray *components = [fullToken componentsSeparatedByString:@"="]; FBAppAccessToken = [components objectAtIndex:1]; NSDictionary *paramsForAppLinksHost = [NSDictionary dictionaryWithObjectsAndKeys: FBAppAccessToken, @"access_token", @"{your app name}", @"name", @"{your app custom url}", @"al:ios:url", @"{app store ID}", @"al:ios:app_store_id", @"{your app name}", @"al:ios:app_name", @"{\"should_fallback\": false}", @"web", nil ]; [FBRequestConnection startWithGraphPath:@"/{FB app ID}/app_link_hosts" parameters:paramsForAppLinksHost HTTPMethod:@"POST" completionHandler:^( FBRequestConnection *connection, id result, NSError *error ) { AppLinksHostURL_ID = [result objectForKey:@"id"]; // store this ID in an NSString [self postOGStoryWithCustomURL]; if(error) NSLog(@"error = %@", error.description); }]; } - (void)postOGStoryWithCustomURL { NSString *urlString = [NSString stringWithFormat:@"https://fb.me/%@/%@", AppLinksHostURL_ID, customURL]; UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[self pathForS3ObjectWithFilename:previewImageFilename]]]]; // Create OG object id<FBGraphObject> object = [FBGraphObject openGraphObjectForPostWithType:@"timeflyz:countdown_invite" title:eventBeingShared.eventName image:image url:urlString // fb.me app links hosted url here description:@"{insert description here}"]; // Create an action id<FBOpenGraphAction> action = (id<FBOpenGraphAction>)[FBGraphObject graphObject]; // Link the object to the action [action setObject:object forKey:@"countdown_invite"]; // Check if the Facebook app is installed and we can present the share dialog FBOpenGraphActionParams *params = [[FBOpenGraphActionParams alloc] init]; params.action = action; params.actionType = @"timeflyz:create"; // If the Facebook app is installed and we can present the share dialog if([FBDialogs canPresentShareDialogWithOpenGraphActionParams:params]) { // Show the share dialog [FBDialogs presentShareDialogWithOpenGraphAction:action actionType:@"timeflyz:create" previewPropertyName:@"countdown_invite" handler:^(FBAppCall *call, NSDictionary *results, NSError *error) { if(error) { // An error occurred, we need to handle the error // See: https://developers.facebook.com/docs/ios/errors NSLog(@"Error publishing story: %@", error.description); } else { // NSLog(@"result %@", results); if([[results objectForKey:@"completionGesture"] isEqualToString:@"post"]) { NSLog(@"Posted successfully!"); [[NSNotificationCenter defaultCenter] postNotificationName:@"showShareSuccessfullMessage" object:self userInfo:nil]; } else NSLog(@"Something else happened - user didn't post"); } }]; } 

Note that "customURL" is an NSString that follows the pattern "? Variable1 = result1 & variable2 = result2 ..."

+1
source share

This works for Graph v2.5 and SDK 4.8. Definitely not easy and not documented. But thanks to Tim for the inspiration. I use my own graph object, I don’t know how it works with the default settings. I also use the Links Links application, as I do not have a web application. I got the {app_access_token} from the Charts API API, select your application, and then get the application access token

First, I created the graphics, actions, and object types in the Facebook developer (your facebook application). Make sure you have the application request schema for your application in info.plist. LSApplicationQueriesSchemes should contain a diagram pointing to your application. I will call her as {app_scheme}.

Then, in my iOS app, I create a new link for each stock.

 - (void)createAppLinkHost:(void(^)(NSString* appLinkURL))success error:(void(^)(NSError* error))failure{ NSString *url = [NSString stringWithFormat:@"{app_scheme}://%li",self.object.identifier]; NSString *appAccessToken = {app_access_token}; NSString *iosLink = [NSString stringWithFormat:@"[{\"url\":\"%@\",\"app_name\":\"%@\",\"app_store_id\":%i},]",url,@"{app_name}",{app_store_id_int}]; NSDictionary *appLinkHostParams = @{@"access_token":appAccessToken, @"name":@"{link name}", @"web":@"{\"should_fallback\": false}", @"ios":iosLink }; FBSDKGraphRequest *request = [[FBSDKGraphRequest alloc]initWithGraphPath:@"/{fb_appId}/app_link_hosts" parameters:appLinkHostParams tokenString:appAccessToken version:@"v2.5" HTTPMethod:@"POST"]; [request startWithCompletionHandler:^(FBSDKGraphRequestConnection *connection, id result, NSError *error) { if (!error) { NSString *appLinkHostId = [result objectForKey:@"id"]; NSString *urlString = [NSString stringWithFormat:@"https://fb.me/%@", appLinkHostId]; success(urlString); } else{ NSLog(@"--ERROR-- [FACEBOOK APP LINK HOST] %@",error); failure(error); } }]; 

}

If an error, check it. Errors from the App Link host make more sense than the rest of the Facebook SDK. The Graph API Explorer is useful to know what data you should send.

Once you get success, get AppLinkHost and share it.

 if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"fbauth2://"]]){ [self createAppLinkHost:^(NSString *appLinkURL) { SURL *imageURL = [NSURL URLWithString:self.activity.imageURL];; FBSDKSharePhoto *photo = [FBSDKSharePhoto photoWithImageURL:imageURL userGenerated:NO]; //Custom objects needs to be set from facebook first. //Set object properties NSDictionary *properties = @{ @"og:type": @"{namespace}:{graph_object}", @"og:title": @"title", @"og:description": @"body", @"og:image": @[photo], @"og:url":appLinkURL, @"fb:app_id":@"{fb_appId}", @"{namespace}:{custom_property}":@(self.object.identifier), //optional }; //Create GraphObject FBSDKShareOpenGraphObject *object = [FBSDKShareOpenGraphObject objectWithProperties:properties]; //Create Action FBSDKShareOpenGraphAction *action = [FBSDKShareOpenGraphAction actionWithType:@"{namespace}:{graph_action}" object:object key:@"{namespace}:{graph_object}"]; FBSDKShareOpenGraphContent *openGraphcontent = [[FBSDKShareOpenGraphContent alloc] init]; openGraphcontent.action = action; openGraphcontent.previewPropertyName = @"{namespace}:{graph_object}"; [FBSDKShareDialog showFromViewController:self withContent:openGraphcontent delegate:self]; } error:^(NSError *error) {}]; 

}

+1
source share

I do not have enough comments for comments, but check this answer if you are still stuck:

Unable to make new AppLinks work on iOS or Android

0
source share

All Articles