我老老实实地花了几个小时试图让它发挥作用.不幸的是
Facebook&
App Link’s documentation还不够清楚.甚至是
App Links video from F8.
应用要求:
>分享FB作为Open Graph故事的链接,用户可以点击该故事将其直接带入我的应用程序并执行特定任务(我的应用程序需要从链接接收特定参数)
>在没有FB登录的情况下将链接共享到FB(即通过共享对话框并切换到本机iOS FB应用程序而不是使用API调用).
迄今取得的进展:
我正在使用以下代码来创建托管的应用程序链接(因为我只有移动内容),根据FB developer’s website under Publishing iOS SDK.
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); }];
接下来我将OG故事发布到FB(这是很好但没有正确的网址)
// 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); } }]; }
要在有人点击FB OG故事中的链接时处理传入的URL,我已根据FB文档将以下代码添加到AppDelegate.m – 请参阅Handling incoming 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; }
有没有人能够使这个工作?我还不清楚托管的App Link如何工作以及放置它的位置(我假设在调用FBGraphObject openGraphObjectForPostWithType方法时它应该放在’url’参数中.
我真的不想创建一个网站来存储所有的网址并添加App Link元标记(我必须通过应用程序完成所有这些,因为每个App Link都将是动态的,并且对于生成它的每个用户都是唯一的来自应用程序).
请帮忙!
解决方法
在FB的MingLi的帮助下,我设法使用以下代码:
- (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,@"{your app name}",@"{your app's custom url}",@"al:ios:url",@"al:ios:app_store_id",@"al:ios:app_name",nil ]; [FBRequestConnection startWithGraPHPath:@"/{FB app ID}/app_link_hosts" parameters:paramsForAppLinksHost HTTPMethod:@"POST" completionHandler:^( FBRequestConnection *connection,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,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"); } }]; }
请注意,“customURL”是一个遵循模式“?variable1 = result1& variable2 = result2 …”的NSString.