XamarinずXamarin.Formsはチョコレヌトサボテンです。 パヌト1

゚ルバはモバむルアプリケヌションが倧奜きです。 iOS甚のアプリケヌションを䜜成した経隓があり、Android甚のアプリケヌションを開発しおさらにサポヌトしおいたす 。 今幎もiOS甚のバヌゞョンをリリヌスしたしたが、今回はXamarinずXamarin.Formsに基づいおおり、経隓を共有したいず考えおいたす。 これたでのずころ、iOSのみの開発を怜蚎するこずができたしたが、すでに倚くの印象があり、Androidに぀いお間違いなく蚀う蚀葉がいく぀かありたす。



Xamarinずは



.NET より正確にはMonoの実装に基づくモバむルアプリケヌションのクロスプラットフォヌム開発のフレヌムワヌクは、すべおの䞻芁なオペレヌティングシステムAndroid、iOS、Windows Phoneをサポヌトしおいたす。 詳现に぀いおは、Habréに繰り返し 蚘茉されおいるため、繰り返す必芁はありたせん。



Xamarin.Formsずは



䞊蚘のプラットフォヌムのいく぀かに぀いお、むンタヌフェヌスの単䞀のレむアりトをすぐに開発できるフレヌムワヌク。 アむデアは次のずおりです。Xamarinコンポヌネントに基づいお䞀床レむアりトを行い、タヌゲットプラットフォヌムでは、各コンポヌネントに察しおレンダラヌが呌び出され、既にネむティブなコンポヌネントが描画されたす。 レむアりト自䜓は、コヌドずXAML圢匏の䞡方で準備できたす。 1幎前のような 、結果のむンタヌフェむスのレむアりトずプレビュヌ甚のUIナヌティリティはただないため、コヌドからUIを䜜成するオプションを遞択したした。



なぜXamarin + Xamarin.Formsを遞択したのですか



いく぀かの理由がありたした。



  1. サヌバヌでは.NETずCを䜿甚しおいるため、3぀のアプリケヌションサヌバヌ、iOS、Androidに1぀の蚀語ずプラットフォヌムを䜿甚するのは非垞に䟿利です。ある蚀語から別の蚀語に切り替える必芁はなく、䜿い慣れたパタヌンを䜿甚する機胜があり、ラむブラリ内の共通のフラグメントを簡単に遞択できたす、など.p。
  2. 利甚可胜なフレヌムワヌクの䞭で、Xamarinは最も開発されたものに芋えたした。
  3. HTML5アプリケヌションを䜜成するオプションに぀いおは考慮したせんでした。アプリケヌションで倚くのフォヌムが蚈画され、この点に関するネむティブコンポヌネントは著しく予枬可胜か぀高速に動䜜したす。 特に䜎コストのAndroidスマヌトフォンに適しおいたす。
  4. Xamarin.Formsは、最小限のドップルでAndroidずiOSの共通むンタヌフェむスを䜜成できる可胜性に加え、iOSの䜿い慣れたブロックレむアりトモデルなど、倚くの利点を喜んでいたす。


最初の血



有料版ずの通信の始たりはアクティベヌションシステムの傟斜で始たりたしたXamarin Webサむトの個人アカりントで既に支払い MSDNサブスクラむバヌの堎合は 999 ドルたたは799ドル が衚瀺されおいたしたが、Xamarin.Studioは頑固にアプリケヌションのビルドを拒吊したした。 「有料版はアクティベヌトされおいたせん。」 Xamarinテクニカルサポヌトによる支払いの手動アクティベヌションのみが圹立ちたした。 圌らはすぐに答えたしたが、いずれにせよ、これは玠晎らしいスタヌトであり、その埌のプロゞェクト党䜓のトヌンを蚭定したす。



ずころで、無料詊甚版では、コンパむルされたコヌド甚にサむズが64キロバむトを超えるアプリケヌションをビルドするこずはできたせん。 ぀たり、たずえば、同じjson-serializerNewtonsoftを接続したす。これで、アプリケヌションをビルドできなくなりたす。 いいね



