書類 計算する
FCM(Firebase Cloud Messaging)でWeb Pushする方法 #iOS

FCM(Firebase Cloud Messaging)でWeb Pushする方法 #iOS

< /span>< /i>はじめに< /h1> FCM(Firebase Cloud Messaging)でWeb Pushする記事はいくつかありますが、2023年6月20日に非推奨になっているCloud Messaging API(レガシー)を使用した記事が多いので、最新のFirebase Cl

Related articles

プロキシとVPN: 違いは何か? #初心者 Onランニングシューズ最新作Cloudrunner 2発売開始!特徴と前作との違いを解説! 【普段使いできる?】On クラウド5をレビュー サイズ感等について解説 ProtonVPNの評判はどう?料金やメリット・デメリットもくわしく解説 Opera VPNの使い方と安全性の評判【Androidアプリ】

< /span>< /i>はじめに< /h1>

FCM(Firebase Cloud Messaging)でWeb Pushする記事はいくつかありますが、2023年6月20日に非推奨になっているCloud Messaging API(レガシー)を使用した記事が多いので、最新のFirebase Cloud Messaging API(V1)で動かしてみます。< /p>

・FCMとは
  Googleが提供するクラウドベースのメッセージングソリューションです。主にモバイルおよびWebアプリケーション向けに設計されており、リアルタイムでメッセージを送受信するためのサービスです 。
・Web Pushとは
 Webブラウザを介してユーザーに対してリアルタイムで通知を送信する技術です。主にWebサイトやWebアプリケーションで利用され、ユーザーがサービスにアクセスしていないときでも、重要な情報を届けることができます。< /p>

< /span>< /i>こんな人に読んでほしい< /h1>

・Web Push導入を検討している方< /p>

< /span>< /i>Firebase登録< /h1>

まず初めに、下記記事を参考にして、プロジェクトとマイアプリをFirebaseに登録します 。
https://ralacode.com/blog/post/register-firebase/< /p>

登録後、下記情報をコピーしておきます。
・「プロジェクトの設定」 – 「全般」 – 「マイアプリ」のプロジェクトIDとCDNのコード
FCM(Firebase Cloud Messaging)でWeb Pushする方法 #iOS< /p>

・「プロジェクトの設定」 – 「Cloud Messaging」の鍵ペア
FCM(Firebase Cloud Messaging)でWeb Pushする方法 #iOS< /p>

・「プロジェクトの設定」-「サービスアカウント」の新しい秘密鍵を生成(jsonファイルのダウンロード)
FCM(Firebase Cloud Messaging)でWeb Pushする方法 #iOS< /p>

< /span>< /i>ソースコード作成< /h1>

次にソースコードを作成していきます 。
ファイル構成は以下の通りです。< /p>

.
├── front
│   ├── index.html
│   ├── firebase-message-sw.js
│   ├── manifest.json
│   └── service-worker.js
└── server
├── push.php
└── XXXXXXXXXX.json
< /code>< /pre>

< /span>< /i>index.html< /h1>

Web Pushを受信するWebアプリで、「トークン取得」ボタン押下時にFCMトークンを取得し、ブラウザに表示します。
本来であればFCMトークンはサーバーで適切に管理する必要がありますが、今回は検証目的なので簡易的に実装しています。< /p>

index.html< /span>< /p>

<!< /span>DOCTYPE< /span> html< /span>>< /span>
<< /span>html< /span>>< /span>
<< /span>head< /span>>< /span>
<< /span>meta< /span> charset< /span>=< /span>'utf-8/'< /span>>< /span>
<< /span>link< /span> rel< /span>=< /span>"manifest"< /span> href< /span>=< /span>" ./manifest.json "< /span>>< /span>
<< /span>script< /span>>< /span>
// service workerが有効なら、service-worker.js を登録します< /span>
if< /span> (< /span>'serviceworker'< /span> in< /span> navigator< /span>)< /span> {< /span>
navigator< /span>.< /span>serviceworker< /span>.< /span>register< /span>(< /span>'./service-worker.js'< /span>) ;< /span>
}< /span>
</< /span>script< /span>>< /span>
</< /span>head< /span>>< /span>
<< /span>body< /span>>< /span>
<< /span>button< /span> i d< /span>=< /span>"allow_push_notification"< /span>>< /span>トークン取得< /span></< /span>button< /span>>< /span>
<< /span>p< /span> i d< /span>=< /span>"output"< /span>></< /span>p< /span>>< /span>
<< /span>script< /span> type< /span>=< /span>"module"< /span>>< /span>
import< /span> {< /span> initializeApp< /span> }< /span> from< /span> "https://www.gstatic.com/firebasejs/10.12.2/firebase-app.js"< /span>;< /span>
import< /span> {< /span> getMessaging< /span>,< /span> gettoken< /span> }< /span> from< /span> "https://www.gstatic.com/firebasejs/10.12.2/firebase-message.js"< /span>;< /span>

