Connect(); 2016

Volume 31 Number 12

Connect(); モバイル DevOps - Visual Studio Mobile Center の調査

Thomas Dohmke; 2016

モバイル デバイスは、テクノロジ エコシステムの中心的な存在になっています。多くのユーザーが、スマートフォン、タブレット、ノート PC がなければ生活できないと感じており、私生活でも業務でもこれらのデバイスを活用して情報を整理しています。ビジネスの世界でもこのような状況に対応し、あらゆる企業がモバイル ビジネスへの転換を図っています。企業が成功を収めて繁栄するには、1 つのモバイル アプリだけではなく、複数のアプリによるモバイル戦略をサポートすることになるでしょう。このような状況は、近代ビジネスのアプリ化と呼ばれています。つまり、ターゲットを絞り、特定のユーザー グループまたは特定のタスクを対象に設計され、高度に最適化されたアプリが増えています。アプリ化される世界では、開発チームはより価値の高いアプリを、より多くユーザーに届けなくてはなりません。一方で、こうしたアプリが実行されるモバイル プラットフォームも進化を続け、デバイスの数も右肩上がりで増加しています。最高のアプリは 10 億台を超えるデバイスにインストールされ、画面サイズ、言語、ロケール、ネットワーク プロバイダーなどの基準に応じて何千ものデバイス構成に対応しています。

このような課題に取り組むために、Microsoft は次に挙げる 3 つの柱に基づいたエンドツーエンドのソリューションを提供します。 1 つは、Visual Studio と Xamarin です。これらは、すべての主要プラットフォームを対象にするモバイル アプリやデスクトップ アプリを作成できるようにします。1 つは、Microsoft Azure です。これは、強力かつ柔軟性のあるクラウド サービスを提供します。このクラウド サービスは利用開始が簡単で、既存のインフラストラクチャ資産を拡張してサーバーとクライアントのエクスペリエンスの間でデータを管理できるようにします。もう 1 つが、モバイル DevOps プロセスです。これは、アプリ ライフサイクルを管理できるようにし、アプリの統合、テスト、配信、および監視を自動化できるようにします。現在のバージョンのモバイル DevOps スタックは、Visual Studio Team Services (VSTS)、Xamarin Test Cloud、および HockeyApp というまったく異質な複数のツールが統合されて構成されています。Microsoft は、この数年間、こうした製品の提供を通じて多くのことを学習しました。たとえば、開発者がモバイル DevOps プラクティスを迅速かつ少ない手間で採用できる方法などです。

今回は、Microsoft 製品のパブリック プレビューを紹介します。あらゆる機能を 1 つのプラットフォームに組み合わせた製品、 それが Visual Studio Mobile Center です。

モバイル アプリのライフサイクル

DevOps プラクティスは、開発プロセス全体に対応しながらも、融通の利かない取り組みではありません。コマンドライン ツールのセットと同様、各プラクティスを単独で利用することもできますが、複数のプラクティスを組み合わせることで、付加価値が生み出されます。まさにそのように設計したのが Mobile Center です。Mobile Center では、開発者向けの優れた新機能から取り掛かりました。その一例が API ファーストの設計です。この設計により、REST API またはコマンドライン インターフェイス (CLI) のみを利用して Mobile Center を使用できます。各機能は特定の問題を解決するもので、単独で使用できます。

Mobile Center Build では、任意の Git リポジトリのソース コードを取得し、コミットまたはプッシュするだけで、毎回インストール可能なアプリ パッケージを自動的に作成できます。何より、iOS アプリを構築するために macOS を実行するエージェントを用意したり、外部コンピューターをプロビジョニングする必要がありません。Mobile Center がこうした問題に対処し、ソース コードから直接 iOS アプリや Android アプリをコンパイルします。開発者が手作業で設定する必要はありません。

ビルド プロセスが完了したら、次は実際のデバイスでテストすることを考えます。Test Cloud には、アプリの動作を検証するために、400 を超える固有のデバイス構成が用意されています。テストは C# (UITest)、Ruby (Calabash)、または Java (Appium) で記述でき、ビルドの成功後に自動的に実行されます。

すべてのテストで問題が発生しなかったら、次はテスト担当者の手元にアプリを届ける必要があります。それを実現するのが Mobile Center Distribute 機能です。配布グループという 1 セットのメールを入力すると、アプリ ストアからアプリをダウンロードするのと同じように、ユーザーが自身のスマートフォンにアプリを直接インストールできるようになります。Mobile Center Build、Mobile Center Test、および Mobile Center Distribute はシームレスに連携するため、コードをコミットするたびに最高水準の検証が実行されます。これらの機能のいずれでも、コードの変更は必要ありません。

