Проверка срока действия профиля подготовки


Недавно я отправил корпоративное приложение (распространяемое через HockeyApp), чей профиль подготовки истек. В результате приложение не будет запускаться вообще. Когда истекает срок действия профиля подготовки, пользователю не выдается никакого предупреждения, что является очень неудачной ситуацией.

Xcode предупредил меня за несколько недель до истечения срока действия профиля подготовки, поэтому я обновил профиль, и предупреждение исчезло. К сожалению, я забыл обновить профиль подготовки в настройках сборки Xcode, поэтому Я отправил приложение, срок действия которого истек через несколько дней после его выпуска.

Я хотел бы избежать этого фиаско в следующем году, когда профиль подготовки снова истечет. Есть ли что-то, что я могу сделать, чтобы принудительно проверить, что профиль подготовки не истекает в ближайшее время?

1 3

1 ответ:

Вот скрипт python, который прерывает сборку, если срок действия профиля подготовки истекает менее чем через 15 дней. Этот сценарий должен выполняться как сценарий этапа сборки.

Обратите внимание, что этот скрипт также будет работать при запуске в рамках интеграции Xcode Bot.

#!/usr/bin/python

import glob, os, plistlib, subprocess, sys
from os import path
from datetime import datetime

def read_mobileprovision(mobileprovision_path):
    # From http://stackoverflow.com/questions/6398364/parsing-mobileprovision-files-in-bash/10490095#10490095
    return plistlib.readPlist(subprocess.Popen(['security', 'cms', '-D', '-i', mobileprovision_path], stdout=subprocess.PIPE).stdout)

if os.environ['PLATFORM_NAME'] != 'iphoneos':
    sys.exit(0)

provisioning_profiles_dir = '/Library/Developer/XcodeServer/ProvisioningProfiles' if os.environ['USER'] == '_xcsbuildd' else path.expanduser('~/Library/MobileDevice/Provisioning Profiles')
provisioning_profile_uuid = os.environ['EXPANDED_PROVISIONING_PROFILE']
mobileprovision_path = path.join(provisioning_profiles_dir, provisioning_profile_uuid + ".mobileprovision")
if not path.exists(mobileprovision_path):
    for mobileprovision in glob.iglob(path.join(provisioning_profiles_dir, "*.mobileprovision")):
        if read_mobileprovision(mobileprovision)['UUID'] == provisioning_profile_uuid:
            mobileprovision_path = mobileprovision
            break

print(mobileprovision_path)

expiration_date = read_mobileprovision(mobileprovision_path)['ExpirationDate']
print("Expiration Date: {}".format(expiration_date))

remaining_days = (expiration_date - datetime.now()).days
print("Remaining Days: {}".format(remaining_days))

if remaining_days < 15:
    sys.exit("error: Provisioning Profile {} is expiring in {} days.".format(mobileprovision_path, remaining_days))