Add iOS privacy purpose strings and version display

- Add descriptive purpose strings for camera, photo library, and microphone
- Display app version and build number on profile screen
- Add email redirect URL for sign-up flow
- Update Android OAuth client configurations

🤖 Generated with [Claude Code](https://claude.com/claude-code)
This commit is contained in:
Jamie Brunton committed 2026-01-07 12:01:14 +00:00
1 parent 1f0201ec5f
commit 314745c6cb
7 files changed
+152 -57

No files matched your search

+17 -1
View File
@@ -13,6 +13,22 @@
}
},
"oauth_client": [
{
"client_id": "764866133492-4g566mrb8tm5uti4ejub6oogcvnln7kc.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "com.sauci.app",
"certificate_hash": "5e8f16062ea3cd2c4a0d547876baa6f38cabf625"
}
},
{
"client_id": "764866133492-57iilbc72t1urtmurgioci9tne5l6j67.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "com.sauci.app",
"certificate_hash": "1b146774b7ca6bfefd88995db76cf6d097093c4f"
}
},
{
"client_id": "764866133492-e78o2rh3rdjc4rfj2j6r2j77b065kggm.apps.googleusercontent.com",
"client_type": 3
@@ -36,4 +52,4 @@
}
],
"configuration_version": "1"
}
}
+7 -3
View File
@@ -16,13 +16,17 @@
"ios": {
"supportsTablet": false,
"bundleIdentifier": "com.sauci.app",
"buildNumber": "5",
"buildNumber": "20",
"usesAppleSignIn": true,
"infoPlist": {
"UIBackgroundModes": [
"remote-notification"
],
"NSFaceIDUsageDescription": "Sauci uses Face ID to unlock the app and keep your conversations private."
"NSFaceIDUsageDescription": "Sauci uses Face ID to unlock the app and keep your conversations private.",
"NSCameraUsageDescription": "Sauci uses your camera to take photos and videos that you can share privately with your partner in encrypted chat messages.",
"NSPhotoLibraryUsageDescription": "Sauci uses your photo library so you can select photos and videos to share privately with your partner in encrypted chat messages.",
"NSPhotoLibraryAddUsageDescription": "Sauci saves photos and videos from your partner's messages to your photo library when you tap the save button.",
"NSMicrophoneUsageDescription": "Sauci uses your microphone to record audio when you capture videos to share privately with your partner."
}
},
"android": {
@@ -31,7 +35,7 @@
"backgroundColor": "#1a1a2e"
},
"package": "com.sauci.app",
"versionCode": 12,
"versionCode": 17,
"googleServicesFile": "./google-services.json",
"permissions": [
"RECEIVE_BOOT_COMPLETED",
+3
View File
@@ -228,6 +228,9 @@ export default function LoginScreen() {
const { data, error: signUpError } = await supabase.auth.signUp({
email: email.trim(),
password,
options: {
emailRedirectTo: Linking.createURL("/(auth)/login"),
},
});
setIsLoading(false);
+16
View File
@@ -13,6 +13,22 @@
}
},
"oauth_client": [
{
"client_id": "764866133492-4g566mrb8tm5uti4ejub6oogcvnln7kc.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "com.sauci.app",
"certificate_hash": "5e8f16062ea3cd2c4a0d547876baa6f38cabf625"
}
},
{
"client_id": "764866133492-57iilbc72t1urtmurgioci9tne5l6j67.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "com.sauci.app",
"certificate_hash": "1b146774b7ca6bfefd88995db76cf6d097093c4f"
}
},
{
"client_id": "764866133492-e78o2rh3rdjc4rfj2j6r2j77b065kggm.apps.googleusercontent.com",
"client_type": 3
+2 -4
View File
@@ -13,10 +13,8 @@
"test": "jest",
"test:watch": "jest --watch",
"test:ci": "jest --runInBand --ci",
"build:ios": "dotenv -e .env -- eas build --platform ios --profile production",
"build:ios:local": "dotenv -e .env -- eas build --platform ios --profile production --local",
"build:android": "dotenv -e .env -- eas build --platform android --profile production",
"build:android:local": "dotenv -e .env -- eas build --platform android --profile production --local"
"release:ios": "dotenv -e .env -- eas build --platform ios --profile production --local",
"release:android": "dotenv -e .env -- eas build --platform android --profile production --local"
},
"dependencies": {
"@expo/ngrok": "^4.1.0",
@@ -1,6 +1,7 @@
import React from 'react';
import { View, Text, StyleSheet, ScrollView, TouchableOpacity, useWindowDimensions, Platform, Alert } from 'react-native';
import { Ionicons } from '@expo/vector-icons';
import Constants from 'expo-constants';
import Animated, {
FadeInDown,
useSharedValue,
@@ -69,6 +70,15 @@ export function ProfileScreen() {
});
};
// Version info
const version = Constants.expoConfig?.version ?? '1.0.0';
const buildNumber = Platform.select({
ios: Constants.expoConfig?.ios?.buildNumber,
android: Constants.expoConfig?.android?.versionCode?.toString(),
default: undefined,
});
const versionString = buildNumber ? `v${version} (${buildNumber})` : `v${version}`;
// Scroll animation
const scrollY = useSharedValue(0);
const scrollHandler = useAnimatedScrollHandler({
@@ -374,7 +384,7 @@ export function ProfileScreen() {
>
<View style={styles.versionBadge}>
<Ionicons name="heart" size={12} color={featureColors.profile.accent} />
<Text style={styles.version}>Sauci v1.0.0</Text>
<Text style={styles.version}>Sauci {versionString}</Text>
</View>
</Animated.View>