i​OS 12

올해 WWDC 키노트를 보셨나요? 보셨다면 Siri Shortcuts, ARKit 2, Core ML 2 그리고 오랜기간 루머였던 iOS/Mac을 연결하는 “Marzipan”과 같은 iOS 12의 큰 기능들은 이미 알고계실 것입니다.

Platforms State of the Union 세션에선 화려하진 않지만 충분히 흥미로운 새로운 기술인 커스터마이징 가능한 노티피케이션 UINatural Language 프레임워크가 발표됐습니다.

우리 NSHipster는 변경된 내용은 적어도 우리의 매일에 큰 영향을 주는 그런 핵심적인 기술을 좋아합니다. 이번 iOS 12 릴리즈 노트Foundation 릴리즈 노트에는 사람들에게 알려지지 않은 새로운 변경들이 많습니다.

오늘은 iOS 12의 릴리즈를 축하하는 의미로 iOS 11.4와 12의 API 변경에 대해 알아낸 것들을 공유하고자 합니다. (이 중 상당수는 아직 문서화되지 않은 것도 있으니 신중하게 진행하세요!)


리퀘스트의 중요도에 따른 트래픽 우선 순위 변경하는 기능

iOS를 위한 Fast Lane을 들어보신 적 있으신가요? 그 fastlane 아니고, 그 IOS도 아닙니다.

Fast Lane (혹은 Fastlane)은 무선 트래픽을 종류에 맞게(오디오, 비디오, 백그라운드 데이터) 우선 순위를 변경해주는 메커니즘입니다. 이는 Cisco 라우터에서만 사용 가능한 기술인데, 빠른 로밍을 위한 802.11r, 보조 로밍을 위한 802.11k 그리고 무선 설정을 위한 802.11v와 같은 여러 Wi-Fi 표준을 하나로 묶습니다.

2015년에 발표된 Apple과 Cisco 사이의 파트너쉽 덕분에 iOS 개발자들은 서비스 종류(QoS 마킹)를 네트워크 커넥션에 제공하는 것만으로 이 기술을 넣을 수 있게 되었습니다. (이미 많은 고급 API가 자동으로 이를 처리하고 있습니다)

iOS 12에서 새로 나온 URLRequest 객체는 networkServiceTypeNSURLNetworkServiceTypeResponsiveData로 설정해서 시간에 예민한 리퀘스트의 우선 순위를 변경할 수 있습니다.

import Foundation

let url = URL(string: "https://example.com/checkout")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.networkServiceType = .responsiveData // Prioritize

URLSession.shared.dataTask(with: request) {
    (data, response, error) in
    // ...
}

이 옵션은 현재 문서화돼있지는 않지만 WWDC 2018 Session 714: “요즘 인터넷에 앱 최적화하기”에서 엔지니어는 이 기술을 현명하게 꼭 필요할 때만 사용하라고 말했습니다. 그들이 제시한 예제는 “쇼핑 앱의 체크아웃 페이지” 였지만 또 다른 잠재적인 사용 케이스를 추론하고 적용해보세요.

백그라운드에서 NFC 태그 읽는 기능

WWDC 2018에서 많이 나온 질문 중 하나는 NSUserActivity 에 새롭게 추가된 ndefMessagePayload 속성에 대한 것이었습니다. Apple 엔지니어는 랩 세션에서 “노 코멘트” 했습니다.

하지만 지난 주 iPhone XS, iPhone XS Max, iPhone XR이 나오면서 확실해졌습니다. 이 기기들은 백그라운드에서 NFC 태그를 읽을 수 있게 지원하며 iOS 12의 최근 세대의 기기를 사용하고 있더라도 사용 가능합니다. 추가적인 설정은 필요없으며 앱을 실행하고 호출하고 NFC 태그를 스캔하고 URL을 열 수 있는 기능입니다. 이 기능은 의도하지 않은 실행을 피하기 위해 오직 iPhone이 잠겨있고 비행기 모드가 아니거나 Apple Pay나 카메라 사용 시에만 작동합니다.

이 NFC 기능을 통해 Apple은 2013년에 BLE iBeacons에서 약속한 것들을 완전히 실현해서 QR 코드 스캔보다 더 현실적인 인터페이스를 제공하고자 합니다. (중국에선 QR 코드를 흔히 볼 수 있지만 다른 나라들은 아닌 경우가 대부분입니다.)

NFC와 iBeacon 기술 모두에게 공통적인 사용 예는 박물관에 방문하면 전시에 대한 추가적인 설명이 폰에 뜨도록 하는 것입니다.

이러한 기능을 설정하려면 앱에서 entitlements, associated domain 설정 등을 필요로 합니다. 물론 API 도 대응해야겠죠. 다행히도 Apple은 이 과정에 대한 샘플 프로젝트 코드문서를 제공합니다.

연락처에서 전화번호와 이메일 주소로 검색하는 기능

Contacts 프레임워크는 iOS 9와 macOS El Capitan에서 AddressBook 프레임워크를 대체하기 위해서 나왔습니다.

