結論からいうと意外と簡単にできる。
NSError* error;
NSPropertyListFormat format;
NSString *plistPath;
NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,
NSUserDomainMask, YES) objectAtIndex:0];
plistPath = [rootPath stringByAppendingPathComponent:@"Preferences/com.apple.dock.plist"];
if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) {
NSLog(@"What?");
}
NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization
propertyListWithData:plistXML options:NSPropertyListMutableContainersAndLeaves format:&format error:&error];
if (!temp) {
NSLog(@"Error reading plist: %@, format: %lu", error, format);
}
NSArray* appArray=[temp objectForKey:@"persistent-apps"];
NSDictionary *appData=[appArray objectAtIndex:0];
//NSLog(@"paaData=%@",appData);
NSDictionary* tileData=[appData objectForKey:@"tile-data"];
//NSLog(@"tileData=%@",tileData);
NSDictionary* fileData=[tileData objectForKey:@"file-data"];
//NSLog(@"fileData=%@",fileData);
//NSLog(@"URL=%@",[fileData objectForKey:@"_CFURLString"]);
NSString *urlString=[fileData objectForKey:@"_CFURLString"];
NSURL* fileURL=[NSURL fileURLWithPath:urlString];
// NSURL* fileURL=[NSURL URLWithString:[fileData objectForKey:@"_CFURLString"]];
NSLog(@"URL=%@",[fileURL path]);
うるさく入っているNSLogは無視。NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
でplistを読み込むことができたら、あとは
NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization
propertyListWithData:plistXML options:NSPropertyListMutableContainersAndLeaves format:&format error:&error];
とやればNSDictionaryに変換できる。ただサンプルではpropertyListFromDataを使っていたが、ドキュメントによるとpropertyListWithDataに移行せよ、ということなので差し替えてある。
plistそのものはXcodeであらかじめ開いて、keyを確認してある状態。
入れ子になったDictionaryって地道に読み込んでいくしかないのかなあ。
上のコードではDockに配された最初のappのURLを取得している。うちの場合は環境設定。
この手のデータが入手できるということは、Dockに登録されたappをあらかじめ表示できるラウンチャ、なんかを作ることができる、ということだな。うーん、どうしよう。

0 件のコメント:
コメントを投稿