C# で iOS の Push Notification(プッシュ通知)を送信する方法
C# で iOS の Push Notification(プッシュ通知)を送信する
ここでは、C# を使って、iOS デバイスに Push Notification(プッシュ通知)を送信する方法をご説明します。
iOS の Push Notification(プッシュ通知)を送る準備をする
iOS の Push Notification(プッシュ通知)は次の順番で送られます。
- Provider server から Apple Push Notification service (APNs) にプッシュ通知のリクエストを post する
- Apple Push Notification service (APNs) がユーザーの iOS デバイスにプッシュ通知を送る
- 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()));
}
}
}
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 ファイルに変換する必要はありません。
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(プッシュ通知)を送信する方法をご説明しました。