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