Product 등록(v3.3.0)

3.2.0에서 3.3.0으로 올릴 때 꼭 바꿔야 하는 것은 두 가지입니다.

  1. Asleep.setup() 호출에 productInfo(기기 정보) 를 추가합니다.
  2. setup 완료(setupDidComplete)를 확인한 뒤 initAsleepConfig → 측정 시작 순서로 진행합니다.

측정 시작·종료, 리포트 조회 등 나머지 코드는 3.2.0과 같습니다.

🚧

setup은 앱 실행 시 한 번만 호출하세요.

init 결과, 측정 콜백, 화면 갱신 때마다 setup을 다시 호출하면 setup ↔ init이 반복될 수 있습니다. 실패 콜백 안에서 곧바로 재호출하지 말고, productRegisterFailed는 간격을 두고 재시도하고 productRegisterRejected는 재시도하지 마세요.

[앱 실행]
   │
   ① Asleep.setup(apiKey:productInfo:delegate:)  ← 앱 실행 시 한 번만. 기기 등록
   │     ├ 실패 → productRegisterFailed(간격 두고 재시도) / productRegisterRejected(입력값·키 확인, 재시도 X)
   │     └ setupDidComplete()
   │
   ② Asleep.initAsleepConfig(apiKey:userId:delegate:)  ← 기존 코드
   │     └ userDidJoin(userId:config:)
   │
   ③ 측정 시작   ← 기존 코드. 이때 생성된 세션이 기기에 연결됨
   │
   ④ 측정 종료   ← 기존 코드

1. SDK 버전 올리기

Swift Package Manager에서 asleep-sdk-ios3.3.0으로 업데이트합니다.


2. ProductInfo 준비

기기를 설명하는 세 가지 값을 준비합니다.

항목설명제약
model제품 모델명 (예: "model-123")1~100자
identifierType기기 식별값의 종류.serial 또는 .macAddress
identifierValue실제 시리얼 번호 또는 MAC 주소1~255자
let productInfo = Asleep.ProductInfo(
    model: "model-123",             // 제품 모델명 (≤100자)
    identifierType: .serial,        // .serial 또는 .macAddress
    identifierValue: deviceSerial   // 기기 고유값 (≤255자)
)
🚧

꼭 지켜주세요

  • identifierValue는 기기마다 달라야 하고, 바뀌지 않아야 합니다. 서버는 이 값으로 기기를 구분합니다.
  • 항상 같은 형식으로 넘겨주세요. SDK는 값을 가공하지 않고 그대로 비교·전송합니다. 대소문자, 구분자(: / -), 앞뒤 공백이 조금만 달라도 다른 기기로 보고 등록을 다시 요청합니다. 예) AA:BB:CC:DD:EE:FFaa-bb-cc-dd-ee-ff
  • model은 처음 등록할 때 정확한 값으로 넣어주세요. 같은 식별값으로 model만 바꿔 다시 등록해도 서버에 저장된 모델명은 바뀌지 않습니다.
  • 빈 값이나 길이를 넘는 값은 서버에 요청하지 않고 바로 productRegisterRejected로 실패합니다.

3. setup에 productInfo 추가

앱을 실행할 때 한 번(측정 시작 전), 매 실행마다 같은 productInfo setup을 호출합니다.

  • 처음 실행: 서버에 기기를 등록합니다.
  • 두 번째 실행부터: 기기에 저장된 등록 정보를 사용하므로 등록 요청 없이 바로 완료됩니다.

등록이 끝나면 SDK가 이후 세션 생성·데이터 업로드 등의 요청에 기기 정보를 자동으로 붙입니다. 앱에서 따로 할 일은 없습니다.

3.2.0

Asleep.setup(apiKey: apiKey, delegate: self)

3.3.0productInfo만 추가합니다.

Asleep.setup(apiKey: apiKey, productInfo: productInfo, delegate: self)
extension SleepController: AsleepSetupDelegate {
    func setupDidComplete() {
        // 기기 등록 완료 — 완료 상태를 기록하고 사용자 연결(initAsleepConfig) 진행
    }

    func setupDidFail(error: Asleep.AsleepError) {
        switch error {
        case .productRegisterFailed:    break  // 일시 실패 — 간격을 두고 setup 다시 호출
        case .productRegisterRejected:  break  // 거부 — productInfo / API Key 확인 (재시도 X)
        default:                        break  // 그 외 (예: 빈 API Key)
        }
    }

    func setupInProgress(progress: Int) { }
}
📘

3.2.0에서 setup 없이 initAsleepConfig만 호출하고 있었다면, 위처럼 setup을 새로 추가하고 setup 완료를 확인한 뒤 기존 initAsleepConfig를 호출하도록 순서만 바꾸면 됩니다.

setup 결과

결과의미앱에서 할 일
완료 (setupDidComplete)기기 등록 완료 (또는 저장된 등록 정보로 통과)사용자 연결(initAsleepConfig) 진행
productRegisterFailed일시 실패 — 네트워크 오류, 서버 오류. SDK가 이미 3번 재시도한 상태네트워크 확인 후 간격을 두고 setup 다시 호출
productRegisterRejected거부 — 입력값 오류, API Key 오류, 등록 권한 없음재시도하지 말고 productInfo와 API Key 확인. 해결되지 않으면 Asleep에 문의
  • 실패하면 완료 콜백은 오지 않습니다.
  • 실패 콜백 안에서 곧바로 setup을 다시 호출하지 마세요. 원인이 그대로면 실패 → 재호출이 끝없이 반복됩니다.
  • 에러와 함께 오는 message는 원인 확인용이며 문구가 바뀔 수 있습니다. 분기는 에러 케이스로 해주세요.

알아두면 좋은 점

  • 첫 등록은 시간이 걸릴 수 있습니다. 보통은 금방 끝나지만, 서버가 응답하지 않아 재시도를 모두 쓰면 최대 약 75초 뒤에 실패 콜백이 옵니다. setup을 기다리는 화면에는 로딩 표시를 권장합니다.
  • setup은 앱 실행 시 한 번만 호출하세요. init 결과, 측정 콜백, 화면 갱신마다 호출하면 두 번째부터는 즉시 완료되기 때문에 setup ↔ init이 빠르게 반복될 수 있습니다. 연결된 기기가 바뀐 경우만 예외입니다.
  • setup이 진행 중일 때 다시 setup을 호출하면 무시됩니다. 이 경우 콜백이 오지 않습니다.
  • 측정 중에 setup을 호출해도 무시됩니다. 이 경우에도 콜백이 오지 않으니, setup은 측정을 시작하기 전에 호출해주세요.

4. 사용자 연결 — setup 완료 확인 후 initAsleepConfig

setup 완료를 확인한 뒤 기존 initAsleepConfig를 호출합니다. 파라미터는 3.2.0과 같습니다.

  • init이 실패해도 setup을 다시 호출하지 마세요. 기기 등록은 이미 끝났으므로 initAsleepConfig만 다시 시도하면 됩니다.
private var isSetupCompleted = false

func setupDidComplete() {
    isSetupCompleted = true
    connectUser()
}

func connectUser() {
    guard isSetupCompleted else { return }
    Asleep.initAsleepConfig(apiKey: apiKey,
                            userId: userId,
                            delegate: self)
}

// AsleepConfigDelegate
func userDidJoin(userId: String, config: Asleep.Config) {
    self.config = config   // 측정·리포트에 사용
}

func didFailUserJoin(error: Asleep.AsleepError) {
    // setup은 다시 호출하지 않음. 필요하면 connectUser()만 재시도
}

func userDidDelete(userId: String) { }

5. 측정 시작·종료 — 기존 코드 그대로

측정 시작·종료 코드는 3.2.0과 같습니다. 아래 두 가지만 지켜주세요.

  • setup 완료 → 사용자 연결 성공 이후에 측정을 시작하세요. 세션이 만들어지는 순간 기기와 연결됩니다.
  • 연결된 기기가 바뀐 경우(다른 시리얼 번호) 측정을 끝낸 뒤 새 productInfosetup을 다시 호출하세요. 그 이후 만들어지는 세션부터 새 기기로 연결됩니다.

📘

3.3.0에는 API Key 대신 앱 인증 정보(appId · appSecret)로 인증하는 Token 방식도 추가되었습니다. Product 등록과는 별개 기능이며, 자세한 내용은 Setup 페이지를 참고하세요.


Did this page help you?