我工作的公司开发了一个程序,最后一次接触代码是在 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 的调用吗?