【问题标题】:Share image with hashtag via UIActivityViewController (Twitter, Facebook, Instagram)通过 UIActivityViewController(Twitter、Facebook、Instagram)与主题标签共享图像
【发布时间】: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]
        }
    }

}

【问题讨论】:

    标签: ios swift


    【解决方案1】:

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

    在第一个中只返回图像。 在第二个中,为 placeHolder 返回 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 不是很敏感,唯一敏感的key是邮件和支持它的应用程序的“主题”,这是在UIActivityController的API中实现的,我们可以直接设置它。您是否为UIImage 提供密钥“image”或“1”并不重要。

    事实证明,如果 ...itemForActivity... 方法中没有直接返回文本,Twitter 活动将无法工作。所以解决方案是分离物品来源。

    如果placeholder 收到除String 以外的任何内容,Twitter 活动也将不起作用,但通过返回 String Instagram 活动将不起作用,因此通过返回 NSObject() 类型将被忽略,所有服务都将可用. 如果你想限制某些服务使用UIActivityViewController.excludedActivityTypes

    【讨论】:

    • 好极了,没想到要返回 NSObject!
    • @DerrickHunt 不幸的是,这根本没有意义?...通过尝试和错误找到它。
    • 此解决方案是否支持在 Instagram 上发布带有标签的内容?
    • @guneykayim 不幸的是,instagram 不支持 uiactivity 的文本。您应该使用 UIDocumentInteractionController。使用这个:stackoverflow.com/questions/11393071/…
    • 非常感谢您。天才。
    猜你喜欢
    • 2015-11-29
    • 2014-11-26
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多