次は、アプリに監視を追加します。自動テスト、手動テスト、ユーザー向けのデモ、またはアプリ ストアでの新しいアプリのリリースなど、その形を問わず、アプリの成功には使用状況データと診断データの収集が欠かせません。Mobile Center SDK を追加することで、Crashes 機能を使ってクラッシュを収集し、Analytics を通じて品質の問題を評価して、ユーザーがどこでどのように開発者のアプリを使用しているかを把握できます。最終的には、ユーザーの要求に対応することで、アプリの評価とレビューを改善することができます。

また、Mobile Center SDK はさらに 2 つの機能を有効にします。 それは Identity と Tables です。Identity は、Google、Facebook、Twitter、または Microsoft のアカウントを使ってアプリのユーザーを認証する最も簡単な方法です。Tables では、ネットワークに接続されていない場合でさえ、アプリ データを表示、追加、または変更するためのクラウド ストアを構築できます。

図 1 に、これらの機能を通じてモバイル アプリ ライフサイクルを実現する方法を示しています。

Visual Studio Mobile Center によるモバイル アプリ ライフサイクル
図 1 Visual Studio Mobile Center によるモバイル アプリ ライフサイクル

作業の開始

Mobile Center にサイン アップするのは非常に簡単です。既に HockeyApp アカウントがある場合は、既存のメールとパスワードを使用して両システム間で引き続き作業し、同期することになります。アカウントがない場合は、登録フォームから新しいアカウントを作成できます。ただし、ここでは登録フォームの代わりに最も簡単に開始する手順を説明します。 それは、GitHub に接続する方法です。普段から GitHub を使用しているなら、GitHub のパスワードを入力する必要はありません。図 2 に示す認証ページがすぐに表示されます。アクセス権を承認するだけで、完全に有効化されたアカウントによって Mobile Center ダッシュボードが表示されます。メールの確認やクレジット カードなどの設定手順は必要ありません。

GitHub による Mobile Center へのサイン アップ
図 2 GitHub による Mobile Center へのサイン アップ

アカウントを GitHub に接続したら、最初のビルドまでに必要な手順はわずかです。単純に名前を入力してアプリを作成し、図 3 に示すように、ビルドのメニューから自身の Git リポジトリとブランチを選択します。Mobile Center によってプロジェクトの種類が自動的に検出されるため、ビルドの手順を手動で追加したり構成する必要はありません。背後では、ビルド パイプラインにより仮想マシンがプロビジョニングされ、アプリがコンパイルされて、すべての単体テストが実行されます。その後、配布用にアプリ パッケージに署名されます。

ビルド用 GitHub リポジトリの選択
図 3 ビルド用 GitHub リポジトリの選択

ビルド プロセスが完了したら、ローカル インストール用のアプリ パッケージ ファイルをダウンロードし、Mobile Center Test を使用して実際のデバイス上で自動テストを実行するか、続けて Distribute 機能を利用してアプリをテスト担当者に配布することができます。配布グループの各メンバーは、アプリをインストールするためのメール通知を受信することになります。スマートフォンでメールを開くだけで、ブラウザーからアプリをインストールできます。

SDK の追加

Crashes と Analytics を使用するには、Mobile Center SDK をプロジェクトに追加する必要があります。この SDK は、アプリに必要な機能だけを統合できるモジュール形式のアーキテクチャで設計されています。iOS アプリを例にとって始めてみましょう。まず、次の import ステートメントを AppDelegate.swift ファイルの先頭に追加します。

import MobileCenter
import MobileCenterCrashes
import MobileCenterAnalytics

MobileCenterCore はすべての機能に必要ですが、残りの 2 つは Crashes と Analytics の機能を使わないなら省略できます。次に、didFinishLaunchingWithOptions メソッド内で SDK を開始します。

MSMobileCenter.start("{Your App Secret}", withServics:[MSAnalytics.self,
  MSCrashes.self])

App Secret は、Mobile Center でアプリの管理ページから取得できる GUID です。前述の 4 行を入力する代わりに、アプリの概要ページから単純にコピーすることも可能です (図 4 参照)。