IDEの問題



Xamarinは、 MonoDevelopに基づいお独自のXamarin.Studio IDEを提䟛したす。 残念ながら、このIDEにはいく぀かの問題がありたす。



  1. 䞍安定。 たずえば、アプリケヌションのアセンブリを䞭断しようずするず、固くフリヌズする可胜性が非垞に高くなりたす。
  2. バックラむトを定期的に䞭断するか、オヌトコンプリヌトしたす。
  3. 自動補完は、珟圚のネヌムスペヌスにないクラスを探す方法を知りたせんが、クラスぞの完党に蚘述された呌び出しを䜿甚しお必芁な䜿甚環境を䜜成できたす。
  4. リファクタリングの機䌚は明らかに十分ではありたせん。圌女はこの点でResharperからはほど遠いです。
  5. XIB゚ディタヌiOSのレむアりトファむルずの統合は定期的に䞭断したす。 XIBたたはストヌリヌボヌドを介しおレむアりトを䜿甚する堎合、Xcodeは線集のために開き、閉じるず、UIに関連付けられた自動生成されたクラスが曎新されたす。 しかし、垞にではありたせん。 環境は、原則ずしお、䞀郚たたはすべおのファむルのXcodeの呌び出しを停止する堎合がありたす。 スタゞオのキャッシュをクリアするこずで凊理されたす 〜/ Library / Caches / XamarinStudio-5.0ディレクトリのコンテンツを削陀したす。


しかし、良いニュヌスがありたす ビゞネス料金では、Visual Studioずの統合があり、そこでVisual Studioでコヌドを蚘述できたす。 これは非垞にうたく機胜したす。 たずえば 、いく぀かの問題がありたす。 たずえば 、これたでAndroidやXAMLを䜿甚しおいなかったため、 このような問題は発生しおいたせん。 しかし、圌らは他の人に出くわしたした。



実際のずころ、iOSアプリケヌションを構築するには、Mac OS Xを搭茉したコンピュヌタヌたたは仮想マシンが必芁です。ここには2぀のオプションがありたす。





さらに、統合プラグむンは長い間䞍安定でした。 この状況は定期的に発生したした。3人の開発者が党員、同じバヌゞョンのOS、studio、Xamarinなどを䜿甚しおいたす。 それらは同じケシに順番に接続されたす。 その結果、1぀ではすべおが正垞に機胜し、2぀目ではブレヌクポむントが無芖され、3぀目ではたったく機胜したせん。



テクニカルサポヌトは、MacずWindows甚の最新の4぀のバヌゞョンを詊すようにアドバむスしたした。「おそらくいく぀かの組み合わせが機胜するでしょう。」 むンストヌルには20〜30分かかりたす。 むンストヌラヌは、前回ダりンロヌドしたコンポヌネントAndroid SDKラむブラリヌなどもダりンロヌドしたす。 だず思う...



ただし、プラグむンが正垞に機胜する堎合でも、次にVisual Studioでプロゞェクトを開くず、ネットワヌクが切断されるか、たずえばMacがオフになりたす。プラグむンは、ビルドホストの怜玢でハングする可胜性がありたす。 そしお、システムレゞストリに移動しお、そこにあるビルドホストの保存されたパラメヌタヌを削陀しなければならなかった堎合、「キャンセル」が垞に機胜するずは限りたせん。



したがっお、私たちは次のように長い間働いおいたした。



  1. コヌドは、Macで䜿甚可胜なネットワヌクフォルダヌず、その䞊で実行されおいるParallels Windows仮想マシンにありたす。
  2. ほずんどのコヌドは、この仮想マシン内のWindowsのVisual Studioで蚘述されおいたす。
  3. 最終バヌゞョンのデバッグたたはアセンブリは、Mac OS XのXamarin.Studioで行われたすが、プラグむンではなく、共有フォルダヌの同じコヌドを手動で開きたす。


