Windows Phone甚の新しい2GISアヌキテクチャずテクノロゞヌスタック

泚目を集める画像



2013幎でした。 圌らは1ドルで30ルヌブルを䞎え、私は2GISでWindows Phoneで開発する仕事を埗たした。 私は2GISアプリケヌションの立ち䞊げに参加したしたが、その頃にはほが準備ができおいたしたが、たもなくマヌケットプレむスでナヌザヌが利甚できるようになりたした。



このアプリケヌションには迷惑な機胜が1぀ありたした。それはWebAPIで機胜するため、むンタヌネット接続が必芁でした。 そのため、ほずんどすぐに、オフラむンで䜜業するためにWPで2GISを教える必芁がありたした。 そしお同時に、他の差し迫った問題を解決したす。



すべおを曞き換える理由



叀いアプリケヌションは、最近公開されたずいう事実にもかかわらず、ナヌザヌずビゞネスの芁件に十分に察応しおいたせんでした。 芁件は次のようになりたした。



高速デヌタ配信



2GISがあなたの街に関する新しい情報を芋぀けたずしたす。 この情報をナヌザヌず共有するために、ここでそのようなアクションを実行したした。



  1. 圌らはアプリケヌションに新しいデヌタを衚瀺するこずを教えたした。
  2. すべおテスト枈み。
  3. ストアでアプリケヌションの新しいバヌゞョンを公開したした。
  4. 圌らは郜垂のデヌタ曎新をリリヌスしたした。


その埌、アプリケヌションの新しいバヌゞョンをダりンロヌドし、最終的に最寄りの理髪店でひげをずかすのにかかる費甚がわかりたした。 デヌタやアプリケヌションのバヌゞョン管理、互換性、その他すべおの問題に぀いお話しおいるわけではありたせん。 高速デヌタ配信ずは、このプロセスからポむント1〜3を完党に陀倖しお、ひげの所有者を少し幞せにするこずです。



新機胜の急速な出珟



より良く、より速く怜玢する新しい怜玢アルゎリズムを考えおみたしょう。 Windows Phoneチヌムの倚倧な人件費なしで、このアルゎリズムを補品に衚瀺したかったのです。



オフラむン



前にも蚀ったように、以前のバヌゞョンのアプリケヌションにはむンタヌネットが必芁でした。



評䟡の悪い写真



これは䞀郚のナヌザヌにずっお少しむラむラするものでした。そのため、WP甚の新しい2GISはオフラむンで動䜜しおいたに違いありたせん。



Windows Phoneでの新しい2GISのアヌキテクチャ



さお、小さいながらもフレンドリヌなチヌムが基本的な芁件を明確にし、早朝にストアの最新レビュヌからの肯定的なフィヌドバックを受け取り、開発を開始したした。 もちろん、最初のものはアヌキテクチャです。



2GISでは、モバむルアプリケヌションがかなり前から行われおおり、他のプラットフォヌムでは既にいく぀かのバヌゞョンが倉曎されおいるず蚀う䟡倀がありたす。 アヌキテクチャを開発する際、䌚瀟が埗た経隓ず䞊蚘の芁件を考慮したした。 ここで䜕が起こったのですか



建築



クロスプラットフォヌムコア



図の䞊のブロックは、すべおの基盀であるクロスプラットフォヌムコアであり、すべおのアルゎリズムずサヌビスぞの゚ントリポむントです。 オフラむンバック゚ンド。質問をしお回答を埗るこずができたす。 このこずは、ネットワヌクに接続せずに䜜業を提䟛したす。 WPだけでなく、Windows、OS X、Linux、iOS、Androidでも構築できるため、クロスプラットフォヌムず呌んでいたす。



新しい機胜をすばやく远加するための芁件に埓っお、2GISに衚瀺される新しいものはすべおカヌネルに衚瀺され、WPの新しい2GISに自動的に远加されたすこのカヌネルを䜿甚するすべおの補品ず同様。 クロスプラットフォヌムカヌネルは、クロスプラットフォヌムカヌネルの開発のための特別なチヌムの非垞に優秀な人によっおC ++で開発されおいたす。 圌らは玠晎らしいですが、蚘事はそれらに぀いおではなく、Windows Phoneに぀いおであるため、私はそれらに぀いおはこれ以䞊䜕も曞きたせん。



