iOS开发 - invalid binary

本文介绍了iOS10以来,为了能够顺利提交应用至App Store,必须正确配置的应用权限。特别是对于未使用的功能,如麦克风访问等,也需要在Info.plist文件中声明并提供使用说明。

iOS10以来,开发时都需要加入各种权限,通讯录,相册,蓝牙,麦克风,位置信息等等,一开始都是根据自己的需要来加入不同的权限,但是近期突然发现有几个权限属于必加的,否则即使传上去也不能够提交,状态一直是wait submit,料想这种情况出现也有一段时间了。还好去看了绑定的邮箱,苹果有提醒邮件,可以帮助开发者检查权限问题:

Dear developer,
We have discovered one or more issues with your recent delivery for "XXXX". To process your delivery, the following issues must be corrected:
Missing Info.plist key - This app attempts to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSMicrophoneUsageDescription key with a string value explaining to the user how the app uses this data.
Once these issues have been corrected, you can then redeliver the corrected binary.
Regards,
The App Store team

这里博主是因为没有加麦克风权限(因为项目中并没有用到这个功能),被拒绝使用这个包的,至于哪些是必加的还不好说,既然麦克风都加了,那常用的几个肯定要加的如下:

Privacy - Camera Usage Description
Privacy - Contacts Usage Description
Privacy - Microphone Usage Description
Privacy - Photo Library Usage Description
Privacy - Location Always Usage Description(位置信息的还没试过不传会不会发生这种情况,但目前看来,其余四个应该是必加了。)

如果碰到App的invalid binary问题,不知道什么问题的话就看看邮箱吧,也许就是权限的问题了。后面碰到其他问题会继续更新。

