通过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()
,并返回Text
或nil
取决于活动。 通过返回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