如何避免macOS命令行工具中URLSession引发的XPC错误?
问题描述
在Xcode 14 / Swift环境下创建了一个新的macOS命令行工具,仅包含main.swift文件,代码如下:
import Foundation let url = URL(string: "https://jsonplaceholder.typicode.com/posts/1") let (data, _) = try await URLSession.shared.data(from: url!)
运行程序时通常(并非总是)会生成警告:
[client] No error handler for XPC error: Connection invalid
程序运行实际成功,URLSession.shared.data(from:)返回的data对象有效,可正常解码JSON内容。尝试间隔30-60秒运行,有时仍会出现该错误,询问如何避免这个XPC错误。
解决方案
这个警告的核心原因是命令行工具进程在URLSession的XPC连接完成清理前就提前退出,或者默认的共享URLSession在命令行环境下的生命周期管理存在适配问题。可以通过以下几种方式解决:
显式管理URLSession生命周期
不要使用URLSession.shared,手动创建URLSession实例,并在请求完成后显式调用finishTasksAndInvalidate(),确保XPC连接正常关闭:import Foundation func fetchData() async throws { guard let url = URL(string: "https://jsonplaceholder.typicode.com/posts/1") else { return } let session = URLSession(configuration: .default) defer { session.finishTasksAndInvalidate() // 请求完成后清理会话 } let (data, _) = try await session.data(from: url) // 可添加解码或数据处理逻辑 if let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any] { print(json) } } try await fetchData()给XPC连接留足清理时间
如果坚持使用URLSession.shared,可以在请求完成后添加短暂延迟,让进程等待后台XPC连接完成清理:import Foundation func fetchData() async throws { guard let url = URL(string: "https://jsonplaceholder.typicode.com/posts/1") else { return } let (data, _) = try await URLSession.shared.data(from: url) if let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any] { print(json) } } try await fetchData() // 添加0.1秒延迟,给XPC连接足够时间完成清理 try? await Task.sleep(nanoseconds: 100_000_000)调试环境临时调整
在Xcode的运行方案中,进入"Options"标签页,勾选"Keep alive after exit",不过这个设置仅在Xcode调试时生效,打包后的命令行工具仍需通过代码处理。
内容的提问来源于stack exchange,提问作者protasm
相关产品推荐
相关产品推荐

