iPhone
Swift
Swift3.0
Swifter

iPhone上にSwifterでサーバーをたててiPhone内のリソースをサーバーを通して取得

More than 1 year has passed since last update.

やりたいこと

iPhoneのWebView内でJavaScriptを実行し、iPhone内のリソースを取得。
(最終目的はSpineのアニメーションをWebView内で、JavaScriptを使って動かすこと。なぜJavaScriptかというと、SpineをSwiftで動かすのがハードルが高すぎるので。)

問題点

JavaScriptからはiPhone内のリソースに直接アクセスできない。

解決方法

iPhone上にSwifterを利用してサーバーを立てて、サーバーを通してファイルを取得。

コード

import Swifter

let server = HttpServer()
let bundle = Bundle.main

server.GET["/:file"] = { request in
    print("request: " + request.path)
    let path = NSString.init(string: request.path)
    let pathBundle = bundle.path(forResource: path.deletingPathExtension, ofType: path.pathExtension)
    if pathBundle == nil {
        return .notFound
    } else {
        if let file = try? pathBundle!.openForReading() {
            return .raw(200, "OK", [:], { writer in
                try? writer.write(file)
                file.close()
            })
        } else {
            return .notFound
        }
    }
}

do {
    print("start server")
    try server.start(3000, forceIPv4: true, priority: DispatchQoS.QoSClass.default)
} catch {
    print("cannot start server")
}

動作確認

Safariで "localhost:3000/{任意のリソースのパス}" にアクセスし
ファイルの中身が表示されることを確認した。
追記2) forceIPv4:true だとアクセスできないかもしれない。Safariで試した時点ではforceIPv4:falseとしていた。

追記1) WebView内でバンドルリソース内のHTMLファイルを表示できた。

セキュリティ

localhostドメインからのリクエストのみを許可すれば、外からは見えないだろう。(このコードではやってない)
さらに、特定のリソースしか返さないようなロジックを追加すれば、より確実になるはず。
あと、forceIPv4をtrueにしたのはIPv6でダイレクトにアクセスされるのを防ぐ狙い。
セキュリティ的にまずいことがあったら、どなたか教えてくだされ。

蛇足

Swiftはじめて1週間に満たないので、美しくないコードを書いているかもしれないので注意してください。
あと、いんたーねっつのことも最近勉強しはじめたので、用語の使い方が間違っているかも。