<think>我们正在处理的问题:在C++程序中读取json文件时,从VS Code启动exe可以成功,但直接执行exe时出现解析错误。 错误信息:'parse error at line 1, column 1: syntax error while parsing value - invalid literal; last read: '%'' 这个错误通常表示解析器在文件的第一行第一列遇到了一个意外的字符'%'。这意味着当直接运行exe时,程序读取到的文件开头有一个'%'字符,而在VS Code中运行时则没有。 可能的原因及解决方案: 1. 文件路径问题:当直接运行exe时,当前工作目录可能与在VS Code中运行时不同,导致读取了错误的文件(可能不是预期的json文件,而是一个包含'%'开头的文件,例如一个批处理文件或其他文件)。 解决方案:确保程序读取的是正确的文件。可以通过以下方式调试: - 在程序中打印当前工作目录(使用`GetCurrentDirectory`或`std::filesystem::current_path()`)和文件的完整路径,比较两种运行方式下的差异。 - 使用绝对路径来指定json文件,避免相对路径带来的歧义。 2. 文件编码问题:json文件可能被保存为带有BOM(Byte Order Mark)的UTF-8格式或其他编码。在VS Code中运行时,可能能够正确处理BOM,而直接运行时则不行。但注意,BOM在UTF-8中通常是三个字节(EF BB BF),而不是'%'(其ASCII码是37)。所以这个可能性较小,但也不排除。 解决方案:检查json文件的编码,确保是UTF-8 without BOM。可以使用VS Code打开文件,在右下角查看编码,并转换。 3. 文件内容被修改:可能由于某种原因(例如被其他程序修改),当直接运行exe时,json文件的内容被改变,开头被添加了'%'。这可能是由于脚本或其他程序在运行前对文件进行了处理。 解决方案:检查json文件是否被其他程序修改。确保程序在读取文件之前文件内容是正确的。 4. 文件打开错误:如果文件打开失败,读取的内容可能是错误的。但是错误信息显示读取到了'%',所以可能是另一个文件。 5. 重定向或管道:直接运行exe时是否使用了重定向或管道?例如:`program.exe < input.txt`,而input.txt的内容不是json。 6. 防病毒软件或安全软件干扰:某些安全软件可能会在程序读取文件时进行扫描,并临时修改文件内容?这种情况比较少见。 根据错误信息,第一个字符是'%',这通常不是合法的json(json应以'{'或'['或引号开始)。因此,最可能的原因是程序读取了错误的文件。 步骤: 1. 在程序中添加调试信息,输出当前工作目录和要读取的文件路径,以及文件的前几个字符(以十六进制形式输出,这样可以准确看到文件开头是什么)。例如: ```cpp #include <iostream> #include <fstream> #include <iomanip> #include <filesystem> // C++17 int main() { // 获取当前工作目录 std::filesystem::path cwd = std::filesystem::current_path(); std::cout << "Current working directory: " << cwd << std::endl; std::string filename = "config.json"; // 假设文件名 std::cout << "Trying to open: " << filename << std::endl; // 打开文件并读取前几个字节 std::ifstream file(filename, std::ios::binary); if (file) { char buffer[100]; file.read(buffer, sizeof(buffer)); int count = file.gcount(); std::cout << "First " << count << " bytes (hex): "; for (int i = 0; i < count; i++) { std::cout << std::hex << std::setw(2) << std::setfill('0') << (static_cast<unsigned int>(buffer[i]) & 0xFF) << " "; } std::cout << std::endl; } else { std::cout << "Failed to open file." << std::endl; } // ... 原来的json解析代码 } ``` 在两种运行方式下运行,观察输出。 2. 如果发现直接运行时读取的文件内容开头是'%'(对应的十六进制是25),则检查该文件路径下是否真的存在正确的json文件?或者程序是否因为当前目录不同而读取了其他文件? 3. 如果文件路径正确,但内容还是不对,则考虑使用绝对路径来指定json文件。例如: ```cpp std::string filename = "C:/path/to/your/config.json"; // 替换为实际路径 ``` 4. 如果程序需要相对路径,可以在程序启动时从命令行参数中获取文件路径,这样在直接运行exe时可以传入正确的路径。 5. 如果json文件与exe在同一目录,可以使用可执行文件的路径来构建绝对路径。例如: ```cpp #include <filesystem> std::filesystem::path exePath = std::filesystem::current_path(); // 或者使用平台特定的方法获取exe路径 // 注意:直接运行exe时,current_path可能是调用exe时所在的目录,不一定是exe所在的目录。 // 为了获取exe所在的目录,可以使用: #ifdef _WIN32 char path[MAX_PATH]; GetModuleFileName(NULL, path, MAX_PATH); std::filesystem::path exePath = std::filesystem::path(path).parent_path(); #else // Linux等其他系统 #endif std::filesystem::path jsonPath = exePath / "config.json"; ``` 由于问题中提到的错误信息非常具体(开头是'%'),因此重点检查文件内容是否正确以及程序读取的是否是预期的文件。 请尝试以上步骤,特别是添加调试信息,以确定问题根源。 </think> ### 解决C++中JSON解析错误的方法 您遇到的问题是由于**工作目录差异**导致的文件路径错误。当从VS Code启动exe时,工作目录默认是项目目录,而直接双击exe时工作目录是exe所在目录。如果JSON文件不在exe同级目录,解析器会尝试读取错误文件(如临时文件或空文件),导致首字符出现意外的`%`符号。 #### 解决方案步骤: 1. **验证工作目录路径** 在代码中添加工作目录检查: ```cpp #include <iostream> #include <filesystem> namespace fs = std::filesystem; int main() { std::cout << "当前工作目录: " << fs::current_path() << std::endl; // ... 其他代码 } ``` 比较VS Code和直接运行时输出的路径差异。 2. **使用绝对路径加载JSON文件** 将JSON文件路径硬编码为绝对路径(临时方案): ```cpp std::ifstream file("D:/project/config.json"); // 替换为实际路径 ``` 3. **动态获取可执行文件路径**(推荐) 使用跨平台方法定位exe所在目录: ```cpp #include <filesystem> #include <fstream> int main() { auto exePath = std::filesystem::current_path(); // C++17或更高 auto jsonPath = exePath / "config.json"; // 假设json与exe同级 std::ifstream file(jsonPath); if (!file) { std::cerr << "文件未找到: " << jsonPath << std::endl; return 1; } // 解析JSON... } ``` 4. **检查文件内容有效性** 添加文件头验证: ```cpp char header[3]{}; file.read(header, 3); if (std::string(header, 3) != "\xEF\xBB\xBF" && // 跳过BOM头 header[0] != '{' && header[0] != '[') { // 合法JSON应以{或[开头 std::cerr << "无效的JSON起始字节: " << (int)header[0]; } ``` 5. **配置文件部署** - 确保JSON文件与exe在**同一目录** - 在VS Code的`launch.json`中添加工作目录配置: ```json "configurations": [{ "cwd": "${fileDirname}" }] ``` #### 错误原因详解 当直接运行exe时: 1. 系统将`%TEMP%`等环境变量目录设为工作目录 2. 程序尝试读取不存在的`config.json` 3. 可能误读临时文件(如缓存文件首字符为`%`) 4. JSON解析器遇到非法字符`%`报错 > 通过动态路径获取可确保始终加载正确文件[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodingFire

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值