2022 Platforms State of the Union 정리

Doldamul·2022년 7월 29일
0
post-thumbnail
  • 블로그를 Velog에서 운영해보기로 마음먹으면서 Medium에 던져두었던 글들도 옮겨오기로 했다. 어차피 아무도 읽지 않았던 글이고, 조금 부끄럽지만 나름 첫 번째 포스팅이었기에 최대한 그대로 올려놓으려고 한다. 여전히 비슷한 취지의 글이 없는 듯하기도 하고.

WWDC2022: Platforms State of the Union

(6월 7일 작성)
새벽 2시부터 일어나서 keynote랑 platforms state of the union를 챙겨봤다. 난 촌놈마냥 각각의 신기능들에 흥분하면서 가슴이 막 벅차올랐는데, 다른 사람들은 그렇지 않았나보다. 하드웨어가 더 이목을 끌기 좋다는 건 이해하지만(맥북 에어 가격이 모든 어그로를 다 가져갔다), keynote에 비해 platforms state of the union은 언급조차 없다는게 조금 아쉬웠다. 아니... 좀 많이 아쉽다. 저기요? 정규 표현식을 선언적 구문으로 사용할 수 있어요! SwiftUI에 그리드도 생겼고요, 차트도 만들 수 있고요, 또.. 음... 웹 매뉴얼 UI가 리뉴얼됐어요!(충격)

매뉴얼이 드디어 좀 쓸만해졌다.

사실 이번 WWDC에서 가장 마음에 들었던 업데이트였다. 좌측에 사이드바가 생겨 목차를 토글 목록으로 조회할 수 있게 되었고, 자체 검색바도 생겼으며, 전반적으로 깔끔해졌다.

이번 WWDC에 전반적으로 어떤 사항들이 있는지 훑어보고 이해한다면 이후에 원하는 내용을 찾아 본격적으로 공부해보려 할 때 도움이 될 것이다.

Xcode Cloud

오늘(6/7 기준) 정식 런칭(베타 딱지 뗌)
가격:

  • 매달 25시간: 15달러
  • 매달 100시간: 50달러
  • 매달 250시간: 100달러
  • 매달 1000시간: 400달러
    * 애플 개발자 프로그램을 구독한 사람들은 2023년 말까지 매달 25시간 무료 제공.

하반기에는 Developer 앱에서도 Xcode Cloud 구독 사항을 관리할 수 있도록 할 예정.

Swift 5.7

비동기 구문

  • 비동기 시퀀스를 다루는 비동기 알고리즘 내장: 시퀀스를 다루는 for나 try - catch 구문을 동기 구문처럼 쓸 수 있음
// 동기 구문
for (number, letter) in zip(numbers, letters) {
    print(number, letter)
}

// 비동기 구문
for await (number, letter) in zip(numbers, letters) {
    print(number, letter)
} // 서로 비슷한 구문처럼 보이지만 내부 처리 메커니즘은 전혀 다르다.
  • 시계 타입: 비동기 구문을 쉽게 제어할 수 있도록 시계(clock) 타입 추가. 많은 비동기 알고리즘이 clock 타입을 사용
fastEvents.throttle(for .seconds(1)) // 인자로 clock 타입을 사용
  • 분산 actor: actor 앞에 distributed 키워드를 붙이면 장착형 전송 메커니즘(Pluggable Transport)에 기반하여 서로 다른 프로세스 또는 기기 간에 서로의 state 데이터를 사용할 수 있도록 해준다.
  • 장착형 전송 메커니즘이란?

    클라이언트의 트래픽을 수락하고 서버로 라우팅하는 독립 실행형 프로세스.
    서로 통신하는 방법을 알고 있는 클라이언트 및 서버 측 프로세스 필요.
    인터넷 검열 주체가 송수신 정보를 알 수 없도록 트래픽 자체를 난독화하는 것을 목표로 한다.

출처: https://obfuscation.github.io

정규 표현식

정규 표현식은 문자열 정보 추출 코드의 가독성•편의성을 높여주는 표현식이다.

  • 새로운 정규 표현식 리터럴(유니코드 지원): " 기호 대신 / 기호로 감싸진 문자열에는 보간법으로 정규 표현식을 넣을 수 있다. 정규 표현식을 포함하는 이 새로운 리터럴은 Regex 타입으로 추론된다.
let regexString : Regex = /Order from (.*), count: ([0-9]+)/
// Regex 타입은 정규 표현식이 포함된 문자열을 저장한다. 
  • 정규 표현식 빌더 제공(정규 표현식의 resultbuilder): 정규 표현식을 선언적 구문으로 사용 가능
// RegexBuilder는 선언적 구문을 정규 표현식으로 변환한다.
let logRegex = Regex {
    OneOrMore(.whitespace) 
    Capture {
        "0x"
        OneOrMore {
            CharacterClass(
                .anyOf("_."),
                ("a"..."z"),
                ("A"..."Z")
            )
        }
    }
    OneOrMore(.whitespace) 
    Capture {
        ...
    }
}

타입

  • 실존(existential) 타입(= 구 프로토콜 타입): any 키워드 명시 제안
