Swift 2 - 使用UIActivityViewController分享视频

11

我正在尝试使用UIActivityViewController分享来自URL的视频。如果我尝试用图片分享,就没有问题。

分享图片有效:

let imageThump = NSURL(string: "https://example.com/image.png")
let imageData = NSData(contentsOfURL: imageThump!) 
let objectsToShare = [comment!, imageData!]
let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)

分享视频无法使用。为什么?

let videoShare = NSURL(string: "https://example.com/video.mp4")
let videoData = NSData(contentsOfURL: videoShare!) 
let objectsToShare = [comment!, videoData!]
let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)

我会添加更多细节。具体是什么没有起作用?您能提供任何错误消息、堆栈跟踪等吗? - Björn Kaiser
3个回答

23

这就是如何做到它...

guard let urlData = NSData(contentsOfURL: NSURL(string:"https://example.com/video.mov)")!) else { 
    return 
}

print(urlData)


let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
let docDirectory = paths[0]
let filePath = "\(docDirectory)/tmpVideo.mov"
urlData?.writeToFile(filePath, atomically: true)
// File Saved

let videoLink = NSURL(fileURLWithPath: filePath)


let objectsToShare = [videoLink] //comment!, imageData!, myWebsite!]
let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)

activityVC.setValue("Video", forKey: "subject")


// New Excluded Activities Code
if #available(iOS 9.0, *) {
    activityVC.excludedActivityTypes = [UIActivityTypeAirDrop, UIActivityTypeAddToReadingList, UIActivityTypeAssignToContact, UIActivityTypeCopyToPasteboard, UIActivityTypeMail, UIActivityTypeMessage, UIActivityTypeOpenInIBooks, UIActivityTypePostToTencentWeibo, UIActivityTypePostToVimeo, UIActivityTypePostToWeibo, UIActivityTypePrint]
} else {
    // Fallback on earlier versions
    activityVC.excludedActivityTypes = [UIActivityTypeAirDrop, UIActivityTypeAddToReadingList, UIActivityTypeAssignToContact, UIActivityTypeCopyToPasteboard, UIActivityTypeMail, UIActivityTypeMessage, UIActivityTypePostToTencentWeibo, UIActivityTypePostToVimeo, UIActivityTypePostToWeibo, UIActivityTypePrint ]
}

           
self.presentViewController(activityVC, animated: true, completion: nil)

为什么这会导致应用程序冻结几秒钟? - ak2g
因为正在下载需要分享的视频。 - SNos
有没有办法让它看起来更流畅,而不是卡顿的样子? - ak2g
我所做的是添加一个活动指示器,显示设备正在加载。 - SNos
@ak2g 尝试使用GCD或NSOperation来使其更流畅。 - wm.p1us
8
activityVC.setValue("Video", forKey: "subject") 的目的是什么? - Chan Jing Hong

10

请记住,视频通常是一个大文件,因此下载和保存需要一些时间。在这里,我使用了第一个答案的部分,但添加了一些GCD。你会获得更好的结果。

这就是我避免应用程序在视频下载和保存期间冻结的方法:

let url = NSURL(string: "https://example.com/video.mov")
    
//Show activity indicator
    
DispatchQueue.global(qos: .background).async {
    guard let urlData = NSData(contentsOf: url) else { return }
    let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
    let filePath="\(documentsPath)/tempFile.mov"
    DispatchQueue.main.async {
        urlData.write(toFile: filePath, atomically: true)
                                        
        //Hide activity indicator
    
        let activityVC = UIActivityViewController(activityItems: [NSURL(fileURLWithPath: filePath)], applicationActivities: nil)
        activityVC.excludedActivityTypes = [.addToReadingList, .assignToContact]
        self.present(activityVC, animated: true, completion: nil)
    }
}

2
它无法工作,因为这个类不允许将NSData传递给Facebook活动类型。
“UIActivityTypePostToFacebook对象会将提供的内容发布到用户的Facebook墙上。使用此服务时,您可以提供NSString、NSAttributedString、UIImage、ALAsset和NSURL对象作为活动项的数据。您还可以指定内容使用assets-library方案的NSURL对象。”

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIActivity_Class/index.html#//apple_ref/doc/constant_group/Built_in_Activity_Types

我也一直在尝试让它工作。还没有弄清楚如何让它工作;然而,这就是你的代码不起作用的原因。

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