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

27
我正在尝试在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照片”的相册中。

Incorrect placement of photo

这是我希望它看起来像的样子(在Safari中也可以看到):

enter image description here

4个回答

50

我已经搜索过这个问题,得出结论:使用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]; 
我也注意到,如果您在这些对象旁边发布照片,它不会从链接中检索任何图像。
希望这可以帮助。

我在这个该死的东西上花了好几个小时,试图弄清楚为什么它无法正确地接受我的URL。谢谢你! - Alex
在使用google.com时可以正常工作,但是当使用我们Facebook页面的链接时,它只显示一个丑陋的指南针。但是,当我在Facebook上分享链接时,链接是一个集成的“Facebook页面”链接,非常好。但是,在Facebook自己的页面中使用时,手机上的缩略图无法正常工作,这非常令人恼火。咕噜声 - bobmoff
FYI:子类化 UIActivity 可以让您调整显示内容。 - kambala
@baquiax 它可以在iOS 8.1上运行。它无法工作的一个可能原因是您的网页没有设置“og”参数。这个“og”元数据标签允许Facebook获取指定的图像。 - MK Yung
@MKYung 谢谢。直到今天我还没有找到解决方案,但我会再试一次。 :) - baquiax

2

已更新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显示一个图像/链接框


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);
    }];
}

1
这也不起作用。它会在缩略图预览中添加图片,但是如果你查看它,实际上它会把图片放到一个名为“iOS照片”的相册中。我希望它只是缩略图预览(就像Safari那样)。我不希望图片进入用户的照片相册。 - Ovi Tisler
嗯,好的,到目前为止我只使用了链接,没有图片。仅使用链接时,它会从链接本身选择一张图片。它适用于链接目标是iOS应用程序URL的情况,这是我到目前为止唯一使用过的东西。 - Jonny

0
- (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];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接