WedX - журнал о программировании и компьютерных науках

Определить, работает ли приложение в бета-версии macOS

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

Ограничения:

  • Приложение находится в песочнице.
  • Приложение находится в App Store, поэтому никаких частных API.
  • Приложение не имеет права доступа к сети, поэтому обнаружение должно осуществляться в автономном режиме.
  • Я не хочу объединять список известных номеров сборок macOS и сравнивать их.

Я думаю, что, возможно, можно использовать какой-то нюх. Возможно, есть некоторые API, которые возвращают разные результаты, когда версия macOS является бета-версией.


  • Если он работает под управлением macOS 11, разве он по определению не запускает бета-версию? Как только ОС станет окончательной, обновите свое приложение. Насколько я знаю, нет флага бета-версии, и невозможно узнать, какой будет номер окончательной (выпускной) версии без хрустального шара. 05.07.2020
  • @JamesBucanek Ваш комментарий уже включен в текст вопроса. Пожалуйста, прочтите это. 07.07.2020
  • Почему проверка случайной функции ОС лучше, чем жесткое кодирование номера версии? Проверка версии ОС — распространенный подход к таким проблемам. Кроме того, все привыкли к тому, что в бета-версиях macOS ничего не работает, так что, возможно, это не большая проблема. 08.07.2020
  • Может быть, есть какая-то разница, которую вы можете найти с помощью Feedback Assistant? например При регистрации системы macOS в бета-сборках с помощью утилиты Beta Access Utility приложение добавляется в Dock и получает псевдоним в /Утилиты 08.07.2020
  • Это хороший вопрос, который у меня тоже есть. Я могу придумать множество дерзких способов сделать это, но ни один из них не работает в автономном режиме, в песочнице и без жесткого кодирования чего-либо. Лучшее, что я могу придумать, это закодировать проверенную версию в каждом выпуске приложения. Затем сравните версию ОС хоста и, если версия выше (исключая последнюю цифру), отобразите предупреждение о непроверенной ОС. Но Apple, изменив схему нумерации на 11.0, теперь затрудняет прогнозирование значения чисел. Будет ли следующая версия 12.0? Что будет означать 11.1? Можно также проверить, если это между июнем и октябрем :) 24.10.2020

Ответы:


1

Я считаю, что вам не повезло. Об этом Mac использует PrivateFrameworks/Seeding.framework, здесь важная разборка:

/* @class SDBuildInfo */
+(char)currentBuildIsSeed {
    return 0x0;
}

Похоже, это флаг компилятора времени сборки. К сожалению, списки в фреймворке не содержат этого флага.

Пример использования частного API: kaloprominat/currentBuildIsSeed.py

Для сумасшедших: можно было бы прочитать бинарник и сравнить сборку для функции. Я бы начал с кода дампа классов, который дает вам разные толстые двоичные файлы и смещение функций.

07.07.2020
  • Это хорошая мысль, но это не сработает для приложений в песочнице, которые я упомянул как ограничение. 08.07.2020
  • @catlan, после дальнейшего изучения этого метода я смог получить прямой доступ к пакету и получить это значение. 09.07.2020

  • 2

    Это далеко не идеально, но macOS BigSur примечания к выпуску упоминают:

    Известные проблемы
    В Swift свойство authorStatus() объекта CLLocationManager неправильно отображается как метод, а не как свойство. (62853845)

    Это^ новый API, представленный в MacOS11 / iOS14.

    Таким образом, это можно было обнаружить для конкретной бета-версии.

    import CoreLocation
    func isMacOS11Beta() -> Bool {
        var propertiesCount = UInt32()
        let classToInspect = CLLocationManager.self
        var isMacOS11OrHigher = false
        var isMacOS11Beta = false
        let propertiesInAClass = class_copyPropertyList(CLLocationManager.self, &propertiesCount)
        if classToInspect.responds(to: NSSelectorFromString("authorizationStatus")) {
            isMacOS11OrHigher = true
            isMacOS11Beta = true
            for i in 0 ..< Int(propertiesCount) {
                if let property = propertiesInAClass?[i], let propertyName = NSString(utf8String: property_getName(property)) as String? {
                    if propertyName == "authorizationStatus" {
                        isMacOS11Beta = false
                    }
                }
            }
            free(propertiesInAClass)
        }
        return isMacOS11OrHigher && isMacOS11Beta
    }
    
    11.07.2020
  • Это умно, но, скорее всего, это не будет работать с будущими бета-версиями, поэтому не очень полезно. Мне нужно что-то, что работает со всеми бета-версиями, в идеале с бета-версиями в следующем году. 13.07.2020
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]