
-
Novidades do watchOS 26
Descubra os novos recursos do watchOS 26 e saiba como integrá-los aos seus apps para watchOS e iOS. Explore a arquitetura ARM64 e conheça o novo sistema de design. Também compartilharemos atualizações de widgets e informações sobre como implementar controles no Apple Watch.
Capítulos
- 0:00 - Introdução
- 0:56 - Atualizações do watchOS 26
- 3:48 - Levar apps a novos lugares
- 9:44 - Ser relevante e atual
Recursos
- Creating controls to perform actions across the system
- Increasing the visibility of widgets in Smart Stacks
- Making a configurable widget
- MapKit
- Migrating ClockKit complications to WidgetKit
- Workouts and activity rings
Vídeos relacionados
WWDC25
WWDC24
WWDC23
WWDC22
-
Buscar neste vídeo...
Olá! Eu sou a Anne, e é um prazer estar com você hoje para compartilhar alguns dos novos e excelentes recursos do watchOS 26 e dicas sobre como usá-los nos seus apps. Vou apresentar as atualizações do watchOS 26, mostrar como você pode aprimorar seus apps para watchOS e iOS no Apple Watch e compartilhar novos jeitos de mostrar conteúdo oportuno e relevante por meio do seu app. Durante esta sessão, vou desenvolver um app para exibir atividades recreativas e de bem-estar nas praias por perto, mostrar as condições do mar nas praias e monitorar os minutos de relaxamento na praia, ou onde quer que eu esteja, mesmo que eu prefira estar na praia. Vamos começar. O watchOS 26 inclui melhorias de ponta a ponta, com um novo visual e uma nova arquitetura do sistema. E há alguns aspectos que você precisa saber para que os seus apps possam tirar máximo proveito do watchOS. Todo o watchOS foi atualizado com o novo sistema de design, incluindo alterações nos materiais e controles, atualizações nos ícones dos apps e alterações nos Spaces do sistema, como o mostrador do relógio e a Central de Controle. Os estilos da barra de ferramentas e dos controles foram atualizados no watchOS 26. Todos os apps desenvolvidos para watchOS 10 e posterior usarão automaticamente os novos estilos, para que seu app mantenha a consistência com o restante do sistema. Abra seu app para verificar a aparência da interface. Se tiver estilos personalizados, revise-os para garantir que os elementos da interface do usuário sejam legíveis no novo estilo do sistema. Para obter mais informações sobre design e atualização dos apps, assista a “Conhecer o Liquid Glass”.
Os ícones dos apps também ganharam uma nova aparência no iOS e watchOS 26.
Use o Icon Composer para atualizar o ícone do seu app. O ícone atualizado do seu app para iOS aparecerá nas notificações encaminhadas do iPhone para o Apple Watch. E o ícone atualizado do seu app para Apple Watch aparecerá na grade e na lista de apps, bem como nas notificações enviadas diretamente ao relógio. Para saber mais sobre o Icon Composer e todas as novidades para ícones de apps, confira “Criar ícones com o Icon Composer”. Além do novo sistema de design, o watchOS é compatível com uma nova arquitetura do sistema. O Apple Watch Series 9 e posterior e o Apple Watch Ultra 2 agora usam arquitetura arm64 no watchOS 26. No Xcode, use o ajuste de compilação da arquitetura padrão para o Apple Watch. Isso configura a criação dos seus alvos para todas as arquiteturas do Apple Watch. Conheça as diferenças dos tipos em arm64, principalmente ao usar Float e Int, e ao fazer cálculos baseados em ponteiros. E não se esqueça de testar tanto no simulador quanto nos dispositivos. O Xcode é compatível com a criação de apps para Apple Watch para a arquitetura arm64 desde o Xcode 14. O Simulador do Apple Watch sempre usa a arquitetura arm64 no Apple Silicon. E temos boas notícias. Se você já está usando arquiteturas padrão, já está desenvolvendo para arm64. E se você já usa o simulador para testar, já está testando com arm64. O novo sistema de design e a arquitetura totalmente nova são apenas o começo desse tour do watchOS 26. Vamos dar uma olhada em algumas novas coisas que você pode fazer com o seu app. Os controles estão disponíveis no Apple Watch desde o watchOS 26. Os usuários podem colocar os seus controles na Central de Controle e no Conjunto Inteligente, e usá-los com o botão de Ação no Apple Watch Ultra. Os controles são criados com o WidgetKit e permitem a execução de ações rápidas sem abrir o app ou a inicialização do app em uma visualização específica. Os controles fornecem um símbolo, um título, uma cor e contexto adicional ao sistema. O controle pode ser adicionado a qualquer um dos Spaces do sistema compatíveis e é exibido de forma contextual.
É possível adicionar os controles do seu app para iPhone aos Spaces do sistema no Apple Watch, mesmo que você não tenha um app para Apple Watch. Ao tocar no controle no Apple Watch, a ação é executada no iPhone associado. Como a ação é realizada no iPhone, os controles cujas ações estão em primeiro plano no app para iPhone não aparecerão no Apple Watch. Se você tem um app para Apple Watch, também pode criar controles para o relógio com a mesma API usada na criação de controles para iOS. Ao tocar no controle, a ação é executada no Apple Watch.
O Conjunto Inteligente é compatível com Controles, Widgets e Atividades ao Vivo. Com tantas formas de mostrar conteúdo no Conjunto Inteligente, pode ser difícil decidir qual delas escolher. É importante considerar o propósito principal. Crie um controle quando a principal finalidade for executar uma ação, como alterar um ajuste seu no app ou ligar um dispositivo conectado à internet. Crie um widget para exibir as informações durante o dia, como informações meteorológicas ou próximos eventos. Crie uma atividade ao vivo para eventos com início e fim claros, como o andamento de um evento esportivo ou um voo de uma companhia aérea. Para começar a usar os controles e conferir mais detalhes, junte-se a Cliff na sessão “Estender os controles do app em todo o sistema”. Algumas pessoas podem querer personalizar os widgets e controles de seus apps. No iOS, é possível editar um widget selecionando as configurações que você fornece ao sistema. A partir do watchOS 26, você poderá personalizar seus widgets e controles da mesma forma. Os widgets podem indicar que são configuráveis em vez de dar recomendações predefinidas. Aqui, vou alterar a configuração do meu widget para ver o calendário da Ilha Amélia. Para tornar um widget configurável, retorne uma matriz vazia para recomendações a fim de indicar que não há nenhum widget predefinido e que seja possível configurar o widget no mostrador ou no Conjunto Inteligente. Se você já tem um widget que deseja tornar configurável, adicione uma verificação de disponibilidade para o watchOS 26. Retorne uma matriz vazia para indicar que o widget é configurável nas versões compatíveis. Para versões anteriores, continue retornando uma matriz de recomendações de App Intents. Também é possível configurar controles. Por exemplo, no meu app de praia, quero disponibilizar uma configuração adicional para controlar o timer de meditação. Sei que nem todo mundo consegue ir à praia, então quero que o app ofereça a opção de reproduzir sons do oceano durante a meditação. Para tornar um controle configurável, use um AppIntentControlConfiguration para descrever o controle, assim como faz no iOS, e adapte o provedor de valores ao AppIntentControlValueProvider. E não são só os controles que chegam ao Conjunto Inteligente no watchOS 26. Se o seu app para Apple Watch usar o HealthKit para registrar exercícios, ele poderá ser sugerido no Conjunto Inteligente com base na rotina do usuário. Basta tocar nele para começar a se exercitar rapidamente.
Para garantir que seu app de exercícios seja sugerido de forma adequada, especifique o HKWorkoutActivityType correto, registre o horário exato de início e término dos exercícios e use HKWorkoutRouteBuilder para adicionar dados de localização durante os exercícios. Por falar em disponibilizar seu app em novos lugares, há várias novidades disponíveis para o MapKit no watchOS 26. Você pode pesquisar um ponto de interesse por perto, como um supermercado, obter rotas para locais usando um tipo de transporte, como carro, a pé ou bicicleta, e mostrar as rotas como uma sobreposição em um mapa com o SwiftUI, tudo isso usando a mesma API que você já conhece no iOS. Isso é ótimo para apps para Apple Watch independentes que servem para encontrar lugares por perto e mostrar itinerários. Aqui, estou mostrando a rota para uma de minhas praias favoritas. Para saber mais sobre rotas e pesquisa local, junte-se a Jeff na sessão “Conhecer o MapKit para o SwiftUI”. Entre os controles personalizados e a Central de Controle, as sugestões do app Exercício no mostrador e os novos recursos do MapKit, o watchOS 26 apresenta diversas maneiras de oferecer suas experiências em novos lugares no sistema.
Esse tour do watchOS 26 tem mais uma parada: um novo jeito de criar experiências contextuais e relevantes no Conjunto Inteligente. Você pode mostrar aos usuários as informações e ações desejadas quando mais importa e manter essas informações atualizadas. O watchOS 26 apresenta um novo framework: RelevanceKit. O RelevanceKit ajuda a mostrar o conteúdo exatamente quando alguém quer.
O RelevanceKit oferece muitos tipos de contexto relevantes que permitem que você sugira widgets no Conjunto Inteligente com base em dicas contextuais. Esses contextos relevantes incluem data, horários de sono, informações de preparo físico e localização. No watchOS 26, seu widget também pode ser relevante em categorias de ponto de interesse para indicar que o widget é relevante em qualquer local para um tipo de lugar, como um mercado, uma cafeteria ou até mesmo uma praia. No meu app de praia, quero exibir as condições atuais do mar no Conjunto Inteligente quando alguém estiver na praia. Crie um RelevantContext de localização para uma categoria de ponto de interesse do MapKit. Ele será nulo se a categoria não for compatível. Aprenda a usar WidgetRelevance com atributos para todos os contextos relevantes ao widget. Além do RelevanceKit, o watchOS 26 apresenta uma nova configuração de widget exclusiva para o Conjunto Inteligente. O novo widget relevante é viabilizado pelo RelevanceKit e permite que você escolha as visualizações que devem aparecer no widget. As visualizações são sugeridas com base em um RelevantContext específico, como um ponto de interesse ou horário do dia. Os widgets relevantes aparecem exclusivamente no Conjunto Inteligente, e várias visualizações podem ser sugeridas simultaneamente. No watchOS 26, os widgets relevantes estão sendo usados para fazer algumas coisas muito legais, como mostrar vários eventos futuros do Calendário, exibir um widget para abrir uma nota editada recentemente e mostrar a previsão do tempo do próximo destino de férias do usuário. O widget My Beach Events (Meus eventos na praia) mostra as atividades programadas durante o dia em um local, e posso aprimorá-lo tornando-o um widget relevante. Aqui temos um exemplo de calendário para o widget My Beach Events (Meus eventos na praia), em que alguns dos eventos acontecem ao mesmo tempo. Para criar o widget My Existing Timeline (Minha linha do tempo atual), preciso criar uma única linha do tempo de entradas, mas tenho vários eventos sobrepostos. Minha linha do tempo inclui entradas com vários eventos para representar as sobreposições. Ao comparar meu calendário de eventos com a linha do tempo às 9h30, vejo que está ótimo. Posso mostrar o evento de arrecadação de fundos e a meditação na mesma visualização em duas linhas. Porém, às 10h temos três eventos. Ao tentar colocar os três eventos no widget, a visualização fica truncada. Preciso escolher os dois eventos que quero mostrar. Um widget relevante resolve essa questão. Quando há vários eventos relevantes, como por volta das 10h, o sistema pode sugerir vários cartões no Conjunto Inteligente, um para cada evento. Vou explicar como criar um widget relevante para os eventos na praia. Para começar, vamos rever rapidamente a anatomia de um widget. O componente fundamental de um widget é uma entrada. A entrada contém todos os dados de que você precisa para renderizar a visualização do widget. As entradas são criadas pelo provedor de entradas, que também informa ao WidgetKit quando atualizar a visualização. A configuração cria o provedor de entradas e usa a entrada e outras informações para produzir uma visualização do SwiftUI. Ao criar um widget baseado em linha do tempo, esses tipos são chamados de TimelineEntry, AppIntentTimelineProvider e AppIntentConfiguration. A criação de um widget relevante é semelhante a um widget de linha do tempo. O componente fundamental de um widget relevante é um RelevanceEntry.
Esses componentes são criados pelo RelevanceEntriesProvider e fornecidos
ao RelevanceConfiguration. Vamos conferir as etapas para criar um widget relevante, começando pelo RelevanceEntry. Para o meu app de praia, vamos criar um RelevanceEntry que contém o evento de praia com todos os dados necessários para preencher a visualização do widget: o local, o título e a data do evento.
Em seguida, vamos implementar o RelevanceEntriesProvider. O método de relevância informa ao sistema quando o widget é relevante. Nele, vamos criar uma matriz de WidgetRelevanceAttributes para associar os WidgetConfigurationIntents dos eventos na praia ao RelevantContext com as dicas sobre quando as informações são importantes. Essa é a data do evento que acontece na praia. Depois, vamos retornar a relevância com esses atributos. Quando o widget é relevante, o sistema chama a entrada e fornece ao app o WidgetConfigurationIntent relevante e algumas informações de contexto que incluem o tamanho de exibição do widget e se o widget está sendo mostrado como uma prévia. A prévia é mostrada nas configurações de sugestões de widget disponíveis no app Ajustes ou durante a edição do Conjunto Inteligente. Retorne uma entrada de prévia com dados para preencher a visualização de ajustes. Acho que Surfar em Playalinda é um ótimo exemplo para a prévia do meu widget. Caso contrário, use as informações da configuração, como meu evento de praia, para criar uma entrada que preencherá a visualização do widget. Enquanto o widget está sendo carregado, mas ainda não preencheu os dados, o sistema solicita uma entrada de espaço reservado do provedor. Por exemplo, se o widget precisar baixar novos dados para preenchê-lo, talvez o método de entrada não consiga retornar imediatamente. Retorne uma entrada de espaço reservado para indicar que as informações estão desatualizadas ou sendo carregadas. No meu widget, retornarei uma entrada que mostrará um indicador de carregamento na visualização. Por fim, vamos criar o widget. No corpo do widget, retorne um RelevanceConfiguration usando o provedor e um encerramento para criar a visualização do widget usando o RelevanceEntry atual. Agora, o Conjunto Inteligente pode sugerir vários cartões para eventos na praia sempre que houver vários eventos futuros. Meu app ainda tem um widget com uma linha do tempo para mostrar os eventos na praia, e os usuários podem adicioná-lo ao Conjunto Inteligente. Se alguém tiver adicionado o widget de linha do tempo ao Conjunto Inteligente, o sistema mostrará dois cartões para o mesmo evento: um do widget da linha do tempo que o usuário adicionou e outro que foi sugerido pelo widget relevante. Para evitar essa duplicação, associe o RelevanceConfiguration ao WidgetConfiguration do widget da linha do tempo. Esse sistema substituirá o widget da linha do tempo pelos cartões de widget relevantes quando eles forem sugeridos. Isso garante que apenas um cartão seja exibido para cada evento. Para associar os widgets, adicione o modificador associatedKind ao RelevanceConfiguration e envie a ele o tipo de widget da linha do tempo. É assim que criamos um widget relevante. Tenho mais uma dica para garantir que seus widgets fiquem ótimos: use as prévias. Elas permitem que você visualize como os widgets relevantes aparecerão no Conjunto Inteligente sem simular as condições relevantes. Vou apresentar rapidamente três jeitos de visualizar os widgets para diferentes casos de uso. Ao desenvolver a visualização do widget, use uma prévia com relevanceEntries para verificar e ajustar rapidamente a aparência dessa visualização em uma variedade de tamanhos para diferentes telas. Aqui estou testando dois eventos para ver o layout da visualização com diferentes quantidades de texto. Ao desenvolver seu método de entrada, use uma prévia com relevância para conferir rapidamente a criação de entradas com WidgetConfigurationIntents específicos. Aqui, estou criando a relevância com alguns exemplos de configuração e verificando se as entradas e as visualizações são criadas corretamente.
Para realizar a verificação final de um widget relevante, use uma prévia com o RelevanceProvider. Vou disponibilizar um armazenamento de eventos de prévia com cinco eventos a serem exibidos nas prévias, para que possamos garantir que os diferentes eventos sejam exibidos corretamente em todos os tamanhos de tela. É ótimo poder mostrar aos usuários informações importantes para eles no momento certo. Essas informações também precisam estar atualizadas. Tenho novidades incríveis sobre outra ferramenta para manter os dados do widget atualizados. A partir do watchOS 26, será possível enviar atualizações por push aos widgets usando APNs. As atualizações por push dos widgets são compatíveis com todos os widgets em todas as plataformas da Apple compatíveis com o WidgetKit. Para saber como incluir compatibilidade com as atualizações por push nos widgets, não deixe de conferir “Novidades dos widgets” com Tanner. Se você ainda não migrou suas complicações do ClockKit para os widgets porque precisava das atualizações por push das complicações, agora é a hora. Junte-se a August e confira algumas dicas para tornar a transição mais suave na sessão “Ir além com as complicações no WidgetKit”. Espero que você aproveite todos os novos recursos do watchOS. Desenvolva e execute seu app no watchOS 26 para garantir uma ótima aparência com o restante do sistema e a execução sem falhas na arquitetura arm64. Confira os controles do iOS no Apple Watch e adicione controles ao seu app para Apple Watch, especialmente se ele for independente. Crie widgets relevantes nos lugares certos no seu app. E use as notificações por push para manter os widgets atualizados. Eu adoro usar seus apps no meu Apple Watch no dia a dia, seja para caminhar, viajar ou ir à praia. Vamos continuar explorando e conhecendo novos lugares com seus apps.
-
-
6:53 - Make a widget configurable
// In the AppIntentTimelineProvider func recommendations() -> [AppIntentRecommendation<BeachConfigurationIntent>] { return [] }
-
7:06 - Support earlier versions of watchOS with a configurable widget
// In the AppIntentTimelineProvider func recommendations() -> [AppIntentRecommendation<BeachConfigurationIntent>] { if #available(watchOS 26, *) { // Return an empty array to allow configuration of the widget in watchOS 12+ return [] } else { // Return array of recommendations for preconfigured widgets before watchOS 12 return recommendedBeaches } }
-
7:46 - Use AppIntentControlConfiguration to make a control configurable
struct ConfigurableMeditationControl: ControlWidget { var body: some ControlWidgetConfiguration { AppIntentControlConfiguration( kind: WidgetKinds.configurableMeditationControl, provider: Provider() ) { value in // Provide the control's content } .displayName("Ocean Meditation") .description("Meditation with optional ocean sounds.") .promptsForUserConfiguration() } }
-
7:56 - Use AppIntentControlValueProvider for a configurable control
extension ConfigurableMeditationControl { struct Provider: AppIntentControlValueProvider { func previewValue(configuration: TimerConfiguration) -> Value { // Return the value to show in the add sheet } func currentValue(configuration: TimerConfiguration) async throws -> Value { // Return the control's value } } }
-
10:53 - Relevance for a point-of-interest category
func relevance() async -> WidgetRelevance<Void> { guard let context = RelevantContext.location(category: .beach) else { return WidgetRelevance<Void>([]) } return WidgetRelevance([WidgetRelevanceAttribute(context: context)]) }
-
14:37 - Implement the relevance method in the RelevanceEntriesProvider
struct BeachEventRelevanceProvider: RelevanceEntriesProvider { let store: BeachEventStore func relevance() async -> WidgetRelevance<BeachEventConfigurationIntent> { // Associate configuration intents with RelevantContexts let attributes = events.map { event in WidgetRelevanceAttribute( configuration: BeachEventConfigurationIntent(event: event), context: .date(interval: event.date, kind: .default) ) } return WidgetRelevance(attributes) } }
-
15:09 - Create a RelevanceEntry when the widget is relevant
struct BeachEventRelevanceProvider: RelevanceEntriesProvider { func relevance() async -> WidgetRelevance<BeachEventConfigurationIntent> { // Return relevance information for the widget } func entry( configuration: BeachEventConfigurationIntent, context: Context ) async throws -> BeachEventRelevanceEntry { if context.isPreview { return .previewEntry } return BeachEventRelevanceEntry( event: configuration.event ) } }
-
15:55 - Create a placeholder entry to display when the widget is loading
struct BeachEventRelevanceProvider: RelevanceEntriesProvider { func relevance() async -> WidgetRelevance<BeachEventConfigurationIntent> { // Return relevance information for the widget } func entry( configuration: BeachEventConfigurationIntent, context: Context ) async throws -> BeachEventRelevanceEntry { // Return the entry for the configuration } func placeholder(context: Context) -> BeachEventRelevanceEntry { BeachEventRelevanceEntry.placeholderEntry } }
-
16:27 - Use a RelevanceConfiguration to create a relevant widget
struct BeachEventWidget: Widget { private let model = BeachEventStore.shared var body: some WidgetConfiguration { RelevanceConfiguration kind: "BeachWidget provider: BeachEventRelevanceProvider(store: model) ) { entry in BeachWidgetView(entry: entry) } .configurationDisplayName("Beach Events") .description("Events at the beach") } }
-
17:31 - Use associatedKind to relate the relevant widget to the timeline widget
struct BeachEventWidget: Widget { private let model = BeachEventStore.shared var body: some WidgetConfiguration { RelevanceConfiguration kind: "BeachWidget provider: BeachEventRelevanceProvider(store: model) ) { entry in BeachWidgetView(entry: entry) } .configurationDisplayName("Beach Events") .description("Events at the beach") .associatedKind(WidgetKinds.beachEventsTimeline) } }
-
18:06 - Create a Preview with relevanceEntries
#Preview("Entries") { BeachEventWidget() } relevanceEntries: { BeachEventRelevanceEntry.previewShorebirds BeachEventRelevanceEntry.previewMeditation }
-
18:26 - Create a Preview with relevance
#Preview("Provider and Relevance") { BeachEventWidget() } relevanceProvider: { BeachEventRelevanceProvider(store: .preview) } relevance: { let configurations: [BeachEventConfigurationIntent] = [ .previewSurfing, .previewMeditation, .previewWalk ] let attributes = configurations.map { WidgetRelevanceAttribute( configuration: $0, context: .date($0.event.startDate, kind: .default) ) } return WidgetRelevance(attributes) }
-
18:47 - Create a Preview with a relevanceProvider
#Preview("Provider") { BeachEventWidget() } relevanceProvider: { BeachEventRelevanceProvider(store: .preview) }
-
-
- 0:00 - Introdução
O watchOS 26 apresenta novos recursos e considerações de plataforma.
- 0:56 - Atualizações do watchOS 26
Explore o novo sistema de design do watchOS com atualizações nos controles, ícones de app e espaços do sistema. Veja as dicas para oferecer suporte à arquitetura arm64 no watchOS 26.
- 3:48 - Levar apps a novos lugares
Expanda a presença do seu app em todo o watchOS. Os controles ajudam as pessoas a realizar ações rápidas e podem ser adicionados à Central de Controle, ao Conjunto Inteligente e ao botão de Ação no Apple Watch Ultra. Os controles estão disponíveis automaticamente nos apps para iOS ou podem ser criados diretamente no watchOS. Os apps que registram exercícios com o HealthKit podem ser sugeridos automaticamente no Conjunto Inteligente com base na rotina das pessoas. As APIs do MapKit no iOS também estão disponíveis no watchOS 26, como encontrar itinerários entre dois locais ou exibir rotas como sobreposições.
- 9:44 - Ser relevante e atual
O RelevanceKit impulsiona uma nova forma de exibir widgets no Conjunto Inteligente quando eles são mais relevantes, com base em critérios como data, rotina de sono ou localização. A criação de um widget relevante tem etapas semelhantes às da criação de um widget baseado em linha do tempo. Veja as dicas para criar e testar seu widget relevante usando Pré-visualizações.