macOS 弃用的 API

macOS deprecated APIs

我所在的公司开发了一个程序,最后一次接触代码是在 2 年前。现在该程序需要公证,所以我被要求负责该程序。

我将代码移植到最新的 Xcode (10.2.1) 和最新的 macOS。但是 Xcode 警告我一些 API 调用的弃用:

/Users/rowelz/Documents/Develop/Code/ThinPrint/in 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/in GIT/myProject/osx-client/src/com.myProject.bootstrap/EZPBootstrapper.m:193:21: 'SMJobRemove' is deprecated: first deprecated in macOS 10.10

result = (BOOL) SMJobRemove(kSMDomainSystemLaunchd, (__bridge CFStringRef) label, self->_authRef, FALSE, &cfError);

/Users/rowelz/Documents/Develop/Code/ThinPrint/in GIT/myProject/osx-client/src/com.myProject.bootstrap/EZPAppDelegate.m:193:15: 'SMJobSubmit' 已弃用:首先在 macOS 中弃用10.10

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

/Users/rowelz/Documents/Develop/Code/ThinPrint/in GIT/ezeep/osx-client/src/com.myProject.bootstrap/EZPAppDelegate.m:214:13: 'SMJobRemove' 已弃用:首先在 macOS 中弃用10.10

removed = SMJobRemove(kSMDomainUserLaunchd, (__bridge CFStringRef)kEzeepServiceNameUpdaterBstrap, NULL, false, NULL);

我在这个项目中的主管给出了以下边界条件:

我不想对代码进行任何更改,因为有关 SMJobCopyDictionary、SMJobRemove 和 SMJobSubmit 的警告意味着需要进行重大更改 - 必须重新编写整个程序。这对于一年的寿命来说将是一个巨大的努力。

我的问题: 我想编写一个小工具来检查这些 API 调用的可用性。然后,我将在 macOS 的每个测试版上执行此工具,直到 macOS 10.15 的最终版本。当然,如果该工具显示出问题,我将重写 "now defective" 程序。

是否足以检测 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 的调用?

这是猜测,但我对此很有信心:Apple 不会从 10.15 中删除这些 API。弃用 API 是定期进行的,但实际上删除它们会破坏现有的应用程序并且很少非常

他们有可能(尽管我认为不太可能)从 10.15 SDK 中删除 headers,在这种情况下,您将需要继续针对 10.14 SDK 进行构建(使用 Xcode 10 ).

而且如果10.15 SDK还包含headers,情况和现在一样,不会有任何问题。