Ontwikkel een geavanceerde Swift iOS app met aangepaste SiriKit-integraties
description
Met deze prompt kun je geavanceerde spraakgestuurde functionaliteit aan je iOS app toevoegen via SiriKit, waardoor je app gebruiksvriendelijker en moderner wordt. Je leert hoe je eigen Siri-intents maakt, integreert en optimaliseert, wat je app onderscheidt van standaardapps zonder spraakbesturing. Dit helpt je om een innovatieve gebruikerservaring te bieden en tegelijkertijd valkuilen in SiriKit-implementaties te vermijden.
prompt
Help me een geavanceerde Swift iOS app te ontwikkelen die aangepaste SiriKit-intents gebruikt voor <beschrijf de functionaliteit van de Siri-integratie>. Geef codevoorbeelden en leg uit hoe ik deze intents kan d ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hieronder vind je een uitgebreide gids voor het ontwikkelen van een geavanceerde Swift iOS-app die aangepaste SiriKit-intents gebruikt voor het toevoegen en markeren van taken als voltooid. Ik geef je stapsgewijze uitleg, codevoorbeelden, en best practices voor een soepele integratie.
---
## 1. Definieer aangepaste SiriKit-intents
### 1.1. Gebruik de Intent Definition File (.intentdefinition)
- In Xcode voeg je een nieuw bestand toe: **File > New > File > Resource > Intent Definition File**.
- Noem het bijvoorbeeld `TaskIntents.intentdefinition`.
### 1.2. Voeg twee intents toe:
- **AddTaskIntent**:
- Parameters:
- `taskTitle` (String)
- **CompleteTaskIntent**:
- Parameters:
- `taskID` (Identifier of de taak) of `taskTitle`
### 1.3. Stel de intent-parameters in en definieer de responses
Voorbeeld voor AddTaskIntent:
```xml
<intent name="AddTaskIntent">
<parameter name="taskTitle" type="INString"/>
<parameter name="taskDescription" type="INString" optional="true"/>
<response name="AddTaskSuccess"/>
<response name="AddTaskFailure"/>
</intent>
```
Voor CompleteTaskIntent:
```xml
<intent name="CompleteTaskIntent">
<parameter name="taskID" type="INString"/>
<response name="CompleteTaskSuccess"/>
<response name="CompleteTaskFailure"/>
</intent>
```
---
## 2. Genereer en implementeer de Intents UI en code
### 2.1. Genereer de code
- Klik rechts op het `.intentdefinition` bestand en kies **Generate Intent Classes**.
- Xcode maakt `.swift` bestanden voor elke intent.
### 2.2. Implementeer de intent handlers
Maak een nieuwe class conform de gegenereerde protocolen:
```swift
import Intents
class AddTaskIntentHandler: NSObject, AddTaskIntentHandling {
func handle(intent: AddTaskIntent, completion: @escaping (AddTaskIntentResponse) -> Void) {
guard let taskTitle = intent.taskTitle else {
completion(AddTaskIntentResponse(code: .failure, userActivity: nil))
return
}
// Voeg taak toe aan je data opslag, bijvoorbeeld Core Data
let success = TaskManager.shared.addTask(title: taskTitle)
if success {
completion(AddTaskIntentResponse.success(taskTitle: taskTitle))
} else {
completion(AddTaskIntentResponse.failure())
}
}
}
```
Voor de markeer voltooid intent:
```swift
class CompleteTaskIntentHandler: NSObject, CompleteTaskIntentHandling {
func handle(intent: CompleteTaskIntent, completion: @escaping (CompleteTaskIntentResponse) -> Void) {
guard let taskID = intent.taskID else {
completion(CompleteTaskIntentResponse.failure())
return
}
let success = TaskManager.shared.completeTask(withID: taskID)
if success {
completion(CompleteTaskIntentResponse.success())
} else {
completion(CompleteTaskIntentResponse.failure())
}
}
}
```
---
## 3. Configureer de Intent Extension
- Voeg een nieuwe **Intents Extension** toe aan je project.
- Implementeer daarin je intent handlers.
- Zorg dat je `IntentHandler.swift` (of gelijknamig) de juiste handlers registreert:
```swift
class IntentHandler: INExtension, AddTaskIntentHandling, CompleteTaskIntentHandling {
func handler(for intent: INIntent) -> Any? {
switch intent {
case is AddTaskIntent:
return AddTaskIntentHandler()
case is CompleteTaskIntent:
return CompleteTaskIntentHandler()
default:
return nil
}
}
}
```
---
## 4. Integreer de intents in je app
### 4.1. Voeg de intents toe aan je `Info.plist`
- Ga naar je intent extension en voeg de intent definities toe onder `IntentsSupported`.
### 4.2. Registreer Siri Shortcuts in je app
Gebruik `Intents` framework om shortcuts toe te voegen:
```swift
import Intents
// Bijvoorbeeld voor een 'Add Task' shortcut
func donateAddTaskShortcut(taskTitle: String) {
let intent = AddTaskIntent()
intent.taskTitle = taskTitle
let shortcut = INShortcut(intent: intent)
let activity = INInteraction(intent: intent, response: nil)
activity.donate { error in
if let error = error {
print("Fout bij donatie: \(error)")
}
}
}
```
Herhaal dit voor "mark as voltooid".
---
## 5. Verbeter de gebruikerservaring met natuurlijke taalverwerking en Siri Shortcuts
### 5.1. Gebruik Siri Suggestions en NSUserActivity
- Maak `NSUserActivity` objecten voor taken om suggesties te geven:
```swift
let activity = NSUserActivity(activityType: "com.jouwapp.task")
activity.title = "Nieuwe taak toevoegen"
activity.suggestedInvocationPhrase = "Maak een nieuwe taak"
activity.userInfo = ["taskTitle": taskTitle]
viewController.userActivity = activity
activity.becomeCurrent()
```
### 5.2. Voeg Siri Shortcuts toe via `INUIAddVoiceShortcutViewController`
Voor een naadloze ervaring:
```swift
import IntentsUI
func presentShortcutCreation(for intent: INIntent) {
let shortcut = INShortcut(intent: intent)
let viewController = INUIAddVoiceShortcutViewController(shortcut: shortcut)
viewController.delegate = self
present(viewController, animated: true)
}
// Implementeer INUIAddVoiceShortcutViewControllerDelegate
extension YourViewController: INUIAddVoiceShortcutViewControllerDelegate {
func addVoiceShortcutViewController(_ controller: INUIAddVoiceShortcutViewController, didFinishWith voiceShortcut: INVoiceShortcut?, error: Error?) {
controller.dismiss(animated: true)
}
func addVoiceShortcutViewControllerDidCancel(_ controller: INUIAddVoiceShortcutViewController) {
controller.dismiss(animated: true)
}
}
```
---
## 6. Valkuilen en best practices
- **Test je intents grondig** met Siri en de Shortcuts-app.
- **Zorg dat data opslag (bijv. Core Data) thread-safe is** en correct wordt bijgewerkt.
- **Gebruik unieke identifiers** voor taken om consistentie te bewaren.
- **Vermijd complexiteit in natuurlijke taal**; houd intents eenvoudig en duidelijk.
- **Implementeer fallback-opties** voor wanneer Siri of intents niet werken.
- **Documenteer en onderhoud intent-definities** goed, vooral bij updates.
---
## Samenvatting
Door je eigen intents te definiëren, te implementeren en te integreren met Siri Shortcuts en gebruikerssuggesties, maak je een krachtige en gebruiksvriendelijke Siri-integratie voor takenbeheer. Denk eraan om je intents goed te testen, gebruikers te begeleiden in het toevoegen van shortcuts, en je data consistent te beheren.
---
Heeft je nog specifieke vragen of wil je hulp met een bepaald onderdeel?
provider: deepseek
model: deepseek-chat
Zeker! Hier een uitgebreide handleiding voor het ontwikkelen van een geavanceerde Swift iOS app met SiriKit-intents voor takenbeheer.
## 1. Projectconfiguratie
### Info.plist toevoegen
```xml
<key>NSUserActivityTypes</key>
<array>
<string>AddTaskIntent</string>
<string>CompleteTaskIntent</string>
</array>
<key>NSSiriUsageDescription</key>
<string>Siri wordt gebruikt om taken toe te voegen en te markeren als voltooid</string>
```
## 2. Intent Definition File
Maak een `.intentdefinition` bestand aan in je project:
### AddTaskIntent
- **Category**: Tasks
- **Title**: Taak toevoegen
- **Parameters**:
- `taskTitle` (String, required)
- `dueDate` (Date, optional)
- `priority` (Custom enum: laag, gemiddeld, hoog)
### CompleteTaskIntent
- **Category**: Tasks
- **Title**: Taak voltooien
- **Parameters**:
- `task` (Dynamic, required)
## 3. Intent Handler Implementatie
### TaskManager (Core functionaliteit)
```swift
import Foundation
class TaskManager {
static let shared = TaskManager()
private var tasks: [Task] = []
func addTask(title: String, dueDate: Date?, priority: TaskPriority) -> Task {
let task = Task(
id: UUID(),
title: title,
dueDate: dueDate,
priority: priority,
isCompleted: false
)
tasks.append(task)
return task
}
func completeTask(with identifier: String) -> Task? {
guard let taskIndex = tasks.firstIndex(where: { $0.id.uuidString == identifier }) else {
return nil
}
tasks[taskIndex].isCompleted = true
return tasks[taskIndex]
}
func findTask(by title: String) -> Task? {
tasks.first { $0.title.lowercased().contains(title.lowercased()) }
}
}
struct Task {
let id: UUID
var title: String
var dueDate: Date?
var priority: TaskPriority
var isCompleted: Bool
}
enum TaskPriority: String, CaseIterable {
case low = "laag"
case medium = "gemiddeld"
case high = "hoog"
}
```
### IntentHandler
```swift
import Intents
class AddTaskIntentHandler: NSObject, AddTaskIntentHandling {
func resolveTaskTitle(for intent: AddTaskIntent) async -> INStringResolutionResult {
guard let taskTitle = intent.taskTitle else {
return .needsValue()
}
return .success(with: taskTitle)
}
func resolveDueDate(for intent: AddTaskIntent) async -> INDateComponentsResolutionResult {
guard let dueDate = intent.dueDate else {
return .notRequired()
}
return .success(with: dueDate)
}
func resolvePriority(for intent: AddTaskIntent) async -> TaskPriorityResolutionResult {
guard let priority = intent.priority else {
return .success(with: .medium)
}
return .success(with: priority)
}
func handle(intent: AddTaskIntent) async -> AddTaskIntentResponse {
guard let taskTitle = intent.taskTitle else {
return AddTaskIntentResponse.failure(error: "Taaktitel is vereist")
}
let task = TaskManager.shared.addTask(
title: taskTitle,
dueDate: intent.dueDate?.date,
priority: intent.priority ?? .medium
)
let response = AddTaskIntentResponse.success(task: task.title)
response.task = task.title
// Donate shortcut voor Siri suggesties
donateAddTaskShortcut(taskTitle: taskTitle)
return response
}
private func donateAddTaskShortcut(taskTitle: String) {
let intent = AddTaskIntent()
intent.taskTitle = taskTitle
intent.suggestedInvocationPhrase = "Voeg taak toe: \(taskTitle)"
let interaction = INInteraction(intent: intent, response: nil)
interaction.donate { error in
if let error = error {
print("Shortcut donation failed: \(error)")
}
}
}
}
```
### CompleteTaskIntentHandler
```swift
class CompleteTaskIntentHandler: NSObject, CompleteTaskIntentHandling {
func provideTaskOptionsCollection(for intent: CompleteTaskIntent) async throws -> INObjectCollection<TaskResolutionResult> {
let incompleteTasks = TaskManager.shared.tasks.filter { !$0.isCompleted }
let taskResults = incompleteTasks.map { task in
TaskResolutionResult(
identifier: task.id.uuidString,
display: task.title
)
}
return INObjectCollection(items: taskResults)
}
func resolveTask(for intent: CompleteTaskIntent) async -> TaskResolutionResult {
guard let task = intent.task else {
return .disambiguation(with: TaskManager.shared.tasks.filter { !$0.isCompleted }.map {
TaskResolutionResult(identifier: $0.id.uuidString, display: $0.title)
})
}
return .success(with: task)
}
func handle(intent: CompleteTaskIntent) async -> CompleteTaskIntentResponse {
guard let taskIdentifier = intent.task?.identifier else {
return CompleteTaskIntentResponse.failure(error: "Taak niet gevonden")
}
guard let completedTask = TaskManager.shared.completeTask(with: taskIdentifier) else {
return CompleteTaskIntentResponse.failure(error: "Taak kon niet worden voltooid")
}
let response = CompleteTaskIntentResponse.success(completedTask: completedTask.title)
return response
}
}
```
## 4. AppDelegate/SceneDelegate Configuratie
```swift
import UIKit
import Intents
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Register intent handlers
INPreferences.requestSiriAuthorization { status in
print("Siri authorization status: \(status.rawValue)")
}
// Donate default shortcuts
donateDefaultShortcuts()
}
private func donateDefaultShortcuts() {
let addTaskIntent = AddTaskIntent()
addTaskIntent.suggestedInvocationPhrase = "Voeg een taak toe"
let interaction = INInteraction(intent: addTaskIntent, response: nil)
interaction.donate { error in
if let error = error {
print("Default shortcut donation failed: \(error)")
}
}
}
}
```
## 5. Natuurlijke Taalverwerking Optimalisatie
### Custom Vocabulary
```swift
class CustomVocabularyManager {
static func registerCustomVocabulary() {
let vocabulary = INVocabulary.shared()
// Taak titels als custom vocabulary
let taskTitles = INVocabularyStringArray(array: ["boodschappen", "afspraak", "vergadering", "sporten"])
vocabulary.setVocabularyStrings(taskTitles, of: .contactName)
}
}
```
### Parameter Resolutie Optimalisatie
```swift
extension AddTaskIntentHandler {
func resolveTaskTitle(for intent: AddTaskIntent, with completion: @escaping (INStringResolutionResult) -> Void) {
guard let taskTitle = intent.taskTitle else {
completion(.needsValue())
return
}
// NLP: Schoon taak titel op
let cleanedTitle = cleanTaskTitle(taskTitle)
completion(.success(with: cleanedTitle))
}
private func cleanTaskTitle(_ title: String) -> String {
var cleaned = title
// Verwijder stopwoorden
let stopWords = ["alsjeblieft", "kun je", "wil je", "zou je"]
stopWords.forEach { word in
cleaned = cleaned.replacingOccurrences(of: word, with: "", options: .caseInsensitive)
}
return cleaned.trimmingCharacters(in: .whitespacesAndNewlines)
}
}
```
## 6. Siri Shortcuts Integratie
### Shortcuts Donation
```swift
extension UIViewController {
func donateTaskShortcuts() {
// Donate bij het aanmaken van een taak in de app
let intent = AddTaskIntent()
intent.taskTitle = "Nieuwe taak"
intent.suggestedInvocationPhrase = "Voeg taak toe"
let interaction = INInteraction(intent: intent, response: nil)
interaction.donate { error in
if let error = error {
print("Shortcut donation error: \(error)")
}
}
}
func setupSiriShortcuts() {
// Voeg Siri-knop toe aan UI
if #available(iOS 12.0, *) {
let button = INUIAddVoiceShortcutButton(style: .blackOutline)
button.shortcut = INShortcut(intent: AddTaskIntent())
button.translatesAutoresizingMaskIntoConstraints = false
button.delegate = self
// Voeg button toe aan view
view.addSubview(button)
}
}
}
```
## 7. Veelvoorkomende Valkuilen en Oplossingen
### 1. App Group Configuratie
```swift
// Gebruik App Groups voor data sharing tussen app en Siri extension
let sharedContainer = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "group.com.jouwedomain.tasks")
```
### 2. Error Handling
```swift
extension AddTaskIntentResponse {
static func failure(error: String) -> AddTaskIntentResponse {
let response = AddTaskIntentResponse(code: .failure, userActivity: nil)
response.error = error
return response
}
}
```
### 3. Localization
```swift
// Voeg Nederlandse localisatie toe aan .intentdefinition
// Configureer response templates in intent definition editor
```
### 4. Performance Optimalisatie
```swift
// Cache task lijst voor snellere resolutie
class TaskCache {
static let shared = TaskCache()
private var cachedTasks: [Task] = []
private let cacheTimeout: TimeInterval = 300 // 5 minuten
func getTasks() -> [Task] {
// Implementeer caching logica
return TaskManager.shared.tasks
}
}
```
## 8. Testen
### Siri Test Commands
- "Voeg [taak] toe aan mijn takenlijst"
- "Markeer [taak] als voltooid"
- "Zet een herinnering voor [taak]"
### Unit Tests
```swift
import XCTest
@testable import YourApp
class TaskIntentTests: XCTestCase {
func testAddTaskIntent() async {
let handler = AddTaskIntentHandler()
let intent = AddTaskIntent()
intent.taskTitle = "Test taak"
let response = await handler.handle(intent: intent)
XCTAssertEqual(response.code, .success)
}
}
```
## Belangrijke Tips:
1. **Test uitgebreid op echt device** - Siri werkt niet in simulator
2. **Implementeer fallbacks** - Voor wanneer Siri niet beschikbaar is
3. **Gebruik betekenisvolle suggestedInvocationPhrases**
4. **Houd response templates kort en duidelijk**
5. **Implementeer goede error messages in het Nederlands**
Deze implementatie biedt een robuuste basis voor Siri-integratie in je taken-app met aandacht voor natuurlijke taalverwerking en gebruikerservaring.
error: Generation failed [deepseek] prompt_id=5015 locale=en err=DeepSeek connection/timeout | Generation failed [deepseek] prompt_id=5015 locale=es err=DeepSeek connection/timeout