Más contenido relacionado
La actualidad más candente (20)
Similar a iOS WebView App (20)
iOS WebView App
- 5. 実装戦略
• HTML, CSS, JSのリソースをアプリにバン
ドルする or NOT
• Single Page Web App or NOT
• ネイティブUIパーツを使う or NOT
- 7. Single Page Web Appにするか
• Single Page
• JSの実装量は増える
• なんらかのJSフレームワークを使う
Sencha Touch, AngularJS etc...
• Multi Page
• 作りはシンプルになる
- 16. スクロールの制御
• Single Page Web App
Height 100%のブロック要素を並べて、
その中でスクロールさせる場合はデフ
ォルトのスクロールが邪魔になる。
(二重スクロール)
• そうでない場合はscrollViewのスクロー
ルを使う
- 20. position: fixed
• 効かない
• スクロールに引きずられる
• iScroll
• onScrollイベントを監視してposition:fixedを再
現している
• https://github.com/cubiq/iscroll
• 代替策として別のViewにして配置するのもアリ
- 21. テキスト入力
1. <input type=”text”> or <textarea> にフォーカス
2. Keyboard Windowがせり上ってくる
3. document.scrollTopがずれる
• テキスト入力パーツはなるべく画面上部に配置す
る。下の方だと最悪Keyboard Windowが被る。
• scrollViewのスクロールを無効にしているとユーザ
ーが元に戻せない。
→入力後にscrollTopを調整する。
• JavaScriptからキーボードの上げ下げを可能にして
おく
- 22. その他よくやる設定
<!-- 電話番号らしき数列をリンクにするのを無効化 -->
<meta name="format-detection" content="telephone=no">
body {
/* 文字列のコピーや選択をできなくする */
-webkit-user-select:none;
/* リンクの長押しメニューを出なくする */
-webkit-touch-callout:none;
/* アンカー要素をタップした時に出現する枠を見えなくする */
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
- 24. To WebView
NSString *js = @”window.App.hello();”;
[self.webView stringByEvaluationgJavaScriptFromString:js];
// 例:ネイティブからsessionId, userId etc.. を渡す
NSString *js = [NSString stringWithFormat:
@”window.App.deviceReady({
sessionId: ‘%@’,
userId: ‘%@’,
apiBase: ‘%@’
});”,
self.sessionId,
self.user_id,
@”http://api.hoge.com”];
[self.webView stringByEvaluatingJavaScriptFromString:js];
- 25. From WebView
1. 独自スキーマを指定してlocationを変更
2. UIWebViewDelegateのshouldStartLoadWithRequest
でフック
3. なにかやる
4. UIWebViewのstringByEvaluatingJavaScriptFromString
で結果を返す
ヒント:PhoneGapのソースの方がこのスライドよりも参考になる
https://github.com/phonegap/phonegap/blob/master/lib/ios/CordovaLib/cordova.js
- 26. // JS側の実装例
var transactionId = 0;
function nativeBridge(action, params, callback) {
// 後で呼び出すためにコールバック関数を保持する
var transactionId = transactionId++;
callbacks[transactionId] = callback;
var data = encodeURIComponent(JSON.stringify({
transactionId: transactionId,
params: params
}));
// iframeのlocation変更リクエストはWebViewDelegateで
// フックできる
var frame = $('<iframe>').attr('src',
'MyActionHandler://' + action + '/' + data
).css({display: "none"});
$(document.body).append(frame);
frame.remove();
}
- 27. // Objective-C
- (BOOL)webView:(UIWebView *)webView
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType {
// Check schema
if ([[request.URL.scheme lowercaseString]
isEqualToString:@”MyActionHandler”]) {
// なんかやる
return NO;
}
return YES;
}
- 38. • ブラウザでデバッグする際はネイティブ機能呼び出
しのブリッジを差しかえる (Alert, ActionSheet ...)
• AppDelegate相当の物を作っておく
• イベント受信部
• Push通知, Navigationbar button操作, on/offline..
• どの画面からでも開始できるようにしておく
• 画面遷移して到達しないと機能しない画面はデバ
ッグしづらい。なるべくステートレスに。
• Chromeのエミュレーションモード
• iPhone5, 4S etc... 選べるがイマイチ
ブラウザでデバッグ
- 40. • オートリロード必須
• リロードするのが手間
• grunt auto-reload を使う
• JS, HTMLはソース編集と同時にリロード
• CSSはDOMの状態を維持したまま変更が反映さ
れる
• window.onerrorでキャッチした例外をXcodeのロ
グに吐くようにしておく(特に発生行数)
• Safariの開発メニューから、開発者コンソールを
アタッチできる
iOSシミュレーターでデバッグ
- 45. • 素直なRESTful APIにしておく
• Request
• content-type: application/json
• Response
• content-type: application/json
設計
モダンなJavaScriptライブラリはこれが前提になって
いたりする(ex. backbone.js)。道を外れると一気に工
数が跳ね上がる。
- 46. • APIサーバーはCross Domain XHRに対応しておく
• HTML, JS, CSSはlocalhost (grunt server)で編集
• APIサーバーはAWS上の開発機を参照してAjaxで
叩く
• デザイナー or フロント担当エンジニアはローカ
ルに静的ファイルの開発環境のみ作れば良い
• 認証情報を独自ヘッダに持たせている場合
• OPTIONSのプリフライトリクエストが飛ぶので
APIサーバーをCORSに対応させておく
開発時