From b2c7b8c9a030b02fa7a1a3f10def47c72258ef83 Mon Sep 17 00:00:00 2001 From: Ryan Iguchi Date: Tue, 17 Feb 2026 13:14:18 +0100 Subject: [PATCH 1/2] adding authorization for ios 15 --- apps/example/screens/SimpleTab.tsx | 73 ++++++++++++------- .../ios/ReactNativeDeviceActivityModule.swift | 19 +++-- 2 files changed, 57 insertions(+), 35 deletions(-) diff --git a/apps/example/screens/SimpleTab.tsx b/apps/example/screens/SimpleTab.tsx index 82a5616..cb7f2d4 100644 --- a/apps/example/screens/SimpleTab.tsx +++ b/apps/example/screens/SimpleTab.tsx @@ -37,28 +37,36 @@ export function SimpleTab() { const [activities, refreshActivities] = useActivities(); - const onPressRequestCallback = useCallback(async () => { - if (authorizationStatus === AuthorizationStatus.notDetermined) { - await requestAuthorization(); - } else if (authorizationStatus === AuthorizationStatus.denied) { - Alert.alert( - "You didn't grant access", - "Please go to settings and enable it", - [ - { - text: "Open settings", - onPress: () => Linking.openSettings(), - }, - { - text: "Cancel", - style: "cancel", - }, - ], - ); - } else { - await revokeAuthorization(); - } - }, [authorizationStatus]); + const onPressRequestCallback = useCallback( + async (forIndividualOrChild: "individual" | "child" = "individual") => { + if (authorizationStatus === AuthorizationStatus.notDetermined) { + try { + await requestAuthorization(forIndividualOrChild); + } catch (e) { + Alert.alert("Error requesting authorization", (e as Error).message); + console.log("Error requesting authorization", e); + } + } else if (authorizationStatus === AuthorizationStatus.denied) { + Alert.alert( + "You didn't grant access", + "Please go to settings and enable it", + [ + { + text: "Open settings", + onPress: () => Linking.openSettings(), + }, + { + text: "Cancel", + style: "cancel", + }, + ], + ); + } else { + await revokeAuthorization(); + } + }, + [authorizationStatus], + ); const [showCreateActivityPopup, setShowCreateActivityPopup] = useState(false); @@ -108,12 +116,21 @@ export function SimpleTab() { {authorizationStatusMap[authorizationStatus]} - - + + + + Activities {activities.map((activity) => ( diff --git a/packages/react-native-device-activity/ios/ReactNativeDeviceActivityModule.swift b/packages/react-native-device-activity/ios/ReactNativeDeviceActivityModule.swift index c1ccf0f..aaec8e3 100644 --- a/packages/react-native-device-activity/ios/ReactNativeDeviceActivityModule.swift +++ b/packages/react-native-device-activity/ios/ReactNativeDeviceActivityModule.swift @@ -570,13 +570,18 @@ public class ReactNativeDeviceActivityModule: Module { try await ac.requestAuthorization( for: forIndividualOrChild == "child" ? .child : .individual) } else { - let errorMessage = "iOS 16.0 or later is required to request authorization." - logger.log("⚠️ \(errorMessage)") - throw NSError( - domain: "FamilyControls", - code: 9999, - userInfo: [NSLocalizedDescriptionKey: errorMessage] - ) + // Deprecated iOS 15 API - uses completion handler + try await withCheckedThrowingContinuation { (continuation: CheckedContinuation) in + ac.requestAuthorization { result in + switch result { + case .success: + continuation.resume() + case .failure(let error): + logger.log("❌ Failed to request authorization: \(error.localizedDescription, privacy: .public)") + continuation.resume(throwing: error) + } + } + } } } From feacadf39514f469996faabe79c0c74340fcba69 Mon Sep 17 00:00:00 2001 From: Ryan Iguchi Date: Tue, 17 Feb 2026 13:18:36 +0100 Subject: [PATCH 2/2] removing log --- apps/example/screens/SimpleTab.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/apps/example/screens/SimpleTab.tsx b/apps/example/screens/SimpleTab.tsx index cb7f2d4..235bce4 100644 --- a/apps/example/screens/SimpleTab.tsx +++ b/apps/example/screens/SimpleTab.tsx @@ -40,12 +40,7 @@ export function SimpleTab() { const onPressRequestCallback = useCallback( async (forIndividualOrChild: "individual" | "child" = "individual") => { if (authorizationStatus === AuthorizationStatus.notDetermined) { - try { - await requestAuthorization(forIndividualOrChild); - } catch (e) { - Alert.alert("Error requesting authorization", (e as Error).message); - console.log("Error requesting authorization", e); - } + await requestAuthorization(forIndividualOrChild); } else if (authorizationStatus === AuthorizationStatus.denied) { Alert.alert( "You didn't grant access",