WWDC 2018 Дневник iOS-разработчика
Опубликовано: 2022-03-10Традиционные границы лета в США — День памяти и День труда, но разработчики iOS отмечают лето WWDC и выпуском iPhone. Несмотря на прохладную и дождливую погоду на этой неделе в Нью-Йорке, я в летнем настроении и с нетерпением жду обновления, которое обещают лето и WWDC.

Сейчас утро 4 июня, и я просматриваю свои заметки с WWDC 2017. В прошлом году я писал, что ARKit и Core ML были двумя основными событиями. Было приятно видеть, что Apple сосредоточилась на машинном обучении (ML), но до конца 2017 года не было особого внимания. ARKit вызвал некоторый интерес, но не убойное приложение (возможно, Pokemon Go, но оно было популярно до ARKit). . Apple не добавляла в свою первоначальную библиотеку загружаемых моделей Core ML после анонса Core ML.
Apple выпустила Turi Create, а Lobe в прошлом месяце выпустила новый интересный конструктор моделей Core ML. В пространстве Apple/ML создатель Swift Крис Латтнер использует другой подход с Swift для TensorFlow. Но со стороны кажется, что у Core ML в основном есть одно очевидное применение: классификация изображений. Кажется, не так уж много энергии уходит на изучение совершенно разных приложений (хотя мы все знаем, что машинное обучение лежит в основе беспилотных автомобилей и умопомрачительных демонстраций, таких как Google Duplex).
Еще один способ, которым Apple использует машинное обучение, — это Siri, и ранее в этом году я писал о SiriKit и упомянул его предполагаемые и реальные недостатки по сравнению с Alexa и Google. Одна из проблем, которую я исследовал, заключалась в том, что акцент Siri на заранее определенных намерениях ограничивает ее диапазон, но не дает обещанной точности, которую вы могли бы получить от ограниченного фокуса.
Представление HomePod в прошлом году только высветило проблемы Siri, а широко освещаемый опрос об удовлетворенности клиентов показал, что 98% удовлетворены iPhone X, но только 20% удовлетворены Siri.
Имея в виду все это, я лично надеялся услышать, что Apple собирается внести серьезные улучшения в AR, ML и Siri. В частности, как разработчик iOS, я хотел увидеть гораздо больше моделей Core ML, охватывающих не только классификацию изображений, но и дополнительную помощь в создании моделей. Для Siri я хотел увидеть гораздо больше намерений и, возможно, некоторое указание на то, что намерения будут добавляться круглый год. Это был долгий путь, но для AR следующим шагом будет устройство. А пока я надеялся на повышенную пространственную точность.
Наконец, я люблю книги по Xcode Playgrounds и iPad Playground, но они должны быть намного быстрее и стабильнее, поэтому я тоже надеялся на что-то там.
Утром перед WWDC я написал в Твиттере следующее:

Это не было предсказанием. Это просто список вещей, которые я хотел использовать в 2017 году, но нашел их недостаточно мощными или слишком сложными для начала, и надеялся, что Apple внесет некоторые улучшения.
Мой план на день — посмотреть основной доклад в прямом эфире, а затем посмотреть «Платформы о положении в стране». Они дают хороший обзор того, на чем нужно сосредоточиться до конца недели.
Конец дня 1: основной доклад и платформы State Of The Union
Первый день WWDC — это основное выступление, предназначенное для всеобщего ознакомления, и «Состояние платформ», представляющее собой обзор всего мероприятия с некоторыми подробностями для разработчиков, чтобы они могли выбрать, какие сессии посетить.
Сводка заметных заявлений разработчиков, отличных от iOS
WWDC не совсем о разработке для iOS, поэтому вот краткий список других вещей, которые произошли с другими платформами или которые не очень ориентированы на разработчиков.
- Чтобы не мешать, анонсов аппаратного обеспечения вообще не было. Никаких предварительных просмотров и обновлений на Mac Pro. Придется ждать iPhone и последующие события осенью.
- В iOS 12 есть новое приложение Shortcuts, которое, похоже, является результатом приобретения Workflow. Это способ «скриптовать» серию шагов с помощью перетаскивания . Вы также можете назначить ярлык ключевому слову Siri, о котором я расскажу ниже.
- iOS автоматически группирует уведомления из одного и того же приложения и позволяет вам работать с ними как с группой.
- Animojis теперь могут имитировать то, как вы высовываете язык, а новые Memojis — это человеческие лица с широкими возможностями настройки, которые вы можете настроить так, чтобы они выглядели как вы сами.
- FaceTime поддерживает групповой видеочат до 32 человек.
- Появилось новое приложение Screen Time, которое дает вам отчеты об использовании вашего телефона и приложений (чтобы помочь вам контролировать себя и меньше отвлекаться). Это также основа нового родительского контроля.
- Apple TV получил небольшое обновление: поддержку Dolby Atmos и новые заставки, взятые с Международной космической станции .