struct MusicLibrary {
    var playlists: [any Collection<Song>]
// any 키워드로 실존 타입임을 명시할 수 있다.
// Swift 6부터는 any 키워드가 없는 실존 타입은 에러를 발생시킨다.

    func playAll() {
        for playlist in playlists {
            playSongs(in: playlist)
        }
    }
}
  • 제네릭 함수 인자에 불투명(Opaque) 타입 사용 가능.
// 실존 타입 인자는 구체적 타입 정보가 없으므로 타입 캐스팅이 필요하다는 단점이 있다.
func playSongs(in playlist: any Collection<Song>)

// Generic 함수로 playlists 인자를 받으려 한다.

// 1. 제네릭 개선 이전 : Generic 및 타입 제약조건 때문에 가독성이 떨어진다.
func playSongs<Playlist>(in playlist: Playlist)
    where Playlist: Collection, Playlist.Element == Song {...}

// 2. 제네릭 개선 이후 : Song을 요소로 가지는 불투명 타입. 기존의 Generic 코드를 대체한다.
func playSongs(in playlist: some Collection<Song>) {...}

Swift Package Plugin

  • 앱 빌드를 돕는 코드로서 작용
  • 린팅, 포매팅, 코드제너레이션 등 전체 코드를 스캔하고 수정할 수 있다.
  • 종류는 명령어 플러그인, 빌드 플러그인 2종류.

성능 개선

  • 프로젝트 빌드가 2배 빨라졌다.
  • 링크 성능도 최대 2배 더 빨라졌다.
  • 비동기 작업의 우선도를 더욱 보장한다.
  • iOS16에서의 앱의 실행시간 단축: 최대 2배 빠르게 실행된다.

swiftUI

수많은 개선사항들

새로운 앱 네비게이션 API

기존 NavigationView는 Deprecated되었다.
다음 두 View가 NavigationView를 대체한다.

  • NavigationStack
  • NavigationSplitView

그외에도 많은 View 및 modifier들이 추가되거나 Deprecated되었다.

레이아웃 개선

  • 그리드 API 추가

  • Custom Layout API 추가

  • 하프 시트 추가(네이버 지도의 하단부 확장 시트를 떠올리면 된다)

  • 공유 시트 지원: 새로 추가된 Transferable 프로토콜 기반이다.

  • Transferable 프로토콜: 앱 데이터 전송을 위한 type-safe API이다. 구현한 View는 앱 내외로 드래그&드롭 가능한 데이터가 된다.

  • UIKit에서 다음 컬렉션 View Cell을 사용하면 SwiftUI View의 선언적 구문을 사용할 수 있다.

cell.contentConfiguration = UIHostingConfiguration {
    VStack(alignment: .leading) {
        Text(song.title)
        Text(song.artist.name)
            .font(.caption)
            .foregroundStyle(.secondary)
    }
}

Swift Charts 프레임워크

  • SwiftUI를 기반으로 한 그래프 생성 프레임워크
  • Chart라는 SwiftUI View 내부에 원하는 내용을 지원되는 View 및 modifier들로 채우면 된다. 즉 SwiftUI View 내에서 사용 가능하다.
  • 라인, 바 차트, 히트맵, 스트림 그래프 등등을 만들 수 있다.
  • 심볼, 주석, 보간법 등의 스타일 설정 지원
  • Accessibility, Animation 기본 지원

preview 개선

  • preview 화면에서 다크/라이트 모드, 가로/세로 모드 선택 가능
  • 캔버스 세팅: live preview의 모드를 실시간으로 변경 가능

그 외

  • ViewThatFits 컨테이너 추가
  • 프로젝트 설정 UI 개선된 새로운 프로젝트 패키지.
  • MenuBarExtra Scene 추가: 맥 앱 전용 메뉴바 아이콘 확장 View 지원.
  • SwiftUI 기반의 잠금화면 위젯

시스템 경험

아이폰 잠금화면 위젯

잠금화면 위젯은 애플 워치의 컴플리케이션을 확장한 것으로, 3종류를 지원한다.
원형 위젯사각형 위젯선형 위젯

WidgetKit은 애플 워치의 컴플리케이션과 잠금화면 위젯을 동일한 코드 베이스로 사용할 수 있도록 지원한다.

Live Activities

  • WidgetKit으로 적용 가능.
  • 잠금화면에서 실시간으로 데이터 동기화되는 큰 위젯을 볼 수 있음.
  • 남은 경로 및 시간, 실시간 스포츠 경기 현황 등에 활용 가능.
  • SwiftUI 기반이므로 애니메이션 적용 가능.
  • 연말 추가 예정.

협업

Messages Collaboration API

  • 공유 시트의 사용자화
  • 메시지, FaceTime 앱에서 공유 링크의 임베디드화

App Intents 프레임워크

Siri 및 단축어 기능을 앱 내에서 기본 제공하는 프레임워크

  • 앱 단축어:
    - 앱에서 제공하는 기본 단축어.
    - Siri로 앱 단축어 호출 기본 지원
    - spotlight에서 앱 단축어 추천.
    - 앱을 열지 않고 Siri 또는 spotlight에서 View를 제공할 수 있음

