挖井

类库大魔王的挖井日记

挖一口属于自己的井


在Mac上给Qt程序用Developer ID签名

最近想着赶紧弄个程序出来上架到Mac App Store去,因为我只会用Qt写Mac的GUI程序,所以要研究一下如何把Qt程序签名上架,结合网上找到的这篇这篇,以及这篇文章,折腾了几天了,最终,仍然没搞定怎么签能上架Mac App Store的Qt程序,貌似只搞定了Developer ID类型的,即在Mac App Store以外发布的程序,这种签名唯一的用处貌似是别人拿去能直接运行而不会弹出个消息框说来自不受信任的开发者(其实我是猜的,没验证过。

算了,先把这个步骤记录一下。

  1. 首先,当然是得有Apple开发者账号,然后在后台创建好App ID和证书,这App ID对Developer ID类型的是否必须我也不确定,但要上Mac App Store肯定是需要的,证书我只管Production类型里Developer ID和Mac App Store两种,创建好后下载到本地,点击下载到的.cer文件自动导入到Keychain中,这时在Keychain的login-My Certificates分类里可以看到新导入的证书,关注证书的名称,后面签名时要用到,如果copy不出来(我就遇到了,右键菜单怎么点都没用),就用命令行certtool y | grep ": <YourName> ",会列出本机安装的所有开发发布用的证书。如果是用Xcode,就不用记,Xcode会自动获取,但我后面是用命令行的,没办法。
  2. Qt程序编译好之后,用macdelpoyqt命令把Qt的各个Framework都copy到程序的bundle中,加参数-appstore-compliant可以跳过Mac App Store不兼容的那些lib。
  3. 据说,如果发布到Mac App Store,是要用Sandbox的,要用Sandbox的话,就得在一个entitlements文件中设置一些权限,比如说用户可以选择本机的文件进行读写之类的(好严格)。这个entitlements文件可以用Xcode随便创建个新工程,然后在Targets-Capabilities里设置然后就自动生成一个.entitlements为后缀的文件了。
  4. 最后,命令行codesign -s "Developer ID Application: Your Name (XXXXXX)" -v --timestamp=none --entitlements MyApp.entitlements -f --deep MyApp.app对app签名。其中,-s指定证书名称,就是第1步列出来的那些证书中的选择Developer ID的一个,-v表示输出详细信息,--timestamp我也不清楚具体什么作用,这么写就行,--entitlements指定第3步生成的那个.entitlements文件,-f指可以覆盖原有的签名,--deep使得app bundle内的所有能签名的Framework都会被分别签名。

到此,签名算是完成了,可以通过命令spctl -a -v MyApp.app进行验证,如果签名成功了,大概会输出诸如此类的信息:

MyApp.app: accepted
source=Developer ID

不然就可能是这样的:

MyApp.app: rejected
source=no usable signature

原本我以为只要把证书换成Mac App Store的,就能签名成功并去上架Mac App Store了,结果用spctl看一直是rejected的,这个问题就要再研究了。

本文地址:

https://minidump.info/blog/2016/08/codesign-qt-application-with-developer-id-on-mac/

上一篇

avege Android版的计划

前些天看到有人移植了SSR Android版,我就顺便看了看代码,结合网上的一篇文章,觉得似乎挺简单的,它(官方也)用Java/Scala写了个外壳和启动VPN service,其他功能是几个用C写的程序共同完成,包括redsocks,tun2socks,ss-tunnel,ss-local,...…

Shareware 全文阅读
下一篇

Go在CJK编码和UTF-8间转换

之前也折腾过,但是没完美解决,最近在爬些数据,然后想保存成统一的编码,于是自然而然地有编码转换的问题,在网上找最多的解决方案是通过CGO调用iconv实现,这个方案在mac或Linux之类的系统上很好解决,因为基本上都会有iconv的链接库,即使没有,一条命令就装上了,但在Windows上就麻...…

Go 全文阅读