代码:
self.fileItem.downloadedFilename = subDirectory + "/" + self.fileItem.name print("self.fileItem.downloadedFilename=\(self.fileItem.downloadedFilename)") let docDirUrl = FileDirectory.applicationDirectory(NSSearchPathDirectory.DocumentDirectory) print("docDirUrl=\(docDirUrl)") ///Users/crifan/Library/Developer/CoreSimulator/Devices/84FE8057-ED19-4703-BAE0-7C5156289534/data/Containers/Data/Applicat … ocuments let fileFullUrl = docDirUrl?.URLByAppendingPathComponent(self.fileItem.downloadedFilename, isDirectory: false) print("fileFullUrl=\(fileFullUrl)") ///Users/crifan/Library/Developer/CoreSimulator/Devices/84FE8057-ED19-4703-BAE0-7C5156289534/data/Containers/Data/Applicat … %A1.docx // let openFileVC = OpenFileViewController(fileUrl: NSURL(fileURLWithPath: self.fileItem.downloadedFilename, relativeToURL: docDirUrl)) let openFileVC = OpenFileViewController(fileUrl:fileFullUrl!) init(fileUrl:NSURL){ self.fileUrl = fileUrl self.dic = UIDocumentInteractionController(URL: self.fileUrl) super.init(nibName: nil, bundle: nil) } |
中的:
self.dic = UIDocumentInteractionController(URL: self.fileUrl)
出错:
Printing description of docDirUrl: ▿ Optional(/Users/crifan/Library/Developer/CoreSimulator/Devices/84FE8057-ED19-4703-BAE0-7C5156289534/data/Containers/Data/Applicat … ocuments) – Some : /Users/crifan/Library/Developer/CoreSimulator/Devices/84FE8057-ED19-4703-BAE0-7C5156289534/data/Containers/Data/Applicat … ocuments fileFullUrl=Optional(/Users/crifan/Library/Developer/CoreSimulator/Devices/84FE8057-ED19-4703-BAE0-7C5156289534/data/Containers/Data/Applicat … %A1.docx) 2016-01-19 10:45:39.267 JianDao[21652:1222643] *** Assertion failure in -[UIDocumentInteractionController setURL:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.30.14/UIDocumentInteractionController.m:1106 2016-01-19 10:45:39.345 JianDao[21652:1222643] *** Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘UIDocumentInteractionController: invalid scheme (null). Only the file scheme is supported.’ *** First throw call stack: ( 0 CoreFoundation 0x013f9a14 __exceptionPreprocess + 180 1 libobjc.A.dylib 0x036eae02 objc_exception_throw + 50 2 CoreFoundation 0x013f98aa +[NSException raise:format:arguments:] + 138 3 Foundation 0x01a3bd26 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 118 4 UIKit 0x02959fad -[UIDocumentInteractionController setURL:] + 282 5 UIKit 0x029597e5 -[UIDocumentInteractionController initWithURL:] + 88 6 UIKit 0x02959773 +[UIDocumentInteractionController interactionControllerWithURL:] + 71 7 JianDao 0x0028ed31 _TTOFCSo31UIDocumentInteractionControllerCfMS_FT3URLCSo5NSURL_S_ + 81 8 JianDao 0x0028d86b _TFC7JianDao22OpenFileViewControllercfMS0_FT7fileUrlCSo5NSURL_S0_ + 123 9 JianDao 0x0028d9fb _TFC7JianDao22OpenFileViewControllerCfMS0_FT7fileUrlCSo5NSURL_S0_ + 91 10 JianDao 0x000babec _TFC7JianDao24FileManageViewController27downloadFileCompleteHandlerfS0_FTSS10downloadOkSb8respDataGSqCSo6NSData_8errorStrGSqSS__T_ + 5884 11 JianDao 0x000bc810 _TPA + 96 12 JianDao 0x001fc2f9 _TFF7JianDao21downloadFromUrl_asyncFTSS23downloadCompleteHandlerFTSSSbGSqCSo6NSData_GSqSS__T__T_U_FCS_8ResponseT_ + 1545 13 JianDao 0x001f8f44 _TPA__TFF7JianDao21downloadFromUrl_asyncFTSS23downloadCompleteHandlerFTSSSbGSqCSo6NSData_GSqSS__T__T_U_FCS_8ResponseT_ + 260 14 JianDao 0x0019a3cb _TTRXFo_oC7JianDao8Response_dT__XFo_iS0__iT__ + 27 15 JianDao 0x00198e8a _TPA__TTRXFo_oC7JianDao8Response_dT__XFo_iS0__iT__ + 90 16 JianDao 0x0019a114 _TTRXFo_iC7JianDao8Response_iT__XFo_oS0__dT__ + 36 17 JianDao 0x001903da _TPA__TTRXFo_iC7JianDao8Response_iT__XFo_oS0__dT__ + 74 18 JianDao 0x0019a17c _TFFC7JianDao4HTTPW8onFinishGSqFCS_8ResponseT__U_FS1_T_ + 92 19 JianDao 0x00190545 _TPA__TFFC7JianDao4HTTPW8onFinishGSqFCS_8ResponseT__U_FS1_T_ + 101 20 JianDao 0x0019a3cb _TTRXFo_oC7JianDao8Response_dT__XFo_iS0__iT__ + 27 21 JianDao 0x001996ca _TPA__TTRXFo_oC7JianDao8Response_dT__XFo_iS0__iT__55 + 90 22 JianDao 0x001975b7 _TFC7JianDao15DelegateManager10URLSessionfS0_FTCSo12NSURLSession4taskCSo16NSURLSessionTask20didCompleteWithErrorGSqCSo7NSError__T_ + 1559 23 JianDao 0x001976b2 _TToFC7JianDao15DelegateManager10URLSessionfS0_FTCSo12NSURLSession4taskCSo16NSURLSessionTask20didCompleteWithErrorGSqCSo7NSError__T_ + 114 24 CFNetwork 0x009393e4 __51-[NSURLSession delegate_task:didCompleteWithError:]_block_invoke170 + 110 25 Foundation 0x01a6996f __NSBLOCKOPERATION_IS_CALLING_OUT_TO_A_BLOCK__ + 12 26 Foundation 0x0198d85f -[NSBlockOperation main] + 108 27 Foundation 0x0196dce4 -[__NSOperationInternal _start:] + 697 28 Foundation 0x0196da24 -[NSOperation start] + 83 29 Foundation 0x0196d862 __NSOQSchedule_f + 245 30 libdispatch.dylib 0x044129cd _dispatch_client_callout + 14 31 libdispatch.dylib 0x043f6650 _dispatch_queue_drain + 2227 32 libdispatch.dylib 0x043f5b04 _dispatch_queue_invoke + 570 33 libdispatch.dylib 0x043f87bb _dispatch_root_queue_drain + 550 34 libdispatch.dylib 0x043f858e _dispatch_worker_thread3 + 115 35 libsystem_pthread.dylib 0x0473943e _pthread_wqthread + 1050 36 libsystem_pthread.dylib 0x04736f72 start_wqthread + 34 ) libc++abi.dylib: terminating with uncaught exception of type NSException |
如图:
搜:
UIDocumentInteractionController Only the file scheme is supported
ios – UIDocumentInteractionController "invalid scheme (null)" – Stack Overflow
去改为:
let fullUrl = docDirUrl?.URLByAppendingPathComponent(self.fileItem.downloadedFilename, isDirectory: false) print("fullUrl=\(fullUrl)") ///Users/crifan/Library/Developer/CoreSimulator/Devices/84FE8057-ED19-4703-BAE0-7C5156289534/data/Containers/Data/Applicat … %A1.docx let fileUrl = NSURL.fileURLWithPath(fullUrl!.path!) print("fileUrl=\(fileUrl)") //fileUrl=file:///Users/crifan/Library/Developer/CoreSimulator/Devices/84FE8057-ED19-4703-BAE0-7C5156289534/data/Containers/Data/Application/061FE00D-2CAC-4A8A-A2A5-E5EA58344B9B/Documents/user-e85906ff-aca6-457f-af46-793e46b51c71/%E5%BC%A0%E7%82%B3%E6%81%8B-%E8%AE%BE%E8%AE%A1.docx // let openFileVC = OpenFileViewController(fileUrl: NSURL(fileURLWithPath: self.fileItem.downloadedFilename, relativeToURL: docDirUrl)) let openFileVC = OpenFileViewController(fileUrl:fullUrl!) |
结果问题依旧。。
搜:
Assertion failure UIDocumentInteractionController setURL UIKit_Sim UIDocumentInteractionController.m
我此处已经是:
file:///Users/crifan/Library/Developer/CoreSimulator/Devices/84FE8057-ED19-4703-BAE0-7C5156289534/data/Containers/Data/Application/061FE00D-2CAC-4A8A-A2A5-E5EA58344B9B/Documents/user-e85906ff-aca6-457f-af46-793e46b51c71/%E5%BC%A0%E7%82%B3%E6%81%8B-%E8%AE%BE%E8%AE%A1.docx |
了啊。
Open PDF link to PDF Reader in iOS [在iOS打开PDF链接PDF阅读器] – 问题-字节技术
iOS SDK: Previewing and Opening Documents – Envato Tuts+ Code Tutorial
objective c – Open PDF link to PDF Reader in iOS – Stack Overflow
刚刚无语了,发现:
fileUrl=file:///Users/crifan/Library/Developer/CoreSimulator/Devices/84FE8057-ED19-4703-BAE0-7C5156289534/data/Containers/Data/Application/1848E9EA-416B-4DD5-BFB0-BA4C5FA7DB44/Documents/user-e85906ff-aca6-457f-af46-793e46b51c71/%E5%BC%A0%E7%82%B3%E6%81%8B-%E8%AE%BE%E8%AE%A1.docx self.fileUrl=/Users/crifan/Library/Developer/CoreSimulator/Devices/84FE8057-ED19-4703-BAE0-7C5156289534/data/Containers/Data/Applicat … %A1.docx |
即:
之前通过:
let fileUrl = NSURL.fileURLWithPath(fullUrl!.path!)
得到的文件的URL,结果通过同样的NSURL传入后,结果变成了:
没有file:开头的那种普通的文件路径了
所以改为:
let fullUrl = docDirUrl?.URLByAppendingPathComponent(self.fileItem.downloadedFilename, isDirectory: false) print("fullUrl=\(fullUrl)") ///Users/crifan/Library/Developer/CoreSimulator/Devices/84FE8057-ED19-4703-BAE0-7C5156289534/data/Containers/Data/Applicat … %A1.docx // let fileUrl = NSURL.fileURLWithPath(fullUrl!.path!) // print("fileUrl=\(fileUrl)") //fileUrl=file:///Users/crifan/Library/Developer/CoreSimulator/Devices/84FE8057-ED19-4703-BAE0-7C5156289534/data/Containers/Data/Application/061FE00D-2CAC-4A8A-A2A5-E5EA58344B9B/Documents/user-e85906ff-aca6-457f-af46-793e46b51c71/%E5%BC%A0%E7%82%B3%E6%81%8B-%E8%AE%BE%E8%AE%A1.docx let fullFilePath = fullUrl!.path! print("fullFilePath=\(fullFilePath)") //fullFilePath=/Users/crifan/Library/Developer/CoreSimulator/Devices/84FE8057-ED19-4703-BAE0-7C5156289534/data/Containers/Data/Application/C9EAE23F-BCF3-4C2E-9D90-DD282CE8FBB2/Documents/user-e85906ff-aca6-457f-af46-793e46b51c71/张炳恋–设计.docx // let openFileVC = OpenFileViewController(fileUrl: NSURL(fileURLWithPath: self.fileItem.downloadedFilename, relativeToURL: docDirUrl)) // let openFileVC = OpenFileViewController(fileUrl:fullUrl!) let openFileVC = OpenFileViewController(fullFilePath:fullFilePath) self.showViewController(openFileVC, sender: self) class OpenFileViewController: UIViewController, QLPreviewControllerDataSource{ // init(fileUrl:NSURL){ init(fullFilePath:String){ self.fileUrl = NSURL.fileURLWithPath(fullFilePath) print("self.fileUrl=\(self.fileUrl)") //self.fileUrl=file:///Users/crifan/Library/Developer/CoreSimulator/Devices/84FE8057-ED19-4703-BAE0-7C5156289534/data/Containers/Data/Application/C9EAE23F-BCF3-4C2E-9D90-DD282CE8FBB2/Documents/user-e85906ff-aca6-457f-af46-793e46b51c71/%E5%BC%A0%E7%82%B3%E6%81%8B-%E8%AE%BE%E8%AE%A1.docx self.dic = UIDocumentInteractionController(URL: self.fileUrl) super.init(nibName: nil, bundle: nil) } } |
就可以了。
[总结]
iOS采用了SandBox沙箱技术
-》使得更安全
-》但也使得不同程序间共享文件数据更麻烦
-》不同程序间共享文件,往往用的是:UIDocumentInteractionController
-》也可以用:UIDocumentInteractionController来:预览文件,调用其他程序打开文件
此处,确保调用:
UIDocumentInteractionController(URL: self.fileUrl)
时传入的self.fileUrl是文件类型的URL
以file://开头的,比如:
file:///Users/crifan/Library/Developer/CoreSimulator/Devices/84FE8057-ED19-4703-BAE0-7C5156289534/data/Containers/Data/Application/C9EAE23F-BCF3-4C2E-9D90-DD282CE8FBB2/Documents/user-e85906ff-aca6-457f-af46-793e46b51c71/%E5%BC%A0%E7%82%B3%E6%81%8B-%E8%AE%BE%E8%AE%A1.docx |
即可。
对应的这种URL,是通过:
NSURL.fileURLWithPath(fullFilePath) |
得到的。
另外还要注意到:
如果之前已经得到了file://类型的NSURL,但是传入函数后,则会变成普通的不带file://的NSURL!
所以,要注意这点。。。
所以,要在真正调用UIDocumentInteractionController传入file的url时确保你带file://类型的NSURL
转载请注明:在路上 » [已解决]NSInternalInconsistencyException’, reason: ‘UIDocumentInteractionController: invalid scheme (null). Only the file scheme is supported