Turbolinks for iOS のデモアプリを動かした際の覚書です。
環境
- Turbolinks for iOS 1.0.2
- OS X El Capitan
- Xcode 7.3.1
- Ruby 2.3.0
- Sinatra 1.4.7
Server
必要なGemをインストールしてSinatraアプリを起動する。
cd TurbolinksDemo/server
bundle install --path vendor/bundle
bundle update
bundle exec rackup
iOS
- turbolinks-ios.xcworkspaceファイルをXcodeで開く。
- TurbolinksDemo Schemeを選択し実行する。
Open a new view controller
/one
ページへのリンク。
turbolinks-ios/TurbolinksDemo/server/lib/turbolinks_demo/views/index.erb
<ul>
<li><a href="/one">Open a new view controller</a> by following a regular link.</li>
turbolinks-ios/TurbolinksDemo/server/lib/turbolinks_demo/app.rb
get '/one' do
@title = 'Page One'
erb :one, layout: :layout
end
turbolinks-ios/Turbolinks/WebView.js
Turbolinks を用いたリンク。iOS 用の Adapter を適用している。
(参考)Turbolinks.visit の流れ
See the loading indicator
turbolinks-ios/TurbolinksDemo/server/lib/turbolinks_demo/app.rb
ページを返す際に sleep 2
を入れてプログレスバーを表示させている。
get '/slow' do
sleep 2
@title = 'Slow Page'
erb :slow, layout: :layout
end
Trigger an HTTP 404
存在しないページへのリンクを用意。
iOS(クライアント側)のdemoViewController.presentError
が呼ばれる。
turbolinks-ios/TurbolinksDemo/ApplicationController.swift
extension ApplicationController: SessionDelegate {
...
func session(session: Session, didFailRequestForVisitable visitable: Visitable ...
...
case 404:
demoViewController.presentError(.HTTPNotFoundError)
Visit a protected area
turbolinks-ios/TurbolinksDemo/ApplicationController.swift
case 401
で /sign-in
ページを返す。
turbolinks-ios/TurbolinksDemo/server/lib/turbolinks_demo/app.rb
Load a native view controller
/numbers
へのリンク。
turbolinks-ios/TurbolinksDemo/ApplicationController.swift
extension ApplicationController: SessionDelegate {
func session(session: Session, didProposeVisitToURL URL: NSURL, ...
if URL.path == "/numbers" {
presentNumbersViewController()
ApplicationController.swift#L45-L48
private func presentNumbersViewController() {
let viewController = NumbersViewController()
pushViewController(viewController, animated: true)
}
Follow an external link
https://github.com/turbolinks/turbolinks へのリンク。
Post a message from JavaScript
turbolinks-ios/TurbolinksDemo/server/lib/turbolinks_demo/views/layout.erb
document.addEventListener("click", function(event) {
if (event.target && event.target.matches("[data-behavior~=post-message]")) {
webkit.messageHandlers.turbolinksDemo.postMessage("Hello from JavaScript!");
event.preventDefault();
}
});