酢酸先生が通知ハブ使ってて楽しそうだったので、自分も Xamarin.iOS で作ってるアプリ向けに通知ハブを組み込むことにしました。Azure 公式サイトにドキュメントが揃っているので便利です。
Get started with Notification Hubs
ただし、日本語版だとスクリーンショットがおかしくなっているらしいので、英語版を見ながら組み込みました。しかし Xamarin.iOS 向けには Microsoft から公式なライブラリが出ておらず、ソースをダウンロードしてビルドしろと書いてあるのに、そのリンク先が 404 で絶望でした。
なんとかサンプルコードから dll を拾ってきて、アプリに組み込んでみると非情なエラーが出ました。
_人人人人人人人人人人人_
> Unified API 非対応 <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
ソースコードは見つからないし、Unified API だと使えないしで最悪だったのですが、Xamarin Component Store で Azure Messaging というパッケージが公開されていました。
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 向けに通知を送信して確認してみます。
送信ボタンを押してから、送信が完了するまでに少し時間がかかることもありますが、しばらく待つと iOS 側にプッシュ通知が無事に届いたことが確認できました。
来年から 64bit 対応必須の関係で Unified API に移行しておかないと大変らしいので、これからはライブラリ周りの Unified API 対応で悩むことも多くなりそうです。