しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Xamarin.iOS の Unified API で Azure 通知ハブを使ってみた

酢酸先生が通知ハブ使ってて楽しそうだったので、自分も Xamarin.iOS で作ってるアプリ向けに通知ハブを組み込むことにしました。Azure 公式サイトにドキュメントが揃っているので便利です。

Get started with Notification Hubs

ただし、日本語版だとスクリーンショットがおかしくなっているらしいので、英語版を見ながら組み込みました。しかし Xamarin.iOS 向けには Microsoft から公式なライブラリが出ておらず、ソースをダウンロードしてビルドしろと書いてあるのに、そのリンク先が 404 で絶望でした。

なんとかサンプルコードから dll を拾ってきて、アプリに組み込んでみると非情なエラーが出ました。

f:id:shiba-yan:20141204152754p:plain

_人人人人人人人人人人人_
> Unified API 非対応 <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

ソースコードは見つからないし、Unified API だと使えないしで最悪だったのですが、Xamarin Component Store で Azure Messaging というパッケージが公開されていました。

f:id:shiba-yan:20141204150437p:plain

Azure Messaging / Components / Xamarin

Xamarin が出しているパッケージみたいですが、中身は WindowsAzure.Messaging だったので、Azure 公式サイトのドキュメントと同じ書き方で使えます。

なので、デバイストークンを貰う部分のコードもとてもシンプルなままです。

public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
{
    var hub = new SBNotificationHub(ConnectionString, NotificationHubPath);

    hub.RegisterNativeAsync(deviceToken, null, error =>
    {
    });
}

ちなみに iOS 8 からプッシュ通知周りの登録 API が結構変わっていたみたいですが、UIDevice にyouiされている CheckSystemVersion メソッドを使って簡単に処理を切り分けることができました。

public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
{
    if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
    {
        var settings = UIUserNotificationSettings.GetSettingsForTypes(UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound, null);

        UIApplication.SharedApplication.RegisterUserNotificationSettings(settings);
        UIApplication.SharedApplication.RegisterForRemoteNotifications();
    }
    else
    {
        UIApplication.SharedApplication.RegisterForRemoteNotificationTypes(UIUserNotificationType.Alert | UIUserNotificationType.Badge | UIUserNotificationType.Sound);
    }

    return true;
}

この辺りはとても便利ですね。

実際に管理ポータルのデバッグタブから iOS 向けに通知を送信して確認してみます。

f:id:shiba-yan:20141204160852p:plain

送信ボタンを押してから、送信が完了するまでに少し時間がかかることもありますが、しばらく待つと iOS 側にプッシュ通知が無事に届いたことが確認できました。

f:id:shiba-yan:20141204160947p:plain

来年から 64bit 対応必須の関係で Unified API に移行しておかないと大変らしいので、これからはライブラリ周りの Unified API 対応で悩むことも多くなりそうです。