Mobile Center SDK による作業の開始
図 4 Mobile Center SDK による作業の開始

Android でもこの設定は非常に似ています。

import com.microsoft.azure.mobile.MobileCenter;
import com.microsoft.azure.mobile.crashes.Crashes;
import com.microsoft.azure.mobile.analytics.Analytics;
// ...
MobileCenter.start(getApplication(), "{Your App Secret}", Analytics.class,
  Crashes.class);

Crashes モジュールを有効にすることで、SDK は自動的に iOS および Android における未処理の例外と、iOS の低レベルのクラッシュをキャッチするようになります。テスト クラッシュを生成するために、次の行を iOS のボタン ハンドラーに追加します。

MSCrashes.generateTestCrash()

同じ呼び出しは Android でも利用できます。

Crashes.generateTestCrash();

クラッシュ後、SDK はログ ファイルをデバイスのローカル ストレージに保存します。ユーザーがアプリをもう一度開くと、保留中のすべてのクラッシュ ログが Mobile Center のバックエンド ログにポストされ、そこで処理が実行されます。Mobile Center Build 機能を使って iOS アプリをビルドする場合、クラッシュ ログのスタック トレースが自動的にシンボル化されます。つまり、すべてのメモリ アドレスがクラス名とメソッド名、ファイル名、および行番号に変換されます。別のビルド サーバーを使用する場合、または iOS をローカルの Mac でビルドしている場合、まず [Incoming] (受信) メニューに新しいクラッシュ ログが表示されます。次に、一致する dSYM ファイルをアップロードすることで、シンボル化プロセスを開始できます。

Analytics モジュールを有効にすると、SDK によって自動的にセッション、デバイス プロパティ (OS バージョン、モデル、製造元など)、ユーザー プロパティ (言語や地域など) が追跡され、Mobile Center の [Audience] (対象ユーザー) ページに表示されます (図 5 参照)。

Audience (対象ユーザー) ページのモバイル分析
図 5 Audience (対象ユーザー) ページのモバイル分析

iOS 上では次の行を追加することで、独自のカスタム イベントとプロパティを追跡できます。

MSAnalytics.trackEvent("Video clicked",
  withProperties: ["FileName" : "RickRoll.mp4"])

Android の場合は、HashMap でプロパティを指定します。

Map<String,String>properties=new HashMap<String,String>();
properties.put("FileName", "RickRoll.mp4");
Analytics.trackEvent("Video clicked", properties);

製品利用統計情報、クラッシュ、イベント、およびプロパティはすべて匿名で収集されたうえで安全に Azure Cloud に保存され、アプリで集めるデータを完全に制御できます。さらに高いレベルの信頼性を実現するために、Mobile Center SDK は完全なオープン ソースになっており、iOS (/MobileCenter-SDK-iOS)、Android (/MobileCenter-SDK-Android)、および Xamarin (/MobileCenter-SDK-Xamarin) 用の Mobile Center SDK が github.com/Microsoft (英語) で提供されています。ぜひ、ソース コードとファイルのバグを確認し、プル リクエストで支援してください。

バックエンドへの組み込み

最新のモバイル アプリは、その能力を最大限に発揮するために、1 つ以上のオンライン サービスを活用しています。たとえば、複数のデバイス間で To Do リストを同期するため、複数の基幹業務アプリ間でデータを共有するため、またはプレミアム サブスクリプションを購読している認証済みユーザーしか機能を利用できないようにするためなどです。Mobile Center は、Azure App Service と直接統合され、Tables 機能および Identity 機能経由で、これらのシナリオをサポートします。

いずれかのメニュー項目を初めてクリックする場合は、Azure サブスクリプションに接続する必要があります。Azure サブスクリプションをまだ利用していない場合は、https://azure.microsoft.com/ja-jp/services/app-service/mobile/ で Azure に無料でサインアップできます。Azure アカウントが Mobile Center にリンクされたら、Tables 概要ページから直接データ テーブルを作成できます。

例として、TodoItem という名前で To Do アプリ用のテーブルを作成します。iOS アプリからテーブルのデータにアクセスするには、次のように SDK を初期化する必要があります。

let client = MSClient(applicationURLString: "{Your App URL}")
let table = client.tableWithName("TodoItem")

App Secret と同様、App URL は、Mobile Center の構成ページから取得できるアプリの URL と置き換えます。その後、すべての利用可能な項目について、MSTable オブジェクトのクエリを実行できます。

