0Pricing
Swift Academy · Lekcja

Przegląd rozszerzeń aplikacji

Poznaj rozszerzenia udostępniania, akcji i inne rozszerzenia.

Przegląd rozszerzeń aplikacji to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.

Czym są rozszerzenia aplikacji

Rozszerzenie aplikacji pozwala aplikacji udostępniać funkcje wewnątrz innych aplikacji lub elementów systemu — na przykład udostępnianie treści, niestandardowe klawiatury czy indeksowanie Spotlight. Każde rozszerzenie jest osobnym targetem z własnym cyklem życia, piaskownicą i punktem wejścia określonym przez system.

// Extensions run in their own process, launched
// by the host (Photos, Safari, Messages, the system),
// not by your main app.

Aplikacja hostująca, kontener i piaskownica

Występują tu trzy elementy: aplikacja hostująca wywołuje rozszerzenie, aplikacja kontenera dostarcza je wraz z aplikacją, a samo rozszerzenie działa w piaskownicy. Rozszerzenie nie może swobodnie komunikować się z aplikacją — komunikują się za pośrednictwem App Group, nigdy przez bezpośredni dostęp do pamięci.

import Foundation
// Container app + Extension target share data via
// an App Group, e.g. group.com.example.app
let group = "group.com.example.app"
_ = group

Rozszerzenia udostępniania

Rozszerzenie udostępniania pojawia się w systemowym arkuszu udostępniania i pozwala użytkownikom przesyłać treści (tekst, adresy URL, obrazy) z dowolnej aplikacji do Państwa aplikacji. Dziedziczy po kontrolerze widoku lub osadza kontroler widoku, a następnie odczytuje udostępnione elementy z kontekstu rozszerzenia.

import Foundation
// Share extension reads incoming items:
// extensionContext?.inputItems
//   each NSExtensionItem has attachments (NSItemProvider)
let share = "appears in the share sheet"
_ = share

Odczytywanie udostępnionych elementów

Udostępniona treść dociera jako załączniki NSItemProvider. Należy sprawdzić identyfikator typu i asynchronicznie załadować wartość. W ten sposób rozszerzenie udostępniania pobiera adres URL lub obraz udostępniany przez użytkownika.

import UniformTypeIdentifiers
func handle(_ provider: NSItemProvider) {
    if provider.hasItemConformingToTypeIdentifier(
        UTType.url.identifier) {
        provider.loadItem(
            forTypeIdentifier: UTType.url.identifier) {
            value, _ in
            print("shared url:", value ?? "none")
        }
    }
}

Rozszerzenia działań

Rozszerzenie działania przekształca lub wyświetla treść w miejscu — na przykład tłumaczy zaznaczony tekst lub dodaje adnotacje do pliku PDF — i może zwrócić wynik aplikacji hostującej. W przeciwieństwie do rozszerzenia udostępniania służy do działania na treści, a nie do wysyłania jej w inne miejsce.

import Foundation
// Action extension may return modified items:
// extensionContext?.completeRequest(
//     returningItems: outputItems)
let action = "acts on content, can return a result"
_ = action

Rozszerzenie usługi powiadomień

Rozszerzenie usługi powiadomień przechwytuje przychodzące powiadomienia push z mutable-content: 1, aby zmodyfikować je przed wyświetleniem — odszyfrować treść, pobrać załącznik multimedialny lub zmienić tytuł — w ramach krótkiego limitu czasu.

import UserNotifications
// Override in UNNotificationServiceExtension:
// didReceive(_ request:, withContentHandler:)
//   mutate bestAttemptContent, then call the handler
let service = "modifies push before it shows"
_ = service

Rozszerzenie zawartości powiadomień

Rozszerzenie zawartości powiadomień udostępnia niestandardowy interfejs użytkownika dla rozwiniętego powiadomienia — mapę, odtwarzacz multimediów lub interaktywne elementy sterujące — wyświetlany po dłuższym naciśnięciu banera. Jest powiązane z kategorią powiadomienia.

