【问题标题】:How do I customize a UIActivityViewController to show a URL link when posting to facebook and twitter?如何自定义 UIActivityViewController 以在发布到 facebook 和 twitter 时显示 URL 链接?
【发布时间】:2012-09-21 09:21:15
【问题描述】:

所以我在 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 相册”。如果我没有在数组中添加图像,那么 facebook 工作表看起来是空白的,并且附件显示灰色的 safari 徽标(就像缺少缩略图一样!)在 safari 中,当您尝试使用 Facebook 链接时,它使用页面的屏幕抓取作为缩略图,我想做类似的事情

更新:

这就是我的应用程序的外观(使用 UIActivityViewController 或 SLCompose 方式)。看看如何将图片上传到相册iOS Photos

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

【问题讨论】:

    标签: ios facebook ios6


    【解决方案1】:

    如果你不是特别需要使用 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);
        }];
    }
    

    【讨论】:

    • 那也行不通。它在缩略图预览中添加了图像,但如果你看它,它实际上是将图像放入一个名为“iOS 照片”的相册中。我希望它只是缩略图预览(就像 safari 一样)。我不希望图片进入用户的相册
    • 嗯,好吧,到目前为止,我真的只使用了链接,没有图像。仅使用链接,它从链接本身中选择图像。它适用于链接目标是 iOS 应用程序 URL 的情况,这是我迄今为止唯一使用的东西。
    【解决方案2】:
    - (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];
    }
    

    【讨论】:

      【解决方案3】:

      我已经对此进行了搜索,得出的结论是,使用 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]; 
      

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

      我希望这会有所帮助。

      【讨论】:

      • 花了几个小时!!!在这该死的事情上,试图弄清楚为什么它不能正确获取我的网址。谢谢大佬!
      • 在使用 google.com 时有效,但在使用指向我们 facebook 页面的链接时,它只会显示一个丑陋的指南针。但是当我在 facebook 上分享链接时,链接是一个集成的“facebook 页面”链接,非常好。但是在 Facebook 自己的页面中使用时,手机上的缩略图不起作用,这非常烦人。呸
      • 仅供参考:子类化 UIActivity 可让您调整显示的内容
      • @baquiax 它适用于 ios 8.1。它不起作用的一个可能原因是您的网页没有设置og 参数。这个og元数据标签可以让facebook抓取指定的图片
      • @MKYung 谢谢。直到今天我才找到解决方案,但我会再试一次。 :)
      【解决方案4】:

      更新了 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 不会接受该字符串,但与许多其他社交媒体网站一样,会显示 URL 的图像/链接框

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-31
        • 2014-01-04
        • 1970-01-01
        • 1970-01-01
        • 2012-04-02
        相关资源
        最近更新 更多