みなさま、こんにちは。
最近はいろいろなアプリにプッシュ通知という便利な呼び出し機能が付いてます。プッシュ通知とは、相手が「今すぐ呼び出したい」「すぐに連絡したい」といった時、ケータイ電話であればドコモやソフトバンク、AUなどの電波網(キャリア)によってシグナルが送られ、呼び出し音いわゆる「着ベル」が鳴るわけですが、これをアプリの起動に利用する、便利なアプリ起動ツール(組込み機能)です。
しかし、呼び出しベルとは違って、アプリが複雑な要素で構成されているため、なかなか「鳴らない」といった問題に直面します。私もハマった方で、そもそもなぜならないのかよく調べもせず、また解説ページでも詳しくは載っておらず、体験ばかりのレポートが多くなってしまいました。
・・・・そっか!いろいろなアプリを開発したことがある現役プログラマーさんに相談すればいいのか!
さっそくプッシュ通知の初心者でも出来る解決策について、山形県は鶴岡の駅前でパソコンショップ「コスモス」を経営している、コミュネスやめるぱーくの創設者でもある現役プログラマー&ハード修理、またマザーボードやパソコン設計も手掛ける須藤総研の代表パソコンドクターに聞いてきました。みなさんの解決の支援のために、回答についてはブログ掲載許可も取ってあります。
そもそも、プッシュ通知のメカニズムって?
基本的にプッシュ通知はキャリアー(ドコモ、ソフバ、AU)によって最初のシグナルが提供され、そこまでは基本動作原理としてはとてもよく着ベルと似た構成であると思って良いそうです。厳密には細かな点では違いますが、大枠では概念イメージは同じだそうです。
APPプッシュ通知は、このようにキャリアからシグナルが送られ、同時にWIFIないしLTE-4Gや3Gで、実際にプッシュ通知の再確認のためアプリが初動コンタクトを行う、ということでした。つまり、ここでアプリが1回目は起動ないし常駐してプッシュ通知について、アプリの設定でプッシュ通知がWIFI利用であればWIFIを優先し、そうでなければ3Gや4Gを優先することになるそうです。
ふむふむ、なんかわかってきた!
このため、いつもWIFIをオフにして、4Gや3Gの「キャリア」だけを使っている人は、ほとんど問題なく90%以上は確実にプッシュが鳴っている、ということでした。
そして、何よりもプッシュ通知を止めてくれる原因のひとつが特にiphoneであれば標準メールソフトのメモリー常駐にある、ということだそうです。たくさんのアカウントをメールで登録している場合が該当するそうですが、せっかくのプッシュ通知のシグナルが届いていても、メールアプリが先に処理をしてしまい、いくつもメールアカウントを入れていたり、メールサーバーのプッシュ処理の遅延などによって「プッシュ処理が端末側でタイムアウト」してしまい、アプリのプッシュシグナルが共倒れしてしまうケースがiphoneのAPPプッシュ通知のトラブルでよく見られる原因と、パソコンドクターのiphone修理相談でよくある事例ということでした。
基本は、常駐メモリーからメールソフトの常駐プロセスを削除する!
これをやっておかないと、いろいろと問題の切り分けができません。
さて、この前提を終えたら、次のステップにすすみましょう。
まず、ケース1として、WIFIを常用しているか、それとも4Gや3Gといったキャリアだけしか使っていないか、という点でチェックが必要ということのようです。
キャリアしか使っていないのであれば、ほぼ確実にプッシュ通知が鳴る、ということですが、それでも鳴らない、という場合は、節電アプリやメモリ改善アプリなどがキャリアとの通信を休止させてしまっていることがケース1での多くの原因だそうです。(ケース1とは、WIFIを常用しないケースとして説明しています)
その場合は、まずはすべての常駐アプリを削除した上で、本体をリセットして再起動させて、プッシュ呼び出し通知を確認すると良いそうです。
つまり、WIFIを使わない人であれば、ほとんど問題なくプッシュ通知は成功している、と言えるわけです。(もっとも、本体側でプッシュ禁止や停止にしていないことが前提なのは言うまでもありません)
それでも、ケース1なのに、鳴らないよ、というケースもあるそうです。その場合は、プッシュ通知の「遅延」によるサーバーの応答速度にも原因がある、というケースです。これについては、過去に、IPフォンにおける呼び出しまでの時間についてブログにまとめたので参考にしてみてください。
IPフォンのプッシュが鳴るまでの時間
http://blog.communes.jp/honoka/entry/954
要するに、アプリのプッシュ通知は、着信まで1秒~60秒までの開きがあり、サーバーの調子によって、すぐに届くこともあれば、1分くらい待たされることもある、ということです。
つまり、1回だけIPフォンで電話をプッシュ通知でならしても、60秒以上は鳴らし続けないと「受けてもらえない(プッシュの着ベルが鳴らない)」ので、そこをプッシュ通知2014年現在は考慮しなければならい、ということでした。
メールや災害情報などのプッシュであれば、まあ、1分くらいで鳴れば早い!と感じるものですが、いざ電話では「1分以内にも出てくれないと「長い!遅い!」と感じるものです。それだけの話ということでファイナルアンサーのようです。(未来技術に期待しましょう)
3分くらい様子を見れば、たいていの場合、ケース1であれば99%以上プッシュ通知が鳴っている、ということです。1分以内でプッシュ通知でベルが鳴る、ということは、まあ良くても50%、、、体感では10%といったところのようです。
つまり、IPフォンなどのプッシュ通知は、1分以上は鳴らせ!ということが暗黙のルールと考えておくと、精神的に楽になるみたいですね。また、激安SIMいわゆる低速SIMカードサービスの場合もプッシュ通知は若干遅れ気味になるということで、低速SIMを使っている場合は更に2分待ち、3分待ち、を頭にいれておくと(ケース1の場合)
さて、ケース1があればケース2もあります。
つまり、WIFIを常用する人の場合・・・・これをケース2とします。この場合がクセモノで、私もハマったクチでした・・・・ つまり、充電モニタリングアプリを使って充電してたりする場合はプッシュはよく鳴るのですが、バッテリーで待機モードではプッシュはほとんど鳴らなくなります。
これもパソコンドクターがずばり回答してくれました!納得!
充電モニタリングのアプリを起動した状態であれば、WIFIは接続した状態になっている、もっとも、充電アプリに限らず、なんでもアプリを起動した状態であれば、WIFIは繋がっているので、プッシュ確認のWIFI経由のチェックがスムーズに処理されているということです。しかし、バッテリーで待機モードであれば、いわゆる「ケース2」の問題が如実に浮上するわけです。
ケース2の問題とは?!(WIFIをよく使うケース)
バッテリー待機モードでは、WIFIは切れている!なんと目からウロコの落とし穴。つまり、ケース1のようにキャリアシグナルによってプッシュ通知は来ているにもかかわず、WIFI常用の場合は、プッシュサーバに再確認する際に端末からサーバーへWIFIを経由してチェックしにいくことでハンドシェイク(接続成立)となって、はじめてプッシュ対応APPが起動処理を始めることでIPフォンなら呼び出しベルが鳴る、といった動作になるわけですが、WIFI常用している人の場合は、バッテリー駆動で放置した状態では、待機モードではWIFIとの接続は「切断されている状態」なので、キャリアプッシュ通知だけではハンドシェイクが成立しないためプッシュ通知が鳴らないまま停止する。
なんと・・・まあ・・・ でも、頭のてっぺんからストンと納得
なるほど、だから充電中ならプッシュは鳴るのに、バッテリー待機だとプッシュが鳴らない・・・外にいるときはプッシュは良く鳴るのに、部屋に戻ってWIFI環境になると、とたんにピタリとプッシュ通知が鳴らなくなる・・・何かアプリを動かしているときはうるさいくらいプッシュが鳴りまくるのに・・・バッテリーで待機モードではピタリと止まる・・・
なるほど、自分の中のもやもやがすべて晴れました!
結局、どうすればいいのか、パソコンドクターに聞いたところ
1、メールアプリを常駐メモリーから消しましょう(手間でも確実に!)
2、節電アプリはすべてアンインストールしましょう(必ず!)
3、WIFIで待機せず、4Gや3Gで待機しましょう!
この3つがポイントのようです。メールアプリを常駐から外しても、メールのプッシュは届くので問題ないそうです。私もこれに設定を変えたところ、かなりの高確率でプッシュ通知による呼びベルが鳴るようになりました。
iphoneは標準のメールソフトがかなり問題でプッシュ信号は先にコイツが処理し、自分のプッシュじゃなかったと判断してから次のAPPにシグナルを渡すロジックですが、その際、メールチェックが行われてからプッシュシグナルが次に引き渡されるため、メールサーバーの応答が重いだけでも、他のアプリのプッシュ通知に影響が出るそうです。
そういえば、iphoneのメール設定(メール/連絡先/カレンダー)の「データの取得方法」のところをじっくり見てみると、「プッシュがオフの場合、またはプッシュに未対応のAppの場合には~」と、プッシュに未対応のメールサーバーの場合ではなく「Appの場合」とありますね。なるほど、こういう意味だったのですね。
つまり、プッシュ対応のすべてのAppに対して、メールのプッシュ通知も、メールもAppのひとつだから影響が出るんだよ、という意味であり、実際にプログラム内部もそのように処理されているということでした。
ここでの設定で、すべてのAppのプッシュのON/OFFに影響し、特に標準メールアプリが先にプッシュシグナルを処理し、それが終わってから他のアプリにプッシュを回していく「通知」の優先度でプッシュの引き渡し順が決まる。
このとき、常駐でメールアプリをメモリーに展開していると、メールサーバーの応答スピードによってはタイムアウトを起こしたりしやすくなり、他のAppが要求しているプッシュのタイムアウトを超えてしまって、メールアプリがプッシュ通知シグナルを消滅させてしまうケースがある。メールソフトも、実際にはメールボディまでは受信しないでヘッダーだけチェックして通知に着信数を示すだけなので、その処理が完全でなければプッシュシグナルがタイムアウトしてしまう。そのスリップダウンが、他のプッシュ対応アプリにも影響を生じさせてしまうため、メールアプリは常駐メモリーから常に消しておくことがベストである、ということでした。
プッシュ通知したいアプリだけ常駐メモリに入れておくと良い
わかりやすい説明ではこちらですね。メールは自動チェックするので、メモリに展開しておかなくてもいいので、メモリから削除しておいても、自動的にメールのプッシュ通知で受信されるので問題ないそうです。
ややこしかったかもしれませんが、こんな感じで、けっこういい感じにLaLaCallがほぼ100%近く一発で10秒以内にプッシュ通知で電話が鳴るようになりました。(メールアプリをメモリからこまめに消す、WIFIではなく4Gや3Gで常に使うようにする、というところがミソですね)
あと、これらの基本設定を徹底させた上で、WIFIから3Gや4Gに切り替えた場合は何らかのネットワークシグナルを流さないとプッシュ処理が切り替わらないそうですから、WIFI常用の場合はWIFIをオフにしたら、メールチェックでもLaLaCallなどのIPフォンでもいいので、ネットワークに接続できるアプリを立ち上げて、これを閉じるようにすると良いそうです。
脱獄しているのであれば、それを疑似プッシュしてくれる無料アプリがCYDIAより提供されていますのでご紹介させて頂きます。作者 Ollie Kett氏による「PushMod」というアプリで、リポジトリは標準リポに登録されているapi.modmyi.comです。
これをインストールした後に「メール/連絡先/カレンダー」よりデータの取得方法にすすむと「フェッチ」の欄に Every 1 Min~など、いままで15分までしか設定できなかったサイクルが1分、3分、5分といった周期でチェックできるようになります。
これをインストールしておけば、WIFIをオフにしたら、メールアプリの常駐メモリを解除さえすれば、あとは指定された時間に疑似プッシュ(高速フェッチ)が回るので、勝手に1分後(指定時間後)にネットワーク接続されるので、プッシュ通知の電話を取り損ねる心配が減るわけです。ただし、本当にメールチェックしに行ってくれますから、待機中でも高速周期でメール受信処理が行わるようになるのでバッテリーもどんどん減ります。プッシュが良くなるようになるのですが、運用は上手に!と、いったところですね。 私の場合は、5分周期にしておきました。1分周期よりは5分周期なので5倍はバッテリーが長持ち?!かな?と・・・
受信するアカウントが多いと、「標準メールアプリ」が、他のプッシュ通知シグナルまで呼び出しを止めてしまっている、というのは盲点でしたね。
あと、メールアプリを止めるのはメンドクサイ、という人には、次のように「メール/連絡先/カレンダー」を設定しても良いそうです。
メール/連絡先/カレンダー設定 ⇒ データの取得方法 ⇒ プッシュ オフ
こうしておけば、IPフォンなどのApp宛のプッシュ通知が別動で確実にシグナルが伝達できるようになり、メールアプリにシグナルが食い潰されてしまう問題は無くなります。もっとも、メールがプッシュではなくなります。それでも、ここおオフにしても、プッシュ対応アプリのプッシュ通知機能は有効なので大丈夫です。あくまでも、メール設定にあるプッシュは、メールアプリだけにしか意味が無いので大丈夫です。
また、このように「メールのプッシュ機能」を停止しておくだけで、WIFIをよく使う環境でもプッシュ通知が鳴るようになります。メールアプリが優先してプッシュ再確認のWIFI接続を行う処理が入ってしまうのを、以下のようにメールのプッシュをオフにするだけで解決できるわけです。通常のプッシュ対応アプリは、キャリアからのプッシュ通知を受ければ「呼びベル」「着うた」なり勝手に鳴るだけですから、メールアプリによるメール受信処理で、せっかくのプッシュシグナルが消滅するトラブルが軽減します。
つまりこの設定であれば、WIFIをよく使うケース2でも、WIFIを停止したりメールアプリをメモリから解除しなくても、IPフォンやLINEなどのプッシュ通知がよく鳴るようになります!(ただし、メールはプッシュではなくなりますので、以下のようなPushModなどによって受信チェック周期を高めて疑似プッシュ化してやらないとメールのインターバルが遅れます)
もっとも、WIFIはそれでもサーバーセンターとの問い合わせにおいて、バッテリーで待機状態ではWIFIに繋がらないので、あまり安定しないので、やはり3Gや4Gで使うことがプッシュ通知アプリにはベストな環境と言えるようです。
更に画面の下に下げて「詳細」からメール個別のプッシュ/フェッチの設定で、すべてのプッシュを「フェッチ」に切り替えておくことが大切です。プッシュでなければ自動的にフェッチになるような説明がありますが、そこがプッシュ通知干渉エラーの原因のひとつとなっていると言われています。(ここ盲点の穴=手動ですべてメールはプッシュを使わずに「フェッチ」にする必要がある。干渉防止)
<<ベスト設定まとめ>>
1、WIFIは使わない
2、データ取得方法でメールのプッシュはオフにする
3、メール設定で個別にプッシュ対応アカウントを「フェッチ」にする
(これによってメールアプリを常駐メモリからクリアする手間が減る)
メール受信がプッシュではなくなるので、必要に応じてCydiaのPushModなどによって受信タイミングを高速化させる。(疑似プッシュ化)ただしメールだけでよい。
ただし、メールの受信確認処理が行われると、APPのプッシュ通知に大影響がかかるため、ベストチョイスでは、メール設定をすべて削除してしまうことが望ましい。(つまり、インターネット電子メールを一切使わないIP電話専用スマホ・・・この状態に仕上げてセットアップしておくと、APPプッシュ通知がかなりの高確率で安定して動作するようになるそうです。iOS4.5.6.7共通)
また、メールのプッシュ通知をONでも、メール受信のアカウント数が少なければプッシュ通知は早期に応答してくれるようになります。iCloudメールを1個だけ登録して、それをプッシュで使う、というのがベストです。逆に、プッシュ対応メールやフェッチのメールをたくさん(3つ4つ~)アカウントを登録して受信チェックさせる状態にしていると、プッシュ通知が遅延する原因となります。
私の場合、2台持ちにして、ひとつを3G専用のIPフォン専用スマホ化して、もうひとつはネットばりばり仕様にして、これで満充電で1日は余裕で持ちますので、いい感じにセットアップできました。どうぞご参考までに。