From 103b3f30a95d367535680ee47696ac4fd18184bd Mon Sep 17 00:00:00 2001 From: Subhankar Maiti Date: Tue, 18 Aug 2026 11:30:22 +0530 Subject: [PATCH 1/4] feat(ios): ship a privacy manifest with the A0Auth0 pod --- A0Auth0.podspec | 1 + README.md | 2 ++ example/android/gradle.properties | 2 +- example/ios/Podfile.lock | 2 +- ios/PrivacyInfo.xcprivacy | 27 +++++++++++++++++++++++++++ src/plugin/withAuth0.ts | 2 +- 6 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 ios/PrivacyInfo.xcprivacy diff --git a/A0Auth0.podspec b/A0Auth0.podspec index c1dc9888d..5ed048bec 100644 --- a/A0Auth0.podspec +++ b/A0Auth0.podspec @@ -14,6 +14,7 @@ Pod::Spec.new do |s| s.source = { :git => 'https://github.com/auth0/react-native-auth0.git', :tag => "v#{s.version}" } s.source_files = 'ios/**/*.{h,m,mm,swift}' + s.resource_bundles = { 'A0Auth0_privacy' => 'ios/PrivacyInfo.xcprivacy' } s.requires_arc = true s.dependency 'Auth0', '3.0.1' diff --git a/README.md b/README.md index 4455fc7af..889a1c3b9 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,8 @@ Our SDK requires a minimum iOS deployment target of 14.0. In your project's ios/ platform :ios, '14.0' ``` +The iOS pod ships a privacy manifest (`PrivacyInfo.xcprivacy`) that declares no tracking, no required-reason API usage, and a user identifier collected only for app functionality. Xcode picks it up automatically when you generate a privacy report for App Store submission — you don't need to declare anything on this SDK's behalf. + ### Installation First install the native library module: diff --git a/example/android/gradle.properties b/example/android/gradle.properties index 9d2a456eb..9d16fe38d 100644 --- a/example/android/gradle.properties +++ b/example/android/gradle.properties @@ -41,4 +41,4 @@ hermesEnabled=true # Use this property to enable edge-to-edge display support. # This allows your app to draw behind system bars for an immersive UI. # Note: Only works with ReactActivity and should not be used with custom Activity. -edgeToEdgeEnabled=false \ No newline at end of file +edgeToEdgeEnabled=true \ No newline at end of file diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index edd7fc5f6..6f18ce169 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -2243,7 +2243,7 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/yoga" SPEC CHECKSUMS: - A0Auth0: 2c9e96b05a7422552027fd336a45ece0bd8d8545 + A0Auth0: 6168f5be0fc061ba9858d95c481d5338627e2238 Auth0: c94e637a662b4e07aeb1e6e5acf3f8787e451e1c FBLazyVector: b3e7ad108f0d882e30445c5527d774e3fd432f3d hermes-engine: 4ba8c4848d46c6a441e09d1c62f883ba69bc5b76 diff --git a/ios/PrivacyInfo.xcprivacy b/ios/PrivacyInfo.xcprivacy new file mode 100644 index 000000000..d2ab1bddd --- /dev/null +++ b/ios/PrivacyInfo.xcprivacy @@ -0,0 +1,27 @@ + + + + + NSPrivacyAccessedAPITypes + + NSPrivacyTracking + + NSPrivacyTrackingDomains + + NSPrivacyCollectedDataTypes + + + NSPrivacyCollectedDataType + NSPrivacyCollectedDataTypeUserID + NSPrivacyCollectedDataTypePurposes + + NSPrivacyCollectedDataTypePurposeAppFunctionality + + NSPrivacyCollectedDataTypeLinked + + NSPrivacyCollectedDataTypeTracking + + + + + diff --git a/src/plugin/withAuth0.ts b/src/plugin/withAuth0.ts index e2d6afae1..d4f88eb26 100644 --- a/src/plugin/withAuth0.ts +++ b/src/plugin/withAuth0.ts @@ -167,7 +167,7 @@ export const addAuth0AppDelegateCode = ( if (!isSwift) { // Throw error for non-Swift files, since we're only supporting Swift app delegates (RN 78+) throw new Error( - 'This plugin only supports expo 53 or greater. If you are using older version 4.x' + 'This plugin requires a Swift AppDelegate, which means Expo SDK 55 or greater. On older Expo versions, use react-native-auth0 5.x or earlier.' ); } From b85ef1c991591228cc78843aefa10d827807ce09 Mon Sep 17 00:00:00 2001 From: Subhankar Maiti Date: Tue, 18 Aug 2026 12:02:15 +0530 Subject: [PATCH 2/4] fix(example): apply safe-area insets with edge-to-edge enabled --- example/src/App.tsx | 11 +++++++---- example/src/screens/SelectionScreen.tsx | 3 ++- example/src/screens/class-based/ClassApiTests.tsx | 3 ++- example/src/screens/class-based/ClassLogin.tsx | 2 +- example/src/screens/class-based/ClassProfile.tsx | 2 +- example/src/screens/hooks/CredentialsScreen.tsx | 2 +- example/src/screens/hooks/Home.tsx | 2 +- example/src/screens/hooks/More.tsx | 3 ++- example/src/screens/hooks/MyAccountScreen.tsx | 2 +- example/src/screens/hooks/Profile.tsx | 9 ++------- 10 files changed, 20 insertions(+), 19 deletions(-) diff --git a/example/src/App.tsx b/example/src/App.tsx index ad0833c47..03f3e1a72 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -1,6 +1,7 @@ import React from 'react'; import { StatusBar } from 'react-native'; import { NavigationContainer } from '@react-navigation/native'; +import { SafeAreaProvider } from 'react-native-safe-area-context'; import RootNavigator from './navigation/RootNavigator'; /** @@ -12,10 +13,12 @@ import RootNavigator from './navigation/RootNavigator'; */ function App(): React.JSX.Element { return ( - - - - + + + + + + ); } diff --git a/example/src/screens/SelectionScreen.tsx b/example/src/screens/SelectionScreen.tsx index e7afbc386..9c84c016a 100644 --- a/example/src/screens/SelectionScreen.tsx +++ b/example/src/screens/SelectionScreen.tsx @@ -1,7 +1,8 @@ // example/src/screens/SelectionScreen.tsx import React from 'react'; -import { View, Text, StyleSheet, SafeAreaView } from 'react-native'; +import { View, Text, StyleSheet } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; import { useNavigation } from '@react-navigation/native'; import type { StackNavigationProp } from '@react-navigation/stack'; import Button from '../components/Button'; diff --git a/example/src/screens/class-based/ClassApiTests.tsx b/example/src/screens/class-based/ClassApiTests.tsx index 76a248f32..73eaf6e6b 100644 --- a/example/src/screens/class-based/ClassApiTests.tsx +++ b/example/src/screens/class-based/ClassApiTests.tsx @@ -1,5 +1,6 @@ import React, { useState } from 'react'; -import { SafeAreaView, ScrollView, StyleSheet, Text, View } from 'react-native'; +import { ScrollView, StyleSheet, Text, View } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; import { RouteProp } from '@react-navigation/native'; import auth0 from '../../api/auth0'; import Button from '../../components/Button'; diff --git a/example/src/screens/class-based/ClassLogin.tsx b/example/src/screens/class-based/ClassLogin.tsx index a27d52021..c043b2353 100644 --- a/example/src/screens/class-based/ClassLogin.tsx +++ b/example/src/screens/class-based/ClassLogin.tsx @@ -1,6 +1,5 @@ import React, { useState } from 'react'; import { - SafeAreaView, ScrollView, View, Text, @@ -8,6 +7,7 @@ import { Alert, Platform, } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; import { useNavigation } from '@react-navigation/native'; import type { StackNavigationProp } from '@react-navigation/stack'; import { diff --git a/example/src/screens/class-based/ClassProfile.tsx b/example/src/screens/class-based/ClassProfile.tsx index b98d42717..6f89385fe 100644 --- a/example/src/screens/class-based/ClassProfile.tsx +++ b/example/src/screens/class-based/ClassProfile.tsx @@ -1,6 +1,5 @@ import React, { Component } from 'react'; import { - SafeAreaView, ScrollView, View, StyleSheet, @@ -8,6 +7,7 @@ import { Alert, Linking, } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; import { RouteProp, NavigationProp } from '@react-navigation/native'; import { jwtDecode } from 'jwt-decode'; import auth0 from '../../api/auth0'; diff --git a/example/src/screens/hooks/CredentialsScreen.tsx b/example/src/screens/hooks/CredentialsScreen.tsx index f4a711258..c9927192e 100644 --- a/example/src/screens/hooks/CredentialsScreen.tsx +++ b/example/src/screens/hooks/CredentialsScreen.tsx @@ -1,6 +1,5 @@ import React, { useState } from 'react'; import { - SafeAreaView, ScrollView, StyleSheet, View, @@ -8,6 +7,7 @@ import { Linking, Alert, } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; import { useAuth0, Credentials, diff --git a/example/src/screens/hooks/Home.tsx b/example/src/screens/hooks/Home.tsx index f9c22aa93..73fe7bcce 100644 --- a/example/src/screens/hooks/Home.tsx +++ b/example/src/screens/hooks/Home.tsx @@ -1,6 +1,5 @@ import React, { useState } from 'react'; import { - SafeAreaView, ScrollView, View, Text, @@ -11,6 +10,7 @@ import { Linking, Platform, } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; import { useAuth0, WebAuthError, diff --git a/example/src/screens/hooks/More.tsx b/example/src/screens/hooks/More.tsx index ecb7d2c4b..a3905a066 100644 --- a/example/src/screens/hooks/More.tsx +++ b/example/src/screens/hooks/More.tsx @@ -1,5 +1,6 @@ import React, { useState } from 'react'; -import { SafeAreaView, ScrollView, StyleSheet, View, Text } from 'react-native'; +import { ScrollView, StyleSheet, View, Text } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; import { useAuth0 } from 'react-native-auth0'; import Button from '../../components/Button'; import Header from '../../components/Header'; diff --git a/example/src/screens/hooks/MyAccountScreen.tsx b/example/src/screens/hooks/MyAccountScreen.tsx index 0570c7812..c94d6cb24 100644 --- a/example/src/screens/hooks/MyAccountScreen.tsx +++ b/example/src/screens/hooks/MyAccountScreen.tsx @@ -1,6 +1,5 @@ import React, { useState } from 'react'; import { - SafeAreaView, ScrollView, View, Text, @@ -9,6 +8,7 @@ import { Platform, TextInput, } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; import { useAuth0, MyAccountError, diff --git a/example/src/screens/hooks/Profile.tsx b/example/src/screens/hooks/Profile.tsx index fa9211999..f9855cce8 100644 --- a/example/src/screens/hooks/Profile.tsx +++ b/example/src/screens/hooks/Profile.tsx @@ -1,11 +1,6 @@ import React, { useState } from 'react'; -import { - SafeAreaView, - ScrollView, - View, - StyleSheet, - Alert, -} from 'react-native'; +import { ScrollView, View, StyleSheet, Alert } from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; import { useAuth0 } from 'react-native-auth0'; import Button from '../../components/Button'; import Header from '../../components/Header'; From d80cb2307a406d11ce6fe4b999af5fcc6412939e Mon Sep 17 00:00:00 2001 From: Subhankar Maiti Date: Tue, 18 Aug 2026 12:02:20 +0530 Subject: [PATCH 3/4] docs: clarify who owns App Store Connect privacy answers --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 889a1c3b9..cf92607b1 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Our SDK requires a minimum iOS deployment target of 14.0. In your project's ios/ platform :ios, '14.0' ``` -The iOS pod ships a privacy manifest (`PrivacyInfo.xcprivacy`) that declares no tracking, no required-reason API usage, and a user identifier collected only for app functionality. Xcode picks it up automatically when you generate a privacy report for App Store submission — you don't need to declare anything on this SDK's behalf. +The iOS pod ships a privacy manifest (`PrivacyInfo.xcprivacy`) that declares no tracking, no required-reason API usage, and a user identifier collected only for app functionality. Xcode includes it automatically when you generate a privacy report, so you don't have to describe this SDK's behavior yourself. You are still responsible for reviewing that report and for keeping your App Store Connect privacy answers accurate for your app as a whole, including the data this SDK collects. ### Installation From 86d75d4d279777e7671c41568290cd5ef9b0dd66 Mon Sep 17 00:00:00 2001 From: Subhankar Maiti Date: Tue, 18 Aug 2026 12:04:14 +0530 Subject: [PATCH 4/4] style: fix prettier formatting in the TurboModule spec --- src/specs/NativeA0Auth0.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/specs/NativeA0Auth0.ts b/src/specs/NativeA0Auth0.ts index db9ba29c1..299b6f8aa 100644 --- a/src/specs/NativeA0Auth0.ts +++ b/src/specs/NativeA0Auth0.ts @@ -23,7 +23,8 @@ export interface Spec extends TurboModule { clientId: string, domain: string, localAuthenticationOptions: - { [key: string]: string | Int32 | boolean } | undefined, + | { [key: string]: string | Int32 | boolean } + | undefined, useDPoP: boolean | undefined, maxRetries: Int32, credentialsManagerStorageKey: string | undefined