C# で iOS の Push Notification(プッシュ通知)を送信する方法

C# で iOS の Push Notification(プッシュ通知)を送信する

ここでは、C# を使って、iOS デバイスに Push Notification(プッシュ通知)を送信する方法をご説明します。



iOS の Push Notification(プッシュ通知)を送る準備をする

iOS の Push Notification(プッシュ通知)は次の順番で送られます。

  1. Provider server から Apple Push Notification service (APNs) にプッシュ通知のリクエストを post する
  2. Apple Push Notification service (APNs) がユーザーの iOS デバイスにプッシュ通知を送る
  3. iOS デバイスでプッシュ通知を受信し、表示される

この記事では 1 番の APNs に post する部分のプログラムをご説明します。

Apple Push Notification service (APNs) に Push Notification(プッシュ通知)を送信するには、HTTP/2 と TLS 1.2 以降で接続して Post リクエストを送ります。

Post するのに何を使って実装しても良いですが、ここでは C# を使ってプッシュ通知を送信します。


Push Notification(プッシュ通知)を送信する際には以下のものが必要になります。

  • iOS デバイスのデバイストークン
  • プッシュ通知を受信する iOS アプリの Bundle Identifier
  • Apple Push Notification service 証明書からエクスポートされた p12 ファイルとパスワード

まだ、Apple Push Notification service 証明書の生成・インストールや、プッシュ通知を受信する iOS アプリを生成、デバイストークンの取得をしていない方は「Push Notification(プッシュ通知)を実装する方法」をご参考に、済ませておいてください。


C# を使って Push Notification(プッシュ通知)を送信する

Visual Studio で Consol App を新規作成します。

HTTP/2 で Post しなければならないので、HttpRequestMessage で Verson 2.0 をサポートしている Framework を選択してください。

.NET Framework はサポートしていません。 .NET Core は古いバージョンでなければサポートされています。


C# を使って、iOS デバイスに Push Notification(プッシュ通知)を送信するには、次のようにできます。

using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            var apnsURL = "api.sandbox.push.apple.com:443"; // Development server
            var deviceToken = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
            var certPath = "C:\\Test\\PushTest\\PushTestCertificate.p12";
            var certPassword = "Password";
            var bundleIdentifier = "com.softmoco.PushTest";
            var payload = "{\"aps\":{\"alert\":\"Push Notification Test from C#!!!\",\"sound\":\"default\",\"badge\":1}}";

            var url = string.Format("https://{0}/3/device/{1}", apnsURL, deviceToken);

            var certData = File.ReadAllBytes(certPath);
            var cert = new X509Certificate2(certData, certPassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

            using (var httpHandler = new HttpClientHandler { SslProtocols = SslProtocols.Tls12 })
            {
                httpHandler.ClientCertificates.Add(cert);

                using (var clent = new HttpClient(httpHandler, true))
                {
                    using (var request = new HttpRequestMessage(HttpMethod.Post, url))
                    {
                        request.Version = new Version(2, 0);
                        request.Headers.Add("apns-topic", bundleIdentifier);
                        request.Content = new StringContent(payload);

                        try
                        {
                            using (var result = clent.SendAsync(request).GetAwaiter().GetResult())
                            {
                                var content = result.Content.ReadAsStringAsync().Result;
                                Console.WriteLine(string.Format("StatusCode: {0}, Content: {1}", result.StatusCode, content));
                            }
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(string.Format("Exception 1: {0}", e.ToString()));
                        }
                    }
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(string.Format("Exception 2: {0}", e.ToString()));
        }
    }
}

C# で iOS の Push Notification(プッシュ通知)を送信する方法 1


apnsURL には、Apple Push Notification service (APNs) サーバーの URL を指定します。

post する URL は以下の [APNs サーバの URL]/3/device/[device token] になります。

現在の APNs のサーバの URL は以下の通りです。

  • Development server: api.sandbox.push.apple.com:443
  • Production server: api.push.apple.com:443

deviceToken には「Push Notification(プッシュ通知)を受信する iOS アプリを作る」で取得したデバイストークンを指定します。


certPath には p12 ファイルのファイルパスを、certPassword には p12 ファイルをエクスポートした時に指定したパスワードを指定します。

p12 ファイルは「証明書から p12 ファイルをエクスポートし pem ファイルに変換する」でエクスポートしたものを使います。

この記事の方法で post する場合は、pem ファイルに変換する必要はありません。

C# で iOS の Push Notification(プッシュ通知)を送信する方法 2


bundleIdentifier には、「Xcode で Bundle Identifier を設定する」で設定した Bundle Identifier (com.softmoco.PushTest) を指定します。

プッシュ通知の payload は今回は次のものを送信します。

{
  "aps": {
    "alert": "Push Notification Test from C#!!!",
    "sound": "default",
    "badge": 1
  }
}

コードをざっとご説明します。

19 ~ 20 行目では、p12 ファイルから X509Certificate2 オブジェクトを生成しています。

22 行目では httpClientHandler オブジェクトを SslProtocols.Tls12 を指定して生成しています。

24 行目では、先ほどの X509Certificate2 オブジェクトを httpHandler の ClientCertificates に追加しています

26 行目では、先ほどの httpClientHandler オブジェクトを指定して HttpClient オブジェクトを生成しています。

28 行目では Post メソッドと URLを指定して、HttpRequestMessage オブジェクトを request という名前で生成しています。

30 行目では HTTP/2 を使うように request の Version を 2.0 に指定しています。

31 行目では request の Headers に キー: apns-topic、値: bundleIdentifier を追加します。

32 行目では request の Content に payload から StringContent オブジェクトを生成して代入しています。

36 行目では post リクエストを送信して、結果を取得しています。

38 行目では レスポンスの Content を文字列として取得しています。

39 行目では レスポンスの StatusCode と Content を出力しています。


これを実行すると、次のように PushTest (com.softmoco.PushTest) の iOS アプリをインストールした iPhone で Push Notification(プッシュ通知)を受信できました。

C# で iOS の Push Notification(プッシュ通知)を送信する方法 3

C# で iOS の Push Notification(プッシュ通知)を送信する方法 4


以上、C# で iOS の Push Notification(プッシュ通知)を送信する方法をご説明しました。

© 2024 C# 入門