Bütçe API'sine Giriş

Push Messaging API, tarayıcı kapalıyken bile kullanıcıya bildirim göndermemizi sağlar. Birçok geliştirici, tarayıcı açık olmadan içeriği güncellemek ve senkronize etmek için bu mesajlaşmayı kullanabilmek ister. Ancak API'nin önemli bir kısıtlaması vardır: Alınan her push mesajı için her zaman bir bildirim görüntülemeniz gerekir.

Bir kullanıcının cihazındaki verileri senkronize etmek için push mesajı gönderebilmek veya daha önce gösterdiğiniz bir bildirimi gizleyebilmek kullanıcılar ve geliştiriciler için son derece yararlı olabilir. Ancak bir web uygulamasının kullanıcının bilgisi olmadan arka planda çalışmasına izin vermek kötüye kullanıma açıktır.

Bütçe API, geliştiricilerin kullanıcıya haber vermeden sessiz aktarma veya arka planda getirme gibi sınırlı arka plan işleri gerçekleştirmesini sağlamak için tasarlanmış yeni bir API'dir. Chrome 60 ve sonraki sürümlerde bu API'yi kullanmaya başlayabileceksiniz. Chrome ekibi, geliştiricilerden geri bildirim almak için sabırsızlanıyor.

Web platformu, geliştiricilerin kullanıcının kaynaklarını arka planda tüketmesini sağlamak için yeni Bütçe API'sini kullanarak bütçe kavramını uygulamaya koyuyor. Kullanıcı etkileşimine bağlı olarak her siteye, arka plandaki işlemlerde (ör. her işlemin bütçesini tüketeceği sessiz bir aktarma) tüketebileceği bir miktar kaynak verilir. Bütçe harcandığında, artık kullanıcı görünürlüğü olmadan arka plan işlemleri gerçekleştirilemez. Kullanıcı aracısı, bulgulara dayalı olarak bir web uygulamasına atanan bütçeyi belirlemekten sorumlu olur. Örneğin, bütçe izni kullanıcı etkileşimine bağlanabilir. Her tarayıcı kendi bulgusal yönteme karar verebilir.

Özet: Bütçe API'si bütçe ayırmanızı, bütçeyi kullanmanızı, kalan bütçenin listesini almanızı ve arka plandaki işlemlerin maliyetini anlamanızı sağlar

Bütçe Ayırma

Chrome 60 ve sonraki sürümlerde navigator.budget.reserve() yöntemi bayrak olmadan kullanılabilecektir.

reserve() yöntemi, belirli bir işlem için bütçe istemenize olanak tanır ve bütçenin ayrılıp ayrılamayacağını belirtmek için bir boole döndürür. Bütçe ayrılmışsa kullanıcıya arka plan çalışmalarınızı bildirmeniz gerekmez.

Push bildirimi örneğinde, bir "sessiz-push" işlemi için bütçe ayırmayı deneyebilirsiniz. reserve(), doğru olarak çözümlenirse işleme izin verilir. Aksi takdirde yanlış değerini döndürür ve bir bildirim göstermeniz gerekir.

self.addEventListener('push', event => {
 const promiseChain = navigator.budget.reserve('silent-push')
   .then((reserved) => {
     if (reserved) {
       // No need to show a notification.
       return;
     }

     // Not enough budget is available, must show a notification.
     return registration.showNotification(...);
   });
 event.waitUntil(promiseChain);
});

Chrome 60'ta kullanılabilen tek işlem türü "sessiz-push" olsa da, özelliklerde işlem türlerinin tam listesini bulabilirsiniz. Ayrıca, kullanıldıktan sonra test veya hata ayıklama amaçları için bütçenizi artırmanın kolay bir yolu yoktur, ancak geçici bir çözüm olarak Chrome'da yeni bir profil oluşturabilirsiniz. Maalesef Bütçe API'si Gizli modda sıfır bütçe döndüreceğinden (testim sırasında hataya yol açan bir hata olmasına rağmen) bunun için gizli modu kullanamazsınız.

reserve() yöntemini, yalnızca ileride bir noktada, rezervasyon yapmakta olduğunuz işlemi gerçekleştirmeyi düşündüğünüzde çağırmalısınız. Yukarıdaki örnekte rezerv çağırdıysanız ancak yine de bir bildirim gösterdiyseniz bütçenin yine de kullanılacağını unutmayın.

