You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 14:00:33