使用NSFilePromiseProvider向macOS剪贴板复制文件时崩溃的问题求助
NSFilePromiseProvider向macOS剪贴板复制文件时崩溃的问题求助
各位好,我现在遇到一个棘手的问题:尝试用NSFilePromiseProvider将文件复制到macOS剪贴板时程序总是崩溃,想请教大家我哪里操作错了或者遗漏了什么配置。
我的场景是这样的:macOS项目里已经把一个文本文件加入了bundle,我能成功加载到这个文件的URL,并且确认文件是存在的。之后我把这个URL传给下面的代码执行剪贴板操作:
let pasteboard = NSPasteboard.general pasteboard.clearContents() let declaredUTType = (UTType(filenameExtension: fileURL.pathExtension)?.identifier) ?? "public.data" let promiseWriter = FilePromiseWriter(sourceURL: fileURL, fileName: fileURL.lastPathComponent) let provider = NSFilePromiseProvider(fileType: declaredUTType, delegate: promiseWriter) pasteboard.writeObjects([provider])
我的NSFilePromiseProviderDelegate实现类是这样的:
final class FilePromiseWriter: NSObject, NSFilePromiseProviderDelegate { private let sourceURL: URL private let fileName: String init(sourceURL: URL, fileName: String) { self.sourceURL = sourceURL self.fileName = fileName } func filePromiseProvider(_ filePromiseProvider: NSFilePromiseProvider, writePromiseTo url: URL) async throws { print("filePromiseProvider writePromiseTo url called - destinationURL: \(url)") assert(FileManager.default.fileExists(atPath: sourceURL.path)) try FileManager.default.copyItem(at: sourceURL, to: url) } func filePromiseProvider(_ filePromiseProvider: NSFilePromiseProvider, fileNameForType fileType: String) -> String { print("filePromiseProfile fileName called = \(fileName)") return fileName } }
崩溃发生在pasteboard.writeObjects([provider])这一行,崩溃日志里的关键断言错误是:
*** Assertion failure in -[NSPasteboardItem setString:forType:], NSPasteboardItem.m:222
Invalid parameter not satisfying: string
完整的崩溃栈信息如下:
0 CoreFoundation 0x000000018af9aca0 __exceptionPreprocess + 176 1 libobjc.A.dylib 0x000000018aa5eb90 objc_exception_throw + 88 2 Foundation 0x000000018c5a9a78 -[NSCalendarDate initWithCoder:] + 0 3 AppKit 0x000000018f0d107c -[NSPasteboardItem setString:forType:] + 164 4 AppKit 0x000000018fa1d314 -[NSFilePromiseProvider _pasteboard:item:provideDataForType:completionHandler:] + 24 5 AppKit 0x000000018f71f958 __68-[NSPasteboard _setOwner:forTypes:atIndex:selector:usesPboardTypes:]_block_invoke + 728 6 CoreFoundation 0x000000018aff0c10 -[_CFPasteboardEntry resolvePromisedDataWithCompletionQueue:isLocalPromise:completionHandler:] + 556 7 CoreFoundation 0x000000018aff46f4 ___CFPasteboardHandleFulfillMessage_block_invoke_2 + 172 8 CoreFoundation 0x000000018af29874 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 28 .... 22 TestCopyFilePasteboardCrash.debug.d 0x000000010243a308 $s27TestCopyFilePasteboardCrash0abcdE3AppV5$mainyyFZ + 40 23 TestCopyFilePasteboardCrash.debug.d 0x000000010243a3b4 __debug_main_executable_dylib_entry_point + 12 24 dyld 0x000000018aa9eb98 start + 6076
FAULT信息:
NSInternalInconsistencyException: Invalid parameter not satisfying: string; { NSAssertFile = "NSPasteboardItem.m"; NSAssertLine = 222; }
我现在的疑问是:是不是我哪里漏了什么配置或者代码写错了?另外代理的回调方法完全没被调用(不过我本来以为这些回调应该是在粘贴的时候触发,而不是复制的时候)。我试过开启和关闭App Sandbox,两种情况都会崩溃。
内容来源于stack exchange
相关产品推荐
相关产品推荐

