Ayrıştırma Android Uygulamanızı Firebase'e taşıyın

Alternatif bir Hizmet Olarak Arka Uç çözümü arayan bir Ayrıştırma kullanıcısıysanız Firebase, Android uygulamanız için ideal seçim olabilir.

Bu kılavuzda belirli hizmetlerin uygulamanıza nasıl entegre edileceği açıklanmaktadır. Temel Firebase kurulum talimatları için Android Kurulum kılavuzuna bakın.

Google Analytics

Google Analytics, uygulama kullanımı ve kullanıcı etkileşimi hakkında bilgi sağlayan ücretsiz bir uygulama ölçüm çözümüdür. Analytics, Firebase özellikleriyle entegre olur ve Firebase SDK'yı kullanarak tanımlayabileceğiniz 500'e kadar farklı etkinlik için sınırsız raporlama sağlar.

Daha fazla bilgi edinmek için Google Analytics belgelerine bakın.

Önerilen Geçiş Stratejisi

Farklı analiz sağlayıcılarını kullanmak, Google Analytics için kolaylıkla geçerli olan yaygın bir senaryodur. Analytics'in otomatik olarak topladığı etkinliklerden ve kullanıcı özelliklerinden (ilk açılış, uygulama güncellemesi, cihaz modeli, yaş gibi) yararlanmak için bunu uygulamanıza eklemeniz yeterli.

Özel etkinlikler ve kullanıcı mülkleri için, olayları ve özellikleri günlüğe kaydetmek için hem Ayrıştırma Analytics'i hem de Google Analytics'i kullanarak çift yazma stratejisi kullanabilirsiniz; bu, yeni çözümü kademeli olarak kullanıma sunmanıza olanak tanır.

Kod Karşılaştırması

Analitikleri Ayrıştırma

// Start collecting data
ParseAnalytics.trackAppOpenedInBackground(getIntent());

Map<String, String> dimensions = new HashMap<String, String>();
// Define ranges to bucket data points into meaningful segments
dimensions.put("priceRange", "1000-1500");
// Did the user filter the query?
dimensions.put("source", "craigslist");
// Do searches happen more often on weekdays or weekends?
dimensions.put("dayType", "weekday");

// Send the dimensions to Parse along with the 'search' event
ParseAnalytics.trackEvent("search", dimensions);

Google Analytics

// Obtain the FirebaseAnalytics instance and start collecting data
mFirebaseAnalytics = FirebaseAnalytics.getInstance(this);

Bundle params = new Bundle();
// Define ranges to bucket data points into meaningful segments
params.putString("priceRange", "1000-1500");
// Did the user filter the query?
params.putString("source", "craigslist");
// Do searches happen more often on weekdays or weekends?
params.putString("dayType", "weekday");

// Send the event
mFirebaseAnalytics.logEvent("search", params);

Firebase Gerçek Zamanlı Veritabanı

Firebase Gerçek Zamanlı Veritabanı, NoSQL bulutta barındırılan bir veritabanıdır. Veriler JSON olarak depolanır ve bağlı her istemciyle gerçek zamanlı olarak senkronize edilir.

Daha fazla bilgi edinmek için Firebase Gerçek Zamanlı Veritabanı belgelerine bakın.

Ayrıştırma Verileriyle Farklılıklar

Nesneler

Parse'da, JSON uyumlu verilerin anahtar/değer çiftlerini içeren bir ParseObject veya onun bir alt sınıfını saklarsınız. Veriler şemasızdır; bu, her ParseObject üzerinde hangi anahtarların bulunduğunu belirtmenize gerek olmadığı anlamına gelir.

Tüm Firebase Gerçek Zamanlı Veritabanı verileri JSON nesneleri olarak depolanır ve ParseObject eşdeğeri yoktur; mevcut JSON türlerine karşılık gelen türlerin JSON ağacı değerlerini yazmanız yeterlidir. Veritabanından okuma ve yazmayı kolaylaştırmak için Java nesnelerini kullanabilirsiniz.

Aşağıda bir oyun için yüksek puanları nasıl kaydedebileceğinize dair bir örnek verilmiştir.

Ayrıştırma
@ParseClassName("GameScore")
public class GameScore {
        public GameScore() {}
        public GameScore(Long score, String playerName, Boolean cheatMode) {
            setScore(score);
            setPlayerName(playerName);
            setCheatMode(cheatMode);
        }