// Your web app 's Firebase configuration< /span>
const< /span> firebaseConfig< /span> =< /span> {< /span>
apiKey< /span>:< /span> "XXXXXXXXXX"< /span>,< /span>
authDomain< /span>:< /span> "XXXXXXXXXX"< /span>,< /span>
projectId< /span>:< /span> "XXXXXXXXXX"< /span>,< /span>
storageBucket< /span>:< /span> "XXXXXXXXXX"< /span>,< /span>
messageSenderId< /span>:< /span> "XXXXXXXXXX"< /span>,< /span>
appId< /span>:< /span> "XXXXXXXXXX"< /span>
};< /span>

// initialize Firebase< /span>
const< /span> app< /span> =< /span> initializeApp< /span>(< /span>firebaseConfig< /span>) ;< /span>

// 通知を許可するボタンが押された時のアクション< /span>
const< /span> btn< /span> =< /span> document< /span>.< /span>getElementById< /span>(< /span>' allow_push_notification '< /span>) ;< /span>
btn< /span>.< /span>addEventListener< /span>(< /span>"click"< /span>,< /span> function< /span> ()< /span> {< /span>
//let promise = Notification.requestPermission() ;< /span>
//console.log("promise : " , promise ) ;< /span>
if< /span> (< /span>!< /span>(< /span>" notification "< /span> in< /span> window< /span>))< /span> {< /span>
// ブラウザーが通知に対応しているか調べる< /span>
alert< /span>(< /span>" このブラウザーはデスクトップ通知には対応していません 。 "< /span>) ;< /span>
}< /span> else< /span> if< /span> (< /span>Notification< /span>.< /span>permission< /span> ! = =< /span> " deny "< /span>)< /span> {< /span>

//if(Notification.permission ! = = " deny ") {< /span>
Notification< /span>.< /span>requestPermission< /span>()< /span>.< /span>then< /span>( (< /span>permission< /span>)< /span> =>< /span> {< /span>
const< /span> message< /span> =< /span> getMessaging< /span>() ;< /span>
// Add the public key generated from the console here.< /span>
gettoken< /span>(< /span>message< /span>,< /span> {< /span>vapi dKey< /span>:< /span> "★鍵ペア★"< /span>} )< /span>
.< /span>then< /span>( (< /span>token< /span>)< /span> =>< /span> {< /span>
if< /span> (< /span>token< /span>)< /span> {< /span>
// tokenを出力< /span>
//document.getElementById('output').textcontent = `${token.Promise}`;< /span>
console< /span>.< /span>log< /span>(< /span> "token"< /span>,< /span> token< /span>) ;< /span>
document< /span>.< /span>getElementById< /span>(< /span>'output'< /span>)< /span>.< /span>textcontent< /span> =< /span> token< /span>;< /span>
}< /span>else< /span>{< /span>
console< /span>.< /span>log< /span>(< /span>'登録トークンがありません。生成する許可をリクエストします。'< /span>) ;< /span>
}< /span>
} )< /span>
.< /span>catch< /span>( (< /span>err< /span>)< /span> =>< /span> {< /span>
console< /span>.< /span>log< /span>(< /span>'gettoken Error'< /span>,< /span>err< /span>) ;< /span>
} ) ;< /span>
} ) ;< /span>
}< /span>
} ) ;< /span>
</< /span>script< /span>>< /span>
</< /span>body< /span>>< /span>
</< /span>html< /span>>< /span>
< /code>< /pre>

< /span>

「"XXXXXXXXXX"」の部分は、FirebaseのCDNのコードに変更してください。
「★鍵ペア★」の部分は、Firebaseの鍵ペアに変更してください。< /p>

