酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Azure Mobile Services(Azureモバイルサービス)の通知ハブに登録されているデバイス情報を取得する

とあるアプリのプッシュ通知の送信プラットフォームには、Azure Mobile Service(Azure モバイルサービス)を使っています。正確には、モバイルサービスを構成するうちのひとつのNotification Hub(通知ハブ)ですね。

iOSとWindows Phone(WinRTアプリ)を使って、プッシュ通知を受ける方法は過去に紹介したことがあります。

本記事では通知ハブに登録されているデバイス情報を取得する方法を紹介します。

事前準備

NuGet経由でMicrosoft Azure Service Busをインストールしておいてください。

通知ハブに登録されているすべてのデバイスを取得する

通知ハブにおける操作をおこなうには、NotificationHubClientクラスを使用します。

NotificationHubClientクラスのインスタンスを生成するには、接続文字列と通知ハブ名、そして環境がテスト環境であるか*1どうかを指定します。

// 接続文字列
var connnectionString = "Endpoint=sb://example-ns.servicebus.windows.net/;SharedAccessKeyName=DefaultFullSharedAccessSignature;SharedAccessKey=<your key>";

// ハブ名
var hubName = "<your hub name>";

// テスト送信か?
// Production(本番)にプッシュ通知を送信する場合は false
// Development(開発)にプッシュ通知を送信する場合は true
var enableTestSend = false;

// 接続文字列からNotificationHubClientオブジェクトを生成する
var hubClient = NotificationHubClient.CreateClientFromConnectionString(
    connnectionString, hubName, enableTestSend);

// 登録されているすべてのデバイスを取得する
var allRegistrations = await client.GetAllRegistrationsAsync(0);

上記のコードを実行してみると分かるのですが、デバイス情報は100件ずつしか取り出すことができません。

100件以降のデバイス情報を取得する場合にはContinuationTokenを指定して、続きからデバイス情報を取得する必要があります。100件ずつの取得を続けてContinuationTokenがnullを返すまで取得し続けることで登録されているデバイス情報を全件取得することが可能です。

つまり処理としては以下のようになります。

var devices = new List<RegistrationDescription>();

var token = default(string);
do {
    // 登録されているすべてのデバイスを取得する(実際には100件)
    var reg = await hubClient.GetAllRegistrationsAsync(token, 0);
    token = reg.ContinuationToken;

    devices.AddRange(reg);
} while (token != null);

通知ハブに登録されているiOSデバイスを取得する

通知ハブに登録されているデバイスのうち、iOSデバイスのみを取得しましょう。

登録されているデバイスがiOSデバイスかどうかを判別するにはオブジェクトがAppleRegistrationDescriptionクラスであるかどうかを調べます。

var devices = new List<RegistrationDescription>();

var token = default(string);
do {
    // 登録されているすべてのデバイスを取得する(実際には100件)
    var reg = await hubClient.GetAllRegistrationsAsync(token, 0);
    token = reg.ContinuationToken;

    // 取得した中からAppleデバイスのみを取得する
    devices.AddRange(reg.Where(r => r is AppleRegistrationDescription));
} while (token != null);

Android(Google)の場合はGcmRegistrationDescription、Amazonの場合はAdmRegistrationDescription、Windowsの場合はWindowsRegistrationDescriptionを指定すればよいと思います。

特定のタグを付与されているデバイス情報を取得する

タグに紐付いているデバイス情報を取得するにはGetRegistrationsByTagAsyncメソッドを使うことができます。

var tag = "userid:ch3cooh";

var count = 0;

var token = default(string);
do {
    // 通知ハブから取得する
    var reg = await hubClient.GetRegistrationsByTagAsync(tag, token, 0);

    token = reg.ContinuationToken;

    // 登録デバイス数を加算する
    count += reg.Count();

} while (token != null);

*1:iOSでいうところのProductionとDevelopmentに相当