(경쾌한 테크노 음악)
여러분, 환영합니다 저는 Ryan입니다
Firebase 팀의 소프트웨어 엔지니어로서
캐나다 워털루 사무실에서 Apple SDK를 담당하고 있습니다
저는 Chen입니다
저는 Firebase 팀 소프트웨어 엔지니어로서
캘리포니아 서니베일 지사에서 Apple SDK를 담당하고 있습니다
Firebase의 목표는 앱 빌드와 운영을 간편하게 바꾸어
개발자의 성공을 돕는 것입니다
Firebase는 플랫폼 간 모바일 개발자 도구 키트이며
Android, 웹, CIMA+, Unity에 이어 iOS까지 지원합니다
여러분이 이 세션에 오신 이유는 알고 있습니다
Apple 에코시스템이 멀티 플랫폼 앱을 개발하기 쉽게
바뀌었다는 소식에 열광하고 계신가요?
iOS와 iPadOS뿐만 아니라 macOS WatchOS, tvOS 및 Catalyst까지
참 많기도 하네요
Firebase에서는 사용 사례를 살펴보고
Apple 플랫폼에 제공하고자 합니다
Apple 플랫폼용 Firebase SDK는 iOS 개발 플로를
유연하게 활용할 수 있고
앞으로도 이런 지원이 이어질 것입니다
iOS와 다른 플랫폼을 대상으로 하는 앱 구축과 실행은
지난 몇 년간 변화를 거쳤습니다
Swift는 앱 구출을 위한 기본 언어가 되었죠
이 세션에서는 좋은 Swift 언어 기능과 프레임워크를 추천할 겁니다
예를 들어 SwiftUI를 사용하면 간단하고 간결한 구문으로
멋진 인터페이스를 구축할 수 있습니다
Swift Package Manager로 쉽게 Firebase SDK를 포함할 수 있게 되었죠
Async/await과 Combine은
비동기식 프로그래밍을 새롭게 생각하는 계기가 되었습니다
Firebase에서는 이러한 변화를 주의 깊게 지켜보고 있습니다
오늘은 에코시스템 변화에 따른 전략을 소개하고자 합니다
Chen 씨, GitHub 리포지토리는 어떻게 되고 있나요?
제가 말씀드리죠
Firebase가 2017년에 처음으로 클라이언트 라이브러리를 공개한 이후로
Apple 플랫폼용 Firebase SDK 대부분이
GitHub에서 제공되고 있습니다
얼마 전인 2020년 말에는 Firebase 성능 SDK도
오픈소스로 공개했습니다 아직 보지 못하셨다면
GitHub에서 확인하고 의견을 들려주세요
앞으로도 개발자 커뮤니티를 활성화하고
투명성을 높이는 노력을 아끼지 않겠습니다
현재까지 2천 개 이상의 문제를 해결하고 5천 개 이상의 풀 요청이 발생했습니다
Firebase 팀은 GitHub에서 개발자와 교류하는 걸 좋아합니다
부디 여러분의 피드백을 들려주세요
기능 요청이나 버그 문제도 괜찮습니다
Ryan과 저를 포함해 SDK를 구축한
실제 엔지니어와 대화를 나눌 수 있습니다
또한 더욱 쉽게 기술적인 대화를 나눌 수 있습니다
다행히 개발자 커뮤니티에서 많은 도움을 주고 계십니다
현재 139명이
Apple 플랫폼용 Firebase SDK에 기여하고 계시죠
커뮤니티 구성원과 Firebase 팀원이
활발하게 오픈소스로 협력하면서
함께 지원을 제공합니다
SDK에 도움을 주시는 여러분께 진심 어린 감사 인사를 드립니다
오픈소스로 공개하면서 많은 것이 가능해졌습니다
코드를 훑어보면서
버그를 찾는 시간이 절약되었죠
tvOS, macOS, Catalyst, WatchOS에서
커뮤니티 지원 등의 기능도 활성화했습니다
얼마 전에는 커뮤니티 WatchOS 지원을 추가해
실시간 데이터베이스와 원격 구성을 지원하고 있습니다
워치 앱에서 직접 사용해보세요
GitHub 토론에는 어떤 질문이든 올릴 수 있습니다
벌써 많은 분이 Swift Package Manager를 사용해
종속성을 관리하고 있습니다
오늘부터 Firebase가 공식적으로 Swift Package Manager를 지원합니다
Cocoa Pod 외에도 Swift Package Manager를 사용해
Firebase 라이브러리를 앱에 추가해보세요
제가 사용 방법을 보여드리죠 정말 쉽습니다
먼저 Firebase iOS SDK 보고서 페이지에서 URL을 가져옵니다
페이지의 URL을 복사해서 붙여넣습니다
GitHub에서 호스팅되거나 배포되는 대부분 라이브러리에 적용됩니다
Xcode에서 앱을 열고 파일 탭을 클릭합니다
Swift Package를 선택하고 패키지 종속성 추가를 클릭한 다음
URL을 붙여넣고 다음을 클릭합니다
원하는 버전 또는 브랜치를 선택합니다
새로운 기능뿐만 아니라 최신 버전 SDK도
가져오는 것이 좋습니다
하지만 버그 수정과 개선 사항을 적용하는 게 더 중요합니다
잠시 후 사용할 제품을 선택할 수 있습니다
우리는 Analytics Auth를 사용할 겁니다
새로운 SwiftUI 확장 프로그램 API를 시험해보겠습니다
다른 종속성에 추가할 경우
예를 들어 독립적인 워치에 추가하고
워치 앱 내에 메시징만 설치하고 싶다면
오른쪽에서 대상을 선택합니다
선택하고 완료를 클릭하면 패키지가 보입니다
프로젝트를 클릭하고 Swift Package를 선택합니다
나중에 Firebase SDK를 더 많이 추가하고 싶다면
편집하려는 대상에 가서 일반을 클릭합니다
프레임워크, 라이브러리 및 임베디드 콘텐츠에서
Firebase SDK를 직접 추가하거나 필요 없는 것을 삭제할 수도 있습니다
Swift Package Manager로 새 프로젝트를 생성했으므로
Ryan 씨에게 Swift와 SwiftUI에 관해 들어보겠습니다
Chen 씨, 감사합니다
우리 SDK는 대부분 Objective C로 작성되어 있지만
모든 단일 API를 어떻게 Swift로 가져오는지 확인하고
환경을 개선합니다
하지만 결과 유형이나 코딩 가능한 지원
기본 매개변수나 enums 관련 유형은 어떻게 처리할까요?
Objective C를 작성할 때 Swift의 우수한 기능을 활용합니다
Swift 코드만 작성하면 될 때도 있습니다
그래서 선택적 Swift 확장 프로그램을 각 SDK에 배포하기 시작했습니다
커뮤니티에서도 기여해주셨죠
중요한 요점만 짚어보겠습니다 많은 코드를 보게 될 겁니다
Firebase 스토리지에서 기존 완료 핸들러 블록을 사용해
사진을 다운로드하는 코드입니다
데이터와 오류가 선택 사항이어서
강제로 오류를 래핑해야 하는 이상한 코드가 되었습니다
되도록이면 피하고 싶은 상황이죠
데이터가 nil일 때는 언제나 오류가 채워져 있어야 합니다
그리고 오류가 있을 때는 언제나 데이터가 nil이어야 합니다
하지만 기존 코드로는 컴파일러에 이를 강제할 수 없습니다
새로운 Swift 확장 프로그램의 함수로 전환하면
곤란한 상황을 해결하고 래핑 해제를 강제할 수 있습니다
switch 명령을 사용해 두 개의 상태만 표시되도록 합니다
데이터와 오류 중에서 하나만 있는 거죠
중간 상태는 없습니다 Firestore와 파싱 데이터로
넘어가면 이전 버전 Firestore의 데이터 파싱을 줄인 코드 조각입니다
Firestore에서 데이터를 가져온 후
제공된 사전에서 로컬 유형으로 변환해야 합니다
이 경우엔 음식점이죠 이 코드가 익숙하신가요?
저는 메뉴를 읽을 때마다 슬퍼집니다 Swift 유형 안전성 기능을
사용하지 않고 문자열 키에서 오류 래핑을 해제하거든요
취약하고 가독성이 떨어지는 데다 실수하기 쉽습니다
대신 Restaurant 유형에 코딩 가능한 적합성을 추가해보겠습니다
코딩 가능한 프로토콜을 준수하면
수동 코드 대부분을 손쉽게 파싱할 수 있습니다
컴파일러에서 생성되고 모든 유형에 일관적으로 업데이트됩니다
이제 Firestore 데이터를 읽으려면
문서, 스냅샷에서 데이터를 함수로 호출하고
restaurant 유형으로 파싱하면 됩니다
객체를 수동 파싱할 필요 없이 코드가 모든 작업을 처리합니다
Firestore에서의 데이터 설정도 간편합니다
사전으로 표현하는 대신 인스턴스로 직접 파싱합니다
외부에서 도와주신 덕분에 Firebase 데이터베이스에도
유사한 API를 출시했습니다
새롭게 개편된 SwiftUI는 정말로 마음에 듭니다
최근 SwiftUI용 API를 배포했고 추가로 더 배포될 예정입니다
WWDC 2020에서 플랫폼 간에 공유되는 새로운 SwiftUI 앱 수명
주기가 발표되었습니다
원래는 앱 상단에 FirebaseApp.configure를 넣고
앱 델리리게이트에서 시작 호출을 완료했습니다
앱 델리게이트가 없다면 이제 어떻게 해야 할까요?
앱이 시작될 때 호출하는 init 함수를 재정의하고
FirebaseApp.configure를 호출합니다
나중에 UI 애플리케이션 위임을 사용해서
푸시 알림 등을 처리할 때도 마찬가지입니다
나중에 Chen 씨가 데모에서 보여드릴 겁니다
처음으로 선보일 새로운 API는 Firebase용 Google 애널리틱스의
수동 화면 뷰 이벤트 로깅입니다
기존 API는 UI 키트에 화면 뷰와 화면 클래스를 자동 녹화했지만
SwiftUI는 그에 해당하는
UI 뷰 컨트롤러가 없기 때문에
SwiftUI에서는 사용할 수 없습니다
다행히 작년에 수동 화면 뷰 이벤트를 추가했습니다
이 이벤트를 로깅할 때는 신중한 제어가 필요합니다
UI 키트를 구축할 때도 마찬가징비니다 viewDid/Appear에 통합하면
대부분 문제가 없습니다
SwiftUI에서는 어떻게 보이는지 살펴보겠습니다
onAppear 한정자를 사용해
뷰가 나타날 때마다 수동 로깅 API를 호출합니다
기능이 작동하기는 하지만 복잡해서 코드가 꼬일 우려가 있고
뷰 구조에서 제거될 수도 있습니다
Objective C로 개발할 때의 API를 생각하지 마세요
Swift에 더 좋은 방법이 있습니다
맞춤 뷰 한정자를 사용하면 좋을 것 같군요
그래서 그렇게 구축했죠
애널리틱스 화면 뷰 한정자로
모든 뷰를 마크업하고
뷰, 클래스 또는 구조 이름을 선언할 수 있습니다
하지만 여기서는 기존 애널리틱스 이름에 맞추었습니다
이 뷰가 화면에 나타났을 때 로깅하고 싶은
추가 매개변수를 넣습니다
Swift의 기본 인수 덕분에 이름만 입력하면
나머지는 원하는 대로 선택하면 됩니다
이 경우에는 추가 매개변수 인수는 넣지 않았습니다
뷰를 마크업하고 화면 뷰 이벤트를
기록할 수 있는 새로운 방법이 생겨서 기쁩니다
또한 SwiftUI에서 앱 내 메시지 뷰를 구축할 수 있게 개선되었습니다
이 예시는 modalInAppMessage 한정자를 사용합니다
closure는 뷰 빌더이고
콘솔에서 구성된 데이터를 포함한 메시지를
인수로 설정했습니다
델리게이트는 앱 내 메시징 SDK의 상호작용을 알립니다
메시지를 누르거나 닫았을 때
지표와 노출 횟수를 기록하기 위해서입니다
각 메시지 유형에 따라 API가 있고 앱 내 메시지에서
매우 간편하게 맞춤 인터페이스를 제공합니다
원하는 Swift 도우미가 있으면
GitHub 토론에 올려주세요
커뮤니티에서 Combined가 출시된 걸 매우 기뻐하는데 그럴 만합니다
저희도 그렇거든요 커뮤니티 구성원 여러분께서
많은 도움을 주셨고
저희도 개선을 위해 노력하고 있습니다
아직 개선해야 할 게 많지만
어떤 변화가 있었는지 살짝 보여드리죠
이메일과 암호를 사용한 Auth 로그인에 작성한 퍼블리셔입니다
Auth 데이터 결과나 관련 오류의
combine future를 반환합니다
약간 단순화되었지만 이 파이프라인에서는
사용자를 추출하고 오류를 nil로 대체하여
UI에 표시되는 로그인된 사용자 속성에
할당합니다
각 SDK의 여러 퍼블리셔가
비동기식 데이터 플로를 지원합니다
GitHub 프로젝트에서
Combine API 개발이 어떻게 진행되는지 확인하세요
비동기식 처리 코드에서 combine 외에도 Swift 툴 체인에서
조만간 Async/await이 릴리스될 예정입니다
이메일과 암호를 사용한 로그인에서
완료 핸들러와 Async/await을 비교해보겠습니다
완료 핸들러는 제어 플로를 처리하는 데 사용합니다
완료 핸들러 안에는 많은 비동기식 호출이 들어가는데
전형적인 피라미드 형태가 형성될 수 있습니다
Async/await으로 어떻게 이 호출을 바꿀 수 있을까요?
완료 핸들러 블록에서 전체적으로 상태를 관리하는 대신
비동기식 코드에 가까워져서 쉽게 추론할 수 있습니다
다른 비동기식 호출도 똑같이 바꾸면
상태를 훨씬 간단하게 관리할 수 있고
오류가 적절히 처리됩니다
이제 Chen 씨가 재미있는 데모를 소개해주시겠습니다
Ryan 씨, 감사합니다
Firebase로 독립적인 워치 앱을 개발하는 방법을 설명하겠습니다
워치에서 하루 커피 섭취량을 추적하려고 합니다
독립적 워치 앱은 휴대폰과 동기화하지 않고도
사용할 수 있어서 좋습니다
Firebase에서는 Firebase Cloud 서비스에
워치를 직접 연결하는 방법으로 개발을 돕고 있습니다
현재 WatchOS에 커뮤니티 지원이 제공되는 제품들이 출시되어 있습니다
Forebase 콘솔에서 워치 앱으로
푸시 알림을 보낼 수 있습니다
휴대폰 없이도 실시간 데이터베이스와
커피 섭취량 상황이 동기화됩니다
클라우드 스토리지에서 워치로 이미지를 다운로드할 수 있습니다
다만 콘솔에 설정한 앱은
Apple Store Connect의 앱과 1:1로 매칭되어야 합니다
앱이 여러 플랫폼에서 제공된다면 모든 플랫폼에서
Firebase 앱 하나와 GoogleService-Info.plist를 사용하세요
이는 iOS 앱 확장 프로그램에도 적용됩니다
iOS 앱과 Mac 앱, 위젯 타겟이 있을 경우
기본 앱의 GoogleService-Info.plist 파일을 모든 타겟으로 가져옵니다
Firebase 제품을 설정했으므로
plist 파일을 Xcode로 가져옵니다
이제 푸시 알림을 워치 앱으로 보내겠습니다
최신 SwiftUI 수명 주기를 사용합니다
확장 프로그램 델리게이트가 없습니다
SwiftUI 수명 주기가 기본적으로
앱이나 확장 프로그램 유형 델리게이트를 포함하지 않기 때문입니다
WKExtensionDelegate Adaptor를 사용해
코드를 추가할 앱에 델리게이터를 삽입한 다음
WatchOS 푸시 알림 권한을 요청하고
앱 델리게이트가 필요한 Firebase SDK API를 처리합니다
이 경우에는 Messaging SDK에 apnsToken을 설정합니다
예전에 스위즐링이 지원될 때는 메시징에서
이 단계를 자동처리했습니다
하지만 스위즐링이 취약해지면서
WatchOS에서는 이 방식을 권장하지 않게 되었습니다
대신 WKExtention 델리게이트에서
didRegisterForRemoteNotifications 메서드를 구현하고
apnsToken을 메시징에 수동 설정해야 합니다
이는 SwiftUI 수명 주기를 사용한다면 iOS 앱에도 적용됩니다
UIApplicationDeligate Adaptor를 사용해
UI 키트에서 앱 델리게이트를 삽입해야 합니다
그런 다음 앱 델리게이트가 필요한 코드를 구현합니다
이제 워치 앱으로 멋진 이미지를 다운로드하는 코드 조각을 살펴보겠습니다
여기에서는 Firebase 스토리지를 사용합니다
iOS 앱에서도 똑같은 코드를 실행할 수 있다는 걸 눈치채셨나요?
예, Firebase 스토리지는
메시징과 같은 특수한 워치 키 API가 필요하지 않습니다
WatchOS, iOS, tvOS, masOS 앱에 거의 동일한 코드를 사용할 수 있습니다
일부 앱 확장 프로그램도 지원하기 시작했습니다
사용자가 앱에 액세스하고 이를 사용하는 데
굉장히 큰 도움이 되기 때문입니다
위젯을 예로 들어보겠습니다
위젯 확장 프로그램은 앱 정보를 표시하고
사용자의 클릭을 유도하기에 좋은 기능입니다
스토리지를 사용하여 위젯 확장 프로그램으로
사진을 가져오는 코드 조각입니다
위젯 키트에도 멋진 이미지를 가져올 수 있습니다
기본 아이콘 대신 앱의 키 정보를 표시할 수 있어서
좋은 기능입니다
세션은 여기까지입니다
함께 Apple 앱을 구축하며 유익한 시간 보내셨기를 바랍니다
GitHub 리포지토리를 확인하세요
유용한 정보가 많이 있습니다
기능을 시험해보고 버그를 확인하고 GitHub 토론에 참여하세요
여러분이 Firebase로 개발한 앱을 기대하고 있겠습니다
(경쾌한 테크노 음악)