싱귤러 SDK는 엠파티클용 키트로 제공됩니다. 키트를 통합하면, 엠파티클은 앱에서 싱귤러로 세션을 전달하고, 관련성이 있는 경우 싱귤러의 앱 인스톨 어트리뷰션 프로세스를 트리거합니다.
옵션 기능으로는 인앱 이벤트 전달, 수익 추적, SKAdNetwork 지원(iOS 기기), 딥링크 및 디퍼드 딥링크 처리 등이 있습니다.
가이드 |
엔지니어링 팀 |
전제조건 |
이 문서에서는 앱에이미 mParticle SDK가 통합되어있다고 가정합니다. |
iOS 통합을 위한 단계
1 |
싱귤러 SDK 키 받기
싱귤러 계정에서 "개발자 도구 > SDK 통합 > SDK 키"로 이동하여 SDK 키와 시크릿을 복사합니다.
|
2 |
Singular를 mParticle 출력으로 추가하기
- 엠파티클 계정에서 설정 > 출력으로이동하여 이벤트 출력 추가를 클릭합니다.
- 드롭다운 목록에서 단수를 선택합니다.
- 이벤트 구성 창에서 구성 이름을 입력하고 이전 단계에서 복사한 싱글 키와 시크릿을 입력합니다.
- 저장을 클릭합니다.
|
3 |
Singular SDK 설치하기
싱글 SDK를 설치합니다:
- 앱에서 라이브러리와 바이너리 링크에 AdServices.framework를 추가하고 선택 사항으로 표시합니다(iOS 14.3 이상 기기에서만 사용 가능).
-
앱의 포드파일에 싱글 MParticle 파드를 추가합니다:
pod 'mParticle-Singular'
- 포드파일의 디렉토리에서 'pod install'을 실행합니다.
|
4 |
Singular 라이브러리 가져오기
Singular 라이브러리를 가져오려면 다음 코드 줄을 추가합니다:
#import "MPKitSingular.h"
|
5 |
Singular SDK 초기화
SDK 초기화 코드는 앱을 열 때마다 호출되어야 합니다. 이는 모든 싱귤러 어트리뷰션 기능의 전제 조건이며, 새 사용자 세션을 싱귤러로 전송합니다(세션은 사용자 리텐션을 계산하는 데 사용됨).
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//initialize mParticle
MParticleOptions *options = [MParticleOptions optionsWithKey:@"<MPARTICLE_KEY>" secret:@"<MPARTICLE_SECRET>"];
[[MParticle sharedInstance] startWithOptions:options];
return YES;
}
|
6 |
[선택 사항] 이벤트 추적
싱귤러는 인앱 이벤트에 대한 데이터를 수집하여 캠페인의 성과를 분석하고 KPI를 측정할 수 있습니다.
애플리케이션에 따라 사용자 로그인, 등록, 튜토리얼 완료 또는 게임 레벨 업과 같은 이벤트를 추적할 수 있습니다.
다음 샘플 코드는 두 개의 사용자 지정 속성과 함께 "event_name"이라는 이벤트를 Singular에 보고합니다. 싱귤러 보고서에서 "event_name" 발생 횟수를 확인할 수 있습니다.
MPEvent *event = [[MPEvent alloc] initWithName:@"event_name"
type:MPEventTypeTransaction];
event.customAttributes = @{@"category":@"Destination Intro",
@"title":@"Paris"};
[[MParticle sharedInstance] logEvent:event];
|
7 |
[선택 사항] 수익 추적
싱귤러는 앱을 통해 얻은 수익에 대한 데이터를 수집하여 캠페인의 성과와 ROI를 분석하는 데 도움을 줄 수 있습니다.
싱귤러는 보고서, 로그 내보내기 및 포스트백에서 데이터를 사용할 수 있도록 합니다.
수익을 추적하려면 다음 예시와 같이 수익 이벤트를 Singular에 보고하세요. 이 예시는 제품의 인앱 구매를 보고하며, 제품 이름, SKU, 수량 및 가격을 제공합니다.
// 1. Create the products
MPProduct *product = [[MPProduct alloc] initWithName:@"product_name" sku:@"product_sku" quantity:@10
price:@100.00];
// 2. Summarize the transaction
MPTransactionAttributes *attributes = [[MPTransactionAttributes alloc] init];
attributes.transactionId = @"ransaction_id";
attributes.revenue = @400.00;
attributes.tax = @10.00;
// 3. Log the purchase event
MPCommerceEventAction action = MPCommerceEventActionPurchase;
MPCommerceEvent *revenueEvent = [[MPCommerceEvent alloc] initWithAction:action product:product];
revenueEvent.transactionAttributes = attributes;
[[MParticle sharedInstance] logEvent:revenueEvent];
참고: 통화를 세 글자로 된 ISO 4217 통화 코드(예: 'USD', 'EUR', 'INR')로 전달하세요.
|
8 |
[선택 사항] SKAdNetwork 지원 추가하기
SKAdNetwork는 최종 사용자의 개인정보를 침해하지 않고 모바일 인스톨 어트리뷰션을 결정하기 위한 Apple의 새로운 프레임워크입니다.
SKAdNetwork를 사용하면 사용자의 개인 식별 정보를 공유하지 않고도 앱 마케팅 캠페인의 성과를 측정할 수 있습니다.
SKAdNetwork의 단일 솔루션인 SKAN을 사용하면 최소한의 엔지니어링 작업으로 SKAdNetwork를 구현할 수 있습니다. SKAN을 초기화하면, 싱귤러에 보고하는 모든 이벤트가 서버 측에서 자동으로 처리되어 미리 정의된 전환 모델에 따라 전환 수치를 업데이트합니다. 그런 다음 새 전환 값이 앱으로 다시 전송됩니다. 이 과정은 측정 기간이 끝나고 앱이 최신 전환 값을 SKAdNetwork에 전송할 때까지 반복됩니다.
자세한 내용은 싱귤러의 SKAdNetwork 솔루션 소개및 SKAdNetwork 시작하기를 참조하세요.
다음 샘플 코드는 ATT 동의를 60초간 기다린 후 SKAN을 활성화합니다( Singular iOS SDK: 앱 트래킹 투명성 동의 처리하기 참조).
참고: 이 코드는 mParticle이 초기화되기 전에 실행해야합니다.
[MPKitSingular setSKANOptions:YES isManualSkanConversionManagementMode:NO
withWaitForTrackingAuthorizationWithTimeoutInterval:@60.0
withConversionValueUpdatedHandler:^(NSInteger conversionValue) {
NSLog(@"conversion value %ld", conversionValue);
}];
|
9 |
[선택 사항] 딥링크 처리
딥링크는 앱 내부의 특정 콘텐츠로 연결되는 링크입니다. 사용자가 앱이 설치된 기기에서 딥링크를 클릭하면 앱이 열리고 특정 제품이나 경험이 표시됩니다.
단일 추적 링크에는 딥링킹과 디퍼드 딥링킹이포함될 수 있습니다(자세한 내용은 딥링킹FAQ 및 단일 링크 FAQ참조).
참고:
앱 델리게이트를 사용하여 딥링크 처리하기:
SDK 초기화 메서드에 onAttributionComplete를 포함한 호출을 추가합니다:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//initialize mParticle
MParticleOptions *options = [MParticleOptions optionsWithKey:@"<MPARTICLE_KEY>" secret:@"<MPARTICLE_SECRET>"];
options.proxyAppDelegate = NO;
[[MParticle sharedInstance] startWithOptions:options];
return YES;
}
또한 앱디렉티브의 계속 사용자 활동에서 mParticle의 계속 사용자 활동 메서드 호출을 추가합니다:
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
[[MParticle sharedInstance] continueUserActivity:userActivity restorationHandler:restorationHandler];
return YES;
}
장면 델리게이트를 사용하여 딥 링크 처리하기:
SceneDelegate의 계속 사용자 활동 및 willConnectToSession에서 mParticle의 계속 사용자 활동 메서드에 대한 호출을 추가합니다:
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
NSUserActivity* userActivity =
[[[connectionOptions userActivities] allObjects] firstObject];
[[MParticle sharedInstance] continueUserActivity:userActivity restorationHandler:nil];
}
- (void)scene:(UIScene *)scene
continueUserActivity:(NSUserActivity *)userActivity{
[[MParticle sharedInstance] continueUserActivity:userActivity restorationHandler:nil];
}
|
안드로이드 통합을 위한 단계
1 |
싱귤러 SDK 키 받기
싱귤러 계정에서 "개발자 도구 > SDK 통합 > SDK 키"로 이동하여 SDK 키와 시크릿을 복사합니다.
|
2 |
Singular를 mParticle 출력으로 추가하기
- 엠파티클 계정에서 설정 > 출력으로이동하여 이벤트 출력 추가를 클릭합니다.
- 드롭다운 목록에서 단수를 선택합니다.
- 이벤트 구성 창에서 구성 이름을 입력하고 이전 단계에서 복사한 싱글 키와 시크릿을 입력합니다.
- 저장을 클릭합니다.
|
3 |
SDK 설치
-
다음과 같이 빌드 스크립트에 Singular의 Maven 서버를 추가합니다. 이는 Singular 키트의 필수 요구 사항입니다.
repositories {
maven { url "http://maven.singular.net"}
...
}
-
앱의 build.gradle에 키트 종속성을 추가합니다:
dependencies {
compile 'com.mparticle:android-singular-kit:5+'
}
|
4 |
SDK 초기화
SDK 초기화 코드는 앱을 열 때마다 호출되어야 합니다. 이는 모든 싱귤러 어트리뷰션 기능의 전제 조건이며, 새 사용자 세션을 싱귤러로 전송합니다(세션은 사용자 리텐션을 계산하는 데 사용됨). 싱귤러 보고서뿐만 아니라 엠파티클 대시보드에서 세션을 추적할 수 있습니다.
//import mParticle
import com.mparticle.MParticle;
import com.mparticle.MParticleOptions;
public class ExampleActivity extends Activity {
@Override
public void onCreate() {
super.onCreate();
MParticleOptions options = MParticleOptions.builder(this)
.credentials("REPLACE ME WITH KEY", "REPLACE ME WITH SECRET")
.build();
MParticle.start(options);
}
}
|
5 |
[선택 사항] 사용자 ID 설정하기
사용자 ID는 사용자 이름, 이메일 주소, 무작위로 생성된 문자열 또는 사용자 ID로 사용하는 모든 식별자가 될 수 있습니다.
Singular는 사용자 수준 데이터 내보내기 및 내부 BI 포스트백(해당 포스트백을 구성한 경우)에서 사용자 ID를 사용합니다.
사용자 ID를 설정하면 모든 세션 및 이벤트와 함께 전송됩니다. 사용자 ID는 설정을 해제하거나 앱을 제거할 때까지 지속됩니다.앱을 닫거나 다시 시작해도 사용자 ID는 설정되지 않습니다.
IdentityApiRequest identityRequest = IdentityApiRequest.withEmptyUser()
.email("foo@example.com")
.customerId("123456")
.build();
MParticle.getInstance().Identity().login(identityRequest);
|
6 |
[선택 사항] 이벤트 추적
싱귤러는 인앱 이벤트에 대한 데이터를 수집하여 캠페인의 성과를 분석하고 KPI를 측정할 수 있습니다.
애플리케이션에 따라 사용자 로그인, 등록, 튜토리얼 완료 또는 게임 레벨 업과 같은 이벤트를 추적할 수 있습니다.
다음 샘플 코드는 "test_event"라는 이벤트를 추가 정보(customAttributes)와 함께 JSONObject 형식으로 Singular에 보고합니다.
Map<String, String> customAttributes = new HashMap<String, String>();
customAttributes.put("category", "event_category");
MPEvent event = new MPEvent.Builder("test_event", MParticle.EventType.Navigation)
.customAttributes(customAttributes)
.build();
MParticle.getInstance().logEvent(event);
|
7 |
[선택 사항] 수익 추적
싱귤러는 엠파티클로부터 제품.구매 이벤트를 수신하여 앱을 통해 얻은 수익에 대한 데이터를 수집할 수 있습니다.
이벤트 수익은 수량 * 제품_비용으로 계산됩니다.
Product product = new Product.Builder("extra life", "extra-life", 100.00)
.quantity(4.0)
.build();
TransactionAttributes attributes = new TransactionAttributes("123123")
.setRevenue(430.00)
.setTax(30.00);
CommerceEvent event = new CommerceEvent.Builder(Product.PURCHASE, product)
.transactionAttributes(attributes)
.currency("USD")
.build();
MParticle.getInstance().logEvent(event);
참고: 통화를 세 글자 ISO 4217 통화 코드로 전달하세요(예: "USD", "EUR", "INR").
|
8 |
[선택 사항] 딥 링크 처리
딥링크는 앱 내의 특정 콘텐츠로 연결되는 링크입니다. 사용자가 앱이 설치된 기기에서 딥링크를 클릭하면 앱이 열리고 특정 제품이나 경험이 표시됩니다.
단일 추적 링크에는 딥링킹과 디퍼드 딥링킹이포함될 수 있습니다(자세한 내용은 딥링킹FAQ 및 단일 링크 FAQ참조).
참고 사항:
딥링크를 처리하려면 다음 예시에서와 같이 어트리뷰션 리스너를 구현합니다. 모든 메인 엔트리 활동에서 어트리뷰션 리스너를 구현해야 한다는 점에 유의하세요.
public class ActivityDeeplink extends AppCompatActivity implements AttributionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MParticleOptions options = MParticleOptions.builder(this)
.credentials("REPLACE ME WITH KEY", "REPLACE ME WITH SECRET")
.attributionListener(this)
.logLevel(MParticle.LogLevel.VERBOSE)
.build();
MParticle.start(options);
}
@Override
public void onResult(@NonNull @NotNull AttributionResult attributionResult) {
if (attributionResult.getServiceProviderId() == MParticle.ServiceProviders.SINGULAR) {
String deeplink = attributionResult.getLink();
JSONObject data = attributionResult.getParameters();
String passthrough = data.optString("passthrough", null);
// Deal with deep link
}
}
@Override
public void onError(@NonNull @NotNull AttributionError attributionError) {
// Deal with error
}
}
|