さお、小さなトラブルからiOSでプロゞェクトを開くたびに、プラグむンはビルドホストぞの接続を提案し、質問に答えるたでプロゞェクトのさらなるロヌドをブロックしたす。



    Enter/Escape  !








幞いなこずに、䜕ヶ月も苊しんだ埌、Xamarinチヌムは私たちに同情したした。 Xamarin.Studioの最新の曎新プログラムはこの問題を解決したした-リモヌトポピヌに接続するためのりィンドりに、「接続りィンドりを衚瀺しない」チェックマヌクが衚瀺されたした。



ああ、それはたた、独自のXamarinナヌティリティではなく、Mac OS Xの通垞のリモヌトナヌザヌを介しお、リモヌトビルドを実行したす。







その結果、接続は非垞に安定し、10のうち8぀のケヌスでデバッグが正垞に開始されたす。しかし、いずれにしおも、シミュレヌタヌは別のPCで実行されたす。 デバッグはマシン䞊にあり、アプリケヌションはそこで実行されおおり、PCに画像は衚瀺されたせん。 リモヌトセッションを開くか、2台目のコンピュヌタヌを同じテヌブルに保持できたす。



゜リュヌションはただややこしいたたですが、Xamarin Studioの䜿甚を完党に攟棄するこずができたす 信じおください、数ヶ月䜏んだ埌、私たちは確かに蚀うこずができたすそれは䟡倀がありたす。



プロファむリングに問題がありたす。 iOSアプリケヌションのXamarin.Profiler  Monoログプロファむラヌの GUIラッパヌは、長い間、䜜成したクラスの名前を衚瀺したせんでした。そのようなネむティブオブゞェクトがプロセッサ時間ずメモリを占有するずいう情報しかありたせんでしたが、䜜成したクラスずそれらを比范する方法は少しではありたせん明らかではありたせん。 これで状況は改善されたした-曞かれたクラスが぀いにリストに登堎したした。



たた、プロファむラヌの䞋では、アプリケヌションの実行が非垞に遅くなり、その結果、起動に割り圓おられた時間内に最初の画面を衚瀺する時間がない堎合があり、iOSはそれを打ち負かしたす。 たた、アプリケヌションが起動した堎合、プロファむラヌの䞋のシミュレヌタヌで䜜業䞭にクラッシュする可胜性がありたす。 匱い蚀い蚳ずしお、プロファむラヌが長い間アルファ版の段階にあり、過去1幎間で少なくずも「安定したベヌタ版」の段階に到達しおいないこずがわかりたす。







クロスプラットフォヌムの問題



次の2぀の方法のいずれかでクロスプラットフォヌムコヌドを蚘述するこずができたす。



  1. 共有プロゞェクト 。 このプロゞェクトのコヌドは、個別のアセンブリにコンパむルされるのではなく、䞀床に耇数のプロゞェクトの䞀郚ずしお自分自身を単玔にむンクルヌドしたす。 䞀皮のsimlinkプロゞェクト。
  2. PCLラむブラリ 。 Portable Class Libraryクロスプラットフォヌムラむブラリ。


理論的には、1぀のこずを遞択するように求められたす。 実際には、これらの方法の䞡方を䜿甚したした。



PCLプロゞェクトでは、デヌタベヌス、ネットワヌクなどず連携しお、すべおのビゞネスロゞックを䜜成したした。 䞻な利点は、PCLがプラットフォヌムの1぀に実装されおいないシステムクラスの䜿甚を蚱可しないこずです。 したがっお、PCL内で蚘述およびアセンブルされたコヌドは、遞択されたすべおのプラットフォヌムで実行されるこずが保蚌されおいたす。



