GPS-Entfernung bei iOS-Fotoexporten prüfen

Security ·ca. 5 Min. Lesezeit

GPS-Entfernung bei iOS-Fotoexporten prüfen

In der Fotoansicht ist kein Aufnahmeort zu sehen – die exportierte Datei kann trotzdem Koordinaten enthalten. Bei einer iOS-Fotoexportfunktion muss deshalb die Datei geprüft werden, die beim Empfänger ankommt, nicht die Vorschau in der App. Mit einem GPS-haltigen Testfoto auf einem Cloud-Mac lässt sich diese Datenschutzanforderung als wiederholbare Dateiprüfung umsetzen.

Zuerst die Exportgrenze festlegen

Ein typischer Ablauf lautet: Foto auswählen, bearbeiten oder skalieren, eine temporäre Datei erzeugen und diese an die Teilen-Funktion übergeben. Jeder Schritt kann beeinflussen, wie Metadaten behandelt werden. Eine Prüfung des vom Fotoauswahldialog zurückgegebenen Bildes beweist nicht, dass die endgültige Datei bereinigt ist. Dasselbe gilt für eine Miniaturansicht vor dem Teilen.

Das Testfoto sollte das Team selbst erstellen und sicherstellen, dass die Originaldatei tatsächlich ein GPS-Dictionary enthält. Echte Nutzerfotos gehören weder in CI-Tests noch sollte ein Testfoto mit Koordinaten in einem öffentlichen Repository liegen. Die Testdatei kann in einem zugriffsgeschützten Verzeichnis für Testressourcen abgelegt werden; erwartetes Format und Pixelmaße sollten dokumentiert und erzeugte Dateien nach dem Test gelöscht werden.

Bestanden ist die Prüfung, wenn die endgültige Datei kein GPS-Dictionary enthält – nicht, wenn Export und Originaldatei Byte für Byte identisch sind. Nach einer erneuten Kodierung ändert sich der Datei-Hash in der Regel.

Datei mit ImageIO erzeugen und prüfen

Das folgende Swift-Skript liest das Eingabebild, dekodiert es und kodiert es im Dateityp des Originals neu. Es übernimmt ausdrücklich nur die Ausrichtung, nicht das gesamte Metadaten-Dictionary der Eingabedatei. Anschließend öffnet es die Ausgabedatei erneut und prüft GPS-Dictionary, Bildmaße, Ausrichtung und Format. Speichern Sie das Skript zunächst in einem isolierten Verzeichnis als redact.swift:

import Foundation
import ImageIO
import CoreGraphics

guard CommandLine.arguments.count == 3 else {
    fatalError("Usage: redact input output")
}

let input = URL(fileURLWithPath: CommandLine.arguments[1])
let output = URL(fileURLWithPath: CommandLine.arguments[2])
guard input.standardizedFileURL != output.standardizedFileURL else {
    fatalError("Input and output must differ")
}
guard let source = CGImageSourceCreateWithURL(input as CFURL, nil),
      let type = CGImageSourceGetType(source),
      let image = CGImageSourceCreateImageAtIndex(source, 0, nil),
      let original = CGImageSourceCopyPropertiesAtIndex(source, 0, nil)
        as? [CFString: Any],
      let destination = CGImageDestinationCreateWithURL(
        output as CFURL, type, 1, nil
      ) else {
    fatalError("Cannot read input or create output")
}

let orientation = original[kCGImagePropertyOrientation] ?? 1
let options: [CFString: Any] = [
    kCGImagePropertyOrientation: orientation
]
CGImageDestinationAddImage(destination, image, options as CFDictionary)
guard CGImageDestinationFinalize(destination),
      let result = CGImageSourceCreateWithURL(output as CFURL, nil),
      let finalImage = CGImageSourceCreateImageAtIndex(result, 0, nil),
      let metadata = CGImageSourceCopyPropertiesAtIndex(result, 0, nil)
        as? [CFString: Any] else {
    fatalError("Cannot verify output")
}

guard metadata[kCGImagePropertyGPSDictionary] == nil,
      CGImageSourceGetType(result) == type,
      finalImage.width == image.width,
      finalImage.height == image.height,
      String(describing: metadata[kCGImagePropertyOrientation] ?? 1)
        == String(describing: orientation) else {
    fatalError("Export verification failed")
}
print("GPS removed; format, dimensions and orientation checked")

Führen Sie auf dem Cloud-Mac im Terminal Folgendes aus:

swiftc -framework Foundation -framework ImageIO \
  -framework CoreGraphics redact.swift -o redact
./redact fixtures/with-gps.jpg output/without-gps.jpg

Erstellen Sie vorher das Verzeichnis output und ersetzen Sie die Beispieleingabe durch eine JPEG-Datei, bei der das GPS-Dictionary nachweislich vorhanden ist. Ein erfolgreicher Lauf bestätigt nur, dass diese eine Ausgabedatei die Prüfung bestanden hat. Wenn die produktive App Fotos zuschneiden oder komprimieren kann oder einen Teilen-Workflow nutzt, muss die Prüfung jeweils an der endgültigen Datei des betreffenden Pfads ansetzen. Das Skript ersetzt nicht die tatsächliche Exportimplementierung der App.

Einen Negativfall ergänzen

