iOS

[오픈소스] Bagbutik

Phililip
728x90

안녕하세요.

 

이번에는 Bagbutik라는 오픈소스를 직접 써보는 시간을 가져볼게요.

 

 


# 1. Bagbutik?

 

 

Generated Swift code for the App Store Connect API based on the official OpenAPI spec.

 

 

Bagbitik은 OpenAPI 기반의 App Store Connect API를 위한 Swift 코드로 생성해준다.

 

 

한 마디로 App Store Connect API를 Swift로 호출해줄 수 있는 모듈인 것이죠.

 

 

그리고 Bagbutik의 가장 큰 장점은 Github Action을 활용해서 주기적으로 API 스펙을 확인하고,

 

App Store Connect API 스펙이 변경되었을 때, Github Action이 자동으로 변경사항에 대해서 PR을 생성해준다는 것입니다.

(즉, Bagbutik 모듈은 App Store Connect 스펙 변경에 대해서 최대한 빠르게 대응이 가능하다는 것이죠ㅎㅎ)

 

 

 

 

Bagbutik은 JWT 기반 인증을 사용하기 때문에, Bagbutik을 사용하기 전에 App Store Connect 계정으로 key를 발급받아야 합니다.

 

아래처럼 사용할 수 있다고 하네요.

 

let service = try BagbutikService(jwt: .init(
    keyId: "P9M252746H",
    issuerId: "82067982-6b3b-4a48-be4f-5b10b373c5f2",
    privateKey: """
    -----BEGIN PRIVATE KEY-----
    MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgevZzL1gdAFr88hb2
    OF/2NxApJCzGCEDdfSp6VQO30hyhRANCAAQRWz+jn65BtOMvdyHKcvjBeBSDZH2r
    1RTwjmYSi9R/zpBnuQ4EiMnCqfMPWiZqB4QdbAd0E7oH50VpuZ1P087G
    -----END PRIVATE KEY-----
    """
))
let response = try await service.request(
    .listBundleIds(fields: [.profiles([.bundleId, .name])],
                   filters: [.platform([.iOS])],
                   includes: [.profiles],
                   sorts: [.seedIdDescending, .idDescending])
)
print(response)

 

 

그렇담.. 역시 직접 해봐야겠죠??ㅎㅎ

 

 

 

# 2. App Store Connect 계정으로 key 발급받기

Bagbutik을 초기화할 때 필요한 값은 총 3가지인데요,

 

- keyId

- issuserId

- privateKey

 

요것들을 어떻게 생성하는지 알아볼게요.

 

 

다들 App Store Connect 계정 하나씩은 있으시죠...? (내 12만 원....ㅠㅠ)

 

App Store Connect 사이트로 가서 사용자 및 액세스를 선택해줄게요.

 

 

Keys 탭에서 액세스 요청을 클릭해주세요.,

 

 

 

그럼 "App Store Connect API 액세스 요청이 승인되었습니다."라는 문구가 보일 거예요!!

 

키 생성을 위해 API 키 생성을 클릭해주세요.

 

 

 

API 키의 적당한 이름과 정보 유형을 선택해주고 생성해줍니다.

 

 

 

 

이제 Bagbutik을 사용하기 위한 키를 모두 발급받았습니다.

 

"API 키 다운로드"를 클릭하면 privateKey 파일이 다운로드되는데 최초 1회만 다운로드할 수 있으니 잃어버리지 않도록 주의해주세요!

 

 

 

이제 필요한 키들도 발급받았으니, Bagbutik 모듈을 직접 사용해보겠습니다.

 

 

 

# 3. Bagbutik 써보기

Bagbutik repository를 보면 API 가이드가 없어요ㅠㅠ

 

그렇지만 너무 걱정하실 필요는 없는 것이,

 

API 호출 전 위에서 생성한 key를 가지고 Bagbutik 초기화를 하고, request API를 호출해서 App Store Connect API를 호출해준다고 보면 됩니다.

 

 

우선 위에서 생성한 keyId, issuserId, privateKey를 가지고 BagbutikService를 초기화해줄게요.

 

let service = try! BagbutikService(jwt: .init(
    keyId: "YOUR_KEYID",
    issuerId: "YOUR_ISSUSERID",
    privateKey: """
    -----BEGIN PRIVATE KEY-----
    YOUR_PRIVATEKEY
    -----END PRIVATE KEY-----
    """
))

 

 

그다음엔 App Store Connect API 가이드를 보고 API 명, fields, filters, includes, sorts를 채워주면 됩니다.

 

 

예를 들어,

 

계정에 등록된 디바이스 정보들을 가져오는 List Devices라는 API를 호출할 건데, model, name만 가져오고 싶다면,

 

 

 

이렇게 코드를 구현하면 됩니다.

 

let response = try await service.request(
    .listDevices(fields: [.devices([.model, .name])])
)
print(response)

 

생각보다 직관적이지 않나요?ㅎㅎㅎ

 

 

App Store Connect API response 값도 잘 오는 것을 확인할 수 있어요.

 

▿ DevicesResponse
  ▿ data : 2 elements
    ▿ 0 : Device
      - id : "..."
      ▿ links : ResourceLinks
        - itself : "https://api.appstoreconnect.apple.com/v1/devices/..."
      ▿ attributes : Optional<Attributes>
        ▿ some : Attributes
          - addedDate : nil
          ▿ _deviceClass : NullCodable<DeviceClass>
            - wrappedValue : nil
          ▿ model : Optional<String>
            - some : "Apple Watch SE"
          ▿ name : Optional<String>
            - some : "정필립의 Apple Watch"
          ▿ _platform : NullCodable<BundleIdPlatform>
            - wrappedValue : nil
          ▿ _status : NullCodable<Status>
            - wrappedValue : nil
          - udid : nil
    ▿ 1 : Device
      - id : "..."
      ▿ links : ResourceLinks
        - itself : "https://api.appstoreconnect.apple.com/v1/devices/..."
      ▿ attributes : Optional<Attributes>
        ▿ some : Attributes
          - addedDate : nil
          ▿ _deviceClass : NullCodable<DeviceClass>
            - wrappedValue : nil
          ▿ model : Optional<String>
            - some : "iPhone X"
          ▿ name : Optional<String>
            - some : "Philip의 iPhone"
          ▿ _platform : NullCodable<BundleIdPlatform>
            - wrappedValue : nil
          ▿ _status : NullCodable<Status>
            - wrappedValue : nil
          - udid : nil
  ▿ links : PagedDocumentLinks
    - first : nil
    - next : nil
    - itself : "https://api.appstoreconnect.apple.com/v1/devices?fields%5Bdevices%5D=model%2Cname"
  ▿ _meta : NullCodable<PagingInformation>
    ▿ wrappedValue : Optional<PagingInformation>
      ▿ some : PagingInformation
        ▿ paging : Paging
          - limit : 20
          ▿ total : Optional<Int>
            - some : 2

 

 

결국 App Store Connect API 가이드를 보고 그대로 Bagbutik 모듈에 그대로 적용해주면 되니, Bagbutik API 가이드가 없어도 크게 부담이 되지는 않는(?) 것 같아요ㅎㅎㅎ

 

 

 


 

 

 

이번 글은 여기서 마무리.

 

 

 

반응형

'iOS' 카테고리의 다른 글

[오픈소스] Inject  (0) 2022.04.12
Notification에 Action 버튼 추가하기  (0) 2022.04.05
mailto scheme과 기본 메일 앱 설정  (0) 2022.03.23
TabulaData framework  (0) 2022.03.09
[오픈소스] CustomDump 소개  (0) 2022.02.24