如何访问任何其他目标的版本号

时间:2015-11-05 02:31:44

标签: objective-c xcode macos

我有一个安装可执行文件(XPCService)的应用程序,它可以为特权操作发送命令。此可执行文件是我项目中的另一个目标。为避免每次发送命令时重新安装它,我需要检查其版本并交叉检查我的应用程序可以安装的内容。

所以我知道如何使用以下内容访问类目标的版本号:

[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]

这很有用,因为已安装的可执行文件可以响应我使用其版本调用-getVersionWithReply:的命令。

那么,在主应用程序目标中构建的类或两个目标之间共享的类中,如何获取尚未安装的可执行文件的版本?我可以使用产品名称吗?

2 个答案:

答案 0 :(得分:4)

NSString *appVersion    = [[[NSBundle mainBundle] infoDictionary] 
objectForKey:@"CFBundleShortVersionString"];

答案 1 :(得分:0)

所以我确实找到了我认为解决这个问题的正确方法:

基本上,由于XPC服务是使用SMJobBless安装的,我可以执行以下操作:

- (NSString *)_installedVersion
{
    NSString *installedVersion = nil;
    NSDictionary *installedPrivilegedAgentJobData;

    installedPrivilegedAgentJobData = (__bridge_transfer NSDictionary *)SMJobCopyDictionary(kSMDomainSystemLaunchd, (__bridge CFStringRef)self.privilegedAgentMachServiceName);

    if (installedPrivilegedAgentJobData != nil) {
        NSString *installedPath = [[installedPrivilegedAgentJobData objectForKey:@"ProgramArguments"] objectAtIndex:0];


        NSURL *installedPathURL = [NSURL fileURLWithPath:installedPath];

        NSDictionary *installedInfoPlist = (NSDictionary*)CFBridgingRelease(CFBundleCopyInfoDictionaryForURL((CFURLRef)installedPathURL));
        if (installedInfoPlist != nil) {
            installedVersion = [installedInfoPlist objectForKey:@"CFBundleVersion"];
        }
    }
    return installedVersion;
}

我认为这与XPCService的plist在二进制文件中的事实有关。

然后,您可以将其与未安装的XPCService版本进行比较:

- (NSString *)_currentVersion
{
    NSString *currentPath = self.privilegedAgentPathInBundle;
    NSURL *currentPrivilegedAgentURL = [[[NSBundle mainBundle] bundleURL] URLByAppendingPathComponent:currentPath];
    NSDictionary *currentInfoPlist = (NSDictionary*)CFBridgingRelease(CFBundleCopyInfoDictionaryForURL((CFURLRef)currentPrivilegedAgentURL));
    return [currentInfoPlist objectForKey:@"CFBundleVersion"];
}