import UserNotifications
// UNNotificationContentExtension renders a custom view
// for a given UNNotificationCategory when expanded.
let content = "custom expanded notification UI"
_ = content

Cykl życia completeRequest

Rozszerzenia działają krótko. Po zakończeniu należy wywołać extensionContext?.completeRequest(returningItems:completionHandler:), aby zasygnalizować ukończenie i pozwolić aplikacji hostującej zamknąć rozszerzenie. Aby przerwać działanie, należy użyć cancelRequest(withError:). Przetrzymywanie procesu otwartego marnuje zasoby i może spowodować jego zakończenie przez system.

import Foundation
func finish(context: NSExtensionContext?) {
    context?.completeRequest(
        returningItems: [], completionHandler: nil)
}

Inne punkty rozszerzeń

iOS oferuje wiele punktów rozszerzeń: niestandardowe klawiatury, dostawców dokumentów, indeksowanie Spotlight, blokery treści Safari, intencje Siri, edycję zdjęć oraz rozszerzenia dostawców plików. Każde z nich jest zgodne z protokołem zdefiniowanym przez system i zadeklarowanym za pomocą NSExtensionPointIdentifier w pliku Info.plist.

// Info.plist of an extension declares its point:
// NSExtension > NSExtensionPointIdentifier
//   e.g. com.apple.share-services
//        com.apple.usernotifications.service
let point = "each extension declares its point"
_ = point

Limity pamięci i czasu

Rozszerzenia działają przy bardziej rygorystycznych limitach niż główna aplikacja — mają mniej pamięci i krótki limit czasu rzeczywistego. Należy wykonywać tylko niezbędne operacje, unikać dużych alokacji i w miarę możliwości przekazywać wymagające przetwarzanie głównej aplikacji za pośrednictwem współdzielonego magazynu.

import Foundation
// Tight memory + short runtime.
// Pattern: extension stages data in the App Group,
// the main app processes it fully on next launch.
let limits = "keep extensions lean and fast"
_ = limits

Udostępnianie kodu między targetami

Aby uniknąć powielania logiki, należy umieścić współdzielone modele i pomocnicze elementy w frameworku lub pakiecie Swift, od którego zależą zarówno aplikacja, jak i rozszerzenie. Należy oznaczyć tylko to, czego potrzebuje dany target; rozszerzenie linkuje ten sam kod bez jego kopiowania.

import Foundation
// Shared Swift package 'AppCore' linked by:
//   - main app target
//   - share extension target
//   - widget extension target
let shared = "one source of truth for models"
_ = shared

Szybkie sprawdzenie

Proszę przypomnieć sobie, w jaki sposób rozszerzenie komunikuje się z aplikacją kontenera.

Podsumowanie

Zapoznali się Państwo z rozszerzeniami aplikacji:

  • Rozszerzenia to osobne cele działające w piaskownicy, uruchamiane przez aplikację hostującą; należą do nich między innymi rozszerzenia udostępniania, działań, usługi powiadomień i zawartości powiadomień.
  • Przychodzącą treść należy odczytywać za pomocą NSItemProvider, a działanie kończyć za pomocą completeRequest.
  • Każde rozszerzenie deklaruje swój NSExtensionPointIdentifier i działa przy ścisłych limitach pamięci oraz czasu.
  • Dane należy udostępniać za pośrednictwem App Group, a kod ponownie wykorzystywać za pomocą współdzielonego pakietu.

Często zadawane pytania

Czy lekcja „Przegląd rozszerzeń aplikacji” jest bezpłatna?

Tak — pełny tekst „Przegląd rozszerzeń aplikacji” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Przegląd rozszerzeń aplikacji”?

Poznaj rozszerzenia udostępniania, akcji i inne rozszerzenia. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Swift Academy?

Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Przegląd rozszerzeń aplikacji”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?

Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Tworzenie widżetu WidgetKit
  2. Dostawcy osi czasu i migawki
  3. Przegląd rozszerzeń aplikacji
  4. App Intents i skróty
← Powrót do Swift Academy