1.1: Home-Screen-Widget + Siri-Kurzbefehl „Gassi gehen"
App Group group.app.banyaro.ios verbindet App und Widget-Extension (Entitlements in beiden Targets, CODE_SIGN_ENTITLEMENTS fürs Widget). Home-Screen-Widget (D): - BanYaroHomeWidget (klein + mittel): Tagesfoto, Hundename, nächster Termin. - App schreibt beim Heim-Laden einen Snapshot (HomeWidgetData) in die App Group und triggert WidgetCenter-Reload; Snapshot wird bei Logout/401 geleert. Siri-/Kurzbefehl (E): - StartWalkIntent „Gassi gehen" + AppShortcutsProvider (öffnet die App). - WalkLauncher überbrückt Intent → UI: Flag in der App Group, beim Aktivwerden eingelöst → Aufnehmen-Tab + Aufnahme-Start (TrackingView.startFresh). - MainTabView mit Tab-Auswahl (Tags), BanYaroGoApp liest scenePhase.
This commit is contained in:
parent
a2646a18ef
commit
d807db57a2
14 changed files with 307 additions and 6 deletions
|
|
@ -1,4 +1,6 @@
|
|||
import SwiftUI
|
||||
import WidgetKit
|
||||
import UIKit
|
||||
|
||||
struct HeimView: View {
|
||||
@Environment(AuthSession.self) private var auth
|
||||
|
|
@ -260,5 +262,42 @@ struct HeimView: View {
|
|||
}
|
||||
cachedPhotoUrl = fresh
|
||||
}
|
||||
|
||||
await updateWidgetSnapshot(dog: dog)
|
||||
}
|
||||
|
||||
/// Schreibt einen Snapshot (kleines Foto + nächster Termin) in die App Group
|
||||
/// fürs Home-Screen-Widget und triggert ein Widget-Reload.
|
||||
private func updateWidgetSnapshot(dog: Dog) async {
|
||||
var photoJPEG: Data?
|
||||
if let path = dashboard?.randomPhoto?.previewUrl ?? dashboard?.randomPhoto?.url,
|
||||
let url = URL(string: "https://banyaro.app\(path)"),
|
||||
let (data, _) = try? await URLSession.shared.data(from: url) {
|
||||
photoJPEG = Self.widgetThumbnail(from: data)
|
||||
}
|
||||
let appt: String? = {
|
||||
guard let a = dashboard?.nextAppointment, let bez = a.bezeichnung, !bez.isEmpty else { return nil }
|
||||
if let date = a.naechstes { return "\(bez) · \(DiaryUtil.format(date))" }
|
||||
return bez
|
||||
}()
|
||||
HomeWidgetStore.save(HomeWidgetData(
|
||||
dogName: dog.name,
|
||||
photoJPEG: photoJPEG,
|
||||
nextAppointment: appt,
|
||||
diaryCount: dashboard?.diaryCount,
|
||||
updatedAt: Date()
|
||||
))
|
||||
WidgetCenter.shared.reloadAllTimelines()
|
||||
}
|
||||
|
||||
private static func widgetThumbnail(from data: Data, max: CGFloat = 600) -> Data? {
|
||||
guard let img = UIImage(data: data) else { return nil }
|
||||
let longest = Swift.max(img.size.width, img.size.height)
|
||||
let scale = longest > max ? max / longest : 1
|
||||
let size = CGSize(width: img.size.width * scale, height: img.size.height * scale)
|
||||
let rendered = UIGraphicsImageRenderer(size: size).image { _ in
|
||||
img.draw(in: CGRect(origin: .zero, size: size))
|
||||
}
|
||||
return rendered.jpegData(compressionQuality: 0.7)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue