logo科技微讯

再次分析 Apple OTA 检测

作者:科技微讯
日期:2022-09-21
📝 笔记

我写的微信小程序“通知中心”支持订阅 iOS、macOS、watchOS 等苹果系统的更新通知,但有时候可能有三十分钟左右的延迟,被用户吐槽通知得太慢,于是再次认真分析了 iOS 的 OTA 检测。

以下是我的调查笔记。

获取设备列表

要想获得苹果产品列表、设备型号、ProductName 等信息,可以用 ipsw.me 的这个 API,返回的结果包含了 iPhone、iPad、watch、mac、tv。

async function app() {
    url: url,
    responseType: "json",
  }).then((res) => res.body);
    .map((item) => {
      return {
        name: item.name,
        identifier: item.identifier,
        kind: item.name
          .replace(/^([^\s]+)\s{1}.+$/gi, "$1")
          .replace(/^([^\d]+)\d{1}.+$/gi, "$1"),
      };
    })
    .sort((a, b) => {
      if (a.name > b.name) return 1;
      else return -1;
    });
    acu[item.kind] = acu[item.kind] ? acu[item.kind] : [];
    acu[item.kind].push(item);
    return acu;
  }, {});
  fs.writeFileSync("./devices.json", JSON.stringify(group));
}

app();

Github 也有人收集了这些信息,但只是一个 md 文件,用的话需要自己改成 json。

正式版检测

com_apple_MobileAsset_SoftwareUpdate.xml

从这个很出名的 xml 文件获取的信息,ipsw.me 的数据应该主要就是从这里同步的吧。

  • 都还在 signed 的,停止 signed 的不会出现在这里
  • 9.9. 开头的字符串通常表示它时 ota 包,不是全量包
  • 都是正式版?但 ReleaseType、SUDocumentationID 的值可能是 beta 或 prerelease,ipsw.me 的 OTAs tag 也是有 beta 的字样
  • 同一个 version 会出现很多次,比如 16.0 会为每一款可升级的 iPhone 列出一个 item
  • 数据可能不全,例如 16.0.1 虽然还在 signed,但是没有

为什么不用这个数据?

  • 感觉数据可能不全面
  • 没有发布日期信息,item 数量太多,不容易判断哪个 item 是新出现的
  • 有太多我不需要的信息
async function app() {
    "https://mesu.apple.com/assets/com_apple_MobileAsset_SoftwareUpdate/com_apple_MobileAsset_SoftwareUpdate.xml";
      ? item.OSVersion.replace("9.9.", "")
      : item.OSVersion;
      ? true
      : item.SUDocumentationID === "preRelease"
      ? true
      : false;
    return {
      version: osVersion,
      isBeta: isBeta,
      build: buildnum,
      SUDocumentationID: SUDocumentationID,
    };
  });
  fs.writeFileSync("./ios_clean.json", JSON.stringify(list));
}

app();

ipsw.me 的 API

这个 API 按照日期列出了苹果正式版的发布记录,没有测试版,等同于 ipsw 的这个 RSS

为什么不用这个?因为基本没有 watchOS,主要是 iOS 和 macOS。

gdmf.apple.com/v2/pmv

这个地址可以拿到目前在 sign 的最新的正式版,但是没有 build number。通过这个链接,我才发现苹果官网的 rss 内容不全,12.5.6 和 16.0、15.7 同一天发布,但是 rss 没有,watchOS 6.3、macOS 11.7 也是,它们都是面向旧机型发布的系统。

可以考虑以后都通过这个链接检测正式版更新,但需要找到一种获取 build number 的方法,可以通过 ipsw.me 的 api 获取?另外需要观察它的更新速度,比 rss 快还是慢?

2022-09-23 更新:发现这种方法也有问题,iOS 16.0.2 发布了,但这个链接没有第一时间显示,同一天发布的 watchOS 9.0.1 倒是显示了,PostingDate 不知道为什么也会自动更新,watchOS 9.0 的 PostingDate 今天更新为 09-22。

