Untuk memanggil Google Cloud API dari aplikasi, Anda perlu membuat REST API perantara yang menangani otorisasi dan melindungi nilai rahasia seperti kunci API. Anda kemudian perlu menulis kode di aplikasi seluler untuk mengautentikasi dan berkomunikasi dengan layanan perantara ini.
Salah satu cara untuk membuat REST API ini adalah dengan menggunakan Firebase Authentication and Functions, yang memberi Anda gerbang terkelola tanpa server ke Google Cloud API yang menangani autentikasi dan dapat dipanggil dari aplikasi seluler Anda dengan SDK bawaan.
Panduan ini menunjukkan cara menggunakan teknik ini untuk memanggil Cloud Vision API dari aplikasi Anda. Metode ini akan memungkinkan semua pengguna yang diautentikasi untuk mengakses layanan yang ditagih Cloud Vision melalui project Cloud Anda, jadi pertimbangkan apakah mekanisme autentikasi ini memadai untuk kasus penggunaan Anda sebelum melanjutkan.
Sebelum kamu memulai
Konfigurasikan proyek Anda
Jika Anda belum menambahkan Firebase ke aplikasi Anda, lakukan dengan mengikuti langkah-langkah di panduan memulai .Gunakan Swift Package Manager untuk menginstal dan mengelola dependensi Firebase.
- Di Xcode, dengan proyek aplikasi Anda terbuka, arahkan ke File > Add Packages .
- Saat diminta, tambahkan repositori SDK platform Apple Firebase:
- Pilih pustaka Firebase ML.
- Setelah selesai, Xcode akan secara otomatis mulai menyelesaikan dan mengunduh dependensi Anda di latar belakang.
https://github.com/firebase/firebase-ios-sdk
Selanjutnya, lakukan beberapa penyiapan dalam aplikasi:
- Di aplikasi Anda, impor Firebase:
Cepat
import FirebaseMLModelDownloader
Objective-C
@import FirebaseMLModelDownloader;
Beberapa langkah konfigurasi lagi, dan kami siap untuk pergi:
Jika Anda belum mengaktifkan API berbasis Cloud untuk proyek Anda, lakukan sekarang:
- Buka halaman API Firebase ML dari konsol Firebase.
Jika Anda belum mengupgrade proyek Anda ke paket harga Blaze, klik Upgrade untuk melakukannya. (Anda akan diminta untuk memutakhirkan hanya jika proyek Anda tidak termasuk dalam paket Blaze.)
Hanya project level Blaze yang dapat menggunakan API berbasis Cloud.
- Jika API berbasis Cloud belum diaktifkan, klik Aktifkan API berbasis Cloud .
- Konfigurasikan kunci Firebase API yang ada untuk melarang akses ke Cloud Vision API:
- Buka halaman Kredensial konsol Cloud.
- Untuk setiap kunci API dalam daftar, buka tampilan pengeditan, dan di bagian Pembatasan Kunci, tambahkan semua API yang tersedia kecuali Cloud Vision API ke daftar.
Terapkan fungsi yang dapat dipanggil
Selanjutnya, terapkan Cloud Function yang akan Anda gunakan untuk menjembatani aplikasi Anda dan Cloud Vision API. Repositori functions-samples
berisi contoh yang dapat Anda gunakan.
Secara default, mengakses Cloud Vision API melalui fungsi ini hanya akan mengizinkan pengguna aplikasi Anda yang diautentikasi untuk mengakses Cloud Vision API. Anda dapat memodifikasi fungsi untuk kebutuhan yang berbeda.
Untuk menerapkan fungsi:
- Kloning atau unduh repo sampel fungsi dan ubah ke direktori
vision-annotate-image
:git clone https://github.com/firebase/functions-samples
cd vision-annotate-image
- Instal dependensi:
cd functions
npm install
cd ..
- Jika Anda tidak memiliki Firebase CLI, pasanglah .
- Inisialisasi proyek Firebase di direktori
vision-annotate-image
. Saat diminta, pilih proyek Anda dalam daftar.firebase init
- Menyebarkan fungsi:
firebase deploy --only functions:annotateImage
Tambahkan Firebase Auth ke aplikasi Anda
Fungsi callable yang diterapkan di atas akan menolak permintaan apa pun dari pengguna aplikasi Anda yang tidak diautentikasi. Jika Anda belum melakukannya, Anda perlu menambahkan Firebase Auth ke aplikasi Anda.
Tambahkan dependensi yang diperlukan ke aplikasi Anda
Gunakan Swift Package Manager untuk menginstal library Cloud Functions for Firebase.
1. Siapkan gambar masukan
Untuk memanggil Cloud Vision, gambar harus diformat sebagai string berenkode base64. Untuk memprosesUIImage
:Cepat
guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return } let base64encodedImage = imageData.base64EncodedString()
Objective-C
NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f); NSString *base64encodedImage = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
2. Aktifkan fungsi callable untuk mengenali landmark
Untuk mengenali bangunan terkenal dalam gambar, aktifkan fungsi callable yang meneruskan permintaan JSON Cloud Vision .Pertama, lakukan inisialisasi instance Cloud Functions:
Cepat
lazy var functions = Functions.functions()
Objective-C
@property(strong, nonatomic) FIRFunctions *functions;
Buat permintaan dengan Type diatur ke
LANDMARK_DETECTION
:Cepat
let requestData = [ "image": ["content": base64encodedImage], "features": ["maxResults": 5, "type": "LANDMARK_DETECTION"] ]
Objective-C
NSDictionary *requestData = @{ @"image": @{@"content": base64encodedImage}, @"features": @{@"maxResults": @5, @"type": @"LANDMARK_DETECTION"} };
Terakhir, aktifkan fungsi:
Cepat
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 }
Objective-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. Dapatkan informasi tentang landmark yang dikenali
Jika operasi pengenalan landmark berhasil, respons JSON dari BatchAnnotateImagesResponse akan dikembalikan dalam hasil tugas. Setiap objek dalam larik landmarkAnnotations
mewakili tengara yang dikenali dalam gambar. Untuk setiap bangunan terkenal, Anda bisa mendapatkan koordinat pembatasnya di gambar input, nama bangunan terkenal, lintang dan bujurnya, ID entitas Grafik Pengetahuannya (jika tersedia), dan skor keyakinan kecocokan. Sebagai contoh:
Cepat
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"]
}
}
}
Objective-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"];
}
}