我有一个OS X应用程序,它使用XCode之外的自定义构建流程。因此,我必须在命令行模式下使用codesign工具来签署应用程序中的所有内容。我使用的命令行是:
codesign -f -s“开发者ID应用程序:MyCompany Inc”-i com.mycompany.myapp -v $ Path_To_App
我首先通过将每个二进制文件,框架和插件的路径传递为$ Path_To_App来签署应用程序中的每个二进制文件,框架和插件。然后我通过传递应用程序文件夹MyApp.app的路径来签署整个应用程序。
之后,我使用以下命令构建dmg文件:
hdiutil create -format UDBZ -srcfolder path_to_app_folder myapp.dmg
如果我在本地安装这个dmg文件,一切都很好。我相信在这种情况下OS X甚至不检查证书。但是在我将dmg文件上传到Web服务器后,使用浏览器下载并将应用程序解压缩到Applications文件夹中,操作系统拒绝该应用程序已损坏。消息是:
“MyApp”已损坏,无法打开。你应该将它移到垃圾桶。
如果我像这样检查签名,那很好:
codesign --verify --verbose /Applications/MyApp.app
/Applications/MyApp.app:在磁盘上有效 /Applications/MyApp.app:满足其指定要求
但是,如果我用spctl检查它,它会抱怨:
spctl -a -v /Applications/MyApp.app /Applications/MyApp.app:密封资源丢失或无效
我不确定我在哪里做错了。以下是网络上已签名的dmg文件的网址:http://www.slimjet.com/test/slimjet1.dmg。
这是一个更新。当我将应用程序解压缩到/ Applications文件夹并从那里运行时,仅显示损坏警告。如果我将其放入任何其他文件夹并运行,或直接从已安装的dmg存档运行它,它就可以正常运行。
答案 0 :(得分:0)
你忘了也编码:
FlashPeak Slimjet.app/Contents/Versions/13.0.6.0/FlashPeak Slimjet Helper.app
FlashPeak Slimjet.app/Contents/Versions/13.0.6.0/FlashPeak Slimjet Framework.framework/Resources/app_mode_loader.app
由于他们没有经过编码,这可能是个问题;可能还有其他人,但先检查一下。
答案 1 :(得分:0)
事实证明,网守会保留有关先前失败的缓存信息。即使您稍后通过应用所有正确的签名来解决问题,spctl命令仍会报告相同的错误,而不会再次实际检查它。 codesign命令不使用缓存,但spctl使用缓存。我不得不通过以下命令重置系统策略数据库:
sudo cp /var/db/.SystemPolicy-default / var / db / SystemPolicy
之后,我重新启动操作系统。然后我的应用程序运行正常。虽然spctl有一个" - ignore-cache"切换,在这种情况下它没有任何效果。