27

所以我正在尝试UIActivityViewControlleriOS 6 中的新功能,它很容易启动和运行,但我不知道如何按我的意愿控制它。所以我想发布一篇文章的链接,我还想附上链接的图片。我不希望该图像上传到某个 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):

在此处输入图像描述

4

4 回答 4

50

我已经对此进行了搜索,得出的结论是,使用 the UIActivityViewControllertheres just no way to do what you want. 每次您尝试分享照片时,它只会让您将照片放入您的一个相册中,默认情况下为“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]; 

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

我希望这有帮助。

于 2013-01-24T21:31:49.683 回答
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 的图像/链接框

于 2017-08-22T07:52:10.443 回答
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);
    }];
}
于 2012-09-30T02:35:33.257 回答
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];
}
于 2012-11-28T10:54:51.300 回答