关于苹果公证(Apple Notarizition)机制的一些总结

  升级苹果系统到MAC10.15后,一般用户没什么影响,但是开发者要一阵忙碌,每次苹果发新系统都是玩开发者团团转,这是历史陋习了。

  这次强制启动Notarizition机制,以前的codesign和productsign不管用了,必须要发送文件夹给苹果服务器进行公证。不然就只能要求用户在首次安装(使用)时按右键弹出菜单“open”进行安装或使用,并且还“威胁”说某年某月某一天没有公证的app不能运行,所以只能捏着鼻子跟着流程走。问题是国内的博客和论坛都没有详细的攻略(也行有,可能我搜不到而已)。

  废话说够了,现在入正题。

  首先肯定是codesign,不能单纯按旧的跑了,要加几个参数,我给个例子,读者自行比较:

sudo codesign -f -o runtime --entitlements {path}/app.entitlements --timestamp --deep -s "Developer ID Application: xxx" -i "com.xxx.abc" "{path}/abc.app" 

如果在工程里面配置了entitlements环境文件(打开强运行时Hardened Runtime),则可以省略“--entitlements {path}/app.entitlements”

  这样签名得到的app也是可以用的,用codesign -vv xxx.app查不出什么问题的。用spctl -a -v xxx.app也看不出什么问题。和以前的一样嘛(实际上后来得知是不一样的)

  其次用pkgbuild+productbuild配合打包一个pkg文件,具体我不会细说,有点麻烦,但是不难。

  再次就是用productsign签名pkg:

productsign --sign "Developer ID Installer: xxx" "from-pkg.pkg" "to-pkg.pkg"

到此为止旧版也这样玩,没太大区别。下面讲讲Notarizition机制的。

1.将已经签名的pkg发送给苹果公证。

xcrun altool --notarize-app --primary-bundle-id "com.xxx.abc" --username "my apple id" --password "app-password" --asc-provider "ProviderShortname" -t osx --file $Base_Path/Output/abc.pkg &> $Base_Path/abc.txt

--primary-bundle-id 后面跟着自己app的bundle id,-u或--username跟着是苹果ID;-p或--password后面是用户密码,这里要注意一下,貌似苹果要求启动两步认证机制后才能得到app password的。先登录appleid.apple.com,在用户安全里面先启用两步认证(就是多了用手机接收一个验证码而已),然后可以看到创建app password,对,就是这个密码了,可以避免暴露真实的密码。。。第三个参数是provider,使用命令行:

xcrun altool --list-providers -u "my apple id" -p "app password"

查询到类似这样的:

#ProviderName                   ProviderShortname           WWDRTeamID 
#------------------------------ --------------------------- ---------- 
#abc TECHNOLOGY LIMITED         abcTECHNOLOGYLIMITED        DD12345678 

这里使用到provider是因为本人不是app holder,属于公司组下的成员,所以要用“--asc-provider 组缩写”,也有其他的参数可以实现同样的功能,自行搜索。;-t或--type应该是目标程序运行平台吧;-f或--file后面跟着是pkg路径 。这些命令都是可以用

xcrun altool -h

查询到。最后跟着“&> abc.txt”是为了打印log或者uuid的。一般看到0字节,那就安静等待吧。

一般公证成功后,abc.txt的内容是:

No errors uploading 'xxx.pkg'.
RequestUUID = xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

其他情况可能出错了,我记得昨天使用了-tsc-provider "team name",log里面会显示我不在该组。所以有必要将log打印出来,然后慢慢分析。

既然通过了公证,那就将对应的票据加进来:

#添加票据
xcrun stapler staple abc.pkg
#查询结果(这里可以看到,苹果系统会下载一个xxx.ticket的文件到临时文件,然后。。。)
xcrun stapler staple -v  abc.pkg

至此,pkg完成了公证,实际上pkg里面的app也一样完成了公证。重新输入

spctl -a -v abc.app
#打印的结果是:
/xxx/abc.app: accepted
source=Notarized Developer ID

#如果没公证的话,应该显示这样的:
/xxx/abc.app: accepted
source=Developer ID

还有查询一下pkg

spctl -a -v --type install abc.pkg 
#公证后的
/xxx/abc.pkg: accepted
source=Notarized Developer ID

#没公证的
/xxx/abc.pkg: rejected
source=Unnotarized Developer ID

总结一下:

codesign app-->productsign pkg-->send to apple server & get a uuid->add ticket

另外本人喜欢偷懒,将截图这茬事忘了,将就着看吧。

上一篇:最全的 pip 使用指南,50% 你可能没用过


下一篇:换个语言学一下 Golang (11)——使用包和测试