commit 4dad3c43d56b56a258377df3e3808e85f898b7d7
parent 282666f0866775b3559a07ab8e96d847dccd85ff
Author: Marc Stibane <marc@taler.net>
Date: Fri, 14 Aug 2026 19:37:15 +0200
AI: guard against failed cgImage
Diffstat:
1 file changed, 21 insertions(+), 7 deletions(-)
diff --git a/TalerWallet1/Views/HelperViews/QRGeneratorView.swift b/TalerWallet1/Views/HelperViews/QRGeneratorView.swift
@@ -28,6 +28,13 @@ struct QRGeneratorView: View {
let logoSize: CGFloat
@Binding var image: UIImage?
+ @State private var failed = false
+
+ // a QR code which cannot be generated must not look like an empty area to scan
+ private var failedText: Text {
+ Text("Cannot create QR code", comment: "shown instead of the QR code")
+ }
+
var body: some View {
ZStack {
if let image {
@@ -42,18 +49,23 @@ struct QRGeneratorView: View {
.scaledToFit()
.frame(width: logoSize * 2, height: logoSize)
}
+ } else if failed {
+ failedText
+ .talerFont(.title2)
+ .frame(width: size, height: size)
} else {
EmptyView()
}
}
.accessibilityElement(children: .combine)
- .accessibilityLabel(Text("QR Code", comment: "a11y"))
+ .accessibilityLabel(failed ? failedText : Text("QR Code", comment: "a11y"))
.onAppear {
// if let uiImage = getQRCode(text: text) {
- if let data = getQRCodeData(text: text) {
- if let uiImage = UIImage(data: data) {
- image = uiImage
- }
+ if let data = getQRCodeData(text: text),
+ let uiImage = UIImage(data: data) {
+ image = uiImage
+ } else {
+ failed = true
}
}
}
@@ -67,8 +79,10 @@ struct QRGeneratorView: View {
guard let ciimage = filter.outputImage else { return nil }
let transform = CGAffineTransform(scaleX: 10, y: 10)
let scaledCIImage = ciimage.transformed(by: transform)
- let uiimage = UIImage(ciImage: scaledCIImage)
- return uiimage.pngData()!
+ // a UIImage(ciImage:) has no bitmap representation, so pngData() would return nil
+ guard let cgImage = CIContext().createCGImage(scaledCIImage, from: scaledCIImage.extent)
+ else { return nil }
+ return UIImage(cgImage: cgImage).pngData()
}
}