Tek başına reserve() tarafından etkinleştirilmeyen yaygın kullanım alanlarından biri, arka uçtan sessiz aktarma planlayabilmesidir. Bütçe API'de bu kullanım alanını etkinleştirecek API'ler vardır ancak bunlar Chrome'da üzerinde çalışmaya devam etmektedir ve şu anda yalnızca bayraklar ve / veya Kaynak Denemesi arkasında kullanılabilir.

Bütçe API ve Kaynak Denemeleri

Bir web uygulaması tarafından bütçe kullanımını planlamak için kullanabileceği iki yöntem vardır: getBudget() ve getCost().

Chrome 60'ta kaynak deneme sürümüne kaydolursanız bu yöntemlerin her ikisini de kullanabilirsiniz. Ancak test amacıyla, deneme amacıyla Deneysel Web Platformu özellikleri işaretini (Chrome'da chrome://flags/#enable-experimental-web-platform-features'ı açın) etkinleştirerek yerel olarak kullanabilirsiniz.

Bu API'lerin nasıl kullanılacağına birlikte göz atalım.

Bütçenizi öğrenin

getBudget() yöntemiyle mevcut bütçenizi öğrenebilirsiniz. Bazı tarayıcılarda (ör. Chrome) bütçede zaman içinde "değer değişimi" olur. Bu nedenle, tam görünürlük sağlamak için bu işlev, gelecekte farklı zamanlarda bütçenizin ne olacağını belirten bir BudgetStates dizisi döndürür.

Çalıştırabileceğimiz bütçe girişlerini listelemek için:

navigator.budget.getBudget()
.then((budgets) => {
  budgets.forEach((element) => {
    console.log(\`At '${new Date(element.time).toString()}' \` +
      \`your budget will be '${element.budgetAt}'.\`);
  });
});

İlk giriş mevcut bütçeniz olur ve ek değerler, gelecekte çeşitli noktalarda bütçenizin ne olacağını gösterir.

At 'Mon Jun 05 2017 12:47:20' you will have a budget of '3'.
At 'Fri Jun 09 2017 10:42:57' you will have a budget of '2'.
At 'Fri Jun 09 2017 12:31:09' you will have a budget of '1'.

Gelecekteki bütçe izinleri dahil etmenin avantajlarından biri de geliştiricilerin sunucu tarafı davranışlarını uyarlamak için bu bilgileri arka uçlarıyla paylaşabilmeleridir (yani, yalnızca istemcinin sessiz aktarım için bütçesi olduğunda güncelleme tetiklemek için bir push mesajı gönderebilir).

Bir İşlemin Maliyetini öğrenme

Bir işlemin ne kadara mal olacağını öğrenmek için getCost() çağrılırsa, söz konusu işlem için reserve() çağrısı yaptığınızda kullanılacak olan maksimum bütçe miktarını belirten bir sayı döndürülür.

Örneğin, push mesajı aldığınızda bildirim göstermemenin maliyetini (sessiz push işleminin maliyeti) aşağıdaki kodu kullanarak öğrenebiliriz:

navigator.budget.getCost('silent-push')
.then((cost) => {
  console.log('Cost of silent push is:', cost);
})
.catch((err) => {
  console.error('Unable to get cost:', err);
});

Bu makalenin yazıldığı sırada Chrome 60 şunları yazdıracak:

Cost of silent push is: 2

reserve() ve getCost() yöntemleriyle dikkat edilmesi gereken bir nokta da bir işlemin gerçek maliyetinin, getCost() tarafından döndürülen maliyetten daha az olabileceğidir. Mevcut bütçeniz belirtilen maliyetin altındaysa yine de bir işlem ayırabilirsiniz. Spesifikasyondaki spesifik ayrıntılar aşağıda verilmiştir:

Bu, Chrome'daki mevcut API'dir ve web, arka planda getirme gibi arka plan işleri gerçekleştirmeyi gerektiren yeni API'leri desteklemeye devam ettiğinden, Bütçe API'si kullanıcıyı bilgilendirmeden gerçekleştirebileceğiniz işlem sayısını yönetmek için kullanılabilir.

API'yi kullanırken lütfen GitHub Repo ile ilgili geri bildirim sağlayın veya crbug.com adresinden Chrome hatalarını bildirin.