使用UIActivityViewController在Twitter、Instagram和其他服务上分享视频和文本

4

我想在Instagram、Facebook、Twitter以及本地服务(如Mail、Messages等)上分享视频和文本,但我不知道如何使Instagram和Twitter都在共享操作表中显示出来:

如果我将文本数组和URL作为活动项目传递到控制器中,只会显示Instagram,而不会显示Twitter。

let url: NSURL = NSURL() // a url that directs to a video
let items: [AnyObject] = ["Check out this video", url]    
let shareable = UIActivityViewController(activityItems: items, applicationActivities: nil)

controller.presentViewController(shareable,
                               animated: true,
                               completion: nil)

如果我创建一个实现UIActivityItemSource协议的类,并将其用作activityItems,那么Twitter就会出现,但Instagram不会出现:
class VideoActivityItemSource: NSObject, UIActivityItemSource {

    private let videoUrl: NSURL
    private let shareText = "View the full video here!"

    init(url: NSURL) {
        self.videoUrl = url
    }

    func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
        return ""
    }

    func activityViewController(activityViewController: UIActivityViewController, itemForActivityType activityType: String) -> AnyObject? {
        switch activityType {

        case UIActivityTypePostToFacebook:
            return self.videoUrl
        case UIActivityTypeMail:
            return self.videoUrl
        default:
            return ["text": self.shareText, "url": self.videoUrl]
        }
    }

    func activityViewController(activityViewController: UIActivityViewController, subjectForActivityType activityType: String?) -> String {
        return "Hey check this new cool app!!!"
    }

    func activityViewController(activityViewController: UIActivityViewController, thumbnailImageForActivityType activityType: String?, suggestedSize size: CGSize) -> UIImage? {
        return nil
    }
}

然后将这些项目替换为:

items = [VideoActivityItemSource(url: url)]

我不知道为什么在这种情况下Twitter不会出现在操作表中。有人知道如何解决吗?

2个回答

3
我找到了答案。正确的方式是使用UIActivityItemSource协议的实现。Instagram在第二种解决方案中未显示出来的原因是我在activityViewControllerPlaceholderItem函数中返回了一个空字符串,而我正在使用VideoActivityItemSource类。 尽管Apple文档中说,在该函数中返回的对象类型不必与itemForActivityType函数中使用的类型匹配,但它实际上需要能够由共享服务处理。在Instagram的情况下,它需要是一个视频或图像,否则Instagram不会显示为操作表中的共享选项。
因此,解决方案是在activityViewControllerPlaceholderItem函数中返回UIImage而不是空字符串,这样Twitter和Instagram都将显示为共享选项。
func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
    // this needs to return some random image to make sure Twitter and Instagram show up in the sharing actionsheet
    return UIImage(named: "someImage")!
}

你在 Instagram 上分享了吗?我无法分享。Instagram 图标没有显示给我看。 - Karthikeyan Bose
如果手机上安装了Instagram,当我进行测试时它会显示一个图标。 - bughana

0

请确保您的手机上安装了Instagram应用程序。

`let activityVC = UIActivityViewController(activityItems: yourobjectArray, applicationActivities: nil)

 activityVC.setValue("clipSnapshot", forKey: "subject")
 if let activityPopOver = activityVC.popoverPresentationController  {
            activityPopOver.sourceView = self.view
            activityPopOver.permittedArrowDirections = self.subviewView.isHidden ? .up : .left
        }
  self.present(activityVC, animated: true, completion: nil)
    }`

当您看到共享窗口但仍未看到Instagram时,请前往列表末尾。 点击“更多”,并检查是否包括Instagram和Twitter。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接