とあるアプリのプッシュ通知の送信プラットフォームには、Azure Mobile Service(Azure モバイルサービス)を使っています。正確には、モバイルサービスを構成するうちのひとつのNotification Hub(通知ハブ)ですね。
iOSとWindows Phone(WinRTアプリ)を使って、プッシュ通知を受ける方法は過去に紹介したことがあります。
- Azure Mobile Services(モバイルサービス)の通知ハブに登録されているiOSデバイスに向けてAPNsを使ってプッシュ通知する - 酢ろぐ!
- Windows PhoneでAzure Mobile ServiceとNotification Hubを利用して2ステップでプッシュ通知機能を実装する #wpdev_jp - 酢ろぐ!
本記事では通知ハブに登録されているデバイス情報を取得する方法を紹介します。
事前準備
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に相当