expo-notifications 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/README.md +11 -4
- package/android/build.gradle +3 -3
- package/build/Tokens.types.d.ts +44 -0
- package/build/Tokens.types.d.ts.map +1 -1
- package/build/Tokens.types.js.map +1 -1
- package/build/getExpoPushTokenAsync.d.ts +3 -52
- package/build/getExpoPushTokenAsync.d.ts.map +1 -1
- package/build/getExpoPushTokenAsync.js +5 -8
- package/build/getExpoPushTokenAsync.js.map +1 -1
- package/package.json +4 -4
- package/src/Tokens.types.ts +46 -0
- package/src/getExpoPushTokenAsync.ts +9 -64
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,23 @@
|
|
|
10
10
|
|
|
11
11
|
### 💡 Others
|
|
12
12
|
|
|
13
|
+
## 0.19.0 — 2023-05-08
|
|
14
|
+
|
|
15
|
+
### 🛠 Breaking changes
|
|
16
|
+
|
|
17
|
+
- Removed the deprecated `ExpoPushTokenOptions.experienceId` field. ([#22303](https://github.com/expo/expo/pull/22303) by [@gabrieldonadel](https://github.com/gabrieldonadel))
|
|
18
|
+
|
|
19
|
+
### 💡 Others
|
|
20
|
+
|
|
21
|
+
- Update fixtures. ([#21397](https://github.com/expo/expo/pull/21397) by [@EvanBacon](https://github.com/EvanBacon))
|
|
22
|
+
- Warn on use of Constants.manifest. ([#22247](https://github.com/expo/expo/pull/22247) by [@wschurman](https://github.com/wschurman))
|
|
23
|
+
|
|
24
|
+
## 0.18.1 — 2023-02-09
|
|
25
|
+
|
|
26
|
+
### 💡 Others
|
|
27
|
+
|
|
28
|
+
- Export `getExpoPushTokenAsync` parameter type. ([#21104](https://github.com/expo/expo/pull/21104) by [@Simek](https://github.com/Simek))
|
|
29
|
+
|
|
13
30
|
## 0.18.0 — 2023-02-03
|
|
14
31
|
|
|
15
32
|
### 💡 Others
|
package/README.md
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
<p>
|
|
2
|
+
<a href="https://docs.expo.dev/versions/latest/sdk/notifications/">
|
|
3
|
+
<img
|
|
4
|
+
src="../../.github/resources/expo-notifications.svg"
|
|
5
|
+
alt="expo-notifications"
|
|
6
|
+
height="64" />
|
|
7
|
+
</a>
|
|
8
|
+
</p>
|
|
2
9
|
|
|
3
10
|
Provides an API to fetch push notification tokens and to present, schedule, receive and respond to notifications.
|
|
4
11
|
|
|
@@ -27,7 +34,7 @@ For bare React Native projects, you must ensure that you have [installed and con
|
|
|
27
34
|
### Add the package to your npm dependencies
|
|
28
35
|
|
|
29
36
|
```
|
|
30
|
-
expo install expo-notifications
|
|
37
|
+
npx expo install expo-notifications
|
|
31
38
|
```
|
|
32
39
|
|
|
33
40
|
### Configure for iOS
|
|
@@ -119,7 +126,7 @@ This module requires permission to subscribe to device boot. It's used to setup
|
|
|
119
126
|
|
|
120
127
|
### Config plugin setup (optional)
|
|
121
128
|
|
|
122
|
-
If you're using EAS Build, you can set your Android notification icon and color tint, add custom push notification sounds, and set your iOS notification environment using the expo-notifications config plugin ([what's a config plugin?](
|
|
129
|
+
If you're using EAS Build, you can set your Android notification icon and color tint, add custom push notification sounds, and set your iOS notification environment using the expo-notifications config plugin ([what's a config plugin?](https://docs.expo.dev/home/config-plugins/introduction)). To setup, just add the config plugin to the plugins array of your `app.json` or `app.config.js` as shown below, then rebuild the app.
|
|
123
130
|
|
|
124
131
|
```json
|
|
125
132
|
{
|
|
@@ -673,7 +680,7 @@ export default function App() {
|
|
|
673
680
|
Linking.addEventListener('url', onReceiveURL);
|
|
674
681
|
|
|
675
682
|
// Listen to expo push notifications
|
|
676
|
-
const subscription = Notifications.addNotificationResponseReceivedListener(response => {
|
|
683
|
+
const subscription = Notifications.addNotificationResponseReceivedListener((response) => {
|
|
677
684
|
const url = response.notification.request.content.data.url;
|
|
678
685
|
|
|
679
686
|
// Any custom logic to see whether the URL needs to be handled
|
package/android/build.gradle
CHANGED
|
@@ -3,7 +3,7 @@ apply plugin: 'kotlin-android'
|
|
|
3
3
|
apply plugin: 'maven-publish'
|
|
4
4
|
|
|
5
5
|
group = 'host.exp.exponent'
|
|
6
|
-
version = '0.
|
|
6
|
+
version = '0.19.0'
|
|
7
7
|
|
|
8
8
|
buildscript {
|
|
9
9
|
def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
|
|
@@ -22,7 +22,7 @@ buildscript {
|
|
|
22
22
|
if (ext.has("kotlinVersion")) {
|
|
23
23
|
ext.kotlinVersion()
|
|
24
24
|
} else {
|
|
25
|
-
ext.safeExtGet("kotlinVersion", "1.
|
|
25
|
+
ext.safeExtGet("kotlinVersion", "1.8.10")
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
|
|
@@ -74,7 +74,7 @@ android {
|
|
|
74
74
|
minSdkVersion safeExtGet("minSdkVersion", 21)
|
|
75
75
|
targetSdkVersion safeExtGet("targetSdkVersion", 33)
|
|
76
76
|
versionCode 21
|
|
77
|
-
versionName '0.
|
|
77
|
+
versionName '0.19.0'
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
lintOptions {
|
package/build/Tokens.types.d.ts
CHANGED
|
@@ -51,5 +51,49 @@ export interface ExpoPushToken {
|
|
|
51
51
|
*/
|
|
52
52
|
data: string;
|
|
53
53
|
}
|
|
54
|
+
export interface ExpoPushTokenOptions {
|
|
55
|
+
/**
|
|
56
|
+
* Endpoint URL override.
|
|
57
|
+
*/
|
|
58
|
+
baseUrl?: string;
|
|
59
|
+
/**
|
|
60
|
+
* Request URL override.
|
|
61
|
+
*/
|
|
62
|
+
url?: string;
|
|
63
|
+
/**
|
|
64
|
+
* Request body override.
|
|
65
|
+
*/
|
|
66
|
+
type?: string;
|
|
67
|
+
deviceId?: string;
|
|
68
|
+
/**
|
|
69
|
+
* Makes sense only on iOS, where there are two push notification services: "sandbox" and "production".
|
|
70
|
+
* This defines whether the push token is supposed to be used with the sandbox platform notification service.
|
|
71
|
+
* Defaults to [`Application.getIosPushNotificationServiceEnvironmentAsync()`](./application/#applicationgetiospushnotificationserviceenvironmentasync)
|
|
72
|
+
* exposed by `expo-application` or `false`. Most probably you won't need to customize that.
|
|
73
|
+
* You may want to customize that if you don't want to install `expo-application` and still use the sandbox APNs.
|
|
74
|
+
* @platform ios
|
|
75
|
+
*/
|
|
76
|
+
development?: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* The ID of the project to which the token should be attributed.
|
|
79
|
+
* Defaults to [`Constants.expoConfig.extra.eas.projectId`](./constants/#easconfig) exposed by `expo-constants`.
|
|
80
|
+
*
|
|
81
|
+
* When using EAS Build, this value is automatically set. However, it is
|
|
82
|
+
* **recommended** to set it manually. Once you have EAS Build configured, you can find
|
|
83
|
+
* the value in **app.json** under `extra.eas.projectId`. You can copy and paste it into your code.
|
|
84
|
+
* If you are not using EAS Build, it will fallback to [`Constants.expoConfig?.extra?.eas?.projectId`](./constants/#manifest).
|
|
85
|
+
*/
|
|
86
|
+
projectId?: string;
|
|
87
|
+
/**
|
|
88
|
+
* The ID of the application to which the token should be attributed.
|
|
89
|
+
* Defaults to [`Application.applicationId`](./application/#applicationapplicationid) exposed by `expo-application`.
|
|
90
|
+
*/
|
|
91
|
+
applicationId?: string;
|
|
92
|
+
/**
|
|
93
|
+
* The device push token with which to register at the backend.
|
|
94
|
+
* Defaults to a token fetched with [`getDevicePushTokenAsync()`](#getdevicepushtokenasync).
|
|
95
|
+
*/
|
|
96
|
+
devicePushToken?: DevicePushToken;
|
|
97
|
+
}
|
|
54
98
|
export {};
|
|
55
99
|
//# sourceMappingURL=Tokens.types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tokens.types.d.ts","sourceRoot":"","sources":["../src/Tokens.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE;YACJ,MAAM,EAAE,MAAM,CAAC;YACf,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC;CACH;AAGD,KAAK,kCAAkC,GAAG,qBAAqB,GAAG,kBAAkB,CAAC;AAErF,KAAK,kCAAkC,GAAG;IACxC;;OAEG;IACH,IAAI,EAAE,OAAO,CAAC,OAAO,QAAQ,CAAC,EAAE,EAAE,kCAAkC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9E;;;;;;;;;;;OAWG;IACH,IAAI,EAAE,GAAG,CAAC;CACX,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,eAAe,GACvB,kCAAkC,GAClC,kCAAkC,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
1
|
+
{"version":3,"file":"Tokens.types.d.ts","sourceRoot":"","sources":["../src/Tokens.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG7C,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE;YACJ,MAAM,EAAE,MAAM,CAAC;YACf,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC;CACH;AAGD,KAAK,kCAAkC,GAAG,qBAAqB,GAAG,kBAAkB,CAAC;AAErF,KAAK,kCAAkC,GAAG;IACxC;;OAEG;IACH,IAAI,EAAE,OAAO,CAAC,OAAO,QAAQ,CAAC,EAAE,EAAE,kCAAkC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9E;;;;;;;;;;;OAWG;IACH,IAAI,EAAE,GAAG,CAAC;CACX,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,eAAe,GACvB,kCAAkC,GAClC,kCAAkC,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tokens.types.js","sourceRoot":"","sources":["../src/Tokens.types.ts"],"names":[],"mappings":"","sourcesContent":["import { Platform } from 'expo-modules-core';\n\n// @docsMissing\nexport interface NativeDevicePushToken {\n type: 'ios' | 'android';\n data: string;\n}\n\n// @docsMissing\nexport interface WebDevicePushToken {\n type: 'web';\n data: {\n endpoint: string;\n keys: {\n p256dh: string;\n auth: string;\n };\n };\n}\n\n// @docsMissing\ntype ExplicitlySupportedDevicePushToken = NativeDevicePushToken | WebDevicePushToken;\n\ntype ImplicitlySupportedDevicePushToken = {\n /**\n * Either `android`, `ios` or `web`.\n */\n type: Exclude<typeof Platform.OS, ExplicitlySupportedDevicePushToken['type']>;\n /**\n * Either the push token as a string (when for native platforms), or an object conforming to the type below (for web):\n * ```ts\n * {\n * endpoint: string;\n * keys: {\n * p256dh: string;\n * auth: string;\n * }\n * }\n * ```\n */\n data: any;\n};\n\n/**\n * In simple terms, an object of `type: Platform.OS` and `data: any`. The `data` type depends on the environment - on a native device it will be a string,\n * which you can then use to send notifications via Firebase Cloud Messaging (Android) or APNs (iOS); on web it will be a registration object (VAPID).\n */\nexport type DevicePushToken =\n | ExplicitlySupportedDevicePushToken\n | ImplicitlySupportedDevicePushToken;\n\n/**\n * Borrowing structure from `DevicePushToken` a little. You can use the `data` value to send notifications via Expo Notifications service.\n */\nexport interface ExpoPushToken {\n /**\n * Always set to `\"expo\"`.\n */\n type: 'expo';\n /**\n * The acquired push token.\n */\n data: string;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Tokens.types.js","sourceRoot":"","sources":["../src/Tokens.types.ts"],"names":[],"mappings":"","sourcesContent":["import { Platform } from 'expo-modules-core';\n\n// @docsMissing\nexport interface NativeDevicePushToken {\n type: 'ios' | 'android';\n data: string;\n}\n\n// @docsMissing\nexport interface WebDevicePushToken {\n type: 'web';\n data: {\n endpoint: string;\n keys: {\n p256dh: string;\n auth: string;\n };\n };\n}\n\n// @docsMissing\ntype ExplicitlySupportedDevicePushToken = NativeDevicePushToken | WebDevicePushToken;\n\ntype ImplicitlySupportedDevicePushToken = {\n /**\n * Either `android`, `ios` or `web`.\n */\n type: Exclude<typeof Platform.OS, ExplicitlySupportedDevicePushToken['type']>;\n /**\n * Either the push token as a string (when for native platforms), or an object conforming to the type below (for web):\n * ```ts\n * {\n * endpoint: string;\n * keys: {\n * p256dh: string;\n * auth: string;\n * }\n * }\n * ```\n */\n data: any;\n};\n\n/**\n * In simple terms, an object of `type: Platform.OS` and `data: any`. The `data` type depends on the environment - on a native device it will be a string,\n * which you can then use to send notifications via Firebase Cloud Messaging (Android) or APNs (iOS); on web it will be a registration object (VAPID).\n */\nexport type DevicePushToken =\n | ExplicitlySupportedDevicePushToken\n | ImplicitlySupportedDevicePushToken;\n\n/**\n * Borrowing structure from `DevicePushToken` a little. You can use the `data` value to send notifications via Expo Notifications service.\n */\nexport interface ExpoPushToken {\n /**\n * Always set to `\"expo\"`.\n */\n type: 'expo';\n /**\n * The acquired push token.\n */\n data: string;\n}\n\nexport interface ExpoPushTokenOptions {\n /**\n * Endpoint URL override.\n */\n baseUrl?: string;\n /**\n * Request URL override.\n */\n url?: string;\n /**\n * Request body override.\n */\n type?: string;\n // @missingDocs\n deviceId?: string;\n /**\n * Makes sense only on iOS, where there are two push notification services: \"sandbox\" and \"production\".\n * This defines whether the push token is supposed to be used with the sandbox platform notification service.\n * Defaults to [`Application.getIosPushNotificationServiceEnvironmentAsync()`](./application/#applicationgetiospushnotificationserviceenvironmentasync)\n * exposed by `expo-application` or `false`. Most probably you won't need to customize that.\n * You may want to customize that if you don't want to install `expo-application` and still use the sandbox APNs.\n * @platform ios\n */\n development?: boolean;\n /**\n * The ID of the project to which the token should be attributed.\n * Defaults to [`Constants.expoConfig.extra.eas.projectId`](./constants/#easconfig) exposed by `expo-constants`.\n *\n * When using EAS Build, this value is automatically set. However, it is\n * **recommended** to set it manually. Once you have EAS Build configured, you can find\n * the value in **app.json** under `extra.eas.projectId`. You can copy and paste it into your code.\n * If you are not using EAS Build, it will fallback to [`Constants.expoConfig?.extra?.eas?.projectId`](./constants/#manifest).\n */\n projectId?: string;\n /**\n * The ID of the application to which the token should be attributed.\n * Defaults to [`Application.applicationId`](./application/#applicationapplicationid) exposed by `expo-application`.\n */\n applicationId?: string;\n /**\n * The device push token with which to register at the backend.\n * Defaults to a token fetched with [`getDevicePushTokenAsync()`](#getdevicepushtokenasync).\n */\n devicePushToken?: DevicePushToken;\n}\n"]}
|
|
@@ -1,52 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
interface Options {
|
|
3
|
-
/**
|
|
4
|
-
* Endpoint URL override.
|
|
5
|
-
*/
|
|
6
|
-
baseUrl?: string;
|
|
7
|
-
/**
|
|
8
|
-
* Request URL override.
|
|
9
|
-
*/
|
|
10
|
-
url?: string;
|
|
11
|
-
/**
|
|
12
|
-
* Request body override.
|
|
13
|
-
*/
|
|
14
|
-
type?: string;
|
|
15
|
-
deviceId?: string;
|
|
16
|
-
/**
|
|
17
|
-
* Makes sense only on iOS, where there are two push notification services: "sandbox" and "production".
|
|
18
|
-
* This defines whether the push token is supposed to be used with the sandbox platform notification service.
|
|
19
|
-
* Defaults to [`Application.getIosPushNotificationServiceEnvironmentAsync()`](/application/#applicationgetiospushnotificationserviceenvironmentasync)
|
|
20
|
-
* exposed by `expo-application` or `false`. Most probably you won't need to customize that.
|
|
21
|
-
* You may want to customize that if you don't want to install `expo-application` and still use the sandbox APNs.
|
|
22
|
-
* @platform ios
|
|
23
|
-
*/
|
|
24
|
-
development?: boolean;
|
|
25
|
-
/**
|
|
26
|
-
* @deprecated Use `projectId` instead.
|
|
27
|
-
* The ID of the experience to which the token should be attributed.
|
|
28
|
-
* Defaults to [`Constants.manifest.id`](/constants/#constantsmanifest) exposed by `expo-constants`.
|
|
29
|
-
* When building with EAS Build, or in the bare workflow, **this is required** and you must provide a value which takes the shape `@username/projectSlug`,
|
|
30
|
-
* where `username` is the Expo account that the project is associated with, and `projectSlug` is your [`slug`](/config/app.mdx#slug) from Expo config.
|
|
31
|
-
*/
|
|
32
|
-
experienceId?: string;
|
|
33
|
-
/**
|
|
34
|
-
* The ID of the project to which the token should be attributed.
|
|
35
|
-
* Defaults to [`Constants.expoConfig.extra.eas.projectId`](/constants/#easconfig) exposed by `expo-constants`.
|
|
36
|
-
* If you are not using EAS Build, it will fallback to [`Constants.manifest.projectId`](/constants/#constantsmanifest).
|
|
37
|
-
*/
|
|
38
|
-
projectId?: string;
|
|
39
|
-
/**
|
|
40
|
-
* The ID of the application to which the token should be attributed.
|
|
41
|
-
* Defaults to [`Application.applicationId`](/application/#applicationapplicationid) exposed by `expo-application`.
|
|
42
|
-
*/
|
|
43
|
-
applicationId?: string;
|
|
44
|
-
/**
|
|
45
|
-
* The device push token with which to register at the backend.
|
|
46
|
-
* Defaults to a token fetched with [`getDevicePushTokenAsync()`](#getdevicepushtokenasync-devicepushtoken).
|
|
47
|
-
*/
|
|
48
|
-
devicePushToken?: DevicePushToken;
|
|
49
|
-
}
|
|
1
|
+
import { ExpoPushToken, ExpoPushTokenOptions } from './Tokens.types';
|
|
50
2
|
/**
|
|
51
3
|
* Returns an Expo token that can be used to send a push notification to the device using Expo's push notifications service.
|
|
52
4
|
*
|
|
@@ -68,7 +20,7 @@ interface Options {
|
|
|
68
20
|
*
|
|
69
21
|
* export async function registerForPushNotificationsAsync(userId: string) {
|
|
70
22
|
* const expoPushToken = await Notifications.getExpoPushTokenAsync({
|
|
71
|
-
*
|
|
23
|
+
* projectId: 'your-project-id',
|
|
72
24
|
* });
|
|
73
25
|
*
|
|
74
26
|
* await fetch('https://example.com/', {
|
|
@@ -84,6 +36,5 @@ interface Options {
|
|
|
84
36
|
* }
|
|
85
37
|
* ```
|
|
86
38
|
*/
|
|
87
|
-
export default function getExpoPushTokenAsync(options?:
|
|
88
|
-
export {};
|
|
39
|
+
export default function getExpoPushTokenAsync(options?: ExpoPushTokenOptions): Promise<ExpoPushToken>;
|
|
89
40
|
//# sourceMappingURL=getExpoPushTokenAsync.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getExpoPushTokenAsync.d.ts","sourceRoot":"","sources":["../src/getExpoPushTokenAsync.ts"],"names":[],"mappings":"AAMA,OAAO,
|
|
1
|
+
{"version":3,"file":"getExpoPushTokenAsync.d.ts","sourceRoot":"","sources":["../src/getExpoPushTokenAsync.ts"],"names":[],"mappings":"AAMA,OAAO,EAAmB,aAAa,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAKtF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAA8B,qBAAqB,CACjD,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,CAyFxB"}
|
|
@@ -26,7 +26,7 @@ const productionBaseUrl = 'https://exp.host/--/api/v2/';
|
|
|
26
26
|
*
|
|
27
27
|
* export async function registerForPushNotificationsAsync(userId: string) {
|
|
28
28
|
* const expoPushToken = await Notifications.getExpoPushTokenAsync({
|
|
29
|
-
*
|
|
29
|
+
* projectId: 'your-project-id',
|
|
30
30
|
* });
|
|
31
31
|
*
|
|
32
32
|
* await fetch('https://example.com/', {
|
|
@@ -45,15 +45,12 @@ const productionBaseUrl = 'https://exp.host/--/api/v2/';
|
|
|
45
45
|
export default async function getExpoPushTokenAsync(options = {}) {
|
|
46
46
|
const devicePushToken = options.devicePushToken || (await getDevicePushTokenAsync());
|
|
47
47
|
const deviceId = options.deviceId || (await getDeviceIdAsync());
|
|
48
|
-
const
|
|
49
|
-
const projectId = options.projectId ||
|
|
50
|
-
Constants.expoConfig?.extra?.eas?.projectId ||
|
|
51
|
-
Constants.manifest?.projectId;
|
|
48
|
+
const projectId = options.projectId || Constants.easConfig?.projectId;
|
|
52
49
|
if (!projectId) {
|
|
53
50
|
console.warn('Calling getExpoPushTokenAsync without specifying a projectId is deprecated and will no longer be supported in SDK 49+');
|
|
54
51
|
}
|
|
55
|
-
if (!
|
|
56
|
-
throw new CodedError('ERR_NOTIFICATIONS_NO_EXPERIENCE_ID', "No
|
|
52
|
+
if (!projectId) {
|
|
53
|
+
throw new CodedError('ERR_NOTIFICATIONS_NO_EXPERIENCE_ID', "No 'projectId' found. If 'projectId' can't be inferred from the manifest (eg. in bare workflow), you have to pass it in yourself.");
|
|
57
54
|
}
|
|
58
55
|
const applicationId = options.applicationId || Application.applicationId;
|
|
59
56
|
if (!applicationId) {
|
|
@@ -69,7 +66,7 @@ export default async function getExpoPushTokenAsync(options = {}) {
|
|
|
69
66
|
development,
|
|
70
67
|
appId: applicationId,
|
|
71
68
|
deviceToken: getDeviceToken(devicePushToken),
|
|
72
|
-
|
|
69
|
+
projectId,
|
|
73
70
|
};
|
|
74
71
|
const response = await fetch(url, {
|
|
75
72
|
method: 'POST',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getExpoPushTokenAsync.js","sourceRoot":"","sources":["../src/getExpoPushTokenAsync.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Application from 'expo-application';\nimport Constants from 'expo-constants';\nimport { Platform, CodedError, UnavailabilityError } from 'expo-modules-core';\n\nimport { setAutoServerRegistrationEnabledAsync } from './DevicePushTokenAutoRegistration.fx';\nimport ServerRegistrationModule from './ServerRegistrationModule';\nimport { DevicePushToken, ExpoPushToken } from './Tokens.types';\nimport getDevicePushTokenAsync from './getDevicePushTokenAsync';\n\nconst productionBaseUrl = 'https://exp.host/--/api/v2/';\n\ninterface Options {\n /**\n * Endpoint URL override.\n */\n baseUrl?: string;\n /**\n * Request URL override.\n */\n url?: string;\n /**\n * Request body override.\n */\n type?: string;\n // @missingDocs\n deviceId?: string;\n /**\n * Makes sense only on iOS, where there are two push notification services: \"sandbox\" and \"production\".\n * This defines whether the push token is supposed to be used with the sandbox platform notification service.\n * Defaults to [`Application.getIosPushNotificationServiceEnvironmentAsync()`](/application/#applicationgetiospushnotificationserviceenvironmentasync)\n * exposed by `expo-application` or `false`. Most probably you won't need to customize that.\n * You may want to customize that if you don't want to install `expo-application` and still use the sandbox APNs.\n * @platform ios\n */\n development?: boolean;\n /**\n * @deprecated Use `projectId` instead.\n * The ID of the experience to which the token should be attributed.\n * Defaults to [`Constants.manifest.id`](/constants/#constantsmanifest) exposed by `expo-constants`.\n * When building with EAS Build, or in the bare workflow, **this is required** and you must provide a value which takes the shape `@username/projectSlug`,\n * where `username` is the Expo account that the project is associated with, and `projectSlug` is your [`slug`](/config/app.mdx#slug) from Expo config.\n */\n experienceId?: string;\n /**\n * The ID of the project to which the token should be attributed.\n * Defaults to [`Constants.expoConfig.extra.eas.projectId`](/constants/#easconfig) exposed by `expo-constants`.\n * If you are not using EAS Build, it will fallback to [`Constants.manifest.projectId`](/constants/#constantsmanifest).\n */\n projectId?: string;\n /**\n * The ID of the application to which the token should be attributed.\n * Defaults to [`Application.applicationId`](/application/#applicationapplicationid) exposed by `expo-application`.\n */\n applicationId?: string;\n /**\n * The device push token with which to register at the backend.\n * Defaults to a token fetched with [`getDevicePushTokenAsync()`](#getdevicepushtokenasync-devicepushtoken).\n */\n devicePushToken?: DevicePushToken;\n}\n\n/**\n * Returns an Expo token that can be used to send a push notification to the device using Expo's push notifications service.\n *\n * This method makes requests to the Expo's servers. It can get rejected in cases where the request itself fails\n * (for example, due to the device being offline, experiencing a network timeout, or other HTTPS request failures).\n * To provide offline support to your users, you should `try/catch` this method and implement retry logic to attempt\n * to get the push token later, once the device is back online.\n *\n * > For Expo's backend to be able to send notifications to your app, you will need to provide it with push notification keys.\n * For more information, see [credentials](/push-notifications/push-notifications-setup/#get-credentials-for-development-builds) in the push notifications setup.\n *\n * @param options Object allowing you to pass in push notification configuration.\n * @return Returns a `Promise` that resolves to an object representing acquired push token.\n * @header fetch\n *\n * @example\n * ```ts\n * import * as Notifications from 'expo-notifications';\n *\n * export async function registerForPushNotificationsAsync(userId: string) {\n * const expoPushToken = await Notifications.getExpoPushTokenAsync({\n * experienceId: '@username/example',\n * });\n *\n * await fetch('https://example.com/', {\n * method: 'POST',\n * headers: {\n * 'Content-Type': 'application/json',\n * },\n * body: JSON.stringify({\n * userId,\n * expoPushToken,\n * }),\n * });\n * }\n * ```\n */\nexport default async function getExpoPushTokenAsync(options: Options = {}): Promise<ExpoPushToken> {\n const devicePushToken = options.devicePushToken || (await getDevicePushTokenAsync());\n\n const deviceId = options.deviceId || (await getDeviceIdAsync());\n\n const experienceId =\n options.experienceId || Constants.expoConfig?.originalFullName || Constants.manifest?.id;\n\n const projectId =\n options.projectId ||\n Constants.expoConfig?.extra?.eas?.projectId ||\n Constants.manifest?.projectId;\n\n if (!projectId) {\n console.warn(\n 'Calling getExpoPushTokenAsync without specifying a projectId is deprecated and will no longer be supported in SDK 49+'\n );\n }\n\n if (!experienceId && !projectId) {\n throw new CodedError(\n 'ERR_NOTIFICATIONS_NO_EXPERIENCE_ID',\n \"No experienceId or projectId found. If one or the other can't be inferred from the manifest (eg. in bare workflow), you have to pass one in yourself.\"\n );\n }\n\n const applicationId = options.applicationId || Application.applicationId;\n if (!applicationId) {\n throw new CodedError(\n 'ERR_NOTIFICATIONS_NO_APPLICATION_ID',\n \"No applicationId found. If it can't be inferred from native configuration by expo-application, you have to pass it in yourself.\"\n );\n }\n const type = options.type || getTypeOfToken(devicePushToken);\n const development = options.development || (await shouldUseDevelopmentNotificationService());\n\n const baseUrl = options.baseUrl ?? productionBaseUrl;\n const url = options.url ?? `${baseUrl}push/getExpoPushToken`;\n\n const body = {\n type,\n deviceId: deviceId.toLowerCase(),\n development,\n appId: applicationId,\n deviceToken: getDeviceToken(devicePushToken),\n ...(projectId ? { projectId } : { experienceId }),\n };\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n body: JSON.stringify(body),\n }).catch((error) => {\n throw new CodedError(\n 'ERR_NOTIFICATIONS_NETWORK_ERROR',\n `Error encountered while fetching Expo token: ${error}.`\n );\n });\n\n if (!response.ok) {\n const statusInfo = response.statusText || response.status;\n let body: string | undefined = undefined;\n try {\n body = await response.text();\n } catch {\n // do nothing\n }\n throw new CodedError(\n 'ERR_NOTIFICATIONS_SERVER_ERROR',\n `Error encountered while fetching Expo token, expected an OK response, received: ${statusInfo} (body: \"${body}\").`\n );\n }\n\n const expoPushToken = getExpoPushToken(await parseResponse(response));\n\n try {\n if (options.url || options.baseUrl) {\n console.debug(\n `[expo-notifications] Since the URL endpoint to register in has been customized in the options, expo-notifications won't try to auto-update the device push token on the server.`\n );\n } else {\n await setAutoServerRegistrationEnabledAsync(true);\n }\n } catch (e) {\n console.warn(\n '[expo-notifications] Could not enable automatically registering new device tokens with the Expo notification service',\n e\n );\n }\n\n return {\n type: 'expo',\n data: expoPushToken,\n };\n}\n\nasync function parseResponse(response: Response) {\n try {\n return await response.json();\n } catch {\n try {\n throw new CodedError(\n 'ERR_NOTIFICATIONS_SERVER_ERROR',\n `Expected a JSON response from server when fetching Expo token, received body: ${JSON.stringify(\n await response.text()\n )}.`\n );\n } catch {\n throw new CodedError(\n 'ERR_NOTIFICATIONS_SERVER_ERROR',\n `Expected a JSON response from server when fetching Expo token, received response: ${JSON.stringify(\n response\n )}.`\n );\n }\n }\n}\n\nfunction getExpoPushToken(data: any) {\n if (\n !data ||\n !(typeof data === 'object') ||\n !data.data ||\n !(typeof data.data === 'object') ||\n !data.data.expoPushToken ||\n !(typeof data.data.expoPushToken === 'string')\n ) {\n throw new CodedError(\n 'ERR_NOTIFICATIONS_SERVER_ERROR',\n `Malformed response from server, expected \"{ data: { expoPushToken: string } }\", received: ${JSON.stringify(\n data,\n null,\n 2\n )}.`\n );\n }\n\n return data.data.expoPushToken as string;\n}\n\n// Same as in DevicePushTokenAutoRegistration\nasync function getDeviceIdAsync() {\n try {\n if (!ServerRegistrationModule.getInstallationIdAsync) {\n throw new UnavailabilityError('ExpoServerRegistrationModule', 'getInstallationIdAsync');\n }\n\n return await ServerRegistrationModule.getInstallationIdAsync();\n } catch (e) {\n throw new CodedError(\n 'ERR_NOTIF_DEVICE_ID',\n `Could not have fetched installation ID of the application: ${e}.`\n );\n }\n}\n\nfunction getDeviceToken(devicePushToken: DevicePushToken) {\n if (typeof devicePushToken.data === 'string') {\n return devicePushToken.data;\n }\n\n return JSON.stringify(devicePushToken.data);\n}\n\n// Same as in DevicePushTokenAutoRegistration\nasync function shouldUseDevelopmentNotificationService() {\n if (Platform.OS === 'ios') {\n try {\n const notificationServiceEnvironment =\n await Application.getIosPushNotificationServiceEnvironmentAsync();\n if (notificationServiceEnvironment === 'development') {\n return true;\n }\n } catch {\n // We can't do anything here, we'll fallback to false then.\n }\n }\n\n return false;\n}\n\n// Same as in DevicePushTokenAutoRegistration\nfunction getTypeOfToken(devicePushToken: DevicePushToken) {\n switch (devicePushToken.type) {\n case 'ios':\n return 'apns';\n case 'android':\n return 'fcm';\n // This probably will error on server, but let's make this function future-safe.\n default:\n return devicePushToken.type;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"getExpoPushTokenAsync.js","sourceRoot":"","sources":["../src/getExpoPushTokenAsync.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Application from 'expo-application';\nimport Constants from 'expo-constants';\nimport { Platform, CodedError, UnavailabilityError } from 'expo-modules-core';\n\nimport { setAutoServerRegistrationEnabledAsync } from './DevicePushTokenAutoRegistration.fx';\nimport ServerRegistrationModule from './ServerRegistrationModule';\nimport { DevicePushToken, ExpoPushToken, ExpoPushTokenOptions } from './Tokens.types';\nimport getDevicePushTokenAsync from './getDevicePushTokenAsync';\n\nconst productionBaseUrl = 'https://exp.host/--/api/v2/';\n\n/**\n * Returns an Expo token that can be used to send a push notification to the device using Expo's push notifications service.\n *\n * This method makes requests to the Expo's servers. It can get rejected in cases where the request itself fails\n * (for example, due to the device being offline, experiencing a network timeout, or other HTTPS request failures).\n * To provide offline support to your users, you should `try/catch` this method and implement retry logic to attempt\n * to get the push token later, once the device is back online.\n *\n * > For Expo's backend to be able to send notifications to your app, you will need to provide it with push notification keys.\n * For more information, see [credentials](/push-notifications/push-notifications-setup/#get-credentials-for-development-builds) in the push notifications setup.\n *\n * @param options Object allowing you to pass in push notification configuration.\n * @return Returns a `Promise` that resolves to an object representing acquired push token.\n * @header fetch\n *\n * @example\n * ```ts\n * import * as Notifications from 'expo-notifications';\n *\n * export async function registerForPushNotificationsAsync(userId: string) {\n * const expoPushToken = await Notifications.getExpoPushTokenAsync({\n * projectId: 'your-project-id',\n * });\n *\n * await fetch('https://example.com/', {\n * method: 'POST',\n * headers: {\n * 'Content-Type': 'application/json',\n * },\n * body: JSON.stringify({\n * userId,\n * expoPushToken,\n * }),\n * });\n * }\n * ```\n */\nexport default async function getExpoPushTokenAsync(\n options: ExpoPushTokenOptions = {}\n): Promise<ExpoPushToken> {\n const devicePushToken = options.devicePushToken || (await getDevicePushTokenAsync());\n\n const deviceId = options.deviceId || (await getDeviceIdAsync());\n const projectId = options.projectId || Constants.easConfig?.projectId;\n\n if (!projectId) {\n console.warn(\n 'Calling getExpoPushTokenAsync without specifying a projectId is deprecated and will no longer be supported in SDK 49+'\n );\n }\n\n if (!projectId) {\n throw new CodedError(\n 'ERR_NOTIFICATIONS_NO_EXPERIENCE_ID',\n \"No 'projectId' found. If 'projectId' can't be inferred from the manifest (eg. in bare workflow), you have to pass it in yourself.\"\n );\n }\n\n const applicationId = options.applicationId || Application.applicationId;\n if (!applicationId) {\n throw new CodedError(\n 'ERR_NOTIFICATIONS_NO_APPLICATION_ID',\n \"No applicationId found. If it can't be inferred from native configuration by expo-application, you have to pass it in yourself.\"\n );\n }\n const type = options.type || getTypeOfToken(devicePushToken);\n const development = options.development || (await shouldUseDevelopmentNotificationService());\n\n const baseUrl = options.baseUrl ?? productionBaseUrl;\n const url = options.url ?? `${baseUrl}push/getExpoPushToken`;\n\n const body = {\n type,\n deviceId: deviceId.toLowerCase(),\n development,\n appId: applicationId,\n deviceToken: getDeviceToken(devicePushToken),\n projectId,\n };\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'content-type': 'application/json',\n },\n body: JSON.stringify(body),\n }).catch((error) => {\n throw new CodedError(\n 'ERR_NOTIFICATIONS_NETWORK_ERROR',\n `Error encountered while fetching Expo token: ${error}.`\n );\n });\n\n if (!response.ok) {\n const statusInfo = response.statusText || response.status;\n let body: string | undefined = undefined;\n try {\n body = await response.text();\n } catch {\n // do nothing\n }\n throw new CodedError(\n 'ERR_NOTIFICATIONS_SERVER_ERROR',\n `Error encountered while fetching Expo token, expected an OK response, received: ${statusInfo} (body: \"${body}\").`\n );\n }\n\n const expoPushToken = getExpoPushToken(await parseResponse(response));\n\n try {\n if (options.url || options.baseUrl) {\n console.debug(\n `[expo-notifications] Since the URL endpoint to register in has been customized in the options, expo-notifications won't try to auto-update the device push token on the server.`\n );\n } else {\n await setAutoServerRegistrationEnabledAsync(true);\n }\n } catch (e) {\n console.warn(\n '[expo-notifications] Could not enable automatically registering new device tokens with the Expo notification service',\n e\n );\n }\n\n return {\n type: 'expo',\n data: expoPushToken,\n };\n}\n\nasync function parseResponse(response: Response) {\n try {\n return await response.json();\n } catch {\n try {\n throw new CodedError(\n 'ERR_NOTIFICATIONS_SERVER_ERROR',\n `Expected a JSON response from server when fetching Expo token, received body: ${JSON.stringify(\n await response.text()\n )}.`\n );\n } catch {\n throw new CodedError(\n 'ERR_NOTIFICATIONS_SERVER_ERROR',\n `Expected a JSON response from server when fetching Expo token, received response: ${JSON.stringify(\n response\n )}.`\n );\n }\n }\n}\n\nfunction getExpoPushToken(data: any) {\n if (\n !data ||\n !(typeof data === 'object') ||\n !data.data ||\n !(typeof data.data === 'object') ||\n !data.data.expoPushToken ||\n !(typeof data.data.expoPushToken === 'string')\n ) {\n throw new CodedError(\n 'ERR_NOTIFICATIONS_SERVER_ERROR',\n `Malformed response from server, expected \"{ data: { expoPushToken: string } }\", received: ${JSON.stringify(\n data,\n null,\n 2\n )}.`\n );\n }\n\n return data.data.expoPushToken as string;\n}\n\n// Same as in DevicePushTokenAutoRegistration\nasync function getDeviceIdAsync() {\n try {\n if (!ServerRegistrationModule.getInstallationIdAsync) {\n throw new UnavailabilityError('ExpoServerRegistrationModule', 'getInstallationIdAsync');\n }\n\n return await ServerRegistrationModule.getInstallationIdAsync();\n } catch (e) {\n throw new CodedError(\n 'ERR_NOTIF_DEVICE_ID',\n `Could not have fetched installation ID of the application: ${e}.`\n );\n }\n}\n\nfunction getDeviceToken(devicePushToken: DevicePushToken) {\n if (typeof devicePushToken.data === 'string') {\n return devicePushToken.data;\n }\n\n return JSON.stringify(devicePushToken.data);\n}\n\n// Same as in DevicePushTokenAutoRegistration\nasync function shouldUseDevelopmentNotificationService() {\n if (Platform.OS === 'ios') {\n try {\n const notificationServiceEnvironment =\n await Application.getIosPushNotificationServiceEnvironmentAsync();\n if (notificationServiceEnvironment === 'development') {\n return true;\n }\n } catch {\n // We can't do anything here, we'll fallback to false then.\n }\n }\n\n return false;\n}\n\n// Same as in DevicePushTokenAutoRegistration\nfunction getTypeOfToken(devicePushToken: DevicePushToken) {\n switch (devicePushToken.type) {\n case 'ios':\n return 'apns';\n case 'android':\n return 'fcm';\n // This probably will error on server, but let's make this function future-safe.\n default:\n return devicePushToken.type;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo-notifications",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.19.0",
|
|
4
4
|
"description": "Notifications module",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"types": "build/index.d.ts",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
"abort-controller": "^3.0.0",
|
|
43
43
|
"assert": "^2.0.0",
|
|
44
44
|
"badgin": "^1.1.5",
|
|
45
|
-
"expo-application": "~5.
|
|
46
|
-
"expo-constants": "~14.
|
|
45
|
+
"expo-application": "~5.2.0",
|
|
46
|
+
"expo-constants": "~14.3.0",
|
|
47
47
|
"fs-extra": "^9.1.0",
|
|
48
48
|
"uuid": "^3.4.0"
|
|
49
49
|
},
|
|
@@ -57,5 +57,5 @@
|
|
|
57
57
|
"peerDependencies": {
|
|
58
58
|
"expo": "*"
|
|
59
59
|
},
|
|
60
|
-
"gitHead": "
|
|
60
|
+
"gitHead": "4ba50c428c8369bb6b3a51a860d4898ad4ccbe78"
|
|
61
61
|
}
|
package/src/Tokens.types.ts
CHANGED
|
@@ -62,3 +62,49 @@ export interface ExpoPushToken {
|
|
|
62
62
|
*/
|
|
63
63
|
data: string;
|
|
64
64
|
}
|
|
65
|
+
|
|
66
|
+
export interface ExpoPushTokenOptions {
|
|
67
|
+
/**
|
|
68
|
+
* Endpoint URL override.
|
|
69
|
+
*/
|
|
70
|
+
baseUrl?: string;
|
|
71
|
+
/**
|
|
72
|
+
* Request URL override.
|
|
73
|
+
*/
|
|
74
|
+
url?: string;
|
|
75
|
+
/**
|
|
76
|
+
* Request body override.
|
|
77
|
+
*/
|
|
78
|
+
type?: string;
|
|
79
|
+
// @missingDocs
|
|
80
|
+
deviceId?: string;
|
|
81
|
+
/**
|
|
82
|
+
* Makes sense only on iOS, where there are two push notification services: "sandbox" and "production".
|
|
83
|
+
* This defines whether the push token is supposed to be used with the sandbox platform notification service.
|
|
84
|
+
* Defaults to [`Application.getIosPushNotificationServiceEnvironmentAsync()`](./application/#applicationgetiospushnotificationserviceenvironmentasync)
|
|
85
|
+
* exposed by `expo-application` or `false`. Most probably you won't need to customize that.
|
|
86
|
+
* You may want to customize that if you don't want to install `expo-application` and still use the sandbox APNs.
|
|
87
|
+
* @platform ios
|
|
88
|
+
*/
|
|
89
|
+
development?: boolean;
|
|
90
|
+
/**
|
|
91
|
+
* The ID of the project to which the token should be attributed.
|
|
92
|
+
* Defaults to [`Constants.expoConfig.extra.eas.projectId`](./constants/#easconfig) exposed by `expo-constants`.
|
|
93
|
+
*
|
|
94
|
+
* When using EAS Build, this value is automatically set. However, it is
|
|
95
|
+
* **recommended** to set it manually. Once you have EAS Build configured, you can find
|
|
96
|
+
* the value in **app.json** under `extra.eas.projectId`. You can copy and paste it into your code.
|
|
97
|
+
* If you are not using EAS Build, it will fallback to [`Constants.expoConfig?.extra?.eas?.projectId`](./constants/#manifest).
|
|
98
|
+
*/
|
|
99
|
+
projectId?: string;
|
|
100
|
+
/**
|
|
101
|
+
* The ID of the application to which the token should be attributed.
|
|
102
|
+
* Defaults to [`Application.applicationId`](./application/#applicationapplicationid) exposed by `expo-application`.
|
|
103
|
+
*/
|
|
104
|
+
applicationId?: string;
|
|
105
|
+
/**
|
|
106
|
+
* The device push token with which to register at the backend.
|
|
107
|
+
* Defaults to a token fetched with [`getDevicePushTokenAsync()`](#getdevicepushtokenasync).
|
|
108
|
+
*/
|
|
109
|
+
devicePushToken?: DevicePushToken;
|
|
110
|
+
}
|
|
@@ -4,61 +4,11 @@ import { Platform, CodedError, UnavailabilityError } from 'expo-modules-core';
|
|
|
4
4
|
|
|
5
5
|
import { setAutoServerRegistrationEnabledAsync } from './DevicePushTokenAutoRegistration.fx';
|
|
6
6
|
import ServerRegistrationModule from './ServerRegistrationModule';
|
|
7
|
-
import { DevicePushToken, ExpoPushToken } from './Tokens.types';
|
|
7
|
+
import { DevicePushToken, ExpoPushToken, ExpoPushTokenOptions } from './Tokens.types';
|
|
8
8
|
import getDevicePushTokenAsync from './getDevicePushTokenAsync';
|
|
9
9
|
|
|
10
10
|
const productionBaseUrl = 'https://exp.host/--/api/v2/';
|
|
11
11
|
|
|
12
|
-
interface Options {
|
|
13
|
-
/**
|
|
14
|
-
* Endpoint URL override.
|
|
15
|
-
*/
|
|
16
|
-
baseUrl?: string;
|
|
17
|
-
/**
|
|
18
|
-
* Request URL override.
|
|
19
|
-
*/
|
|
20
|
-
url?: string;
|
|
21
|
-
/**
|
|
22
|
-
* Request body override.
|
|
23
|
-
*/
|
|
24
|
-
type?: string;
|
|
25
|
-
// @missingDocs
|
|
26
|
-
deviceId?: string;
|
|
27
|
-
/**
|
|
28
|
-
* Makes sense only on iOS, where there are two push notification services: "sandbox" and "production".
|
|
29
|
-
* This defines whether the push token is supposed to be used with the sandbox platform notification service.
|
|
30
|
-
* Defaults to [`Application.getIosPushNotificationServiceEnvironmentAsync()`](/application/#applicationgetiospushnotificationserviceenvironmentasync)
|
|
31
|
-
* exposed by `expo-application` or `false`. Most probably you won't need to customize that.
|
|
32
|
-
* You may want to customize that if you don't want to install `expo-application` and still use the sandbox APNs.
|
|
33
|
-
* @platform ios
|
|
34
|
-
*/
|
|
35
|
-
development?: boolean;
|
|
36
|
-
/**
|
|
37
|
-
* @deprecated Use `projectId` instead.
|
|
38
|
-
* The ID of the experience to which the token should be attributed.
|
|
39
|
-
* Defaults to [`Constants.manifest.id`](/constants/#constantsmanifest) exposed by `expo-constants`.
|
|
40
|
-
* When building with EAS Build, or in the bare workflow, **this is required** and you must provide a value which takes the shape `@username/projectSlug`,
|
|
41
|
-
* where `username` is the Expo account that the project is associated with, and `projectSlug` is your [`slug`](/config/app.mdx#slug) from Expo config.
|
|
42
|
-
*/
|
|
43
|
-
experienceId?: string;
|
|
44
|
-
/**
|
|
45
|
-
* The ID of the project to which the token should be attributed.
|
|
46
|
-
* Defaults to [`Constants.expoConfig.extra.eas.projectId`](/constants/#easconfig) exposed by `expo-constants`.
|
|
47
|
-
* If you are not using EAS Build, it will fallback to [`Constants.manifest.projectId`](/constants/#constantsmanifest).
|
|
48
|
-
*/
|
|
49
|
-
projectId?: string;
|
|
50
|
-
/**
|
|
51
|
-
* The ID of the application to which the token should be attributed.
|
|
52
|
-
* Defaults to [`Application.applicationId`](/application/#applicationapplicationid) exposed by `expo-application`.
|
|
53
|
-
*/
|
|
54
|
-
applicationId?: string;
|
|
55
|
-
/**
|
|
56
|
-
* The device push token with which to register at the backend.
|
|
57
|
-
* Defaults to a token fetched with [`getDevicePushTokenAsync()`](#getdevicepushtokenasync-devicepushtoken).
|
|
58
|
-
*/
|
|
59
|
-
devicePushToken?: DevicePushToken;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
12
|
/**
|
|
63
13
|
* Returns an Expo token that can be used to send a push notification to the device using Expo's push notifications service.
|
|
64
14
|
*
|
|
@@ -80,7 +30,7 @@ interface Options {
|
|
|
80
30
|
*
|
|
81
31
|
* export async function registerForPushNotificationsAsync(userId: string) {
|
|
82
32
|
* const expoPushToken = await Notifications.getExpoPushTokenAsync({
|
|
83
|
-
*
|
|
33
|
+
* projectId: 'your-project-id',
|
|
84
34
|
* });
|
|
85
35
|
*
|
|
86
36
|
* await fetch('https://example.com/', {
|
|
@@ -96,18 +46,13 @@ interface Options {
|
|
|
96
46
|
* }
|
|
97
47
|
* ```
|
|
98
48
|
*/
|
|
99
|
-
export default async function getExpoPushTokenAsync(
|
|
49
|
+
export default async function getExpoPushTokenAsync(
|
|
50
|
+
options: ExpoPushTokenOptions = {}
|
|
51
|
+
): Promise<ExpoPushToken> {
|
|
100
52
|
const devicePushToken = options.devicePushToken || (await getDevicePushTokenAsync());
|
|
101
53
|
|
|
102
54
|
const deviceId = options.deviceId || (await getDeviceIdAsync());
|
|
103
|
-
|
|
104
|
-
const experienceId =
|
|
105
|
-
options.experienceId || Constants.expoConfig?.originalFullName || Constants.manifest?.id;
|
|
106
|
-
|
|
107
|
-
const projectId =
|
|
108
|
-
options.projectId ||
|
|
109
|
-
Constants.expoConfig?.extra?.eas?.projectId ||
|
|
110
|
-
Constants.manifest?.projectId;
|
|
55
|
+
const projectId = options.projectId || Constants.easConfig?.projectId;
|
|
111
56
|
|
|
112
57
|
if (!projectId) {
|
|
113
58
|
console.warn(
|
|
@@ -115,10 +60,10 @@ export default async function getExpoPushTokenAsync(options: Options = {}): Prom
|
|
|
115
60
|
);
|
|
116
61
|
}
|
|
117
62
|
|
|
118
|
-
if (!
|
|
63
|
+
if (!projectId) {
|
|
119
64
|
throw new CodedError(
|
|
120
65
|
'ERR_NOTIFICATIONS_NO_EXPERIENCE_ID',
|
|
121
|
-
"No
|
|
66
|
+
"No 'projectId' found. If 'projectId' can't be inferred from the manifest (eg. in bare workflow), you have to pass it in yourself."
|
|
122
67
|
);
|
|
123
68
|
}
|
|
124
69
|
|
|
@@ -141,7 +86,7 @@ export default async function getExpoPushTokenAsync(options: Options = {}): Prom
|
|
|
141
86
|
development,
|
|
142
87
|
appId: applicationId,
|
|
143
88
|
deviceToken: getDeviceToken(devicePushToken),
|
|
144
|
-
|
|
89
|
+
projectId,
|
|
145
90
|
};
|
|
146
91
|
|
|
147
92
|
const response = await fetch(url, {
|