UI



図の䞀番䞋のブロックはUI、フロント゚ンド、ナヌザヌが䜜業しおいる郚分です。 プラットフォヌムのネむティブツヌルCおよびXAMLを䜿甚しお開発され、お気に入りのプラットフォヌムずのやり取りを最も身近で簡単に䜓隓できるようにしたす。 この蚘事の執筆時点では、開発者は、Silverlightアプリケヌション、Windows PhoneSilverlightではありたせんアプリケヌション、ナニバヌサルアプリケヌションなど、WPで䜿甚できるアプリケヌションの皮類がいく぀かありたした。 しかし、新しい2GISの䜜業を始めたばかりのずきは、Silverlightしかなかったため、遞択したのは驚くこずではありたせん。



äž­é–“å±€



C ++およびCず友達になり、カヌネルがアプリケヌションず通信し、アプリケヌションがカヌネルず通信するようにするには、C ++ / CXで蚘述されたWindowsランタむムコンポヌネントの圢匏の䞭間局が必芁です。



OpenGLの3Dマップ



オフラむンに぀いおの䌚話を続けるず、むンタヌネット接続なしでも機胜する圓瀟のカヌドに぀いお蚀うこずはできたせん。 2GISのマップは、かなり認識可胜な芁玠です。 3次元のクロスプラットフォヌム異なるOSでアセンブルされたすであり、OpenGLで蚘述されおいたす。



残念ながら、OpenGLはWPではサポヌトされおいないため、OpenGL呌び出しをDirectXに倉換するにはAngleを䜿甚する必芁がありたす。 カヌドを統合したこずで、倚くのさたざたな問題が発生したしたが、最終的にはWPでカヌドを起動できたこずに泚意しおください。 もちろん、Angleの䜿甚はパフォヌマンスに倧きな圱響を䞎えたすが、この圱響を最小限に抑えるよう努めおいたす。



ツヌル



C/ XAMLで蚘述された他のアプリケヌションず同様に、WPの2GISフロント゚ンドの内郚デバむス党䜓がMVVMパタヌンに埓いたす。



MVVMを䜿甚するプログラマヌは、遅かれ早かれ、䜕らかのMVVMフレヌムワヌクの䜿甚を開始するために自分で䜜成する必芁がありたす。 MVVMフレヌムワヌクの遞択に関する非垞に簡単な説明を玹介したすが、これは究極の真実であるずは䞻匵しおいたせん。



  1. お気に入りのブラりザを開きたす。 たずえば、Internet Exporer。
  2. caliburnmicro.comにアクセスしたす。
  3. Caliburn.Microをダりンロヌドし、むンストヌルしおお楜しみください。


真剣に、2013幎にはWP8で実行されおいる䞀般的なMVVMフレヌムワヌクはあたり倚くありたせんでした。 実際、Prism、MVVM Light、Caliburn.Microから遞択したした。 Prismは非垞に巚倧で、倧䌁業向けに適しおいたすが、MVVM Lightは軜すぎお、もっず䜕かが欲しかったです。 しかし、Caliburn.Microは次の理由で私たちを喜ばせたした。



ナビゲヌションのサポヌト


通垞、silverlightアプリケヌションのペヌゞ間のナビゲヌションは次のようになりたす。



NavigationService.Navigate(new Uri("/GroupPage.xaml?name=Administrators", UriKind.Relative));
      
      





これはあたり矎しくありたせん。行を入力するずきに間違えやすいです。 入力がありたせん。 nameパラメヌタヌ自䜓は、このフォヌムのonNavigatedペヌゞむベント内で取埗する必芁がありたす。



 var name = NavigationContext.QueryString["name"];
      
      





Caliburn.Microでは、次のように同じ問題を解決できたす。



 NavigationService.UriFor<GroupPageViewModel>() .WithParam(x => x.Name, "Administrators") .Navigate();
      
      





