Bütçe API'sine Giriş

Push Mesajlaşma API'si, tarayıcı kapalıyken bile kullanıcıya bildirim göndermemize olanak tanır. Birçok geliştirici, tarayıcı açık olmadan içeriği güncellemek ve senkronize etmek için bu mesajı kullanmak 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.

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

Budget API, geliştiricilerin kullanıcıyı bilgilendirmeden sınırlı arka plan çalışması (ör. sessiz push veya arka planda getirme) yapmasına olanak tanımak için tasarlanmış yeni bir API'dir. Chrome 60 ve sonraki sürümlerde bu API'yi kullanmaya başlayabilirsiniz. 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 kullanmasına izin vermek için yeni Budget API'yi kullanarak bütçe kavramını kullanıma sunuyor. Her siteye, kullanıcı etkileşimine göre arka plan işlemleri için kullanabileceği bir kaynak miktarı verilir. Örneğin, her işlemin bütçeyi tükettiği sessiz push. Bütçe harcandığında, arka plan işlemleri artık kullanıcı görünürlüğü olmadan gerçekleştirilemez. Kullanıcı aracısı, bulgulara göre bir web uygulamasına atanan bütçeyi belirlemekten sorumludur. Örneğin, bütçe tahsisi kullanıcı etkileşimine bağlanabilir. Her tarayıcı kendi sezgisel yöntemine karar verebilir.

Özet Budget API, bütçe ayırmanıza, bütçeyi kullanmanıza, kalan bütçenin listesini almanıza ve arka plan işlemlerinin maliyetini anlamanıza olanak tanır.

Bütçe ayırma

Chrome 60 ve sonraki sürümlerde navigator.budget.reserve() yöntemi herhangi bir işaret olmadan kullanılabilir.

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ı belirten bir boole değeri döndürür. Bütçe ayrıldıysa kullanıcıyı arka plan çalışmanız hakkında bilgilendirmeniz gerekmez.

Push bildirimleri örneğinde, "sessiz push" işlemi için bütçe ayırmayı deneyebilirsiniz. reserve() doğru olarak çözülürse işleme izin verilir. Aksi takdirde false döndürülü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 "silent-push" seçeneği kullanılabilen tek işlem türüdür, ancak özellikte işlem türlerinin tam listesini bulabilirsiniz. Kullanıldıktan sonra test veya hata ayıklama amacıyla 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 Budget API, gizli modda sıfır bütçe döndüreceği için bu işlem için gizli modu da kullanamazsınız (testim sırasında hatalara neden olan bir hata olsa da).

reserve() numarasını yalnızca rezervasyon yaptığınız işlemi gelecekte gerçekleştirmek istediğinizde aramanız gerekir. Yukarıdaki örnekte reserve çağrısını yaptıysanız ancak yine de bildirim gösteriliyorsa bütçenin yine de kullanılacağını unutmayın.

Yalnızca reserve() tarafından etkinleştirilmeyen yaygın kullanım alanlarından biri, bir arka uçtan sessiz aktarma planlama imkanıdır. Bütçe API'sinde bu kullanım alanını etkinleştirecek API'ler vardır, ancak bunlar Chrome'da üzerinde çalışılmaya devam etmektedir ve şu anda yalnızca flag'lerin ve / veya Kaynak Denemesi'nin arkasında kullanılabilirler.

Budget API ve Kaynak Denemeleri

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

Chrome 60'ta, kaynak denemesine kaydolduğunuzda bu yöntemlerin her ikisi de kullanılabilir. Aksi takdirde, deneme için Deneysel Web Platformu özellikleri işaretini etkinleştirerek yerel olarak kullanabilirsiniz (Chrome'da chrome://flags/#enable-experimental-web-platform-features adresine gidin).

Bu API'lerin nasıl kullanılacağına bakalım.

Bütçenizi alma

Kullanılabilir bütçenizi getBudget() yöntemiyle bulabilirsiniz. Bazı tarayıcılarda (Chrome gibi) zaman içinde bütçe "düşüş"ü yaşanır. Bu nedenle, size tam görünürlük sağlamak için bu işlev, gelecekteki çeşitli 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, gelecekteki ç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 ayrımlarını eklemenin avantajlarından biri, geliştiricilerin sunucu tarafı davranışlarını uyarlamak için bu bilgileri arka uçlarıyla paylaşabilmesidir (yani yalnızca müşterinin sessiz bir aktarma bütçesi olduğunda güncellemeyi tetiklemek için bir push mesajı gönderme).

İşlemin Maliyetini Alma

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

Örneğin, bir push mesajı aldığınızda bildirim göstermemenin maliyetini (yani sessiz push'in maliyetini) aşağıdaki kodla öğ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 şu öğeleri yazdırabilir:

Cost of silent push is: 2

reserve() ve getCost() yöntemleriyle ilgili vurgulanabilecek bir nokta, bir işlemin gerçek maliyetinin getCost() tarafından döndürülen maliyetten düşük olabileceğidir. Mevcut bütçeniz belirtilen maliyetten düşükse yine de işlem rezervasyonu yapabilirsiniz. Spesifikasyondaki ayrıntılar aşağıdaki gibidir:

Bu, Chrome'daki mevcut API'dir. Web, arka planda getirme gibi arka planda çalışma gerektiren yeni API'leri desteklemeye devam ettikçe, kullanıcıyı bilgilendirmeden gerçekleştirebileceğiniz işlem sayısını yönetmek için Budget API kullanılabilir.

API'yi kullanırken lütfen GitHub Repo'da geri bildirimde bulunun veya crbug.com adresinden Chrome hataları bildirin.