今まで主夫兼 MacRuby Team メンバーみたいな肩書きだったのが、9 月 4 日 からは RubyMotion Team メンバーという肩書きが増えました。ありがとうございます。2010 年 8 月に MacRuby Team メンバーに加えていただいてから、少しずつ MacRuby の不具合を取り除いてきましたが、ここまでのものになると参加当時は思ってもみませんでした。Bonjour RubyMotion!
ということで、今日は RubyMotion で Bonjour を使ったものを書いてみました。
NSNetServiceBrowser と NSNetService というクラスを使って、iOS 側から Web サーバを探して接続するものとなっています。
app/app_delegate.rb1
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 ページを確認したいときとかに便利・・・かもしれませんね。