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

如何避免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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 12:01:11