플랫폼 키 매핑
iOS UserDefaults와 Android SharedPreferences 간의 키 매핑 상세
플랫폼 키 매핑
iOS와 Android는 동일한 데이터를 서로 다른 키 이름으로 저장합니다. react-native-device-data-module은 통합 키(Unified Key) 시스템을 통해 이 차이를 추상화합니다.
전체 키 매핑 테이블
| 통합 키 (Unified Key) | iOS 키 | Android 키 | 비고 |
|---|---|---|---|
requirePermissionSuccessScreen | firstStatus | firstAppOpen | 권한 요청 성공 화면 표시 여부 |
deviceId | deviceToken | PREF_ANDROID_DEVICE_UUID | 기기 고유 식별자 |
userSSN | encryptQRSSNBackNumber | USER_SSN_{userId} | 동적 키 - userId 파라미터 필요 |
familyReceiptPopUp | neverShowFamilyReceptionAlert | FAMILY_RECEIPT_NOTICE | 가족 접수 팝업 표시 여부 |
kidsGrowthOverAgePopUp | neverGrowthFeedNotKidAlert | NEVER_SHOW_AGAIN_KIDS_GROWTH_OVER_AGE | 아이 성장 나이 초과 팝업 |
appReviewPopUp | isShowReviewInducePopUp | DID_SHOW_APP_REVIEW_POP_UP | 앱 리뷰 유도 팝업 |
accessToken | accessToken | DDOC_DOC_TOKEN | 액세스 토큰 |
refreshToken | refreshToken | DDOCDOC_NEW_REFRESH_TOKEN | 리프레시 토큰 |
expiresTimestamp | accessTokenExpiredDate | DDOCDOC_TOKEN_EXPIRES_DATE | 토큰 만료 타임스탬프 |
fcmRegisterId | (iOS 없음) | FCM_REG_ID | Android 전용 FCM 등록 ID |
familyEditAuthPopUp | isShowAuthenticationAlert | FAMILY_EDIT_PRIVACY_POPUP | 가족 수정 인증 팝업 |
noLoginADPushAllowed | noLoginADPushAllowed | ALLOWED_AD_PUSH | 비로그인 광고 푸시 허용 여부 (Android: JSON 변환) |
noLoginADPushAllowedTime | noLoginADPushAllowedTime | ALLOWED_AD_PUSH | 광고 푸시 허용 변경 시각 (Android: JSON 변환) |
특수 케이스 상세
동적 키: userSSN
userSSN은 사용자마다 별도의 키로 저장됩니다. Android에서는 userId 파라미터를 사용하여 동적으로 키를 생성합니다.
| 플랫폼 | 키 패턴 | 예시 (userId = '12345') |
|---|---|---|
| iOS | encryptQRSSNBackNumber | encryptQRSSNBackNumber (고정) |
| Android | USER_SSN_{userId} | USER_SSN_12345 |
// 올바른 사용 - params에 userId 전달await UnifiedDeviceDataModule.setItem('userSSN', 'encrypted-data', {userId: '12345',});const ssn = await UnifiedDeviceDataModule.getItem({unifiedKey: 'userSSN',params: { userId: '12345' },});
Android에서 params 없이 userSSN을 사용하면 USER_SSN_undefined 또는 USER_SSN_ 형태의 잘못된 키가 생성됩니다. 반드시 userId를 파라미터로 전달하세요.
Android 전용 키: fcmRegisterId
fcmRegisterId는 Android에만 존재하는 키입니다. iOS에는 매핑이 없으므로 iOS에서 이 키를 사용하면 빈 문자열이 반환됩니다.
| 플랫폼 | 키 | 동작 |
|---|---|---|
| iOS | (없음) | getPlatformKey 호출 시 빈 문자열 반환 |
| Android | FCM_REG_ID | FCM 등록 토큰 저장 |
import { Platform } from 'react-native';// Android에서만 사용하도록 조건 처리 권장if (Platform.OS === 'android') {const fcmId = await UnifiedDeviceDataModule.getItem({unifiedKey: 'fcmRegisterId',});console.log('FCM 등록 ID:', fcmId);}
JSON 변환 키: noLoginADPushAllowed / noLoginADPushAllowedTime
이 두 키는 Android에서 ALLOWED_AD_PUSH라는 동일한 키에 JSON 형식으로 저장된 데이터를 읽어 각각 다른 필드를 추출합니다.
Android 저장 형식
{"enablePush": true,"changedDate": "2024-01-15T10:30:00.000Z"}
변환 동작
| 통합 키 | Android 원본 키 | 반환 값 |
|---|---|---|
noLoginADPushAllowed | ALLOWED_AD_PUSH | data.enablePush (boolean) |
noLoginADPushAllowedTime | ALLOWED_AD_PUSH | data.changedDate를 밀리초 타임스탬프로 변환한 값 (number) |
// noLoginADPushAllowed 조회const allowed = await UnifiedDeviceDataModule.getItem({unifiedKey: 'noLoginADPushAllowed',});// iOS: 'true' 또는 'false' 문자열// Android: true 또는 false (boolean, JSON에서 enablePush 추출)// noLoginADPushAllowedTime 조회const allowedTime = await UnifiedDeviceDataModule.getItem({unifiedKey: 'noLoginADPushAllowedTime',});// iOS: 타임스탬프 숫자 문자열// Android: changedDate를 밀리초로 변환한 number 값
iOS와 Android의 반환 타입이 다를 수 있습니다. noLoginADPushAllowed의 경우 iOS는 문자열 'true'/'false'를 반환하지만, Android는 boolean true/false를 반환합니다. 크로스 플랫폼 코드 작성 시 주의하세요.
타임스탬프 통일 처리
iOS와 Android는 시간 데이터를 서로 다른 형식으로 저장합니다. noLoginADPushAllowedTime 키의 경우, 내부적으로 다음 규칙으로 밀리초 단위 타임스탬프로 통일합니다.
| 입력 형식 | 처리 방식 |
|---|---|
| 밀리초 숫자 (> 1,000,000,000,000) | 그대로 반환 |
| 초 단위 숫자 | 1000을 곱해 밀리초로 변환 |
| ISO 날짜 문자열 | new Date(value).getTime() |
| 숫자 문자열 | 숫자로 변환 후 위 규칙 적용 |
Date 객체 | value.getTime() |
키 매핑 확인 방법
import UnifiedDeviceDataModule from '@boostbrothers/react-native-device-data-module';import { Platform } from 'react-native';// 특정 키의 플랫폼 키 확인const platformKey = UnifiedDeviceDataModule.getPlatformKey('accessToken');console.log(`accessToken의 ${Platform.OS} 키:`, platformKey);// iOS: 'accessToken'// Android: 'DDOC_DOC_TOKEN'// 전체 매핑 테이블 출력const allMappings = UnifiedDeviceDataModule.getAllKeyMappings();Object.entries(allMappings).forEach(([unifiedKey, mapping]) => {console.log(`${unifiedKey}:`, mapping);});