Add AI enablement guidance with reason-specific UI and localized translations
Show specific guidance when Apple Intelligence is unavailable: - Device not eligible: "iPhone 15 Pro or later required" - Not enabled: step-by-step path + "Open Settings" button - Model downloading: "Please wait" + "Try Again" button - Pre-iOS 26: "Update required" Auto re-checks availability when app returns to foreground so enabling Apple Intelligence in Settings immediately triggers insight generation. Adds translations for all new AI strings across de, es, fr, ja, ko, pt-BR. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -30,6 +30,15 @@ enum InsightGenerationError: Error, LocalizedError {
|
||||
}
|
||||
}
|
||||
|
||||
/// Why Apple Intelligence is unavailable
|
||||
enum AIUnavailableReason {
|
||||
case deviceNotEligible
|
||||
case notEnabled
|
||||
case modelDownloading
|
||||
case unknown
|
||||
case preiOS26
|
||||
}
|
||||
|
||||
/// Service responsible for generating AI-powered mood insights using Apple's Foundation Models
|
||||
@available(iOS 26, *)
|
||||
@MainActor
|
||||
@@ -40,6 +49,7 @@ class FoundationModelsInsightService: ObservableObject {
|
||||
@Published private(set) var isAvailable: Bool = false
|
||||
@Published private(set) var isGenerating: Bool = false
|
||||
@Published private(set) var lastError: InsightGenerationError?
|
||||
@Published private(set) var unavailableReason: AIUnavailableReason = .unknown
|
||||
|
||||
// MARK: - Dependencies
|
||||
|
||||
@@ -63,15 +73,27 @@ class FoundationModelsInsightService: ObservableObject {
|
||||
switch model.availability {
|
||||
case .available:
|
||||
isAvailable = true
|
||||
unavailableReason = .unknown
|
||||
case .unavailable(let reason):
|
||||
isAvailable = false
|
||||
unavailableReason = mapUnavailableReason(reason)
|
||||
lastError = .modelUnavailable(reason: describeUnavailability(reason))
|
||||
@unknown default:
|
||||
isAvailable = false
|
||||
unavailableReason = .unknown
|
||||
lastError = .modelUnavailable(reason: "Unknown availability status")
|
||||
}
|
||||
}
|
||||
|
||||
private func mapUnavailableReason(_ reason: SystemLanguageModel.Availability.UnavailableReason) -> AIUnavailableReason {
|
||||
switch reason {
|
||||
case .deviceNotEligible: return .deviceNotEligible
|
||||
case .appleIntelligenceNotEnabled: return .notEnabled
|
||||
case .modelNotReady: return .modelDownloading
|
||||
@unknown default: return .unknown
|
||||
}
|
||||
}
|
||||
|
||||
private func describeUnavailability(_ reason: SystemLanguageModel.Availability.UnavailableReason) -> String {
|
||||
switch reason {
|
||||
case .deviceNotEligible:
|
||||
|
||||
Reference in New Issue
Block a user