Совместное использование в 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
    }

}
Другие вопросы по тегам