Как настроить 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]()
Ответы
Ответ 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