我有一个安装可执行文件(XPCService)的应用程序,它可以为特权操作发送命令。此可执行文件是我项目中的另一个目标。为避免每次发送命令时重新安装它,我需要检查其版本并交叉检查我的应用程序可以安装的内容。
所以我知道如何使用以下内容访问类目标的版本号:
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]
这很有用,因为已安装的可执行文件可以响应我使用其版本调用-getVersionWithReply:
的命令。
那么,在主应用程序目标中构建的类或两个目标之间共享的类中,如何获取尚未安装的可执行文件的版本?我可以使用产品名称吗?
答案 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"];
}