Watson's Blog

Bonjour RubyMotion

| Comments

今まで主夫兼 MacRuby Team メンバーみたいな肩書きだったのが、9 月 4 日 からは RubyMotion Team メンバーという肩書きが増えました。ありがとうございます。2010 年 8 月に MacRuby Team メンバーに加えていただいてから、少しずつ MacRuby の不具合を取り除いてきましたが、ここまでのものになると参加当時は思ってもみませんでした。Bonjour RubyMotion!

ということで、今日は RubyMotion で Bonjour を使ったものを書いてみました。

NSNetServiceBrowser と NSNetService というクラスを使って、iOS 側から Web サーバを探して接続するものとなっています。

app/app_delegate.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class BJController < UIViewController
  def viewDidLoad
    super

    # NSNetServiceBrowser を使ってサービスを検索
    @netServiceBrowser = NSNetServiceBrowser.alloc.init
    @netServiceBrowser.delegate = self
    @netServiceBrowser.searchForServicesOfType("_http._tcp", inDomain:"local")
    self
  end

  def netServiceBrowser(netServiceBrowser,
                        didFindService: service,
                        moreComing: moreComing)
    @netServiceBrowser.stop

    # NSNetService を使って接続先のアドレスを解決
    @service = NSNetService.alloc.initWithDomain(service.domain, type:service.type, name:service.name)
    @service.delegate = self
    @service.resolveWithTimeout(5.0)
  end

  def netServiceDidResolveAddress(service)
    @service.stop

    url = "http://#{@service.hostName}:#{@service.port}/"
    @webview = UIWebView.new.tap do |v|
      v.frame = self.view.bounds
      v.scalesPageToFit = true
      v.loadRequest(NSURLRequest.requestWithURL(NSURL.URLWithString(url)))
      v.delegate = self
      view.addSubview(v)
    end
  end
end

class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    @window.rootViewController = BJController.alloc.initWithNibName(nil, bundle: nil)
    @window.makeKeyAndVisible
    true
  end
end

Web サーバはどうするかというと、https://github.com/MacRuby/MacRubySamples/blob/master/Scripts/webrick.rb のサンプルを利用すると、すでに Bonjour が使われているので簡単ですね〜。

あらかじめ、MacRuby で書かれたサーバを起動しておいて、上記の iOS アプリを実行します。あとは、Bonjour を使って見つかったサーバに接続し UIWebView で表示しています。iPhone で URL を入力するのが面倒なので、そんな手間なしでさくっと Web ページを確認したいときとかに便利・・・かもしれませんね。

Bonjour

Comments