지금까진 이름과 식별자로만 연락처 검색이 가능했습니다. iOS 12부턴 CNContactpredicateForContacts(matching:)predicateForContacts(matchingEmailAddress:) 클래스 메소드를 통해 전화번호와 이메일 주소로 검색할 수 있게 되었습니다.

예를 들어 전화번호와 이메일 주소를 가진 모든 연락처에 대해 이름과 성 구성요소를 검색하려면 CNContactFetchRequest 를 작성하고 각 subpredicates 에서 “AND” predicate를 지정하고 enumerateContacts(with:) 에 넘긴 후에 CNContactStore 에서 호출하면 됩니다.

import Contacts

let phoneNumber = CNPhoneNumber(stringValue: "+1 555 555 1234")
let phoneNumberPredicate = CNContact.predicateForContacts(matching: phoneNumber)

let emailPredicate = CNContact.predicateForContacts(matchingEmailAddress: "johnny@example.com")

var fetchRequest = CNContactFetchRequest(keysToFetch: [
    CNContactGivenNameKey as CNKeyDescriptor,
    CNContactFamilyNameKey as CNKeyDescriptor
])

fetchRequest.predicate =
  NSCompoundPredicate(andPredicateWithSubpredicates: [
    phoneNumberPredicate,
    emailPredicate
])

let store = CNContactStore()
try store.enumerateContacts(with: fetchRequest) { (contact, _) in
    // ...
}

공중에 있을 때 위치 정보 갱신하는 기능

iPad는 공중에서 일을 하는 파일럿들에게 인기가 좋은 제품입니다. 만약 여러분이 콕핏에서 사용되는 앱을 작업중이라면 iOS 12에 여러분을 위한 CLLocationManager 이 생겼으니 기뻐하셔도 됩니다.

activityType 속성은 예전에도 있었지만 CLLocationManager 의 잘 알려지지 않은 설정 옵션이었습니다. 지금까진 교통에 대한 설정이 엄격하게 제한되었습니다. (자동차, 걷기 / 달리기 / 자전거타기, 등등) 이제 iOS 12에선 공중 액티비티 타입을 설정할 수 있으며 앱의 모션 추적 알고리즘도 좋아졌습니다!

import CoreLocation

let manager = CLLocationManager()
manager.activityType = .airborne // ✈️

평평한 표면 감지하는 기능

iOS 기기가 평평한 표면에 놓여있는지 알고싶었던 적이 있나요? 그러기 위해서 이중 검사를 해야해서 힘드셨다구요? 좋은 소식입니다! iOS 12에선 새로운 속성인 isFlat 이 생겼습니다.

import UIKit

// iOS 12 이상
UIDevice.current.orientation.isFlat

// iOS 11.4 이하
UIDevice.current.orientation == .faceUp ||
  UIDevice.current.orientation == .faceDown

텍스트 필드에 비밀번호와 인증번호를 자동으로 입력하는 기능

Apple은 iOS 기기에서 사용자가 편하게 입력할 수 있는 영웅적인 길을 가고 있습니다. 그러나 그들의 노력에도 불구하고 부드러운 유리 위를 타이핑하는 경험은 하드웨어 키보드에 비하면 언제나 고통입니다. (최신 MacBook 모델의 그러한 변화에도 불구하고요.)

텍스트 입력 강도를 최소화하기 위해서 iOS 10에선 UITextFieldUITextViewUITextInputTraits 프로토콜을 컨트롤할 textContentType 속성이 소개됐었습니다. 열거형 값 중 하나를 제공하고 컨트롤의 의미적 값을 선언하는 것으로 유저들의 현재 정보 기반의 이름이나 주소 정보를 자동으로 채워줍니다.

iOS 12와 tvOS 12에선 이 기능을 확장해서 다음 두 가지 타입이 추가됐습니다 : UITextContentTypeNewPasswordUITextContentTypeOneTimeCode.

passwordRules 속성과 함께 .newPassword 로 컨텐츠 타입을 설정하면 됩니다. 추가적으로 Password Autofill은 시스템에서 요구하는 경우 새 비밀번호를 만들어주기도 합니다.

textField.textContentType = .newPassword
textField.passwordRules = .init(descriptor:
    "allowed: ascii-printable; minlength: 8;"
)

.oneTimeCode 컨텐츠 타입을 설정하면 텍스트 필드가 자동으로 SMS로 오는 이중 인증 코드를 입력해줍니다.

textField.textContentType = .oneTimeCode

여기까지 iOS 12에서 달라진 점에 대한 대탐험이었습니다. 이번 릴리즈는 정말 거대해서 새로운 API들에 대해 더 자세히 알아보려면 몇 주는 걸릴 것 같습니다.

다음에 다룰 주제에 대해 제안하고 싶으신가요? 트위터로 알려주세요!

다음 글

iOS 7에서 디자인 변경과 함께 스큐어모피즘 디자인은 유명한 석양처럼 사라졌습니다. 그 대신 UI 컨트롤이 실제보다 물리적인 객체로 보이도록 만들어지는 새로운 패러다임이 생겨났습니다.