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..5167ba6e 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(Throwable throwable) { + Logging.error(LOCATION_MODULE_NOT_AVAILABLE, throwable); + } + 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 (Throwable t) { + logLocationModuleNotAvailable(t); + } } @Override public void isLocationShared(Promise promise) { - promise.resolve(OneSignal.getLocation().isShared()); + try { + promise.resolve(OneSignal.getLocation().isShared()); + } catch (Throwable t) { + logLocationModuleNotAvailable(t); + promise.resolve(false); + } } @Override public void setLocationShared(boolean shared) { - OneSignal.getLocation().setShared(shared); + try { + OneSignal.getLocation().setShared(shared); + } catch (Throwable t) { + logLocationModuleNotAvailable(t); + } } @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