async function app() {
    url: url,
    responseType: "json",
    https: {
      //这个选项不能省
      rejectUnauthorized: false,
    },
  }).then((res) => res.body);

    (item) => {
      let osType = "";
      if (item.SupportedDevices.find((item) => /mac/i.test(item))) {
        osType = "macOS";
      }
      if (item.SupportedDevices.find((item) => /iphone/i.test(item))) {
        osType = "iOS";
      }
      if (item.SupportedDevices.find((item) => /ipad/i.test(item))) {
        osType = "iPadOS";
      }
      if (item.SupportedDevices.find((item) => /tv/i.test(item))) {
        osType = "tvOS";
      }
      if (item.SupportedDevices.find((item) => /watch/i.test(item))) {
        osType = "watchOS";
      }
      return {
        version: `${osType} ${item.ProductVersion}`,
        pubDate: item.PostingDate,
        SupportedDevices: item.SupportedDevices,
      };
    }
  );
  fs.writeFileSync("./pmv_clean.json", JSON.stringify(list));
}

app();

测试版检测

ipswbeta.dev/ios/16.x/

这里的测试版,仅指 developer beta,不是 public beta。这个网站可以拿到测试版的 ipsw 链接,但是不知道它是怎样拿到的,这个网站也没有公开的 api。

appledb.dev

这个网站也有测试版的下载链接,但是也没有公开的 api。

检测 Release Note

正式版的 release note 可以直接爬取官网:

苹果的 xml 也提供正式版的 release note,但是需要自己下载,解压,然后选出中文。

ipsw.me 的 api 也提供文档数据(详情),但是没有中文。

所以 release note 最好的做法还是直接爬苹果官网吧。

itunes.com/version

littlebyteorg/appledb 这个开源项目中发现,可以通过以下链接获取正式版系统的固件下载链接:

https://itunes.apple.com/WebObjects/MZStore.woa/wa/com.apple.jingle.appserver.client.MZITunesClientCheck/version
http://ax.phobos.apple.com.edgesuite.net/WebObjects/MZStore.woa/wa/com.apple.jingle.appserver.client.MZITunesClientCheck/version
https://s.mzstatic.com/version
https://itunes.com/version (redirect to mzstatic)

以上链接应该是一样的。

这些链接是 iTunes 电脑客户端下载固件时请求的链接,但由于 Apple Watch 不能通过 iTunes 更新系统,所以以上链接不会返回 Apple Watch 的固件。

littlebyteorg/appledb代码中还有如何获取测试版系统固件的方法,不过需要登录开发者账号。

pallas.sh

GitHub 有一个叫 pallas.sh 的项目,可以用来获取各机型的 OTA 固件下载链接,之所以叫 pallas,是因为这个项目检测的是 gdmf.apple.com 这个网址,而这个网址的 CodeName 就是 Pallas

pallas.sh 是一个 shell 脚本,参照它提供的思路,以下是我用 Node.js 实现的获取最新正式版、开发者测试版的方法。值得注意的是 AssetAudience,不同系统的正式版、测试版的 AssetAudience 是不同的,这些在 pallas.sh 都有标注,或者也可以参考这个 gist

下方示例代码中的 assetTypeRsr 表示快速安全响应(RSR)的 assetType,示例代码没有获取 RSR 的数据,需要提供准确的 build 才有可能获得 RSR,因为 RSR 是针对某个 build 推出的,你只有安装了这个 build 才有可能获取到这个 RSR,例如提供 20F75 这个 build 应该就会返回 20F770750d 这个 RSR。iOS、iPadOS、macOS 都有 RSR。

另外,assetTypeSfr 是 macOS 的 AssetAudience,它获取的是 Recovery,所谓 macOS Recovery,是 Mac 中内建的恢复系统,这里无需关注它。

最后,iOS security updates 通常是针对那些不能升级到最新系统的机型发布的安全性更新,例如 iPhone 7 不能升级到 iOS 16,但苹果还没有停止维护 iPhone 7,所以当系统发现安全性问题时,苹果会为这个系统发布安全性更新,iOS 15.7.7 就是这么一个安全性更新。

这种方法的好处是可以检测 RSR、应该很实时,可能也是最权威的数据源,毕竟就是模拟手机检测系统更新,但需要对返回的数据做清洗和提取。

const got = require("got");
const fs = require("fs");
const caCert = fs.readFileSync(`./AppleCA.pem`);