< /span>< /i>firebase-message-sw.js< /h1>

FCMのService Workerであり、Web Push通知を受信した際に動作します。< /p>

firebase-message-sw.js< /span>< /p>

// Push通知を受け取ると呼ばれる< /span>
self< /span>.< /span>addEventListener< /span>(< /span>'push'< /span>,< /span> function< /span> (< /span>event< /span>)< /span> {< /span>
// メッセージを表示する< /span>
var< /span> data< /span> =< /span> {};< /span>
if< /span> (< /span>event< /span>.< /span>data< /span>)< /span> {< /span>
data< /span> =< /span> event< /span>.< /span>data< /span>.< /span>json< /span>() ;< /span>
}< /span>
var< /span> title< /span> =< /span> data< /span>.< /span>notification< /span>.< /span>title< /span>;< /span>
var< /span> message< /span> =< /span> data< /span>.< /span>notification< /span>.< /span>body< /span>;< /span>
event< /span>.< /span>waituntil< /span>(< /span>
self< /span>.< /span>registration< /span>.< /span>showNotification< /span>(< /span>title< /span>,< /span> {< /span>
'body'< /span>:< /span> message< /span>
} )< /span>
) ;< /span>
} ) ;< /span>
< /code>< /pre>

< /span>< /i>manifest.json / service-worker.js< /h1>

iOSでWeb Pushを受信する場合はPWA化が必要です。
PWA化する場合は下記2つのファイルを作成します。
( iosで使用しない場合は不要です )< /p>

manifest.json< /span>< /p>

{< /span>
"< /span>$schema< /span>"< /span>:< /span> " https://json.schemastore.org/web-manifest-combined.json "< /span>,< /span>
"name"< /span>:< /span> " web Push test "< /span>,< /span>
"short_name"< /span>:< /span> "Push Test"< /span>,< /span>
"start_url"< /span>:< /span> "."< /span>,< /span>
"display"< /span>:< /span> "standalone"< /span>,< /span>
"background_color"< /span>:< /span> "#fff"< /span>,< /span>
"description"< /span>:< /span> " web push テスト "< /span>
}< /span>
< /code>< /pre>

service-worker.js< /span>< /p>

var< /span> cache_name< /span> =< /span> ' pwasample '< /span>;< /span>
var< /span> urlsToCache< /span> =< /span> [< /span>
'/apps/pwa/'< /span>,< /span>
' /apps / pwa / index.html '< /span>
];< /span>

self< /span>.< /span>addEventListener< /span>(< /span>'install'< /span>,< /span> function< /span>(< /span>event< /span>)< /span> {< /span>
event< /span>.< /span>waituntil< /span>(< /span>
cache< /span>
.< /span>open< /span>(< /span>cache_name< /span>)< /span>
.< /span>then< /span>(< /span>function< /span>(< /span>cache< /span>)< /span> {< /span>
return< /span> cache< /span>.< /span>addAll< /span>(< /span>urlsToCache< /span>) ;< /span>
} )< /span>
) ;< /span>
} ) ;< /span>

self< /span>.< /span>addEventListener< /span>(< /span>'fetch'< /span>,< /span> function< /span>(< /span>event< /span>)< /span> {< /span>
event< /span>.< /span>respondWith< /span>(< /span>
cache< /span>
.< /span>match< /span>(< /span>event< /span>.< /span>request< /span>)< /span>
.< /span>then< /span>(< /span>function< /span>(< /span>response< /span>)< /span> {< /span>
return< /span> response< /span> ?< /span> response< /span> :< /span> fetch< /span>(< /span>event< /span>.< /span>request< /span>) ;< /span>
} )< /span>
) ;< /span>
} ) ;< /span>
< /code>< /pre>

< /span>< /i>Webアプリの実行< /h1>

service Workerを実行するためにはHTTPS化が必要です 。
とりあえず動かしたいのであれば、下記記事を参考にしてホスティングしてください。
爆速で静的WEBをHTTPSホスティングする方法< /p>

ブラウザ表示後、「トークン取得」ボタンを押すとFCMトークンが表示されます。
これをコピーしてください。
< /p>

< /span>< /i>push.php< /h1>

ここからはサーバー側の実装になります。
コマンドラインでさくっと実行したいのでphpで実装してみます。< /p>

