@AleMux 的回答将我推向了正确的方向,但为了具体起见,这里是如何实现问题中提出的预期结果。
使用 Expo 的推送通知 API,您需要确保拥有适当的侦听器,这些侦听器已在其 API Snack/Example ( https://docs.expo.dev/versions/latest/sdk/notifications/# api )。为简单起见,这是我们需要关注的功能:
- 确保您已安装/导入 API:
import * as Notifications from "expo-notifications";
- 设置参考以处理通知和通知响应/交互:
const [expoPushToken, setExpoPushToken] = useState("");
const [notification, setNotification] = useState(false);
const notificationListener = useRef();
const responseListener = useRef();
- 对于这个用例,我们希望能够修改 WebView uri。有关上下文,请参阅下面的当前工作方式。下面的代码假定您已安装必要的依赖项(即 WebView):
const [page, setPage] = useState("");
const [baseURI] = useState("https://www.google.com");
//---A bunch of your app code will presumably be here as to what your app will render, but we'll focus in on the specific needs for this WebView---//
<WebView source={{uri: `${baseURI}/${page}`}} ref={webviewRef}/>
- 使用下面显示的侦听器,可以从 Expo Push Notification API Snack/Example 中找到/复制。在这种情况下,如果最终用户与通知交互,无论应用程序是在前台、后台还是被终止,我希望操作是相同的:
notificationListener.current =
Notifications.addNotificationReceivedListener((notification) => {
setNotification(notification);
const onInteraction = notification.request.content.data.event;
setPage(onInteraction);
});
responseListener.current =
Notifications.addNotificationResponseReceivedListener((response) => {
console.log(response);
const onInteraction = response.notification.request.content.data.event;
setPage(onInteraction);
});
- 最后,在我们的 HTTP POST 请求(在这种情况下使用 CURL)中,我们希望传递一个带有 JSON 对象的“数据”字段,上面的侦听器可以对其进行操作。上面提到的位置是关于侦听器可以收集对象的位置。
notification.request.content.data.event
. 在这种情况下,CURL HTTP POST 请求看起来像这样,setPage
对于 webview 到页面,baseURI
域内的页面由通过位于 post 请求的“数据”字段中的信息发送到上面的侦听器的信息确定。上面引用的位置data.event
引用了这样发送的对象"data": {"event": "insert page info here"}
。这是完整 CURL 命令的工作示例:
curl -H "Content-Type: application/json" -X POST "https://exp.host/--/api/v2/push/send" -d '{
"to": "ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]",
"title": "You have new mail messages!",
"body": "Check them out here in the app by interacting with this notification.",
"sound": "default",
"data": {"event": "mail"}
}'
当最终用户与推送通知交互(即按下徽章)时,应用程序将打开并且 webview 将呈${baseURI}/${page}
现在这种情况下,将是https://www.google.com/mail