Ios 使用UIActivityViewController和UIActivityItemProvider共享PDF
我需要在iOS下共享/打开一些不同的文件,例如iCloud的图像或iBooks的pdf。这里有几个文本和图像的例子,但没有其他的例子 我创建了自己的Ios 使用UIActivityViewController和UIActivityItemProvider共享PDF,ios,swift,Ios,Swift,我需要在iOS下共享/打开一些不同的文件,例如iCloud的图像或iBooks的pdf。这里有几个文本和图像的例子,但没有其他的例子 我创建了自己的UIActivityItemProvider;简化版本如下: class MyItemProvider: UIActivityItemProvider { override func item() -> AnyObject { self.placeholderItem } override func activityVi
UIActivityItemProvider
;简化版本如下:
class MyItemProvider: UIActivityItemProvider {
override func item() -> AnyObject {
self.placeholderItem
}
override func activityViewController(activityViewController: UIActivityViewController, dataTypeIdentifierForActivityType activityType: String?) -> String {
return kUTTypePDF as String
}
func activityViewControllerPlaceholderItem(activityViewController: UIActivityViewController) -> AnyObject {
return self.placeholderItem
}
}
并开始与以下内容共享:
let myPDF = NSData(contentsOfURL: NSBundle.mainBundle().URLForResource("testpdf", withExtension: "pdf")) {
let activityVC = UIActivityViewController(activityItems: [MyItemProvider(placeHolder: myPDF)], applicationActivities: nil)
self.presentViewController(activityVC, animated: true, completion: nil)
我期待一个共享对话框,如:
但我得到的只是:
有什么建议吗?此代码适用于我共享文件。当然,文件必须已经创建:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.pdf", @"FileName"]];
NSURL *URL = [NSURL fileURLWithPath:fullPath];
NSArray *activityItems = [NSArray arrayWithObjects:URL, nil];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:activityItems applicationActivities:nil];
[self presentViewController:activityViewController animated:YES completion:nil];
**
在Swift 3中与UIActivityViewController共享PDF
**
我花了很多时间思考如何在UIWebView中共享从URL加载的PDF文件,如“”
几天后,我找到了我认为最合适的方法:
1)PDF必须首先保存在文件系统中。例如,这可以在加载UIWebView后完成:
class yourViewController: UIViewController{
var documentPathToLoad = "http://youPdfFile.pdf"
...
func webViewDidFinishLoad(_ webView: UIWebView) {
if yourWebView.isLoading {
// still loading
return
}
//Save the pdf document to file system
savePdf()
}
func savePdf(){
let fileManager = FileManager.default
let paths = (NSSearchPathForDirectoriesInDomain((.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent("documento.pdf")
let pdfDoc = NSData(contentsOf:URL(string: documentPathToLoad)!)
fileManager.createFile(atPath: paths as String, contents: pdfDoc as Data?, attributes: nil)
}
}
func loadPDFAndShare(){
let fileManager = FileManager.default
let documentoPath = (self.getDirectoryPath() as NSString).appendingPathComponent("documento.pdf")
if fileManager.fileExists(atPath: documentoPath){
let documento = NSData(contentsOfFile: documentoPath)
let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: [documento!], applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView=self.view
present(activityViewController, animated: true, completion: nil)
}
else {
print("document was not found")
}
}
2)读取保存的文件,然后共享。此方法在Swift 3.0.1中适用:
class yourViewController: UIViewController{
var documentPathToLoad = "http://youPdfFile.pdf"
...
func webViewDidFinishLoad(_ webView: UIWebView) {
if yourWebView.isLoading {
// still loading
return
}
//Save the pdf document to file system
savePdf()
}
func savePdf(){
let fileManager = FileManager.default
let paths = (NSSearchPathForDirectoriesInDomain((.documentDirectory, .userDomainMask, true)[0] as NSString).appendingPathComponent("documento.pdf")
let pdfDoc = NSData(contentsOf:URL(string: documentPathToLoad)!)
fileManager.createFile(atPath: paths as String, contents: pdfDoc as Data?, attributes: nil)
}
}
func loadPDFAndShare(){
let fileManager = FileManager.default
let documentoPath = (self.getDirectoryPath() as NSString).appendingPathComponent("documento.pdf")
if fileManager.fileExists(atPath: documentoPath){
let documento = NSData(contentsOfFile: documentoPath)
let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: [documento!], applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView=self.view
present(activityViewController, animated: true, completion: nil)
}
else {
print("document was not found")
}
}
您必须在UIActivityViewController中传递支持pdf的应用程序选项的pdf文件url
func btnTapped() {
if let pdf = Bundle.main.url(forResource: "yourPdfFileName", withExtension: "pdf", subdirectory: nil, localization: nil) {
self.sharePdf(path: pdf)
}
}
func sharePdf(path:URL) {
let fileManager = FileManager.default
if fileManager.fileExists(atPath: path.path) {
let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: [path], applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView = self.view
self.present(activityViewController, animated: true, completion: nil)
} else {
print("document was not found")
let alertController = UIAlertController(title: "Error", message: "Document was not found!", preferredStyle: .alert)
let defaultAction = UIAlertAction.init(title: "ok", style: UIAlertAction.Style.default, handler: nil)
alertController.addAction(defaultAction)
UIViewController.hk_currentViewController()?.present(alertController, animated: true, completion: nil)
}
}
现有答案演示了如何使用本地文件的URL共享PDF。但是,如果不想创建文件,则不必创建文件。另一种方法是使用PDF文件的
数据
表示
假设您正在使用
PDFKit
在UI中显示PDF。这意味着您将处理具有dataRepresentation()
方法的PDFKit.PDFDocument
类。此方法返回可传递给UIActivityViewController
初始化器的Data
。文档说明,提供NSData(并且只有NSData)将触发调用dataTypeIdentifierForActivityType
——但事实并非如此。此外,NSURL将触发该事件。提供NSURL而不是NSData将显示至少大多数已安装的应用程序,但“保存到iBooks”除外。getDirectoryPath()此函数在哪里?我得到一个错误hi@DhavalUmraliya,函数是这样的:func getDirectoryPath()->String{let path=NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask,true)let documentsDirectory=path[0]返回documentsDirectory}我仅使用UIActivityViewController(activityItems:[documentoPath!]
而不是UIActivityViewController(activityItems:[documento!]