未熟学生エンジニアのブログ

TetsuFeの個人開発ブログ

TetsuFeはテツエフイー と読みます。FlutterやWeb周り全般、チーム開発について語るブログ

iPhoneがプッシュ通知を受け取る仕組み

IP通信の基本

Webサーバをインターネット上に公開する際、サーバに固定IPアドレスを割り当てる必要があります。

クライアントはそのIPアドレスを頼りにインターネット上につながったルータをたどり、そのWebサーバにいき着くことになるからです。

参考: https://www.vwnet.jp/Windows/Network/WhatIsNetwork.htm

疑問

しかし、プッシュ通知の場合はどうか?

こちらは逆に サーバからモバイル端末(iPhoneなど)へ通知(=情報)を送っているように見えますが、モバイル端末側には固定IPなど割り振られていないことが一般的なはず。ではどうやってモバイル端末に情報を送ることができるのだろうか?

そんなふうにふと疑問に思ったので調べてみました。

調査

iPhoneなどのiOS端末の場合は、APNs(Apple Push Notificaction Service)というAppleが提供するサービスを介して、アプリ開発者が端末にpush通知を送ることができます。

AppleのAPNs解説記事に、以下のような記述がありました。

On initial launch of your app on a user’s device, the system automatically establishes an accredited, encrypted, and persistent IP connection between your app and APNs. This connection allows your app to perform setup to enable it to receive notifications, as explained in Configuring Remote Notification Support.

意訳:ユーザのデバイス上の(あなたが開発した)アプリの最初の起動時、永続的なIPコネクションがアプリとAPNsの間で確立されます。このコネクションがpush通知をアプリが受け取るためのセットアップを(可能に)します。

ということだそう。

おそらく、persistent(永続的な)ということなので、 アプリを一度起動してからは基本的にずっと端末上のアプリとAPNsがコネクションを貼り続けている のでしょう(端末がインターネットにつながる状態になるたびに繋ぎ直すなどして)。

この時のコネクションは端末側からリクエストを送り、固定IPに紐づいたAPNsサーバにつないでいるのでしょう。そして、コネクションが一度張れる状態になってしまえばサーバからも通知を送ることができる。 そういうことだと思います。間違っていたら教えてください。

補足

ちなみにApple公式ではありませんが、日本語の記事もありました。

https://www.bizmobile.co.jp/tech_mdm_02.php?id=3564

こちらではよりAPNsだけでなくGCM(Google Cloud Messaging)の説明もされていました。