2015年3月25日水曜日

XcodeでCocoa, Swiftを勉強 〜FMDBライブラリを使う〜

FirefoxのCookieからセッションをとってこようと思ったら、
どうやらFirefoxのCookieはSQLiteのようなので、SQLiteが扱えるようにならないといけないみたい。
SwiftでSQLiteを使うには各所で公開されているライブラリを使うのが手っ取り早い(というかその方法しか分からなかった)
ライブラリも色々あり、試してみたが私が唯一使えたのはFMDBだった。
ということでFMDBライブラリが使えるようになるまでの手順を書き残しておく。

今回ここで書く手順はほとんど下記のサイトの真似。

SwiftでSQLiteのFMDBをエラー無しで設定する方法!
GitHubからFMFBをダウンロード

FMDBの中の「src」の中の「fmdb」をプロジェクトにドラッグする

こんな感じに「fmdb」が追加される

プロジェクトをクリック→Generalをクリック→Linked Frameworks and Librariesの「+」をクリック

libsqlite3.0.dylibというダイナミックリンクライブラリを選択してAddボタンをクリック
上の検索フォームを使うと探すのが楽。

こんな感じで追加される

いFMDBのようなObjective-Cなライブラリも、「プロジェクト名-Bridging-Header.h」なるものを作れば
Swiftで扱えるようになるよう。ブリッジ。文字通り橋渡ししてくれる。いやー便利。
ということで、右クリック→New File

Header Fileを選択

ファイル名は「プロジェクト名-Bridging-Header.h」
今回の場合「sqlitest」というプロジェクト名なので「sqlitest-Bridging-Header.h」

こんな感じでヘッダファイルが追加される

「プロジェクト名-Bridging-Header.h」の中に使いたいヘッダーファイルを記述する。
#import "FMDatabase.h"
#import "FMResultSet.h"
#import "FMDatabaseAdditions.h"
#import "FMDatabaseQueue.h"
#import "FMDatabasePool.h"
#import "sqlite3.h"

プロジェクトをクリック→Build Settingsをクリック→Objective-C Bridging Headerを選択
左にある記述欄をクリックすると入力フォームが現れる。
ダブルクリックだと画像のような吹き出し上の入力フォームが現れる。こちらの方が見易いかも。

入力する内容は
$(SRCROOT)/$(PROJECT)/プロジェクト名-Bridging-Header.h
今回の場合は「$(SRCROOT)/$(PROJECT)/sqlitest-Bridging-Header.h」となる

以上でFMDBライブラリを使うための設定は完了。
試しにswiftコードで「FMD」と入力すると次のようなFMDatabase関連の予測が出てくれる。

試しにFirefoxのクッキー情報を出力させるプログラムを作ってみた。
複数プロファイル作っていれば全部出力する。


        //ライブラリフォルダ
        let LibDirectory = NSSearchPathForDirectoriesInDomains(
            .LibraryDirectory,
            .UserDomainMask, true)
        //Firefoxのプロファイルフォルダ
        let FirefoxPath = LibDirectory[0].stringByAppendingPathComponent("Application Support/Firefox/Profiles")
        //ファイルやディレクトリ情報を取得するため
        let fm = NSFileManager.defaultManager()
        //ファイルかディレクトリかの判定がここに入る
        var isDir = ObjCBool(false)
        //Firefoxのプロファイルディレクトリ内にあるファイルやディレクトリ一覧を取得
        let list = fm.contentsOfDirectoryAtPath(FirefoxPath, error: nil)!
        for path in list {
            //Firefoxのプロファイル内にあるファイルもしくはディレクトリのパスを設定
            let DirPath = FirefoxPath.stringByAppendingPathComponent(path as String)
            //ファイルかディレクトリか判定し、isDirに入れる
            fm.fileExistsAtPath(DirPath, isDirectory: &isDir)
            //ディレクトリならこの中を処理
            if isDir.boolValue {
                //Cookieファイルのパスを設定
                let CookiePath = DirPath.stringByAppendingPathComponent("/cookies.sqlite")
                //データベースを設定
                let db = FMDatabase(path: CookiePath)
                if db.open() {
                    println("=========" + (path as String) + "のクッキー=========")
                    //SELECT文実行 クッキーの全情報を問い合わせ
                    var resultSet = db.executeQuery("SELECT * FROM moz_cookies", withParameterDictionary: nil)
                    //クッキーの情報からドメイン名、名前、値をデバッグコンソールに出力させる
                    while resultSet.next() {
                        var domain = resultSet.stringForColumn("baseDomain")
                        var name = resultSet.stringForColumn("name")
                        var value = resultSet.stringForColumn("value")
                        println("domain:\(domain) name:\(name) value:\(value)")
                    }
                } else {
                    println("=========" + (path as String) + "のデータベースが開けなかった=========")
                }
            }
XcodeでSwiftを勉強 その1 〜開発の流れを知る〜
XcodeでSwiftを勉強 その2 〜アクションを知る〜 
XcodeでSwiftを勉強 その3 〜ファイルを開くダイアログを知る〜

1 件のコメント:

  1. Cocoa よりも、Swift は、なかなか作りやすいなあと思います。

    これからも、ずっとこのシリーズを続けてください。

    返信削除