Birçok kullanıcı, yeni bir Android kurulumu yaparken kendi kimlik bilgilerini yönetmeye devam ediyor. olanak tanır. Bu manuel işlem zor olabilir ve genellikle kötü performansla sonuçlanır en iyi uygulamaları paylaşacağız. Block Store API, Google Play tarafından desteklenen bir kitaplıktır hizmetlerini kullanıma sunulan bir hizmet sağlayıcı olarak, bu sorunu çözmek için uygulamaların kaydetmeyle ilişkili karmaşıklık veya güvenlik riski olmayan kullanıcı kimlik bilgileri kullanıcı şifreleri.
Block Store API, uygulamanızın daha sonra depolayabileceği verileri depolamasına olanak tanır yeni bir cihazda kullanıcıların kimliğini yeniden doğrulamak için kullanılır. Bu sayede, kullanıcılara sorunsuz bir deneyim sunar. Bunun için kullanıcıların oturum açma ekranı gerekmez. ilk kez başlattığınızda bunu yapmanız gerektiği anlamına gelir.
Blok Mağaza'yı kullanmanın avantajları şunlardır:
- Geliştiriciler için şifrelenmiş kimlik bilgisi depolama çözümü. Kimlik bilgileri: uçtan uca şifrelemelidir.
- Kullanıcı adları ve şifreler yerine jetonları kaydedin.
- Oturum açma akışlarındaki zorlukları ortadan kaldırın.
- Kullanıcıları karmaşık şifreleri yönetme zahmetinden kurtarın.
- Google, kullanıcının kimliğini doğrular.
Başlamadan önce
Uygulamanızı hazırlamak için aşağıdaki bölümlerde yer alan adımları tamamlayın.
Uygulamanızı yapılandırma
Proje düzeyindeki build.gradle
dosyanıza Google'ın Maven değerini ekleyin
deponuzu hem buildscript
hem de
ve allprojects
bölüm:
buildscript {
repositories {
google()
mavenCentral()
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
Google Play Hizmetleri'ni ekleyin
modülün Gradle derleme dosyasını destekler.
ve genellikle app/build.gradle
:
dependencies {
implementation 'com.google.android.gms:play-services-auth-blockstore:16.4.0'
}
İşleyiş şekli
Blok Mağazası, geliştiricilerin 16 bayta kadar diziyi kaydetmesine ve geri yüklemesine olanak tanır. Bu, geçerli kullanıcı oturumuyla ilgili önemli bilgileri kaydetmenize olanak tanır ve bu bilgileri istediğiniz gibi kaydetme esnekliği sunar. Bu veriler uçtan uca şifrelenebilir. Blok Mağazası'nı destekleyen altyapı, Yedekleme ve Geri Yükleme altyapısının üzerine kurulur.
Bu kılavuzda, bir kullanıcının jetonunun Blok Mağaza'ya kaydedilmesiyle ilgili kullanım alanı açıklanmaktadır. Aşağıdaki adımlarda, Block Store'u kullanan bir uygulamanın işleyiş şekli açıklanmaktadır:
- Uygulamanızın kimlik doğrulama akışı sırasında veya sonrasında istediğiniz zaman Kullanıcının kimlik doğrulama jetonunu, daha sonra almak üzere Blok Mağaza'ya gönderir.
- Jeton yerel olarak depolanır ve ayrıca bulutta yedeklenebilir. uçtan uca şifrelemelidir.
- Kullanıcı yeni bir cihazda geri yükleme akışı başlattığında veriler aktarılır.
- Kullanıcı, geri yükleme akışı sırasında uygulamanızı geri yüklerse uygulamanız Kayıtlı jetonu yeni cihazdaki Blok Mağazası'ndan alın.
Jetonu kaydetme
Bir kullanıcı uygulamanızda oturum açtığında, bu kullanıcı için oluşturduğunuz kimlik doğrulama jetonunu Blok Mağazası'na kaydedebilirsiniz. Bu jetonu, giriş başına maksimum 4 KB olan benzersiz bir anahtar çifti değeri kullanarak depolayabilirsiniz.
Jetonu depolamak için setBytes()
çağrısını yapın
ve setKey()
örneğinde
StoreBytesData.Builder
Kullanıcının kimlik bilgilerini kaynak cihazda depolamak için. Jetonu kaydettikten sonra
Blok Mağazası sayesinde jeton şifrelenir ve cihazda yerel olarak depolanır.
Aşağıdaki örnekte, kimlik doğrulama jetonunun yerel cihaz:
Java
BlockstoreClient client = Blockstore.getClient(this); byte[] bytes1 = new byte[] { 1, 2, 3, 4 }; // Store one data block. String key1 = "com.example.app.key1"; StoreBytesData storeRequest1 = StoreBytesData.Builder() .setBytes(bytes1) // Call this method to set the key value pair the data should be associated with. .setKeys(Arrays.asList(key1)) .build(); client.storeBytes(storeRequest1) .addOnSuccessListener(result -> Log.d(TAG, "stored " + result + " bytes")) .addOnFailureListener(e -> Log.e(TAG, "Failed to store bytes", e));
Kotlin
val client = Blockstore.getClient(this) val bytes1 = byteArrayOf(1, 2, 3, 4) // Store one data block. val key1 = "com.example.app.key1" val storeRequest1 = StoreBytesData.Builder() .setBytes(bytes1) // Call this method to set the key value with which the data should be associated with. .setKeys(Arrays.asList(key1)) .build() client.storeBytes(storeRequest1) .addOnSuccessListener { result: Int -> Log.d(TAG, "Stored $result bytes") } .addOnFailureListener { e -> Log.e(TAG, "Failed to store bytes", e) }
Varsayılan jetonu kullan
Anahtar olmadan StoreBytes kullanılarak kaydedilen veriler, varsayılan BlockstoreClient anahtarını kullanır.DEFAULT_BYTES_DATA_KEY.
Java
BlockstoreClient client = Blockstore.getClient(this); // The default key BlockstoreClient.DEFAULT_BYTES_DATA_KEY. byte[] bytes = new byte[] { 9, 10 }; StoreBytesData storeRequest = StoreBytesData.Builder() .setBytes(bytes) .build(); client.storeBytes(storeRequest) .addOnSuccessListener(result -> Log.d(TAG, "stored " + result + " bytes")) .addOnFailureListener(e -> Log.e(TAG, "Failed to store bytes", e));
Kotlin
val client = Blockstore.getClient(this); // the default key BlockstoreClient.DEFAULT_BYTES_DATA_KEY. val bytes = byteArrayOf(1, 2, 3, 4) val storeRequest = StoreBytesData.Builder() .setBytes(bytes) .build(); client.storeBytes(storeRequest) .addOnSuccessListener { result: Int -> Log.d(TAG, "stored $result bytes") } .addOnFailureListener { e -> Log.e(TAG, "Failed to store bytes", e) }
Jeton alınıyor
Daha sonra, kullanıcı yeni bir
Google Play Hizmetleri önce kullanıcıyı doğrular, ardından Engelleme
Verileri depolayın. Kullanıcı, şu uygulamanın bir parçası olarak uygulama verilerinizi geri yüklemeyi zaten kabul etti:
geri yükleme iş akışını takip edeceğinden ek izinler gerekmez. Kullanıcı açıldığında
almak istiyorsanız
retrieveBytes()
.
Alınan jeton, daha sonra kullanıcının yeni
olanak tanır.
Aşağıdaki örnekte, belirli anahtarlara göre birden fazla jetonun nasıl alınacağı gösterilmektedir.
Java
BlockstoreClient client = Blockstore.getClient(this); // Retrieve data associated with certain keys. String key1 = "com.example.app.key1"; String key2 = "com.example.app.key2"; String key3 = BlockstoreClient.DEFAULT_BYTES_DATA_KEY; // Used to retrieve data stored without a key ListrequestedKeys = Arrays.asList(key1, key2, key3); // Add keys to array RetrieveBytesRequest retrieveRequest = new RetrieveBytesRequest.Builder() .setKeys(requestedKeys) .build(); client.retrieveBytes(retrieveRequest) .addOnSuccessListener( result -> { Map<String, BlockstoreData> blockstoreDataMap = result.getBlockstoreDataMap(); for (Map.Entry<String, BlockstoreData> entry : blockstoreDataMap.entrySet()) { Log.d(TAG, String.format( "Retrieved bytes %s associated with key %s.", new String(entry.getValue().getBytes()), entry.getKey())); } }) .addOnFailureListener(e -> Log.e(TAG, "Failed to store bytes", e));
Kotlin
val client = Blockstore.getClient(this) // Retrieve data associated with certain keys. val key1 = "com.example.app.key1" val key2 = "com.example.app.key2" val key3 = BlockstoreClient.DEFAULT_BYTES_DATA_KEY // Used to retrieve data stored without a key val requestedKeys = Arrays.asList(key1, key2, key3) // Add keys to array val retrieveRequest = RetrieveBytesRequest.Builder() .setKeys(requestedKeys) .build() client.retrieveBytes(retrieveRequest) .addOnSuccessListener { result: RetrieveBytesResponse -> val blockstoreDataMap = result.blockstoreDataMap for ((key, value) in blockstoreDataMap) { Log.d(ContentValues.TAG, String.format( "Retrieved bytes %s associated with key %s.", String(value.bytes), key)) } } .addOnFailureListener { e: Exception? -> Log.e(ContentValues.TAG, "Failed to store bytes", e) }
Tüm jetonlar alınıyor.
Aşağıda, BlockStore'a kaydedilen tüm jetonların nasıl alınacağına dair bir örnek verilmiştir.
Java
BlockstoreClient client = Blockstore.getClient(this) // Retrieve all data. RetrieveBytesRequest retrieveRequest = new RetrieveBytesRequest.Builder() .setRetrieveAll(true) .build(); client.retrieveBytes(retrieveRequest) .addOnSuccessListener( result -> { Map<String, BlockstoreData> blockstoreDataMap = result.getBlockstoreDataMap(); for (Map.Entry<String, BlockstoreData> entry : blockstoreDataMap.entrySet()) { Log.d(TAG, String.format( "Retrieved bytes %s associated with key %s.", new String(entry.getValue().getBytes()), entry.getKey())); } }) .addOnFailureListener(e -> Log.e(TAG, "Failed to store bytes", e));
Kotlin
val client = Blockstore.getClient(this) val retrieveRequest = RetrieveBytesRequest.Builder() .setRetrieveAll(true) .build() client.retrieveBytes(retrieveRequest) .addOnSuccessListener { result: RetrieveBytesResponse -> val blockstoreDataMap = result.blockstoreDataMap for ((key, value) in blockstoreDataMap) { Log.d(ContentValues.TAG, String.format( "Retrieved bytes %s associated with key %s.", String(value.bytes), key)) } } .addOnFailureListener { e: Exception? -> Log.e(ContentValues.TAG, "Failed to store bytes", e) }
Aşağıda, varsayılan anahtarın nasıl alınacağıyla ilgili bir örnek verilmiştir.
Java
BlockStoreClient client = Blockstore.getClient(this); RetrieveBytesRequest retrieveRequest = new RetrieveBytesRequest.Builder() .setKeys(Arrays.asList(BlockstoreClient.DEFAULT_BYTES_DATA_KEY)) .build(); client.retrieveBytes(retrieveRequest);
Kotlin
val client = Blockstore.getClient(this) val retrieveRequest = RetrieveBytesRequest.Builder() .setKeys(Arrays.asList(BlockstoreClient.DEFAULT_BYTES_DATA_KEY)) .build() client.retrieveBytes(retrieveRequest)
Jetonlar siliniyor
Jetonların BlockStore'dan silinmesi aşağıdaki nedenlerden dolayı gerekebilir:
- Kullanıcı, kullanıcı oturumunu kapatma işleminden geçiyor.
- Jeton iptal edilmiş veya geçersiz.
Jetonları almaya benzer şekilde, silme gerektiren bir anahtar dizisi ayarlayarak hangi jetonların silinmesi gerektiğini belirtebilirsiniz.
Aşağıda, belirli anahtarları silmeyle ilgili bir örnek verilmiştir.
Java
BlockstoreClient client = Blockstore.getClient(this); // Delete data associated with certain keys. String key1 = "com.example.app.key1"; String key2 = "com.example.app.key2"; String key3 = BlockstoreClient.DEFAULT_BYTES_DATA_KEY; // Used to delete data stored without key ListrequestedKeys = Arrays.asList(key1, key2, key3) // Add keys to array DeleteBytesRequest deleteRequest = new DeleteBytesRequest.Builder() .setKeys(requestedKeys) .build(); client.deleteBytes(deleteRequest)
Kotlin
val client = Blockstore.getClient(this) // Retrieve data associated with certain keys. val key1 = "com.example.app.key1" val key2 = "com.example.app.key2" val key3 = BlockstoreClient.DEFAULT_BYTES_DATA_KEY // Used to retrieve data stored without a key val requestedKeys = Arrays.asList(key1, key2, key3) // Add keys to array val retrieveRequest = DeleteBytesRequest.Builder() .setKeys(requestedKeys) .build() client.deleteBytes(retrieveRequest)
Tüm Jetonları Sil
Aşağıdaki örnek, şu anda BlockStore'a kayıtlı olan tüm jetonları siler:
Java
// Delete all data. DeleteBytesRequest deleteAllRequest = new DeleteBytesRequest.Builder() .setDeleteAll(true) .build(); client.deleteBytes(deleteAllRequest) .addOnSuccessListener(result -> Log.d(TAG, "Any data found and deleted? " + result));
Kotlin
val deleteAllRequest = DeleteBytesRequest.Builder() .setDeleteAll(true) .build() client.deleteBytes(deleteAllRequest) .addOnSuccessListener { result: Boolean -> Log.d(TAG, "Any data found and deleted? $result") }
Uçtan uca şifreleme
Uçtan uca şifrelemenin kullanılabilmesi için cihazın
Android 9 veya sonraki bir sürümü çalıştıran ve kullanıcının bir ekran kilidi ayarlamış olması gerekir
(PIN, desen veya şifre). Şifrelemenin
cihaza isEndToEndEncryptionAvailable()
numaralı telefondan ulaşabilirsiniz.
Aşağıdaki örnekte, şifrelemenin bulut yedekleme:
client.isEndToEndEncryptionAvailable()
.addOnSuccessListener { result ->
Log.d(TAG, "Will Block Store cloud backup be end-to-end encrypted? $result")
}
Bulut yedeklemeyi etkinleştir
Bulut yedeklemeyi etkinleştirmek için
setShouldBackupToCloud()
yöntemini
StoreBytesData
nesnesini tanımlayın. Block Store, aşağıdaki durumlarda depolanan baytları düzenli olarak buluta yedekler:
setShouldBackupToCloud()
doğru olarak ayarlandı.
Aşağıdaki örnekte, bulut yedeklemenin yalnızca bulut yedekleme olduğunda nasıl etkinleştirileceği gösterilmektedir uçtan uca şifrelenmiştir:
val client = Blockstore.getClient(this)
val storeBytesDataBuilder = StoreBytesData.Builder()
.setBytes(/* BYTE_ARRAY */)
client.isEndToEndEncryptionAvailable()
.addOnSuccessListener { isE2EEAvailable ->
if (isE2EEAvailable) {
storeBytesDataBuilder.setShouldBackupToCloud(true)
Log.d(TAG, "E2EE is available, enable backing up bytes to the cloud.")
client.storeBytes(storeBytesDataBuilder.build())
.addOnSuccessListener { result ->
Log.d(TAG, "stored: ${result.getBytesStored()}")
}.addOnFailureListener { e ->
Log.e(TAG, “Failed to store bytes”, e)
}
} else {
Log.d(TAG, "E2EE is not available, only store bytes for D2D restore.")
}
}
Nasıl test edilir?
Geri yüklemeyi test etmek için geliştirme sırasında aşağıdaki yöntemleri kullanın akış gösterir.
Aynı cihazı kaldırma/yeniden yükleme
Kullanıcı, Yedekleme hizmetlerini etkinleştirirse (Ayarlar > Google > Yedekleme'den kontrol edilebilir), Blok Mağaza verileri veya yeniden yükleme işlemi boyunca devam ettiği anlamına gelir.
Test etmek için şu adımları uygulayabilirsiniz:
- BlockStore API'yi test uygulamanıza entegre edin.
- Verilerinizi depolamak için BlockStore API'yi çağırmak amacıyla test uygulamasını kullanın.
- Test uygulamanızı kaldırıp aynı cihaza yeniden yükleyin.
- Verilerinizi almak üzere BlockStore API'yi çağırmak için test uygulamasını kullanın.
- Alınan baytların daha önce depolananlarla aynı olduğunu doğrulayın. kaldırma işlemi dahildir.
Cihazdan cihaza
Çoğu durumda, bunun için hedef cihazın fabrika ayarlarına sıfırlanması gerekir. Şunları yapabilirsiniz: ardından Android kablosuz geri yükleme akışına girin. veya Google kablo geri yükleme (desteklenen cihazlar için) başlıklı makaleyi inceleyin.
Bulutta geri yükleme
- Blockstore API'yi test uygulamanıza entegre edin. Test uygulamasının Google Play Store'a gönderilir.
- Kaynak cihazda test uygulamasını kullanarak gerçek değerine ayarlanmış olması gerekir.
- O ve üstü cihazlarda, Blok Deposu bulut yedeklemesini manuel olarak tetikleyebilirsiniz:
Ayarlar > Google > Yedekle'yi tıklayarak "Şimdi Yedekle" düğmesini tıklayın.
- Block Store bulut yedeklemesinin başarılı olduğunu doğrulamak için şunları yapabilirsiniz:
- Yedekleme tamamlandıktan sonra, etiketli günlük satırlarını arayın "CloudSyncBpTkSvc".
- Şuna benzer satırlar göreceksiniz: “......, CloudSyncBpTkSvc: Sync sonuç: BAŞARILI, ..., yüklenen boyut: XXX bayt ...”
- Blok Mağazası bulut yedekleme işleminden sonra 5 dakikalık bir "soğuma" süresi olur. Bu 5 dakika içinde "Şimdi Yedekle" düğmesinin tıklanması başka bir Block Store bulut yedeklemesi içerir.
- Block Store bulut yedeklemesinin başarılı olduğunu doğrulamak için şunları yapabilirsiniz:
- Hedef cihazı fabrika ayarlarına sıfırlayın ve bulut geri yükleme akışından geçin. Seç geri yükleme akışı sırasında test uygulamanızı geri yükleyin. Daha fazla bilgi için Desteklenen bulut geri yükleme akışları başlıklı makaleyi inceleyin.
- Hedef cihazda test uygulamasını kullanarak Blockstore API'yi çağırarak şunları yapabilirsiniz: verilerinizi alabilirsiniz.
- Alınan baytların kaynak cihaz.
Cihaz Gereksinimleri
Uçtan Uca Şifreleme
- Uçtan uca şifreleme, Android 9 (API 29) ve sonraki sürümleri çalıştıran cihazlarda desteklenir.
- Uçtan uca şifrelemenin etkinleştirilmesi ve kullanıcı verilerinin doğru şekilde şifrelenebilmesi için cihazda PIN, desen veya şifre ile ekran kilidi ayarlanmış olmalıdır.
Cihazdan Cihaza Geri Yükleme Akışı
Cihazlardan cihaza geri yükleme için bir kaynak ve hedef cihaz kullanmanız gerekir. Bunlar, veri aktaran iki cihaz olacaktır.
Yedekleme için kaynak cihazlarda Android 6 (API 23) veya sonraki sürümlerin yüklü olması gerekir.
Geri yükleme özelliğine sahip olmak için Android 9 (API 29) ve sonraki sürümleri çalıştıran cihazları hedefleyin.
Cihazdan cihaza geri yükleme akışı hakkında daha fazla bilgiyi burada bulabilirsiniz.
Bulut Yedekleme ve Geri Yükleme Akışı
Bulutta yedekleme ve geri yükleme için bir kaynak cihaz ve bir hedef cihaz gerekir.
Yedekleme için kaynak cihazlarda Android 6 (API 23) veya sonraki sürümlerin yüklü olması gerekir.
Hedef cihazlar, tedarikçilerine göre desteklenir. Pixel cihazlar, Android 9'dan (API 29) bu özelliği kullanabilir. Diğer tüm cihazların Android 12 (API 31) veya sonraki sürümleri çalıştırması gerekir.