        public void setScore(Long score) {
            set("score", score);
        }

        public Long getScore() {
            return getLong("score");
        }

        public void setPlayerName(String playerName) {
            set("playerName", playerName);
        }

        public String getPlayerName() {
            return getString("playerName");
        }

        public void setCheatMode(Boolean cheatMode) {
            return set("cheatMode", cheatMode);
        }

        public Boolean getCheatMode() {
            return getBoolean("cheatMode");
        }
}

// Must call Parse.registerSubclass(GameScore.class) in Application.onCreate
GameScore gameScore = new GameScore(1337, "Sean Plott", false);
gameScore.saveInBackground();
Firebase
// Assuming we defined the GameScore class as:
public class GameScore {
        private Long score;
        private String playerName;
        private Boolean cheatMode;

        public GameScore() {}
        public GameScore(Long score, String playerName, Boolean cheatMode) {
            this.score = score;
            this.playerName = playerName;
            this.cheatMode = cheatMode;
        }

        public Long getScore() {
            return score;
        }

        public String getPlayerName() {
            return playerName;
        }

        public Boolean getCheatMode() {
            return cheatMode;
        }
}

// We would save it to our list of high scores as follows:
DatabaseReference mFirebaseRef = FirebaseDatabase.getInstance().getReference();
GameScore score = new GameScore(1337, "Sean Plott", false);
mFirebaseRef.child("scores").push().setValue(score);
Daha fazla ayrıntı için Android'de Veri Okuma ve Yazma kılavuzuna bakın.

Veriler Arasındaki İlişkiler

Bir ParseObject başka bir ParseObject ile ilişkisi olabilir: herhangi bir nesne diğer nesneleri değer olarak kullanabilir.

Firebase Gerçek Zamanlı Veritabanında ilişkiler, verileri ayrı yollara bölen düz veri yapıları kullanılarak daha iyi ifade edilir, böylece ayrı çağrılarda verimli bir şekilde indirilebilirler.

Aşağıda, bir blog uygulamasındaki gönderiler ile bunların yazarları arasındaki ilişkiyi nasıl yapılandırabileceğinize dair bir örnek verilmiştir.

Ayrıştırma
// Create the author
ParseObject myAuthor = new ParseObject("Author");
myAuthor.put("name", "Grace Hopper");
myAuthor.put("birthDate", "December 9, 1906");
myAuthor.put("nickname", "Amazing Grace");

// Create the post
ParseObject myPost = new ParseObject("Post");
myPost.put("title", "Announcing COBOL, a New Programming Language");

// Add a relation between the Post and the Author
myPost.put("parent", myAuthor);

// This will save both myAuthor and myPost
myPost.saveInBackground();
Firebase
DatabaseReference firebaseRef = FirebaseDatabase.getInstance().getReference();
// Create the author
Map<String, String> myAuthor = new HashMap<String, String>();
myAuthor.put("name", "Grace Hopper");
myAuthor.put("birthDate", "December 9, 1906");
myAuthor.put("nickname", "Amazing Grace");

// Save the author
String myAuthorKey = "ghopper";
firebaseRef.child('authors').child(myAuthorKey).setValue(myAuthor);

// Create the post
Map<String, String> post = new HashMap<String, String>();
post.put("author", myAuthorKey);
post.put("title", "Announcing COBOL, a New Programming Language");
firebaseRef.child('posts').push().setValue(post);

Sonuç olarak aşağıdaki veri düzeni ortaya çıkar.

{
  // Info about the authors
  "authors": {
    "ghopper": {
      "name": "Grace Hopper",
      "date_of_birth": "December 9, 1906",
      "nickname": "Amazing Grace"
    },
    ...
  },
  // Info about the posts: the "author" fields contains the key for the author
  "posts": {
    "-JRHTHaIs-jNPLXOQivY": {
      "author": "ghopper",
      "title": "Announcing COBOL, a New Programming Language"
    }
    ...
  }
}
Daha fazla ayrıntı için Veritabanınızı Yapılandırın kılavuzunu kontrol edin.

Veri Okuma

Ayrıştırma'da, belirli bir Ayrıştırma nesnesinin kimliğini kullanarak veya ParseQuery kullanarak sorguları yürüterek verileri okursunuz.

