結論からいうと意外と簡単にできる。
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 件のコメント:
コメントを投稿