16  H16: Je app klaarmaken

De app werkt. Nu moet hij er ook professioneel uitzien als je hem wilt publiceren. In dit hoofdstuk doorloop je de checklist: app-icoon, versienummers, Privacy Manifest en de Entitlements die beschrijven wat je app mag doen.

16.1 Wat gaan we bouwen?

Geen nieuwe code — wel een complete voorbereiding voor publicatie. Na dit hoofdstuk is de app klaar om naar App Store Connect te sturen.

Xcode project-instellingen met versienummer, build en icoon

De app met een icoon en correcte versie-informatie

16.2 Het app-icoon

Een app zonder icoon ziet er onaf uit. Het icoon is het eerste wat gebruikers zien in de App Store.

16.2.1 Formaten

macOS vereist meerdere formaten. Je levert één hoge-resolutie afbeelding van 1024×1024 pixels aan (PNG, geen transparantie), en Xcode genereert de rest.

Stap 1: Maak of koop een icoon van 1024×1024 pixels.

Stap 2: Open Xcode → selecteer Assets.xcassets → klik op AppIcon.

Stap 3: Sleep de 1024×1024 afbeelding naar het grote vakje “Mac 512pt @2x”.

Xcode genereert automatisch alle benodigde formaten.

16.2.2 De EnergyClock AppIconView

De EnergyClock heeft een AppIconView die het icoon programmatisch tekent — een 12-segmentsklok als SwiftUI-view. Je kunt hiervan een PNG exporteren:

// Bron: EnergyClock/AppIconView.swift
// Render de view naar een PNG
let renderer = ImageRenderer(content: AppIconView().frame(width: 1024, height: 1024))
renderer.scale = 1.0
if let image = renderer.nsImage {
    // Sla de afbeelding op als PNG
}

16.3 Versienummers

In Xcode selecteer je je app-target en ga je naar General. Hier staan twee velden:

Veld Betekenis Voorbeeld
Version Zichtbaar voor gebruikers 1.0.0
Build Interne teller, elke upload hoger 42

Gebruik Semantic Versioning voor de versie: MAJOR.MINOR.PATCH

  • MAJOR — grote, incompatibele wijzigingen
  • MINOR — nieuwe functionaliteit, backwards-compatible
  • PATCH — bugfixes

Voor een eerste release is 1.0.0 de standaard.

16.4 Privacy Manifest

Sinds 2024 vereist Apple een Privacy Manifest (PrivacyInfo.xcprivacy): een bestand dat beschrijft welke data je app verzamelt en waarom.

Stap 1: Maak een nieuw bestand in Xcode: File > New > File > App Privacy.

Stap 2: Vul in welke API’s je gebruikt. De EnergyClock gebruikt UserDefaults, wat valt onder NSPrivacyAccessedAPICategoryUserDefaults.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" ...>
<plist version="1.0">
<dict>
    <key>NSPrivacyAccessedAPITypes</key>
    <array>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>CA92.1</string>
            </array>
        </dict>
    </array>
    <key>NSPrivacyCollectedDataTypes</key>
    <array/>
    <key>NSPrivacyTracking</key>
    <false/>
</dict>
</plist>

CA92.1 betekent: “ik gebruik UserDefaults om de voorkeuren van de gebruiker op te slaan.”

16.5 Entitlements

Entitlements beschrijven wat je app mag doen: toegang tot het netwerk, push-notificaties, App Groups. Ze staan in het .entitlements-bestand van je target.

De EnergyClock heeft deze entitlements nodig:

Entitlement Waarom
com.apple.security.app-sandbox Verplicht voor Mac App Store
com.apple.security.network.client Netwerkaanroepen doen
com.apple.security.application-groups App Group voor widget

Voeg ze toe via Signing & Capabilities in je target-instellingen.

16.6 Signing

Voor de App Store moet je app gesigneerd zijn met een Distribution Certificate. Xcode kan dit automatisch regelen:

  1. Selecteer je target → Signing & Capabilities
  2. Zorg dat “Automatically manage signing” aangevinkt is
  3. Selecteer je Team

Als je nog geen Apple Developer account hebt, maak er dan een aan op developer.apple.com. Het gratis account werkt voor ontwikkeling; voor publicatie heb je een betaald account nodig (€99/jaar).

NoteVerdieping: code signing en de App Sandbox

Code signing is een cryptografisch mechanisme waarbij Apple garandeert dat de app niet gewijzigd is na het ondertekenen. macOS controleert bij het opstarten of de handtekening geldig is en of de app afkomstig is van een bekende ontwikkelaar (Gatekeeper).

De App Sandbox beperkt wat een app mag doen buiten zijn eigen container. Dit is een onderdeel van macOS’s beveiligingsmodel: een gehackte of kwaadaardige app kan zo minimale schade aanrichten. Voor de App Store is sandboxing verplicht.

Entitlements werken als “uitzonderingen” op de sandbox: je vraagt Apple expliciet toestemming voor elke extra bevoegdheid. Apple beoordeelt bij de App Review of de gevraagde bevoegdheden gerechtvaardigd zijn voor de app.

De com.apple.security.network.client entitlement is nodig omdat standaard het netwerk geblokkeerd is. Zonder deze entitlement mislukken alle URLSession-aanroepen met een sandbox-fout.

16.7 Apple documentatie

Meer over het app-icoon:

developer.apple.com/design/human-interface-guidelines/app-icons

Meer over Privacy Manifests:

developer.apple.com/documentation/bundleresources/privacy_manifest_files

Meer over Entitlements:

developer.apple.com/documentation/bundleresources/entitlements

16.8 Samenvatting

Begrip Betekenis
App-icoon Visuele herkenning van de app, 1024×1024 pixels
Version Zichtbare versie voor gebruikers (bijv. 1.0.0)
Build Interne teller, elke upload hoger
Semantic Versioning MAJOR.MINOR.PATCH versieschema
Privacy Manifest Bestand dat beschrijft welke data je app gebruikt
Entitlement Toestemming voor een specifieke functionaliteit
App Sandbox Beveiligde omgeving die apps van elkaar afschermt
Code signing Cryptografisch bewijs dat de app van jou is

16.9 Opdracht

  1. Maak een app-icoon voor de EnergyClock. Gebruik AppIconView als basis en exporteer hem als 1024×1024 PNG via ImageRenderer.
  2. Stel het versienummer in op 1.0.0 en het build-nummer op 1.
  3. Maak een PrivacyInfo.xcprivacy aan en voeg de UserDefaults-reden toe.
  4. Controleer in de Entitlements of network.client aanwezig is.