我可以自动将 iOS 应用程序提交到 AppStore。在 Windows 机器中执行的批处理文件:
plink.exe -batch -pw [PASSWORD] [LOGIN]@[IP_ADDRESS] /Applications/Xcode.app/Contents/SharedFrameworks/ContentDeliveryServices.framework/Versions/A/Frameworks/AppStoreService.framework/Versions/A/Support/altool --upload-app -f /Temp/upload.ipa --type ios -u [USERNAME] -p [PASSWORD]
PLink 连接到远程 MAC 机器并执行
altool
,将应用程序上传到 AppStore。该代码之前可以工作,但是在我更新了 XCode(即altool
)和plink
之后,它不再工作了。错误输出如下:
2023-04-28 07:02:57.682 *** Error: /usr/bin/ditto, terminated with status: 1
2023-04-28 07:02:57.686 *** Error: Validation failed for '/Temp/upload.ipa'.
2023-04-28 07:02:57.686 *** Error: The package could not be unpacked because of the following error: Unable to extract archive. Please make sure /Temp/upload.ipa is a valid zip or ipa archive. Unable to validate your application. (-20008)
{
NSLocalizedDescription = "The package could not be unpacked because of the following error: Unable to extract archive. Please make sure /Temp/upload.ipa is a valid zip or ipa archive.";
NSLocalizedFailureReason = "Unable to validate your application.";
}
但是,如果我直接在MAC OS上执行
altool
(altool
参数完全相同):
/Applications/Xcode.app/Contents/SharedFrameworks/ContentDeliveryServices.framework/Versions/A/Frameworks/AppStoreService.framework/Versions/A/Support/altool --upload-app -f /Temp/upload.ipa --type ios -u [USERNAME] -p [PASSWORD]
然后上传成功:
================
UPLOAD SUCCEEDED
Delivery UUID: *****
Transferred 54415023 bytes in 2.467 seconds (22.1MB/s)
================
No errors uploading '/Temp/upload.ipa'
我检查它是否可以访问该文件(如果我输入错误的文件名,我会得到一个不同的错误)。我尝试在
sudo
之前添加 altool
- 它没有任何区别。显然所有密码都是正确的,因为如果我输入错误的密码,它会给我另一个错误。
我的想法用完了。请帮助。
为什么直接使用
altool
有效,但它不能通过 plink
远程工作?
好吧,找到解决方案后我觉得很愚蠢,但还是决定发布它以防对任何人有帮助。
我使用在 Mac OS 桌面上创建的 Temp 文件夹临时保存 IPA 文件。即使我更改了读/写权限(对文件夹和随附的项目),我仍然无法使其工作。解决方案是使用 /private/tmp 文件夹(别名只是 /tmp,但从 Windows 远程看不到别名)。 /tmp 文件夹有权从头开始写入任何人,因此您无需更改任何内容。所以,这就是“无法解压包裹”消息的问题。我想
altool
试图打开 IPA 的包装。
其次,这与我在 Windows 上执行批处理文件的工具更相关——出于某种原因,
altool
将所有输出写入 StandardError
而不是 StandardOutput
。这很奇怪,但是所有正常消息都会转到标准错误输出,没有任何内容来自标准输出。所以,如果你尝试阅读StandardOutput
- 你将一无所获。