- Часы получили режим соревнования, чтобы бросить вызов другим в задачах, связанных с тренировками. Он также попытается автоматически определить начало и конец тренировок , если вы забудете начать или остановить их, и теперь в нем есть тренировки для пеших прогулок и йоги.
- Часы также имеют новый режим Walkie-Talkie, который вы можете включить для доверенных контактов.
- На Watch появилось больше звуковых SDK , и теперь доступно приложение Apple Podcasts. Я ожидаю, что сторонние приложения для подкастов также будут использовать эти новые SDK.
- Mac получил ведущее место на мероприятии (что, мы надеемся, свидетельствует о возобновлении внимания). Он будет называться macOS Mojave и будет иметь темный режим .
- В Mac App Store есть большие обновления, но, что примечательно, теперь он получает ту же визуальную и контентную обработку, что и iOS App Store в прошлом году. В песочнице достаточно изменений, поэтому Panic решила вернуть туда Transit .
- Быстрый просмотр в Finder теперь имеет несколько простых действий , которые вы можете выполнять с файлом (например, поворот изображения), и его можно настроить с помощью Automator.
- Mojave станет последней версией macOS с поддержкой 32-битных приложений и фреймворков, что означает отказ от Quick Time Framework. Похоже, что он был заменен некоторыми функциями захвата видео в самой ОС.
- Apple объявила, что они внутри компании используют порт UIKit для создания приложений для Mac , и продемонстрировала порты акций, новостей, дома и голосовых заметок. Новый фреймворк будет выпущен в 2019 году.
Объявления разработчиков iOS, которые меня больше всего волнуют
Разработчики iOS также получили хорошие новости. Они попали в четыре основные области, в которых я хотел увидеть улучшения:
- SiriKit теперь имеет настраиваемые намерения , что значительно расширяет возможности.
- Create ML — это новый способ использования Xcode Playgrounds для обучения моделей посредством трансферного обучения , который позволяет дополнять существующие модели собственными обучающими данными .
- Игровые площадки Xcode теперь позволяют добавлять код внизу страницы и запускать его без перезапуска . Трудно сказать, будет ли Playgrounds более стабильной, пока мы не получим настоящий релиз в сентябре, но это значительно ускорит тестирование кода.
- ARKit 2 был анонсирован вместе с новым форматом файлов дополненной реальности под названием USDZ , который является открытым и был разработан совместно с Adobe и Pixar. Adobe уже объявила о поддержке некоторых инструментов. Это позволит пользователям и разработчикам хранить и делиться активами и опытом AR. Кроме того, ARKit 2 позволяет нескольким устройствам находиться в одной среде дополненной реальности и поддерживает обнаружение 3D-объектов.
Мы не получили устройство AR, но, похоже, мы скоро его получим. И это должно исходить от Apple (а не от третьих лиц), потому что для запуска ARKit требуется устройство iOS.
Настройка вашей машины
Все, что вам нужно, уже доступно на портале для разработчиков. Чтобы использовать код в статье, вам нужна бета-версия Xcode 10. Я бы пока не рекомендовал использовать бета-версии iOS 12, но если вы действительно этого хотите, зайдите на портал на своем устройстве и загрузите профиль конфигурации бета-версии iOS 12.
Единственное, для чего вам нужно устройство с бета-версией, — это ARKit 2. Все остальное должно работать достаточно хорошо в симуляторе Xcode 10. Что касается первой бета-версии, поддержка Siri Shortcut в симуляторе ограничена, но этого достаточно, чтобы думать, что это будет исправлено в будущих выпусках.
Конец дня 2: игра с пользовательскими намерениями Siri
В прошлом году я писал, как вам нужно было соответствовать одному из предопределенных намерений Apple, чтобы использовать SiriKit в своем приложении. Этот механизм был введен в 2016 году и добавлен в 2017 году и даже между мероприятиями WWDC. Но было ясно, что подход Amazon к пользовательским намерениям лучше подходит для голосового управления в более разнообразных приложениях, и Apple добавила это в SiriKit на прошлой неделе.
Чтобы было ясно, это первая реализация, поэтому она пока не такая обширная, как Alexa Skills, но она немного расширяет возможности Siri. Как я уже говорил в предыдущей статье, основное ограничение пользовательских намерений заключается в том, что разработчику необходимо выполнить весь языковой перевод. SiriKit немного обходит это, прося пользователя указать фразу, которую он хотел бы использовать, но для пользовательских намерений все еще требуется больше перевода, чем для предопределенных намерений.
И они построены на том же фундаменте, что и предопределенные намерения, поэтому все, что я рассказал, по-прежнему применимо. На самом деле, я покажу вам, как добавить новое пользовательское намерение в List-o-Mat, приложение, которое я написал для исходной статьи SiriKit.
(Бесплатно) Поддержка Siri Shortcut, если вы уже поддерживаете Spotlight
Если вы используете NSUserActivity
для указания вещей в вашем приложении, которые ваш пользователь может инициировать с помощью передачи или поиска, то сделать их доступными и для Siri будет тривиально.
Все, что вам нужно сделать, это добавить следующую строку в ваш объект активности:
activity.isEligibleForPrediction = true
Это будет работать только для действий с поддержкой Spotlight (где isEligibleForSearch
имеет значение true
).
Теперь, когда пользователи выполняют это действие, оно считается пожертвованным для использования в Siri. Siri порекомендует очень часто выполняемые действия, или пользователи могут найти их в приложении «Быстрые команды». В любом случае пользователь сможет назначить свою собственную произнесенную фразу, чтобы запустить ее. Ваша поддержка запуска действия через Spotlight достаточна для поддержки его запуска с помощью ярлыка.
В List-o-Mat мы могли сделать отдельные списки доступными для Spotlight и Siri, создав объекты активности и назначив их ListViewController
. Пользователи могли открывать их через Siri с помощью собственной фразы.
В нашем случае это избыточно, потому что у нас было предопределенное намерение открыть список, но большинству приложений не так повезло, и теперь у них есть этот простой механизм. Таким образом, если в вашем приложении есть действия, которые не поддерживаются предопределенными намерениями Siri (например, воспроизведение подкаста), вы можете просто сделать их доступными для предсказания и не беспокоиться о пользовательских намерениях.
Настройка SiriKit для использования пользовательских намерений
Если вам нужно использовать настраиваемое намерение, то SiriKit необходимо добавить в ваше приложение, что требует небольшой настройки.
Все шаги по настройке SiriKit для пользовательских намерений такие же, как и для предопределенных намерений, которые подробно описаны в моей статье SiriKit здесь, на Smashing. Обобщить:
- Вы добавляете расширение, поэтому вам нужен новый идентификатор приложения, профиль подготовки и права вашего приложения должны быть добавлены Siri.
- Вероятно, вам нужна группа приложений (это то, как расширение и приложение взаимодействуют).
- Вам понадобится расширение Intents в вашем проекте.
- Существуют определенные ключи Siri .plist и права проекта, которые необходимо обновить.
Все подробности можно найти в моей статье SiriKit, поэтому я просто расскажу о том, что вам нужно для поддержки пользовательского намерения в List-o-Mat.
Добавление команды копирования списка в List-o-Mat
Пользовательские намерения предназначены для использования только там, где нет заранее определенного намерения, и Siri действительно предлагает множество списков и задач в своих списках и заметках Siri Domain.
Но один из способов использования списка — это шаблон для повторяющейся процедуры или процесса. Для этого нам нужно скопировать существующий список и снять все его элементы. Встроенные намерения списка не поддерживают это действие.