欠点は、PCLラむブラリが、遞択されたすべおのオペレヌティングシステムの機胜の共通郚分に基づいお蚘述されおいるため、それらの1぀に欠けおいるものを䜿甚できないこずです。 ぀たり、iOSずAndroidのみを䜿甚する予定で、䞀郚の必芁な機胜がWindows Phoneにない堎合は䜿甚できたせん。 同時に、サポヌトされるプラットフォヌムを定矩するPCL甚の「プロファむル」のセットがありたすが、執筆時点では、「iOSずAndroidのみ、Windows PhoneずWindowsなし」を遞択するこずは䞍可胜です。







その結果、iOSずAndroidで動䜜するこずが保蚌されおいるが、PCLでビルドできない共有アセンブリコヌドを远加したした。 たずえば、gzipの回答や、ネットワヌクたたはデヌタベヌスでの䜜業に関するその他の詳现がサポヌトされおいたす。



PCLでは、ファむルの操䜜など、些现なこずはないかもしれたせん。 -この堎合、PCLアセンブリにむンタヌフェヌスが存圚し、特定のOSの実装がすでにプロゞェクトにあるず想定されおいたす。 私たちの堎合、これらの実装の䞀郚は、共有アセンブリになりたした。



ずころで、PCLのプロファむルを遞択する堎合は、259のプロファむルを遞択するこずをお勧めしたす 。 利甚可胜なすべおの機胜に最適です。 たずえば、ミュヌテックスやスレッドセヌフな蟞曞を含たない別のものから始めたした-あなたは手で曞くこずができたすが、なぜですか たた、プロファむルの遞択は、Visual StudioではなくXamarin.Studioの方がはるかに䟿利で明確であるこずに泚意しおください。







たず、PCLの別の機胜1぀のPCLラむブラリに応じお異なるプロファむルを持぀別のPCLラむブラリを远加するこずはできたせん。 より正確に蚀えば、远加するこずはできたすが、すべおのプロファむルがすべおのプロファむルに察応するずは限りたせん。 䞀般に、PCLの抂念は䞀般的に䜿甚可胜ですが、特に癜熱を匕き起こす可胜性がありたす。



ネむティブプラットフォヌム機胜ぞのバむンドの問題



Xamarinの基本的な考え方は、ネむティブコヌドを蚘述するずきに䜿甚するのず同じクラス、メ゜ッド、および構造を䜿甚しおコヌドを蚘述できるずいうこずです。これは、Cで蚘述されたばかりです。 しかし、埮劙な違いがありたす...



iOSの堎合、デリゲヌトにはかなり興味深いバグがありたす。 これは、たずえば、 UIScrollViewコンポヌネントです。 特定のむベントを凊理するデリゲヌトを割り圓おるか、これらのむベントを盎接サブスクラむブできたす。



var scrollView = new UIScrollView(); // 1 class UIScrollViewDelegate1: UIScrollViewDelegate { public override void ScrollAnimationEnded(UIScrollView scrollView) { base.ScrollAnimationEnded(scrollView); Debug.WriteLine("Yes, animation ended"); } } scrollView.Delegate = new UIScrollViewDelegate1(); // 2 scrollView.ScrolledToTop += (_, __) => { Debug.WriteLine("Yes, scrolled to top"); }; scrollView.ScrollAnimationEnded += (_, __) => { Debug.WriteLine("Yes, animation ended"); };
      
      





さらに、 ScrollAnimationEndedむベントをサブスクラむブするず、 デリゲヌトは自動的に内郚Xamarinに眮き換えられたす。 たた、 ScrolledToTopむベントのサブスクリプションは倱われたす。 どうやら-問題は䜕ですか むベントずデリゲヌトを1぀のコヌドに混圚させないでください しかし、時には問題の状況がありたす



  1. コンポヌネントには目的のむベントがありたせんが、デリゲヌトに存圚したす。
  2. コンポヌネントでは、いく぀かのハンドラヌを持぀カスタムデリゲヌトをXamarin自䜓によっお既に割り圓おるこずができたす。


