API устаревших macOS

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

Я перенес код на последнюю версию Xcode (10.2.1) и последнюю версию macOS. Но XCode предупреждает меня об устаревании нескольких вызовов API:

/ Users / rowelz / Documents / Develop / Code / ThinPrint / в GIT/myProject/osx-client/src/com.myProject.bootstrap/EZPBootstrapper.m:116:51: "SMJobCopyDictionary" устарел: сначала устарел в macOS 10.10

NSDictionary * plist = (__bridge NSDictionary *) SMJobCopyDictionary (kSMDomainSystemLaunchd, (__bridge CFStringRef) (label));

/ Users / rowelz / Documents / Develop / Code / ThinPrint / в GIT/myProject/osx-client/src/com.myProject.bootstrap/EZPBootstrapper.m:193:21: "SMJobRemove" устарел: сначала устарел в macOS 10.10

результат = (BOOL) SMJobRemove(kSMDomainSystemLaunchd, (__bridge CFStringRef) метка, self -> _ authRef, FALSE, & cfError);

/ Users / rowelz / Documents / Develop / Code / ThinPrint / в GIT/myProject/osx-client/src/com.myProject.bootstrap/EZPAppDelegate.m:193:15: "SMJobSubmit" устарел: сначала устарел в macOS 10.10

submit = SMJobSubmit(kSMDomainUserLaunchd, (__bridge CFDictionaryRef)(plist), NULL и & cfError);

/ Users / rowelz / Documents / Develop / Code / ThinPrint / в GIT/ezeep/osx-client/src/com.myProject.bootstrap/EZPAppDelegate.m:214:13: "SMJobRemove" устарел: сначала устарел в macOS 10.10

Удалено = SMJobRemove(kSMDomainUserLaunchd, (__bridge CFStringRef)kEzeepServiceNameUpdaterBstrap, NULL, false, NULL);

Мой руководитель в этом проекте дал следующие граничные условия:

  • Программа должна работать только в течение следующего года. После этого будет заменена еще одна программа нашего дома.
  • В течение этого года он должен работать без ограничений, сбоев и так далее.

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

Мой вопрос: я хотел бы написать небольшой инструмент, который проверяет наличие этих вызовов API. Затем я буду запускать этот инструмент на каждой бета-версии macOS до окончательного выпуска macOS 10.15. Конечно, если этот инструмент показывает проблему, я перепишу "теперь дефектную" программу.

Будет ли этого достаточно, чтобы обнаружить проблему с существованием API? И какую функцию я могу использовать для определения доступности, фактически не вызывая их, пытаясь установить бинарный файл launchd? Я предполагаю, что вышеупомянутые API являются CoreFoundation?

Заранее спасибо за вашу помощь.

Я нашел это здесь при переполнении стека, и это, кажется, работает:

#include <dlfcn.h>

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
@autoreleasepool {

    BOOL notFound = NO;

    void *lib = dlopen("/System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement", RTLD_LAZY);

    if(lib == NULL)
    {
        printf("Library not found. (/System/Library/Frameworks/ServiceManagement.framework/Versions/A/ServiceManagement).\n");
        exit(1);
    }

    void *function1 = dlsym(lib, "SMJobCopyDictionary");

    if(function1 == NULL)
    {
        printf("Function not found: SMJobCopyDictionary\n");
        notFound = YES;
    }

    // .... and so on

    dlclose(lib);

    if(notFound)
    {
        exit(1);
    }

    printf("Ok, all functions found.\n");
}
return 0;

}

будет ли этого достаточно, чтобы показать вызов устаревшему и удаленному API?

1 ответ

Это предположение, но я чувствую в этом уверенность: Apple не удалит эти API из 10.15. Устаревшие API-интерфейсы выполняются регулярно, но на самом деле их удаление разрушает существующие приложения и выполняется очень редко.

Возможно (хотя я думаю, что вряд ли), что они уберут заголовки из SDK 10.15, и в этом случае вам нужно будет продолжить сборку против SDK 10.14 (используя Xcode 10).

И если SDK 10.15 по-прежнему содержит заголовки, ситуация такая же, как сейчас, и у вас не возникнет никаких проблем.

Другие вопросы по тегам