我有以下情况:
在我的应用程序中,用户必须安装一个特定的dmg文件(在任何时候)。这个dmg包含了应用程序需要处理并始终可用的一些数据。
我看的是“出问题”的情况。其中一种情况是,dmg文件在挂载时已被移动到另一个位置(另一个文件夹等)。
为了检查这一点,我使用了hdiutil info -plist命令,它生成一个属性列表,其中包含挂载的dmg文件的所有信息。
对于我的情况,这个属性列表中的重要键是image-path键和image-alias键;第一个键是dmg的实际位置(或最初挂载的路径),第二个键是dmg在执行hdiutil时(已被移动)的位置。
image-path是一个字符串值- image-alias是数据对象。
一个典型的plist看起来如下:
<key>image-alias</key>
<data>
AAAAAAF0AAIAAAxNYWNpbnRvc2ggSEQAAAAAAAAAAAAAAAAAAADP
KL64SCsAAAAJ1UgMRVNNYXN0ZXIuZG1nAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABeS
ls/YacBkZXZpZGRza/////8AAAkgAAAAAAAAAAAAAAAAAAAACURv
d25sb2FkcwAAEAAIAADPKKKYAAAAEQcwB0AGUAcgAuAGQAbQBnAA
8AGgAMAE0AYQBjAGkAbgB0AG8AcwBoACAASABEABIAIVVzZXJzL3
BtYXIvRG93bmxvYWRzL0VTTWFzdGVy
</data>
<key>image-encrypted</key>
<false/>
<key>image-path</key>
<string>/Users/user/Downloads/Master.dmg</string>(在xcode中打开图像别名数据时,如下所示:
<00000000 01740002 6163696e 20484400 00000000 00000000 00000000 0000cf28 beb8482b 00000009 00000000 00000000 00000000 00000000 ... >另一方面,当运行(终端)没有-plist (屏幕上的输出)的hdiutil信息时,它返回:
$ hdiutil info
framework : 371.1
driver : 10.9v371.1
================================================
image-path : /Users/user/Desktop/Master.dmg
image-alias : /Users/user/Desktop/Master.dmg
shadow-path : <none>
...(这是命令应该正常返回的内容。在“事情变坏”的情况下,图像路径和图像别名应该是不同的路径)
我已经试过了
NSData *aliasData = [NSData dataWithData:[images valueForKey:@"image-alias"]];
NSString *alias = [[NSString alloc] initWithData:aliasData encoding:NSSymbolStringEncoding];对于SymbolString、UTF、ASCII,但是它总是返回null。
所以问题来了:
有人知道图像别名对象是什么类型的数据吗?这样我就可以在字符串中转换并相应地使用它了吗?
提前感谢!
发布于 2014-12-16 08:30:58
经过大量的研究,大量的时间和最后的一个苹果技术问题,这个对象是一个包含BookmarkData的CFURL。
若要将其转换为NSString,使其具有可读性并可与其他字符串(在本例中为图像路径)进行比较,需要使用
CFURLCreateBookmarkDataFromAliasRecord和CFURLCreateByResolvingBookmarkData
对于米利威的绝妙回答,一旦图像别名数据在
NSData *aliasData = dmgArray[i][@"image-alias"];职能:
NSURL *aliasMountPoint(NSData *aliasMPData)
{
CFErrorRef *err = NULL;
CFDataRef aliasBookmark = CFURLCreateBookmarkDataFromAliasRecord(kCFAllocatorDefault, (__bridge CFDataRef)aliasMPData);
if (aliasBookmark == nil)
return nil;
else
{
CFURLRef resolvedUrl = CFURLCreateByResolvingBookmarkData (NULL, aliasBookmark, kCFBookmarkResolutionWithoutUIMask, NULL, NULL, NO, err);
return CFBridgingRelease(resolvedUrl);
}
}将执行转换。然后用:
NSString *imagealias = [aliasMountPoint(aliasData) absoluteString];(请记住,这是我们在NSURL中转换的CFURL,absoluteString将其转换为NSString)
由于NSString包含绝对路径,所以
imagealias = [imagealias substringFromIndex:7]若要删除字符串开头的file://,请执行以下操作。
然后简单地比较图像路径和图像别名中的两个字符串,按您的意愿进行,按照处理它们的方式处理aliasMountPoint函数中的任何错误,一切都设置好了!
https://stackoverflow.com/questions/24531309
复制相似问题