const assetAudiences = [
  {
    os: "iOS",
    list: [
      {
        assetAudience: "01c1d682-6e8f-4908-b724-5501fe3f5e5c",
        name: "iOS release",
        assetType: "com.apple.MobileAsset.SoftwareUpdate",
        assetTypeRsr: "com.apple.MobileAsset.SplatSoftwareUpdate",
      },
      // {
      //   assetAudience: "0c88076f-c292-4dad-95e7-304db9d29d34",
      //   name: "iOS generic",
      // },
      {
        assetAudience: "c724cb61-e974-42d3-a911-ffd4dce11eda",
        name: "iOS security updates",
        assetType: "com.apple.MobileAsset.SoftwareUpdate",
      },
      {
        assetAudience: "a6050bca-50d8-4e45-adc2-f7333396a42c",
        name: "iOS 16 developer beta",
        assetType: "com.apple.MobileAsset.SoftwareUpdate",
        assetTypeRsr: "com.apple.MobileAsset.SplatSoftwareUpdate",
      },
      // {
      //   assetAudience: "7466521f-cc37-4267-8f46-78033fa700c2",
      //   name: "iOS 16 public beta",
      // },
      {
        assetAudience: "9dcdaf87-801d-42f6-8ec6-307bd2ab9955",
        name: "iOS 17 developer beta",
        assetType: "com.apple.MobileAsset.SoftwareUpdate",
        assetTypeRsr: "com.apple.MobileAsset.SplatSoftwareUpdate",
      },
    ],
  },
  {
    os: "tvOS",
    list: [
      {
        assetAudience: "356d9da0-eee4-4c6c-bbe5-99b60eadddf0",
        name: "tvOS release",
        assetType: "com.apple.MobileAsset.SoftwareUpdate",
      },
      // {
      //   assetAudience: "fe6f26f9-ec98-46d2-8faf-565375a83ba7",
      //   name: "tvOS generic",
      // },
      {
        assetAudience: "d6bac98b-9e2a-4f87-9aba-22c898b25d84",
        name: "tvOS 16 developer beta",
        assetType: "com.apple.MobileAsset.SoftwareUpdate",
      },
      // {
      //   assetAudience: "0c995cbe-84b5-4ea3-844a-a15a265ac0be",
      //   name: "tvOS 16 public beta",
      // },
      {
        assetAudience: "61693fed-ab18-49f3-8983-7c3adf843913",
        name: "tvOS 17 developer beta",
        assetType: "com.apple.MobileAsset.SoftwareUpdate",
      },
    ],
  },
  {
    os: "watchOS",
    list: [
      {
        assetAudience: "b82fcf9c-c284-41c9-8eb2-e69bf5a5269f",
        name: "watchOS release",
        assetType: "com.apple.MobileAsset.SoftwareUpdate",
      },
      // {
      //   assetAudience: "fe4c7f1c-f44c-4c00-b3df-eef225a1ac9d",
      //   name: "watchOS generic",
      // },
      {
        assetAudience: "341f2a17-0024-46cd-968d-b4444ec3699f",
        name: "watchOS 9 developer beta",
        assetType: "com.apple.MobileAsset.SoftwareUpdate",
      },
      // {
      //   assetAudience: "4935cf61-2a58-437a-be3f-4db423970e43",
      //   name: "watchOS 9 public beta",
      // },
      {
        assetAudience: "7ae7f3b9-886a-437f-9b22-e9f017431b0e",
        name: "watchOS 10 developer beta",
        assetType: "com.apple.MobileAsset.SoftwareUpdate",
      },
    ],
  },
  {
    os: "macOS",
    list: [
      {
        assetAudience: "60b55e25-a8ed-4f45-826c-c1495a4ccc65",
        name: "macOS release",
        assetType: "com.apple.MobileAsset.MacSoftwareUpdate",
        assetTypeRsr: "com.apple.MobileAsset.MacSplatSoftwareUpdate",
        assetTypeSfr: "com.apple.MobileAsset.SFRSoftwareUpdate",
      },
      // {
      //   assetAudience: "02d8e57e-dd1c-4090-aa50-b4ed2aef0062",
      //   name: "macOS generic",
      // },
      {
        assetAudience: "683e9586-8a82-4e5f-b0e7-767541864b8b",
        name: "macOS 13 developer beta",
        assetType: "com.apple.MobileAsset.MacSoftwareUpdate",
        assetTypeRsr: "com.apple.MobileAsset.MacSplatSoftwareUpdate",
        assetTypeSfr: "com.apple.MobileAsset.SFRSoftwareUpdate",
      },
      // {
      //   assetAudience: "800034a9-994c-4ecc-af4d-7b3b2ee0a5a6",
      //   name: "macOS 13 public beta",
      // },
      {
        assetAudience: "77c3bd36-d384-44e8-b550-05122d7da438",
        name: "macOS 14 developer beta",
        assetType: "com.apple.MobileAsset.MacSoftwareUpdate",
        assetTypeSfr: "com.apple.MobileAsset.SFRSoftwareUpdate",
      },
    ],
  },
  // {
  //   os: "audioOS",
  //   list: [
  //     {
  //       assetAudience: "0322d49d-d558-4ddf-bdff-c0443d0e6fac",
  //       name: "audioOS release",
  //     },
  //     {
  //       assetAudience: "33c017cc-b820-4b88-8917-6776d7f42b66",
  //       name: "audioOS generic",
  //     },
  //     {
  //       assetAudience: "3c3d5f0c-1016-426a-9890-11d68820eb13",
  //       name: "audioOS 16 public beta",
  //     },
  //   ],
  // },
];

