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

iOS App Group真机文件保存失败(模拟器正常)求助

iOS真机上App Groups共享容器写入权限错误(NSPOSIXErrorDomain Code=1)

问题描述

在iOS主应用和关联的Preview扩展中,尝试通过App Groups将数据写入共享容器,代码在模拟器运行正常,但真机上抛出权限错误:
{Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}

相关代码

保存数据函数:

let appGroupIdentifier = "group.com.yourcompany.yourapp"

func saveDataToSharedContainer(fileName: String, data: Data) -> Bool {
    guard let containerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier) else {
        print("Error: Unable to access the shared container.")
        return false
    }

    let fileURL = containerURL.appendingPathComponent(fileName)

    do {
        try data.write(to: fileURL, options: .atomic)
        print("Data saved to shared container successfully.")
        return true
    } catch {
        print("Error: Unable to save data to shared container. \(error)")
        return false
    }
}

调用代码:

let fileName = "example.txt"
let dataToSave = "Hello, World!".data(using: .utf8)!

if testSaveDataToSharedContainer(fileName: fileName, data: dataToSave) {
    print("Data saved successfully.")
} else {
    print("Error saving data.")
}

已完成的排查

  • 主应用和Preview扩展均启用App Groups功能
  • 主应用、扩展、代码中的App Group标识符完全一致
  • 更新配置文件和签名证书,清理项目、重置配置文件后问题依旧
  • 新建带Preview扩展的项目可复现该问题

可能的解决方案

1. 确保共享容器目录存在

真机上共享容器目录可能未自动创建,修改保存函数,先创建目录再写入:

func saveDataToSharedContainer(fileName: String, data: Data) -> Bool {
    guard let containerURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: appGroupIdentifier) else {
        print("Error: Unable to access the shared container.")
        return false
    }
    // 确保容器目录存在,不存在则创建
    do {
        try FileManager.default.createDirectory(at: containerURL, withIntermediateDirectories: true, attributes: nil)
    } catch {
        print("Error creating container directory: \(error)")
        return false
    }

    let fileURL = containerURL.appendingPathComponent(fileName)

    do {
        try data.write(to: fileURL, options: .atomic)
        print("Data saved to shared container successfully.")
        return true
    } catch {
        print("Error: Unable to save data to shared container. \(error)")
        return false
    }
}

2. 检查Preview扩展的沙箱权限

Preview扩展的沙箱设置可能限制写入:

  • 选中Xcode中的Preview扩展目标
  • 进入「Signing & Capabilities」标签
  • 检查「App Sandbox」配置,确保「File Access」允许对共享容器的写入,或开启「Outgoing Connections (Client)」

3. 清除真机缓存的旧配置

即使更新了配置文件,真机可能仍缓存旧的权限配置:

  • 打开真机「设置」-「通用」-「VPN与设备管理」,删除旧的开发者应用配置
  • Xcode中执行「Product」-「Clean Build Folder」,重新编译安装
  • 重启真机后再测试

4. 处理已存在的文件冲突

如果目标文件已被其他进程锁定,会导致写入失败,可添加前置处理:

// 在写入前检查并删除已存在的文件
let fileURL = containerURL.appendingPathComponent(fileName)
if FileManager.default.fileExists(atPath: fileURL.path) {
    do {
        try FileManager.default.removeItem(at: fileURL)
    } catch {
        print("Error removing existing file: \(error)")
        return false
    }
}

5. 重新验证App Group配置

再次确认Apple Developer后台和Xcode的配置一致性:

  • 登录Apple Developer后台,查看主应用和扩展的App ID,确认App Groups已添加且标识符一致
  • 在Xcode中为应用和扩展重新添加App Groups capability,选中正确的标识符后重新生成配置文件

内容的提问来源于stack exchange,提问作者pmark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 11:35:14