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,情况和现在一样,不会有任何问题。
我所在的公司开发了一个程序,最后一次接触代码是在 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,情况和现在一样,不会有任何问题。