しばやん雑記

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

Azure Functions 向けに App Center Push を簡単に扱える拡張を作った

de:code 2019 の準備からの逃避として App Center Push を扱う Azure Functions 向けの拡張を書きました。単に IAsyncCollector<T> を提供して、REST API を呼ぶだけの簡単な実装です。

SignalR Service の実装を調べながら作ったので構造はほぼ同じです。

Azure Functions v1 では Notification Hub 向けの拡張はありましたが、既に Notification Hub は終わってそうな雰囲気が漂ってくるのと、App Center が結構良いと聞いていたので勢いで書きました。

NuGet も適当にビルドして公開しておきました。.NET Core になってからいろいろ楽です。

README にも使い方を簡単に書いてありますが、App Center Push の設定を行っていれば、API Token を作成しておくだけなので難しいことはないです。

App Center Push は Target をいろいろ選択できますが、その辺りはクラスを用意して対応しました。何も指定しなかった場合は全てのデバイスに送信となるので、テストには向いています。

IAsyncCollector<T> を実装しているので、プッシュを送信する際はコレクションに追加する感覚で書けます。この辺りは SignalR Service と同じですね。

public static class Function1
{
    [FunctionName("Function1")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequest req,
        [AppCenterPush(OwnerName = "shibayan", AppName = "AppCenterPushTest")] IAsyncCollector<AppCenterPushMessage> collector,
        ILogger log)
    {
        await collector.AddAsync(new AppCenterPushMessage
        {
            Content = new AppCenterPushContent
            {
                Name = "First Push From App Center",
                Title = "Push From App Center",
                Body = "Hello! Isn't this an amazing notification message?",
                CustomData = new { key1 = "val1", key2 = "val2" }
            }
        });

        return new OkResult();
    }
}

少し悩んだのですが、属性のプロパティとして Owner と AppName を取るようにしています。接続文字列とかあれば省略可にしていたと思いますが、こっちの方が分かりやすいかも。

メッセージ用のクラスは REST API とほぼ合わせているので、ドキュメントを読めばわかるはずです。

API Token は local.settings.jsonAppCenterPushApiToken という名前で追加します。

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "AppCenterPushApiToken": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  }
}

これで App Center Push を Azure Functions から使えるようになります。簡単でしたね。

動作確認用のサンプルアプリは UWP で適当に用意しました。iOS や Android 向けアプリのビルド向け環境が無かったので、割と都合がよかったです。

App Center Push の特徴としてプラットフォームが変わっても API は同じという点があります。UWP の場合は Function を実行すると、同じマシンに通知が飛んでくるので確認も簡単です。

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

送信ログは App Center から確認できます。今回はターゲットを指定しなかったですが、指定した場合は条件も App Center から確認出来るので便利だと思います。

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

App Center Push の REST API は難しくないのでそのまま叩いても良いと思うのですが、Azure Functions 向けの拡張を書きたかったので良い題材でした。

時間があれば JavaScript から呼べるようにしたり、Java 向けのバインディングを作ってみたいと思います。