table.readWithCompletion { (result, error) in
  if let err = error {
    print("ERROR ", err)
  } else if let items = result?.items {
    for item in items {
      print("Todo Item: ", item["text"])
    }
  }
}

結果をフィルター処理するには、たとえば、NSPredicate オブジェクトと readWithPredicate メソッドを使用して、不完全な To Do 項目のみを取得できます。

let predicate = NSPredicate(format: "complete == NO")
table.readWithPredicate(predicate) { (result, error) in
  // Handle item
}

新しい項目を挿入するには、NSDictionary オブジェクトと insert メソッドを利用します。

let newItem = ["text": "Write MSDN article", "complete": false]
table.insert(newItem) { (result, error) in
  if let err = error {
    print("ERROR ", err)
  } else if let item = result {
    print("New item ID: ", item["id"])
  }
}

Azure App Service のモバイル バックエンドによって、一意 ID が含まれた、NSDictionary に基づく新しい列が自動的に生成されます。また、独自の ID をキーと値のペアとして NSDictionary に提供することも可能です。insert と同様、update メソッドと delete メソッドを使用すると、いつ To Do 項目を完了して、いつ削除するかなど、データを変更できるようになります。また当然ながら、これらはすべて iOS アプリだけではなく、Mobile Center でサポートされている全プラットフォームで機能します。

これまでに紹介したコードを使用した場合、アプリのユーザー全員が、同じ To Do 項目のリストにアクセスすることになり、さらに広く言えば、すべてのデバイスで同じデータにアクセスすることになります。通常、これは望ましい形ではありません。各ユーザーは、To Do リストを独自に管理することを求めるのが一般的です。そのためには、Identity 機能をアプリに追加します。Mobile Center は次の 5 つの ID プロバイダーを最初からサポートしています。 Azure Active Directory、Facebook、Google、Microsoft アカウント、および Twitter の 5 つです。アプリでは、上記の ID プロバイダーを任意の数だけ使って、ユーザーが好みのアカウントでサインインできるようにすることが可能です。Identity 機能を統合するためのオプションは 2 つあります。

プロバイダー SDK (Facebook SDK など) を使用すると、ユーザーのサインイン先が、アプリが実行されている OS と密接に統合されたエクスペリエンスになります。サインイン プロセスの一環として、アプリは Azure App Service への送信が必要なプロバイダー トークンを取得します。次に、Azure App Service はこのトークンを確認して、新しい App Service トークンと置き換えます。またアプリは、独自に使用するためにプロバイダー トークンを保存できます。一例として、Facebook Graph API にアクセスするために、このプロバイダー トークンを使用できます。

プロバイダー SDK を使用しない場合は、Mobile Center SDK で次のメソッドを使用できます。

client.loginWithProvider("google", controller: self, animated: true) { (user, error) in
  // Load data
}

これによりプロバイダーの Web ビューが開き、ユーザーがサインインできるようになります。プロバイダー トークンはサーバー側で直接処理され、アプリに渡されることはありません。この手順の最後では、Mobile Center SDK によって App Service トークンが取得され、すべてのバックエンド要求にこのトークンが自動的にアタッチされて、アプリのデータに認証ユーザー以外がアクセスできなくなります。

今後の見通し

今回説明した機能はすべて、iOS 開発者と Android 開発者向けのパブリック プレビューとして利用できるようになっています。サインアップは無料で、aka.ms/mobilecenter (英語) から行うことができます。今後数か月間にわたって、Microsoft はさらなる機能と価値を継続的に提供していきます。これには、Windows 開発者のサポート、VSTS との統合、オフライン データ同期などのその他のバックエンド サービスが含まれます。目標は、モバイル アプリとデスクトップ アプリのライフサイクルである、ビルド、テスト、配布、監視、およびクラウドへの接続に必要なものをすべて Mobile Center に揃えることです。チームも筆者も、Microsoft の次世代のモバイル DevOps には大きな期待を寄せており、読者の皆様にもこの開発にご協力いただけることを願っています。


Thomas Dohmke は、2014 年後半にマイクロソフトによって買収された HockeyApp の共同創設者です。Dohmke は Visual Studio Mobile Center のグループ プログラム マネージャーであり、各機能について、製品ビジョンの推進と、プログラム マネージャーのチーム管理を担当しています。連絡先は、メール (thdohmke@microsoft.com、英語のみ) または Twitter (@ashtom、英語) です。