![](/img/trans.png)
[英]How to implement Video and/or Audio calling in React Native Expo application
[英]How to implement expo push notification in react native with nodejs server
我正在開發一個需要推送通知的應用程序。 我之前沒有使用過推送通知,我不知道如何使用 nodejs 服務器來實現它。 任何人都請幫助我了解如何在服務器中實現這一點。
對於本機端的反應,我已經閱讀了文檔但我仍然不太確定如何使其與服務器端一起工作。
請幫助我理解這一點。
首先,您需要使用 expo-notification 模塊來獲取智能手機的令牌。
之后,您可以使用https://expo.io/notifications (博覽會推送通知工具)來檢查(測試)它是否有效。
但這只是第一步。 它僅在您將應用程序作為 Expo 應用程序測試(運行)時才有效。
要在獨立 APP(iOS 和 Android)中實際使用推送通知,您需要
申請一個firebase FCM賬號,這樣你就可以把必要的憑據放入你的expo json文件中,這樣當你的App生成為APK並放入google play store時,你仍然可以執行推送通知
對於iOS,無需擔心,只需確保您在提交到Apple Store時在開發者帳戶中勾選此應用程序需要推送通知權限即可。 其他事情將由蘋果和世博會處理。
另一方面,您肯定不會每次都想使用 expo 推送通知工具向您的應用程序發送通知。 如果您使用的是 PHP,您可以使用以下代碼發送推送通知:
<?php
$payload = array(
'to' => 'ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]',
'sound' => 'default',
'body' => 'hello',
);
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => "https://exp.host/--/api/v2/push/send",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => array(
"Accept: application/json",
"Accept-Encoding: gzip, deflate",
"Content-Type: application/json",
"cache-control: no-cache",
"host: exp.host"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
?>
另一方面,你說你想使用 nodjs 服務器來完成這項工作,那么請參考以下內容
https://github.com/expo/expo-server-sdk-node
示例代碼如下:
import { Expo } from 'expo-server-sdk';
// Create a new Expo SDK client
// optionally providing an access token if you have enabled push security
let expo = new Expo({ accessToken: process.env.EXPO_ACCESS_TOKEN });
// Create the messages that you want to send to clients
let messages = [];
for (let pushToken of somePushTokens) {
// Each push token looks like ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]
// Check that all your push tokens appear to be valid Expo push tokens
if (!Expo.isExpoPushToken(pushToken)) {
console.error(`Push token ${pushToken} is not a valid Expo push token`);
continue;
}
// Construct a message (see https://docs.expo.io/push-notifications/sending-notifications/)
messages.push({
to: pushToken,
sound: 'default',
body: 'This is a test notification',
data: { withSome: 'data' },
})
}
// The Expo push notification service accepts batches of notifications so
// that you don't need to send 1000 requests to send 1000 notifications. We
// recommend you batch your notifications to reduce the number of requests
// and to compress them (notifications with similar content will get
// compressed).
let chunks = expo.chunkPushNotifications(messages);
let tickets = [];
(async () => {
// Send the chunks to the Expo push notification service. There are
// different strategies you could use. A simple one is to send one chunk at a
// time, which nicely spreads the load out over time:
for (let chunk of chunks) {
try {
let ticketChunk = await expo.sendPushNotificationsAsync(chunk);
console.log(ticketChunk);
tickets.push(...ticketChunk);
// NOTE: If a ticket contains an error code in ticket.details.error, you
// must handle it appropriately. The error codes are listed in the Expo
// documentation:
// https://docs.expo.io/push-notifications/sending-notifications/#individual-errors
} catch (error) {
console.error(error);
}
}
})();
...
// Later, after the Expo push notification service has delivered the
// notifications to Apple or Google (usually quickly, but allow the the service
// up to 30 minutes when under load), a "receipt" for each notification is
// created. The receipts will be available for at least a day; stale receipts
// are deleted.
//
// The ID of each receipt is sent back in the response "ticket" for each
// notification. In summary, sending a notification produces a ticket, which
// contains a receipt ID you later use to get the receipt.
//
// The receipts may contain error codes to which you must respond. In
// particular, Apple or Google may block apps that continue to send
// notifications to devices that have blocked notifications or have uninstalled
// your app. Expo does not control this policy and sends back the feedback from
// Apple and Google so you can handle it appropriately.
let receiptIds = [];
for (let ticket of tickets) {
// NOTE: Not all tickets have IDs; for example, tickets for notifications
// that could not be enqueued will have error information and no receipt ID.
if (ticket.id) {
receiptIds.push(ticket.id);
}
}
let receiptIdChunks = expo.chunkPushNotificationReceiptIds(receiptIds);
(async () => {
// Like sending notifications, there are different strategies you could use
// to retrieve batches of receipts from the Expo service.
for (let chunk of receiptIdChunks) {
try {
let receipts = await expo.getPushNotificationReceiptsAsync(chunk);
console.log(receipts);
// The receipts specify whether Apple or Google successfully received the
// notification and information about an error, if one occurred.
for (let receiptId in receipts) {
let { status, message, details } = receipts[receiptId];
if (status === 'ok') {
continue;
} else if (status === 'error') {
console.error(
`There was an error sending a notification: ${message}`
);
if (details && details.error) {
// The error codes are listed in the Expo documentation:
// https://docs.expo.io/push-notifications/sending-notifications/#individual-errors
// You must handle the errors appropriately.
console.error(`The error code is ${details.error}`);
}
}
}
} catch (error) {
console.error(error);
}
}
})();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.