正しく設定してるのにiOSに通知が送られない

広告:超オススメUnity Asset
  広告:超オススメUnity Asset

PHPからApple iOSへ通知を送る際に使うpemファイルをp12から作成する際にopensslコマンドで行っていましたが、突如、以下のようなエラーが出ていたことに気づきました。

004C5FFE01000000:error:0308010C:digital envelope routines:inner_evp_generic_fetch:unsupported:crypto/evp/evp_fetch.c:355:Global default library context, Algorithm (RC2-40-CBC : 0), Properties ()

このエラーが出ていても、.pemファイルは作成され、通知もPHP上ではエラーを出さず何事もなかったかのように実行されているのですが、これが原因で、実は通知が送られてこない ということがわかりました。エラーが発生しないため、このopenssl時のこのエラーが原因だというところまで突き詰めるのにえらく時間がかかりました。

openssl pkcs12 -in 証明書.p12 -out server_certificates.pem -nodes -clcerts -legacy

この最後につけてる  -legacy というパラメータをつけることで、上記のエラーが出なくなり、ちゃんと通知が送られるpemを生成することができるようになりました。

その他通知関連をついでにいろいろと

このほかに、似たように正しく設定してるのに通知が送られないという現象の原因として、Xcodeから直接実機にインストールしたアプリに、PHPからProduction用の証明書で作成したpemファイルを使って送信しても通知が届きません。TestFlightからインストールするとProduction用でも届きます。(ちなみにAndroidはUnityから直接インストールしたアプリでも通知は届きます)この辺も罠です。

あと、ついでにここでも書いておくと、上記、opensslで生成したpemファイルは、後からファイル名を変更すると使えなくなったりします。

あと、PHPからApple iOSに通知を出すためには、curlでhttp/2が使える環境でないとダメになったので、レンタルサーバーの共有サーバーでは使えないことが多く(2024年現在)、このMEMOで、Linuxを立ち上げるところから環境を準備しています。

iOSアプリにPHPからプッシュ通知(APNs)したいため、XserverのVPSにPHPが動作するサーバーを立ち上げる手順MEMO。(iO...
スポンサーリンク