Во-первых, нам нужно добавить способ сделать это вручную. Вот демонстрация этого нового поведения в List-o-Mat:

Чтобы Siri вызывала это поведение, мы «пожертвуем намерение», что означает, что мы будем сообщать iOS каждый раз, когда вы делаете это. Затем он в конце концов узнает, что утром вам нравится копировать этот список и предлагать его в качестве ярлыка. Пользователи также могут искать пожертвованные намерения и назначать фразы вручную.
Создание пользовательского намерения
Следующим шагом является создание пользовательского намерения в Xcode. Есть новый шаблон файла, поэтому:
- Выберите «Файл» → «Новый файл» и выберите «Файл определения намерений SiriKit».
Выберите, чтобы добавить файл определения намерения (большой предварительный просмотр) - Назовите файл ListOMatCustomIntents.intentdefinition и выберите, чтобы поместить файл как в цели приложения, так и в цель расширения намерения. Это автоматически создаст классы для обеих целей, которые реализуют протоколы намерений, но реализуют ваше пользовательское поведение.
- Откройте файл определения .
- Используйте кнопку + в левом нижнем углу, чтобы добавить намерение и назовите его «CopyList».
- Установите категорию на «Создать» и заполните заголовок и подзаголовок, чтобы описать намерение:
Добавьте категорию, заголовок и подзаголовок к намерению (большой предварительный просмотр) - Добавьте строковый параметр с именем «список».
Добавьте строковый параметр с именем «список» (большой предварительный просмотр) - Добавьте тип ярлыка с параметром списка и дайте ему название «Копировать список».
Добавьте тип ярлыка под названием «Копировать список» (большой предварительный просмотр)
Если вы посмотрите в список намерений, вы увидите, что это намерение уже настроено для вас:

