iOS SDK

이 페이지에서는 BApp에서 Klip을 활용하기 위한 App2App iOS SDK를 소개합니다.

Kaia는 기존의 Klaytn과 Finschia 블록체인 네트워크가 통합되어 운영되는 블록체인의 새 이름입니다. 이에 따라 본 문서는 대부분 Klaytn을 Kaia로 / KLAY를 KAIA로 지칭하지만, 하위 호환성을 위해 기존 호출과 응답에서 사용되던 klaytn, KLAY 등의 키워드는 동일하게 유지되는 점 참고 부탁드립니다.

요구 사항

  • iOS 12.0 이상

  • Swift 5.0 이상

  • Xcode 13.4 이상

환경 설정

Klip iOS SDK는 별도의 가입 절차가 필요하지 않습니다. HTTP 통신이 가능한 어느 환경에서도 동작합니다. 다만, 기본적으로 Klip 앱이 설치된 환경에서 호출해야 합니다. Klip 앱을 실행하여 Klip 사용자의 승인을 받아야 하기 때문입니다.

1. Klip SDK 다운로드

다운로드 페이지에서 Klip iOS SDK를 다운받습니다.

2. Klip SDK Framework 추가

Klip SDK Framework를 Import하여 개발 프로젝트에 추가

  1. 개발 중인 프로젝트를 Xcode로 실행

  2. Xcode > 개발 프로젝트의 TARGETS 선택 > General Tab > Framworks, Libraries, and Embedded Content Tab > 왼쪽 하단의 + 버튼을 클릭

  3. Source Directory에 다운받은 Klip SDK 프로젝트의 sdk 디렉토리를 선택, 클릭한 후 Next를 클릭

  4. 왼쪽의 Project navigator의 Frameworks에 해당 SDK가 Import 되었는지 확인 후 build 수행

Apple App Store 등록용 앱 빌드 시에는 KlipLib.xcframework만 포함되어야 합니다. KlipLib-simulator.xcframework는 개발 환경에만 사용해주세요.

Klip SDK 소스가 개발 프로젝트에 복사되고 라이브러리 코드를 직접 수정할 수 있습니다.

3. Info.plist 설정

앱 실행 허용 목록(Allowlist) 등록하기

iOS 9.0 이상에서 iOS SDK로 Klip 등 애플리케이션 실행 기능을 이용하려면 Info.plist 파일에 설정을 추가하여 커스텀 스킴 정보를 등록해야 합니다.

[Info] > [Custom iOS Target Properties]에 Array 타입 키(Key)인 LSApplicationQueriesSchemes를 추가하고, 해당 키의 'Item'으로 커스텀 스킴에 사용할 값인 'klip'을 추가합니다.

 	<key>LSApplicationQueriesSchemes</key>
 	<array>
 		<string>klip</string>
 	</array>

4. Source Import 설정

v2.1.0 이상

import KlipLib

v2.1.0 미만

import KlipSDK

API

개요

App2App API 요청은 크게 prepare, request, getResult의 순서로 진행이 됩니다.

  • prepare는 어떠한 요청을 할지 요청을 정의하는 단계로 총 5가지 종류의 요청이 존재

  • request는 함수 호출을 통해 Klip으로 화면이 전환되어 실제 서명 프로세스를 진행

  • getResult는 함수 호출을 통해 결과값을 받고 확인

추가적으로 getCardList는 BApp 개발의 편의를 위해 Klip 사용자의 NFT 목록을 받아올 수 있도록 제공되는 함수입니다.

KlipSDK.shared

Klip SDK를 사용하기 위한 인스턴스를 생성합니다.

Return Value

Example

let klip = KlipSDK.shared

KlipSDK.shared.prepare

KlipSDK.shared.prepare(request: KlipRequest, bappInfo: BAppInfo, completion: @escaping(KlipCallback<KlipTxResponse>) -> Void) App2App API 요청 처리를 준비하고 request key를 발급합니다.

Request 값에 사용할 객체

  • Klip 연결 타입(=인증)의 경우 AuthRequest

  • KAIA(=KLAY) 전송 타입의 경우 KlayTxRequest

  • Token 전송 타입의 경우 TokenTxRequest

  • Card 전송 타입의 경우 CardTxRequest

  • Contract 실행 타입의 경우 ContractTxRequest

  • Sign Message 요청 타입의 경우 SignMessageRequest - 이 경우 Klaytn 표준에 따라 "\x19Klaytn Signed Message:\n" + len(message)의 접두사를 붙여 서명합니다.

Parameters

Klip 사용자에게 동의 요청시, request와 bappInfo에 입력된 정보가 출력됩니다. 응답 결과에 포함된 request key는 사용자에게 트랜잭션을 요청하기 위한 컨텍스트 키의 역할을 수행하며, 사용자 동의 요청 및 결과확인 API와 함께 사용 됩니다.

Example 1. 사용자 정보 획득하기

// 사용자 정보 획득 요청문
let req: AuthRequest = AuthRequest();

// BApp 정보
let bappInfo: BAppInfo = BAppInfo(name : "BApp Name");

// 응답 결과 Callback
KlipSDK.shared.prepare(request: req, bappInfo: bappInfo) { result in
    switch result {
    case .success(let response):
    case .failure(let error):
    }
}

Example 2. KAIA(=KLAY) 전송하기

// KAIA 전송 트랜잭션 요청문
let req: KlayTxRequest = KlayTxRequest(to: "0x..receiver address..", amount: "10")
  
KlipSDK.shared.prepare(request: req, bappInfo: bappInfo) { result in
    switch result {
    case .success(let response):
    case .failure(let error):
    }
}

Example 3. Token 전송하기

// Token 전송 트랜잭션 요청문
let req: TokenTxRequest = TokenTxRequest(to: "0x..receiver address..", amount: "10", contract: "0x..token contract address..")
  
KlipSDK.shared.prepare(request: req, bappInfo: bappInfo) { result in
    switch result {
    case .success(let response):
    case .failure(let error):
    }
}

Example 4. Card 전송하기

// Card 전송 트랜잭션 요청문
let req: CardTxRequest = CardTxRequest(to: "0x..receiver address..", contract: "0x..card contract address..", cardId: "9")
  
KlipSDK.shared.prepare(request: req, bappInfo: bappInfo) { result in
    switch result {
    case .success(let response):
    case .failure(let error):
    }
}

Example 5. Contract 실행하기

// Contract 실행 트랜잭션 요청문
let req: ContractTxRequest = ContractTxRequest(to: "0x..contract address..", value: "10", abi: "{...}", params: "[{...}]")
  
KlipSDK.shared.prepare(request: req, bappInfo: bappInfo) { result in
    switch result {
    case .success(let response):
    case .failure(let error):
    }
}

Example 6. Sign Message 요청하기

// Sign Message 요청문
let req = SignMessageRequest(value: "message", from: "0x..contract address..")
  
KlipSDK.shared.prepare(request: req, bappInfo: bappInfo) { result in
    switch result {
    case .success(let response):
    case .failure(let error):
    }
}

KlipSDK.shared.request

KlipSDK.shared.request(requestKey: String) -> Void Deep Link를 이용하여 Klip에 인증 또는 서명을 요청합니다. 실행 중인 스마트폰 기기에 Klip 앱이 설치되지 않았거나 자동 실행할 수 없는 경우 'Klip 소개 페이지(https://klipwallet.com)' 로 이동하여 사용자는 Klip 앱을 다운로드받을 수 있습니다. requestKey에는 prepare 단계에서 Klip 서버로부터 받은 요청 번호를 사용합니다.

PC 환경에서 QR code를 이용한 request 스텝 처리는 QR code 예제 항목을 참조하십시오.

Parameters

Example

KlipSDK.shared.request(requestKey: "request key...")

KlipSDK.shared.getResult

KlipSDK.shared.getResult(requestKey: String, completion: @escaping(KlipCallback<KlipTxResponse>) -> Void) App2App API 요청에 대한 결과를 확인합니다. requestKey에는 prepare 및 request 단계에서 사용한 요청 번호를 사용합니다.

Parameters

Example

KlipSDK.shared.getResult(requestKey: "request key...") { result in
    switch result {
    case .success(let response):
    case .failure(let error):
    }
}

KlipSDK.shared.getCardList

KlipSDK.shared.getCardList(cardAddress: String, userAddress: String, cursor: String?, completion: @escaping(KlipCallback<CardListResponse>) -> Void) 사용자의 모든 카드 중 특정 카드의 목록을 가져옵니다.

Parameters

Example

KlipSDK.shared.getCardList(cardAddress: "0x..card address..", userAddress: "0x..user address..", cursor: nil) { result in
    switch result {
    case .success(let response):
    case .failure(let error):
    }
}

Error Code

이 문서 혹은 Klip에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

Last updated