View in English

  • 메뉴 열기 메뉴 닫기
  • Apple Developer
검색
검색 닫기
  • Apple Developer
  • 뉴스
  • 둘러보기
  • 디자인
  • 개발
  • 배포
  • 지원
  • 계정
페이지에서만 검색

빠른 링크

5 빠른 링크

비디오

메뉴 열기 메뉴 닫기
  • 컬렉션
  • 주제
  • 전체 비디오
  • 소개

WWDC25 컬렉션으로 돌아가기

  • 소개
  • 요약
  • 자막 전문
  • 코드
  • Vision 프레임워크를 사용하여 문서 읽기

    Vision 프레임워크의 최신 개선 사항을 알아보세요. RecognizeDocumentsRequest를 소개하고, 이를 사용해 문장을 읽고 단락으로 그룹화하는 방법 및 표를 읽는 방법 등을 살펴봅니다. 또한 카메라 렌즈 얼룩 감지에 대해 자세히 알아보고 사진 보관함이나 자체 카메라 캡처 파이프라인에서 얼룩졌을 수도 있는 이미지를 식별하는 방법도 확인하세요.

    챕터

    • 0:00 - 서론
    • 1:22 - 문서 읽기
    • 13:35 - 카메라 렌즈 얼룩 감지
    • 17:59 - 손 자세 업데이트

    리소스

    • Classifying Images with Vision and Core ML
    • Image Classification with Vision and CoreML
    • Recognizing tables within a document
    • Vision
      • HD 비디오
      • SD 비디오

    관련 비디오

    WWDC25

    • Apple 플랫폼의 머신 러닝 및 AI 프레임워크 살펴보기

    WWDC24

    • Vision 프레임워크의 Swift 관련 개선 사항 알아보기

    WWDC23

    • Vision에서 동물 자세 감지하기
    • Vision에서 3D 신체 포즈와 사람 분리 탐색하기
  • 비디오 검색…

    저는 Megan Williams이고 Vision Framework 팀의 엔지니어입니다 Vision이 제공하는 API를 사용하면 다양한 사용 사례에서 앱에 머신 러닝을 쉽게 접목할 수 있습니다 예를 들면 사람 및 사물 인식 신체 및 손 자세 추적 궤적 분석 같은 것들이죠

    참고로 모든 Vision API는 완전히 기기 내에서 실행되므로 앱이 컴퓨터 비전 작업을 안전하게 최대 성능으로 실행할 수 있습니다

    Vision API는 iOS, macOS, iPadOS tvOS, VisionOS에서 지원됩니다

    Vision의 31개 API는 각종 유형의 이미지를 분석할 수 있습니다 그리고 이제 2개가 추가됩니다 이 비디오에서 소개하는 새로운 API는 문서 읽기 및 카메라 렌즈 얼룩 감지입니다 마지막으로 손 자세 감지 기능의 업데이트를 살펴보겠습니다

    바로 시작하겠습니다

    현재 Vision은 RecognizeTextRequest를 사용해 이미지에서 텍스트를 탐지 및 추출하는 기능을 제공합니다 매우 유용한 기능인데, 형식이 매우 구조화된 일부 문서에서는 더 많은 정보를 추출할 수 있습니다

    예를 들어 이 전단지에는 제목, 단락 몇 개, 목록 테이블, 바코드가 있습니다

    문서에서 텍스트 줄을 읽기만 한다면 중요한 구조적 정보를 잃게 됩니다 예를 들어 이 테이블에서 텍스트 줄을 추출하기만 하면 행과 열의 배열을 알 수 없습니다 텍스트가 무엇을 말하며 어떤 형식인지 알고 싶습니다 올해 Vision은 정확히 이를 수행하는 새로운 API를 선보입니다

    바로 RecognizeDocumentsRequest입니다 개발자는 26개 언어의 텍스트를 인식할 수 있는 이 API로 문서에서 구조적 요소와 중요한 정보를 추출할 수 있습니다 이 API는 테이블 및 목록과 같은 구조를 감지하고

    텍스트 줄을 단락으로 그룹화하고

    QR 코드처럼 기계가 판독 가능한 코드를 감지하고 이메일 주소와 전화번호, URL 같은 중요한 정보를 식별할 수 있습니다 이러한 기능 덕분에 문서에 대한 이해를 높여 더 적은 줄의 코드로도 쉽게 파싱할 수 있습니다

    매장을 운영하고 있으며 방문 고객이 월간 뉴스레터에 가입하도록 하고 싶다고 가정해 보겠습니다

    고객이 이름, 이메일 주소 전화번호를 기재할 수 있는 가입 시트를 제공합니다

    이것을 스캔하여 사람별 연락처를 생성하는 앱을 만들고 싶습니다

    예전에는 RecognizeTextRequest를 사용하여 텍스트를 추출했는데, 테이블의 각 셀을 별도의 객체로 반환했습니다

    사람별로 연락처를 생성하려면 각 텍스트 상자의 위치 정보를 사용해 같은 행에 속하는 셀을 판단해야 했습니다

    이제 RecognizeDocumentsRequest를 사용하면 테이블을 자동으로 파싱해 줍니다 셀이 알아서 행으로 그룹화되므로 가입 시트 파싱이 훨씬 쉬워집니다 API 사용 방법을 살펴보겠습니다

    RecognizeDocumentsRequest는 Vision의 다른 요청과 유사합니다 Vision 프레임워크를 사용하는 방법의 자세한 내용은 WWDC 2024의 ‘Vision 프레임워크의 Swift 관련 개선 사항 알아보기’를 확인하세요 간단히 설명해 드릴 테니 걱정하지 마세요

    Vision에서는 요청을 통해 이미지를 처리합니다 요청은 수행하려는 이미지 분석의 유형을 결정합니다 이미지에 대한 요청을 수행하면 하나 이상의 관찰 결과가 생성됩니다 이 관찰 결과에는 이미지 속 얼굴의 위치 같은 이미지에 대한 정보가 있습니다

    RecognizeDocumentsRequest는 DocumentObservation을 생성합니다

    DocumentObservations는 문서의 내용과 구조에 대한 정보를 제공합니다 현재는 RecognizeDocumentsRequest 실행 시 Vision은 이미지당 하나의 문서 관찰 결과를 반환합니다 문서 관찰 결과는 계층적 구조로 이루어져 있습니다 각 문서는 컨테이너로 텍스트, 테이블 목록, 바코드를 포함합니다

    테이블은 셀로 구성되고 목록은 항목으로 구성됩니다 항목은 그 자체로 컨테이너이며 텍스트 같은 다른 요소를 포함할 수 있습니다 이제 문서 관찰 결과가 어떤지 알았으니 이것으로 가입 시트를 파싱할 수 있습니다

    먼저 문서에서 테이블 구조를 추출해야 합니다

    iPad로 문서의 사진을 찍겠습니다

    제 앱은 RecognizeDocumentsRequest로 테이블을 감지하고 화면에 강조 표시합니다

    코드를 살펴보겠습니다

    방금 캡처한 이미지가 있으며 여기서 테이블을 추출하려 합니다 먼저 RecognizeDocumentsRequest 생성 후 이미지에 요청을 수행합니다 DocumentObservation이 반환됩니다 문서의 tables 속성에 접근하여 이 이미지에서 테이블을 추출할 수 있습니다

    이 경우 문서에 테이블이 하나만 있을 것으로 예상되므로 탐지된 첫 번째 테이블을 반환합니다

    테이블을 탐지했으니 이제 내용을 확인해 보겠습니다

    테이블은 2차원의 셀 배열로 구성됩니다 이러한 셀에 행이나 열로 접근할 수 있습니다

    테이블의 경계를 경계 영역으로 정의하여 이미지 내에서의 테이블 좌표를 제공합니다 각 테이블 셀은 속성을 통해 속한 행과 열을 표시합니다

    하나의 셀이 여러 행이나 열에 걸쳐 있을 수 있으므로 이 값은 범위로 표현됩니다

    셀의 내용은 컨테이너이며 문서에서 찾은 텍스트, 테이블, 목록, 바코드 등 모든 콘텐츠를 포함할 수 있습니다

    컨테이너에도 자체적인 경계 영역이 있습니다

    데이터를 표로 추출해서 이제 가입 시트를 행별로 읽을 수 있게 됐습니다

    텍스트 추출을 위해 각 셀의 내용을 확인해야 합니다

    텍스트를 더 자세히 살펴보겠습니다 컨테이너 내의 텍스트를 다양한 방법으로 볼 수 있습니다

    전사문은 컨테이너 내의 모든 텍스트를 하나의 문자열로 제공합니다 줄은 텍스트를 줄 배열로 표시하는 다른 방법입니다

    줄은 단락으로 그룹화되어 텍스트를 더욱 자연스럽게 읽는 방법을 제공합니다 단락 그룹화에 속하지 않는 줄은 자체 단락으로 간주됩니다 개별 단어의 목록을 얻을 수도 있지만 중국어, 일본어 한국어, 태국어 같은 일부 언어에서는 지원되지 않습니다

    마지막으로 텍스트 내에서 문서의 핵심 정보를 나타내는 특수 문자열인 탐지된 데이터가 있습니다 이메일 주소, 날짜, URL 등이 그 예입니다 Vision은 중요한 데이터 문자열을 검색할 수 있는 새로운 DataDetection 프레임워크를 사용합니다

    전화번호 이메일 주소, 우편 주소는 탐지되는 형식이 다양합니다

    URL은 링크로 탐지되며 시간과 날짜는 캘린더 이벤트로 탐지됩니다

    측정치와 단위 달러 금액과 통화 단위는 함께 탐지됩니다

    추적 번호, 결제 식별자 항공편 번호도 식별 가능합니다

    이러한 모든 기능을 활용하여 샘플 앱을 확장해 보겠습니다 이미 테이블을 탐지했으며 이제 테이블의 텍스트를 추출해 연락처 목록을 생성할 수 있습니다 첫 번째 열에서 이름을 읽은 후 데이터 탐지를 사용하여 다른 열의 연락처 정보를 식별할 수 있습니다

    샘플 코드를 업데이트합니다 앞서 탐지한 테이블을 파싱하고 연락처 목록을 생성하겠습니다

    각 연락처에서 이름, 이메일과 몇몇 전화번호를 추출하겠습니다

    테이블의 행에 순차적으로 반복하며 각 행에서 연락처를 생성하겠습니다

    대부분의 가입 시트에는 첫 번째 열에 이름이 있으므로 행의 첫 번째 셀을 가져오겠습니다

    이 셀의 텍스트를 확인하여 연락처의 이름을 얻을 수 있습니다

    전사문을 사용하여 셀의 모든 텍스트를 문자열로 추출하겠습니다

    이제 행 내의 다른 연락처 정보를 찾아보겠습니다

    먼저 남은 셀을 반복하여 처리하겠습니다

    이제 각 셀에서 탐지된 데이터를 찾을 수 있습니다

    데이터에 이를 반복하여 탐지된 내용을 확인하겠습니다

    데이터의 세부 정보를 표시하여 이메일과 전화번호를 자세히 찾을 수 있습니다

    이메일을 발견하면 탐지된 정보로 연락처를 생성할 수 있습니다

    이제 가입 시트에서 연락처 목록을 쉽게 추출할 수 있습니다

    이 목록을 연락처 뷰로 전달하면 앱에 연락처가 표시됩니다 연락처를 살펴보겠습니다

    훌륭하네요

    테이블을 탭으로 구분된 문자열로 내보내는 기능도 추가했습니다

    이 기능으로 테이블을 복사하여 메모나 Numbers 등 호환되는 앱에 붙여넣을 수 있습니다

    이 기능의 코드를 확인하려면 Apple 개발자 웹사이트에서 샘플 앱을 다운로드하면 됩니다 요약하자면 RecognizeDocumentsRequest는 개발자가 문서에서 중요 정보를 쉽게 추출하는 방법을 제공합니다

    이 API의 단순한 인터페이스를 통해 문서 구조를 이해할 수 있으므로 테이블처럼 정형 텍스트를 파싱하고 이메일이나 전화번호 같은 중요 정보를 식별하기가 쉽습니다

    다음은 올해 Vision에 추가된 또 다른 새 기능인

    카메라 렌즈 얼룩 감지입니다

    기기를 들어서 가입 시트를 스캔할 때 렌즈에 손가락이 닿아 얼룩이 질 수 있습니다

    이 경우 사진 품질이 떨어져 처리하기가 어려울 수 있습니다

    다행히 올해 Vision에 이 문제를 해결해 주는 새 기능이 있습니다 DetectLensSmudgeRequest는 렌즈가 더러운 상태에서 이미지를 촬영했는지 감지하여 사용자에게 렌즈를 닦거나 다른 사진 제공을 안내합니다 이 요청을 사용하면 앱에서 고품질 사진만 처리하도록 할 수 있습니다

    DetectLensSmudgeRequest는 Vision 프레임워크의 다른 요청과 작동 방식이 같습니다 이미지에 요청을 수행하여 얼룩 관찰 결과를 얻을 수 있습니다

    관찰 결과에는 이미지의 얼룩 확률을 나타내는 신뢰도 점수가 있습니다

    신뢰도는 항상 0과 1 사이입니다

    신뢰도가 1에 가까울수록 이미지에 얼룩이 있을 가능성이 높습니다

    신뢰도가 0인 경우 이미지에 얼룩이 없을 가능성이 높습니다 코드에서 사용법을 확인해 보겠습니다

    이미지가 있고 여기에 얼룩이 있는지 확인하고 싶습니다

    먼저 렌즈 얼룩 감지 요청을 생성합니다

    다음으로 이미지에 요청을 수행합니다

    이러면 얼룩 관찰 결과가 생성됩니다

    관찰 결과의 신뢰도는 이미지에 얼룩이 있을 확률을 나타냅니다

    이 신뢰도를 임계값과 비교하여 품질이 낮은 이미지를 필터링할 수 있습니다

    여기서는 0.9를 선택했습니다

    임계값보다 점수가 높은 이미지는 얼룩이 있다고 간주하고 처리하지 않습니다

    앱에 가장 적합한 임계값을 선택할 수 있습니다 여기서는 얼룩 신뢰도가 서로 다른 문서 3개를 보여드립니다

    임계값이 높으면 이미지를 더 많이 처리할 수 있지만 이미지 품질이 떨어질 수 있습니다

    임계값이 높으면 더 많은 이미지가 거부되며 일부는 오탐지로 인해 정상 이미지가 거부될 수 있습니다

    일부 이미지는 렌즈 얼룩이 없지만 얼룩 점수가 높을 수 있습니다

    가령 이 이미지는 카메라 움직임으로 인한 블러 때문에 렌즈가 얼룩진 카메라로 찍은 듯한 이미지를 생성할 수 있습니다 장노출로 촬영한 이미지나 구름 또는 안개가 있는 이미지의 경우도 마찬가지입니다 얼룩 점수가 낮다고 해서 해당 사진이 반드시 고품질 사진인 것은 아닙니다 예를 들어 이 환기구 사진은 얼룩이 없지만 친구들과 공유하고 싶을 만큼 흥미롭거나 시각적으로 매력적이지는 않습니다 Vision에는 DetectLensSmudgeRequest와 함께 사용하여 고품질 사진을 찾을 수 있는 다른 API가 있습니다

    이미지에 얼굴이 있다면 DetectFaceCaptureQualityRequest를 사용하여 좋은 얼굴 캡처를 찾을 수 있습니다 이 요청은 각 얼굴에 0에서 1 사이의

    캡처 품질 점수를 생성하며 1이 더 높은 캡처 품질입니다

    이미지에 얼굴이 없다면 CalculateImageAestheticScoresRequest로 전반적인 이미지 점수를 얻을 수 있습니다

    이 요청은 문서나 영수증처럼 잘 찍히지만 내용을 기억하기 힘든 사진의 유틸리티 이미지를 식별할 수도 있습니다 CalculateImageAestheticScoresRequest에 대한 자세한 내용은 Vision의 WWDC 2024 발표에서 확인할 수 있습니다

    마지막으로 손 자세 감지 기능의 업데이트를 살펴보겠습니다

    2020년부터 개발자는 DetectHandPoseRequest로 손의 21개 관절 위치를 식별할 수 있었습니다

    관절은 HandPoseObservation으로 반환됩니다

    이 기술은 ML 손 자세 분류기와 손 동작 분류기를 지원하며 이를 통해 손 자세와 제스처를 식별할 수 있습니다

    예를 들어 이 모델을 훈련시켜 앱 기능을 제어하는 제스처를 인식하도록 할 수 있습니다 손 자세 분류기 훈련 방법에 대한 자세한 내용은 WWDC 2021의 ‘CreateML을 사용한 손 자세 및 동작 분류’를 참고하세요

    올해 Vision은 손 자세 감지 모델을 더 작고 현대화된 모델로 교체합니다

    새 모델도 21개 관절을 감지하지만 더 정확하며, 메모리 사용량과 지연 시간이 줄었습니다 새로운 모델의 정확도는 향상되었지만 관절의 위치는 이전 모델과는 같지 않습니다 따라서 과거에 ML 손 자세 분류기 또는 ML 손 동작 분류기를 훈련한 경우 정확도 향상을 위해 새로운 모델로 분류기를 다시 훈련하는 것이 좋습니다

    올해 계획된 신규 기능을 요약하자면 두 가지 새로운 요청의 도입입니다 구조화된 문서 이해를 위한 RecognizeDocumentsRequest와 얼룩진 렌즈로 촬영된 사진을 식별하는 DetectCameraLensSmudgeRequest입니다 또한 업데이트된 손 자세 감지 모델도 있습니다

    이 비디오의 샘플 앱은 Apple 개발자 웹사이트에서 다운로드 가능합니다 또한 WWDC 2024의 ‘Vision 프레임워크의 Swift 관련 개선 사항 알아보기’에서 Vision이 제공하는 추가 API에 대해 알아보세요 시청해 주셔서 감사합니다

    • 6:39 - Detect tables

      /// Process an image and return the first table detected
      func extractTable(from image: Data) async throws -> DocumentObservation.Container.Table {
          
          // The Vision request.
          let request = RecognizeDocumentsRequest()
          
          // Perform the request on the image data and return the results.
          let observations = try await request.perform(on: image)
      
          // Get the first observation from the array.
          guard let document = observations.first?.document else {
              throw AppError.noDocument
          }
          
          // Extract the first table detected.
          guard let table = document.tables.first else {
              throw AppError.noTable
          }
          
          return table
      }
    • 10:50 - Parse contacts

      /// Extract name, email addresses, and phone number from a table into a list of contacts.
      private func parseTable(_ table: DocumentObservation.Container.Table) -> [Contact] {
          var contacts = [Contact]()
          
          // Iterate over each row in the table.
          for row in table.rows {
              // The contact name will be taken from the first column.
              guard let firstCell = row.first else {
                  continue
              }
              // Extract the text content from the transcript.
              let name = firstCell.content.text.transcript
              
              // Look for emails and phone numbers in the remaining cells.
              var detectedPhone: String? = nil
              var detectedEmail: String? = nil
              
              for cell in row.dropFirst() {
                  // Get all detected data in the cell, then match emails and phone numbers.
                  let allDetectedData = cell.content.text.detectedData
                  for data in allDetectedData {
                      switch data.match.details {
                      case .emailAddress(let email):
                          detectedEmail = email.emailAddress
                      case .phoneNumber(let phoneNumber):
                          detectedPhone = phoneNumber.phoneNumber
                      default:
                          break
                      }
                  }
              }
              // Create a contact if an email was detected.
              if let email = detectedEmail {
                  let contact = Contact(name: name, email: email, phoneNumber: detectedPhone)
                  contacts.append(contact)
              }
          }
          return contacts
      }
    • 0:00 - 서론
    • Vision 프레임워크는 다양한 Apple 플랫폼의 앱에 머신 러닝을 통합하기 위한 API를 제공합니다. 이러한 API를 사용하면 사람 및 사물 감지, 포즈 추적, 궤적 분석과 같은 작업을 온디바이스에서 실행하여 최적의 성능과 보안을 확보할 수 있습니다. 이 프레임워크는 현재 문서 판독 및 카메라 렌즈 얼룩 감지를 위한 두 가지 새로운 API와 손 자세 감지를 위한 업데이트 등 31개의 API로 구성되어 있습니다.

    • 1:22 - 문서 읽기
    • ‘RecognizeDocumentsRequest’라는 새로운 API가 있는데, 이 API는 기존의 ‘RecognizeTextRequest’ 기능을 기반으로 문서에서 구조화된 정보를 추출할 수 있도록 해줍니다. ‘RecognizeDocumentsRequest’를 사용하면 이제 이미지를 처리하고 문서 내용의 계층 구조를 얻을 수 있습니다. API는 표, 목록, 단락, QR 코드와 같은 기계가 읽을 수 있는 코드 등 다양한 요소를 감지할 수 있습니다. 단순히 텍스트를 추출하는 데 그치지 않고, 텍스트의 형식을 이해하여 훨씬 더 쉽게 데이터를 구문 분석하고 해석할 수 있습니다. 예를 들어, 이름, 이메일 주소, 전화번호가 적힌 가입서를 생각해 보세요. 이전에는 이러한 정보를 추출하는 작업이 복잡해 셀 관계를 수동으로 확인해야 했습니다. 하지만 ‘RecognizeDocumentsRequest’를 사용하면 시스템이 자동으로 표를 구문 분석하고 셀을 행으로 그룹화하여 스캔한 시트에서 연락처를 만드는 과정을 간소화합니다.

    • 13:35 - 카메라 렌즈 얼룩 감지
    • Vision의 새로운 카메라 렌즈 얼룩 감지 기능인 ‘DetectLensSmudgeRequest’는 0에서 1 사이의 신뢰도 점수를 사용하여 얼룩진 이미지를 식별합니다. 품질이 낮은 이미지를 걸러내기 위한 임곗값을 설정할 수 있고 신뢰도가 높을수록 불법 복제된 이미지를 의미합니다. 임곗값이 높을수록 더 많은 이미지를 처리하지만, 품질이 낮은 이미지가 포함될 수 있고 임곗값이 낮을수록 더 많은 이미지를 거부하지만, 품질이 좋은 이미지가 포함될 가능성이 있습니다. 카메라 모션 블러, 장시간 노출, 구름 또는 안개와 같은 요소로 인해 거짓 양성 반응이 발생할 경우도 있습니다. 또한 Vision은 얼굴이 포함된 이미지에는 ‘DetectFaceCaptureQualityRequest’를, 문서나 영수증을 포함하여 얼굴이 없는 이미지에는 ‘CalculateImageAestheticScoresRequest’ 등 이미지 품질을 평가하는 다른 API도 제공합니다.

    • 17:59 - 손 자세 업데이트
    • Vision 프레임워크에는 업데이트된 손 포즈 감지 모델도 있습니다. 2020년부터 출시된 원래 버전은 앱에서 제스처 인식을 위해 손의 21개 관절을 식별합니다. 새로운 모델은 더 작고, 빠르며, 정확하지만, 다른 관절 위치를 사용하기 때문에 기존 분류기를 재교육해야 합니다.

