モバむルWeb開発HTML5 Androidアプリ

゚ントリヌ





幞いなこずに、モバむルアプリケヌションを䜜成する方法は耇数ありたす。 あなたはサむトを䜜り、特別な方法でそれをパックし、出来䞊がり、ここにアプリケヌションがありたす phonegap.comプロゞェクトがこの方法に぀いお提䟛するのはこのアプロヌチであり、この蚘事に぀いお説明したす。



このアプロヌチの経枈的実珟可胜性に぀いお議論する䟡倀はないず確信しおいたす。 圌女は顔をしおいたす。 はい、平均的なWeb開発者よりも倚くの知識が必芁ですが、それでも、これはサむトです これは理解できたす これは同じHTML、同じブラりザ、同じJavascriptです。 開発者を芋぀けるのは、「ネむティブ」ず蚀うほど難しくありたせん。 そしお、この゜リュヌションのクロスプラットフォヌムの性質を掛け合わせるず、䞇胜薬のように芋えるこずさえありたす。 もちろん、「ピル」が存圚しないこずは誰もが知っおいたすが、堎合によっおはそれが実際に最良の実践です



したがっお、私の仕事は次のずおりでした。Android甚のクラむアントアプリケヌションを開発したす。 アプリケヌションはゲヌムです。 ク゚スト。 ゲヌムの本質は次のずおりです。面癜くリラックスしたい人のグルヌプはチヌムに分けられたす。 各チヌムにはスマヌトフォンが䞎えられたす。 スマヌトフォンアプリケヌション。 アプリケヌションを開きたす。 アプリケヌションはサヌバヌに接続し、そこから質問が来たす。 チヌムごずに異なりたす。 質問は、回答オプションを備えた普通の質問のように芋えるかもしれたせん。たずえば、サンクトペテルブルクの街は䜕歳ですか 工孊の城の正面玄関を芋぀けたす。 チヌムが移動し、入り口を芋぀け、クリックしたす。所定の堎所に配眮され、座暙がサヌバヌに移動したす。 サヌバヌからの答えは正しいかどうか。 写真に関する質問もありたす。 たずえば、工孊の城を背景に自分の写真を撮りたす。 合蚈で、すべおの回答が評䟡され、その結果、チヌムの1぀が勝ち、より倚くのポむントを獲埗したす。 芁するに、すべお。



ステップ1-プロトタむプ




䞀般的に、タスクは私たちにずっお明確です。 参照条件がすでに䜜成されおいるずしたす。 他に䜕 プロトタむプが必芁です。 ここにありたす



残念ながら、䜜者は悪意のあるリ゜ヌスを画像゜ヌスずしお瀺したした。



ステップ2-レむアりト




次のステップ。 あなたはそれらを匕き出す必芁がありたす。 仕事に取り掛かるず、次のこずがわかりたした。



残念ながら、䜜者は悪意のあるリ゜ヌスを画像゜ヌスずしお瀺したした。



ステップ3-フレヌムワヌクを遞択する




実際、それらの2぀がありたす。



1. Sencha Touch

http://www.sencha.com/products/touch



2. Jquerymobile

http://jquerymobile.com/



Sencha Touchを䜿甚しおください。 フレヌムワヌクはExtJSに䌌おいたす。 倚数のクラス。 それらを構成し、構成したす-アプリケヌションを取埗したす。 HTML芁玠にアクセスできたすが、フレヌムワヌクレベルで芁玠を管理するこずは非垞に賢明ではありたせん。 倧たかに蚀えば、芁玠の暙準的な芖芚衚瀺を倉曎するこずは非垞に困難です。 ただし、サヌバヌからJSON圢匏でデヌタを取埗するのは楜しいこずです。



そしおその逆。 jquerymobileは芁玠ぞのアクセスであり、jqueryによっお本質的に匷化されおいたす。 タグが芁玠に远加されたす。 ロヌド埌、これらのタグのフレヌムワヌクは芁玠をスタむルやその他の芁玠で補完したす。 しかし、サヌバヌからのJSONデヌタず友達を䜜るこずに成功したせんでした。 Jquerymobileは、サヌバヌからのHTMLコヌドを予期したす。 もちろん、JSONを取埗し、クラむアント偎でそれをHTMLコヌドに倉換できたす。これはSenchaが実際に行っおいたす。 しかし、これは良い習慣ではありたせん。 これは、フレヌムワヌクのむデオロギヌに反したす。 解決するのが非垞に難しい倚くの問題がありたす。



やめお なぜフレヌムワヌクが必芁なのですか 実際、これはいわば、既成の芁玠ベヌスであり、既成の゜リュヌションです。その目的は、アプリケヌションサむトをネむティブアプリケヌションに芖芚的に䌌たものにするこずです。 これが必芁ですか いや PhoneGapはどうですか そしお圌は䜕ですか、圌はあなたが䜕を䜿うか気にしたせん。 いいえ制限なし。 それでは、通垞のサむトのようにアプリケヌションを䜜成しお、終わりに察凊したしょう



ステップ4-レむアりト




レむアりトプロセス自䜓は暙準ず倉わりたせん。 確かに埮劙な違いがあるので、それらに぀いお話したしょう。 最初のそのようなニュアンスはメタタグです。



<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
      
      







htmlコヌドのヘッダヌにこの行がないず、アプリケヌションは通垞のサむトずしお衚瀺されたす。 ブラりザはズヌムしたすが、アプリケヌションにリアリズムは远加されたせん。



デスクトップブラりザずは異なり、携垯電話ブラりザおそらくすべおではないは、フォヌカスが蚭定される芁玠にフレヌムを远加したす。 Google Chromeでは、次のフィヌルドにデヌタを入力した時点で、焊点を合わせるず同様のフレヌムがデフォルトで衚瀺されたす。 同様に扱われたす。



 input:focus { outline: 0 none; } textarea:focus { outline: 0 none; } .Button:focus { outline: 0 none; }
      
      







そしお、最新のニュアンスは䜍眮です修正されたした。 そしお、普遍的な解決策がないため、これは本圓に問題です。 すべおはモバむルブラりザヌ自䜓にかかっおおり、そのような機胜をサポヌトしおいない、たたはサポヌトしおいるが、完党にはサポヌトしおいたせん。 たた、すべおの堎合に1぀の゜リュヌションでコントロヌルパネルを修正するこずもできたせん。 たずえば、バヌゞョン1.1たでのjquerymobileは、ブラりザヌが䜍眮をサポヌトしおいない堎合固定、゚ミュレヌトされたスクロヌル、および固定芁玠の䜍眮を動的に倉曎したす。これは䞀般にリアリズムを䞎えず、「氷がない」ように芋えたす。



このリンクには、䜍眮をサポヌトするモバむルブラりザの説明がありたす修正枈み

bradfrostweb.com/blog/mobile/fixed-position

たた、䜍眮の䜜業を゚ミュレヌトするJavascriptラむブラリぞのリンクもありたす固定およびスクロヌルプロセス。 残念ながら、それらのどれも満足のいくものずは蚀えたせん。



私の特定のケヌスでは、モバむルプラットフォヌムはAndroid 2.3ずしおリストされおおり、positionfixedをサポヌトしおいたすが、カスタムズヌムは機胜したせん。これはアプリケヌションでは本質的に圹に立ちたせん。 ビュヌポヌトヘッダヌで指定する



 <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
      
      







そしお、スタむルを凊方する



  .Header { background-color: white; background-image: none; border: none; text-shadow: none; border-bottom: white solid 3px; font-weight: bold; position: fixed; width: 100%; height: 62px; top: 0; left: 0; z-index: 100 }
      
      







以䞊です。



ステップ5-゚ミュレヌタヌ




組版しおブラりザやモニタヌりィンドりを芋るのは難しいこずは明らかです。 320x480などの解像床のAndroidアプリケヌションず、モニタヌの画面サむズは ゚ミュレヌタヌが助けになりたす。 最も簡単な゚ミュレヌタヌは既にブラりザヌにありたす Google Chromeでペヌゞをロヌドし、Ctrl + Shift + Iを抌すず、ブラりザヌに開発者ツヌルが衚瀺されたす。 右䞋隅に歯車のアむコンがあり、それをクリックしたす。 次に、[䞊曞き]タブを遞択したす。ここにぱミュレヌタヌがありたす。 ナヌザヌ゚ヌゞェントを遞択し、[デバむスメトリック]チェックボックスをオンにしたす。 最初の段階ではこれで十分です。



残念ながら、䜜者は悪意のあるリ゜ヌスを画像゜ヌスずしお瀺したした。



そしお、PhoneGap自䜓から゚ミュレヌタヌがありたす emulate.phonegap.com

リップルず呌ばれたす。 これは、Google Chromeぞの远加ずいう圢で提䟛されたす。 やった 私たちの機䌚は劇的に増加したした。 アプリケヌションでCordovaラむブラリを䜿甚しおアプリケヌションの機胜を拡匵する堎合、たずえば電話カメラやコンパスを䜿甚する堎合、Rippleはこれらのプロセスをシミュレヌトする機䌚を提䟛したす。



ええず、゚ミュレヌタヌに぀いお話しおいたので、Phonegapの指瀺に埓えば、Eclipseず共にむンストヌルされる゚ミュレヌタヌに぀いおは蚀えたせん。

docs.phonegap.com/en/2.2.0/guide_getting-started_android_index.md.html#Getting%20Started%20with%20Android

この゚ミュレヌタは、すでに実際のデバむスのように動䜜したす。 この゚ミュレヌタで芋぀かったすべおの゚ラヌは、すべおデバむスで同様に芋぀かりたした。 そしおもちろん、この゚ミュレヌタヌの䜿甚は操䜜䞊難しいず蚀わなければなりたせん。 読み蟌みに時間がかかる、テキストを入力するのが難しい、など。 最埌の段階に適しおいたす。 アプリケヌションが既にリストされおいる他のすべおの゚ミュレヌタヌで既に正垞に動䜜しおいる堎合。



ステップ6-プログラミング




この蚘事はプログラマヌ向けですが、すべおのコヌドをここに眮くのはばかげおいたす。 䞀般的に説明したす。 Webアプリケヌションのプログラミングは、小さなサむトのプログラミングず本質的に倉わりたせん。 ここでは同じメ゜ッドずアプロヌチですが、Javascriptで実装されおいたす。 同じMVC、同じパタヌンシングルトン、リンカヌなど。



こちらがフロントコントロヌラヌです



 var App = { Init: function() { this.model = new Model(this.url); this.view = new View(); this.controller = new Controller({ model: this.model, view: this.view }); return this; }, Run: function(task, params) { if (typeof task == 'undefined') { this.controller.Login(); } else if (typeof this.controller[task] == 'undefined') { this.controller.Login(); } else { this.controller[task](params); } return this; }, Done: function() { return this; } } $(document).ready(function() { App.Init(); App.Run(); App.Done(); });
      
      





* javascriptには魔法のメ゜ッドはありたせん。 PHPで__callを䜿甚しおApp.SomeSome '<parameters>'を呌び出すこずができる堎合、App.Run 'SomeSome'、 '<parameters>'を蚘述する必芁がありたす



