使用App Links Hosting API从iOS应用程序在Facebook上共享链接

前端之家收集整理的这篇文章主要介绍了使用App Links Hosting API从iOS应用程序在Facebook上共享链接前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我老老实实地花了几个小时试图让它发挥作用.不幸的是 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.

猜你在找的iOS相关文章