公证系列:
- WWDC21: juejin.cn/post/711161…
1: Deadline:
在2023年秋季, 基于xcode13及Xcode13以下版本的GUI公证和xcrun altool的命令行公证的方法会被淘汰.
2: 基于xcode14的GUI公证会有速度上的提升
去年的WWDC21介绍了如果开发者用命令行公证的话: 用notarytool 代替 altool会使upload的速度提升四倍.
今年的WWDC22声称用xcode14代替Xcode13, upload的速度也会有四倍的提升, 因为Xcode14用了和notarytool 同样可靠的后端. 除了开发者升级Xcode外, 其他流程并不用改动.
3: 通过Web提交公证
之前在WWDC19和WWDC21无非介绍了两种形式的公证, 一种是基于xcode的GUI操作, 第二种是基于command line的操作. 然而这两种方式都依赖于必须要有Mac OS的build server.
在WWDC22, 苹果新提出了一种公证方式, 使公证不一定依赖于Mac OS, 通过call API就可以完成公证, 下面来看一下步骤(这里用Python举例子):
3.1 创建私钥
当通过发送web这种方式提交公证的时候, 需要创建一个私钥(developer.apple.com/documentati…),并将私钥保管好. 创建私钥的前提是你必须是admin
3.2 创建Token
[developer.apple.com/documentati…]
创建signed token,每次 call API的时候把Token加到 header 里面. 像下面这样:
% curl -v -H "Authorization: Bearer <token>" "https://appstoreconnect.apple.com/notary/v2/submissions"
3.3 Submission
首先用Post call appstoreconnect.apple.com/notary/v2/s…, 这次call 并不会upload 包, 只是告诉苹果的公证服务我要提交一个包上去. 然后用返回的Json信息去upload.
返回的Json在12小时之后会过期, 过期之后需要重新去生成, 大概长这个样子:
{
"data": {
"attributes": {
"awsAccessKeyId": "ASIAIOSFODNN7EXAMPLE",
"awsSecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
"awsSessionToken": "AQoDYXdzEJr...",
"bucket": "EXAMPLE-BUCKET",
"object": "EXAMPLE-KEY-NAME"
},
// 之后用这个id来查询公证的状态, 跟requestUUID一样
"id": "2efe2717-52ef-43a5-96dc-0797e4ca1041",
"type": "submissionsPostResponse"
},
"meta": {
}
}
因为是Upload 包到Amazon S3, 可以使用Amazon 提供的library: boto3 来完成这一过程
这里苹果用Python代码举例:
import boto3
// 函数upload_file
def upload_file(token, filepath, sha256):
data = { "sha256": sha256, "submissionName": os.path.basename(filepath) }
// post 请求通知苹果要upload一个包
resp = requests.post(
"https://appstoreconnect.apple.com/notary/v2/submissions",
json=data,
headers={"Authorization": "Bearer " + token})
// 得到了请求的jaon
output = resp.json()
// 解析jaon
aws_info = output["data"]["attributes"]
submission_id = output["data"]["id"]
client = boto3.client(
"s3",
aws_access_key_id=aws_info["awsAccessKeyId"],
aws_secret_access_key=aws_info["awsSecretAccessKey"],
aws_session_token=aws_info["awsSessionToken"])
// 开始upload 包
client.upload_file(filepath, aws_info["bucket"], aws_info["object"])
3.4 轮询等待公证结果
用get方法请求appstoreconnect.apple.com/notary/v2/s… 可以查询到公证结果.
就像这样:
% curl -v -H "Authorization: Bearer <token>" "https://appstoreconnect.apple.com/notary/v2/submissions/2efe2717-52ef-43a5-96dc-0797e4ca1041"
写在python里是这样
def watch_upload(submission_id, token):
while True:
resp = requests.get(
"https://appstoreconnect.apple.com/notary/v2/submissions/" + submission_id,
headers={"Authorization": "Bearer " + token})
output = resp.json()
current_status = output["data"]["attributes"]["status"]
if current_status != "In Progress":
return current_status # For example: Accepted or Invalid
time.sleep(30) # Allow time for submission to progress
3.5 下载到公证的log
用get方法请求appstoreconnect.apple.com/notary/v2/s… 可以下载到公证的log.
% curl -v -H "Authorization: Bearer <token>" "https://appstoreconnect.apple.com/notary/v2/submissions/2EFE2717-52EF-43A5-96DC-0797E4CA1041/logs"
可以仿照上面的方式:把这段shell写成python的形式.