命令行方式测试 iOS 移动配置文件是否仍然有效?

Command line way to test iOS mobile provisioning profile is still valid?

根据 Developer.Apple.com,配置文件可能无效的一个原因是证书现在已过时。 post 中涵盖了证书检查:Validate certificate and provisioning profile

我更感兴趣的是如何测试配置文件现在是否过时。现在我发现了很长的延迟,所以不可能破译无效的原因。如果我可以 运行 这个命令,比如每次我的构建作业 运行s 在 Jenkins 上,那么我可以通过准确记录从有效到无效的转变时间来更好地进行故障分析。

通过简单的 gem 安装,这可以使用 fastlane 的宇宙飞船 api 来实现,开发者门户文档显示了一个确切的例子。

broken_profiles = Spaceship.provisioning_profile.all.find_all do |profile|
  # the below could be replaced with `!profile.valid?`, which takes longer but also verifies the code signing identity
  (profile.status == "Invalid" or profile.status == "Expired")
end

https://github.com/fastlane/fastlane/blob/master/spaceship/docs/DeveloperPortal.md

您可以编写一个 shell 脚本来遍历文件,从 mobileprovision 文件中获取日期,并将其与当前日期进行核对。

#!/bin/sh

for provisioning_profile in ~/Library/MobileDevice/Provisioning\ Profiles/*.mobileprovision;
do
    printf "Checking ${provisioning_profile}... "

    # pull the expiration date from the plist
    expirationDate=`/usr/libexec/PlistBuddy -c 'Print :ExpirationDate' /dev/stdin <<< $(security cms -D -i "${provisioning_profile}")`

    # convert it to a format we can use to see if it is in the past (YYYYMMDD)
    read dow month day time timezone year <<< "${expirationDate}"
    ymd_expiration=`date -jf"%a %e %b %Y" "${dow} ${day} ${month} ${year}" +%Y%m%d`

    # compare it to today's date
    ymd_today=`date +%Y%m%d`

    if [ ${ymd_today} -ge ${ymd_expiration} ];
    then
        echo "${provisioning_profile} EXPIRED"
    fi

done

您可以使用security 命令和plist buddy 从文件中提取ExpirationDate。然后为简单起见,我将该日期转换为易于比较的格式 (YYYMMDD),并将其与相同格式的今天日期进行比较。我打印出它找到的配置文件。

理想情况下,您希望将其更改为提前一段时间发出警告(我建议 30 天)。这样您就有时间重新生成配置文件,并有时间使用新的配置文件进行构建并将其发送到您的测试设备。