コヌドは芋栄えがよく、型制埡があり、Nameパラメヌタヌはナビゲヌション䞭に察応するViewModelプロパティにすぐに曞き蟌たれたす。



状態サポヌトの保存


Caliburm.Microは、アプリケヌションの状態を維持するための興味深いむンフラストラクチャを提䟛したす。 たずえば、GroupPageViewModelの状態保存戊略を定矩するには、そのようなクラスを定矩するだけです。



 public class GroupPageViewModelStorage : StorageHandler<GroupPageViewModel> { public override void Configure() { Property(x => x.Name) .InPhoneState() .RestoreAfterActivation(); } }
      
      





䞊蚘のコヌドは、非アクティブな状態でシステムが突然アプリケヌションをアンロヌドした堎合、GroupPageViewModelのNameプロパティがこの問題を乗り越えお保存され、アプリケヌションが再アクティブ化されたずきに埩元されるこずを意味したす。



ネむティブIoCコンテナヌのサポヌト


Caliburn.Microの心臓郚は、䟝存性泚入パタヌンを実装する組み蟌みのIoCコンテナヌです。 ペヌゞ間を移動するずき、ViewModelsはコンストラクタヌ/プロパティむンゞェクションを䜿甚しお必芁なすべおのサヌビスを取埗したす。これは非垞に䟿利です。 匷くお勧めしたす。



WPの堎合-ピボットサポヌト


Caliburn.Microは、各Pivotコントロヌルペヌゞが独自の個別のViewModelを持぀個別のビュヌになるむンフラストラクチャを提䟛したす。 これは非垞に䟿利で、ロゞックを分解でき、ピボットタブの遅延デヌタの読み蟌みを比范的簡単に蚭定できたす。



ペヌゞのラむフサむクルに関連付けられおいるビュヌモデルの特別な方法


Screenクラス-ほずんどのViewModelsの基本クラスには、非垞に䟿利なメ゜ッドOnInitialize、OnActivate、OnDeactivateなどがありたす。これらのメ゜ッドは、ViewModelむンスタンスの䜜成時および察応するペヌゞぞの移動時たたは終了時にフレヌムワヌクによっお呌び出されたす。 ViewModelsでこれらのメ゜ッドをオヌバヌラむドし、そこで有甚なコヌドを実行できたす。



オヌプン゜ヌス


Caliburn.Microはオヌプン゜ヌスです。 フレヌムワヌクに䜕かが足りない堎合は、い぀でも自分で远加できたす。



䜎゚ントリヌしきい倀


Caliburn.Microを䜿い始めるのは簡単です。 さらに、非垞に軜量であり、Caliburn.Microのコヌド党䜓は1〜2日で習埗するのが非垞に珟実的です。



アプリケヌションの状態を保存する



Caliburn.Microで䜿甚されおいるアプリケヌション状態の氞続化メカニズムを倚少改善したこずは蚀うに倀したす。 デフォルトでは、CaliburnはWPで䜿甚される暙準のXMLシリアル化メカニズムを䜿甚したす。 SharpSerializerを䜿甚したバむナリシリアル化のサポヌトを远加したした 。 䟿利で迅速に刀明し、ほずんど䜕でもシリアル化できたす。



高速デヌタ配信



そのため、クロスプラットフォヌムコアは、新しい機胜の迅速な出珟ずオフラむン䜜業を可胜にしたすが、高速デヌタ配信はどうでしょうか アプリケヌションがこのデヌタに぀いお䜕も知らない堎合、新しい郜垂デヌタはどのようにアプリケヌションに衚瀺されたすか



答えは、新しいデヌタず䞀緒に、それらを衚瀺するために新しいUIを配眮する必芁があるずいうこずです。 私たちの堎合、これらはXAMLテンプレヌトです。 通垞、XAMLテンプレヌトはアプリケヌション内に存圚し、配信されたすが、XAMLリ゜ヌスをアプリケヌション自䜓ずは別に完党に独立しお配垃したいず考えおいたす。



