-
Notifications
You must be signed in to change notification settings - Fork 3
Week3 assignment
자신이 만든 버튼 클래스를 라이브러리로 사용할 수 있도록 CocoaPods에 등록
- 스위프트의 옵셔널은 잠재적 오류를 다루는 방법으로 변수에 nil을 직접 할당하는 방식이 아니라 옵셔널을 사용한다.
- 옵셔널은 값이 없는 것이 아니라 다른 값을 감싸도록 만들어져서 값이 없는 상황에도 오류를 발생하게 하지 않기 때문에 프로그램의 안정성을 높일 수 있다.
Q2. WWDC 2018의 세션 중 관심가는 세션 2개의 내용을 요약하고 , 이 기능이 내 프로젝트 또는 다른 앱에 어떤 방식으로 적용할 수 있을지 그것이 사용자와 시장에 어떤 영향을 미치게 될지 정리해보기
Author: 성준
WWDC2018-Session211 - iOS, watchOS
- Siri Shortcuts은 iOS12의 파워풀한 새로운 기능입니다. 이는 Siri를 이용해 앱의 기능을 표출할 수 있도록 가능하게 해줍니다.
- 또한 Siri가 Shortcut의 사용 빈도를 체크해 적절하게 제안할 수도 있습니다.
- Shortcuts는 Siri에 음성 구절을 추가해 iOS, HomePod 그리고 watchOS에서 적용시킬 수 있습니다.
Define Shortcut -> donate shortcout -> handle shortcut
- Define Shortcut
- 언제, 어떤 Shortcut을 사용할 지 앱 안에 정의한다.
- Donate Shortcut
- Siri를 통해 사용자들이 Shortcut을 사용하기 위해, 개발자가 정의한 지름길(기능이 수행되는 시나리오)을 사용자의 Shortcut에 donate 해야한다. (기부한다라는 표현이 Offical이지만, 제공해준다도 맞는 표현 같다.)
- Handle Shortcut
- 제공된 Shortcut의 Response 또는 다음 액션에 대해 Handling 할 수 있다.
- 사용자가 앱의 핵심기능을 사용할 수 있도록 가속시켜 준다.
- 사용자가 계속해서 관심을 가지게 해준다.
- 언제든지 실행 가능한 것
NSUserActivity
-
검색 결과나 Handoff를 통하여 사용자가 앱을 사용하던 상태를 저장 복원하기 위해 사용하는 간편한 방법 (마치 PCB!)
-
사용한다면 가능한 것 들
- 너의 앱에서 무언가를 열 수 있게 해준다.
- Spotlight나 Handoff를 위해 제공하는 아이템을 나타낼 수 있다.
-
Activity Types
- 각 NSUserActivity는 고유한 activityType을 가진다.
- 이 타입을 통해 다양한 액션들을 처리 할 수 있도록 해준다.
Intents
-
SiriKit과의 상호작용을 하기위한 Extension
-
사용한다면 가능한 것들
- Siri의 Voice Response를 Custom 할 수 있다.
- 물론 View Response도 Custom 할 수 있다.
-
SiriKit에는 다음과 같은 Default 기능들이 내장되어 있다. (SiriKit은 아래 기능들 밖에 사용하지 못한다...)
- Messaging
- Climate and Radio
- Photo Search
- Notebook
- Payments
- VOIP Calling
- Car Commands
- Lists
- Ride Booking
- Workouts
Parameters
- Siri에게 넘기고자 하는 인자들을 정의하는 곳 Shortcut Types
- Siri가 알아들을 수 있도록 필요한 단어를 지정하는 곳
Intent Handling Notes
- 앱을 실행하지 않고도 백그라운드에서 Shortcut을 실행시킬 수 있다.
- 당신이 의도한 Intents Extension 시점이 있더라도,
-continueUserActivity
는 항상 실행된다.
INRelevantShortcut
- Siri Watch Face를 Shortcuts로 표현하기 위한 객체이다.
- 선택적으로, 너의 shortcuts이 Watch Face에 보일 때 정보들을 포함시켜 보이게 할 수 있다.
- 물론 Watch App이 없다하더라도 동작시킬 수 있다. (일반 iOS App에서도 가능하단 말인데 왜 Siri Watch Face에서 라고 처음에 언급하는지 모르겠다...)
Shortcut Suggested
- 사용자가 반복적으로 이용했던 Shortcut을 Siri 제안을 통해 추천해 준다.
How is a Shortcut Suggested?
- requiredUserInfoKeys
- Restoration을 위한 최소한의 정보를 이용해 패턴을 찾아냅니다.
- 과거에 불러졌던 shortcut의 count를 센다!
Media Shortcuts
-
Play Media Intent
- 백그라운드에서 앱이 실행 가능하다.
- 잠금화면에서 Playboack Control을 보여줄 수 있다.
- Homepod에서 작동 가능하다.
-
Upcoming Media
- INUpcomingMedia API를 사용한다면 새로운 미디어나 사용자가 소비하지 않은 콘텐츠를 제안해 줄 수 있다.
- podcasts와 TV Shows에 매우 잘 맞는다.
- Shortcut은 파워풀한 새로운 경험을 가능하게 해줍니다.
- 사용자들을 새로운 경로로 유입되게 할 수 있습니다.
- NSUserActivity 또는 Intents를 Shortcut에 적용시킬 수 있습니다.
Siri Shortcuts에 대한 개인적인 생각
- 결론부터 말하자면 SiriKit + Shortcuts는 엄청난 시너지를 내는 것 같다.
- SiriKit은 이전에 한정된 기능(ex. messaging, payment...)만 제공했었기에 개인 비서라고 불리기엔 부족한 점이 많았다.
- 그러나 Shortcut의 Intents Extension을 SiriKit과 연동시키니 APP을 서비스하는 입장에서 서비스를 제공할 수 있는 방법이 다양해진 것 같다.
- 이로 인해 영상 중반에 Speaker가 언급했듯이, 사용자들을 서비스로 유입시킬 수 있는 새로운 길을 개척했다고 볼 수 있을 것 같다.
- 앱을 굳이 실행시키지 않더라도, 말 한마디면 원하는 기능이 모두 저절로 작동하니까!
- 너무나도 편한 기능인데, Siri Shortcuts을 적용시킨 서비스가 별로 없다보니 아직 많이 보편화가 되지 않았다고 생각한다.
TREE 앱에 적용 시킬 수 있는 부분
-
급상승 검색어
- 현재 LIVE 탭에 급상승 검색어를 국가별로 제공하고 있다.
- 우리가 보통 네이버나 다음 웹사이트를 방문하더라도 거의 제일먼저 확인해보는 것이 실시간 검색어 일 것이다.
- 이 국가별 실시간 검색어를 앱을 실행시키지 않고도, 웹사이트에서 국가를 바꾸지 않아도 간단하게 확인해볼 수 있다면 정말 유용할 것 같다.
-
해당 급상승 검색어 또는 주요 이슈에 대한 관련 기사
- Intents UI Extension의 한정된 View 크기로는 문제가 있지만, 번거로운 앱 프로세스를 거치지 않고도, 기사를 쉽게 확인 할 수 있도록 할 수 있을 것이다.
다른 팀에 적용 시켜볼 수 있는 부분
-
경조사 팀
- Siri Shortcuts와 가장 잘 맞는 서비스라고 생각한다.
- 경조사를 등록하는 프로세스를 SiriKit으로 한번에 시켜준다면 매번 손으로 입력해야 된다는 번거로움을 해소할 수 있지 않을까 싶다.
-
미세먼지 팀
- 위젯도 분명 미세먼지를 알려줄 수 있는 좋은 기능이지만, Siri로 현재 기상 상태를 알려주고 간단한 Response Templete을 적용한다면 더 사용자 친화적일 것 같다.
Author: 혜리
-
Swift Generic
- Swift 1.0 - Generic types / Generic functions
- Swift 2.0 - Protocol extensions / Default impletmentations
- Swift 3.0 - Protocol operators / Generic typealiases
- Swift 3.1 - Nested generic types / Concrete type constraints
- Swift 4.0 - Associated type where clauses / Generic subscripts
- Swift 4.1 Conditional conformance / Recursive constraints
-
Generic
제네릭은 Swift에서 가장 강력한 기능 중 하나로 Swift 표준 라이브러리 대다수는 제네릭 코드로 만들졌습니다.
- 버퍼 struct
struct Buffer {
var count: Int
subscript(at: Int) -> Any {
}
}
-
Q. 각 요소를 index로 가져오는 방법이 있지만 리턴 타입을 무엇으로 만들어야 할까요?
- A. Generic이 없다면 우리가 버퍼에 넣고 싶은 것을 표현할 수 있는 타입인 Any로 넣어야합니다.
-
Any로 넣게되면 그 유형을 꺼내서 사용해야한다. 또한 오류가 발생하기 쉽습니다.
- 예를들어 문자열의 버퍼에 정수를 넣으면 ? Oh No 😭!!!!!
-
Q.어떻게 메모리에 표현될까?
-
ㅁ-ㅁ-ㅁ-ㅁ-ㅁ 이런 느낌 ..
-
문자열 버퍼를 이상적으로 표현하면 모든 요소가 나란히 연속적인 메모리 블록이됩니다.
-
type이 지정되지 않은 접근 방식을 사용하면 이 방법이 효과가 없습니다.
- 왜나면 버퍼는 어떤 종류의 타입을 포함할지 미리 알지 못하기 때문입니다.
-
Any를 사용하면 tracking과 boxing 및 unboxing에 많은 오버헤드가 있습니다.
-
따라서 사용의 용이성과 정확성 뿐 아니라 성능상의 문제가 발생한다.
-
struct Buffer<Element> {
var count: Int
subscript(at: Int) -> Element {
}
}
-
Element는 컴파일러가 버퍼에 무엇을 포함 할 것인지를 알려주는 컴파일 타임 argument라고 생각하면 됩니다.
-
버퍼에서 Element를 가져올 때 따로 Any와 같이 변환 할 필요가 없습니다.
-
예를들어 스트링 버퍼에 정수를 넣으면 ? 즉 실수를 한 경우 컴파일러가 에러를 발생시킵니다.
- 컴파일러가 Element 내용이 무엇이여야하는지 추측이 가능하기 때문이다.
there's no such type as buffer without an associated element type.
-
즉 제네릭을 사용하면 오버헤드없이 연속적인 메모리 블록에 모든 Element를 보유합니다.
- 사용의 용이성과 정확성 👍
- Generic을 활용해 다양한 데이터 타입을 처리할 수 있습니다.
- 재사용가능한 함수와 타입이 어떤 타입과 작업할 수 있도록 요구사항을 정의할 수 있습니다.
- 의도를 명확하게 표현하고 추상적인 방법으로 코드를 작성할 수 있습니다.
TREE 앱에 적용 시킬 수 있는 부분
- ArticleViewer
- Search, Live, Scrap에서 뷰어를 사용하는데 각각의 데이터 타입이 있기 때문에 이 부분에서 제네릭을 활용하면 코드 중복을 줄일 수 있을 것 같습니다.
- APIManager
- Generic을 활용하여 코드 중복을 줄일 수 있습니다. (예시: Result)
다른 팀에 적용 시켜볼 수 있는 부분
- 경조사
- 동일한 기능을 구현하는데 타입이 여러 가지인 함수가 많을 것입니다. 그럴 때 타입마다 함수를 구현하지 않고 제네릭을 활용하여 관련 타입을 위한 (where) 요구 사항을 정의하여 사용하면 유용할 것입니다.