Большая часть сложностей с запуском WeatherKit заключается в обеспечении необходимого сопутствующего функционала.
Создайте новый App ID на сайте Apple для разработчиков.
Вам нужно будет включить WeatherKit на ОБЕИХ вкладках, называемых Capabilities и App Services. Ваш идентификатор пакета должен быть явным, и вам нужно будет подождать не менее 30 минут после создания идентификатора приложения, прежде чем пытаться использовать WeatherKit.
Теперь создайте новый проект приложения в Xcode 14, обязательно добавив возможность WeatherKit на вкладке Signing and Capabilities вашего проекта, как показано ниже.
Надеюсь, вы создали свой идентификатор приложения с нужными возможностями и службами и подождали полчаса, затем создали проект приложения с тем же идентификатором пакета, что и ваш App ID, и, наконец, добавили эту возможность в свой проект.
Теперь мы можем перейти к самой интересной части — созданию интерфейса на SwiftUI, отображающего данные о погоде.
Для простоты я делаю приложение, которое отображает только температуру в Купертино в данное время:
Широта и долгота Куптертино были рассчитаны с помощью latlong.net и сохранены как статический объект CLLocation. Для того, чтобы температура на экране была большой, был выбран огромный размер шрифта с минимальным коэффициентом масштабирования. Так мы получаем доступ к функции автоматического сжатия auto-shrink, известной по UIKit. Ограничение строки используется для того, чтобы единицы измерения не переносились на вторую строку, что произойдет, если строка станет слишком длинной.
Когда объект weather равен nil, появляется счетчик в форме ProgressView, а модификатор .task используется для получения данных о погоде при первом появлении счетчика. И этот ProgressView, и Text, отображающий температуру, находятся внутри Group, поэтому они оба могут иметь один и тот же заголовок навигации. Это отображается в верхней части экрана, сообщая нам местоположение для отображаемой температуры.
У WeatherService есть shared синглтон, и именно так мы получаем доступ к WeatherKit API. Нет необходимости добавлять какую-либо аутентификацию, так как это делается с помощью идентификатора приложения. Передача WeatherService местоположения дает нам объект с кучей полезных данных, но нас сейчас интересует только текущая погода.
Текущая погода имеет такую структуру JSON:
Если вы не подождали полчаса после создания App ID, вы можете получить fatalError, в котором говорится, что вы получили недопустимый ответ JWT с кодом ошибки 401. Если вы все еще получаете эту ошибку через полчаса ожидания, возможно, ваш идентификатор приложения был настроен неправильно (или серверы Apple просто медленные).
Я также столкнулся с ошибками, в которых говорилось об отсутствии частей в объекте погоды.
Вы сможете предотвратить сбой приложения, изменив fatalError просто на печать ошибок, поскольку они не обязательно являются фатальными ошибками.
Вот и все на данный момент!