diff --git a/Apps/APN/src/screens/Settings.js b/Apps/APN/src/screens/Settings.js index ab190cbb..371a5a67 100644 --- a/Apps/APN/src/screens/Settings.js +++ b/Apps/APN/src/screens/Settings.js @@ -27,6 +27,7 @@ import { useCustomerIoSdkContext } from '../state/customerIoSdkState'; import { useUserStateContext } from '../state/userState'; import { resetRoute } from '../utils/navigation'; import Prompts from '../utils/prompts'; +import { CustomerIO } from 'customerio-reactnative'; const Settings = ({ navigation, route }) => { const { params } = route; @@ -85,6 +86,14 @@ const Settings = ({ navigation, route }) => { ); useEffect(() => { + CustomerIO.pushMessaging() + .getRegisteredDeviceToken() + .then((token) => { + setDeviceToken(token); + }) + .catch((error) => { + console.log(error); + }); setTrackUrl(initialConfig.trackingUrl); setSiteId(initialSiteId ?? initialConfig.siteId); setApiKey(initialApiKey ?? initialConfig.apiKey); diff --git a/Apps/FCM/src/screens/Settings.tsx b/Apps/FCM/src/screens/Settings.tsx index 37f7dc3b..8a142750 100644 --- a/Apps/FCM/src/screens/Settings.tsx +++ b/Apps/FCM/src/screens/Settings.tsx @@ -26,6 +26,7 @@ import { useCustomerIoSdkContext } from '../state/customerIoSdkState'; import { useUserStateContext } from '../state/userState'; import { resetRoute } from '../utils/navigation'; import Prompts from '../utils/prompts'; +import { CustomerIO } from 'customerio-reactnative'; interface SettingsProps { navigation: NavigationProp; @@ -97,6 +98,14 @@ const Settings: React.FC = ({ navigation, route }) => { } }; + CustomerIO.pushMessaging() + .getRegisteredDeviceToken() + .then((token) => { + setDeviceToken(token); + }) + .catch((error) => { + console.log(error); + }); setValueIfPresent(initialConfig?.trackingUrl, setTrackUrl); setValueIfPresent(initialSiteId ?? initialConfig?.siteId, setSiteId); setValueIfPresent(initialApiKey ?? initialConfig?.apiKey, setApiKey); diff --git a/android/src/main/java/io/customer/reactnative/sdk/messagingpush/RNCIOPushMessaging.kt b/android/src/main/java/io/customer/reactnative/sdk/messagingpush/RNCIOPushMessaging.kt index 4202e66c..2d0f7e92 100644 --- a/android/src/main/java/io/customer/reactnative/sdk/messagingpush/RNCIOPushMessaging.kt +++ b/android/src/main/java/io/customer/reactnative/sdk/messagingpush/RNCIOPushMessaging.kt @@ -114,6 +114,27 @@ class RNCIOPushMessaging( } } + /** + * Get the registered device token for the app. + * @returns Promise with device token as a string, or error if no token is + * registered or the method fails to fetch token. + */ + @ReactMethod + fun getRegisteredDeviceToken(promise: Promise) { + try { + // Get the device token from SDK + val deviceToken: String? = CustomerIO.instance().registeredDeviceToken + + if (deviceToken != null) { + promise.resolve(deviceToken) + } else { + promise.reject("device_token_not_found", "The device token is not available.") + } + } catch (e: Exception) { + promise.reject("error_getting_device_token", "Error fetching registered device token.", e) + } + } + /** * Checks current permission of push notification permission */ diff --git a/ios/CustomerioPushMessaging.m b/ios/CustomerioPushMessaging.m index e3a367c9..ba8dd08a 100644 --- a/ios/CustomerioPushMessaging.m +++ b/ios/CustomerioPushMessaging.m @@ -6,4 +6,8 @@ @interface RCT_EXTERN_MODULE(CustomerioPushMessaging, NSObject) RCT_EXTERN_METHOD(trackNotificationReceived : (nonnull NSDictionary *) payload]) +RCT_EXTERN_METHOD(getRegisteredDeviceToken: (RCTPromiseResolveBlock) resolver + rejecter:(RCTPromiseRejectBlock)rejecter) + + @end diff --git a/ios/CustomerioPushMessaging.swift b/ios/CustomerioPushMessaging.swift index 68f52727..ed6f02a0 100644 --- a/ios/CustomerioPushMessaging.swift +++ b/ios/CustomerioPushMessaging.swift @@ -1,5 +1,6 @@ import Foundation import CioInternalCommon +import CioTracking import CioMessagingPush @@ -22,7 +23,18 @@ class CustomerioPushMessaging: NSObject { trackPushMetrics(payload: payload, event: .delivered) } - + + // Get the currently registered device token for the app + @objc(getRegisteredDeviceToken:rejecter:) + func getRegisteredDeviceToken(resolver resolve: @escaping(RCTPromiseResolveBlock), rejecter reject: @escaping(RCTPromiseRejectBlock)) -> Void { + + guard let token = CustomerIO.shared.registeredDeviceToken else { + reject(CustomerioConstants.cioTag, CustomerioConstants.showDeviceTokenFailureError, nil) + return + } + resolve(token) + } + private func trackPushMetrics(payload: NSDictionary, event : Metric) { guard let deliveryId = payload[CustomerioConstants.CioDeliveryId] as? String, let deviceToken = payload[CustomerioConstants.CioDeliveryToken] as? String else {return} diff --git a/ios/constants/CustomerioConstants.swift b/ios/constants/CustomerioConstants.swift index 0c556211..140a3a96 100644 --- a/ios/constants/CustomerioConstants.swift +++ b/ios/constants/CustomerioConstants.swift @@ -33,7 +33,7 @@ struct CustomerioConstants { static let cioTag = "[CIO]" static let showPromptFailureError = "Error requesting push notification permission." - + static let showDeviceTokenFailureError = "Error fetching registered device token." static let platformiOS = "ios" static let sound = "sound" static let badge = "badge" diff --git a/package.json b/package.json index 144697ff..c4cbcd8b 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "react-native": "src/index", "source": "src/index", "expoVersion": "", - "cioNativeiOSSdkVersion": "= 2.8.5", + "cioNativeiOSSdkVersion": "= 2.9.0", "files": [ "src", "lib", diff --git a/src/CustomerIOPushMessaging.tsx b/src/CustomerIOPushMessaging.tsx index c5ed1533..f038f040 100644 --- a/src/CustomerIOPushMessaging.tsx +++ b/src/CustomerIOPushMessaging.tsx @@ -91,6 +91,15 @@ class CustomerIOPushMessaging { PushMessagingNative.trackNotificationReceived(payload); } + /** + * Get the registered device token for the app. + * @returns Promise with device token as a string, or error if no token is + * registered or the method fails to fetch token. + */ + getRegisteredDeviceToken(): Promise { + return PushMessagingNative.getRegisteredDeviceToken(); + } + isAndroid(): boolean { return Platform.OS == 'android'; }