Aby wywołać interfejs Google Cloud API z aplikacji, musisz utworzyć pośredni interfejs API REST, który obsługuje autoryzację i chroni tajne wartości, takie jak klucze API. Następnie musisz napisać kod w swojej aplikacji mobilnej, aby uwierzytelnić się i komunikować z tą usługą pośredniczącą.
Jednym ze sposobów utworzenia tego interfejsu API REST jest użycie uwierzytelniania i funkcji Firebase, które zapewniają zarządzaną, bezserwerową bramę do interfejsów Google Cloud API, które obsługują uwierzytelnianie i które można wywoływać z aplikacji mobilnej za pomocą gotowych pakietów SDK.
W tym przewodniku pokazano, jak używać tej techniki do wywoływania interfejsu Cloud Vision API z aplikacji. Ta metoda umożliwi wszystkim uwierzytelnionym użytkownikom dostęp do rozliczanych usług Cloud Vision za pośrednictwem projektu Cloud, więc przed kontynuowaniem zastanów się, czy ten mechanizm uwierzytelniania jest wystarczający w Twoim przypadku użycia.
Zanim zaczniesz
Skonfiguruj swój projekt
Jeśli nie dodałeś jeszcze Firebase do swojej aplikacji, wykonaj czynności opisane w przewodniku wprowadzającym .Użyj Menedżera pakietów Swift, aby zainstalować i zarządzać zależnościami Firebase.
- W Xcode przy otwartym projekcie aplikacji przejdź do pliku > Dodaj pakiety .
- Po wyświetleniu monitu dodaj repozytorium SDK platformy Firebase Apple:
- Wybierz bibliotekę Firebase ML.
- Po zakończeniu Xcode automatycznie rozpocznie rozwiązywanie i pobieranie zależności w tle.
https://github.com/firebase/firebase-ios-sdk
Następnie wykonaj konfigurację w aplikacji:
- W swojej aplikacji zaimportuj Firebase:
Szybki
import FirebaseMLModelDownloader
Cel C
@import FirebaseMLModelDownloader;
Jeszcze kilka kroków konfiguracji i jesteśmy gotowi do pracy:
Jeśli nie masz jeszcze włączonych interfejsów API opartych na chmurze w swoim projekcie, zrób to teraz:
- Otwórz stronę Firebase ML APIs w konsoli Firebase.
Jeśli Twój projekt nie został jeszcze uaktualniony do planu cenowego Blaze, kliknij Uaktualnij , aby to zrobić. (Zostaniesz poproszony o uaktualnienie tylko wtedy, gdy Twój projekt nie jest objęty planem Blaze).
Tylko projekty na poziomie Blaze mogą korzystać z interfejsów API opartych na chmurze.
- Jeśli interfejsy API oparte na chmurze nie są jeszcze włączone, kliknij Włącz interfejsy API oparte na chmurze .
- Skonfiguruj swoje istniejące klucze Firebase API, aby zablokować dostęp do Cloud Vision API:
- Otwórz stronę Poświadczenia w konsoli Cloud.
- Dla każdego klucza API na liście otwórz widok do edycji i w sekcji Ograniczenia klucza dodaj do listy wszystkie dostępne interfejsy API z wyjątkiem Cloud Vision API.
Wdróż funkcję wywoływalną
Następnie wdróż funkcję Cloud Functions, której użyjesz do połączenia aplikacji z interfejsem Cloud Vision API. Repozytorium functions-samples
zawiera przykład, którego możesz użyć.
Domyślnie dostęp do Cloud Vision API za pomocą tej funkcji umożliwi dostęp do Cloud Vision API tylko uwierzytelnionym użytkownikom Twojej aplikacji. Możesz modyfikować funkcję do różnych wymagań.
Aby wdrożyć funkcję:
- Sklonuj lub pobierz repozytorium functions-samples i przejdź do katalogu
vision-annotate-image
:git clone https://github.com/firebase/functions-samples
cd vision-annotate-image
- Zainstaluj zależności:
cd functions
npm install
cd ..
- Jeśli nie masz interfejsu wiersza polecenia Firebase, zainstaluj go .
- Zainicjuj projekt Firebase w katalogu
vision-annotate-image
. Po wyświetleniu monitu wybierz swój projekt z listy.firebase init
- Wdróż funkcję:
firebase deploy --only functions:annotateImage
Dodaj uwierzytelnianie Firebase do swojej aplikacji
Wdrożona powyżej funkcja wywoływalna odrzuci wszelkie żądania od nieuwierzytelnionych użytkowników Twojej aplikacji. Jeśli jeszcze tego nie zrobiłeś, musisz dodać Firebase Auth do swojej aplikacji.
Dodaj niezbędne zależności do swojej aplikacji
Użyj Menedżera pakietów Swift, aby zainstalować bibliotekę Cloud Functions dla Firebase.
Teraz jesteś gotowy do oznaczania obrazów.
1. Przygotuj obraz wejściowy
Aby można było wywołać Cloud Vision, obraz musi być sformatowany jako ciąg znaków zakodowany w base64. Aby przetworzyćUIImage
:Szybki
guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return } let base64encodedImage = imageData.base64EncodedString()
Cel C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
2. Wywołaj funkcję callable, aby oznaczyć obraz
Aby oznaczyć obiekty na obrazie etykietami, wywołaj wywoływalną funkcję przekazującą żądanie JSON Cloud Vision .Najpierw zainicjuj instancję Cloud Functions:
Szybki
lazy var functions = Functions.functions()
Cel C
@property(strong, nonatomic) FIRFunctions *functions;
Utwórz żądanie z typem ustawionym na
LABEL_DETECTION
:Szybki
let requestData = [ "image": ["content": base64encodedImage], "features": ["maxResults": 5, "type": "LABEL_DETECTION"] ]
Cel C
NSDictionary *requestData = @{ @"image": @{@"content": base64encodedImage}, @"features": @{@"maxResults": @5, @"type": @"LABEL_DETECTION"} };
Na koniec wywołaj funkcję:
Szybki
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 succesfully }
Cel 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. Uzyskaj informacje o oznaczonych obiektach
Jeśli operacja oznaczania obrazu zakończy się pomyślnie, w wyniku zadania zostanie zwrócona odpowiedź JSON BatchAnnotateImagesResponse . Każdy obiekt w tablicylabelAnnotations
reprezentuje coś, co zostało oznaczone na obrazie. Dla każdej etykiety możesz uzyskać opis tekstowy etykiety, jej identyfikator jednostki Grafu wiedzy (jeśli jest dostępny) oraz poziom ufności dopasowania. Na przykład: Szybki
if let labelArray = (result?.data as? [String: Any])?["labelAnnotations"] as? [[String:Any]] {
for labelObj in labelArray {
let text = labelObj["description"]
let entityId = labelObj["mid"]
let confidence = labelObj["score"]
}
}
Cel C
NSArray *labelArray = result.data[@"labelAnnotations"];
for (NSDictionary *labelObj in labelArray) {
NSString *text = labelObj[@"description"];
NSString *entityId = labelObj[@"mid"];
NSNumber *confidence = labelObj[@"score"];
}