Компания, в которой я работаю, разработала программу, и последний раз код касался 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)(метка));
/ Пользователи / rowelz / Документы / Разработка / Код / ThinPrint / в GIT / myProject / osx-client / src / com.myProject.bootstrap / EZPBootstrapper.m: 193:21: « SMJobRemove » устарело: сначала устарело в macOS 10.10
result = (BOOL) SMJobRemove (kSMDomainSystemLaunchd, (__bridge CFStringRef) метка, self -> _ authRef, FALSE,& cfError);
/ Пользователи / rowelz / Документы / Разработка / Код / 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?