diff --git a/.github/actions/setup-demo/action.yml b/.github/actions/setup-demo/action.yml index e6ed1c47..708be879 100644 --- a/.github/actions/setup-demo/action.yml +++ b/.github/actions/setup-demo/action.yml @@ -20,9 +20,6 @@ runs: cache: true run-install: true - - name: Set up Bun - uses: oven-sh/setup-bun@v2 - - name: Cache bun dependencies uses: actions/cache@v5 with: @@ -34,8 +31,8 @@ runs: shell: bash working-directory: examples/demo run: | - bun run setup - bun install + vp run setup + vp install - name: Cache CocoaPods if: inputs.install-pods == 'true' @@ -48,8 +45,8 @@ runs: - name: Update CocoaPods if: inputs.install-pods == 'true' shell: bash - working-directory: examples/demo - run: bun run update:pods + working-directory: examples/demo/ios + run: pod update OneSignalXCFramework --no-repo-update - name: Create demo .env shell: bash @@ -58,3 +55,4 @@ runs: echo "ONESIGNAL_APP_ID=${{ inputs.onesignal-app-id }}" > .env echo "ONESIGNAL_API_KEY=${{ inputs.onesignal-api-key }}" >> .env echo "E2E_MODE=true" >> .env + echo "ONESIGNAL_ANDROID_CHANNEL_ID=7ec2ece9-c538-4656-9516-1316f48a005c" >> .env diff --git a/.github/workflows/create-release-pr.yml b/.github/workflows/create-release-pr.yml index 17134942..0f49d84f 100644 --- a/.github/workflows/create-release-pr.yml +++ b/.github/workflows/create-release-pr.yml @@ -92,8 +92,8 @@ jobs: # Get versions from target branch (not the release branch) CURRENT_VERSION=$(git show origin/${{ inputs.target_branch }}:package.json | jq -r .version) - ANDROID_VERSION=$(git show origin/${{ inputs.target_branch }}:android/build.gradle | grep "com.onesignal:OneSignal:" | sed -E "s/.*OneSignal:([0-9.]+).*/\1/") - IOS_VERSION=$(git show origin/${{ inputs.target_branch }}:react-native-onesignal.podspec | grep "OneSignalXCFramework" | sed -E "s/.*'([0-9.]+)'.*/\1/") + ANDROID_VERSION=$(git show origin/${{ inputs.target_branch }}:android/build.gradle | grep "com.onesignal:OneSignal:" | sed -E "s/.*OneSignal:([^\"']+).*/\1/") + IOS_VERSION=$(git show origin/${{ inputs.target_branch }}:react-native-onesignal.podspec | grep "OneSignalXCFramework" | sed -E "s/.*'([^']+)'.*/\1/") echo "rn_from=$CURRENT_VERSION" >> $GITHUB_OUTPUT echo "android_from=$ANDROID_VERSION" >> $GITHUB_OUTPUT @@ -105,8 +105,11 @@ jobs: VERSION="${{ inputs.android_version }}" # Validate version exists on GitHub - RELEASE=$(curl -s -H "Authorization: token ${{ github.token }}" \ - "https://api.github.com/repos/OneSignal/OneSignal-Android-SDK/releases/tags/${VERSION}") + # -sf: silent + fail on HTTP >= 400 so RELEASE stays empty + # on 404, otherwise GitHub's JSON error body would defeat the + # `[ -z ]` guard below. + RELEASE=$(curl -sf -H "Authorization: token ${{ github.token }}" \ + "https://api.github.com/repos/OneSignal/OneSignal-Android-SDK/releases/tags/${VERSION}" || true) if [ -z "$RELEASE" ]; then @@ -115,7 +118,7 @@ jobs: fi # Update Android SDK version in build.gradle (handles both api '...' and api('...') syntax) - sed -i '' -E "s/(com\.onesignal:OneSignal:)[0-9.]+/\1$VERSION/" android/build.gradle + sed -i '' -E "s/(com\.onesignal:OneSignal:)[^\"']+/\1$VERSION/" android/build.gradle echo "✓ Updated android/build.gradle with Android SDK ${VERSION}" # Only commit if there are changes @@ -129,8 +132,11 @@ jobs: VERSION="${{ inputs.ios_version }}" # Validate version exists on GitHub - RELEASE=$(curl -s -H "Authorization: token ${{ github.token }}" \ - "https://api.github.com/repos/OneSignal/OneSignal-iOS-SDK/releases/tags/${VERSION}") + # -sf: silent + fail on HTTP >= 400 so RELEASE stays empty + # on 404, otherwise GitHub's JSON error body would defeat the + # `[ -z ]` guard below. + RELEASE=$(curl -sf -H "Authorization: token ${{ github.token }}" \ + "https://api.github.com/repos/OneSignal/OneSignal-iOS-SDK/releases/tags/${VERSION}" || true) if [ -z "$RELEASE" ]; then echo "✗ iOS SDK version ${VERSION} not found" @@ -152,11 +158,54 @@ jobs: # Update package.json version npm pkg set version="$NEW_VERSION" + # Update the wrapper version literal reported to OneSignal's backend. + # Format is MMmmpp (zero-padded major/minor/patch); strip any pre-release suffix. + CORE_VERSION=${NEW_VERSION%%-*} + CORE_VERSION=${CORE_VERSION%%+*} + IFS='.' read -r MAJOR MINOR PATCH <<< "$CORE_VERSION" + PADDED_VERSION=$(printf "%02d%02d%02d" "$MAJOR" "$MINOR" "$PATCH") + + ANDROID_FILE=android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java + sed -i '' -E "s/(OneSignalWrapper\.setSdkVersion\(\")[0-9]+(\"\))/\1${PADDED_VERSION}\2/" "$ANDROID_FILE" + if ! grep -q "OneSignalWrapper.setSdkVersion(\"${PADDED_VERSION}\")" "$ANDROID_FILE"; then + echo "::error::Failed to update wrapper version in ${ANDROID_FILE} to ${PADDED_VERSION}" + exit 1 + fi + echo "✓ Updated RNOneSignal.java wrapper version to ${PADDED_VERSION}" + + IOS_FILE=ios/RCTOneSignal/RCTOneSignal.mm + sed -i '' -E "s/(OneSignalWrapper\.sdkVersion = @\")[0-9]+(\";)/\1${PADDED_VERSION}\2/" "$IOS_FILE" + if ! grep -q "OneSignalWrapper.sdkVersion = @\"${PADDED_VERSION}\";" "$IOS_FILE"; then + echo "::error::Failed to update wrapper version in ${IOS_FILE} to ${PADDED_VERSION}" + exit 1 + fi + echo "✓ Updated RCTOneSignal.mm wrapper version to ${PADDED_VERSION}" + # Only commit if there are changes git add -A git diff --staged --quiet && exit 0 git commit -m "Release $NEW_VERSION" && git push + - name: Refresh demo Podfile.lock + run: | + # Runs after all version edits (package.json + podspec) so the + # repacked SDK tarball and OneSignalXCFramework pin both reflect + # the new release. pod install regenerates Podfile.lock entries + # for the path-based react-native-onesignal pod and any changed + # native pins in a single resolve. + ( + cd examples/demo + vp run setup + cd ios + pod install + ) + echo "✓ Refreshed examples/demo/ios/Podfile.lock" + + # Only commit if there are changes + git add -A + git diff --staged --quiet && exit 0 + git commit -m "Update demo Podfile.lock" && git push + create-pr: needs: [prep, update_version] uses: OneSignal/sdk-shared/.github/workflows/create-release.yml@main diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 68ddb427..889b8137 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -46,15 +46,29 @@ jobs: onesignal-app-id: ${{ vars.APPIUM_ONESIGNAL_APP_ID }} onesignal-api-key: ${{ secrets.APPIUM_ONESIGNAL_API_KEY }} + - name: Resolve OneSignal Android SDK version + id: android-sdk-version + run: | + VERSION=$(grep "com.onesignal:OneSignal:" android/build.gradle | sed -E "s/.*OneSignal:([^\"']+).*/\1/") + echo "version=${VERSION}" >> "$GITHUB_OUTPUT" + + - name: Wait for OneSignal Android SDK on Maven Central + uses: OneSignal/sdk-shared/.github/actions/wait-for-maven-artifact@main + with: + version: ${{ steps.android-sdk-version.outputs.version }} + - name: Build release APK working-directory: examples/demo/android - run: ./gradlew assembleRelease --quiet --console=plain --warning-mode=summary + # -PciSingleAbi → arm64-v8a-only APK (~10 MB) instead of the + # ~30 MB universal APK. BrowserStack devices we test against + # are all arm64-v8a. + run: ./gradlew assembleRelease -PciSingleAbi --quiet --console=plain --warning-mode=summary - name: Upload APK uses: actions/upload-artifact@v7 with: name: demo-apk - path: examples/demo/android/app/build/outputs/apk/release/app-release.apk + path: examples/demo/android/app/build/outputs/apk/release/app-arm64-v8a-release.apk retention-days: 1 compression-level: 0 @@ -139,7 +153,7 @@ jobs: with: platform: android app-artifact: demo-apk - app-filename: app-release.apk + app-filename: app-arm64-v8a-release.apk sdk-type: react-native build-name: react-native-android-${{ github.ref_name }}-${{ github.run_number }} diff --git a/android/build.gradle b/android/build.gradle index 458ec91f..d7c6132b 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -36,10 +36,10 @@ dependencies { // api is used instead of implementation so the parent :app project can access any of the OneSignal Java // classes if needed. Such as com.onesignal.NotificationExtenderService // - // Exclude OkHttp from OneSignal's transitive deps: the 5.7.x otel module pulls in OkHttp 5.x + // 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.7.7') { + api('com.onesignal:OneSignal:5.8.0') { exclude group: 'com.squareup.okhttp3', module: 'okhttp' } diff --git a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java index 4b6a3b0b..8791b5d2 100644 --- a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java @@ -230,7 +230,7 @@ public void invalidate() { @Override public void initialize(String appId) { OneSignalWrapper.setSdkType("reactnative"); - OneSignalWrapper.setSdkVersion("050213"); + OneSignalWrapper.setSdkVersion("050404"); if (oneSignalInitDone) { Logging.debug("Already initialized the OneSignal React-Native SDK", null); diff --git a/examples/demo/.env.example b/examples/demo/.env.example index 19ce21ac..389f07e0 100644 --- a/examples/demo/.env.example +++ b/examples/demo/.env.example @@ -2,3 +2,7 @@ ONESIGNAL_APP_ID=your-onesignal-app-id ONESIGNAL_API_KEY=your-onesignal-api-key E2E_MODE=false + +# Optional: Android Notification Channel ID for the WITH SOUND test notification. +# Create one in your OneSignal dashboard under Settings > Android Notification Categories. +ONESIGNAL_ANDROID_CHANNEL_ID= diff --git a/examples/demo/android/app/build.gradle b/examples/demo/android/app/build.gradle index 4194e4a7..3a1dfaf3 100644 --- a/examples/demo/android/app/build.gradle +++ b/examples/demo/android/app/build.gradle @@ -56,8 +56,9 @@ react { /** * Set this to true to Run Proguard on Release builds to minify the Java bytecode. + * Enabled for the demo to keep the BrowserStack/e2e APK small (~28 MB → ~13 MB). */ -def enableProguardInReleaseBuilds = false +def enableProguardInReleaseBuilds = true /** * The preferred build flavor of JavaScriptCore (JSC) @@ -105,6 +106,20 @@ android { proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } } + + // CI-only: build a single arm64-v8a APK (~10 MB) instead of the + // universal ~30 MB fat APK. Enable with `-PciSingleAbi`. BrowserStack + // devices we run e2e against are all arm64-v8a. + if (project.hasProperty('ciSingleAbi')) { + splits { + abi { + enable true + reset() + include 'arm64-v8a' + universalApk false + } + } + } } apply from: "../../node_modules/react-native-vector-icons/fonts.gradle" diff --git a/examples/demo/bun.lock b/examples/demo/bun.lock index 81244d3c..575fa1d8 100644 --- a/examples/demo/bun.lock +++ b/examples/demo/bun.lock @@ -8,9 +8,9 @@ "@react-native-async-storage/async-storage": "^2.1.0", "@react-navigation/native": "^7.0.0", "@react-navigation/native-stack": "^7.0.0", + "react-native-onesignal": "file:../../react-native-onesignal.tgz", "react": "19.2.3", "react-native": "0.84.0", - "react-native-onesignal": "file:../../react-native-onesignal.tgz", "react-native-safe-area-context": "^5.5.2", "react-native-screens": "^4.0.0", "react-native-svg": "^15.8.0", @@ -1006,7 +1006,7 @@ "react-native-dotenv": ["react-native-dotenv@3.4.11", "", { "dependencies": { "dotenv": "^16.4.5" }, "peerDependencies": { "@babel/runtime": "^7.20.6" } }, "sha512-6vnIE+WHABSeHCaYP6l3O1BOEhWxKH6nHAdV7n/wKn/sciZ64zPPp2NUdEUf1m7g4uuzlLbjgr+6uDt89q2DOg=="], - "react-native-onesignal": ["react-native-onesignal@../../react-native-onesignal.tgz", { "dependencies": { "invariant": "^2.2.4" }, "peerDependencies": { "react-native": ">=0.76.0" } }, "sha512-waBo86i8QAv33r75UG6X1k9z6GA2sTxjt0hgf2V25z7IVcqhUUbp5sbH+pzYPBAA/yUQGgb6Im5GUvbNH3zRBg=="], + "react-native-onesignal": ["react-native-onesignal@../../react-native-onesignal.tgz", { "dependencies": { "invariant": "^2.2.4" }, "peerDependencies": { "react-native": ">=0.79.0" } }, "sha512-/WxWrib5VMiOxe5OAcGSxZI2ABafJISiQSVZBhYJToA19nSIZj/b1IwBs6PUoZWpUJDdFvYJ4DtD0Vc47OIM/g=="], "react-native-safe-area-context": ["react-native-safe-area-context@5.7.0", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-/9/MtQz8ODphjsLdZ+GZAIcC/RtoqW9EeShf7Uvnfgm/pzYrJ75y3PV/J1wuAV1T5Dye5ygq4EAW20RoBq0ABQ=="], diff --git a/examples/demo/ios/ExportOptions.plist b/examples/demo/ios/ExportOptions.plist index 935873e2..b8104582 100644 --- a/examples/demo/ios/ExportOptions.plist +++ b/examples/demo/ios/ExportOptions.plist @@ -3,7 +3,7 @@ method - development + debugging teamID 99SW8E36CT signingStyle diff --git a/examples/demo/ios/Podfile.lock b/examples/demo/ios/Podfile.lock index 7cfcd949..7eb6aa7c 100644 --- a/examples/demo/ios/Podfile.lock +++ b/examples/demo/ios/Podfile.lock @@ -3,9 +3,9 @@ PODS: - hermes-engine (250829098.0.7): - hermes-engine/Pre-built (= 250829098.0.7) - hermes-engine/Pre-built (250829098.0.7) - - OneSignalXCFramework (5.5.0): - - OneSignalXCFramework/OneSignalComplete (= 5.5.0) - - OneSignalXCFramework/OneSignal (5.5.0): + - OneSignalXCFramework (5.5.1): + - OneSignalXCFramework/OneSignalComplete (= 5.5.1) + - OneSignalXCFramework/OneSignal (5.5.1): - OneSignalXCFramework/OneSignalCore - OneSignalXCFramework/OneSignalExtension - OneSignalXCFramework/OneSignalLiveActivities @@ -13,38 +13,38 @@ PODS: - OneSignalXCFramework/OneSignalOSCore - OneSignalXCFramework/OneSignalOutcomes - OneSignalXCFramework/OneSignalUser - - OneSignalXCFramework/OneSignalComplete (5.5.0): + - OneSignalXCFramework/OneSignalComplete (5.5.1): - OneSignalXCFramework/OneSignal - OneSignalXCFramework/OneSignalInAppMessages - OneSignalXCFramework/OneSignalLocation - - OneSignalXCFramework/OneSignalCore (5.5.0) - - OneSignalXCFramework/OneSignalExtension (5.5.0): + - OneSignalXCFramework/OneSignalCore (5.5.1) + - OneSignalXCFramework/OneSignalExtension (5.5.1): - OneSignalXCFramework/OneSignalCore - OneSignalXCFramework/OneSignalOutcomes - - OneSignalXCFramework/OneSignalInAppMessages (5.5.0): + - OneSignalXCFramework/OneSignalInAppMessages (5.5.1): - OneSignalXCFramework/OneSignalCore - OneSignalXCFramework/OneSignalNotifications - OneSignalXCFramework/OneSignalOSCore - OneSignalXCFramework/OneSignalOutcomes - OneSignalXCFramework/OneSignalUser - - OneSignalXCFramework/OneSignalLiveActivities (5.5.0): + - OneSignalXCFramework/OneSignalLiveActivities (5.5.1): - OneSignalXCFramework/OneSignalCore - OneSignalXCFramework/OneSignalOSCore - OneSignalXCFramework/OneSignalUser - - OneSignalXCFramework/OneSignalLocation (5.5.0): + - OneSignalXCFramework/OneSignalLocation (5.5.1): - OneSignalXCFramework/OneSignalCore - OneSignalXCFramework/OneSignalNotifications - OneSignalXCFramework/OneSignalOSCore - OneSignalXCFramework/OneSignalUser - - OneSignalXCFramework/OneSignalNotifications (5.5.0): + - OneSignalXCFramework/OneSignalNotifications (5.5.1): - OneSignalXCFramework/OneSignalCore - OneSignalXCFramework/OneSignalExtension - OneSignalXCFramework/OneSignalOutcomes - - OneSignalXCFramework/OneSignalOSCore (5.5.0): + - OneSignalXCFramework/OneSignalOSCore (5.5.1): - OneSignalXCFramework/OneSignalCore - - OneSignalXCFramework/OneSignalOutcomes (5.5.0): + - OneSignalXCFramework/OneSignalOutcomes (5.5.1): - OneSignalXCFramework/OneSignalCore - - OneSignalXCFramework/OneSignalUser (5.5.0): + - OneSignalXCFramework/OneSignalUser (5.5.1): - OneSignalXCFramework/OneSignalCore - OneSignalXCFramework/OneSignalNotifications - OneSignalXCFramework/OneSignalOSCore @@ -1446,9 +1446,9 @@ PODS: - React-RCTFBReactNativeSpec - ReactCommon/turbomodule/core - ReactNativeDependencies - - react-native-onesignal (5.4.3): + - react-native-onesignal (5.4.4): - hermes-engine - - OneSignalXCFramework (= 5.5.0) + - OneSignalXCFramework (= 5.5.1) - RCTRequired - RCTTypeSafety - React-Core @@ -2312,7 +2312,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: FBLazyVector: c12d2108050e27952983d565a232f6f7b1ad5e69 hermes-engine: 177322198264d50dc281084c48e1ed80ea14884c - OneSignalXCFramework: 943852e7d70d719f73e9669d48620aeec1b93022 + OneSignalXCFramework: 2b46c36b38528b65dce33ed9d83375f8c98bf40c RCTDeprecation: 3280799c14232a56e5a44f92981a8ee33bc69fd9 RCTRequired: 9854a51b0f65ccf43ea0b744df4d70fce339db32 RCTSwiftUI: 96986e49a4fdc2c2103929dee2641e1b57edf33d @@ -2349,7 +2349,7 @@ SPEC CHECKSUMS: React-logger: 9e51e01455f15cb3ef87a09a1ec773cdb22d56c1 React-Mapbuffer: 92b99e450e8ff598b27d6e4db3a75e04fd45e9a9 React-microtasksnativemodule: 2fe0f2bd2840dedbd66c0ac249c64f977f39cc18 - react-native-onesignal: dc0212667c92798d90a72316aec304f9df6dddc4 + react-native-onesignal: bc00d2a1100522842e5215026178212c560004eb react-native-safe-area-context: ae7587b95fb580d1800c5b0b2a7bd48c2868e67a React-NativeModulesApple: 44a9474594566cd03659f92e38f42599c6b9dee4 React-networking: db73d91466cb134fcbdaaa579fb2de14e2c2ea01 diff --git a/examples/demo/ios/demo.xcodeproj/project.pbxproj b/examples/demo/ios/demo.xcodeproj/project.pbxproj index 463f4ec6..a7da8674 100644 --- a/examples/demo/ios/demo.xcodeproj/project.pbxproj +++ b/examples/demo/ios/demo.xcodeproj/project.pbxproj @@ -366,14 +366,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-demo/Pods-demo-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-demo/Pods-demo-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-demo/Pods-demo-frameworks.sh\"\n"; @@ -431,14 +427,10 @@ inputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-demo/Pods-demo-resources-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); name = "[CP] Copy Pods Resources"; outputFileListPaths = ( "${PODS_ROOT}/Target Support Files/Pods-demo/Pods-demo-resources-${CONFIGURATION}-output-files.xcfilelist", ); - outputPaths = ( - ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-demo/Pods-demo-resources.sh\"\n"; @@ -580,7 +572,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CC = "$(REACT_NATIVE_PATH)/scripts/xcode/ccache-clang.sh"; + CC = ""; CCACHE_BINARY = ccache; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "c++20"; @@ -609,7 +601,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; - CXX = "$(REACT_NATIVE_PATH)/scripts/xcode/ccache-clang++.sh"; + CXX = ""; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; @@ -629,8 +621,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD = "$(REACT_NATIVE_PATH)/scripts/xcode/ccache-clang.sh"; - LDPLUSPLUS = "$(REACT_NATIVE_PATH)/scripts/xcode/ccache-clang++.sh"; + LD = ""; + LDPLUSPLUS = ""; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, "$(inherited)", @@ -667,7 +659,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CC = "$(REACT_NATIVE_PATH)/scripts/xcode/ccache-clang.sh"; + CC = ""; CCACHE_BINARY = ccache; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "c++20"; @@ -696,7 +688,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; - CXX = "$(REACT_NATIVE_PATH)/scripts/xcode/ccache-clang++.sh"; + CXX = ""; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = ""; @@ -709,8 +701,8 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 15.1; - LD = "$(REACT_NATIVE_PATH)/scripts/xcode/ccache-clang.sh"; - LDPLUSPLUS = "$(REACT_NATIVE_PATH)/scripts/xcode/ccache-clang++.sh"; + LD = ""; + LDPLUSPLUS = ""; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, "$(inherited)", @@ -750,7 +742,7 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 99SW8E36CT; INFOPLIST_FILE = OneSignalNotificationServiceExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -776,7 +768,7 @@ DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 99SW8E36CT; INFOPLIST_FILE = OneSignalNotificationServiceExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 15.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/examples/demo/package.json b/examples/demo/package.json index d49b88a7..59666aab 100644 --- a/examples/demo/package.json +++ b/examples/demo/package.json @@ -4,11 +4,11 @@ "private": true, "scripts": { "setup": "../setup.sh", - "preandroid": "bun run setup", - "preios": "bun run setup", + "preandroid": "vp run setup", + "preios": "vp run setup", "android": "bash ../run-android.sh", "ios": "bash ../run-ios.sh", - "update:pods": "cd ios && pod update OneSignalXCFramework --no-repo-update && cd ..", + "update:pods": "(cd ios && pod update OneSignalXCFramework --no-repo-update)", "clean:android": "rm -rf android/app/build android/app/.cxx android/build && adb uninstall com.onesignal.example >/dev/null 2>&1 || true", "clean:ios": "rm -rf ios/build ios/Pods", "start": "react-native start" @@ -44,5 +44,6 @@ }, "engines": { "node": ">= 22.11.0" - } + }, + "packageManager": "bun@1.3.13" } diff --git a/examples/demo/src/services/OneSignalApiService.ts b/examples/demo/src/services/OneSignalApiService.ts index 98140c5c..54cea1e6 100644 --- a/examples/demo/src/services/OneSignalApiService.ts +++ b/examples/demo/src/services/OneSignalApiService.ts @@ -1,4 +1,4 @@ -import { ONESIGNAL_API_KEY } from '@env'; +import { ONESIGNAL_API_KEY, ONESIGNAL_ANDROID_CHANNEL_ID } from '@env'; import { NotificationType } from '../models/NotificationType'; import { UserData, userDataFromJson } from '../models/UserData'; @@ -49,7 +49,8 @@ class OneSignalApiService { headings = { en: 'Sound Notification' }; contents = { en: 'This notification plays a custom sound' }; extra.ios_sound = 'vine_boom.wav'; - extra.android_channel_id = 'b3b015d9-c050-4042-8548-dcc34aa44aa4'; + extra.android_channel_id = + ONESIGNAL_ANDROID_CHANNEL_ID?.trim() || 'b3b015d9-c050-4042-8548-dcc34aa44aa4'; break; default: return false; diff --git a/examples/demo/tsconfig.json b/examples/demo/tsconfig.json index a18a64b4..2361bc35 100644 --- a/examples/demo/tsconfig.json +++ b/examples/demo/tsconfig.json @@ -1,7 +1,9 @@ { "extends": "@react-native/typescript-config", "compilerOptions": { - "types": ["jest"] + // Override the base config's `"types": ["jest"]` since this demo + // doesn't ship jest tests and @types/jest isn't installed. + "types": [] }, "include": ["**/*.ts", "**/*.tsx", "**/*.d.ts"], "exclude": ["**/node_modules", "**/Pods"] diff --git a/examples/demo/types/env.d.ts b/examples/demo/types/env.d.ts index b334533f..6ee94c30 100644 --- a/examples/demo/types/env.d.ts +++ b/examples/demo/types/env.d.ts @@ -1,5 +1,6 @@ declare module '@env' { export const ONESIGNAL_APP_ID: string; export const ONESIGNAL_API_KEY: string; + export const ONESIGNAL_ANDROID_CHANNEL_ID: string; export const E2E_MODE: string; } diff --git a/examples/setup.sh b/examples/setup.sh index 5c56133a..20e557bb 100755 --- a/examples/setup.sh +++ b/examples/setup.sh @@ -1,6 +1,7 @@ +#!/usr/bin/env bash set -euo pipefail -# Invoked from a demo dir (e.g. examples/demo/) via `bun run setup`. +# Invoked from a demo dir (e.g. examples/demo/) via `vp run setup`. # ORIGINAL_DIR captures that dir so we can return to it after building # the SDK; SDK_ROOT is two levels up (the SDK package itself). ORIGINAL_DIR=$(pwd) @@ -38,33 +39,35 @@ if [ "${FORCE_SETUP:-0}" != "1" ] \ fi cd "$SDK_ROOT" -bun run build +vp run build -# `bun pm pack` honors package.json's "files" field (so the tarball matches -# what would actually be published). The version suffix in the filename -# is unstable, so we normalize to react-native-onesignal.tgz for a -# deterministic path that package.json + the extract step can reference. +# `vp pm pack` (wraps bun pm pack) honors package.json's "files" field +# (so the tarball matches what would actually be published). The version +# suffix in the filename is unstable, so we normalize to +# react-native-onesignal.tgz for a deterministic path that package.json + +# the extract step can reference. rm -f react-native-onesignal*.tgz -bun pm pack +vp pm pack mv react-native-onesignal-*.tgz react-native-onesignal.tgz cd "$ORIGINAL_DIR" -# Always go through bun add so bun.lock's integrity hash for the tarball -# stays in sync with the freshly-built tarball on disk. A previous version -# of this script had a "hot path" that just untarred over node_modules -# directly, which was faster but left a stale sha512 in bun.lock — any -# subsequent `bun install` that re-resolved this entry (e.g. when the -# lockfile was touched by another dep) would fail with IntegrityCheckFailed. +# Always go through `vp add` (wraps bun) so bun.lock's integrity hash for +# the tarball stays in sync with the freshly-built tarball on disk. A +# previous version of this script had a "hot path" that just untarred +# over node_modules directly, which was faster but left a stale sha512 +# in bun.lock — any subsequent `vp install` that re-resolved this entry +# (e.g. when the lockfile was touched by another dep) would fail with +# IntegrityCheckFailed. # -# `bun remove` first because bun verifies the existing integrity hash +# `vp remove` first because bun verifies the existing integrity hash # before replacing the entry; without removing, a stale hash from a prior -# build causes `bun add` itself to fail. The relative `file:../../...` +# build causes `vp add` itself to fail. The relative `file:../../...` # path is intentional — an absolute path would leak this machine's # layout into the lockfile. -echo "Registering tarball with bun (refreshes bun.lock integrity hash)..." -bun remove react-native-onesignal 2>/dev/null || true -bun add file:../../react-native-onesignal.tgz +echo "Registering tarball with vp (refreshes bun.lock integrity hash)..." +vp remove react-native-onesignal 2>/dev/null || true +vp add file:../../react-native-onesignal.tgz # Record the hash only after a successful build/install so that an # interrupted run forces a full retry next time. diff --git a/ios/RCTOneSignal/RCTOneSignal.mm b/ios/RCTOneSignal/RCTOneSignal.mm index 6138781a..a11f9973 100644 --- a/ios/RCTOneSignal/RCTOneSignal.mm +++ b/ios/RCTOneSignal/RCTOneSignal.mm @@ -23,7 +23,7 @@ - (void)initOneSignal:(NSDictionary *)launchOptions { return; OneSignalWrapper.sdkType = @"reactnative"; - OneSignalWrapper.sdkVersion = @"050213"; + OneSignalWrapper.sdkVersion = @"050404"; // initialize the SDK with a nil app ID so cold start click listeners can be // triggered [OneSignal initialize:nil withLaunchOptions:launchOptions]; diff --git a/package.json b/package.json index 67e94536..c00cc51f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-onesignal", - "version": "5.4.3", + "version": "5.4.4", "description": "React Native OneSignal SDK", "keywords": [ "android", diff --git a/react-native-onesignal.podspec b/react-native-onesignal.podspec index ddc946f8..cf0ca59f 100644 --- a/react-native-onesignal.podspec +++ b/react-native-onesignal.podspec @@ -15,5 +15,5 @@ Pod::Spec.new do |s| install_modules_dependencies(s) - s.dependency 'OneSignalXCFramework', '5.5.0' + s.dependency 'OneSignalXCFramework', '5.5.1' end