Safari のブックマークを読み込む

Webkit をつかって Web View をアプリケーションに追加したときに、ブックマークがあると便利。

だけど、ブックマークの機能を位置から作るとなるとめんどくさい。まあ、まだ方法がわからない、と言った方がいいか。

だったら、他のブラウザから読み込んでしまえばいい、と。

木下誠さんの HDMT のサイトにある「はじめてのブラウザのつくり方」の「ブックマークメニューを追加する」に

Objective-C で Safari のブックマークを読み込む方法が説明してある。木下さんも他の人の実装を参考にしたそうだが、

その元のサイトは存在しないので、木下さんのサイトにあるソースコードを RubyCocoa にしてみた。

ここでは、コードと少しだけ自分のメモのために書いておくので、詳しいことが知りたい人は木下さんのサイトを参照。

はじめに Interface Builder で MainMenu.nib にあるメニューに Bookmark 用のメニューを追加する。そのとき、item は

スクリプトで追加するので空にしておく。そして、AppController(NSObject のサブクラス)の outlet をつくって、

このメニューにアクセスできるようにする。ここでは、bookmarkMenu としてある。この outlet をメニューに結びつけるんだけど、

結びつけるのは、Bookmark となっている Menu Item ではなく、Bookmark の Menu(Item 1 とか入っていたところ)に結びつける。

空っぽにしたので、細くなってしまっているが、間違えずにそこに結びつける。

次にスクリプト。まず、awakeFromNib で Safari のブックマークファイルを NSDictionary オブジェクトとして読み込む。

実際の処理は、makeBookmarkMenu で行うのでそれを呼び出してる。

def awakeFromNib

@fileManager = NSFileManager.defaultManager

bookmarkPath = "#{NSHomeDirectory()}/Library/Safari/Bookmarks.plist"

return if not @fileManager.fileExistsAtPath(bookmarkPath)

bookMark = NSDictionary.dictionaryWithContentsOfFile(bookmarkPath)

children = bookMark["Children"]

return if children.nil?

children.each do |child|

self.makeBookmarkMenu(child,@bookmarkMenu)

end

end

makeBookmarkMenu でブックマークを読み込んで Popup ボタンのアイテムに割り当てている。

このときに、gotoPage という ib_action を割り当てて、メニューアイテムが選ばれたときに

そのメソッドが実行されるようにする。

def makeBookmarkMenu(bookMark,parentMenu)

if bookMark["WebBookmarkType"] == "WebBookmarkTypeList"

title = bookMark["Title"]

return if title.nil?

menuItem = NSMenuItem.alloc.initWithTitle_action_keyEquivalent(title,nil,"")

menu = NSMenu.alloc.init

menuItem.setSubmenu(menu)

parentMenu.addItem(menuItem)

children = bookMark["Children"]

return if children.nil?

children.each do |obj|

self.makeBookmarkMenu(obj,menu)

end

elsif bookMark["WebBookmarkType"] == "WebBookmarkTypeLeaf"

title = bookMark["URIDictionary"]["title"]

return if title.nil?

menuItem = NSMenuItem.alloc.initWithTitle_action_keyEquivalent(title,:gotoPage,"")

menuItem.setTarget(self)

menuItem.setRepresentedObject(bookMark)

parentMenu.addItem(menuItem)

end

end

最後に、選ばれたブックマークの URL を Web View に表示するメソッドを作る。ここでは、webView という outlet を

表示させる Web View に結びつけてある。

def gotoPage(sender)

bookmark = sender.representedObject

url = bookmark["URLString"]

@webView.mainFrame.loadRequest(NSURLRequest.requestWithURL(NSURL.URLWithString(url)))

end

これをコピペすれば動くはず(動いてるのから取ったから)。ただし、include OSX を忘れないように。