使用 UIActivityViewController 在 Twitter、Instagram 和其他服务上分享视频和文本
Share a video and text on Twitter, Instagram and other services using UIActivityViewController
我正在尝试在 Instagram、Facebook、Twitter 和本地服务(如邮件、消息等)上分享视频和文本……我不知道如何同时显示 Instagram 和 Twitter在分享行动中sheet:
如果我将文本数组和 URL 作为 activity 项传入控制器,则只会显示 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)
如果我创建一个 class 来实现 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 不会出现在操作中 sheet。有人知道如何解决这个问题吗?
我找到了答案。正确的做法是使用 UIActivityItemSource 协议的实现。 Instagram 没有出现在我使用 VideoActivityItemSource class 的第二个解决方案中的原因是我 return 在 activityViewControllerPlaceholderItem 函数中输入一个空字符串。
尽管 Apple 的文档说此函数中 returned 的对象类型不必与 itemForActivityType 函数使用的类型相匹配,但实际上它需要可由共享服务处理。对于 Instagram,它需要是视频或图像,否则 Instagram 不会在操作表中显示为共享选项。
所以解决方案是 return 在 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")!
}
确保您的 phone 上安装了 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)
}`
当您看到分享 window 但仍然没有看到 Instagram 时,请转到列表末尾。
单击 "More" 并检查是否包含 instagram 和 twitter
我正在尝试在 Instagram、Facebook、Twitter 和本地服务(如邮件、消息等)上分享视频和文本……我不知道如何同时显示 Instagram 和 Twitter在分享行动中sheet:
如果我将文本数组和 URL 作为 activity 项传入控制器,则只会显示 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)
如果我创建一个 class 来实现 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 不会出现在操作中 sheet。有人知道如何解决这个问题吗?
我找到了答案。正确的做法是使用 UIActivityItemSource 协议的实现。 Instagram 没有出现在我使用 VideoActivityItemSource class 的第二个解决方案中的原因是我 return 在 activityViewControllerPlaceholderItem 函数中输入一个空字符串。 尽管 Apple 的文档说此函数中 returned 的对象类型不必与 itemForActivityType 函数使用的类型相匹配,但实际上它需要可由共享服务处理。对于 Instagram,它需要是视频或图像,否则 Instagram 不会在操作表中显示为共享选项。
所以解决方案是 return 在 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")!
}
确保您的 phone 上安装了 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)
}`
当您看到分享 window 但仍然没有看到 Instagram 时,请转到列表末尾。 单击 "More" 并检查是否包含 instagram 和 twitter