push.php< /span>< /p>

<?php< /span>
require< /span> 'vendor/autoload.php'< /span>;< /span>

//アクセストークン取得< /span>
$ client< /span> =< /span> new< /span> google_client< /span>() ;< /span>
$ client< /span>->< /span>setAuthConfig< /span>(< /span>' xxxxxxxxxx.json '< /span>) ;< /span>
$ client< /span>->< /span>addScope< /span>(< /span>'https://www.googleapis.com/auth/firebase.message'< /span>) ;< /span>
$ client< /span>->< /span>refreshTokenWithAssertion< /span>() ;< /span>
$ access_token< /span> =< /span> $ client< /span>->< /span>getAccessToken< /span>() ;< /span>

// 送るメッセージ is tokenに登録トークンを設定   tokenに登録トークンを設定< /span>
$ json< /span> =< /span> '{
"message":{
"notification":{"title": "ここにタイトルを入力",
"body": "ここにボディを入力"},
"token":"★FCNトークン★"}
}'< /span>;< /span>

// curlの初期化< /span>
$ch2< /span> =< /span> curl_init< /span>() ;< /span>

// アクセストークンをhttpヘッダーに設定< /span>
$ header< /span> =< /span> array< /span>(< /span>
'Content-Type: application/json'< /span>,< /span>
' authorization : Bearer '< /span> .< /span> $ access_token< /span>[< /span>" access_token "< /span>]< /span>
) ;< /span>

curl_setopt_array< /span>(< /span>$ch2< /span>,< /span> array< /span>(< /span>
CURLOPT_URL< /span> =>< /span> 'https://fcm.googleapis.com/v1/projects/★FCNプロジェクトID★/messages:send'< /span>,< /span>
CURLOPT_HTTPHEADER< /span> =>< /span> $ header< /span>,< /span>
CURLOPT_SSL_VERIFYPEER< /span> =>< /span> false< /span>,< /span>
CURLOPT_POST< /span> =>< /span> true< /span>,< /span>
CURLOPT_RETURNTRANSFER< /span> =>< /span> true< /span>,< /span>
CURLOPT_POSTFIELDS< /span> =>< /span> $ json< /span>
)) ;< /span>

// push送信< /span>
$ response< /span> =< /span> curl_exec< /span>(< /span>$ch2< /span>) ;< /span>

curl_close< /span>(< /span>$ch2< /span>) ;< /span>
< /code>< /pre>

< /span>

「XXXXXXXXXX.json」は秘密鍵のjsonファイル名に変更してください。
またpush.phpと同じフォルダに秘密鍵のjsonファイルを置いてください 。
「 ★ fcnトークン ★ 」はwebアプリに表示されているfcmトークンに変更してください 。
「★FCNプロジェクトID★」はFCMのプロジェクトIDに変更してください。< /p>

< /span>< /i>Google API Clientライブラリのインストール< /h1>

下記コマンドを実行し、ライブラリをインストールします。< /p>

composer is require require google / apiclient:^2.15.0
< /code>< /pre>

< /span>< /i>サーバーからPUSH送信< /h1>

< /span>< /i>実行結果< /h1>

代表的なOS/ブラウザでのWeb Push実行結果を添付します。< /p>

OS< /th>

表示結果< /th>
< /tr>
< /thead>

Windows11< /td>

chrome
FCM(Firebase Cloud Messaging)でWeb Pushする方法 #iOS
edge

FireFox
FCM(Firebase Cloud Messaging)でWeb Pushする方法 #iOS
< /td>
< /tr>

Mac< /td>

chrome
FCM(Firebase Cloud Messaging)でWeb Pushする方法 #iOS
Safari
FCM(Firebase Cloud Messaging)でWeb Pushする方法 #iOS
< /td>
< /tr>

Androi d13< /td>

chrome
FCM(Firebase Cloud Messaging)でWeb Pushする方法 #iOS
< /td>
< /tr>

iOS17.5.1< /td>

PWA
FCM(Firebase Cloud Messaging)でWeb Pushする方法 #iOS
< /td>
< /tr>
< /tbody>
< /table>

< /span>< /i>最後に< /h1>

今回はFCMでWeb Pushするための最低限のコードを書いてみました。
いろいろカスタマイズできるので、興味のある方は調べてみるとよいと思います。< /p>