【发布时间】:2017-09-08 21:15:15
【问题描述】:
我正在尝试使用 UIActivityViewController 与主题标签共享图像,但在尝试共享到 Twitter、Facebook 和 Instagram 时遇到了一些奇怪的行为。似乎没有很多关于这些服务的共享扩展的文档。
场景 1:带有图像和文本的活动项数组的初始化控制器
如果我像这样初始化控制器,Twitter 和 Facebook 将显示在控制器中(没有 Instagram,因为它不支持文本项),并且两者都将以编程方式在文本输入字段中预填充主题标签:
let activityVC = UIActivityViewController(activityItems: [myHashtagString, myImage], applicationActivities: nil)
场景 2:只有图像的初始化控制器
在这种情况下,所有网络都会显示,但我(显然)失去了自动标签功能:
let activityVC = UIActivityViewController(activityItems: [myImage], applicationActivities: nil)
场景 3:UIActivityItemSource 子类
如果我创建自己的 UIActivityItemSource 子类,我几乎可以让一切正常工作。但是,这是我无法弄清楚的,使用下面的协议方法会导致自动主题标签适用于 Facebook,但不适用于 Twitter。这怎么可能——Twitter 需要特殊的密钥吗?如果它在场景 #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]
}
}
}
【问题讨论】: