미션

미션은 사용자가 특정 조건을 달성하면 보상을 받는 기능입니다. 데일리 미션, 위클리 미션 등으로 사용자가 매일 앱을 방문하게 만듭니다.

시작하기

AdchainMission 인스턴스 생성

미션 기능을 사용하려면 먼저 AdchainMission 인스턴스를 생성합니다.

Android:

val adchainMission = AdchainMission()

iOS:

let adchainMission = AdchainMission()

React Native:

React Native에서는 SDK의 전역 인스턴스를 사용합니다.

import AdchainSdk from '@1selfworld/adchain-sdk-react-native';

이벤트 리스너 설정 (권장)

미션 완료, 진행, 갱신 이벤트를 받으려면 리스너를 설정합니다.

Android:

adchainMission.setEventsListener(object : AdchainMissionEventsListener {
    override fun onCompleted(mission: Mission) {
        Log.d(TAG, "Mission completed: ${mission.id}")
        // 미션 목록 새로고침
        refreshMissionList()
    }

    override fun onProgressed(mission: Mission) {
        Log.d(TAG, "Mission progressed: ${mission.id}")
        // 진행률 UI 업데이트
        updateMissionProgress(mission)
    }

    override fun onRefreshed(unitId: String?) {
        Log.d(TAG, "Mission refreshed: ${unitId}")
        // 미션 목록 전체 새로고침
        refreshMissionList()
    }
})

iOS:

React Native:

미션 목록 조회

현재 진행 중인 미션 목록을 가져옵니다.

Android:

iOS:

React Native:

React Native 중요: 모든 Mission API는 unitId 파라미터가 필수입니다. AdChain 대시보드에서 Mission Unit을 생성하고 해당 ID를 사용하세요.

응답 데이터 구조

MissionResponse (Android/iOS)

서버에서 반환되는 전체 응답 구조입니다.

필드
타입
설명

success

boolean

요청 성공 여부

events

Mission[]

미션 목록

current

number

완료된 미션 개수

total

number

전체 미션 개수

rewardUrl

string?

보상 수령 URL

titleText

string?

미션 섹션 제목 (예: "무료 포인트 모으기!")

descriptionText

string?

설명 텍스트

bottomText

string?

하단 텍스트 (예: "800만 포인트 받으러 가기")

rewardIconUrl

string?

보상 아이콘 URL

bottomIconUrl

string?

하단 아이콘 URL

MissionListResponse (React Native)

React Native에서 반환되는 응답 구조입니다.

필드
타입
설명

missions

Mission[]

미션 목록

completedCount

number

완료된 미션 개수

totalCount

number

전체 미션 개수

canClaimReward

boolean

보상 수령 가능 여부

titleText

string?

미션 섹션 제목

descriptionText

string?

설명 텍스트

bottomText

string?

하단 텍스트

rewardIconUrl

string?

보상 아이콘 URL

bottomIconUrl

string?

하단 아이콘 URL

Mission

개별 미션 객체의 구조입니다.

필드
타입
Android
iOS
React Native
설명

id

string

미션 고유 ID

title

string

미션 제목

description

string

미션 설명

imageUrl

string

썸네일 이미지 URL

landingUrl

string

✅ (actionUrl)

미션 URL

point

string

-

보상 포인트 (문자열)

reward

number

-

-

보상 포인트 (숫자)

status

string?

-

미션 상태

progress

number?

-

미션 진행도

total

number?

-

미션 목표

type

MissionType

✅ (string)

미션 타입

isCompleted

boolean?

-

-

완료 여부 (RN)

impressionOrder

number?

-

노출 순서 (내부 추적용)

placementId

string?

-

배치 ID (내부 추적용)

MissionType:

  • normal - 일반 미션

  • offerwall_promotion - 오퍼월 프로모션 (클릭 시 오퍼월 열림)

MissionProgress (iOS)

iOS의 load() 메서드가 두 번째 파라미터로 반환하는 구조입니다.

필드
타입
설명

current

number

완료된 미션 개수

total

number

전체 미션 개수

percentage

number

완료 비율 (자동 계산)

MissionStatus (Android)

Android의 getMissionStatus() 메서드가 반환하는 구조입니다.

필드
타입
설명

current

number

완료된 미션 개수

total

number

전체 미션 개수

isCompleted

boolean

모든 미션 완료 여부

canClaimReward

boolean

보상 수령 가능 여부

미션 클릭 처리

사용자가 미션을 클릭하면 clickMission() 메서드를 호출합니다.

Android:

iOS:

React Native:

clickMission 동작 흐름

clickMission() 호출 시 SDK는 자동으로:

  1. mission_clicked 이벤트 추적

  2. 리스너의 onClicked() 콜백 호출 (설정된 경우)

  3. 미션 WebView를 전체화면으로 열기

  4. 사용자가 미션 완료 시:

    • mission_completed 이벤트 추적

    • 리스너의 onCompleted() 콜백 호출

    • 포인트 자동 지급 (서버)

  5. 미션 진행 업데이트 시:

    • mission_progressed 이벤트 추적

    • 리스너의 onProgressed() 콜백 호출

  6. WebView에서 갱신 트리거 시:

    • 리스너의 onRefreshed() 콜백 호출

보상 수령

모든 미션을 완료하면 보상을 수령할 수 있습니다.

Android:

iOS:

React Native:

보상 수령 가능 여부는 MissionStatus.canClaimReward (Android), MissionListResponse.canClaimReward (React Native)로 확인하거나, iOS에서는 progress.current == progress.total로 판단합니다.

미션 상태 조회

Android

getMissionStatus() 메서드로 전체 미션 완료 상태를 조회합니다.

iOS

load() 메서드가 반환하는 MissionProgress를 사용합니다.

React Native

loadMissionList() 응답의 canClaimReward 필드를 사용합니다.

이벤트 리스너

리스너 인터페이스

Android:

iOS:

이벤트 설명

onCompleted

사용자가 미션을 완료했을 때 호출됩니다. 이 시점에서 UI를 새로고침해야 합니다.

호출 시점: 미션 WebView에서 완료 이벤트 수신 시

사용 예시:

Android:

iOS:

React Native:

onProgressed

미션 진행도가 업데이트되었을 때 호출됩니다.

호출 시점: 미션 WebView에서 진행 업데이트 이벤트 수신 시

사용 예시:

Android:

iOS:

React Native:

onRefreshed

미션 WebView에서 전체 미션 목록 갱신을 요청할 때 호출됩니다.

호출 시점: 미션 WebView에서 갱신 이벤트 트리거 시 (예: 보상 수령 후)

파라미터:

  • unitId: 갱신을 요청한 미션 Unit ID (Android/iOS는 nullable, React Native는 이벤트 페이로드에 포함)

사용 예시:

Android:

iOS:

React Native:

자동 추적 이벤트

SDK는 다음 이벤트를 자동으로 추적하여 AdChain 대시보드에 전송합니다.

이벤트명
발생 시점
페이로드

mission_impressed

미션 목록 로드 시 (각 미션마다)

missionId, missionTitle, impressionOrder, placementId, userId

mission_clicked

미션 클릭 시

missionId, missionTitle, landingUrl, impressionOrder, placementId, userId

mission_completed

미션 완료 시

missionId, missionTitle, impressionOrder, placementId, userId

mission_progressed

미션 진행 업데이트 시

missionId, missionTitle, progress, total, userId

mission_refreshed

미션 목록 갱신 시

unitId, userId

이 이벤트들은 별도로 구현할 필요가 없으며, AdChain 대시보드의 통계에 자동으로 반영됩니다.

UI 구현 가이드

미션 목록 표시

Android (RecyclerView)

iOS (UITableView)

React Native (FlatList)

진행률 UI 구현

Android 예제 (체크박스 + 라인):

완료된 미션 필터링

완료된 미션을 제외하고 싶다면:

Android/iOS:

React Native:

빈 상태 처리

미션이 모두 완료되었을 때:

보상 수령 UI

보상 수령 가능 시 UI 변경:

React Native 특수사항

unitId 파라미터

React Native SDK에서는 모든 Mission API에 unitId가 필수입니다.

unitId란?

  • AdChain 대시보드에서 생성하는 Mission Unit의 고유 식별자

  • 같은 앱에서 여러 Mission Unit을 운영할 수 있음 (예: 메인 화면, 프로필 화면)

  • 각 Unit별로 다른 미션 세트 관리 가능

사용 예시:

이벤트 리스너

React Native는 Native Event Emitter를 사용합니다.

주의사항 및 베스트 프랙티스

주의사항

  • 로그인 필수: 사용자가 로그인되어 있어야 미션 조회 가능

  • 네트워크 필요: 오프라인 상태에서는 조회 불가

  • point는 문자열: point 필드는 string 타입 (Android/iOS)

  • progress와 current 혼동 주의:

    • mission.progress / mission.total: 개별 미션의 진행도

    • response.current / response.total: 완료된 미션 개수

  • 플랫폼별 필드명 차이: iOS는 point, React Native는 reward

베스트 프랙티스

  1. 이벤트 리스너 우선 설정 (필수!)

  2. onCompleted/onRefreshed에서 반드시 새로고침

  3. onProgressed에서 부분 새로고침

  4. 미션 타입별 처리

  5. 보상 수령 가능 시 UI 변경

  6. 완료된 미션 시각적 구분

    • 투명도 낮추기 (alpha = 0.5)

    • "완료" 배지 표시

    • 클릭 비활성화

  7. React Native 캐싱 전략

  8. 에러 처리

  9. 진행률 UI 실시간 업데이트

  10. Android/iOS 인스턴스 관리

다음 단계

Last updated