Совместное использование в Instagram не работает с использованием протокола `UIActivityItemSource`
Я делюсь текстом и изображениями, используя UIActivityViewController
, Изображение из activityImage
который является UIImage()
, Пользовательский текст из activityText()
который возвращается из UIActivityItemSource
протокол.
Проблема в том, что Instagram виден только в UIActivityViewController
при определенных условиях.
Подведем итоги тестов ниже:
Instagram виден только в
UIActivityViewController
заactivityItems: [activityImage]
а такжеactivityItems: [activityImage, NSNull()]
Instagram скрыт для
activityItems: [activityImage, activityText()]
даже когда вернулсяUIActivityItemSource
значение протокола""
,nil
,NSNull()
,
Проблема в том, что UIActivityItemSource
протокол должен быть вызван так, чтобы различные платформы совместного использования могли управляться отдельно.
Вопросы:
Как я могу поделиться в Instagram при звонке
UIActivityItemSource
протокол?Какие есть альтернативы
""
,nil
а такжеNSNull()
что я мог попробовать при вызовеUIActivityItemSource
протокол?
Код:
class activityText: NSObject, UIActivityItemSource {
@objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
return ""
}
@objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
switch activityType {
case UIActivityTypeMessage:
return "Special text when sharing to Messages."
default:
return ""
}
}
}
func shareEverwhere() {
var activityImage: UIImage()
let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil)
self.presentViewController(activity, animated: true, completion: nil)
}
тесты:
Instagram виден в UIActivityViewController
let activity = UIActivityViewController(activityItems: [activityImage], applicationActivities: nil)
или же
let activity = UIActivityViewController(activityItems: [activityImage, NSNull()], applicationActivities: nil)
Instagram скрыт в UIActivityViewController
let activity = UIActivityViewController(activityItems: [activityImage, ""], applicationActivities: nil)
или же
let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil)
или же
let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil)
class activityText: NSObject, UIActivityItemSource {
@objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
return ""
}
@objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
return NSNull()
}
}
или же
let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil)
class activityText: NSObject, UIActivityItemSource {
@objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
return ""
}
@objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
return nil
}
}
или же
let activity = UIActivityViewController(activityItems: [activityImage, activityText()], applicationActivities: nil)
class activityText: NSObject, UIActivityItemSource {
@objc func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
return ""
}
@objc func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
return ""
}
}
2 ответа
Вопрос был задан и получен ответ на: Поделиться изображением с хэштегом через UIActivityViewController (Twitter, Facebook, Instagram)
UIActivityViewController *activityViewController =
[[UIActivityViewController alloc] initWithActivityItems:@[vm.image, [[ActivityStringItemSource alloc] initWithString:attributedString]] applicationActivities:nil];
И класс, который реализует возврат строки (или нет):
@interface ActivityStringItemSource()<UIActivityItemSource>
@property(strong, nonatomic) NSMutableAttributedString *stringContent;
@end
@implementation ActivityStringItemSource
- (instancetype)initWithString:(NSMutableAttributedString *) placeholder
{
self = [super init];
if (self) {
_stringContent = placeholder;
}
return self;
}
- (id)activityViewControllerPlaceholderItem:(UIActivityViewController *)activityViewController {
return [NSObject new];
}
- (id)activityViewController:(UIActivityViewController *)activityViewController itemForActivityType:(UIActivityType)activityType {
if([activityType containsString:@"instagram"]) {
return nil;
} else {
return _stringContent;
}
}
@end
Ключ, как указано в первоначальном ответе, заключается в возвращении NSObject (класс расширяет NSObject). Затем при выборе элемента просто протестируйте instagram, чтобы вернуть nil, а в противном случае верните вашу строку.
После тестирования вам нужно только добавить свое изображение в ActivityViewControllerPlaceholderItem.
final class MyImageItemSource: NSObject, UIActivityItemSource {
final let image: UIImage
init(image: UIImage) {
self.image = image
}
func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any {
image
}
func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivity.ActivityType?) -> Any? {
image
}
}