メモ > 技術 > サービス: AmazonSNS > その他メモ
■その他メモ
■プッシュ設定時の挙動
プッシュ通知設定画面へ遷移させる為の実装 - Qiita
https://qiita.com/yamataku29/items/5361d7c3146604dcca44
■プッシュ受診時の挙動
Androidでプッシュ受信時にダイアログを表示できるか
■メインスレッドで処理を実行
[Swift] MainThreadで処理を実行する - Qiita
https://qiita.com/valmet/items/6de0921ca6106414228c
■プッシュ通知の受診時にダイアログを表示する(Android)
Firebaseで送信する際に「Android通知ちゃんねる」「優先度」「通知音」などがある
これらを変更して対応するのかも
と思ったが、もともと「優先度」は「高」なので特に変化は無い
■プッシュ通知のタップ時に任意の画面を開く
プッシュ通知からアプリ内の特定のviewを開く(iOS) - Growthbeat FAQ
https://faq.growthbeat.com/article/88-view-ios
[iOS 10] 画面上部または通知センター上に表示された通知がタップされたときの処理を実装する | DevelopersIO
https://dev.classmethod.jp/smartphone/iphone/wwdc-2016-user-notifications-7/
■アプリからプッシュ通知の設定画面を開く
プッシュ通知設定画面へ遷移させる為の実装 - Qiita
https://qiita.com/yamataku29/items/5361d7c3146604dcca44
■サイレントプッシュ
iOSのPUSH通知(APNS)の特徴・ノウハウまとめ(iOS 9まで対応) - Qiita
https://qiita.com/mono0926/items/df03c61adc56934e2e7a
AWS SNSを使ってiOSへpush通知 - Qiita
https://qiita.com/ijun/items/2cbff7664e49fb93bf39
Xcode:
Background Modes の Modes で「Remote notifications」に加えて「Background fetch」にもチェックを入れる
PHP:
iOSに送るプッシュデータに「'content-available' => 1」を追加する
$apns = json_encode([
'aps' => [
'alert' => [
'title' => 'タイトル',
'body' => $message,
],
'badge' => 0,
'sound' => 'default',
'content-available' => 1
],
'param1' => 'xxx',
'param2' => 'yyy'
]);
これでプッシュ受信時にiOSアプリ側の
// アプリ起動中に通知を受信する処理
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
}
のメソッドが呼ばれるようになるが、これだけだとプッシュ受診時にXcodeのコンソールに
「but the completion handler was never called.」
と表示される。以下のページにあるように
iOS アプリでメッセージを受信する | Firebase
https://firebase.google.com/docs/cloud-messaging/ios/receive?hl=ja
上記 application メソッドの最後に以下の処理を追加すると表示されなくなった
completionHandler(UIBackgroundFetchResult.newData)
これで「プッシュを受信した際に、バックグラウンドで任意の処理を実行する」ができそう
このうえで、iOSに送る際に
$apns = json_encode([
'aps' => [
/*
'alert' => [
'title' => 'タイトル',
'body' => $message,
],
*/
'badge' => 1,
'sound' => 'default',
'content-available' => 1
],
'param1' => 'xxx',
'param2' => 'yyy'
]);
このように alert のブロックをを丸ごとコメントアウトすると、プッシュは表示されないがプッシュの受信処理は行われる
さらに「'sound' => 'default',」もコメントアウトすると、プッシュ受診時のサウンドやバイブレーションも再生されない
この仕組を使えば「サーバからの指示によって、裏側でこっそり任意の処理を行わせる」ができそう
ただし当然ながら、プッシュが許可されていなかったりオフラインになっていたりすると実行できないので注意
■iOS用プッシュの証明書
※未検証
証明書入手先
Entrust.net Certificate Authority (2048)
https://www.entrustdatacard.com/pages/root-certificates-download
→2018/10/16時点で拡張子が、cerだが、中身を確認したところテキスト形式であったため変換不要
接続先サーバ
gateway.push.apple.com, port 2195;
gateway.sandbox.push.apple.com, port 2195
将来的には、GeoTrust Global CAルート証明書を使用すべきらしい
【ドキュメント】APNsの概要 > プロバイダ−APNs間の接続信頼
https://developer.apple.com/jp/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APN...
APNs Overview > Provider-to-APNs Connection Trust
https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotifi...
【ドキュメント】APNsとのやり取り
https://developer.apple.com/jp/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Com...
Communicating with APNs
https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotifi...
証明書入手先
https://www.geotrust.com/resources/root-certificates/
https://www.geotrust.com/resources/root_certificates/certificates/GeoTrust_Global_CA.pem
接続先サーバ
Development server: api.development.push.apple.com:443
Production server: api.push.apple.com:443
2197のポートも使用可能
ApnsPHPでは、Feedback.php と Push.php の2ファイルで接続先が定義されている
なお、証明書とURLを変更しただけでは、接続できなかった。