たたは、たずえば、Xamarin.iOSでは、クラスは2぀の iOSプロトコルUITableViewDataSourceおよびUITableViewDelegateを眮き換える単䞀クラスUITableViewSourceを䜿甚したす 。 これはわかりにくいかもしれたせん。



メ゜ッドずクラスのシグネチャも時々倉曎され、同じiOSコンストラクタヌfileURLWithPathがCreateFileUrlで Xamarinに倉わりたした。



Androidでも同様の状況が発生したす。元のGONE定数はViewクラスにあり、Xamarinバヌゞョンでは同じ目的で、倀Goneを持぀列挙型ViewStatesがありたす。 他のメ゜ッドや定数にも同様の問題があり、ネむティブプラットフォヌムから切り替えるずきに混乱が生じたす。



プラットフォヌム機胜の抜象化の欠劂



完党な幞犏のために、フレヌムワヌクは特定のOSの機胜の䞀郚を隠したせん。 たずえば、ネットワヌクでのバックグラりンド䜜業



  1. Androidでは、ネットワヌクたたはバックグラりンドネットワヌクサヌビスを操䜜するための新しいスレッドを簡単に䜜成できたす。アプリケヌションが最小化されおいる堎合、たたは電話がロックされおいる堎合、䜜業は停止したせん。
  2. iOSでは、最小化するずアプリケヌションが停止したす。ネットワヌクで䜕かをしたい堎合は、最小化の数分埌に停止するバックグラりンドセヌフタスクなどの別のオプションを䜿甚する必芁がありたす。


あなたは蚀う-これらは特定のプラットフォヌムの単なる機胜ですか たさに。 しかし、開発者の誰もこれらの機胜を抜象化の䞋に隠しおいないので、繰り返したすが、各プラットフォヌムを調査する必芁がありたす 。



サヌドパヌティのコンポヌネントの欠劂



珟時点では、 倚くのコンポヌネントがすでにXamarinで蚘述されおいたすが、iOSおよびAndroidではさらに倚く蚘述されおいたす。 必芁に応じお、理論的にはObject-CたたはJavaで蚘述されたバむナリラむブラリを接続できたすが、ネむティブラむブラリずXamarinアプリケヌション間の通信甚のプロゞェクトバむンディングを蚘述する必芁がありたす。 iOSの堎合、そのようなプロゞェクトを個別に生成できるObjective Sharpieナヌティリティは倧いに圹立ちたすが、垞に100確実に機胜するわけではなく、そのような生成の結果を手䜜業で線集しなければならないこずもありたすし、このラむブラリが必芁かどうかさえ疑問に思うこずがありたす。



さらに、䜜成者は、ラむブラリのネむティブバヌゞョンず比范しお、そのようなコンポヌネントを遅れお曎新するこずがよくありたす。 TestFairyプラグむンがネむティブバヌゞョンよりも数か月遅れおいるずいう状況に盎面したした。 TestFairyの技術サポヌトから尋ねられたずころ、圌らはすべおがうたくいっおいるず答えたした。あなたはいく぀かの小さな機胜を陀いお䜕も倱うこずはありたせん。 しかし、Xamarinの新しいバヌゞョンがリリヌスされたずき、問題が発生したした。このバヌゞョンのXamarinでコンパむルされたこのラむブラリを持぀アプリケヌションは、リアルタむムでクラッシュし始めたした。



結論



フレヌムワヌクの耇雑さを研究した埌、結論はそれ自身を瀺唆しおいたす。





この蚘事ではXamarin.Formsに関するストヌリヌも蚈画したしたが、そのセクションは非垞に拡匵されおいたため、別の蚘事に分けるこずにしたした。 その䞭で、Xamarin.Forms UIフレヌムワヌクのさたざたな問題ずその解決方法に぀いお説明したす。 それたでの間、ブログを気に入っお賌読しおください いいえ、スタンプはどうですか...



曎新する 2番目の郚分ぞのリンク。



All Articles