Bonjour

iPhone アプリをつくってて、 Bonjour をつかえばいろいろと楽しいことができるんじゃない? と調べていました。ここまでのところをシェア。

Bonjour というのは、 DNS サーバがなくても、同じネットワーク内にいるコンピュータを見つけあうことができる技術。 Zero Configuration とか Rendezvous とか言われてたりもした。

準備

遊びでつかうなら、 service type = _wwdcpic あたりでローカルで遊ぶといいんじゃないかな。

本気でつかうなら、dns-sd にサービスの登録をする。 サービス名、説明、責任者といった情報をつけてメールすれば、そのうち受理されたりする。

Cocoa API

いいところ:

  • 使いやすく抽象化されてる
  • Mac, iPhone どちらでも同じように使える!

ちゃんと RubyCocoa でも使えたよ!

NSNetService

サーバ側。サービスを提供していることをアピールし、クライアントから接続されてくるのを待つ。

ながれ:

  • initWithDomain_type_name_port
  • setDelegate
  • publish

ここの type で指定するのを、 dns-sd に登録しておくということ。 クライアントとのやりとりは delegate のコールバックに通知される。 接続されたあとの処理は、ふつうのネットワークプログラムとおなじ。

NSNetServiceBrowser

クライアント側。サーバをてきとうに探し出して、接続する。

ながれ:

  • init
  • setDelegate
  • searchForServicesOfType

みつかったあとのサーバとのやりとりは、 delegate のコールバックに通知される。

Sample code

/Developer/Examples//Foundation/PictureSharing

このコードを読むと、だいたい把握できる。

あと、自分で書いたコードが github:remoteshortcuts にあります。 Mac with RubyCocoa, iPhone とごちゃまぜなかんじがたのしいかと。

つまづきポイント

  • NSNetService は、 stop を送られたあとにもう一度 publish で起動しようとしてもダメ (しぬ)
  • delegate を設定する前にメッセージを送っても意味なし

まとめ

想像以上にかんたんに使えました。 Cocoa フレームワークはすばらしい。 iPhone アプリどうしで小さなネットワークをつくって遊ぶようなときにさくっと使うと楽しそうです。勉強会とか。

  • 浮遊人

    サンプルコードをDLさせていただき,
    ちょこちょこ改造して遊ばせてもらっております.
    突然の質問ですが,サーバー側のdaemon.rbで
    AppleScriptで処理するとき
    「@tc.callHandler_withParameters("関数名", nil)」
    となっておりますが,関数に文字などの値を渡したいのですが,
    nilの部分に"文字列"などと記述して,
    AppleScript側で「on 関数名(変数名)」として実行しても
    上手く動作してくれないのですが,どのようにすればよろしいでしょうか?

blog comments powered by Disqus