LoginSignup
3
2

More than 5 years have passed since last update.

Turbolinks for iOS のデモアプリ

Posted at

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

  1. turbolinks-ios.xcworkspaceファイルをXcodeで開く。
  2. TurbolinksDemo Schemeを選択し実行する。

ios_demo_1.png

ios_demo_2.png

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();
        }
      });
3
2
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
3
2