Firebase'de, bir veritabanı referansına eşzamansız bir dinleyici ekleyerek verileri alırsınız. Dinleyici, verinin başlangıç ​​durumu için bir kez ve veri değiştiğinde tekrar tetiklenir; böylece verinin değişip değişmediğini belirlemek için herhangi bir kod eklemenize gerek kalmaz.

Aşağıda , "Nesneler" bölümünde sunulan örneğe dayanarak, belirli bir oyuncunun puanlarını nasıl alabileceğinize dair bir örnek verilmiştir.

Ayrıştırma
ParseQuery<ParseObject> query = ParseQuery.getQuery("GameScore");
query.whereEqualTo("playerName", "Dan Stemkoski");
query.findInBackground(new FindCallback<ParseObject>() {
    public void done(List<ParseObject> scoreList, ParseException e) {
        if (e == null) {
            for (ParseObject score: scoreList) {
                Log.d("score", "Retrieved: " + Long.toString(score.getLong("score")));
            }
        } else {
            Log.d("score", "Error: " + e.getMessage());
        }
    }
});
Firebase
DatabaseReference mFirebaseRef = FirebaseDatabase.getInstance().getReference();
Query mQueryRef = mFirebaseRef.child("scores").orderByChild("playerName").equalTo("Dan Stemkoski");

// This type of listener is not one time, and you need to cancel it to stop
// receiving updates.
mQueryRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot snapshot, String previousChild) {
        // This will fire for each matching child node.
        GameScore score = snapshot.getValue(GameScore.class);
        Log.d("score", "Retrieved: " + Long.toString(score.getScore());
    }
});
Mevcut olay dinleyicisi türleri ve verilerin nasıl sıralanıp filtreleneceği hakkında daha fazla ayrıntı için Android'de Veri Okuma ve Yazma kılavuzuna bakın.

Önerilen Geçiş Stratejisi

Verilerinizi Yeniden Düşünün

Firebase Gerçek Zamanlı Veritabanı, verileri bağlı tüm istemciler arasında milisaniyeler içinde senkronize edecek şekilde optimize edilmiştir ve ortaya çıkan veri yapısı, Parse çekirdek verilerinden farklıdır. Bu, geçişinizin ilk adımının, aşağıdakiler de dahil olmak üzere, verilerinizin gerektirdiği değişiklikleri dikkate alması gerektiği anlamına gelir:

  • Ayrıştırma nesneleriniz Firebase verileriyle nasıl eşlenmelidir?
  • Ebeveyn-çocuk ilişkileriniz varsa, ayrı aramalarda verimli bir şekilde indirilebilmesi için verilerinizi farklı yollara nasıl bölebilirsiniz?

Verilerinizi Taşıyın

Verilerinizi Firebase'de nasıl yapılandıracağınıza karar verdikten sonra uygulamanızın her iki veritabanına da yazması gereken süreyi nasıl yöneteceğinizi planlamanız gerekir. Seçimleriniz şunlardır:

Arka Plan Senkronizasyonu

