通过UIActivityViewController(Twitter,Facebook,Instagram)与hashtag共享图像

我尝试使用UIActivityViewController与标签共享一个图像,当尝试分享到Twitter,Facebook和Instagram时遇到一些奇怪的行为。 似乎没有关于这些服务的共享扩展的很多文件。

场景1:具有活动项目数组的图像和文本的初始控制器

如果我这样初始化控制器,Twitter和Facebook将显示在控制器中(不支持Instagram,因为它不支持文本项目),并且都将以编程方式在文本input字段中预填充标签:

let activityVC = UIActivityViewController(activityItems: [myHashtagString, myImage], applicationActivities: nil) 

情景2:只有图像的初始控制器

在这种情况下,所有的networking都显示出来,但我(显然)失去了自动hashtagfunction:

 let activityVC = UIActivityViewController(activityItems: [myImage], applicationActivities: nil) 

场景3:UIActivityItemSource子类

如果我创build自己的UIActivityItemSource子类,几乎可以让所有的东西都可以工作。 然而,这是我无法弄清楚,使用协议方法,因为我有下面的结果自动hashtag Facebook的工作,但不Twitter。 这怎么可能 – Twitter是否需要一个特殊的密钥? 如果它在scheme#1中工作,则必须有办法使其工作…

有趣的是,如果我插入一个URL(注释掉),这个方法适用于Twitter和Facebook。 那么为什么地球上的文本不能用于Twitter呢?

 let activityItem = CustomItemSource(image: image, message: "#TestTag") let activityVC = UIActivityViewController(activityItems: [activityItem], applicationActivities: nil) ... class CustomItemSource: NSObject, UIActivityItemSource { private var image: UIImage! private var message: String! // MARK: Init init(image: UIImage, message: String) { super.init() self.image = image self.message = message } // MARK: Item Source Protocol func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any { return image } func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? { if activityType == .postToTwitter || activityType == .postToFacebook { //return ["url": URL(string: "https://www.google.com")!, "image": image] return ["text": message, "image": image] } else { return ["image": image] } } } 

定义两个UIActivityItemSource类,一个用于Image ,一个用于Text

在第一个只返回图像。 在第二个返回placeObject的NSObject() ,并返回Textnil取决于活动。 通过返回NSObject() ,UIActivity将允许所有服务可用。

 UIActivityViewController(activityItems: [ImageProvider(), TextProvider()], applicationActivities: nil) 

和提供者:

 class TextProvider: NSObject, UIActivityItemSource { func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any { return NSObject() } func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? { if activityType == .postToTwitter || activityType == .postToFacebook { return "Tweet with #Hashtag" } return nil } } class ImageProvider: NSObject, UIActivityItemSource { func activityViewControllerPlaceholderItem(_ activityViewController: UIActivityViewController) -> Any { return UIImage(named: ...) } func activityViewController(_ activityViewController: UIActivityViewController, itemForActivityType activityType: UIActivityType) -> Any? { return UIImage(named: ...) } } 

首先,Keys不是很敏感,唯一的敏感键是支持它的电子邮件和应用程序的“主题”,这是在UIActivityController的API中UIActivityController的,我们可以直接设置它。 不要紧,如果你提供关键的“图像”或“1”的UIImage

事实certificate,Twitter活动将不会工作,如果它的文本不直接返回...itemForActivity...方法。 所以解决scheme是分开项目来源。

Twitter的活动也是行不通的,如果placeholder接收到String以外的任何东西,但是通过返回String Instagram活动将不起作用,所以通过返回NSObject() Type将被忽略,所有的服务都将可用。 如果你想限制一些服务使用UIActivityViewController.excludedActivityTypes