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 по-прежнему содержит заголовки, ситуация такая же, как сейчас, и у вас не возникнет никаких проблем.