From 56a1b756c37ec48aef0fa3169864c88fcc29610e Mon Sep 17 00:00:00 2001 From: Fadi George Date: Mon, 8 Jun 2026 15:16:55 -0700 Subject: [PATCH 1/2] feat(android/ios): add option to disable location module --- README.md | 18 ++++++++++++ android/build.gradle | 28 +++++++++++++++++-- .../rnonesignalandroid/RNOneSignal.java | 25 +++++++++++++++-- react-native-onesignal.podspec | 9 +++++- 4 files changed, 74 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index cc4264e4..49aaa3f6 100755 --- a/README.md +++ b/README.md @@ -31,6 +31,24 @@ If you run into any challenges or have concerns, please contact our support team See the [Setup Guide](https://documentation.onesignal.com/docs/react-native-sdk-setup) for setup instructions. +#### Disable Location Module + +By default, `react-native-onesignal` includes OneSignal's native location module so `OneSignal.Location` works without extra setup. If your app does not use location features, you can exclude the native location module from iOS and Android builds. + +In your iOS `Podfile`, set this before React Native installs native modules: + +```ruby +$OneSignalDisableLocation = true +``` + +In your Android `gradle.properties`, set: + +```properties +OneSignal_disableLocation=true +``` + +When disabled, `OneSignal.Location.requestPermission()` and `OneSignal.Location.setShared()` no-op on native builds without the location module, and `OneSignal.Location.isShared()` resolves `false`. + #### Change Log See this repository's [release tags](https://github.com/OneSignal/react-native-onesignal/releases) for a complete change log of every released version. diff --git a/android/build.gradle b/android/build.gradle index 1df305bf..e43cc2f4 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -5,6 +5,18 @@ def safeExtGet(prop, fallback) { rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback } +def safePropGet(prop, fallback) { + if (rootProject.ext.has(prop)) { + return rootProject.ext.get(prop) + } + + def value = rootProject.findProperty(prop) + return value != null ? value : fallback +} + +def oneSignalVersion = '5.9.3' +def oneSignalDisableLocation = safePropGet('OneSignal_disableLocation', false).toString().toBoolean() + android { namespace "com.onesignal.rnonesignalandroid" compileSdkVersion safeExtGet('compileSdkVersion', 34) @@ -33,8 +45,20 @@ dependencies { // Exclude OkHttp from OneSignal's transitive deps: the otel module pulls in OkHttp 5.x // (via opentelemetry-exporter-sender-okhttp) which is binary-incompatible with React Native's // networking stack (okhttp3.internal.Util removed in 5.x). React Native already provides OkHttp 4.x. - api('com.onesignal:OneSignal:5.9.3') { - exclude group: 'com.squareup.okhttp3', module: 'okhttp' + if (oneSignalDisableLocation) { + api("com.onesignal:core:${oneSignalVersion}") { + exclude group: 'com.squareup.okhttp3', module: 'okhttp' + } + api("com.onesignal:notifications:${oneSignalVersion}") { + exclude group: 'com.squareup.okhttp3', module: 'okhttp' + } + api("com.onesignal:in-app-messages:${oneSignalVersion}") { + exclude group: 'com.squareup.okhttp3', module: 'okhttp' + } + } else { + api("com.onesignal:OneSignal:${oneSignalVersion}") { + exclude group: 'com.squareup.okhttp3', module: 'okhttp' + } } testImplementation 'junit:junit:4.12' diff --git a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java index ea4e4c61..ef04640e 100644 --- a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java @@ -79,6 +79,8 @@ public class RNOneSignal extends NativeOneSignalSpec LifecycleEventListener, INotificationLifecycleListener { public static final String NAME = "OneSignal"; + private static final String LOCATION_MODULE_NOT_AVAILABLE = + "OneSignal location module is not available. Add the location dependency to use OneSignal.Location."; private boolean oneSignalInitDone; private boolean hasSetPermissionObserver = false; @@ -166,6 +168,10 @@ private void logJSONException(String eventName, JSONException exception) { Logging.error("Failed to serialize payload for " + eventName, exception); } + private void logLocationModuleNotAvailable(Exception exception) { + Logging.error(LOCATION_MODULE_NOT_AVAILABLE, exception); + } + private void removeObservers() { if (!oneSignalInitDone) { Logging.debug("OneSignal React-Native SDK not initialized yet. Could not remove observers.", null); @@ -322,17 +328,30 @@ public void clearTriggers() { @Override public void requestLocationPermission() { - OneSignal.getLocation().requestPermission(Continue.none()); + try { + OneSignal.getLocation().requestPermission(Continue.none()); + } catch (Exception e) { + logLocationModuleNotAvailable(e); + } } @Override public void isLocationShared(Promise promise) { - promise.resolve(OneSignal.getLocation().isShared()); + try { + promise.resolve(OneSignal.getLocation().isShared()); + } catch (Exception e) { + logLocationModuleNotAvailable(e); + promise.resolve(false); + } } @Override public void setLocationShared(boolean shared) { - OneSignal.getLocation().setShared(shared); + try { + OneSignal.getLocation().setShared(shared); + } catch (Exception e) { + logLocationModuleNotAvailable(e); + } } @Override diff --git a/react-native-onesignal.podspec b/react-native-onesignal.podspec index 8bc58883..56c39992 100644 --- a/react-native-onesignal.podspec +++ b/react-native-onesignal.podspec @@ -1,5 +1,7 @@ require 'json' package_json = JSON.parse(File.read('package.json')) +onesignal_xcframework_version = '5.5.2' +onesignal_disable_location = defined?($OneSignalDisableLocation) && $OneSignalDisableLocation == true Pod::Spec.new do |s| s.name = "react-native-onesignal" @@ -15,5 +17,10 @@ Pod::Spec.new do |s| install_modules_dependencies(s) - s.dependency 'OneSignalXCFramework', '5.5.2' + if onesignal_disable_location + s.dependency 'OneSignalXCFramework/OneSignal', onesignal_xcframework_version + s.dependency 'OneSignalXCFramework/OneSignalInAppMessages', onesignal_xcframework_version + else + s.dependency 'OneSignalXCFramework', onesignal_xcframework_version + end end From cf7a2d066f1ae8b7343d1c9284f0ed04e4bd854e Mon Sep 17 00:00:00 2001 From: Fadi George Date: Tue, 9 Jun 2026 14:13:33 -0700 Subject: [PATCH 2/2] fix: [SDK-4728] catch missing location module linkage errors Catch Throwable around optional location bridge calls so missing native location module linkage errors such as NoClassDefFoundError degrade gracefully instead of escaping the bridge. Co-authored-by: Cursor --- .../rnonesignalandroid/RNOneSignal.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java index ef04640e..5167ba6e 100644 --- a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java @@ -168,8 +168,8 @@ private void logJSONException(String eventName, JSONException exception) { Logging.error("Failed to serialize payload for " + eventName, exception); } - private void logLocationModuleNotAvailable(Exception exception) { - Logging.error(LOCATION_MODULE_NOT_AVAILABLE, exception); + private void logLocationModuleNotAvailable(Throwable throwable) { + Logging.error(LOCATION_MODULE_NOT_AVAILABLE, throwable); } private void removeObservers() { @@ -330,8 +330,8 @@ public void clearTriggers() { public void requestLocationPermission() { try { OneSignal.getLocation().requestPermission(Continue.none()); - } catch (Exception e) { - logLocationModuleNotAvailable(e); + } catch (Throwable t) { + logLocationModuleNotAvailable(t); } } @@ -339,8 +339,8 @@ public void requestLocationPermission() { public void isLocationShared(Promise promise) { try { promise.resolve(OneSignal.getLocation().isShared()); - } catch (Exception e) { - logLocationModuleNotAvailable(e); + } catch (Throwable t) { + logLocationModuleNotAvailable(t); promise.resolve(false); } } @@ -349,8 +349,8 @@ public void isLocationShared(Promise promise) { public void setLocationShared(boolean shared) { try { OneSignal.getLocation().setShared(shared); - } catch (Exception e) { - logLocationModuleNotAvailable(e); + } catch (Throwable t) { + logLocationModuleNotAvailable(t); } }