전제 조건
원활한 연동 프로세스를 위해 Singular React Native SDK를 설치하기 전에 다음 필수 단계를 완료하세요.
필수 전제 조건:
- 계획 단계를 완료합니다: Singular SDK 연동하기의 가이드를 따르세요 : 계획 및 전제 조건의 가이드를 따르세요. 이 단계는 모든 Singular SDK 연동에 필수입니다.
- React Native 버전: React Native 버전을 확인합니다(자동 연결을 위해 0.59 이상 권장).
- 엑스포 사용자: Expo를 사용하는 경우 SDK에 네이티브 모듈이 필요하므로 네이티브 코드 커스터마이징에 익숙해야 합니다.
설치
SDK 패키지 설치하기
npm을 사용하여 프로젝트에 Singular React Native SDK를 추가합니다. 이 SDK는 iOS 및 Android용 네이티브 Singular SDK에 대한 자바Script 바인딩을 제공합니다.
NPM을 통해 설치하기
- 터미널을 엽니다: 프로젝트의 루트 디렉토리로 이동합니다.
-
패키지를 설치합니다: 다음 명령을 실행하여 프로젝트에 SDK를 추가합니다:
npm install singular-react-native --save
네이티브 모듈 연결하기
SDK를 연결하는 방법은 React Native 버전과 Expo 사용 여부에 따라 다릅니다.
- React Native 0.60 이상: SDK가 자동으로 링크됩니다. 추가 단계가 필요하지 않습니다.
-
React Native 0.59 이상: 네이티브 브리지 코드를 수동으로 연결합니다:
react-native link singular-react-native -
엑스포 프로젝트: SDK를 설치한 후 플러그인 구성에 추가합니다:
{ "expo": { "plugins": ["singular-react-native"] } }그런 다음 Expo의 사용자 지정 네이티브 코드 가이드를 사용하여 앱을 다시 빌드합니다.
플랫폼 구성
iOS 구성
코코아팟 종속성을 활성화하고 적절한 SDK 기능을 보장하기 위해 iOS 관련 설정을 완료합니다.
참고: Expo로 빌드하는 경우 iOS 구성은 자동으로 처리됩니다. 이 섹션을 건너뛰세요.
CocoaPods 종속성 설치
프로젝트의 루트 디렉토리에서 다음 명령을 실행하여 필요한 iOS 종속 요소를 설치합니다:
cd ios && pod install
안드로이드 구성
Singular Maven 리포지토리, 필수 권한 및 종속성을 추가하도록 Android 빌드 파일을 구성합니다.
참고: Expo로 빌드하는 경우 Android 구성은 자동으로 처리됩니다. 이 섹션은 건너뛰세요.
Maven 리포지토리 추가
프로젝트의 build.gradle 파일에 Singular Maven 리포지토리를 추가하여 SDK 종속성 해결을 활성화합니다.
allprojects {
repositories {
maven { url 'https://maven.singular.net/' }
}
}
필수 권한 추가
<manifest> 태그 아래에 AndroidManifest.xml 파일에 이러한 권한을 추가하여 핵심 SDK 기능을 사용하도록 설정합니다.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="BIND_GET_INSTALL_REFERRER_SERVICE" />
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
중요: 키즈 SDK를 연동하는 경우 com.google.android.gms.permission.AD_ID 권한을 제외하세요. 이 권한은 표준 앱의 GAID 수집에 필요하지만 13세 미만 어린이를 대상으로 하는 앱의 경우 생략해야 합니다.
삼성 갤럭시 스토어 지원
삼성 갤럭시 스토어에서 설치 리퍼러 추적을 사용하려면 AndroidManifest.xml 에 다음을 추가합니다:
<queries>
<package android:name="com.sec.android.app.samsungapps" />
</queries>
전이적 종속성
Gradle 구성에서 Singular SDK에 대한 전이 종속성을 비활성화한 경우 이러한 필수 종속성을 수동으로 추가하세요:
dependencies {
// Required for install referrer tracking
implementation("com.android.installreferrer:installreferrer:2.2")
// Required for App Set ID
implementation("com.google.android.gms:play-services-appset:16.0.0")
}
프로가드 구성
릴리스 APK를 빌드할 때 ProGuard(또는 R8)는 SDK 클래스를 제거하거나 난독화할 수 있습니다. 이러한 유지 규칙을 추가하여 Singular 기능을 유지하세요.
이것이 중요한 이유: ProGuard는 React Native Android 릴리스 빌드에서 기본적으로 활성화됩니다. 적절한 유지 규칙이 없으면 SDK가 프로덕션 환경에서 제대로 작동하지 않을 수 있습니다.
-
ProGuard 파일을 찾습니다: 프로젝트에서
android/app/proguard-rules.pro로 이동합니다. -
유지 규칙을 추가합니다: 파일에 다음 규칙을 추가합니다:
# Preserve Singular SDK classes -keep class com.singular.sdk.** { *; } # Preserve Android Install Referrer library -keep public class com.android.installreferrer.** { *; } # Uncomment if using Singular revenue tracking with Google Play Billing Library #-keep public class com.android.billingclient.** { *; }
SDK 연동
개인정보 보호 규정 준수: Singular SDK를 구현할 때 GDPR, CCPA, COPPA 등을 포함한 운영 지역의 개인정보 보호법을 준수하세요. SDK 옵트인 및 옵트아웃 사례를 참조하세요.
호환성 참고 사항: Singular React Native SDK v4.0+는 레거시 Bridge 및 TurboModule 아키텍처를 모두 지원합니다. 대부분의 개발자는 마이그레이션이나 리팩터링이 필요하지 않습니다. React Native 및/또는 SDK를 업그레이드하면 이전 코드와 새 코드가 모두 정상적으로 작동합니다. 직접 TurboModule API를 활용하려면 아래의 새로운 초기화 예제를 참조하세요.
SDK 클래스 가져오기
기본 애플리케이션 파일(일반적으로 App.tsx 또는 App.js)의 맨 위에 있는 Singular SDK 클래스를 가져옵니다.
// Direct TurboModule API initialization (React Native 0.76+)
// Import Native API and EventEmitter
import NativeSingular from 'singular-react-native/jsNativeSingular';
import { NativeEventEmitter } from 'react-native';
import Singular, { SingularConfig } from 'singular-react-native';
SDK 초기화
기본 초기화
- 자격 증명을 가져옵니다: Singular 계정에로그인하고 개발자 도구 > SDK 연동 > SDK 키로이동하여 SDK 키와 비밀 번호를 찾습니다.
-
구성 만들기: 자격 증명을 사용하여
SingularConfig객체 또는 TurboModule API용 일반 객체를 인스턴스화합니다. - 구성 추가하기: 선택적으로 구성 메서드를 연결하거나 (레거시 ) 구성 객체에서 직접 속성을 추가합니다 (TurboModule).
-
SDK 초기화:
Singular.init()또는NativeSingular.init()을 호출하여 SDK를 시작합니다.
초기화 예제
앱 시작 시 한 번 실행되도록 앱의 엔트리 포인트(일반적으로 useEffect 훅 내에서)에서 SDK를 초기화합니다.
// TurboModule direct API (React Native 0.76+ New Architecture)
import React, { useEffect } from 'react';
import NativeSingular from 'singular-react-native/jsNativeSingular';
export default function App() {
useEffect(() => {
const config: SingularConfig = {
apikey: 'YOUR_SDK_KEY',
secret: 'YOUR_SDK_SECRET',
enableLogging: true,
logLevel: 3,
};
NativeSingular.init(config);
}, []);
return (
// Your app components
);
}
import React, { useEffect } from 'react';
import Singular, { SingularConfig } from 'singular-react-native';
export default function App() {
useEffect(() => {
const config = new SingularConfig('YOUR_SDK_KEY', 'YOUR_SDK_SECRET')
.withLoggingEnabled()
.withLogLevel(3);
Singular.init(config);
}, []);
return (
// Your app components
);
}
직접 TurboModule API:
NativeSingular TurboModule API를 사용하는 경우 구성이 일반 자바Script 객체와 직접 이벤트 이미터 설정으로 간소화됩니다. 이 방법은 새 아키텍처(React Native 0.76 이상)를 대상으로 하는 앱에만 권장됩니다. 그 외의 모든 앱은 호환성을 극대화하기 위해 래퍼(SingularConfig/Singular.init)를 계속 사용해야 합니다.
고급 구성 예제
init() 을 호출하기 전에 구성 메서드를 체인화하여 초기화 중에 여러 SDK 기능을 구성합니다.
// TurboModule direct API (React Native 0.76+ New Architecture)
import React, { useEffect } from 'react';
import NativeSingular from 'singular-react-native/jsNativeSingular';
import { NativeEventEmitter } from 'react-native';
export default function App() {
useEffect(() => {
const config: SingularConfig = {
apikey: 'YOUR_SDK_KEY',
secret: 'YOUR_SDK_SECRET',
customUserId: 'user_123456',
limitDataSharing: false,
waitForTrackingAuthorizationWithTimeoutInterval: 300
};
NativeSingular.init(config);
// Register event listener
const emitter = new NativeEventEmitter(NativeSingular);
emitter.addListener('SingularLinkHandler', (params) => {
console.log('Singular: Deep link:', params.deeplink);
console.log('Singular: Passthrough:', params.passthrough);
console.log('Singular: Is deferred:', params.isDeferred);
console.log('Singular: urlParameters:', params.urlParameters);
});
}, []);
return (
// Your app components
);
}
import React, { useEffect } from 'react';
import { Singular, SingularConfig } from 'singular-react-native';
export default function App() {
useEffect(() => {
const config = new SingularConfig(
'YOUR_SDK_KEY',
'YOUR_SDK_SECRET'
)
// User identification
.withCustomUserId('user_123456')
// Privacy settings
.withLimitDataSharing(false)
// Deep linking
.withSingularLink((params: SingularLinkParams) => {
console.log('Singular: Deep link:', params.deeplink);
console.log('Singular: Passthrough:', params.passthrough);
console.log('Singular: Is deferred:', params.isDeferred);
console.log('Singular: urlParameters:', params.urlParameters);
})
// iOS-specific
.withWaitForTrackingAuthorizationWithTimeoutInterval(300)
// Debugging
.withLoggingEnabled()
.withLogLevel(3);
Singular.init(config);
}, []);
return (
// Your app components
);
}
구성 참조: 사용 가능한 구성 옵션의 전체 목록은 React Native SDK 구성 참조를 참조하세요.
중요: Singular 보고 API 키를 사용하지 마세요. SDK 연동 페이지의 SDK별 자격 증명만 사용하세요. 잘못된 자격 증명을 사용하면 데이터가 Singular에 도달하지 못합니다.