1

我工作的公司开发了一个程序,最后一次接触代码是在 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 ' 已弃用:首先在 macOS 10.10 中弃用

结果 = (BOOL) SMJobRemove(kSMDomainSystemLaunchd, (__bridge CFStringRef) 标签, 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 中弃用

提交 = 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 中弃用

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

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

  • 程序应仅在接下来的一年内运行。之后它将被我们家的另一个程序所取代。
  • 在这一年里,它应该可以不受限制地工作,崩溃等等。

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

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

这足以检测 API 存在的问题吗?我可以使用什么函数来检测可用性,而无需实际调用它们来尝试安装已启动的二进制文件?我猜上面的 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 的调用吗?

4

1 回答 1

1

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

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

如果 10.15 SDK 仍然包含 headers,情况和现在一样,你不会有任何问题。

于 2019-05-29T05:45:04.367 回答