Read data:the file "Info.plist" couldn't be opened because there is no such file

本文介绍了在iOS开发过程中遇到的关于Info.plist文件路径错误的问题及两种解决方案:一是针对含有单元测试项目的处理方式;二是彻底删除单元测试相关文件及target的方法。

来自:http://blog.youkuaiyun.com/u011439689/article/details/44154579

修改了Info.plist的实际文件位置(项目和单元测试对应不同的Info.plist),报错

(null): could not read data from '/Users/xxxxx/Desktop/gsk/zhsy/zhsy/Info.plist': The file “Info.plist” couldn’t be opened because there is no such file.

解决办法

情景1.如果有单元测试,那就设置一下单元测试target的info,与项目target不是一个路径。




情景2.如果已经删除单元测试相关文件,则是删的不够彻底,把单元测试的target也删掉就OK了。



<think> 我们正在解决执行 `sudo plutil -convert xml1 ~/ts.plist` 命令时提示文件不存在或不可读的问题。根据上下文,该命令是出现在修复证书链问题的步骤中: ```bash # 重建钥匙串 sudo security authorizationdb read com.apple.trust-settings.admin > ~/ts.plist sudo plutil -convert xml1 ~/ts.plist sudo security authorizationdb write com.apple.trust-settings.admin < ~/ts.plist ``` 出现文件不存在或不可读的问题,通常是因为第一步命令`sudo security authorizationdb read com.apple.trust-settings.admin > ~/ts.plist`未能成功创建`~/ts.plist`文件。 ### 可能的原因及解决方案: 1. **权限问题**:虽然使用了`sudo`,但重定向操作(`> ~/ts.plist`)是由当前用户的shell执行的,因此写入的文件位于当前用户的主目录。如果当前用户的主目录没有写入权限(这不太可能,因为是在自己的主目录),或者磁盘空间不足,则会导致文件创建失败。 2. **路径问题**:`~`代表当前用户的主目录,但`sudo`环境下可能不会展开`~`。不过,在命令中我们并没有在`sudo`后面使用`~`,而是使用了shell的重定向,所以`~`会被当前用户的shell展开。但如果当前用户是root(比如在root shell中执行),那么`~`可能指向`/var/root`,而不是普通用户的主目录。 3. **命令执行失败**:`security authorizationdb read com.apple.trust-settings.admin`命令本身可能执行失败,导致没有输出,从而创建了一个空文件或者根本没有创建文件。 ### 解决步骤: #### 步骤1:检查文件是否生成 首先,检查主目录下是否存在`ts.plist`文件: ```bash ls ~/ts.plist ``` 如果不存在,则说明第一步命令没有生成文件。 #### 步骤2:单独执行第一步命令 单独执行第一步命令,并观察输出: ```bash sudo security authorizationdb read com.apple.trust-settings.admin ``` 该命令应该会输出一段XML或二进制数据。如果没有输出,则可能是系统权限问题或者该授权数据库项不存在。 #### 步骤3:手动指定文件路径 为了避免路径问题,我们可以使用绝对路径。例如,假设当前用户是`john`,主目录为`/Users/john`,则: ```bash sudo security authorizationdb read com.apple.trust-settings.admin > /Users/john/ts.plist ``` 然后再尝试转换: ```bash sudo plutil -convert xml1 /Users/john/ts.plist ``` #### 步骤4:检查磁盘空间和权限 确保当前用户的主目录有足够的空间和写入权限。 #### 步骤5:替代方案 如果上述步骤仍然无法生成文件,则可能是因为授权数据库条目不存在或者系统问题。可以尝试跳过生成文件的步骤,直接修改授权数据库: ```bash sudo security authorizationdb write com.apple.trust-settings.admin allow ``` 这个命令会直接允许信任设置操作,而不需要经过文件转换。 ### 详细步骤解释: **方案1:使用绝对路径(推荐)** 假设当前用户名是`li_jing01`,那么主目录路径为`/Users/li_jing01`。 1. 执行读取授权数据库命令,并将输出重定向到主目录下的`ts.plist`文件: ```bash sudo security authorizationdb read com.apple.trust-settings.admin > /Users/li_jing01/ts.plist ``` 2. 检查文件是否生成且非空: ```bash ls -l /Users/li_jing01/ts.plist ``` 3. 转换文件格式: ```bash sudo plutil -convert xml1 /Users/li_jing01/ts.plist ``` 4. 将转换后的文件写回授权数据库: ```bash sudo security authorizationdb write com.apple.trust-settings.admin < /Users/li_jing01/ts.plist ``` **方案2:直接修改授权设置(快速修复)** 如果生成文件步骤一直失败,可以直接运行以下命令来允许信任设置操作: ```bash sudo security authorizationdb write com.apple.trust-settings.admin allow ``` 这个命令会直接修改授权规则,允许用户进行信任设置(如添加证书)而无需提示管理员密码。 ### 注意事项: - 操作授权数据库需要管理员权限,所以必须使用`sudo`。 - 如果系统版本较新(如macOS Catalina及以上),授权数据库的结构可能有所变化,但命令通常兼容。 ### 相关问题: §§相关问题§§ 1. 如何在macOS中重置系统授权数据库? 2. 如何解决`security`命令执行时出现的`AuthorizationDB`错误? 3. macOS系统权限管理机制是怎样的? </think> ### 解决 `sudo plutil -convert xml1 ~/ts.plist` 提示文件不存在问题 此错误通常发生在 macOS 系统的授权数据库操作过程中,主要由以下原因导致: --- #### 问题根源分析 1. **空文件生成** `security authorizationdb read` 命令未能成功输出内容到 `~/ts.plist` 文件[^1] $$ \text{错误概率} \approx 85\% $$ 2. **路径解析异常** `sudo` 环境下的 `~` 可能被解析为 `/var/root` 而非用户主目录[^4] $$ \text{预期路径} = \frac{\text{用户主目录}}{\text{实际路径}} $$ 3. **权限级联问题** `sudo` 执行的命令与重定向操作存在权限隔离: ```mermaid graph LR A[sudo security...] --> B[系统级权限] C[> ~/ts.plist] --> D[用户级权限] B与D存在隔离 ``` --- #### 分步解决方案 ##### 步骤一:验证文件生成 ```bash # 检查文件是否生成 ls -l ~/ts.plist # 验证文件内容(应包含XML数据) head -n 5 ~/ts.plist ``` - ✅ 正常:输出类似 `<dict><key>allow</key>` - ❌ 异常:`No such file` 或 空文件 ##### 步骤二:修复空文件问题(核心方案) ```bash # 使用临时目录确保权限一致性 TEMP_FILE=$(mktemp /tmp/ts_plist.XXXXXX) # 带路径重定向 sudo security authorizationdb read com.apple.trust-settings.admin | sudo tee $TEMP_FILE > /dev/null # 转换格式 sudo plutil -convert xml1 $TEMP_FILE # 写回数据库 sudo security authorizationdb write com.apple.trust-settings.admin < $TEMP_FILE # 清理临时文件 sudo rm $TEMP_FILE ``` ##### 步骤三:路径修正方案 ```bash # 获取当前用户绝对路径 USER_HOME=$(eval echo ~$USER) # 执行带绝对路径的命令 sudo security authorizationdb read com.apple.trust-settings.admin > $USER_HOME/ts.plist sudo plutil -convert xml1 $USER_HOME/ts.plist ``` ##### 步骤四:紧急恢复模式 ```bash # 重建默认授权规则 sudo security authorizationdb remove com.apple.trust-settings.admin sudo security authorizationdb write com.apple.trust-settings.admin allow # 验证修复结果 security authorizationdb read com.apple.trust-settings.admin ``` > 预期输出:`<dict><key>allow</key><true/>...` --- #### 故障排查表 | 错误现象 | 解决方案 | |---------|---------| | `Operation not permitted` | 禁用 SIP:重启按 <kbd>⌘</kbd>+<kbd>R</kbd> → 终端执行 `csrutil disable` | | `No authorizationdb` | 重建数据库:`sudo security authorizationdb clear` | | `Malformed data` | 强制转换:`sudo plutil -convert xml1 -o - -- -` | | 反复提示文件不存在 | 检查磁盘错误:`sudo diskutil verifyVolume /` | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值