繁体   English   中英

使用“UIActivityItemSource”协议无法分享到 Instagram

[英]Sharing to Instagram does not work using the `UIActivityItemSource` protocol

我使用UIActivityViewController共享文本和图像。 该图像来自一个UIImage() activityImage 自定义文本来自从UIActivityItemSource协议返回的activityText()

问题是,Instagram 只能在特定条件下在UIActivityViewController可见。

总结以下测试:

  • Instagram的是只在可见UIActivityViewControlleractivityItems: [activityImage]activityItems: [activityImage, NSNull()]

  • 即使返回的UIActivityItemSource协议值为""nilNSNull() ,Instagram 也会为activityItems: [activityImage, activityText()]隐藏

问题是需要调用UIActivityItemSource协议,以便可以分别管理不同的共享平台。


问题:

  • 如何在调用UIActivityItemSource协议时分享到 Instagram?

  • 在调用UIActivityItemSource协议时,我可以尝试哪些替代""nilNSNull()


代码:

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 ""
    }
}

问题被提出并回答: 通过UIActivityViewController(Twitter,Facebook,Instagram)与hashtag共享图像

        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
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM