アドレス帳を整理したいっ

iCloudが始まりました!

今までは有料のMobileMeを使うか、色々なことを諦めてGoogle Contacts経由で同期する、USB経由で同期するなど歯がゆい思いをしてきましたが、ついに念願かなってiPhoneやiPad、Macのアドレス帳を苦労なく同期できるようになりました。そこで、今回はさっくり同期できるようになったアドレス帳の整理方法なんかをまとめようかなと思います。

まず、アドレス帳.appはMac OS X 10.7 Lionで改悪されて、とても、とても使いにくくなりました。ページめくりっぽいインターフェイスとかいらないし。残念です。

アドレス帳.app

しかし、アドレス帳に対するAPIは変更がないので簡単なObjective-Cのコードを書けば一括処理やちょっと混みいった変更なんかもさっくり出来ちゃいます。

まず簡単に、アドレス帳に入ってる人を条件を指定して取得するのはこんな感じ。

#import <AddressBook/AddressBook.h>

int main() {
  ABAddressBook *addressBook = [ABAddressBook sharedAddressBook];
  // 名前がYから始まる人を探したいっ
  ABSearchElement *searchElement =
    [ABPerson searchElementForProperty:kABFirstNameProperty
                                 label:nil
                                   key:nil
                                 value:@"Y"
                            comparison:kABPrefixMatch];
  // その条件に合う人を取得!
  NSArray *personFound =
    [addressBook recordsMatchingSearchElement:searchElement];
  for(ABPerson *person in personFound) {
    // 名前を出力しますよー
    NSLog(@"%@ %@",
      [person valueForProperty:kABFirstNameProperty],
      [person valueForProperty:kABLastNameProperty]);
  }
  return 0;
}

そんでtest.mみたいな名前で保存して、コンパイルして実行。時代はclang。 あ、事前にXcodeを入れておいて下さいネ。

$ clang -framework Foundation -framework AddressBook test.m
$ ./a.out
2011-10-13 21:24:44.173 a.out[57937:707] Y... I...
2011-10-13 21:24:44.174 a.out[57937:707] Y... T...
2011-10-13 21:24:44.175 a.out[57937:707] Y... N...
...

簡単ですねー。で、一覧した人から特定の項目を削除して保存するのはこんな感じ。

#import <AddressBook/AddressBook.h>

int main() {
  ABAddressBook *addressBook = [ABAddressBook sharedAddressBook];
  // ホームページが.phpで終わってる人を探します
  ABSearchElement *searchElement =
    [ABPerson searchElementForProperty:kABURLsProperty
                                 label:nil
                                   key:nil
                                 value:@".php"
                            comparison:kABSuffixMatch];
  NSArray *personFound =
    [addressBook recordsMatchingSearchElement:searchElement];
  for(ABPerson *person in personFound) {
    // 見つかった人からホームページの項目を全部消しちゃいます
    [person removeValueForProperty:kABURLsProperty];
  }
  // 変更を保存!
  [addressBook save];
  return 0;
}

わかりやすいですね。 多分、AppleScriptでも同じようなことができると思います。しかしAppleScriptはいろいろ不思議な文法なので、今どきはAddressBook Frameworkを使ってさっくり処理しちゃいましょう。

その他、Frameworkの使い方はAddress Book Programming Guide for Mac OS Xに、APIに使えるパラメータはAddress Book Objective-C Framework Reference for Mac OS Xから辿れます。

ではでは、AddressBook Frameworkで楽しいアドレス帳ライフを!!