Пожертвование намерения
Когда мы совершаем взаимодействие с пользователем в нашем приложении, о котором мы хотим, чтобы Siri знала, мы жертвуем это Siri. Siri отслеживает контекстную информацию, такую как время, день недели и даже местоположение, и, если замечает закономерность, предлагает пользователю ярлык.
Когда мы коснемся меню «Копировать», добавьте этот код:
@available(iOS 12, *) func donateCopyListInteraction(listName: String) { let copyListInteraction = CopyListIntent() copyListInteraction.list = listName copyListInteraction.suggestedInvocationPhrase = "Copy \(listName)" let interaction = INInteraction(intent: copyListInteraction, response: nil) interaction.donate { [weak self] (error) in self?.show(error: error) } }
Это просто создает объект автоматически сгенерированного класса CopyListIntent
и передает его Siri. Обычно iOS собирает эту информацию и ждет подходящего времени, чтобы показать ее, но для разработки вы можете открыть приложение «Настройки», перейти в раздел «Разработчик» и включить параметры отладки Siri Shortcut.
Примечание . На момент написания этой статьи в первых бета-версиях этот параметр отладки работает только на устройствах, а не в симуляторе. Поскольку настройка есть, я ожидаю, что она начнет работать в следующих бета-версиях.

Когда вы это сделаете, ваш пожертвованный ярлык появится в предложениях Siri в центре внимания.