Bu senaryoda uygulamanın iki sürümü vardır: Ayrıştırma'yı kullanan eski sürüm ve Firebase'i kullanan yeni sürüm. İki veritabanı arasındaki senkronizasyonlar, Ayrıştırma Bulut Kodu (Firebase'e Ayrıştırma) tarafından gerçekleştirilir; kodunuz Firebase'deki değişiklikleri dinler ve bu değişiklikleri Ayrıştırma ile senkronize eder. Yeni sürümü kullanmaya başlamadan önce şunları yapmanız gerekir:

  • Mevcut Ayrıştırma Verilerinizi yeni Firebase yapısına dönüştürün ve Firebase Gerçek Zamanlı Veritabanına yazın.
  • Eski istemciler tarafından Ayrıştırma Verilerinde yapılan Firebase Gerçek Zamanlı Veritabanı değişikliklerine yazmak için Firebase REST API'sini kullanan Ayrıştırma Bulut Kodu işlevlerini yazın.
  • Firebase'deki değişiklikleri dinleyen ve bunları Parse veritabanıyla senkronize eden kodu yazın ve dağıtın.

Bu senaryo, eski ve yeni kodun temiz bir şekilde ayrılmasını sağlar ve istemcilerin basit kalmasını sağlar. Bu senaryonun zorlukları, ilk dışa aktarımda büyük veri kümelerini yönetmek ve çift yönlü senkronizasyonun sonsuz yineleme oluşturmamasını sağlamaktır.

Çift Yazma

Bu senaryoda, eski istemciler tarafından Ayrıştırma Verilerinden Firebase Gerçek Zamanlı Veritabanına yapılan değişiklikleri senkronize etmek için Ayrıştırma Bulut Kodunu kullanarak uygulamanın hem Firebase hem de Ayrıştırma kullanan yeni bir sürümünü yazarsınız. Uygulamanın Yalnızca Ayrıştırma sürümünden yeterli sayıda kişi geçiş yaptığında, Ayrıştırma kodunu çift yazma sürümünden kaldırabilirsiniz.

Bu senaryo herhangi bir sunucu tarafı kodu gerektirmez. Dezavantajları ise erişilmeyen verilerin taşınmaması ve her iki SDK'nın kullanılmasıyla uygulamanızın boyutunun artmasıdır.

Firebase Kimlik Doğrulaması

Firebase Authentication, şifreleri ve Google, Facebook ve Twitter gibi popüler birleşik kimlik sağlayıcılarını kullanarak kullanıcıların kimliğini doğrulayabilir. Ayrıca, uygulamanız için tüm platformlarda tam bir kimlik doğrulama deneyimi uygulamak ve sürdürmek için gereken önemli yatırımlardan tasarruf etmenizi sağlayacak kullanıcı arayüzü kitaplıkları da sağlar.

Daha fazla bilgi edinmek için Firebase Kimlik Doğrulama belgelerine bakın.

Ayrıştırma Kimlik Doğrulaması ile Farklılıklar

Parse, kullanıcı hesabı yönetimi için gereken işlevselliği otomatik olarak yöneten ParseUser adında özel bir kullanıcı sınıfı sağlar. ParseUser , ParseObject bir alt sınıfıdır; bu, kullanıcı verilerinin Ayrıştırma Verileri'nde mevcut olduğu ve diğer herhangi bir ParseObject gibi ek alanlarla genişletilebileceği anlamına gelir.

Bir FirebaseUser , ayrı bir projenin kullanıcı veritabanında saklanan sabit bir dizi temel özelliğe (benzersiz bir kimlik, birincil e-posta adresi, bir ad ve bir fotoğraf URL'si) sahiptir; bu özellikler kullanıcı tarafından güncellenebilir. FirebaseUser nesnesine doğrudan başka özellikler ekleyemezsiniz; bunun yerine ek özellikleri Firebase Gerçek Zamanlı Veritabanınızda saklayabilirsiniz.

Aşağıda bir kullanıcıyı nasıl kaydedebileceğinize ve ek bir telefon numarası alanı ekleyebileceğinize dair bir örnek verilmiştir.

Ayrıştırma
ParseUser user = new ParseUser();
user.setUsername("my name");
user.setPassword("my pass");
user.setEmail("email@example.com");

// other fields can be set just like with ParseObject
user.put("phone", "650-253-0000");

user.signUpInBackground(new SignUpCallback() {
    public void done(ParseException e) {
        if (e == null) {
            // Hooray! Let them use the app now.
        } else {
            // Sign up didn't succeed. Look at the ParseException
            // to figure out what went wrong
        }
    }
});
Firebase
FirebaseAuth mAuth = FirebaseAuth.getInstance();

mAuth.createUserWithEmailAndPassword("email@example.com", "my pass")
    .continueWithTask(new Continuation<AuthResult, Task<Void>> {
        @Override
        public Task<Void> then(Task<AuthResult> task) {
            if (task.isSuccessful()) {
                FirebaseUser user = task.getResult().getUser();
                DatabaseReference firebaseRef = FirebaseDatabase.getInstance().getReference();
                return firebaseRef.child("users").child(user.getUid()).child("phone").setValue("650-253-0000");
            } else {
                // User creation didn't succeed. Look at the task exception
                // to figure out what went wrong
                Log.w(TAG, "signInWithEmail", task.getException());
            }
        }
    });

Önerilen Geçiş Stratejisi

Hesapları Taşı

Kullanıcı hesaplarını Parse'tan Firebase'e taşımak için kullanıcı veritabanınızı bir JSON veya CSV dosyasına aktarın, ardından Firebase CLI'nin auth:import komutunu kullanarak dosyayı Firebase projenize aktarın.

Öncelikle, kullanıcı veritabanınızı Ayrıştırma konsolundan veya şirket içinde barındırılan veritabanınızdan dışarı aktarın. Örneğin, Ayrıştırma konsolundan dışa aktarılan bir JSON dosyası aşağıdaki gibi görünebilir:

{ // Username/password user
  "bcryptPassword": "$2a$10$OBp2hxB7TaYZgKyTiY48luawlTuYAU6BqzxJfpHoJMdZmjaF4HFh6",
  "email": "user@example.com",
  "username": "testuser",
  "objectId": "abcde1234",
  ...
},
{ // Facebook user
  "authData": {
    "facebook": {
      "access_token": "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
      "expiration_date": "2017-01-02T03:04:05.006Z",
      "id": "1000000000"
    }
  },
  "username": "wXyZ987654321StUv",
  "objectId": "fghij5678",
  ...
}

Ardından dışa aktarılan dosyayı Firebase CLI'nin gerektirdiği formata dönüştürün. Ayrıştırma kullanıcılarınızın objectId Firebase kullanıcılarınızın localId olarak kullanın. Ayrıca base64, Parse'daki bcryptPassword değerlerini kodlar ve bunları passwordHash alanında kullanır. Örneğin:

{
  "users": [
    {
      "localId": "abcde1234",  // Parse objectId
      "email": "user@example.com",
      "displayName": "testuser",
      "passwordHash": "JDJhJDEwJE9CcDJoeEI3VGFZWmdLeVRpWTQ4bHVhd2xUdVlBVTZCcXp4SmZwSG9KTWRabWphRjRIRmg2",
    },
    {
      "localId": "fghij5678",  // Parse objectId
      "displayName": "wXyZ987654321StUv",
      "providerUserInfo": [
        {
          "providerId": "facebook.com",
          "rawId": "1000000000",  // Facebook ID
        }
      ]
    }
  ]
}

Son olarak, dönüştürülen dosyayı Firebase CLI ile içe aktarın ve hash algoritması olarak bcrypt'i belirtin:

firebase auth:import account_file.json --hash-algo=BCRYPT

Kullanıcı Verilerini Taşı

Kullanıcılarınız için ek veriler depoluyorsanız veri taşıma bölümünde açıklanan stratejileri kullanarak bunları Firebase Gerçek Zamanlı Veritabanına taşıyabilirsiniz. Hesap taşıma bölümünde açıklanan akışı kullanarak hesapları taşırsanız Firebase hesaplarınız, Ayrıştırma hesaplarınızla aynı kimliklere sahip olur; bu, kullanıcı kimliği tarafından anahtarlanan ilişkileri kolayca taşımanıza ve yeniden oluşturmanıza olanak tanır.

Firebase Bulut Mesajlaşma

Firebase Cloud Messaging (FCM), mesajları ve bildirimleri hiçbir ücret ödemeden güvenilir bir şekilde iletmenize olanak tanıyan platformlar arası bir mesajlaşma çözümüdür. Bildirimler oluşturucu, mobil uygulama geliştiricileri için hedeflenen kullanıcı bildirimlerine olanak tanıyan, Firebase Cloud Messaging üzerine kurulu ücretsiz bir hizmettir.

Daha fazla bilgi edinmek için Firebase Cloud Messaging belgelerine bakın.

Ayrıştırma Anlık Bildirimleriyle Farklılıklar

Bildirimler için kayıtlı bir cihaza yüklenen her Ayrıştırma uygulamasının, bildirimleri hedeflemek için gereken tüm verileri depoladığınız ilişkili bir Installation nesnesi vardır. Installation ParseUser bir alt sınıfıdır; bu, Installation örneklerinize istediğiniz ek verileri ekleyebileceğiniz anlamına gelir.

Bildirimler oluşturucusu uygulama, uygulama sürümü ve cihaz dili gibi bilgilere dayalı olarak önceden tanımlanmış kullanıcı segmentleri sağlar. Kitle oluşturmak için Google Analytics etkinliklerini ve özelliklerini kullanarak daha karmaşık kullanıcı segmentleri oluşturabilirsiniz. Daha fazla bilgi edinmek için hedef kitlenin yardım kılavuzuna bakın. Bu hedefleme bilgileri Firebase Gerçek Zamanlı Veritabanında görünmez.

Önerilen Geçiş Stratejisi

Cihaz Jetonlarını Taşıma

Yazma sırasında, Ayrıştırma Android SDK'sı, FCM kayıt belirteçlerinin eski bir sürümünü kullanıyor ve Bildirimler oluşturucusu tarafından sunulan özelliklerle uyumlu değil.

FCM SDK'sını uygulamanıza ekleyerek yeni bir jeton alabilirsiniz; ancak bu, Ayrıştırma SDK'sının bildirim almak için kullandığı belirteci geçersiz kılabilir. Bundan kaçınmak istiyorsanız, Ayrıştırma SDK'sını hem Ayrıştırma'nın gönderen kimliğini hem de gönderen kimliğinizi kullanacak şekilde ayarlayabilirsiniz. Bu şekilde, Ayrıştırma SDK'sı tarafından kullanılan belirteci geçersiz kılmazsınız, ancak Ayrıştırma projesini kapattığında bu geçici çözümün çalışmayı durduracağını unutmayın.

Kanalları FCM Konularına Taşıma

Bildirim göndermek için Ayrıştırma kanallarını kullanıyorsanız aynı yayıncı-abone modelini sağlayan FCM konularına geçiş yapabilirsiniz. Ayrıştırma'dan FCM'ye geçişi gerçekleştirmek için, Parse kanallarından aboneliğinizi iptal etmek için Ayrıştırma SDK'sını ve ilgili FCM konularına abone olmak için FCM SDK'sını kullanan uygulamanın yeni bir sürümünü yazabilirsiniz. Uygulamanın bu sürümünde, Ayrıştırma SDK'sında bildirim almayı devre dışı bırakarak aşağıdakileri uygulamanızın manifest dosyasından kaldırmalısınız:

<service android:name="com.parse.PushService" />
<receiver android:name="com.parse.ParsePushBroadcastReceiver"
  android:exported="false">
<intent-filter>
<action android:name="com.parse.push.intent.RECEIVE" />
<action android:name="com.parse.push.intent.DELETE" />
<action android:name="com.parse.push.intent.OPEN" />
</intent-filter>
</receiver>
<receiver android:name="com.parse.GcmBroadcastReceiver"
  android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />

<!--
IMPORTANT: Change "com.parse.starter" to match your app's package name.
-->
<category android:name="com.parse.starter" />
</intent-filter>
</receiver>

<!--
IMPORTANT: Change "YOUR_SENDER_ID" to your GCM Sender Id.
-->
<meta-data android:name="com.parse.push.gcm_sender_id"
  android:value="id:YOUR_SENDER_ID" />;

Örneğin, kullanıcınız "Devler" konusuna aboneyse şöyle bir şey yaparsınız:

ParsePush.unsubscribeInBackground("Giants", new SaveCallback() {
    @Override
    public void done(ParseException e) {
        if (e == null) {
            FirebaseMessaging.getInstance().subscribeToTopic("Giants");
        } else {
            // Something went wrong unsubscribing
        }
    }
});

Bu stratejiyi kullanarak hem Ayrıştırma kanalına hem de ilgili FCM konusuna mesaj göndererek hem eski hem de yeni sürümlerin kullanıcılarını destekleyebilirsiniz. Uygulamanın Yalnızca Ayrıştırma sürümünden yeterli sayıda kullanıcı geçiş yaptığında, bu sürümü kullanımdan kaldırabilir ve yalnızca FCM kullanarak göndermeye başlayabilirsiniz.

Daha fazla bilgi edinmek için FCM konuları belgelerine bakın.

Firebase Uzaktan Yapılandırması

Firebase Remote Config, kullanıcıların bir uygulama güncellemesi indirmesine gerek kalmadan uygulamanızın davranışını ve görünümünü değiştirmenize olanak tanıyan bir bulut hizmetidir. Remote Config'i kullanırken uygulamanızın davranışını ve görünümünü kontrol eden uygulama içi varsayılan değerler oluşturursunuz. Daha sonra, tüm uygulama kullanıcıları veya kullanıcı tabanınızın bölümleri için uygulama içi varsayılan değerleri geçersiz kılmak üzere Firebase konsolunu kullanabilirsiniz.

Firebase Remote Config, farklı çözümleri test etmek ve daha fazla istemciyi dinamik olarak farklı bir sağlayıcıya geçirmek istediğiniz durumlarda geçişleriniz sırasında çok yararlı olabilir. Örneğin, uygulamanızın veriler için hem Firebase'i hem de Ayrıştırma'yı kullanan bir sürümü varsa, hangi istemcilerin Firebase'den okuduğunu belirlemek için rastgele bir yüzdelik kuralı kullanabilir ve yüzdeyi kademeli olarak artırabilirsiniz.

Firebase Remote Config hakkında daha fazla bilgi edinmek için Remote Config girişine bakın.

Ayrıştırma Yapılandırmasıyla Farklılıklar

Parse config ile, Parse Config Dashboard'daki uygulamanıza anahtar/değer çiftleri ekleyebilir ve ardından istemciye ParseConfig getirebilirsiniz. Aldığınız her ParseConfig örneği her zaman değişmezdir. Gelecekte ağdan yeni bir ParseConfig aldığınızda, mevcut herhangi bir ParseConfig örneğini değiştirmeyecek, bunun yerine yeni bir tane oluşturacak ve onu getCurrentConfig() aracılığıyla kullanılabilir hale getirecektir.

Firebase Remote Config ile, Firebase konsolundan geçersiz kılabileceğiniz anahtar/değer çiftleri için uygulama içi varsayılanlar oluşturursunuz ve uygulamanızın kullanıcı deneyiminde kullanıcı tabanınızın farklı bölümlerine varyasyonlar sağlamak için kurallar ve koşulları kullanabilirsiniz. Firebase Remote Config, anahtar/değer çiftlerini uygulamanızın kullanımına sunan bir tekil sınıf uygular. Başlangıçta singleton, uygulama içinde tanımladığınız varsayılan değerleri döndürür. Uygulamanız için uygun olan herhangi bir anda sunucudan yeni bir değer kümesi alabilirsiniz; Yeni küme başarılı bir şekilde getirildikten sonra, yeni değerlerin uygulamanın kullanımına sunulması için onu ne zaman etkinleştireceğinizi seçebilirsiniz.

Önerilen Geçiş Stratejisi

Ayrıştırma yapılandırmanızın anahtar/değer çiftlerini Firebase konsoluna kopyalayıp ardından uygulamanın Firebase Remote Config kullanan yeni bir sürümünü dağıtarak Firebase Remote Config'e geçebilirsiniz.

Hem Parse Config hem de Firebase Remote Config ile denemeler yapmak istiyorsanız, yalnızca Parse sürümünden yeterli sayıda kullanıcı geçiş yapana kadar uygulamanın her iki SDK'yı da kullanan yeni bir sürümünü dağıtabilirsiniz.

Kod Karşılaştırması

Ayrıştırma

ParseConfig.getInBackground(new ConfigCallback() {
    @Override
    public void done(ParseConfig config, ParseException e) {
        if (e == null) {
            Log.d("TAG", "Yay! Config was fetched from the server.");
        } else {
            Log.e("TAG", "Failed to fetch. Using Cached Config.");
            config = ParseConfig.getCurrentConfig();
        }

        // Get the message from config or fallback to default value
        String welcomeMessage = config.getString("welcomeMessage", "Welcome!");
    }
});

Firebase

mFirebaseRemoteConfig = FirebaseRemoteConfig.getInstance();
// Set defaults from an XML resource file stored in res/xml
mFirebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);

mFirebaseRemoteConfig.fetch()
    .addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            Log.d("TAG", "Yay! Config was fetched from the server.");
            // Once the config is successfully fetched it must be activated before newly fetched
            // values are returned.
            mFirebaseRemoteConfig.activateFetched();
        }
    })
    .addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            Log.e("TAG", "Failed to fetch. Using last fetched or default.");
        }
    })

// ...

// When this is called, the value of the latest fetched and activated config is returned;
// if there's none, the default value is returned.
String welcomeMessage = mFirebaseRemoteConfig.getString("welcomeMessage");