モバむルアプリケヌションの開発におけるクロスプラットフォヌムずネむティブアプロヌチの組み合わせ

1぀のモバむルプラットフォヌムのみのアプリケヌションをリリヌスするこずは関係ないため、iOSずAndroidの2぀のバヌゞョンを同時に開発する必芁がありたす。 ここでは、2぀の方法を遞択できたす。各オペレヌティングシステムの「ネむティブ」プログラミング蚀語で䜜業するか、クロスプラットフォヌムフレヌムワヌクを䜿甚したす。



DD Planetのプロゞェクトの1぀を開発するずき、私は最埌の遞択肢に頌っおいたした。 たた、この蚘事では、クロスプラットフォヌムアプリケヌションの開発経隓、遭遇した問題、芋぀かった解決策に぀いお説明したす。



クロスプラットフォヌムモバむルアプリケヌションを開発するための3぀のアプロヌチ



たず、iOSずAndroidの2぀のアプリケヌションを同時に取埗する必芁がある堎合にどのアプロヌチを䜿甚するかを怜蚎したす。



1぀目は、時間ずリ゜ヌスの䞡面で最も高䟡なもので、プラットフォヌムごずに個別のアプリケヌションを開発したす。 このアプロヌチの耇雑さは、各オペレヌティングシステムが独自のアプロヌチを必芁ずするずいう事実にありたすこれは、開発が行われおいる蚀語Androidの堎合はJavaたたはKotlin、iOSの堎合はObjective-CたたはSwiftずUI郚分の蚘述方法の䞡方で衚珟されたすアプリケヌションそれぞれaxmlおよびxibたたはストヌリヌボヌドファむル。



この事実だけでも、このアプロヌチでは2぀の開発チヌムを線成する必芁があるずいう事実に぀ながりたす。 さらに、各プラットフォヌムのロゞックを耇補する必芁がありたすAPIおよびビゞネスロゞックずの盞互䜜甚。



画像






しかし、䜿甚されるAPIの数が増えたらどうなるでしょうか



画像






これは、人的資源の必芁量をどのように枛らすかずいう疑問を投げかけたす。 プラットフォヌムごずにコヌドを耇補する必芁性を取り陀きたす。 この問題を解決する十分な数のフレヌムワヌクずテクノロゞヌがありたす。



クロスプラットフォヌムフレヌムワヌクXamarin.Formsなどを䜿甚するず、1぀のプログラミング蚀語でコヌドを蚘述し、デヌタロゞックずUIロゞックを䞀床に1箇所で蚘述するこずができたす。 したがっお、2぀の開発チヌムを䜿甚する必芁はなくなりたす。 そしお、プロゞェクトをコンパむルした結果、2぀のネむティブアプリケヌションが出力されたす。 これが2番目のアプロヌチです。



画像






倚くの人は、Xamarinが䜕であるか、たたは少なくずもそれに぀いお聞いたこずがあるず思いたすが、どのように機胜したすか Xamarinは、.NETプラットフォヌムのオヌプン゜ヌス実装であるMonoに基づいおいたす。 Monoには、独自のCコンパむラ、ランタむム、およびWinFormsずASP.Netの実装を含む倚数のラむブラリが含たれおいたす。



プロゞェクトの目暙は、Cで蚘述されたプログラムをWindows以倖のオペレヌティングシステムUnixシステム、Mac OSなどで実行できるようにするこずです。 Xamarinフレヌムワヌク自䜓は、本質的には、開発者にプラットフォヌムのSDKずこれらのコンパむラヌぞのアクセスを提䟛するクラスラむブラリです。 次に、Xamarin.Formsを䜿甚するず、䞡方のプラットフォヌム甚に同じ蚀語で蚘述できるだけでなく、XAMLマヌクアップを䜿甚しお画面を蚭蚈するこずもできたす。 プロゞェクトのアセンブリの結果、コンパむル段階ですべおのXFコントロヌルが各プラットフォヌムのネむティブに倉換されるため、すべおのプラットフォヌムでほが同じ倖芳になりたす。



画像






開発者は、プラットフォヌムの機胜指王スキャナヌやバッテリヌレベルなどにアクセスする必芁がある堎合、たたは制埡動䜜を埮調敎する必芁がある堎合にのみ、各プラットフォヌムのコヌドを蚘述するこずを匷制されたす。 堎合によっおは、アプリケヌションの開発時にプラットフォヌム䟝存のコヌドを蚘述する必芁がある堎合がありたすが、この堎合でも、プラットフォヌム機胜をむンタヌフェむスに持ち蟌んで、埌で共通プロゞェクトから操䜜するこずを犁止する人はいたせん。



1぀のプログラミング蚀語、小さなコヌドなど。 それはすべお矎しいように聞こえたすが、Xamarin.Formsは特効薬ではなく、その矎しさはすべお珟実の石の䞊で壊れおいたす。 組み蟌みのXFコントロヌルがそれらの芁件を満たさなくなった状況が発生するずすぐに、画面ずコントロヌルの構造はたすたす耇雑になりたす。 䞀般的なプロゞェクトの画面を快適に䜿甚するには、たすたす倚くのカスタムレンダリングを䜜成する必芁がありたす。



これは、アプリケヌションを開発するずきに䜿甚する3番目のアプロヌチに進みたす。



Xamarin Formsを䜿甚するず、䜜業が単玔化されるのではなく、耇雑になる可胜性があるこずが既にわかっおいたす。 そのため、アヌキテクチャが耇雑な画面、ネむティブのものずは根本的に異なる蚭蚈芁玠およびコントロヌルを実装するために、劥協ず、最初ず2番目のアプロヌチを組み合わせる可胜性が芋぀かりたした。



Xamarin Formsを䜿甚しない䞀般的なPCLプロゞェクトず、Xamarin AndroidずXamarin iOSの2぀のプロゞェクトずいう3぀のプロゞェクトがありたす。 1぀の蚀語、2぀のプロゞェクト間の共通ロゞックですべおを蚘述する機䌚はただありたすが、単䞀のXAMLマヌクアップの制限はありたせん。 UIコンポヌネントは各プラットフォヌムで制埡され、Androidではネむティブツヌル、ネむティブAXML、iOSではXIBファむルを䜿甚したす。 コアプロゞェクトずプラットフォヌムプロゞェクト間の接続はデヌタレベルでのみ線成されるため、各プラットフォヌムにはガむドラむンに埓う機胜がありたす。



このような関係を敎理するには、MVVMデザむンパタヌンず、Xamarinのかなり䞀般的な実装であるMVVMCrossを䜿甚できたす。 その䜿甚により、䜜業の「ビゞネスロゞック」党䜓を蚘述する各画面に共通のViewModelを保持し、そのレンダリングをプラットフォヌムに委ねるこずができたす。 たた、2人の開発者が同じ画面䞀方はロゞック-もう䞀方はUIを操䜜し、お互いに干枉しないようにするこずができたす。 パタヌンの実装に加えお、䜜業に十分な数のツヌルDIおよびIoCの実装を取埗したす。 プラットフォヌムずの盞互䜜甚を䞀般的なコヌドのレベルに䞊げるには、開発者はむンタヌフェむスを宣蚀しおプラットフォヌムに実装するだけです。 通垞、MvvmCrossは独自のプラグむンのセットをすでに提䟛しおいたす。 チヌムでは、プラットフォヌムず共通コヌド間でメッセヌゞを亀換するためにメッセンゞャヌプラグむンを䜿甚し、ファむルを操䜜するギャラリヌから画像を遞択するなどプラグむンを䜿甚したす。



耇雑な蚭蚈ずマルチレベルナビゲヌションの問題を解決したす



前に述べたように、画面䞊で耇雑な衚珟を䜿甚する堎合、フレヌムワヌクは人生をより耇雑にする可胜性がありたす。 しかし、耇雑な芁玠ずは䜕ですか 私は䞻にiOS開発に携わっおいるため、このプラットフォヌムの䟋を怜蚎したす。 たずえば、入力フィヌルドのような些现なものには、いく぀かの状態ず、切り替えず芖芚化のための十分なロゞックがありたす。



画像






ナヌザヌ入力を凊理する過皋で、このような入力コントロヌルがここで開発されたした。 入力フィヌルドの䞊に名前を䞊げ、マスクを操䜜し、接頭蟞を蚭定し、接尟蟞を付け、CapsLockが抌されたずきに通知し、゚ラヌ情報の入力ず出力の犁止の2぀のモヌドで情報を怜蚌したす。 コントロヌル内のロゞックは玄1000行かかりたす。 そしお、入力フィヌルドの蚭蚈で䜕が耇雑になるのでしょうか



私たちが芋た耇雑なコントロヌルの簡単な䟋。 画面はどうですか



画像






たず、ほずんどの堎合、単䞀のアプリケヌション画面は単䞀のクラス-UIViewControllerであり、その動䜜を説明するこずを明確にしたす。 開発䞭、マルチレベルナビゲヌションの䜜成が必芁でした。 開発されたアプリケヌションの抂念は、䞍動産の管理ず、隣人や自治䜓ずのやり取りに垰着したす。 そのため、プロパティ、プレれンテヌションレベル自宅、郜垂、地域、コンテンツタむプの3぀のレベルのナビゲヌションが構築されたした。 すべおの切り替えは、1぀の画面内で実行されたす。



これは、ナヌザヌがどこにいおも、どのようなコンテンツを芋おいるかを理解できるようにするために行われたした。 そのようなナビゲヌションを敎理するために、アプリケヌションのメむン画面は1぀のコントロヌラヌから遠く離れお構成されおいたす。 芖芚的には3぀の郚分に分けるこずができたすが、誰がここで䜿甚されおいるコントロヌラヌの数を掚枬できたすか



画像






15個のメむンコントロヌラヌ。 そしお、これはコンテンツのためだけです。



ここでは、そのようなモンスタヌはメむン画面に䜏んでいお、かなり気分がいいです。 もちろん、1画面に15個のコントロヌラヌがありたす。 これはアプリケヌション党䜓の速床に圱響するため、䜕らかの方法で最適化する必芁がありたす。



同期初期化を拒吊したした。すべおのビュヌモデルは、必芁な堎合にのみバックグラりンドで初期化されたす。 レンダリング時間を短瞮するために、これらの画面のxibファむルも砎棄したした。絶察䜍眮決めず蚈算は、芁玠間の䟝存関係を蚈算するよりも垞に高速です。



非垞に倚くのコントロヌラヌを远跡するには、理解する必芁がありたす。





これを行うために、ナヌザヌの䜍眮、ナヌザヌが衚瀺するコンテンツの皮類、ナビゲヌションの履歎などに関する情報を保存する別のナビゲヌションプロセッサを䜜成したした。 圌は初期化の順序ず必芁性を制埡したす。



各タブはコントロヌラヌのスラむダヌであるためスワむプトランゞションを䜜成するため、それぞれを独自の状態にするこずができたすたずえば、「ニュヌス」は䞀方を開き、もう䞀方は「投祚」を行いたす。 これには、同じナビゲヌションプロセッサが続きたす。 プレれンテヌションのレベルを自宅から地域に倉曎しおも、同じ皮類のコンテンツにずどたりたす。



デヌタの流れをリアルタむムで制埡したす



アプリケヌション内の非垞に倚くのデヌタを䜿甚しお、すべおのセクションの関連情報の配信をリアルタむムで敎理する必芁がありたす。 この問題を解決するには、3぀の方法を区別できたす。



  1. タむマヌたたはトリガヌによっおAPIにアクセスし、画面䞊の関連コンテンツを再芁求したす。
  2. サヌバヌに氞続的に接続し、リアルタむムで倉曎を受信したす。
  3. コンテンツの倉曎でプッシュを受信したす。


それぞれのアプロヌチには長所ず短所があるため、それぞれの長所のみを遞択しお、3぀すべおを䜿甚するこずをお勧めしたす。 アプリケヌション内のコンテンツを、ホット、レギュラヌ、およびサヌビスのいく぀かのタむプに条件付きで分割したした。 これは、むベントからナヌザヌぞの通知たでの蚱容時間を決定するために行われたす。 たずえば、チャットメッセヌゞを送信した盎埌に衚瀺したい-これはホットコンテンツです。 別のオプション近隣からのポヌリング。 これが通垞のコンテンツであるため、圌を今、たたはすぐに芋おも違いはありたせん。 アプリケヌション内の小さな通知未読メッセヌゞ、コマンドなどは、緊急配信が必芁なサヌビスコンテンツですが、倧量のデヌタを必芁ずしたせん。



刀明した





最も興味深いのは、䞀定の接続を維持するこずです。 Web゜ケットを操䜜するための独自のクラむアントを䜜成するこずは、うさぎの穎の䞀歩であるため、他の゜リュヌションを探す必芁がありたす。 その結果、SignalRラむブラリヌで停止したした。 それが䜕であるか芋おみたしょう。



ASP.Net SignalRは、クラむアントずサヌバヌ間の双方向通信を提䟛する、リアルタむムでのクラむアントずサヌバヌの察話を簡玠化するマむクロ゜フトのラむブラリです。 サヌバヌには、接続、接続切断むベント、接続クラむアントをグルヌプに結合するメカニズム、および承認を管理するための本栌的なAPIが含たれおいたす。



SignalRは、websocket、LongPolling、およびhttpリク゚ストの䞡方をトランスポヌトずしお䜿甚できたす。 トランスポヌトのタむプを匷制的に指定するか、ラむブラリを信頌できたす。websocketを䜿甚できる堎合、websocketを介しお動䜜し、これが䞍可胜な堎合は、蚱容されるトランスポヌトが芋぀かるたで停止したす。 この事実は、モバむルデバむスでの䜿甚が蚈画されおいるずいう事実を考えるず、非垞に実甚的であるこずがわかりたした。



合蚈、どのような利益が埗られたすか





もちろん、これはすべおのニヌズを満たしおいるわけではありたせんが、生掻が著しく楜になりたす。



プロゞェクト内では、SignalRラむブラリでラッパヌが䜿甚されたす。これにより、ラッパヌの操䜜がさらに簡単になりたす。





これらの各ラッパヌクラむアントず呌びたすは、キャッシュシステムず連携しお動䜜し、接続が切断された堎合に、この間に芋逃した可胜性のあるデヌタのみを芁求できたす。 耇数の掻性化合物が同時に保持されるため、「それぞれ」。 アプリケヌション内には本栌的なメッセンゞャヌがあり、サヌビスを提䟛するために別のクラむアントが䜿甚されたす。



2番目のクラむアントは、通知の受信を担圓したす。 既に述べたように、通垞のタむプのコンテンツはhttp-requestsを介しお取埗されたすが、将来的には、その曎新はこのクラむアントにありたす。



アプリケヌションのデヌタを芖芚化する



画像






デヌタを取埗するこずず衚瀺するこずは別です。 リアルタむムのデヌタ曎新には独自の問題がありたす。 少なくずも、これらの曎新をナヌザヌに提瀺する方法を決定する必芁がありたす。 アプリケヌションでは、次の3皮類の通知を䜿甚したす。



  1. 未読コンテンツの通知。
  2. 画面䞊のデヌタの自動曎新。
  3. コンテンツ提䟛。


新しいコンテンツがあるこずを瀺す最も䞀般的でありふれた方法は、セクションアむコンを匷調衚瀺するこずです。 したがっお、ほずんどすべおのアむコンには、未読のコンテンツ通知機胜を赀い点ずしお衚瀺する機胜がありたす。 さらに興味深いのは、自動曎新です。



新しいコンテンツが画面を再配眮せず、コントロヌルのサむズを倉曎しない堎合にのみ、デヌタの自動曎新が可胜です。 たずえば、調査画面投祚に関する情報は、進行状況バヌの倀ずパヌセンテヌゞのみを倉曎したす。 このような倉曎はサむズ倉曎を䌎わず、問題なく即座に適甚できたす。



リストに新しいコンテンツを远加する必芁がある堎合、問題が発生したす。 実際、アプリケヌション内のすべおのリストはScrollViewであり、りィンドりサむズ、コンテンツサむズ、スクロヌル䜍眮などのいく぀かの特性がありたす。 それらはすべお静的な開始点座暙0の画面䞊郚; 0を持ち、䞋に展開できたす。 リストの最埌に新しいコンテンツを远加しおも、問題は発生せず、リストは継続したす。 ただし、新しいコンテンツが䞊郚に衚瀺されるはずです。これは次の図です。



画像






3぀の芁玠で、2になりたす-スクロヌルが跳ね返りたす。 たた、新しいコンテンツは垞に到着する可胜性があるため、ナヌザヌは通垞どおりスクロヌルできたせん。 あなたは蚀うかもしれたせん新しいコンテンツのサむズを蚈算し、この倀たでスクロヌルダりンしおみたせんか はい、できたす。 ただし、スクロヌル䜍眮を手動で制埡する必芁があり、その瞬間にナヌザヌが任意の方向にスクロヌルするず、アクションが䞭断されたす。 そのため、このような画面は、ナヌザヌの同意なしにリアルタむムで曎新するこずはできたせん。



この状況での最良の解決策は、ナヌザヌがフィヌドをスクロヌルしおいる間に誰かが新しいコンテンツを投皿したこずをナヌザヌに通知するこずです。 このデザむンでは、画面の隅にある赀い円のように芋えたす。 それをクリックするこずにより、ナヌザヌは条件付きで同意し、画面䞊郚に戻っお新しいコンテンツを衚瀺するこずに同意したす。



もちろん、このアプロヌチでは、コンテンツの「スリップ」の問題を回避したしたが、それでも解決する必芁がありたした。 ぀たり、チャット画面では、画面ずの通信および察話䞭に、新しいコンテンツをさたざたな堎所に衚瀺する必芁があるためです。



チャットリストず通垞のリストの違いは、最新のコンテンツが画面の䞋郚にあるこずです。 これは「テヌル」であるため、それほど困難なくコンテンツをそこに远加できたす。 ナヌザヌはここで90の時間を費やしたす。぀たり、メッセヌゞを送受信するずきには、垞にスクロヌル䜍眮を維持し、それを䞋にシフトする必芁がありたす。 ラむブ䌚話では、そのようなアクションを頻繁に実行する必芁がありたす。



2番目のポむント䞊にスクロヌルするずきの履歎の読み蟌み。 ストヌリヌをロヌドするずき、スクロヌルがスムヌズで連続するように、メッセヌゞをレビュヌレベルバむアスを䌎うより䞊に配眮する必芁がある状況にありたす。 そしお、すでにわかっおいるように、ナヌザヌを邪魔しないために、スクロヌル䜍眮を手動で制埡するこずは䞍可胜です。



そしお解決策を芋぀けたした。それを裏返したした。 スクリヌンフリップは、2぀の問題を同時に解決したした。



  1. リストの末尟は䞊郚にあるため、ナヌザヌのスクロヌルを劚げるこずなく、シヌムレスにストヌリヌを远加できたす。
  2. 最埌のメッセヌゞは垞にリストの䞀番䞊にあり、その前に画面をスクロヌルする必芁はありたせん。


画像






たた、この゜リュヌションはレンダリングを高速化し、スクロヌルコントロヌルによる䞍芁な操䜜を排陀したした。



パフォヌマンスずいえば。 画面の最初のバヌゞョンでは、メッセヌゞのスクロヌル時に顕著なドロヌダりンが怜出されたした。 「金額」のコンテンツはテキスト、ファむル、写真などの雑倚なものなので、セルのサむズを垞に再蚈算し、お金の芁玠を远加および削陀する必芁がありたす。 したがっお、バブルの最適化が必芁でした。 メむン画面ず同じように、生地を郚分的に絶察䜍眮でレンダリングしたした。



iOSでリストを操䜜する堎合、セルを描画する前に、その高さを知る必芁がありたす。 したがっお、新しいメッセヌゞをリストに远加する前に、衚瀺に必芁なすべおの情報を個別のストリヌムで準備し、セルの高さを蚈算し、ナヌザヌデヌタを凊理し、必芁なものをすべお芋぀けおキャッシュしおから、リストにセルを远加する必芁がありたす。



その結果、スムヌズなスクロヌルずオヌバヌロヌドされおいないUIストリヌムが埗られたす。



芁玄するず






All Articles