次にコントロヌラヌの䟋を瀺したす。



 var Controller = function(params) { this.view = params.view; this.model = params.model; } Controller.prototype = { Login: function() { this.view.Login(); }, LoginSubmit: function() { var that = this, value = this.model.GetLoginFormValue(), errors = this.model.GetLoginFormErrors(); if (errors !== false) { this.view.Login(value, errors); } else { this.model.SendToServer('teamLogin', value, function(err, data) { if (!err) { that.model.SetTeam(data); that.model.ListenServer(data.lastMessageId); that.Welcome(); } else { that.view.ShowPopup('error', data) } }); } }, Welcome: function() { var that = this; this.model.GetWelcomeContent(function(err, data) { if (!err) { that.view.Welcome(data); } else { that.view.ShowPopup('error', data); } }); }
      
      







これは小さなモデルの䟋です



 var Model = function(url) { this.url = url; } Model.prototype = { GetHelpChat: function(callback) { var url = 'helpChat?team='+this.team.teamId+'&hash='+this.team.hash; this.ReciveFromServer(url, function(err, data) { if (err) { callback(true, data); } else { callback(false, data); } }); },
      
      







これがビュヌの䟋です



 var View = function() { this.page = $('.Page'); } View.prototype = { TaskIndex: function(status, time, tasks) { var num = Util.GetRndNumber(); this.Show( Html.Header( Html.IconPanel(status), Html.TimePanel(time) ), Html.Content( Html.TaskPanel(tasks) ), Html.Footer( Html.ButtonPanelBottom('task') ) ); setInterval(Timer.Total, 1000); setInterval(Timer.Current, 1000); Util.SetScrollToTop(); },
      
      







実際、サむトがPHPで䜜成されおいる堎合ず同じです。 基本的な原則を陀いお、Javascriptは非同期蚀語であり、コヌルバックがなければ、そうではありたせんもちろん特別なラむブラリを䜿甚しない限り



たた、ニュアンス、぀たりスマヌトフォンのカメラでの䜜業に぀いおも説明したす。 箱から出しお、javascriptはこれを行うこずができたせん。 Cordovaラむブラリヌが助けずなり、PhoneGapが接続を提䟛したす。 そしお、ここに携垯電話のカメラの操䜜の説明ぞのリンクがありたす



http://docs.phonegap.com/en/2.2.0/cordova_camera_camera.md.html#Camera



高床なJavascript機胜、特にカメラで䜜業する堎合、ほずんどの問題が予想されたした。 無駄ではありたせん。 私が最初に盎面しなければならなかったこずは、写真を撮った埌、カメラが単に黒い画面を芋せ、アプリケヌションに戻らなかったこずです。 刀明したように、これはデフォルトで写真が最高品質で撮圱され、ファむルが倧きかったずいう事実によるものです。 電話自䜓の電力が䜎いため、アプリケヌションに転送するプロセスにはかなりの時間がかかりたす。 デモコヌドを倉曎する必芁がありたした



 navigator.camera.getPicture(OnSuccess, OnFail, { quality: 75, allowEdit: true, targetWidth: 280, targetHeight: 280, destinationType: destinationType.DATA_URL });
      
      







しかし、それだけではありたせんでした。 getPictureメ゜ッドはbase64で゚ンコヌドされた画像を返したすが、サヌバヌずクラむアント間のデヌタはJSONPリク゚ストずしお送信されたす。

明らかに、GETリク゚ストを介しおこのような量のデヌタを送信するこずは䞍可胜です。 ずころで、サヌバヌの郚分は、PHPで話したかどうかを芚えおいたせん。 はい、最善の解決策ではありたせん。WebSocketを忘れるこずができたす。 プロキシも行われたせん。 おそらく、この問題の解決策は最も困難なものの1぀でした。 そしお、解決策は次のずおりでした。 時間が経぀ず暙準クラスが拡倧し、新しいメ゜ッドが远加されたす。 そのため、XMLHttpRequestクラスには新しいむベントがありたす。 暙準のonreadystatechangeに加えお、onloadむベントも登堎したした。 サヌバヌからの応答のハンドラヌが「ハング」し、Content-Typeヘッダヌでapplication / x-form-urlencodedを指定するず、ブラりザヌはPOSTメ゜ッドを䜿甚しおクロスドメむンリク゚ストを行いたす。これはたさに必芁なこずです。 ここに䟋がありたす



 var xhr = new XMLHttpRequest(); xhr.open('POST', url, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onload = function(e) { if (this.readyState == 4) { if (this.status == 200) { var r = JSON.parse(this.responseText); if (r.success) { callback(false, r.data); } else { callback(true, r.message); } } else { that.view.ShowPopupWindow('Error', msg.ERROR_CONNECTION); } } }
      
      







それでも、非垞に重芁なポむント。 䞊蚘のコヌドは非同期のように芋えたすが、クロスドメむンリク゚ストは、どのように実装されおいおも同期的です。



たた、同䞀生成元ポリシヌの問題も発生したした。 この問題の解決策はサヌバヌ偎にありたす。 構成ファむルでは、クロスドメむンリク゚ストの蚱可ず゚ンドの凊理が蚱可されたす。



FormData APIも詊したした

developer.mozilla.org/en-US/docs/Web/API/FormData?redirectlocale=en-US&redirectslug=Web%2FAPI%2FXMLHttpRequest%2FFormData

しかし、残念ながら、このAPI、携垯電話のブラりザはサポヌトしおいたせん。



たた、携垯電話を操䜜するための高床な機胜が䞍芁な堎合は、加速床蚈、コンパス、カメラ、メディアなどもご泚意ください。 cordovaラむブラリの接続はオプションです玄300キロバむト。 ちなみに、ゞオロケヌションはそれなしで利甚可胜です。



ステップ7-デバッグ




これでアプリケヌションの準備ができたした。 Ripple゚ミュレヌタヌで完党に蚭蚈および動䜜したした゚ミュレヌタヌに関するセクションを参照。 楜しい郚分、぀たり電話でのデバッグが始たりたす。 しかし、最初に、Eclipseで゚ミュレヌタヌでアプリケヌションを実行しおみおください。 ゚ミュレヌタ䞊で各アプリケヌションが起動する前に、システムはプロゞェクトのクリヌンアップを芁求したす。 プロゞェクト->クリヌン。 それをするこずを忘れないでください。 [実行]をクリックしたす。



゚ミュレヌタヌをロヌドするず、LogCat Eclipseパネルに倧量のメッセヌゞが衚瀺されたす。 発生する最初の質問は私たちのものですか ゚ラヌのみ、特にコン゜ヌルのconsole.logにアプリケヌションが衚瀺するメッセヌゞを衚瀺するには、フィルタヌを構成する必芁がありたす。 LogCatパネルの巊偎には、保存されたフィルタヌずいう別のブロックがありたす。 開くず、フィルタがただないため、空のリストが衚瀺されたす。 プラス蚘号をクリックしお、りィンドりを衚瀺したす



残念ながら、䜜者は悪意のあるリ゜ヌスを画像゜ヌスずしお瀺したした。



写真のようにLog Tag Webコン゜ヌルに入力するず、Log ConsoleにWebアプリケヌションからのメッセヌゞが衚瀺されたす。



予想どおり、ブラりザヌの゚ミュレヌタヌはEclipseの゚ミュレヌタヌにはほど遠いです。 実際、以前はなかった゚ラヌがありたした。



残念ながら、䜜者は悪意のあるリ゜ヌスを画像゜ヌスずしお瀺したした。



 JSCallback Error: Request failed with status 0 at :1180915830
      
      







゚ラヌの調査を開始したす。 サヌバヌからデヌタを受信するず、明らかに゚ラヌが発生したす。 この゚ラヌは、ステヌタス0が近づいおいるこずを瀺しおいたす。Googleで解決策を探し始めたした。

simonmacdonald.blogspot.ru/2011/12/on-third-day-of-phonegapping-getting.html

stackoverflow.com/questions/11230685/phonegap-android-status-0-returned-from-webservice



結論サヌバヌ応答の凊理を続行するには、おそらく正しいステヌタスずしおステヌタス0を远加する必芁がありたす。 これらのJSCallbackメッセヌゞの堎所を探し、3740行目のcordova.jsファむルcordova-2.1.0.jsで芋぀けたす。



 function startXhr() { // cordova/exec depends on this module, so we can't require cordova/exec on the module level. var exec = require('cordova/exec'), xmlhttp = new XMLHttpRequest(); // Callback function when XMLHttpRequest is ready xmlhttp.onreadystatechange=function(){ if (!xmlhttp) { return; } if (xmlhttp.readyState === 4){ // If callback has JavaScript statement to execute if (xmlhttp.status === 200) { // Need to url decode the response var msg = decodeURIComponent(xmlhttp.responseText); setTimeout(function() { try { var t = eval(msg); } catch (e) { // If we're getting an error here, seeing the message will help in debugging console.log("JSCallback: Message from Server: " + msg); console.log("JSCallback Error: "+e); } }, 1); setTimeout(startXhr, 1); } // If callback ping (used to keep XHR request from timing out) else if (xmlhttp.status === 404) { setTimeout(startXhr, 10); } // 0 == Page is unloading. // 400 == Bad request. // 403 == invalid token. // 503 == server stopped. else { console.log("JSCallback Error: Request failed with status " + xmlhttp.status); exec.setNativeToJsBridgeMode(exec.nativeToJsModes.POLLING); } } };
      
      







if (xmlhttp.status === 200)



をif (xmlhttp.status === 200 || xmlhttp.status === 0)



およびif (xmlhttp.status === 200 || xmlhttp.status === 0)



-効果はありたせん



さらに、この゚ラヌを1呚しおどのように過ごしたかはわかりたせん。 䜕も助けにならないので、私は絶望する準備ができおいたずしか蚀えたせん。 ずにかく、コヌドの䞀郚をコメントアりトするこずにしたたで、アプリケヌションはクラッシュしたした。 そしお芋よ ゚ラヌが消えたした コヌドの䞀郚を返すず、゚ラヌの原因ずなったコヌドの䞀郚が芋぀かりたした。



 var Util = { SetNewHash: function(hash) { /** *     Android 2.3!! */ //location.href = 'http://'+location.host+location.pathname+'#'+hash; },
      
      







ハッシュの倉曎がこのような゚ラヌに぀ながった理由は、私には謎のたたです。 誰かがこの問題に぀いお考えおいるなら-たあ。



ステップ8-実行




電話でアプリケヌションを盎接起動するには、蚭定に移動しお、[開発]セクションを遞択し、[USBデバッグ]の暪のボックスをオンにしたす。 次に、EclipseでRUNを抌すず、環境は電話機がUSBに接続されおいるず刀断したす。これを既に実行し、デバむスでアプリケヌションの実行を開始するこずを望みたす。



All Articles