DIDIM
개발자 가이드

DIDIM 플랫폼 연동 가이드

DIDIM을 통해 비공개 테스터를 모집하고 자동으로 인증하는 방법을 안내합니다.

1. 테스터 등록

Google Play Console에서 DIDIM 설정하기

1-1. 비공개 테스트 트랙 만들기

Google Play Console에서 비공개 테스트를 위한 트랙을 생성합니다.

📍 메뉴 경로

테스트 및 출시테스트비공개 테스트트랙 만들기
트랙 만들기 경로

트랙 이름은 어떤 이름을 사용하셔도 상관 없습니다.

트랙 만들기 Dialog

1-2. 테스터 이메일 추가

다음 이메일을 Google Play Console의 테스터 목록에 추가하세요.

didimapp@googlegroups.com

📍 메뉴 경로

테스터Google 그룹스이메일 입력저장
트랙 만들기 Dialog

✅ 저장이 완료되었다면,

개요로 이동검토를 위해 전송전송하기를 누르면 테스터 추가가 완료됩니다.

1-3. DIDIM에 앱 등록

DIDIM 플랫폼에서 앱을 등록하고 API Secret을 발급받습니다.

등록 절차

  1. 1.앱 등록 페이지로 이동
  2. 2.Package Name 입력 (예: com.example.app)
  3. 3.앱 등록 완료 후 자동으로 API Secret 발급
  4. 4.발급된 API Secret은 테스터 관리 페이지에서 확인 가능

⚠️API Secret 보안

API Secret은 외부에 절대 공개하지 마세요. SDK 구현 시 환경 변수로 관리해야 합니다.

1-4. Google Groups 활용

DIDIM은 Google Groups를 활용하여 테스터 등록 과정을 자동화합니다.

자동화의 장점

  • 개발자 편의성: 개발자가 일일이 테스터를 등록할 필요가 없습니다
  • 즉시 접근: 사용자가 "참여하기"를 클릭하면 Google Groups에 자동 가입되어 Play Store 접근 권한이 즉시 부여됩니다
  • 확장성: 테스터 수 제한 없이 자동으로 관리됩니다

테스터 등록 플로우

1

사용자가 DIDIM에서 "참여하기" 클릭

2

Google Groups 자동 가입 완료

3

Play Store 테스터 권한 즉시 부여

사용자가 앱 다운로드 및 설치 가능

2. SDK 통합 가이드

앱에 맞는 테스터 검증 방식을 선택하세요

Anonymous Device 방식은 테스터가 DIDIM에 가입하지 않아도 앱 설치만으로 자동 등록됩니다. 구현이 간단하고 사용자 경험이 좋아 대부분의 경우 권장됩니다.

2-1. 동작 원리

  1. 1.테스터가 Google Groups에 가입 (Play Store 접근용)
  2. 2.Play Store에서 일반 링크로 앱 다운로드 (referrer 불필요)
  3. 3.앱 실행 시 Android ID + 패키지명으로 deviceHash 생성
  4. 4.DIDIM API로 deviceHash 전송 → 자동 테스터 등록/검증
  5. 5.매일 앱 실행 시 API 호출하여 14일 리텐션 추적

2-2. API 엔드포인트

http
1
POST https://didimapp.com/api/verify-install
2
Authorization: Bearer [YOUR_APP_SECRET]
3
Content-Type: application/json
4
5
// Request Body
6
{
7
"type": "anonymousDevice",
8
"appId": "[YOUR_APP_ID]",
9
"deviceHash": "[SHA256_HASH]",
10
"deviceInfo": {
11
"androidId": "abc123...",
12
"model": "Pixel 7",
13
"manufacturer": "Google",
14
"osVersion": "14",
15
"appVersion": "1.0.0"
16
}
17
}
18
19
// Response (200 OK)
20
{
21
"verified": true,
22
"testerId": "tester-id-123",
23
"appId": "app-id-456",
24
"message": "Tester verified successfully via Anonymous Device"
25
}

2-3. 플랫폼별 구현 예제

설정을 위한 LLM 프롬프트

아래 프롬프트를 AI 어시스턴트(ChatGPT, Claude 등)에 복사하면 Android (Kotlin) 구현 코드를 자동으로 생성할 수 있습니다.

