使用UIActivityViewController

时间:2016-06-27 12:28:02

标签: swift video twitter instagram uiactivityviewcontroller

我正在尝试在Instagram,Facebook,Twitter以及邮件,消息等本地服务上分享视频和文字。我无法弄清楚如何同时获取两者,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 个答案:

答案 0 :(得分:2)

我找到了答案。正确的方法是使用UIActivityItemSource协议的实现。 Instagram没有出现在我使用VideoActivityItemSource类的第二个解决方案中的原因是我在activityViewControllerPlaceholderItem函数中返回一个空字符串。 虽然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")!
}

答案 1 :(得分: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