如何自定义一个UIActivityViewController,以便在发布到Facebook和Twitter时显示URL链接?

所以我尝试了iOS 6中新的UIActivityViewController ,启动和运行起来非常简单,但是我无法弄清楚如何控制它。 所以我想发布一篇文章的链接,我也想附上一个链接的图像。 我不希望这个图像上传到一些Facebook的相册,只是作为一个URL缩略图。

这在facebook SDK中很容易实现,因为它们完全控制它,但是有没有办法通过UIActivityViewController ? 这是我得到的:

  NSArray *activityItems = @[[NSURL URLWithString:[article link]], [UIImage imageNamed:@"myStockImage"]]; UIActivityViewController *viewCont = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil]; [self presentViewController:viewCont animated:YES completion:nil]; 

而这个工作,但它上传的图像到“iOS相册”。 如果我不添加图片在数组中,那么脸谱页看起来像是空白的,附件显示灰色的Safari浏览器的标志(如缩略图丢失!)在Safari浏览器,当你尝试Facebook的链接,它使用屏幕抓取的页面作为缩略图,我想要做这样的事情

更新:

所以这里是从我的应用程序看起来像(使用UIActivityViewController或SLCompose方式)。 看看它是如何将图片上传到相册iOS Photos

照片的位置不正确

这就是我想要的样子(请参阅Safari):

在这里输入图像说明

我已经search了这个,我得出结论,使用UIActivityViewController没有办法做你打算。 每当您尝试分享照片时,只会让您将照片放入其中一个相册中,默认为“iOS”相册。

就我而言,只要从我需要共享的链接中检索图像,就不需要发布照片(就像在您的Facebook时间轴上发布链接一样,它会自动从该链接抓取图片,而图片成为链接)。 为了做到这一点,我想出了如果我只发布一个url不起作用。 您必须发布一些初始文本,然后是URL,然后将这些对象按顺序放入activityItems数组中。

这是我的工作代码:

 NSArray * activityItems = @[[NSString stringWithFormat:@"Some initial text."], [NSURL URLWithString:@"http://www.google.com"]]; NSArray * applicationActivities = nil; NSArray * excludeActivities = @[UIActivityTypeAssignToContact, UIActivityTypeCopyToPasteboard, UIActivityTypePostToWeibo, UIActivityTypePrint, UIActivityTypeMessage]; UIActivityViewController * activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:applicationActivities]; activityController.excludedActivityTypes = excludeActivities; [self presentViewController:activityController animated:YES completion:nil]; 

我还注意到,如果沿这些对象发布照片,它将不会从链接中检索任何图像。

我希望这有帮助。

如果你没有特别需要使用UIActivityViewController,使用SLComposeViewController就很容易用于这个目的。

 +(void)presentShareWidgetWithText:(NSString*)text url:(NSURL*)url images:(NSArray*)images toService:(NSString*)service presentIn:(UIViewController*)parentViewController { SLComposeViewController* controller = [SLComposeViewController composeViewControllerForServiceType:service]; if (controller == nil) { DLog(@"Could not initialize SLComposeViewController for %@!", service); return; } if (url != nil) { if (![controller addURL:url]) DLog(@"Failed adding url %@!", url); } if (images != nil) { for (UIImage* image in images) { if (![controller addImage:image]) { DLog(@"Failed adding image: %@", image); } } } if (![controller setInitialText:text]) { DLog(@"Failed setting initial text: %@", text); } SLComposeViewControllerCompletionHandler handler = ^(SLComposeViewControllerResult result) { switch (result) { case SLComposeViewControllerResultCancelled: DLog(@"SLComposeViewControllerResultCancelled"); break; case SLComposeViewControllerResultDone: DLog(@"SLComposeViewControllerResultDone, Shared on service: %@", service); break; default: DLog(@"Unhandled result: %d", result); break; } dispatch_async(dispatch_get_main_queue(), ^{ [parentViewController dismissViewControllerAnimated:YES completion:^{ DLog(@"Dismissed a controller here!"); }]; }); }; [controller setCompletionHandler:handler]; [parentViewController presentViewController:controller animated:YES completion:^{ DLog(@"Presented %@!", controller); }]; } 
 - (void)tweetURL:(NSString *)url title:(NSString *)title { TWTweetComposeViewController *twitter = [[TWTweetComposeViewController alloc] init]; NSString *format = @"“%@” %@ /via @DesignSceneApp"; NSString *message = [NSString stringWithFormat:format, title, url] NSUInteger idx = title.length; while (![twitter setInitialText:message]) { idx -= 5; if (idx > 5) { message = [NSString stringWithFormat:format, [NSString stringWithFormat:@"%@…", [title substringToIndex:idx]], url ]; } else { // Give up on the title. message = [NSString stringWithFormat:@"%@ /via @DesignSceneApp", url]; [twitter setInitialText:message]; break; } } [self presentViewController:twitter animated:YES completion:nil]; } 

更新了Swift 3.0的答案

 let url = URL(string: "google.com") let shareText = "Your string goes here" let shareItems: [Any] = [shareText, url!] let activityVC = UIActivityViewController(activityItems: shareItems, applicationActivities: nil) activityVC.excludedActivityTypes = [.airDrop, .postToFlickr, .assignToContact, .openInIBooks] self.present(activityVC, animated: true, completion: nil) 

Facebook不会接受这个string,但是和其他许多社交媒体网站一样,它会显示URL的图片/链接框