App Intents 프레임워크는 SiriKit의 다음 단계

  • 위젯 또는 도메인(미디어, 메시지 등)에 intent를 사용하고 있다면 SiriKit을 계속 사용해야 함
    (아직 개발 덜했다는듯)
  • siri 및 단축어의 사용자화 intent를 사용하려한다면 App Intents 프레임워크 사용을 권장함
  • SiriKit으로부터 마이그레이션하기 쉬움
  • 적은 코드
  • swift 기반
  • SSOT 적용
  • 앱 아키텍처에 영향을 주지 않는 API
    (뭐야 그럼 이전엔 영향이 있었다는..?)

IntentDefinition 파일에서 convert 버튼을 누르면 App Intents 프레임워크로 업그레이드된다.

Passkeys

사용자가 직접 만들고 입력하는 비밀번호 대신 기기에서 생성한 인증키로 대체하여 보안을 강화한다는 개념이다.

  • icloud keychain에 패스키 저장하고 생체 인증으로 로그인하는 방식으로 지원.
  • 공개 업계 표준을 기반으로 하므로 타 PC에서도 로그인 가능. 로그인할 때 패스키를 사용을 선택하면 보여주는 QR코드를 아이폰으로 찍는 방식
  • 본질적으로 정보 유출이 없고, 피싱 사이트를 원천 차단한다.

iPadOS

맥에서만 사용 가능하던 DriverKit를 iPad에서도 사용 가능.

  • USB, audio, pci 하드웨어 등을 지원.

WatchOS

  • CallKit 프레임워크에 VoiceOver ip background mode 추가: 앱내 음성통화 기능을 애플워치에서 전화 UI로 사용 가능.
  • blutooth connected medical devices: 블루투스 의학 기기와 연동성이 좋아져서, 워치에서 위험한 상태가 감지될 경우 해당 기기에 즉각 경고를 보냄

tvOS

애플tv에서 컨트롤러로 사용할 애플 기기를 자동으로 찾아 연결해주고, 해당 앱이 깔려있지 않은 경우 설치할지 물어보는 알림창을 보냄.

Ads and privacy

SKAdNetwort 개선

ScanKit & RoomPlan

앱 내에서 LiDAR 센서를 사용해 주변을 스캔하고, 3D 매개변수 룸 모델을 USD 또는 USDZ 포맷 파일로 만들 수 있게 해준다.

집중 모드

App Intents 프레임워크에서 Focus Filter API 제공

Metal 3

  • Pytorch 개선
  • Metal IO API - fast resource loading
  • offline Shader compiliation
  • Mesh shaders
  • MetalFX Upscaling - 저해상도+업스케일링으로 고프레임 맞추기 좋음

MapKit 개선

앱 내에 지도를 임베디드할 때 3d 에셋 및 정보를 불러올 수 있음.

  • 애니메이션 지원
  • 다크모드 지원
  • 주변보기 지원
  • Apple 지도 서버 API
    - Geocode
    - reverse geocode
    - search
    - estimate time to travel

WeatherKit

  • 현재 날씨
  • 시간당 날씨
  • 강수량
  • 자외선 지수 예보 등
  • native Swift API

WeatherService 객체의 weather함수(지역 인자)로 날씨를 요청.

애플 개발자 프로그램 구독자는 매달 50만건 호출 무료.

  • 매달 100만건 호출: 50달러
  • 매달 200만건 호출: 100달러
  • 매달 500만건 호출: 250달러
  • 매달 1천만건 호출: 500달러
  • 매달 2천만건 호출: 1000달러

VisionKit 개선

  • Live Text API(이미지, 영상) (이제 한국어 지원!)
  • Data Scanner API(카메라)

예시)

  • 앱 내에 라이브 텍스트 버튼을 추가하고 기능을 사용할 수 있음
  • 앱 내에 QR 코드 스캔 기능을 추가할 수 있음

마치며

내려갈수록 점점 대충 쓴 것 같다면... 맞다. 갑자기 수면 패턴을 뒤집고, 새벽 2시부터 키노트를 시청하고, ... 저녁까지 쭉 깨어있었더니 정신이 반쯤 나가버렸다. 내가 흥미를 느꼈던 부분이 정규 표현식과 swiftUI 정도뿐인 것도 있다. 그래도 한번 시작한건 끝을 내야지! 하는 생각에 어떻게든 정리해낸 것 같다. 엉망이라는 건 알지만, 이런 정리글이라도 만들었다는 것에 의미를 두자.
사실 이렇게 글을 업로드까지 할거라는 생각은 안했는데, 이도저도 아닌 상태로 시간 끌어봐야 나한테 득 될게 없다, 작성한 글이라도 좀 꾸준히 올려보자-라는 생각에 시작하게 되었다. 올리다보면 나 자신도 뭔가 깨닫는게 있겠지.

profile
덕질은 삶의 활력소다. 내가 애플을 좋아하는 이유. 재밌거덩

0개의 댓글