iOS 연동
Swift 네이티브 iOS 앱에서 인센토 위젯을 연동하는 가이드입니다.
이 가이드는 Swift로 작성된 네이티브 iOS 앱 기준입니다.
요구사항: iOS 15+, Swift 5.7+. 연동 전 필요한 조건은 사전 준비에서 확인하세요.
연동 절차
파일 추가하기
IncentoService.swift 파일을 Xcode 프로젝트에 추가합니다. 외부 라이브러리 의존성은 없습니다.
Info.plist 설정: 위젯이 네트워크 요청을 하므로 ATS(App Transport Security)가 기본 허용 상태인지 확인하세요. 이미 인터넷을 사용하는 앱이라면 별도 설정이 필요하지 않습니다.
설치하기 — 이벤트 훅 등록
앱 실행 시 한 번만 boot()를 호출합니다. App 구조체의 init()에서 이벤트 훅을 등록합니다.
import SwiftUI
@main
struct MyApp: App {
init() {
IncentoService.shared.on("loginRequired") {
// 로그인 화면으로 이동
}
}
var body: some Scene {
WindowGroup {
ContentView()
}
}
}boot — SDK 초기화
// 비로그인 상태
IncentoService.shared.boot(apiKey: "inc_pk_YOUR_KEY")
// 로그인 상태
IncentoService.shared.boot(apiKey: "inc_pk_YOUR_KEY", userId: "회원_고유_ID")boot 파라미터
boot 개념과 동작 순서는 boot 파라미터 레퍼런스를 참고하세요. iOS는 아래 파라미터를 받습니다.
Prop
Type
커스텀 버튼
기본 런처 버튼의 크기·위치·모양은 인센토 대시보드에서 설정한 값이 자동으로 반영됩니다. 이 스타일을 그대로 사용한다면 별도 작업이 필요 없습니다.
대시보드 스타일 대신 앱 내 임의의 버튼으로 위젯을 열고 싶을 때 커스텀 버튼을 사용하세요.
핵심 패턴은 boot() 시 visible: false로 런처 버튼을 숨기고, 커스텀 버튼에서 open()을
호출하는 것입니다.
// 1. boot 시 런처 버튼 숨기기
IncentoService.shared.boot(apiKey: "inc_pk_YOUR_KEY", userId: userId, visible: false)
// 2. 커스텀 버튼에서 위젯 열기
Button("혜택 받기") {
IncentoService.shared.open()
}로그인·로그아웃 등으로 shutdown → boot를 재호출할 때도 반드시 visible: false를
유지하세요. 빠뜨리면 런처 버튼이 다시 나타납니다.
func onLoginSuccess(userId: String) {
IncentoService.shared.shutdown()
IncentoService.shared.boot(apiKey: "inc_pk_YOUR_KEY", userId: userId, visible: false)
}
func onLogout() {
IncentoService.shared.shutdown()
IncentoService.shared.boot(apiKey: "inc_pk_YOUR_KEY", visible: false)
}boot() 완료 전에 open()을 호출하면 무시됩니다.
로그인 후 위젯 자동 오픈
위젯 내 로그인 버튼을 눌렀을 때(loginRequired), 로그인 완료 후 위젯이 자동으로 열리게 하려면
autoOpen: true를 사용합니다.
// loginRequired 핸들러에서 플래그 저장 후 로그인 화면 이동
IncentoService.shared.on("loginRequired") {
UserDefaults.standard.set(true, forKey: "pendingIncentoOpen")
// 로그인 화면으로 이동
}
// 로그인 완료 후
func onLoginSuccess(userId: String) {
let shouldOpen = UserDefaults.standard.bool(forKey: "pendingIncentoOpen")
UserDefaults.standard.removeObject(forKey: "pendingIncentoOpen")
IncentoService.shared.shutdown()
IncentoService.shared.boot(
apiKey: "inc_pk_YOUR_KEY",
userId: userId,
visible: false,
autoOpen: shouldOpen,
debug: true,
)
}show / hide — 화면별 위젯 노출 제어
특정 화면에서만 위젯을 표시하고 싶을 때 사용합니다.
IncentoService.shared.show() // 런처 버튼 표시
IncentoService.shared.hide() // 런처 버튼 숨김 + 위젯이 열려있으면 닫음뷰의 .onAppear / .onDisappear modifier와 연결합니다.
// 마이페이지에서만 위젯 표시 예시
struct MyPageView: View {
var body: some View {
// ...
.onAppear {
IncentoService.shared.show()
}
.onDisappear {
IncentoService.shared.hide()
}
}
}이벤트 훅
이벤트 목록과 공통 규칙은 이벤트 훅 레퍼런스에 정리되어 있습니다. iOS에서는 앱 초기화 시 한 번만 등록합니다.
// loginRequired — 미등록 시 위젯 내 로그인 버튼이 동작하지 않습니다
IncentoService.shared.on("loginRequired") {
DispatchQueue.main.async {
// @State 또는 환경 객체로 로그인 화면 표시
}
}
IncentoService.shared.on("widgetOpen") {
print("위젯 열림")
}
IncentoService.shared.on("widgetClose") {
print("위젯 닫힘")
}shutdown — SDK 종료 및 인증 상태 변경
로그인·로그아웃 등 인증 상태가 바뀔 때 shutdown → boot 패턴을 사용합니다.
// 로그인 완료
func onLoginSuccess(userId: String) {
IncentoService.shared.shutdown()
IncentoService.shared.boot(apiKey: "inc_pk_YOUR_KEY", userId: userId)
}
// 로그아웃 완료
func onLogout() {
IncentoService.shared.shutdown()
IncentoService.shared.boot(apiKey: "inc_pk_YOUR_KEY")
}shutdown() 후 재boot() 시 현재 화면이 위젯 미표시 화면이라면 visible: false로
설정하세요.
IncentoService.shared.boot(apiKey: "inc_pk_YOUR_KEY", userId: userId, visible: false)