[WWDC22]公证(Notarization)流程的更新

633 阅读2分钟

公证系列:

1: Deadline:

2023年秋季, 基于xcode13Xcode13以下版本的GUI公证xcrun altool命令行公证的方法会被淘汰.

截屏2022-06-21 10.24.30.png

2: 基于xcode14的GUI公证会有速度上的提升

去年的WWDC21介绍了如果开发者用命令行公证的话: 用notarytool 代替 altool会使upload的速度提升四倍.

今年的WWDC22声称用xcode14代替Xcode13, upload的速度也会有四倍的提升, 因为Xcode14用了和notarytool 同样可靠的后端. 除了开发者升级Xcode外, 其他流程并不用改动.

3: 通过Web提交公证

之前在WWDC19WWDC21无非介绍了两种形式的公证, 一种是基于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的形式.