プッシュ通知が届かない状況に陥ったのでレポートがてら記録に残しておく。
状況はSIM無しのWiFiのみの運用になったiPhone5SをVoIP専用機として使用し始めたことから始まった。もともとMNO-SIM有りで使用しておりVoIPアプリ(CallKit非対応)もプッシュ通知が届いていた。WiFiのみの運用にしてからプッシュ通知によるVoIP着信がうまく出来なくなった感じがある。
調査環境
fig.1
iPhoneとWAN側の通信をキャプチャするために今回はfig.1のようなネットワークを構成した。
まずiPhoneのネットワークトラフィックをSeverに集約すべくiPhone-Server間をOpenVPNのトンネルで接続する。そしてServer上のOpenVPNインタフェースに対してtcpdumpを行うことでネットワークトラフィックのキャプチャを行う。
ICMPを送りつつキャプチャ
ServerよりiPhoneへICMPを1秒おきにVPN経由で送出し、1時間ほどVPN上のパケットをキャプチャした。このときiPhoneはホーム画面を表示した状態であり、バックグラウンドに置かれているアプリは無い。
1 2 3 4 5 6 7 8 9 |
root@server:~# time tcpdump -i tun0 -w sleep1.pcap tcpdump: listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes ^C8295 packets captured 8296 packets received by filter 0 packets dropped by kernel real 69m51.483s user 0m0.460s sys 0m0.440s |
パケットキャプチャを開始して約80秒後にiPhoneはスリープ状態になった。画面上ではパケットキャプチャ中のプッシュ通知は発生していない。
パケットのキャプチャ内容より通信の概略をfig.2に示す。
fig.2
ICMPで応答していない箇所がある。iPhoneのスリープ後は基本的にICMPの応答がなくなる。おおよそ12〜15分周期で25秒ほどICMPの応答がある。この12〜15分間隔とはiPhoneのメールフェッチ間隔の15分とほぼ一致し、IMAPでの通信も同タイミングで発生している。また、Appleのサーバーともこの約15分間隔で通信していることがわかる。
ICMPの応答なし状態のときにプッシュ通知は届くのか
今度はプッシュ配信が発生する時のパケットをキャプチャしてみる。さきほどの状態に加えICMPの応答がない時にVoIPアプリにプッシュ配信がされるようにVoIPアプリの番号へ電話をかける。
fig.3
結果としてICMPの応答がない時にはiPhoneまでプッッシュ配信が届くことは無いようだ。しかしながらプッシュ配信と思しき通信がServerまでは届いている。また15分おきのメールフェッチのタイミングで画面上に着信のプッシュ通知が表示された。
このことからICMP応答があるタイミングではプッシュ通知が配信されることが推測できる。しかしICMP応答が現状ではメールフェッチのタイミングしかない。このままだとメールフェッチのタイミングでしかプッシュ通知を受けとれないままである。
調査まとめ
今回の調査でプッシュ通知によるVoIP着信ができるタイミングが判明した。現状VoIP着信に限らずプッシュ通知が受け取れるのは約15分に1回であること。
次回「iphoneでプッシュ通知が届かない-実験編 」ではメールフェッチ以外のタイミングでもプッシュ通知できるように出来ないか実験をしてみることにします。