Нажатие на это вызовет ваше расширение Intent, потому что мы разрешаем фоновое выполнение. Мы добавим поддержку для этого позже.
Обработка пользовательского намерения
У нас уже есть расширение Intents, и, поскольку файл пользовательских определений намерений уже добавлен в файл, он также содержит сгенерированные классы намерений. Все, что нам нужно сделать, это добавить обработчик.
Первый шаг — добавить в расширение новый класс с именем CopyListIntentHandler
. Вот его код:
import Intents @available(iOS 12, *) class CopyListIntentHandler: ListOMatIntentsHandler, CopyListIntentHandling { func handle(intent: CopyListIntent, completion: @escaping (CopyListIntentResponse) -> Void) { // Find the list var lists = loadLists() guard let listName = intent.list?.lowercased(), let listIndex = lists.index(where: { $0.name.lowercased() == listName}) else { completion(CopyListIntentResponse(code: .failure, userActivity: nil)) return } // Copy the list to the top, and respond with success copyList(from: &lists, atIndex: listIndex, toIndex: 0) save(lists: lists) let response = CopyListIntentResponse(code: .success, userActivity: nil) completion(response) } }
Пользовательские намерения имеют только фазы подтверждения и обработки (настраиваемое разрешение параметров не поддерживается). Так как по умолчанию confirm()
возвращает успех, мы просто реализуем handle()
, который должен искать список, копировать его и сообщать Siri, был ли он успешным или нет.
Вам также необходимо отправить этот класс из зарегистрированного обработчика намерений, добавив этот код:
if #available(iOS 12, *) { if intent is CopyListIntent { return CopyListIntentHandler() } }
Теперь вы можете нажать на это предложение Siri, и появится следующее:

И нажатие кнопки «Создать» скопирует список. На кнопке написано «Создать» из-за категории, которую мы выбрали в файле определения намерения.
Фу, это было много. Эти новые ярлыки Siri являются основной функцией iOS 12, в которой есть новая большая область взаимодействия с разработчиками. Кроме того, поскольку у меня был хороший (и задокументированный) пример Siri для работы, было разумно попытаться добавить к нему новые функции на этой неделе.
Вы можете увидеть обновление List-o-Mat на GitHub. Пока не будут выпущены Xcode 10 и iOS 12, он находится в отдельной ветке.
Следующие несколько дней я в основном буду смотреть на образцы кода Apple или делать гораздо более мелкие проекты.
Конец дня 3: игровые площадки Xcode
Весь предыдущий день был проведен в бета-версии Xcode 10, которая ни разу не дала сбоев и казалась готовой к разработке. Итак, теперь я хотел изучить новые функции Playgrounds.
Главное, чего я хотел от игровых площадок — сделать их стабильнее и намного быстрее. Чтобы сделать их быстрее, Apple добавила большую функцию — режим REPL.
До Xcode 10, когда вы находились на игровой площадке с автоматическим запуском (по умолчанию), каждая строка кода фактически перестраивала весь файл и запускала его с самого начала. Если вы построили какое-либо государство, оно было потеряно. Но реальная проблема заключалась в том, что это было слишком медленно для итеративной разработки. Когда я использую Playgrounds, я настраиваю их на запуск вручную, но даже это медленно.
В Xcode 10 ручной запуск является более нормальным, но после его запуска вы можете добавить дополнительные строки внизу страницы и продолжить выполнение. Это означает, что вы можете многократно исследовать данные и рисовать представления без постоянной перестройки и запуска с нуля.
Для начала я создал игровую площадку iOS («Файл» → «Создать» → «Игровая площадка») с шаблоном «Единое представление».
Включите ручной запуск, опустив меню под кнопкой «Воспроизвести» (треугольник в левом нижнем углу). Это помещает вертикальную полосу слева, которая показывает текущую позицию головки воспроизведения (вроде точек останова).
Вы можете коснуться любой линии, а затем нажать кнопку воспроизведения слева от нее. Это запустит игровую площадку до этой точки. Затем вы можете пойти дальше, нажимая строки ниже на игровой площадке. Критически важно, что вы можете добавить больше строк внизу и нажимать Shift + Enter после каждой, чтобы переместить головку воспроизведения в эту точку.
Вот GIF, на котором я меняю метку представления без перезапуска игровой площадки. После ввода каждой строки я нажимаю Shift + Enter .

Игровые площадки теперь также поддерживают пользовательский рендеринг ваших типов, и Apple прилагает большие усилия для того, чтобы каждая среда Swift включала игровую площадку для ее документирования.

Конец дня 4: создание машинного обучения
В прошлом году Apple сделала большой шаг вперед в программировании машинного обучения для своих устройств. Появился новый формат файла модели ML и его прямая поддержка в Xcode.
Потенциал заключался в том, что будет большая библиотека этих файлов моделей, что будут инструменты для их создания, и что многие другие разработчики приложений смогут включать машинное обучение в свои проекты, не зная, как создавать модели.
Это не полностью материализовалось. Apple не добавляла в репозиторий моделей после WWDC, и хотя есть сторонние репозитории, в них в основном есть модели, являющиеся вариациями демонстраций классификации изображений. ML используется не только для классификации изображений, но широкого набора примеров не появилось.
Итак, стало ясно, что любому реальному приложению потребуются его разработчики для обучения новых моделей. Apple выпустила Turi Create для этой цели, но это далеко не просто.
На WWDC 2018 Apple сделала несколько вещей для Core ML:
- Они расширили часть Core ML, связанную с обработкой естественного языка (NLP), что дает нам новую большую область примеров.
- Они добавили в Core ML концепцию Transfer Learning , позволяющую добавлять обучающие данные в существующую модель . Это означает, что вы можете брать модели из библиотеки и настраивать их в соответствии со своими данными (например, заставлять их распознавать новые объекты на предоставленных вами изображениях).
- Они выпустили Create ML, который реализован внутри Xcode Playgrounds и позволяет перетаскивать данные для обучения и создавать расширения модели (используя Transfer Learning).
Это еще один хороший шаг в демократизации машинного обучения. Здесь не так много кода для написания. Чтобы расширить классификатор изображений, вам просто нужно собрать и пометить изображения. Получив их, вы просто перетаскиваете их в Create ML. Вы можете увидеть демонстрацию в этом видео Create ML WWDC.
Конец недели: поиграйте с новыми демонстрациями дополненной реальности
ARKit был еще одним большим дополнением в прошлом году, и кажется еще более очевидным, что появится устройство AR.
Мой код ARKit из прошлогодней статьи по-прежнему является хорошим способом начать работу. Большинство новых функций направлены на то, чтобы сделать дополненную реальность более точной и быстрой.
После этого, если вы установили бета-версию, вам обязательно захочется загрузить новое демо-приложение SwiftShot ARKit. Это приложение использует преимущества новых функций ARKit, особенно возможности многопользовательской игры. Два или более устройств в одной сети и в одном месте могут общаться друг с другом и видеть один и тот же опыт дополненной реальности.
Конечно, чтобы играть в нее, вам нужно два или более устройств, на которые вы готовы установить бета-версию iOS 12. Я жду общедоступной бета-версии, потому что у меня есть только одно бета-безопасное устройство.
Более простое в использовании приложение дополненной реальности — это новое приложение «Измерение», которое позволяет измерять длину реальных объектов, которые вы видите в режиме просмотра камеры дополненной реальности. Были сторонние приложения, которые делают это, но Apple отшлифовала и предустановила iOS 12.
Ссылки на видео WWDC и пример кода
Итак, я с нетерпением жду возможности сделать больше с Xcode 10 и iOS 12 этим летом, пока мы ждем новых телефонов и любых устройств, которые Apple может выпустить в конце лета. А пока разработчики iOS могут наслаждаться солнцем, отслеживать наши походы с нашей новой бета-версией Watch OS и смотреть эти видео WWDC, когда у нас есть такая возможность.
Вы можете транслировать видео WWDC 2018 с портала разработчиков Apple. Существует также это неофициальное приложение для Mac для просмотра видео WWDC.
Вот видео, упомянутые в этой статье:
- Основной доклад WWDC 2018
- Платформы WWDC 2018 Состояние Союза
- Введение в быстрые команды Siri
- Получение максимальной отдачи от игровых площадок в Xcode
- Знакомство с Create ML, а если вы хотите что-то более продвинутое, руководство по Turi Create
Чтобы начать играть с Xcode 10 и iOS 12:
- Загрузите бета-версии (зайдите на устройство, чтобы получить бета-профиль)
- List-o-Mat с обновлениями Siri Shortcut
- Swift Shot (многопользовательская игра ARKit 2)