Um eine Google Cloud-API von Ihrer App aus aufzurufen, müssen Sie eine zwischengeschaltete REST-API erstellen, die die Autorisierung verarbeitet und geheime Werte wie API-Schlüssel schützt. Sie müssen dann Code in Ihre mobile App schreiben, um sich bei diesem Zwischendienst zu authentifizieren und mit ihm zu kommunizieren.
Eine Möglichkeit, diese REST-API zu erstellen, ist die Verwendung von Firebase Authentication and Functions, wodurch Sie ein verwaltetes, serverloses Gateway zu Google Cloud-APIs erhalten, das die Authentifizierung verarbeitet und von Ihrer mobilen App mit vorgefertigten SDKs aufgerufen werden kann.
In diesem Leitfaden wird gezeigt, wie Sie diese Technik verwenden, um die Cloud Vision-API von Ihrer App aus aufzurufen. Diese Methode ermöglicht allen authentifizierten Benutzern den Zugriff auf kostenpflichtige Cloud Vision-Dienste über Ihr Cloud-Projekt. Überlegen Sie also, ob dieser Authentifizierungsmechanismus für Ihren Anwendungsfall ausreicht, bevor Sie fortfahren.
Bevor Sie beginnen
Konfigurieren Sie Ihr Projekt
Wenn Sie Ihrer App Firebase noch nicht hinzugefügt haben, befolgen Sie dazu die Schritte im Leitfaden „Erste Schritte“ .Verwenden Sie Swift Package Manager, um Firebase-Abhängigkeiten zu installieren und zu verwalten.
- Navigieren Sie in Xcode bei geöffnetem App-Projekt zu File > Add Packages .
- Wenn Sie dazu aufgefordert werden, fügen Sie das Firebase Apple-Plattform-SDK-Repository hinzu:
- Wählen Sie die Firebase ML-Bibliothek aus.
- Wenn Sie fertig sind, beginnt Xcode automatisch mit dem Auflösen und Herunterladen Ihrer Abhängigkeiten im Hintergrund.
https://github.com/firebase/firebase-ios-sdk
Führen Sie als Nächstes einige In-App-Einrichtungen durch:
- Importieren Sie in Ihrer App Firebase:
Schnell
import FirebaseMLModelDownloader
Ziel c
@import FirebaseMLModelDownloader;
Noch ein paar Konfigurationsschritte und wir können loslegen:
Wenn Sie noch keine Cloud-basierten APIs für Ihr Projekt aktiviert haben, tun Sie dies jetzt:
- Öffnen Sie die Seite Firebase ML APIs der Firebase-Konsole.
Wenn Sie Ihr Projekt noch nicht auf den Blaze-Preisplan aktualisiert haben, klicken Sie dazu auf Upgrade . (Sie werden nur dann zum Upgrade aufgefordert, wenn Ihr Projekt nicht im Blaze-Plan enthalten ist.)
Nur Projekte auf Blaze-Ebene können Cloud-basierte APIs verwenden.
- Wenn Cloud-basierte APIs nicht bereits aktiviert sind, klicken Sie auf Cloud-basierte APIs aktivieren .
- Konfigurieren Sie Ihre vorhandenen Firebase-API-Schlüssel, um den Zugriff auf die Cloud Vision-API zu verbieten:
- Öffnen Sie die Anmeldedaten- Seite der Cloud-Konsole.
- Öffnen Sie für jeden API-Schlüssel in der Liste die Bearbeitungsansicht und fügen Sie im Abschnitt „Schlüsseleinschränkungen“ alle verfügbaren APIs mit Ausnahme der Cloud Vision-API zur Liste hinzu.
Stellen Sie die aufrufbare Funktion bereit
Stellen Sie als Nächstes die Cloud-Funktion bereit, mit der Sie Ihre App und die Cloud Vision-API überbrücken. Das Repository functions-samples
enthält ein Beispiel, das Sie verwenden können.
Standardmäßig ermöglicht der Zugriff auf die Cloud Vision-API über diese Funktion nur authentifizierten Benutzern Ihrer App den Zugriff auf die Cloud Vision-API. Sie können die Funktion für unterschiedliche Anforderungen modifizieren.
So stellen Sie die Funktion bereit:
- Klonen oder laden Sie das Repository „functions-samples“ herunter und wechseln Sie in das Verzeichnis
vision-annotate-image
:git clone https://github.com/firebase/functions-samples
cd vision-annotate-image
- Abhängigkeiten installieren:
cd functions
npm install
cd ..
- Wenn Sie die Firebase-Befehlszeilenschnittstelle nicht haben, installieren Sie sie .
- Initialisieren Sie ein Firebase-Projekt im Verzeichnis
vision-annotate-image
. Wenn Sie dazu aufgefordert werden, wählen Sie Ihr Projekt in der Liste aus.firebase init
- Stellen Sie die Funktion bereit:
firebase deploy --only functions:annotateImage
Fügen Sie Ihrer App Firebase Auth hinzu
Die oben bereitgestellte aufrufbare Funktion lehnt alle Anfragen von nicht authentifizierten Benutzern Ihrer App ab. Falls Sie dies noch nicht getan haben, müssen Sie Ihrer App Firebase Auth hinzufügen.
Fügen Sie Ihrer App die erforderlichen Abhängigkeiten hinzu
Verwenden Sie Swift Package Manager, um die Cloud Functions for Firebase-Bibliothek zu installieren.
1. Bereiten Sie das Eingabebild vor
Um Cloud Vision aufzurufen, muss das Bild als base64-codierter String formatiert werden. So verarbeiten Sie einUIImage
:Schnell
guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return } let base64encodedImage = imageData.base64EncodedString()
Ziel c
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
2. Rufen Sie die aufrufbare Funktion auf, um Orientierungspunkte zu erkennen
Um Orientierungspunkte in einem Bild zu erkennen, rufen Sie die aufrufbare Funktion auf, indem Sie eine JSON Cloud Vision-Anforderung übergeben .Initialisieren Sie zunächst eine Instanz von Cloud Functions:
Schnell
lazy var functions = Functions.functions()
Ziel c
@property(strong, nonatomic) FIRFunctions *functions;
Erstellen Sie eine Anfrage, deren Typ auf
LANDMARK_DETECTION
gesetzt ist:Schnell
let requestData = [ "image": ["content": base64encodedImage], "features": ["maxResults": 5, "type": "LANDMARK_DETECTION"] ]
Ziel c
NSDictionary *requestData = @{ @"image": @{@"content": base64encodedImage}, @"features": @{@"maxResults": @5, @"type": @"LANDMARK_DETECTION"} };
Rufen Sie abschließend die Funktion auf:
Schnell
functions.httpsCallable("annotateImage").call(requestData) { (result, error) in if let error = error as NSError? { if error.domain == FunctionsErrorDomain { let code = FunctionsErrorCode(rawValue: error.code) let message = error.localizedDescription let details = error.userInfo[FunctionsErrorDetailsKey] } // ... } // Function completed successfully }
Ziel c
[[_functions HTTPSCallableWithName:@"annotateImage"] callWithObject:requestData completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) { if (error) { if (error.domain == FIRFunctionsErrorDomain) { FIRFunctionsErrorCode code = error.code; NSString *message = error.localizedDescription; NSObject *details = error.userInfo[FIRFunctionsErrorDetailsKey]; } // ... } // Function completed succesfully // Get information about labeled objects }];
3. Informieren Sie sich über die erkannten Orientierungspunkte
Wenn der Orientierungspunkterkennungsvorgang erfolgreich ist, wird eine JSON-Antwort von BatchAnnotateImagesResponse im Ergebnis der Aufgabe zurückgegeben. Jedes Objekt im Array landmarkAnnotations
stellt einen Orientierungspunkt dar, der im Bild erkannt wurde. Für jeden Orientierungspunkt können Sie seine Begrenzungskoordinaten im Eingabebild, den Namen des Orientierungspunkts, seinen Breiten- und Längengrad, seine Knowledge Graph-Entitäts-ID (falls verfügbar) und den Konfidenzwert der Übereinstimmung abrufen. Zum Beispiel:
Schnell
if let labelArray = (result?.data as? [String: Any])?["landmarkAnnotations"] as? [[String:Any]] {
for labelObj in labelArray {
let landmarkName = labelObj["description"]
let entityId = labelObj["mid"]
let score = labelObj["score"]
let bounds = labelObj["boundingPoly"]
// Multiple locations are possible, e.g., the location of the depicted
// landmark and the location the picture was taken.
guard let locations = labelObj["locations"] as? [[String: [String: Any]]] else { continue }
for location in locations {
let latitude = location["latLng"]?["latitude"]
let longitude = location["latLng"]?["longitude"]
}
}
}
Ziel c
NSArray *labelArray = result.data[@"landmarkAnnotations"];
for (NSDictionary *labelObj in labelArray) {
NSString *landmarkName = labelObj[@"description"];
NSString *entityId = labelObj[@"mid"];
NSNumber *score = labelObj[@"score"];
NSArray *bounds = labelObj[@"boundingPoly"];
// Multiple locations are possible, e.g., the location of the depicted
// landmark and the location the picture was taken.
NSArray *locations = labelObj[@"locations"];
for (NSDictionary *location in locations) {
NSNumber *latitude = location[@"latLng"][@"latitude"];
NSNumber *longitude = location[@"latLng"][@"longitude"];
}
}