LoginSignup
2
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-08-05

やりたいこと

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

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4