Подтвердить что ты не робот

Как настроить UIActivityViewController для показа ссылки URL-адреса при отправке в facebook и twitter?

Итак, я тестирую новый UIActivityViewController в iOS 6, и очень легко встать и работать, но я не могу понять, как управлять им, как я хочу. Поэтому я хочу опубликовать ссылку на статью, и я также хочу добавить изображение для ссылки. Я НЕ хочу, чтобы это изображение загрузилось в какой-нибудь альбом facebook, как миниатюра URL.

Это легко сделать в SDK facebook, поскольку они дают полный контроль над ним, но есть ли способ сделать это с помощью 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 будет выглядеть пустым, и вложение отобразит серый цвет логотипа сафари (например, миниатюра отсутствует!). В сафари, когда вы пытаетесь использовать ссылку Facebook, она использует экранный захват страницы в виде миниатюры, я хочу сделать что-то подобное

ОБНОВЛЕНИЕ:

Итак, как это выглядит из моего приложения (используя UIActivityViewController или SLCompose). Посмотрите, как он загрузит изображение в фотоальбом iOS Photos

Incorrect placement of photo

Здесь я хочу, чтобы это выглядело (см. также Safari):

enter image description here

4b9b3361

Ответ 1

Я искал об этом, и я пришел к выводу, что с помощью 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]; 

Я также заметил, что если вы разместите фотографию вдоль этих объектов, она не получит никакого изображения из ссылки.

Надеюсь, это поможет.

Ответ 2

Если вам не нужно использовать 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);
    }];
}

Ответ 3

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

Ответ 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