2011年7月16日土曜日

Cocoa Dockの.plistを読み込む

なぜか本日は「Dock」のplistを読み込んで、表示されているappのリストを取得できるか試した。デベロッパドキュメントのあちこちをさまよっているうちに「Property Lists Programming Guide」を読むハメになり、そのサンプルコードがおもしろかったので。

結論からいうと意外と簡単にできる。

    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 件のコメント:

コメントを投稿