Developer Footer

  • 비디오
  • WWDC25
  • Vision 프레임워크를 사용하여 문서 읽기
  • 메뉴 열기 메뉴 닫기
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    메뉴 열기 메뉴 닫기
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    메뉴 열기 메뉴 닫기
    • 손쉬운 사용
    • 액세서리
    • 앱 확장 프로그램
    • App Store
    • 오디오 및 비디오(영문)
    • 증강 현실
    • 디자인
    • 배포
    • 교육
    • 서체(영문)
    • 게임
    • 건강 및 피트니스
    • 앱 내 구입
    • 현지화
    • 지도 및 위치
    • 머신 러닝 및 AI
    • 오픈 소스(영문)
    • 보안
    • Safari 및 웹(영문)
    메뉴 열기 메뉴 닫기
    • 문서(영문)
    • 튜토리얼
    • 다운로드(영문)
    • 포럼(영문)
    • 비디오
    메뉴 열기 메뉴 닫기
    • 지원 문서
    • 문의하기
    • 버그 보고
    • 시스템 상태(영문)
    메뉴 열기 메뉴 닫기
    • Apple Developer
    • App Store Connect
    • 인증서, 식별자 및 프로파일(영문)
    • 피드백 지원
    메뉴 열기 메뉴 닫기
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program(영문)
    • News Partner Program(영문)
    • Video Partner Program(영문)
    • Security Bounty Program(영문)
    • Security Research Device Program(영문)
    메뉴 열기 메뉴 닫기
    • Apple과의 만남
    • Apple Developer Center
    • App Store 어워드(영문)
    • Apple 디자인 어워드
    • Apple Developer Academy(영문)
    • WWDC
    Apple Developer 앱 받기
    Copyright © 2025 Apple Inc. 모든 권리 보유.
    약관 개인정보 처리방침 계약 및 지침