markdown
1
다음 요구사항에 맞는 Android Kotlin 코드를 작성해주세요:
2
3
1. DIDIM Anonymous Device 방식 테스터 검증 구현
4
- 기기 고유 식별자(Android ID)와 패키지명을 조합하여 deviceHash 생성
5
- deviceHash = SHA256(androidId + packageName)
6
7
2. 기기 정보 수집:
8
- Android ID (Settings.Secure.ANDROID_ID)
9
- 기기 모델 (Build.MODEL)
10
- 제조사 (Build.MANUFACTURER)
11
- OS 버전 (Build.VERSION.RELEASE)
12
- 앱 버전 (PackageInfo.versionName)
13
14
3. DIDIM API로 검증 요청:
15
- URL: https://didimapp.com/api/verify-install
16
- Method: POST
17
- Headers:
18
- Authorization: Bearer {API_SECRET}
19
- Content-Type: application/json
20
- Body:
21
{
22
"type": "anonymousDevice",
23
"appId": "{APP_ID}",
24
"deviceHash": "{SHA256_HASH}",
25
"deviceInfo": { ... }
26
}
27
28
4. API Secret 및 App ID 관리:
29
- BuildConfig에서 안전하게 관리
30
- build.gradle에서 환경 변수로 주입
31
32
5. 구현 요구사항:
33
- Kotlin Coroutine 사용 (비동기 처리)
34
- HttpURLConnection 또는 OkHttp 사용
35
- 에러 핸들링 (네트워크, 파싱, API 오류)
36
- 로그 출력 (성공/실패 상태)
37
38
6. 호출 시점:
39
- Application.onCreate() 또는 MainActivity.onCreate()에서 호출
40
- 매일 앱 시작 시 호출 (14일 리텐션 추적)

📦 라이브러리 설치

kotlin
1
// build.gradle.kts (Module: app)
2
dependencies {
3
implementation("com.squareup.okhttp3:okhttp:4.12.0")
4
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
5
}

Android (Kotlin) 구현 예제입니다.

kotlin
1
import android.content.Context
2
import android.provider.Settings
3
import kotlinx.coroutines.Dispatchers
4
import kotlinx.coroutines.withContext
5
import java.net.HttpURLConnection
6
import java.net.URL
7
import java.security.MessageDigest
8
9
class DidimVerification(private val context: Context) {
10
private val apiSecret = BuildConfig.DIDIM_API_SECRET // 환경변수로 관리
11
private val appId = BuildConfig.DIDIM_APP_ID
12
private val baseUrl = "https://didimapp.com/api/verify-install"
13
14
suspend fun verifyInstall(): Result<Boolean> = withContext(Dispatchers.IO) {
15
try {
16
val androidId = Settings.Secure.getString(
17
context.contentResolver,
18
Settings.Secure.ANDROID_ID
19
)
20
val packageName = context.packageName
21
val deviceHash = createDeviceHash(androidId, packageName)
22
23
val deviceInfo = """
24
"androidId": "$androidId",
25
"model": "${android.os.Build.MODEL}",
26
"manufacturer": "${android.os.Build.MANUFACTURER}",
27
"osVersion": "${android.os.Build.VERSION.RELEASE}",
28
"appVersion": "${getAppVersion()}"
29
""".trimIndent()
30
31
val json = """
32
{
33
"type": "anonymousDevice",
34
"appId": "$appId",
35
"deviceHash": "$deviceHash",
36
"deviceInfo": { $deviceInfo }
37
}
38
""".trimIndent()
39
40
val url = URL(baseUrl)
41
val connection = url.openConnection() as HttpURLConnection
42
connection.requestMethod = "POST"
43
connection.setRequestProperty("Content-Type", "application/json")
44
connection.setRequestProperty("Authorization", "Bearer $apiSecret")
45
connection.doOutput = true
46
47
connection.outputStream.use { os ->
48
os.write(json.toByteArray())
49
}
50
51
val responseCode = connection.responseCode
52
Result.success(responseCode == 200)
53
} catch (e: Exception) {
54
Result.failure(e)
55
}
56
}
57
58
private fun createDeviceHash(androidId: String, packageName: String): String {
59
val input = "$androidId$packageName"
60
val bytes = MessageDigest.getInstance("SHA-256").digest(input.toByteArray())
61
return bytes.joinToString("") { "%02x".format(it) }
62
}
63
64
private fun getAppVersion(): String {
65
return try {
66
context.packageManager.getPackageInfo(context.packageName, 0).versionName ?: "unknown"
67
} catch (e: Exception) {
68
"unknown"
69
}
70
}
71
}
72
73
// 사용 예시 (Application.onCreate 또는 MainActivity.onCreate)
74
lifecycleScope.launch {
75
val verification = DidimVerification(applicationContext)
76
verification.verifyInstall()
77
.onSuccess { Log.d("DIDIM", "Verification successful") }
78
.onFailure { Log.e("DIDIM", "Verification failed", it) }
79
}

💡호출 시점

  • 앱 최초 실행 시 (Application.onCreate)
  • 매일 앱 시작 시 (14일 리텐션 추적을 위해)

추가 정보

  • API Secret은 Install Referrer 검증 등의 API 요청 시 필요합니다. 테스터 관리 페이지에서 확인할 수 있습니다.
  • Install Referrer 파싱 로직은 서버에서 자동으로 처리됩니다.
  • API 엔드포인트는 HTTPS를 사용하며, 모든 요청은 보안 연결됩니다.
  • 문의사항이 있으시면 support@didim.com으로 연락주세요.