스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
FinanceKit 소개
금융 관리 앱에 FinanceKit을 활용하면 사용자 동의 및 제어를 바탕으로 Apple Cash, Apple Card 등에서 온디바이스 데이터를 원활하고 안전하게 공유받을 수 있습니다. 계정, 거래, 잔액에 대한 일회성 접근 및 지속적인 접근을 요청하는 방법과 iOS 및 iPadOS를 위한 탁월한 경험을 빌드하는 방법을 확인해 보세요.
챕터
- 0:00 - Introduction
- 1:48 - Overview of data types
- 5:03 - Access financial data
- 21:56 - Best practices
리소스
-
다운로드
안녕하세요, 여러분 저는 Antonio입니다 Apple Wallet 팀의 iOS 엔지니어죠 금융 관리는 현대 생활의 아주 중요한 부분입니다 신용카드 결제 금액과 대비해 수입을 추적하고 싶거나 아니면 단지 이번 달에 커피 값으로 얼마를 지출했는지 알고 싶을 때 금융 데이터에 적시에 액세스할 수 있어야 합니다 이런 경우 FinanceKit이 필요하죠
FinanceKit API는 Apple 지갑에 저장된 금융 데이터 중앙 저장소에 대한 액세스를 제공합니다 액세스하는 모든 금융 데이터는 기기에 로컬로 저장되며 인터넷 접속이 필요 없습니다 또한 FinanceKit은 Apple Card Savings, Apple Cash를 비롯한 여러 출처의 금융 데이터를 집계합니다 그리고 마지막으로 FinanceKit은 데이터 소유자에게 앱이 접근 가능한 금융 데이터 종류와 양을 명시적으로 제어할 수 있는 권한을 제공해 개인정보를 보호합니다 FinanceKit은 매력적인 금융 앱 구축에 사용할 수 있는 풍부한 금융 정보를 제공합니다 제공하는 정보는 상위 수준의 각 계좌 세부 정보 최근 변경된 시간을 포함한 사용 가능한 잔액 정보 입출금 또는 신용 이용 한도와 같은 금융 거래 액세스 등입니다 모든 내역도 함께 확인할 수 있죠 그럼 시작해 보겠습니다 오늘은 FinanceKit에 대해 소개하고 금융 데이터에 액세스하고 이를 표시하기 위해 알아야 할 사항을 다루겠습니다 먼저 FinanceKit API가 제공하는 핵심 구조에 대한 개요를 살펴보겠습니다 그런 다음 API를 사용하여 Apple 지갑에 저장된 금융 데이터에 액세스하는 방법을 살펴보겠습니다 그리고 앱에 FinanceKit을 통합할 때 염두에 두어야 할 몇 가지 모범 사례로 마무리하겠습니다
먼저 사용할 수 있는 핵심 오브젝트 몇 가지를 소개해 드리겠습니다 FinanceKit은 금융 데이터 모델링을 위해 주요 데이터 세 가지를 노출합니다 가장 기본은 계좌입니다 보통 예금 계좌, 신용 카드 또는 Apple Card가 있는 Savings 계좌일 수도 있습니다 모든 계좌에는 잔액이 있습니다 대략적인 수준에서 잔액은 특정한 시점에 계좌에 있는 금액을 나타냅니다 계좌에는 잔액 외에도 거래 내역이 포함됩니다 계좌에서 돈이 어떻게 들어오고 나갔는지를 나타내는 내역입니다 FinanceKit은 금융 데이터 취급에 관한 현지 법률에 따라 사용자가 계좌를 개설한 이후 이러한 모든 모델이 어떻게 변경되었는지 추적합니다 이제 거래 내역은 여러 유용한 필드의 구조체입니다 모든 거래에 대해 고유하고 기기별로도 고유한 식별자가 여기 포함됩니다 이 ID는 특정 거래의 진화 양상을 추적하는 데 특히 유용합니다 대부분의 거래는 ISO 18245를 준수하는 판매자 카테고리 코드를 제공합니다 이는 앱에서 지출 카테고리를 추적하는 경우 유용하며 금융 데이터에서 판매자 이름을 사용할 수 있는 경우도 그렇습니다
모든 거래에는 원본 거래 설명이 포함됩니다 이는 금융 기관에서 제공하는 설명이며 가능하다면 디스플레이 친화적인 설명도 사용할 수 있습니다 거래에는 항상 거래 날짜가 포함되며 금융기관으로부터 받은 정보의 상태와 상세함에 따라 FinanceKit은 거래가 게시된 날짜를 제공합니다 마지막으로 거래는 통화 코드와 소수점 값으로 구성된 금액을 제공합니다 해외에서 발생한 거래인 경우 금융 기관은 해당 금액을 외화로도 표기해 제공합니다 여기서 중요한 점은 이러한 금액에 대해 FinanceKit은 통화 간 변환을 수행하지 않는다는 점입니다 FinanceKit 데이터는 기관에서 받은 그대로 제공되며 크레딧이든 데빗이든 상관없이 양수 소수점 값으로 저장됩니다 여기서 아마 궁금해하실 부분은 특정 거래의 금액이 크레딧인지 데빗인지 확인하는 방법일텐데요 바로 여기에서 크레딧 데빗 표시기가 등장합니다 모든 거래에는 데빗 또는 크레딧 표시기 속성이 있어서 이를 읽어서 특정 계좌에서 돈이 들어왔는지 나갔는지를 나타낼 수 있습니다 가능한 값은 당연하게도 debit 또는 credit입니다 주의해야 할 점은 이 값의 해석은 계좌 유형에 따라 달라진다는 것입니다
거래가 출금인 경우 Apple Cash와 같은 자산 계좌에서는 계좌 잔액이 감소하는 것을 의미하며 거래가 신용 카드와 같은 부채 계좌에 속하는 경우 신용 이용 한도가 감소한다는 의미입니다 거래 크레딧 데빗 표시기가 크레딧인 경우라면 거래가 자산 계좌의 잔액을 증가시켰거나 부채 계좌의 신용 이용 한도를 증가시킨 것입니다 지금까지 FinanceKit에서 사용할 최상위 유형에 대해 간략하게 살펴보았습니다 사용 가능한 모든 클래스 구조, 필드에 대한 자세한 정보는 관련 문서를 참고하시기 바랍니다 필요한 부분은 알려 드렸으니 이제 재미있는 부분으로 넘어가서 FinanceKit API를 사용해 이러한 유형으로 표시되는 금융 데이터에 액세스해 보겠습니다 금융 데이터 액세스 작업은 크게 세 부분으로 구성됩니다 데이터 가용성 확인 선택기로 사용자가 선택한 금융 데이터 세트에 액세스 쿼리 API를 사용하여 금융 데이터에 대한 일회성 또는 장기 실행 액세스 생성입니다 먼저 살펴볼 것은 지정된 기기가 FinanceKit을 지원하는지 지원한다면 어떤 금융 데이터가 제한되었는지 확인하는 방법입니다 금융 데이터 가용성을 확인하려면 먼저 FinanceKit을 가져와야 합니다 그런 다음 데이터 가용성을 Finance Store 클래스의 isDataAvailable 메서드로 확인하고 financialData 열거형 케이스를 전달합니다 프레임워크가 false를 반환하면 다른 금융 데이터 관련 호출을 수행하지 않아야 합니다 이러한 시나리오에서 프레임워크는 앱을 종료하는데 높은 강도의 신호를 제공하기 위해서입니다 반면에 true를 반환한다면 안심하고 계속 사용해도 좋습니다 이 값이 앱 실행 사이에 변경되지 않으며 여러 iOS 버전에 걸쳐 일정하다고 간주할 수 있기 때문입니다
true를 반환한다고 해서 기기에서 실제 데이터에 액세스 가능하다는 보장은 없습니다 금융 데이터를 사용할 수 있더라도 일부 기기 및 기기 구성에 따라 액세스가 제한될 수 있습니다 데이터 가용성은 상수로 취급될 수 있지만 데이터 제한은 일시적일 수 있으며 앱이 전면에 있는 동안에도 호출 사이에 값이 변경될 수 있습니다
예를 들어 Apple 지갑 앱을 사용할 수 없거나 회사의 모바일 기기 관리 시스템이 Apple 지갑 액세스를 제한하는 경우입니다
데이터가 제한되면 프레임워크는 종료되지 않고 오류를 발생시키는데 데이터가 제한되었다는 의미입니다 이 부분에서 앱은 사용자에게 현재 금융 데이터에 액세스 불가능함을 알릴 수 있습니다
금융 데이터를 사용할 수 있음을 알게 되면 금융 데이터에 액세스할 준비가 된 것입니다 이 작업을 하는 빠르고 쉬운 방법은 앱을 사용하는 사람이 공유할 거래를 선택하도록 허용하는 것입니다 FinanceKit 거래 선택기를 통해서요 이 새로운 뷰는 앱에서 사용 가능한 거래의 선택 가능한 목록을 표시할 시기를 결정할 수 있는 기능을 제공합니다 앱을 사용하는 사람은 자신의 거래 목록을 보고 액세스 권한을 부여할 거래를 선택합니다 기본적으로 거래 내역은 시간순으로 정렬되지만 상단의 검색 필드에 자유 텍스트를 입력하거나 입력하는 동안 제안된 사용 가능한 토큰 중 하나 이상을 선택해 필터링하는 기능도 지원합니다 거래 내역이 공유된 후에는 앱에서 거래 내역에 즉시 액세스할 수 있지만 공유된 거래 내역에 대한 액세스 권한은 일시적이라는 점을 기억하세요 거래 내역은 즉시 사용할 수 있게 앱으로 바로 전달되며 선택기는 공유된 어떤 거래 내역도 기억하거나 저장하지 않습니다 선택기 제시는 매우 간단하며 사진 선택기 API 사용 경험이 있다면 거래 내역 선택기 API도 익숙하실 것입니다 가장 간단한 접근 방식을 사용해 FinanceKit과 관련된 UI 프레임워크인 FinanceKitUI를 가져옵니다 그런 다음 선택한 거래 내역을 저장할 변수를 선언합니다 이 예제에서는 뷰 상태 속성을 사용하겠습니다 앞서 언급했듯이 앱은 금융 데이터 사용 가능 여부를 결정할 책임이 있습니다 여기서는 뷰 본문 내에서 isDataAvailable을 호출한 다음 선택한 항목 상태 변수를 첫 번째 매개변수로 TransactionPicker 뷰에 전달합니다 두 번째 매개변수로 ViewBuilder 클로저를 전달합니다 이 예에서는 단순히 선택기 표시를 트리거하는 버튼의 레이블입니다 이 몇 줄의 코드만으로 버튼을 탭하면 거래 내역 선택기가 표시되고 선택한 거래 내역을 앱에서 사용할 수 있는 버튼이 생겼습니다 이것이 거래 내역 선택기이며 업무용 출장비를 추적하는 앱이나 앱을 사용하는 사람이 특정 거래 내역에 대한 액세스를 선택적으로 허용하는 대신 개인적인 것일 수 있는 모든 거래 내역에 무제한 액세스를 허용하려는 모든 경우에 이상적입니다 하지만 물론 지갑의 금융 데이터에 대한 전체 액세스 권한이 있어야 가장 유용한 앱도 있습니다
따라서 금융 데이터 전체 액세스 권한을 위한 쿼리 API를 자세히 알아보겠습니다 이러한 API는 장기적으로 실행되거나 데이터의 스냅샷만 가져올 수도 있습니다 쿼리 API는 비동기식이며 FinanceKit을 통해 제공되는 모든 금융 데이터 유형에 대한 액세스를 제공합니다 거래 내역 뿐만이 아닙니다 명시적 허가 없이 데이터를 공유하지 않도록 사용자 동의가 필요합니다 하지만 승인을 받으면 앱은 영구적인 연결을 유지할 수 있고 사용 가능한 금융 데이터에 지속적으로 액세스할 수 있습니다 또한 이러한 API는 iOS 17.4 이상을 실행하는 모든 iPhone에서 사용할 수 있습니다 FinanceKit에서 두 가지 방법으로 데이터를 쿼리할 수 있습니다
첫 번째는 현재 값을 기준으로 정렬된 금융 데이터 유형의 컬렉션을 반환합니다 조건식, 정렬 설명자, 제한 오프셋 매개 변수를 허용하며 앱에서 사용할 수 있도록 정렬된 금융 데이터 유형의 컬렉션을 비동기적으로 반환합니다 약간 다른 방식으로 작동하는 변경 사항 전용 API도 있습니다 일치하는 금융 데이터의 배열을 반환하는 대신 이 쿼리는 원하는 데이터에서 발생한 변경 내역을 반환합니다 또한 장기적으로도 실행될 수 있어 앱은 기관에서 새로운 데이터가 들어오는 즉시 변경 사항만 업데이트할 수 있습니다 이러한 API를 사용하려면 추가 요구 사항이 필요합니다 따라서 문서를 살펴보기 전에 거래 내역 선택기가 필요에 맞는지 확인해야 합니다 먼저 앱의 info.plist에 고객에게 표시될 정적 사용 설명을 추가해야 합니다 개인정보 보호에서 금융 데이터 사용 설명을 찾거나 NS 금융 데이터 사용 설명 키로 수동으로 추가할 수 있습니다
설명을 입력했으면 코드에서 승인을 요청할 준비가 되었습니다 requestAuthorization 함수를 FinanceStore 클래스의 공유 인스턴스에서 호출했으니까요
승인을 요청하면 시스템 알림이 표시되어 금융 데이터에 액세스할 수 있는 권한을 요청하고 사용자가 공유할 계좌를 선택할 수 있는 화면이 이어집니다 요청 승인을 호출한 결과는 승인을 받거나 즉, 금융 데이터를 조회할 수 있는 권한이 주어집니다 하지만 사용자가 언제든지 설정에서 이 권한을 취소할 수 있다는 것을 잊지 마세요 액세스 권한 요청이 거부되면 결과가 거부로 나타납니다 마지막으로 사용자가 의미 있는 선택을 할 기회가 없는 경우 결과가 알 수 없음으로 반환될 수 있습니다 요청 승인을 호출하면 상태가 반환되지만 authorizationStatus 함수는 사용자에게 메시지를 표시하지 않고 단순히 현재 상태를 반환합니다 앱을 App Store에서 출시하기로 결정했다면 배포 자격을 요청해야 합니다 요청 프로세스가 간소화되어 이 세션과 관련된 리소스에서 관련 정보 페이지에 대한 링크를 찾으실 수 있습니다 요청 승인 프로세스가 코드에서 어떻게 보이는지 보여드리겠습니다 FinanceKit을 가져온 후 금융 데이터 사용 가능 여부를 확인하고 가능한 경우에만 진행합니다 공유된 FinanceStore 인스턴스에서 요청 승인을 호출합니다 그러면 해당되는 경우 앱 상단에 시스템 대화 상자가 표시됩니다 사용자가 선택을 하면 대화 상자가 사라지고 비동기 함수가 앱에 새 상태를 반환합니다
금융 데이터에 대한 액세스 권한을 허용했는지 확인하고 진행할 수 있습니다
앞서 살펴본 것처럼 앱이 승인을 요청하고 사용자가 선호를 표시하지 않은 경우 시스템 경고가 표시됩니다 사용자가 ‘허용 안 함’을 누르면 인증 거부 상태를 수신하게 됩니다 반면에 ‘계좌 선택’을 누르면 운영 체제에서 모든 적격 계좌 목록을 표시합니다 여기에서 사용자는 공유할 계좌를 선택하고 각 계좌에 대해 앱에서 가장 먼저 사용할 수 있는 활동을 표시할 수 있습니다 사용자가 마음이 바뀌었다면 ‘취소’를 누르고 앱에서 다른 기회에 다시 승인을 요청할 수 있습니다
반면에 사용자가 ‘공유 대상’ 버튼을 눌러 선택을 완료하면 제어권이 앱으로 반환됩니다
다른 많은 프레임워크와 마찬가지로 사용자가 액세스를 허용 또는 거부를 선택하면 승인 요청 시 메시지가 다시 표시되지 않습니다 하지만 사용자가 나중에 마음이 바뀌면 설정에서 금융 데이터에 대한 액세스 권한을 수정할 수 있습니다 여기에서 더 많은 계좌를 공유하거나 최초 공유 날짜를 변경할 수도 있습니다 이제 앱에서 사용자의 금융 데이터에 대한 액세스 권한을 요청하고 부여받았으므로 이 데이터를 쿼리하는 방법을 살펴봅시다 하지만 먼저 FinanceKit에서 노출되는 주요 금융 데이터 유형 중 하나인 계좌에 대해 조금 더 알아야 합니다 계좌의 구조를 살펴보겠습니다
계좌는 열거형 케이스로 모델링됩니다 모든 계좌에 공통인 일부 속성과 특정 계좌 유형에 특별히 해당되는 속성이 있습니다 이렇게 하면 FinanceKit은 공통의 핵심을 유지하면서 각 계정 유형을 특정 속성 집합으로 유연하게 모델링할 수 있습니다 이러한 공통 속성 중 하나는 로컬 고유 식별자입니다 계좌 식별자는 모든 거래와 잔액에도 존재하므로 이러한 각 오브젝트를 해당 오브젝트가 포함된 계좌에 매우 쉽게 연결할 수 있습니다 모든 계좌에는 계좌가 속한 기관의 이름을 나타내는 문자열인 기관명 문자열이 있으며 고객에게 표시할 계좌의 이름인 표시명 기관에서 지원하는 경우 계좌 설명이 있습니다 계좌의 기본 통화는 3글자 통화 코드로 표시됩니다 이러한 속성은 모두 계좌 모델에 있는 공통 속성입니다 계좌가 부채 계좌인 경우 예를 들어 Apple Card 계좌 모델링에 사용되는 계좌라면 추가 속성이 있습니다 예를 들어 신용 한도는 빌릴 수 있는 최대 금액을 나타냅니다 다음 결제일과 지불해야 할 최소 금액도 있습니다 연체 금액이 있는 경우 연체 금액도 표시됩니다 이제 계좌가 모델링되는 방식을 알았으니 이제 FinanceStore에서 계좌 몇 개를 쿼리해 보겠습니다
먼저 이 경우 계좌 표시 이름인 정렬 설명자를 정의합니다 쿼리에는 0 이상의 정렬 설명자를 사용할 수 있지만 최소 1 이상은 있어야 합니다 그런 다음 조건식을 정의하는 데 Swift 조건식 매크로를 사용합니다 이 예시에서는 Apple Card Cash, Savings에 연결된 계좌만 필요합니다
그런 다음 정렬 설명자와 조건식을 인수로 전달하는 쿼리를 작성합니다 여기서 볼 수 있듯이 모든 금융 데이터 유형에는 관련 쿼리가 있습니다 마지막으로 쿼리를 사용하여 저장소에서 일치하는 계좌를 가져올 수 있습니다 계좌에 대해 살펴보았으니 잔액으로 가능한 작업을 보겠습니다 앞서 설명했듯이 모든 계좌에는 적어도 하나의 잔액이 있으며 사용자가 iOS 17.4로 업그레이드한 시점에 따라 두 개 이상일 수도 있습니다
FinanceKit은 잔액에 대한 과거 기록을 보관하여 사용자에게 잔액이 시간에 따라 어떻게 변했는지 보여주고 추세를 보여줄 수도 있습니다 먼저 잔액이 어떻게 생겼는지 살펴봅시다 잔액은 세 가지 케이스로 구성된 열거형으로 모델링됩니다 ‘Available’은 잔액을 생성할 때 미결된 거래 내역도 고려되었음을 의미합니다 반면 ‘Booked’의 경우는 게시된 거래만 고려됩니다 ‘Available & Booked’는 이름에서 알 수 있듯이 잔액 2개가 있는 필드 2개가 있습니다
이러한 차이점 외에도 잔액에는 모든 열거형 케이스 간에 공유되는 일련의 속성이 있습니다 오늘 살펴본 다른 금융 데이터 유형과 마찬가지로 잔액에도 로컬 고유 식별자가 있습니다 계좌 식별자와 함께 잔액을 해당 잔액이 속한 계좌에 매핑할 수 있습니다 또한 FinanceKit은 기관에서 잔액을 계산한 날짜를 AsOfDate라는 속성에 기록합니다 이 속성은 잔액 최신 상태 확인에도 사용할 수 있습니다 마지막으로 중요한 점은 잔액에는 소수점 및 통화 코드 쌍으로 적어도 하나의 금액이 포함됩니다 또한 잔액의 경우 금액은 기관에서 제공되며 프레임워크에서 계산되지 않습니다 그리고 양수 값으로 저장됩니다 따라서 프레임워크는 잔액 상태를 구분하기 위해 또 다른 creditDebitIndicator 속성을 사용합니다 자산 계좌의 잔액이 CreditDebitIndicator에 debit이면 잔액이 마이너스라는 뜻입니다 반면에 잔액이 크레딧으로 표시되면 잔액이 양수입니다 크레딧 표시기가 있는 부채 계좌 잔액은 해당 계좌가 현재 크레딧 상태임을 알려 줍니다 하지만 계좌에 사용한 잔액이 있다면 데빗으로 표시됩니다 이제 잔액이 어떻게 표시되는지 알았으니 데이터를 쿼리하여 여기 표시된 것과 유사한 차트를 만드는 방법과 최신 사용 가능 잔액을 날짜별로 표시하는 방법을 알아봅니다 이제 getBalances 함수에서 먼저 역방향 날짜 정렬 설명자를 정의하여 가장 최근의 잔액부터 가져올 수 있도록 합니다 그런 다음 사용 가능한 잔액으로만 그리고 관심 계좌에 속한 잔액으로만 결과 범위를 좁힙니다
쿼리를 작성하는 것은 이제 익숙하겠지만 설명자와 조건식을 정렬하면서 결과의 수도 제한할 것입니다
그런 다음 쿼리를 실행하고 가져온 잔액의 순서를 바꿔 시간 순서대로 표시할 수 있도록 준비합니다 스냅샷 쿼리에 대해 살펴보았으니 이제 장기 실행 쿼리를 알아보겠습니다 장기 실행 쿼리는 앱에서 실시간 업데이트를 기기에 수신하는 즉시 사용하거나 앱 실행 사이에 쿼리를 재개할 수 있게 하려는 경우 표시됩니다 장기 실행 쿼리는 Swift 비동기 시퀀스 위에 구축되어 지속적인 업데이트 스트림을 쉽게 전달할 수 있습니다 스냅샷 쿼리처럼 모델 배열을 반환하는 대신 장기 실행 쿼리는 변경 사항을 반환하며 변경 사항은 데이터베이스의 마지막 또는 초기 상태와 비교한 값입니다 변경 사항은 각각 삽입된 모델 배열, 예를 들어 마지막 업데이트 이후의 모든 새 거래 업데이트된 오브젝트 배열 예를 들어 신용 한도가 증가한 부채 계좌 삭제된 오브젝트 식별자로 구성되며 앱에서 더 이상 지갑에 없는 금융 데이터 오브젝트를 삭제할 수 있습니다 모든 변경 사항은 히스토리 토큰도 제공합니다 히스토리 토큰은 금융 데이터 저장소의 특정 시점에 대한 프록시입니다 이는 불투명한 구조체로 Codable을 준수하기 때문에 쉽게 직렬화할 수 있으며 장기 실행 쿼리를 재개하거나 해당 시점 이후의 저장소 업데이트를 가져오는 데 사용할 수 있습니다 공간 및 성능상의 이유로 시스템에서 과거 변경 사항을 압축할 수 있습니다 이는 매우 드문 경우인데 FinanceKit은 최소 몇 개월의 기록을 그대로 보존하려고 하기 때문입니다 그러나 앱에서 저장한 최신 토큰이 압축된 변경 사항을 가리키는 경우 기록 쿼리에서 오류가 발생할 수 있습니다 어쨌든 이는 문제가 되지 않으며 프레임워크는 데이터 손실 없이 앱이 과거 변경 사항을 회복하면서 쿼리를 재개할 수 있게 해줍니다 거래 내역에 대한 간단한 장기 실행 쿼리 설정법입니다 FinanceKit을 가져온 후 거래 내역 기록 비동기 시퀀스를 transactionHistory API로 정의한 다음 거래 내역 시퀀스에 대한 for await으로 모든 변경 사항을 수신합니다 그리고 원하는 대로 변경 사항을 자유롭게 처리할 수 있습니다 실행 시 모든 거래 내역을 로드하는 개인 금융 앱의 예시입니다 연결된 계좌에 새 거래가 발생하면 바로 화면에 표시되는 것을 확인할 수 있습니다 간단한 장기 실행 쿼리의 작동 방법을 살펴보았으니 재개 가능한 기능을 사용해 보겠습니다 우선 API에서 새로운 변경 사항을 처리할 때마다 히스토리 토큰을 디스크와 같은 안전한 곳에 보존합니다 저장된 히스토리 토큰을 사용하려면 이를 로드해야 합니다 그런 다음 since 매개변수로 가장 최근에 로드된 토큰을 기록 쿼리에 전달할 수 있습니다 이 간단한 변경으로 앱이 재실행 사이에 장기 실행되는 쿼리를 재시작하고 중복 이벤트를 제거할 수 있습니다 금융 데이터 비동기 시퀀스는 일반적으로 종료되지 않으므로 앱에서 사용할 수 있는 실시간 업데이트를 생성할 수 있습니다 애플리케이션에 중요한 것이 재개 가능한 쿼리뿐인 경우 가장 좋은 해결책은 새 변경 사항을 모니터링하지 않도록 장기 실행 쿼리에 매개변수를 전달하는 것입니다 이렇게 하면 앱에서 모든 기존 변경 사항을 처리하는 즉시 비동기 시퀀스가 종료됩니다 가용성을 결정하고 기기가 금융 데이터에 액세스할 수 있는 방법을 설명드렸습니다 이제 FinanceKit을 앱에 통합할 때 염두에 두어야 할 몇 가지 모범 사례로 마무리하겠습니다 다시 강조하자면 금융 데이터는 모든 사람에게 매우 민감한 정보이므로 사용자가 앱에 데이터 액세스 권한을 부여할 때 보여준 신뢰를 존중해야 합니다 예를 들어 사용자가 앱을 삭제했거나 사용자가 앱에 대한 액세스 권한을 제거한 경우 데이터를 삭제해야 합니다
더 많은 데이터에 액세스할 수 있어도 필요한 데이터만 쿼리해야 합니다 거래 내역 선택기는 금융 데이터 액세스에 대한 윈윈 접근법입니다 앱에 대한 요구 사항을 줄이면서도 동시에 데이터만 공유할 수 있는 권한을 제공하기 때문입니다 금융 데이터 액세스는 뛰어난 성능을 발휘하도록 만들어졌으며 앱이 모든 금융 데이터에 액세스할 수 있다면 항상 전체 스냅샷을 요청하는 것이 편리하게 보일 수 있습니다 더 효율적인 전략은 재개 가능한 장기 실행 쿼리로 최신 업데이트만 처리하는 것입니다 이 전략으로 앱에서 처리해야 하는 데이터의 양을 대폭 줄일 수 있습니다 여기까지 살펴본 내용으로 FinanceKit으로 작동하는 금융 앱을 처음 만드는 데 필요한 모든 것을 살펴보았습니다 앱은 FinanceKit으로 고객의 기기에 있는 금융 데이터에 액세스할 수 있습니다 거래 내역 선택기와 쿼리 API는 상호작용과 요구 사항이 다르며 다양한 사용 사례를 지원할 수 있습니다 Apple 개발자 포럼에서 언제든지 질문하고 도움을 받으실 수 있습니다 마지막으로, 피드백이 있다면 알려 주시기 바랍니다 피드백 지원을 이용해 주세요 그럼 여기서 마치겠습니다 즐거운 세션이었기를 바랍니다 시청해 주셔서 감사합니다 안녕히 계세요!
-
-
5:38 - Check if financial data is available
// Check if financial data is available import FinanceKit let available = FinanceStore.isDataAvailable( .financialData ) guard available else { // No meaningful action can be performed return }
-
8:08 - Present the transaction picker
// Present the transaction picker import SwiftUI import FinanceKit import FinanceKitUI struct TransactionSelector: View { @State private var selectedItems: [FinanceKit.Transaction] = [] var body: some View { if FinanceStore.isDataAvailable(.financialData) { TransactionPicker(selection: $selectedItems) { Text("Show Transaction Picker") } } }
-
12:16 - Requesting authorization for financial data
// Requesting authorization for financial data import FinanceKit let store = FinanceStore.shared guard store.isDataAvailable(for: .financialData) else { // No meaningful action can be performed return } let authStatus = await store.requestAuthorization() guard authStatus == .authorized else { // User did not grant access to financial data, stop here return }
-
15:24 - Simple query to retrieve all Apple accounts
// Simple query to retrieve all Apple accounts let store = FinanceStore.shared let sortDescriptor = SortDescriptor(\Account.displayName) let predicate = #Predicate<Account> { account in account.institutionName == "Apple" } let query = AccountQuery( sortDescriptors: [sortDescriptor], predicate: predicate ) let accounts : [Account] = try await store.accounts(query: query)
-
18:12 - Get latest 7 available balances for account
// Get latest 7 available balances for account func getBalances(account: Account) async throws -> [AccountBalance] { let sortDescriptor = SortDescriptor(\AccountBalance.asOfDate, order: .reverse) let predicate = #Predicate<AccountBalance> { balance in balance.available != nil && balance.accountId == account.id } let query = AccountBalanceQuery( sortDescriptors: [sortDescriptor], predicate: predicate, limit: 7 ) return try await store.accountBalances(query: query).reversed() }
-
20:27 - Retrieve all the transaction history for an account
// Retrieve all the transaction history for an account import FinanceKit let store = FinanceStore.shared let account: Account = ... let transactionSequence = store.transactionHistory( forAccountID: account.id ) for try await change in transactionSequence { processChanges(change.inserted, change.updated, change.deleted) }
-
21:04 - Use the history token to resume queries
// Use the history token to resume queries import FinanceKit let store = FinanceStore.shared let account: Account = ... let currentToken = loadToken() let transactionSequence = store.transactionHistory( forAccountID: account.id, since: currentToken ) for try await change in transactionSequence { processChanges(change.inserted, change.updated, change.deleted) persist(token: change.newToken) }
-
21:41 - Non monitoring resumable queries
import FinanceKit let store = FinanceStore.shared let account: Account = ... let currentToken = loadToken() let transactionSequence = store.transactionHistory( forAccountID: account.id, since: currentToken, isMonitoring: false ) for try await change in transactionSequence { processChanges(change.inserted, change.updated, change.deleted) persist(token: change.newToken) }
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.