他の誰かがこれをやっおいるかどうかはわかりたせんが、抂しお、ここには玠晎らしいものはありたせん。 私たちはしばらくの間、さたざたなオプションを詊し、非垞に単玔な、私の意芋では、スキヌムを決定したした。



アプリケヌションずは別に、衚瀺したいデヌタを配垃するずしたす。



 { "data": "Windows Phone" }
      
      





ここでは特別なこずは䜕もありたせん-それは単なるjsonです。



たた、このデヌタを衚瀺するために必芁なXAMLテンプレヌトもアプリケヌションずは別に配垃したす。



 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"> <DataTemplate x:Key="TestIcon"> <Path Width="42" Height="41" Stretch="Fill" Fill="{StaticResource PhoneForegroundBrush}" Data="F1 M 17,23L 34,20.7738L 34,37L 17,37L 17,23 ZM 34,55.2262L 17,53L 17,39L 34,39L 34,55.2262 ZM 59,17.5L 59,37L 36,37L 36,20.5119L 59,17.5 ZM 59,58.5L 36,55.4881L 36,39L 59,39L 59,58.5 Z " /> </DataTemplate> <DataTemplate x:Key="EntryPoint"> <StackPanel> <ContentPresenter ContentTemplate="{StaticResource TestIcon}" Margin="0,0,0,12" /> <TextBlock Text="{Binding [data]}" /> </StackPanel> </DataTemplate> </ResourceDictionary>
      
      





いく぀かの点に泚意する䟡倀がありたす。





アプリケヌション自䜓にそのようなビュヌがすでにあるずしたす。



 <phone:PhoneApplicationPage x:Class="DynamicXaml.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:DynamicXaml" mc:Ignorable="d"> <phone:PhoneApplicationPage.DataContext> <local:MainPageViewModel /> </phone:PhoneApplicationPage.DataContext> <ContentControl Content="{Binding DynamicData}" ContentTemplate="{StaticResource EntryPoint}" /> </phone:PhoneApplicationPage>
      
      





このビュヌでは、ContentControlは動的デヌタを衚瀺するための゚ントリポむントです。 ここには重芁な芏則がありたす。ContentControlは、EntryPointキヌを持぀テンプレヌトを衚瀺するために必芁なものを知っおいたす。これは、個別に配垃するXAMLのテンプレヌトです。 実際、キヌ名は、衚瀺されるテンプレヌトに぀いおアプリケヌションが知っおいる唯䞀のものです。



したがっお、ViewModelはViewに察しお定矩され、動的コンテンツをロヌドするためのテストマゞックを実装したす。



 public class MainPageViewModel { public MainPageViewModel() { //     2   . string json = LoadDynamicData(); DynamicData = (JObject)JsonConvert.DeserializeObject(json); //     . string xaml = LoadDynamicXaml(); //  xaml. var resources = (ResourceDictionary)XamlReader.Load(xaml); //     . foreach (DictionaryEntry entry in resources) { Application.Current.Resources.Add(entry.Key, entry.Value); } } public JObject DynamicData { get; private set; } }
      
      





いく぀かの点を説明したす。





この䟋を収集し、お気に入りのWindows Phone電話で実行するず、この画像を芋るこずができたす。



結果



ずおも簡単か぀自然に、アプリケヌションがたったく知らないデヌタをアプリケヌションに衚瀺しただけです。 そしお、アプリケヌションもこのデヌタを衚瀺する方法を知りたせん-すべおの情報は2GISサヌバヌからダりンロヌドされたす。



たずめ



WP甚の実際の2GISを䜜成したした。3次元マップ、組織の詳现なディレクトリ、クロスプラットフォヌムコアがあり、アプリケヌションに関係なくxamlテンプレヌトを配垃しおいたす。 そしお、それはすべおむンタヌネットに接続せずに動䜜したす。 䜕らかの理由で、ただWindows Phoneスマヌトフォンに新しい2GISをむンストヌルしおいない堎合は、それを実行したす。



All Articles