
2013年でした。 彼らは1ドルで30ルーブルを与え、私は2GISでWindows Phoneで開発する仕事を得ました。 私は2GISアプリケーションの立ち上げに参加しましたが、その頃にはほぼ準備ができていましたが、まもなくマーケットプレイスでユーザーが利用できるようになりました。
このアプリケーションには迷惑な機能が1つありました。それはWebAPIで機能するため、インターネット接続が必要でした。 そのため、ほとんどすぐに、オフラインで作業するためにWPで2GISを教える必要がありました。 そして同時に、他の差し迫った問題を解決します。
すべてを書き換える理由
古いアプリケーションは、最近公開されたという事実にもかかわらず、ユーザーとビジネスの要件に十分に対応していませんでした。 要件は次のようになりました。
高速データ配信
2GISがあなたの街に関する新しい情報を見つけたとします。 この情報をユーザーと共有するために、ここでそのようなアクションを実行しました。
- 彼らはアプリケーションに新しいデータを表示することを教えました。
- すべてテスト済み。
- ストアでアプリケーションの新しいバージョンを公開しました。
- 彼らは都市のデータ更新をリリースしました。
その後、アプリケーションの新しいバージョンをダウンロードし、最終的に最寄りの理髪店でひげをとかすのにかかる費用がわかりました。 データやアプリケーションのバージョン管理、互換性、その他すべての問題について話しているわけではありません。 高速データ配信とは、このプロセスからポイント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フレームワークの選択に関する非常に簡単な説明を紹介しますが、これは究極の真実であるとは主張していません。
- お気に入りのブラウザを開きます。 たとえば、Internet Exporer。
- caliburnmicro.comにアクセスします。
- 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>
いくつかの点に注意する価値があります。
- このテンプレートをアプリケーション側で文字列としてロードし、XamlReader.Load()を使用して解析します。 このことから当然、すべてのXAMLをそのように使用できるわけではありません。 正しいXAMLには、コードビハインド、xへの参照、クラス、イベントサブスクリプションなどを含めないでください。
- DataTemplatesは以前の要件に最適なので、使用します。
- ResourceDictionaryは、いくつかのテンプレートのコンテナとして使用します。
- TestIconアイコンをDataTemplateの形で配布する方法に注目してください。 ContentPresenterを使用して表示します。
- テキストブロックのTextプロパティは、ViewModelのインデクサー(後ほど)にバインドすることにより、一部のデータプロパティにバインドされます。 jsonにはまったく同じ名前の要素があり、これは偶然ではないことに注意してください。
アプリケーション自体にそのようなビューがすでにあるとします。
<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() {
いくつかの点を説明します。
- この例では、 Json.Netを使用してjsonを解析し 、データバインディングに適したオブジェクトを取得しました。 実際、これらの目的にはDynamicDataContextを使用しますが、この例では、簡単にするためにJObjectを使用します。
- JObjectには、文字列(json要素の名前)を取り、この要素の値を返すインデクサーがあります。
- そのため、テンプレートでは、テキストブロックのテキストがインデクサー[データ]にアタッチされ、jsonからデータ要素の値が返されます。 そのため、通常のjsonはテンプレートのビューモデルになります。
この例を収集し、お気に入りのWindows Phone電話で実行すると、この画像を見ることができます。

とても簡単かつ自然に、アプリケーションがまったく知らないデータをアプリケーションに表示しただけです。 そして、アプリケーションもこのデータを表示する方法を知りません-すべての情報は2GISサーバーからダウンロードされます。
まとめ
WP用の実際の2GISを作成しました。3次元マップ、組織の詳細なディレクトリ、クロスプラットフォームコアがあり、アプリケーションに関係なくxamlテンプレートを配布しています。 そして、それはすべてインターネットに接続せずに動作します。 何らかの理由で、まだWindows Phoneスマートフォンに新しい2GISをインストールしていない場合は、それ
を実行します。