Dass eine bereinigte Datei besteht, beweist allein noch nicht, dass die Prüfbedingung wirksam ist. Prüfen Sie mit derselben Leselogik zuerst die Eingabedatei: Dort muss das GPS-Dictionary erkannt werden. Prüfen Sie dann die Ausgabedatei: Dort darf es nicht vorhanden sein. Enthält die Eingabe von vornherein keine Koordinaten, hat ein Test, den beide Dateien bestehen, keine Aussagekraft. Geben Sie weder Koordinatenwerte noch vollständige Metadaten in Logs aus.

Bewahren Sie außerdem eine unverändert kopierte Datei als Negativfall auf und stellen Sie sicher, dass der Prüfer sie zurückweist. Kopieren Sie dafür die Dateibytes direkt, ohne ein Bildwerkzeug zu verwenden, das Metadaten umschreiben könnte. So prüfen Sie sowohl den Bereinigungsschritt als auch, dass der Prüfer einen Lesefehler nicht mit „kein GPS“ verwechselt.

Was nach der erneuten Kodierung noch zu prüfen ist

Entfernte Standortdaten bedeuten nicht automatisch, dass das Bild ansonsten einwandfrei ist. Beim Dekodieren und erneuten Kodieren können sich die Qualität der verlustbehafteten Komprimierung, die Farbdarstellung oder andere Metadaten ohne Standortbezug ändern. Gleiche Bildmaße bedeuten auch nicht, dass jeder Pixelwert gleich geblieben ist. Nehmen Sie Fotos aus unterschiedlichen Quellen in die Regressionstests auf, mindestens Hoch- und Querformat sowie verschiedene Ausrichtungsmarker. Prüfen Sie die endgültigen Dateien auch visuell auf falsche Drehung, Farbverschiebungen und deutliche Bildfehler.

Prüfpunkte Bedingung für das Bestehen
Standortdaten Die endgültige Datei enthält kein GPS-Dictionary
Bildmaße Breite und Höhe entsprechen den Erwartungen für diesen Exportpfad
Anzeigeausrichtung Das Bild wird gemäß dem Ausrichtungsmarker der Ausgabe korrekt angezeigt
Dateiformat Beim Empfänger kommt das erwartete Format an
Lesefehler Der Test schlägt fehl; der Fehler gilt nicht als „kein GPS“

Das Beispielskript verlangt dieselben Bildmaße wie bei der Eingabe und eignet sich damit für Exportpfade ohne Skalierung. Wenn das Produkt Bilder zuschneidet oder komprimiert, muss die Maßprüfung an die konkreten Erwartungen für diesen Pfad angepasst werden. Sollen Farbprofile oder bestimmte Urheberrechtsfelder erhalten bleiben, schreiben Sie dafür eigene Tests. Kopieren Sie nicht das ursprüngliche Metadaten-Dictionary vollständig, nur um diese Felder zu bewahren.

Die Prüfung in die Abnahme auf dem Cloud-Mac einbinden

Legen Sie Testdatei, die tatsächlich von der App erzeugte Datei und Prüfs­kript getrennt voneinander ab. Die Pipeline führt zuerst den Export aus und liest danach die Datei am endgültigen Übergabepfad. Fehlt die Datei, lässt sie sich nicht dekodieren oder können die Metadaten nicht gelesen werden, muss der Test unmittelbar fehlschlagen. Parallele Aufträge benötigen jeweils ein eigenes Ausgabeverzeichnis, damit zurückgebliebene Dateien aus einem früheren Lauf keinen fälschlichen Erfolg verursachen.

Führen Sie zum Schluss eine manuelle Gegenprüfung durch: Teilen oder speichern Sie das Foto über die App und prüfen Sie die beim Empfänger angekommene Datei erneut, nicht nur einen Zwischenspeicher. So lassen sich Pfadfehler erkennen, bei denen die Bearbeitungsvorschau bereinigt ist, beim Teilen aber wieder die Originaldatei verwendet wird. Löschen Sie anschließend die temporären Exporte. Der Testbericht sollte nur festhalten, ob ein GPS-Dictionary vorhanden ist, welche Bildmaße und Ausrichtung vorliegen und an welchem Schritt ein Fehler auftrat – nicht die Koordinaten. So bleibt das Prüfergebnis reproduzierbar, ohne die zu entfernenden Informationen in Diagnose-Logs erneut offenzulegen.

Häufig gestellte Fragen

Ist ein Export GPS-frei, wenn die App keinen Aufnahmeort anzeigt?

Nein. Lesen Sie die Metadaten der endgültigen Exportdatei aus und prüfen Sie, dass kein GPS-Verzeichnis vorhanden ist.

Müssen Original und neu kodierte Datei denselben Hashwert haben?

Nein. Neukodierung kann die Dateibytes verändern. Prüfen Sie GPS-Daten, Bildmaße, Ausrichtung und Darstellung getrennt.

Mietdauer flexibel wählen

Den nächsten Schritt auf einem exklusiven Mac mini testen

VMCommit bietet exklusive Mac mini mit M4 zur Tages-, Wochen-, Monats- oder Quartalsmiete. Wählen Sie Modell und Standort und prüfen Sie die aktuelle Verfügbarkeit in der Konsole.

Mac mini jetzt mieten