# 메서드

## getStatus

WepinSDK의 Lifecycle 상태 값을 반환합니다.

### Parameters

* None

### Return Value

* \<WepinLifeCycle>
  * notInitialized: `WepinSDK`이 초기화되지 않음
  * initializing: `WepinSDK`초기화 진행 중
  * initialized: `WepinSDK`초기화 완료
  * beforeLogin: `WepinSDK`은 초기화되었으나 사용자는 로그인 되지 않음
  * login: 사용자가 로그인 되었고 위핀에도 가입되어있음
  * loginBeforeRegister: 사용자가 로그인하였으나 위핀에 가입되지 않음

### Example

```swift
do {
    let statusResult = try await widget.getStatus()
    self.lifecycle = statusResult
    return lifecycle
} catch {
    self.lifecycle = .notInitialized
    return lifecycle
}
```

***

## loginWithUI

`loginWithUI()` 메서드는 위젯을 사용하여 로그인하는 기능을 제공하며, 로그인된 사용자의 정보를 반환합니다. 사용자가 이미 로그인되어 있는 경우, 위젯을 표시하지 않고 로그인된 사용자의 정보를 바로 반환합니다. 위젯 없이 로그인을 수행하려면, `login` 변수의 `loginWepin()` 메서드를 대신 사용해야 합니다.

### Parameters

* `viewController` \<UIViewController> - 위젯(WebView)을 모달 방식으로 표시할 기준이 되는 뷰 컨트롤러입니다. 위젯이 올바른 화면 위에 표시될 수 있도록 표시 컨텍스트를 제공합니다.
* `loginProviders`<\[LoginProviderInfo]>\
  위젯을 구성할 로그인 프로바이더들의 목록입니다. 빈 목록이 제공되면 이메일 로그인 기능만 사용할 수 있습니다.
  * `provider`\<String>\
    OAuth 로그인 프로바이더(예: 'google', 'naver', 'discord', 'apple')
  * `clientId`\<String>\
    OAuth 로그인 프로바이더의 클라이언트 ID입니다.
* `email`\<String> *optional*\
  `email` 매개변수는 위젯에서 로그인할 때 지정된 이메일 주소로 로그인할 수 있도록 합니다.

### Return Value

* \<WepinUser>
  * `status` \<String>\
    성공여부<'success'|'fail'>
  * `userInfo` \<WepinUserInfo> *optional*\
    사용자 정보
    * `userId` \<String>\
      Wepin 사용자 ID
    * `email` \<String>\
      Wepin 에 로그인된 사용자의 이메일 주소
    * `provider` \<WepinLoginProviders>\
      로그인 프로바이더 이름 <'google'|'apple'|'naver'|'discord'|'email'|'external\_toekn'>
    * `use2FA` \<Bool>\
      사용자 지갑에 2FA가 활성화 되어 있는지 여부
  * `userStatus` \<WepinUserStatus>\
    사용자 상태
    * `loginStatus` \<WepinLoginStatus>\
      로그인 상태<'complete'|'pinRequired'|'registerRequired'>
    * `pinRequired` \<Bool> *optional*\
      사용자 PIN 번호 필요 여부
  * `walletId` \<String> *optional*\
    Wepin 사용자의 지갑 ID
  * `token` \<WepinToken>\
    Wepin Token 정보
    * `access` \<String>\
      Wepin Access Token
    * `refresh` \<String>\
      Wepin Refresh Token&#x20;

### Example

```swift
let providerInfos: [LoginProviderInfo] = [
    LoginProviderInfo(provider: "google", clientId: "GOOGLE_CLIENT_ID"),
    LoginProviderInfo(provider: "apple", clientId: "APPLE_CLIENT_ID"),
    LoginProviderInfo(provider: "discord", clientId: "DISCORD_CLIENT_ID"),
    LoginProviderInfo(provider: "naver", clientId: "NAVER_CLIENT_ID"),
    LoginProviderInfo(provider: "facebook", clientId: "FACEBOOK_CLIENT_ID"),
    LoginProviderInfo(provider: "line", clientId: "LINE_CLIENT_ID")
]
let user = try await widget.loginWithUI(viewController: self, loginProviders: self.providerInfos)
```

***

## openWidget

위젯 창을 열어줍니다. 사용자가 로그인되어 있지 않으면 위젯 창이 열리지 않으므로, `openWidget`을 호출하기 전에 반드시 사용자가 위핀에 로그인되어 있어야 합니다. 로그인하려면 `loginWithUI` 매서드 또는 `login` 변수의 `loginWepin` 메서드를 사용해야 합니다.

### Parameters

* `viewController` \<UIViewController> - 위젯(WebView)을 모달 방식으로 표시할 기준이 되는 뷰 컨트롤러입니다. 위젯이 올바른 화면 위에 표시될 수 있도록 표시 컨텍스트를 제공합니다.

### Return Value

* \<Bool>\
  성공적으로 위젯이 열린 경우 true 반환

### Example

```swift
do {
    let result = try await widget.openWidget(viewController: self)
    updateStatus(result ? "Widget Opened" : "Open Widget Failed")
} catch {
    updateStatus("Error: \(error.localizedDescription)")
}
```

***

## closeWidget

위젯 창을 닫습니다. 창을 닫아도 로그아웃되지 않습니다.

### Parameters

* None

### Return Value

* None

### Example

```swift
try wepinWidget?.closeWidget()
```

***

## register

사용자를 위에 등록합니다. 가입 및 로그인 후 위핀 위젯의 등록 페이지가 열리며, 위핀 서비스에 등록(지갑 생성 및 계정 생성)을 진행합니다. 이 기능은 `WepinSDK`의 `WepinLifeCycle`이 `loginBeforeRegister` 상태일 때만 사용할 수 있습니다. `loginWithUI` 매서드 또는 `login` 변수의 `loginWepin` 메서드를 호출한 후, `userStatus`의 `loginStatus` 값이 'complete'가 아니면 이 메서드를 호출해야 합니다.

### Parameters

* `viewController` \<UIViewController> - 위젯(WebView)을 모달 방식으로 표시할 기준이 되는 뷰 컨트롤러입니다. 위젯이 올바른 화면 위에 표시될 수 있도록 표시 컨텍스트를 제공합니다.

### Return Value

* \<WepinUser>
  * `status` \<String>\
    성공여부<'success'|'fail'>
  * `userInfo` \<WepinUserInfo> *optional*\
    사용자 정보
    * `userId` \<String>\
      Wepin 사용자 ID
    * `email` \<String>\
      Wepin 에 로그인된 사용자의 이메일 주소
    * `provider` \<WepinLoginProviders>\
      로그인 프로바이더 이름 <'google'|'apple'|'naver'|'discord'|'email'|'external\_toekn'>
    * `use2FA` \<Bool>\
      사용자 지갑에 2FA가 활성화 되어 있는지 여부
  * `userStatus` \<WepinUserStatus>\
    사용자 상태
    * `loginStatus` \<WepinLoginStatus>\
      로그인 상태<'complete'|'pinRequired'|'registerRequired'>
    * `pinRequired` \<Bool> *optional*\
      사용자 PIN 번호 필요 여부
  * `walletId` \<String> *optional*\
    Wepin 사용자의 지갑 ID
  * `token` \<WepinToken>\
    Wepin Token 정보
    * `access` \<String>\
      Wepin Access Token
    * `refresh` \<String>\
      Wepin Refresh Token&#x20;

### Example

```swift
do {
    let result = try await widget.register(viewController: self)
    self.updateStatus("Registered: \(result)")
} catch {
    self.updateStatus("Error: \(error.localizedDescription)")
}
```

***

## getAccounts