const devices = [
  {
    os: "iOS",
    productType: "iPhone15,3",
    hwModelStr: "D74AP",
    productName: "iPhone 14 Pro Max",
    build: "20F75", // 16.5.1
  },
  {
    os: "iPadOS",
    productType: "iPad14,6",
    hwModelStr: "J621AP",
    productName: 'iPad Pro 6 (12.9")',
    build: "20F75", // 16.5.1
  },
  {
    os: "tvOS",
    productType: "AppleTV14,1",
    hwModelStr: "J255AP",
    productName: "AppleTV 4k 3",
    build: "20L563", //tvos 16.5
  },
  {
    os: "watchOS",
    productType: "Watch6,18",
    hwModelStr: "N199AP",
    productName: "Apple Watch Ultra",
    build: "20T571", // 9.5.2
  },
  {
    os: "macOS",
    productType: "Mac14,5",
    hwModelStr: "J414cAP",
    productName: 'M2 Max MacBook Pro (14")',
    build: "22E261", //13.3.1
  },
];

async function app() {
  const data = [];
  for (const device of devices) {
    for (const asset of assetAudiences) {
      if (
        device.os === asset.os ||
        (device.os === "iPadOS" && asset.os === "iOS")
      ) {
        const temp = asset.list.map((item) => {
          return {
            ...device,
            ...item,
          };
        });
        data.push(...temp);
      }
    }
  }

  const pArray = data.map(async (item) => {
    const assetType = item.assetType;
    const assetAudience = item.assetAudience;
    const productType = item.productType;
    const hwModelStr = item.hwModelStr;
    const build = item.build;

    const options = {
      url: "https://gdmf.apple.com/v2/assets",
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        Accept: "application/json",
      },
      ca: caCert,
      json: {
        ClientVersion: 2,
        AssetType: assetType,
        AssetAudience: assetAudience,
        ProductType: productType,
        HWModelStr: hwModelStr,
        Build: build,
        BuildVersion: build,
        CompatibilityVersion: 20,
        RestoreVersion: "0.0.0.0.0,0",
      },
    };
    try {
      const response = await got(options);
      let a = response.body;
      a = a.split(".");
      a = a[1].replace(/_/g, "/").replace(/-/g, "+");
      while (a.length % 4 !== 0) {
        a = a + "=";
      }
      a = Buffer.from(a, "base64").toString();
      const json = JSON.parse(a);
      const version = json.Assets.map((asset) => {
        return {
          os: item.os,
          OSVersion: asset.OSVersion,
          Build: asset.Build,
          ReleaseType: asset.ReleaseType,
          SUDocumentationID: asset.SUDocumentationID,
          SupportedDevices: asset.SupportedDevices,
          SupportedDeviceModels: asset.SupportedDeviceModels,
          PrerequisiteOSVersion: asset.PrerequisiteOSVersion,
          SUProductSystemName: asset.SUProductSystemName,
          __BaseURL: asset.__BaseURL,
          __RelativePath: asset.__RelativePath,
          // SupportedDevices: asset.SupportedDevices,
          // SUProductSystemName: asset.SUProductSystemName,
          // SUDocumentationID: asset.SUDocumentationID,
        };
      });
      return version;
    } catch (error) {
      console.error(error);
    }
  });

  const final = [];
  const result = await Promise.all(pArray).then((res) => res.filter((i) => i));
  for (const item of result.flat()) {
    //tvOS 会针对不同的 PrerequisiteOSVersion 分别返回,虽然 build 一样
    const existed = final.find(
      (i) => i.Build === item.Build && i.os === item.os
    );
    if (!existed) {
      final.push(item);
    }
  }
  fs.writeFileSync("./output.json", JSON.stringify(final));
}

app();

结果:

[
  {
    "os": "iOS",
    "OSVersion": "9.9.16.5.1",
    "Build": "20F75",
    "SUDocumentationID": "iOS1651Long",
    "SupportedDevices": ["iPhone15,3"],
    "SupportedDeviceModels": ["D74AP"],
    "SUProductSystemName": "iOS",
    "__BaseURL": "https://updates.cdn-apple.com/2023SpringFCS/patches/042-02790/DDA0C8C0-8466-48B0-81B3-0AC1F4E5AAD6/",
    "__RelativePath": "com_apple_MobileAsset_SoftwareUpdate/b7052503c754f9b3fef2e9ae804db2d22a315a1b.zip"
  },
  {
    "os": "iOS",
    "OSVersion": "9.9.16.6",
    "Build": "20G5070a",
    "SUDocumentationID": "iOS166DevBeta5",
    "SupportedDevices": ["iPhone15,3"],
    "SupportedDeviceModels": ["D74AP"],
    "SUProductSystemName": "iOS",
    "__BaseURL": "https://updates.cdn-apple.com/2023SpringSeed/patches/042-09834/93C44844-C2AB-4A11-BABD-3471AFD93E89/",
    "__RelativePath": "com_apple_MobileAsset_SoftwareUpdate/520063a8ac17bbe95a10ffe5122cb7a4aec50478.zip"
  },
  {
    "os": "iOS",
    "OSVersion": "9.9.17.0",
    "Build": "21A5277j",
    "SUDocumentationID": "iOS17Beta3",
    "SupportedDevices": ["iPhone15,3"],
    "SupportedDeviceModels": ["D74AP"],
    "SUProductSystemName": "iOS",
    "__BaseURL": "https://updates.cdn-apple.com/2023SummerSeed/patches/042-13201/F454200D-48B7-4E74-92F1-AC080832B248/",
    "__RelativePath": "com_apple_MobileAsset_SoftwareUpdate/b22f9bf355cc4a64256cd13a9d71f14965a07db6.zip"
  },
  {
    "os": "iPadOS",
    "OSVersion": "9.9.16.5.1",
    "Build": "20F75",
    "SUDocumentationID": "iPadOS1651Long",
    "SupportedDevices": ["iPad14,6"],
    "SupportedDeviceModels": ["J621AP"],
    "SUProductSystemName": "iOS",
    "__BaseURL": "https://updates.cdn-apple.com/2023SpringFCS/patches/042-02230/22554DB4-A90D-4DC9-880D-E1BF8F3AF3D9/",
    "__RelativePath": "com_apple_MobileAsset_SoftwareUpdate/c2e3a20ab6693544ad1a9a628794d114d1457ab7.zip"
  },
  {
    "os": "iPadOS",
    "OSVersion": "9.9.16.6",
    "Build": "20G5070a",
    "SUDocumentationID": "iPadOS166DevBeta5",
    "SupportedDevices": ["iPad14,6"],
    "SupportedDeviceModels": ["J621AP"],
    "SUProductSystemName": "iOS",
    "__BaseURL": "https://updates.cdn-apple.com/2023SpringSeed/patches/042-09637/A04251DE-8539-45F8-8D11-6EBD6331929B/",
    "__RelativePath": "com_apple_MobileAsset_SoftwareUpdate/29d14d3b073637f0c20fa5a82185d9fcd627ef4a.zip"
  },
  {
    "os": "iPadOS",
    "OSVersion": "9.9.17.0",
    "Build": "21A5277j",
    "SUDocumentationID": "iPadOS17Beta3",
    "SupportedDevices": ["iPad14,6"],
    "SupportedDeviceModels": ["J621AP"],
    "SUProductSystemName": "iOS",
    "__BaseURL": "https://updates.cdn-apple.com/2023SummerSeed/patches/042-12901/6152280A-F6EE-48B7-AA6D-83EE1194E189/",
    "__RelativePath": "com_apple_MobileAsset_SoftwareUpdate/b8a87d37093b83e276515fa5fe5120b349a6524a.zip"
  },
  {
    "os": "tvOS",
    "OSVersion": "16.5",
    "Build": "20L563",
    "SUDocumentationID": "PreRelease",
    "SupportedDevices": ["AppleTV14,1"],
    "SupportedDeviceModels": ["J255AP"],
    "PrerequisiteOSVersion": "16.3.2",
    "SUProductSystemName": "iOS",
    "__BaseURL": "https://updates.cdn-apple.com/2023SpringFCS/patches/032-84331/E69E241F-BD73-4552-A659-504361BC93F3/",
    "__RelativePath": "com_apple_MobileAsset_SoftwareUpdate/e3322ac2184405ab497dcf5e4902b36eb62bb5a0.zip"
  },
  {
    "os": "tvOS",
    "OSVersion": "16.5",
    "Build": "20L6563",
    "ReleaseType": "Beta",
    "SUDocumentationID": "PreRelease",
    "SupportedDevices": ["AppleTV14,1"],
    "SupportedDeviceModels": ["J255AP"],
    "SUProductSystemName": "iOS",
    "__BaseURL": "https://updates.cdn-apple.com/2023SpringFCS/patches/032-84321/352B19CB-1230-4967-B098-7972EE080379/",
    "__RelativePath": "com_apple_MobileAsset_SoftwareUpdate/90d3c49624826951da3ac612b0f30da57a8af930.zip"
  },
  {
    "os": "tvOS",
    "OSVersion": "16.6",
    "Build": "20M5571a",
    "ReleaseType": "Beta",
    "SUDocumentationID": "PreRelease",
    "SupportedDevices": ["AppleTV14,1"],
    "SupportedDeviceModels": ["J255AP"],
    "PrerequisiteOSVersion": "16.6",
    "SUProductSystemName": "iOS",
    "__BaseURL": "https://updates.cdn-apple.com/2023SpringSeed/patches/042-09531/69277BF3-8171-4E53-B04F-3B9A287FECC7/",
    "__RelativePath": "com_apple_MobileAsset_SoftwareUpdate/3f20fe3a252ad0d28a809fd08b32d2be7e81f5d9.zip"
  },
  {
    "os": "tvOS",
    "OSVersion": "17.0",
    "Build": "21J5303h",
    "ReleaseType": "Beta",
    "SUDocumentationID": "PreRelease",
    "SupportedDevices": ["AppleTV14,1"],
    "SupportedDeviceModels": ["J255AP"],
    "PrerequisiteOSVersion": "16.6",
    "SUProductSystemName": "iOS",
    "__BaseURL": "https://updates.cdn-apple.com/2023SummerSeed/patches/042-13683/A29894CF-A070-43A2-8F3D-9D24DF2C9A02/",
    "__RelativePath": "com_apple_MobileAsset_SoftwareUpdate/4377f9109372afa8c87d24e27639ec843f28e129.zip"
  },
  {
    "os": "watchOS",
    "OSVersion": "9.5.2",
    "Build": "20T571",
    "SUDocumentationID": "watchOS952Short",
    "SupportedDevices": ["Watch6,18"],
    "SupportedDeviceModels": ["N199AP"],
    "SUProductSystemName": "iOS",
    "__BaseURL": "https://updates.cdn-apple.com/2023SpringFCS/patches/032-92097/0DA9CAEB-B99B-460C-B04B-44AC1127D69C/",
    "__RelativePath": "com_apple_MobileAsset_SoftwareUpdate/cb65d0bb2d04c170ca9f56284a7d98d87783fc74.zip"
  },
  {
    "os": "watchOS",
    "OSVersion": "9.6",
    "Build": "20U5570a",
    "SUDocumentationID": "watchOS96DevBeta5",
    "SupportedDevices": ["Watch6,18"],
    "SupportedDeviceModels": ["N199AP"],
    "SUProductSystemName": "iOS",
    "__BaseURL": "https://updates.cdn-apple.com/2023SpringSeed/patches/042-10551/8C9D770B-BEA4-47BE-8AEC-440583D17EB4/",
    "__RelativePath": "com_apple_MobileAsset_SoftwareUpdate/3e958f974b5eaca6c334350d11e59ce891508db1.zip"
  },
  {
    "os": "watchOS",
    "OSVersion": "10.0",
    "Build": "21R5305e",
    "SUDocumentationID": "watchOS10Beta3",
    "SupportedDevices": ["Watch6,18"],
    "SupportedDeviceModels": ["N199AP"],
    "SUProductSystemName": "iOS",
    "__BaseURL": "https://updates.cdn-apple.com/2023SummerSeed/patches/042-06128/E019DF98-1818-4CE1-B98A-85B3021EFB37/",
    "__RelativePath": "com_apple_MobileAsset_SoftwareUpdate/98e4ca28ec81dc9a0a611a8f632dcf2ed3a1bece.zip"
  }
]
donation赞赏
thumbsup0
thumbsdown0
暂无评论