slogan3

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

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