앱에서 사용 가능한 사용자의 계정 정보(네트워크와 주소)를 반환합니다. 이 기능은 위핀에 로그인한 후에만 사용할 수 있습니다. 파라미터가 없는 경우에는 사용자의 모든 계정 정보가 반환됩니다.

### Parameters

* `networks` <\[String]> *optional*\
  반환받고자 하는 계정의 네트워크입니다. 네트워크로 지원하는 블록체인 목록은 아래 지원 블록체인 페이지에서 확인 가능합니다.
* `withEoa` \<Bool> *optional*\
  AA 계정이 있는 경우, EOA 계정도 포함하여 반환할지 여부를 지정합니다.

{% content-ref url="../../../wepin/supported-blockchains" %}
[supported-blockchains](https://docs.wepin.io/wepin/supported-blockchains)
{% endcontent-ref %}

### Return Value

* <\[WepinAccount]>
  * `address` \<String>\
    사용자 계정의 주소
  * `network` \<String>\
    사용자 계정의 네트워크 종류
  * `contract` \<String> *optional*\
    토큰의 Contract 주소
  * `isAA` \<Bool> *optional*\
    AA 계정인지 여부

### Example

```swift
do {
    let accounts = try await widget.getAccounts()
    self.updateStatus("Accounts: \(accounts)")
} catch {
    self.updateStatus("Error: \(error.localizedDescription)")
}
```

***

## getBalance

정의 잔액(수량) 정보를 반환합니다. 이 기능은 위핀에 로그인한 후에만 사용할 수 있습니다. `accounts` 파라미터가 없는 경우에는 사용자의 모든 계정의 잔액이 반환됩니다.

### Parameters

* `accounts` <\[WepinAccount]> *optional*
  * `network` \<String>\
    잔액을 조회할 사용자 계정의 네트워크 종류
  * `address` \<String>\
    잔액을 조회할 사용자 계정의 주소
  * `contract` \<String> optional\
    토큰의 컨트렉트 주소
  * `isAA` \<Boolean> *optional*\
    AA계정인지 여부

### Return Value

* <\[WepinAccountBalanceInfo]>
  * `network` \<String>\
    사용자 계정의 네트워크 종류
  * `address` \<String>\
    사용자 계정의 주소
  * `symbol` \<String>\
    네트워크 심볼
  * `balance` \<String>\
    보유하고 있는 네트워크 코인의 수량
  * `token` <\[WepinTokenBalanceInfo]>
    * `symbol` \<String>\
      토큰 심볼
    * `balance` \<String>\
      보유하고 있는 토큰의 수량
    * `contract` \<String>\
      토큰 Contract 주소소

### Example

```swift
do {
    let balance = try await widget.getBalance()
    self.updateStatus("Balance: \(balance)")
} catch {
    self.updateStatus("Error: \(error.localizedDescription)")
}
```

***

## getNFTs

사용자의 NFT를 반환합니다. 이 기능은 위핀에 로그인한 후에만 사용할 수 있습니다. `networks`파라미터가 없는 경우에는 사용자의 모든 NFT 정보가 반환됩니다.

### Parameters

* `refresh` \<Bool>\
  NFT 데이터를 온체인에서 새로 조회할지 여부
* `networks` <\[String]> *optional*\
  NFT 를 필터링할 네트워크 이름 목록

### Return Value

* <\[WepinNFT]>
  * `account` \<WepinAccount>
    * `address` \<String>\
      사용자 계정의 주소
    * `network` \<String>\
      사용자 계정의 네트워크 종류
    * `contract` \<String> *optional*\
      토큰의 Contract 주소
    * `isAA` \<Bool> *optional*\
      AA 계정인지 여부
  * contract \<WepinNFTContract>
    * `name` \<String>\
      NFT Contract 이름
    * `address` \<String>\
      NFT Contract 주소
    * `scheme` \<String>\
      NFT의 스킴
    * `description` \<String> *optional*\
      NFT Contract의 설명
    * `network` \<String>\
      NFT Contract 와 연결된 네트워크
    * `externalLink` \<String> *optional*\
      NFT Contract와 관련된 외부 링크
    * `imageUrl` \<String> *optional*\
      NFT Contract와 관련된 이미지 URL
  * `name` \<String>\
    NFT 이름
  * `description` \<String>\
    NFT 의 설명
  * `externalLink` \<String>\
    NFT 와 관련된 외부 링크
  * `imageUrl` \<String>\
    NFT 와 관련된 이미지 URL
  * `contentUrl` \<String> *optional*\
    NFT와 연결된 콘텐츠의 URL
  * `quantity` \<Int> *optional*\
    NFT의 수량
  * `contentType` \<String>\
    NFT 의 콘텐츠 유형<'image'|'video'>
  * `state` \<Int>\
    NFT의 상태

### Example

```swift
do {
    let nfts = try await widget.getNFTs(refresh: false)
    self.updateStatus("NFTs: \(nfts)")
} catch {
    self.updateStatus("Error: \(error.localizedDescription)")
}
```

***

## send

위젯을 이용하여 send기능을 수행하고 send 트랜젝션의 ID정보를 반환합니다. 이 기능은 위핀에 로그인한 후에만 사용할 수 있습니다.

### Parameters

* `viewController` \<UIViewController> - 위젯(WebView)을 모달 방식으로 표시할 기준이 되는 뷰 컨트롤러입니다. 위젯이 올바른 화면 위에 표시될 수 있도록 표시 컨텍스트를 제공합니다.
* `account` \<WepinAccount>
  * `address` \<String>\
    사용자 계정의 주소
  * `network` \<String>\
    사용자 계정의 네트워크 종류
  * `contract` \<String> *optional*\
    토큰의 Contract 주소
  * `isAA` \<Boolean> *optional*\
    AA 계정인지 여부
* txData \<WepinTxData> *optional*
  * `toAddress` \<String>\
    전송 받을 주소
  * `amount` \<String>\
    전송할 수량

### Return Value

* \<WepinSendResponse>
  * `txId` \<String>\
    send 트랜젝션의 txID

### Example

```swift
do {
     let result = try await widget.send(viewController: self, account: account)
    updateStatus("Send success: \(result)")
} catch {
    updateStatus("Error: \(error.localizedDescription)")
}
```

***

## receive

`receive` 메서드는 지정된 계정과 연관된 계정 정보 페이지를 엽니다. 이 메서드는 위핀에 로그인한 후에만 사용할 수 있습니다.

### Parameters

* `viewController` \<UIViewController> - 위젯(WebView)을 모달 방식으로 표시할 기준이 되는 뷰 컨트롤러입니다. 위젯이 올바른 화면 위에 표시될 수 있도록 표시 컨텍스트를 제공합니다.
* `account` \<WepinAccount>
  * `address` \<String>\
    사용자 계정의 주소
  * `network` \<String>\
    사용자 계정의 네트워크 종류
  * `contract` \<String> *optional*\
    토큰의 Contract 주소
  * `isAA` \<Boolean> *optional*\
    AA 계정인지 여부

### Return Value

* \<WepinReceiveResponse>
  * `account` \<WepinAccount>
    * `address` \<String>\
      사용자 계정의 주소
    * `network` \<String>\
      사용자 계정의 네트워크 종류
    * `contract` \<String> *optional*\
      토큰의 Contract 주소
    * `isAA` \<Boolean> *optional*\
      AA 계정인지 여부

### Example

```swift
do {
    let result = try await widget.receive(viewController: self, account: account)
    updateStatus("Receive success: \(result)")
} catch {
    updateStatus("Error: \(error.localizedDescription)")
}
```

***

## finalize

```kotlin
wepinWidget.finalize()
```

Wepin Widget SDK 사용을 종료합니다.

### **Parameters**

* None

### **Return Value**

* None

### Example

```swift
try await wepin.finalize()
```

## login

#### `WepinWidget` 에 통합된 `WepinLogin` 을 사용하지 않고 별도의 `WepinLogin`을 사용할 때, 두 SDK 의 버전이 동일하지 않은 경우 에러가 발생할 수 있습니다.

`login` 변수는 다양한 인증 방법을 포함한 위핀 로그인 라이브러리로, 사용자가 여러 방식으로 로그인할 수 있도록 합니다. 이메일 및 비밀번호 로그인, OAuth 프로바이더 로그인, ID Token 또는 Access Token을 사용한 로그인 등을 지원합니다. 각 메서드에 대한 자세한 정보는 공식 라이브러리 문서 [Login Library 가이드](https://docs.wepin.io/widget-integration/android-java-and-kotlin-sdk/login-library)에서 확인할 수 있습니다.

### **Available Methods**

* [`loginWithOauthProvider`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#loginwithoauthprovider)
* [`signUpWithEmailAndPassword`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#signupwithemailandpassword)
* [`loginWithEmailAndPassword`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#loginwithemailandpassword)
* [`loginWithIdToken`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#loginwithidtoken)
* [`loginWithAccessToken`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#loginwithaccesstoken)
* [`getRefreshFirebaseToken`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#getrefreshfirebasetoken)
* [`loginWepin`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#loginwepin)
* [`getCurrentWepinUser`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#getcurrentwepinuser)
* [`logout`](https://docs.wepin.io/widget-integration/ios-swift-sdk/login-library/methods#logoutwepin)

이 메서드들은 다양한 로그인 시나리오를 지원하며, 필요에 맞는 적절한 방법을 선택할 수 있습니다.

**Exception**

* [WepinError](https://docs.wepin.io/widget-integration/flutter-sdk/widget/methods#wepinerror)

**Example**

Copy

<pre class="language-swift"><code class="lang-swift"><strong>// OAuth Provider를 사용한 로그인
</strong>do {
    let oauthParams = WepinLoginOauth2Params(provider: "discord", clientId: self.discordClientId)
    let res = try await wepin!.login.loginWithOauthProvider(params: oauthParams, viewController: self)
    let privateKey = "private key for wepin id/access Token"
        //call loginWithIdToken() or loginWithAccessToken()
} catch (let error){
    self.tvResult.text = String("Faild: \(error)")
}

//Email을 사용한 회원가입입
do {
    let email = "EMAIL-ADDRESS"
    let password = "PASSWORD"
    let params = WepinLoginWithEmailParams(email: email, password: password)
    wepinLoginRes = try await wepin!.login.signUpWithEmailAndPassword(params: params)
    self.tvResult.text = String("Successed: \(wepinLoginRes)")
} catch (let error){
    self.tvResult.text = String("Faild: \(error)")
}

//IDToken 을 사용한 로그인
do {
    let token = "ID-TOKEN"
    let params = WepinLoginOauthIdTokenRequest(idToken: token)
    wepinLoginRes = try await wepin!.login.loginWithIdToken(params: params)
        
    self.tvResult.text = String("Successed: \(wepinLoginRes)")
} catch (let error){
    self.tvResult.text = String("Faild: \(error)")
}

//위핀 로그인인
do {
    let res = try await wepin!.login.loginWepin(params: wepinLoginRes)
    wepinLoginRes = nil
    self.tvResult.text = String("Successed: \(res)")
} catch (let error){
    self.tvResult.text = String("Faild: \(error)")
}

//현재 로그인 된 사용자 정보 조회
do {
    let res = try await wepin!.login.getCurrentWepinUser()
    self.tvResult.text = String("Successed: \(res)")
} catch (let error){
    self.tvResult.text = String("Faild: \(error)")
}

//로그아웃
do {
    let res = try await wepin!.login.logoutWepin()
    self.tvResult.text = String("Successed: \(res)")
} catch (let error){
    self.tvResult.text = String("Faild: \(error)")
}
</code></pre>
