docs(event): SDK 조사와 딥링크 리뷰를 보존한다
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
# AppsFlyer 실제 SDK 콜백 검증
|
||||
|
||||
## 1. 검토 정보
|
||||
- 일자: 2026-10-29. 대상: 제한적으로 승인된 P1-T2, 제품 구현 전 SDK 검증.
|
||||
- 승인 범위: AppsFlyer 테스트 OneLink 해석만. 이벤트 API·앱 서버·푸시 발송·운영 앱 실행은 제외.
|
||||
- 실제 SDK: 설치된 iOS Simulator artifact **6.17.5 (build 2)**, x86_64, iOS 17.5의 작업 소유 임시 시뮬레이터.
|
||||
- 현재 결과: 긴 링크의 수동 API와 UDL 공존 동작 확인. 단축 링크의 정상 해석은 아직 입증하지 못함.
|
||||
|
||||
## 2. 실행 방식
|
||||
UIKit과 AppsFlyer만 연결한 별도 임시 앱에서 `AppsFlyerLibDelegate`와 `DeepLinkDelegate`를 설정한 뒤 `performOnAppAttribution(with:)`를 호출했다. 실제 SDK callback만 JSONL로 기록했다. SodaLive 앱 소스나 이벤트 API를 실행하지 않았으며 `start`, `logEvent`, 푸시 관련 API는 호출하지 않았다.
|
||||
|
||||
입력:
|
||||
- 긴 링크: `https://voiceon.onelink.me/RkTm?pid=sdk-validation&deep_link_value=event-detail&deep_link_sub5=123`
|
||||
- 단축 샘플: `https://onelink-basic-app.onelink.me/H5hv/6d66214a`, AppsFlyer [공식 legacy 문서](https://dev.appsflyer.com/hc/docs/dl_ios_gcd_legacy)의 공개 예시. 현재 유효성을 별도로 보장하는 링크는 아니다.
|
||||
|
||||
실행은 매번 새 앱 프로세스로 분리했다. 설정 없는 실행과 합성 SDK 설정 실행을 구분하고, UDL delegate 없는 legacy-only 대조군도 확인했다. 실제 앱 자격증명은 로드하지 않았다.
|
||||
|
||||
## 3. 실제 관찰
|
||||
| 구성 | 입력 | 실제 manual 호출 이후 callback | 결과 |
|
||||
|---|---|---|---|
|
||||
| UDL + legacy delegate | 긴 링크 | `didResolveDeepLink` | found, event-detail, ID 123 |
|
||||
| UDL + legacy delegate + 합성 설정 | 긴 링크 | `didResolveDeepLink` | found, event-detail, ID 123 |
|
||||
| legacy delegate만 | 긴 링크 | `onAppOpenAttribution` | success, event-detail, ID 123 |
|
||||
| UDL + legacy delegate | 단축 샘플 | `didResolveDeepLink` | failure, NSError domain com.appsflyer.sdk.deeplink, code 0 |
|
||||
| UDL + legacy delegate + 합성 설정 | 단축 샘플 | `didResolveDeepLink` | 같은 failure, 이벤트 값 없음 |
|
||||
| legacy delegate만 | 단축 샘플 | `onAppOpenAttributionFailure` | 같은 오류 domain/code |
|
||||
|
||||
SDK 헤더의 enum은 notFound=0, found=1, failure=2다. 긴 링크의 실제 기록:
|
||||
```json
|
||||
{"callback":"delegate-check","status":"legacySame-true-udlSame-true-udlPresent-true"}
|
||||
{"callback":"performOnAppAttribution","status":"invoking"}
|
||||
{"callback":"didResolveDeepLink","status":"AFSDKDeepLinkResultStatus(rawValue: 1)","eventvalue":"event-detail","ID":"123","errorclass":"none"}
|
||||
```
|
||||
위 JSON은 동일 실행의 허용된 필드만 발췌한 기록이다. 원래 callback을 테스트 코드가 직접 호출한 것이 아니라 실제 SDK가 delegate에 전달했다.
|
||||
|
||||
## 4. 혼동 방지
|
||||
- 첫 harness는 UDL delegate setter 직후 동기 identity assertion이 실패해 URL 해석 호출 전에 종료됐다. 이는 SDK URL 실패 사례로 집계하지 않는다. 이후 실제 호출 직전 양 delegate 등록을 관찰하여 검증했다. 테스트의 대기 시간은 제품 코드에 적용할 요구사항이 아니다.
|
||||
- UDL 설정 직후 manual 호출 이전의 notFound/failure callback도 관찰됐다. 이 callback은 manual 요청 결과와 구분했다. manual 긴 링크 결과는 그 뒤의 found + event-detail/123이다.
|
||||
- 긴 링크 파라미터는 SDK가 URL 자체에서 추출할 수 있으므로, 이 성공을 AppsFlyer 서버의 링크 존재/설정 검증 성공이라고 표현하지 않는다.
|
||||
- 단축 샘플의 실패만으로 SDK가 단축 링크를 지원하지 않는다고 결론내리지 않는다. 정상 단축 fixture의 성공 결과는 확보되지 않았다.
|
||||
|
||||
## 5. 코드·증거 확인
|
||||
상위 실행자는 임시 Probe.swift, build/run 스크립트, 실제 JSONL 결과 및 SDK의 AppsFlyerDeepLinkResult.h enum을 직접 읽었다. 제품 소스 변경이나 신규 앱 기능 완료를 의미하지 않는다. 리소스 정리 및 최종 gate 판정은 후속 기록한다.
|
||||
|
||||
## 6. 최종 판정과 정리
|
||||
- 콜백 공존과 긴 URL 파라미터 전달: 확인. 정상 short 해석: 미입증. 전체 P1-GATE는 유지하며 유효한 이벤트용 단축 OneLink가 다음 검증 입력이다.
|
||||
- SDK simulator 바이너리 SHA-256: `4c940fc1670de4e05bc55d8e0436130c57ff4878ddd1b6778029a5d99d69205c`. 이전 검토의 디바이스 slice와는 다른 바이너리이며 버전은 동일하다.
|
||||
- 소유 bundle `local.sdkprobe.eventlink.20261029.a` 제거, 소유 iOS17.5 simulator shutdown/delete 모두 exit 0. 상위 실행자도 UUID `0E44E774-8669-4513-A12D-C8FA4F331A03`의 simulator inventory 부재와 잔여 앱 프로세스 부재를 직접 확인했다. 기존 사용자 기기는 변경하지 않았다.
|
||||
- SDK 실제 callback 로그 7개에 대한 사후 검증은 모든 케이스에서 관찰된 callback 선택과 필드 유무가 일치했다. 이는 short 성공 7건이라는 뜻이 아니라 성공/실패를 포함한 실제 로그의 정합성 검사다.
|
||||
- 테스트 앱·시뮬레이터 제거 확인 후 일회성 harness·binary·cache·raw 로그가 있던 소유 임시 root를 제거했고 부재를 확인했다. 실제 관찰 결과와 제한은 이 문서와 계획에 보존했다.
|
||||
Reference in New Issue
Block a user