macOS不推荐使用的API

时间:2019-05-27 07:47:57

标签: objective-c macos macos-carbon notarize

我工作的公司开发了一个程序,上一次接触该代码是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 /在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 beta版上执行此工具,直到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的调用吗?

1 个答案:

答案 0 :(得分:0)

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

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

如果10.15 SDK仍然包含标头,则情况与现在相同,并且不会有任何问题。