Mobil Programlama

Android

C2DM servisinden GCM'ye geçiş

Lisans: Creative Commons 26.11.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Atalay Keleştemur

Android Cloud to Device Messaging (C2DM) servisi 20/10/2015 tarihinden itibaren hizmet dışı. Dolayısıyla artık C2DM yeni kullanıcı kaydına izin vermiyor. C2DM geliştiricileri, yeni nesil C2DM olarak adlandırılan Google Cloud Messaging'e (GCM) yönlendiriliyor.

C2DM'den GCM hizmetine geçiş yapacak geliştiriciler için iki hizmet arasındaki farkı ve mevcut uygulamaların C2DM'den GCM'ye nasıl geçirileceğini bu yazıda öğrenebilirsiniz.

 

Kısa geçmiş

C2DM 2010 yılında Android uygulamalarının sunucularından, kendi uygulamalarına veri gönderebilmesi için hizmete konulmuş bir servis. Sunucular, uygulamalara doğrudan sunucuyla iletişime geçerek, güncel kullanıcı ya da uygulama verisine ulaşma olanağı sunuyordu. C2DM hizmeti, mesajların sıralanması ve hedefe doğru şekilde ulaştırılması için gerekli tüm ihtiyaçları karşılıyordu.

Şimdiyse C2DM'nin yerine GCM hizmeti kullanılabiliyor. GCM'nin odaklandığı özelliklerden bazıları:

  • Kolay kullanım.
  • Üyelik formları yok.
  • Kota yok.
  • GCM ve C2DM istatistikleri Geliştirici Konsolu üzerinden erişilebilir.
  • Pil etkinliği
  • Yeni zengin API setleri

 

GCM'i C2DM'den farklı kılan özellikler

GCM aslında C2DM'nin temel özelliklerini içeriyor. Ancak beraberinde çeşitli yenilikler de sunuyor:

 

Sade API Anahtarı: GCM servisini kullanabilmek için, Google API konsolundan API anahtarı elde etmek gerekiyor. GCM'nin sadece Simple API Key kabul ettiğini unutmayın. ClientLogin ya da OAuth2 token'ları çalışmayacaktır.

Gönderici kimliği: C2DM'de Sender ID, e-posta adresi ile tanımlanıyor. GCM'de ise Sender ID, API konsolundan elde edilen bir proje numarası.

JSON biçimi: GCM HTTP talepleri, düz metin dışında JSON biçimini de destekliyor. Daha fazla bilgi için Architectural Overview yazısını inceleyin.

Çok nokta mesajlar: GCM'de aynı mesajı, birden çok cihaza aynı anda gönderebilirsiniz. Örneğin bir spor uygulaması, kullanıcılarına maç sonucunu 1000'e kadar register token ile aynı istem dahilinde (JSON'a ihtiyaç duyuyor) iletebilir. Daha fazla bilgi için Architectural Overview yazısına bakın.

Çoklu gönderici: Çoklu göndericiler aynı uygulamaya tek bir genel register token ile mesaj gönderebilir. Daha fazla bilgi için Messaging Concepts and Options yazısını inceleyin.

Time-to-live mesajlar: Video sohbet ve takvim gibi uygulamalar, süresi dolan etkinlik davetleri gönderebilir. Bu davetlere ait time-to-live değerleri, 0-4 hafta arasında olabilir. GCM bu mesajları, süreleri dolana kadar saklar. Diğer taraftan time-to-live değeri 0 olan bir mesaj GCM bağlantı sunucusunda tutulmaz. Daha fazla bilgi için Messaging Concepts and Options yazısını inceleyin.

Yüklü mesajlar: Uygulamalar, 4 KB'a kadar "yüklü mesaj" gönderebilir. Bu durum, özellikle bir sohbet uygulaması için kullanışlı olabilir. Bu özelliği kullanmak için collapse_key parametresini es geçin. GCM 100'e kadar mesajı saklayacaktır. Eğer bu sayıyı geçerseniz, tüm mesajlarınız discard edilecek ancak özel bir mesaj alacaksınız. Eğer bir uygulama bu mesajı alırsa, sunucu ile eşleştirilmesi gerekiyor demektir. Daha fazla bilgi için Collapsible and Non-collapsible messages yazısını inceleyin.

Kanonik kayıt ID'si: Kimi zaman sunucuda aynı cihaz için iki farklı register ID oluşabilir. GCM cevabında eğer bir register ID varsa, temin edilenle bunu değiştirmek gerekir. Bu özellik ile uygulamanızın sunucuya daha fazla cihaz ID'si göndermesine gerek kalmaz. Daha fazla bilgi için Canonical IDs yazısına bakın.

 

C2DM ve GCM arasındaki ilişki

C2DM ve GCM birlikte çalışamaz. Örneğin, GCM'den C2DM register ID'lerine bildirim gönderemezsiniz ya da C2DM register ID'lerini GCM register token'ları gibi kullanamazsınız. Sunucu tarafındaki uygulamanızla register ID'nin C2DM'den mi yoksa GCM'den mi olduğunu takip etmeli ve uygun endpoint'i kullanmalısınız.

C2DM'den GCM'ye geçiş sırasında sunucunuzun verilen register ID'sinde eski C2DM gönderici ya da yeni GCM proje numarasından haberdar olmalıdır. Tavsiye ettiğimiz yaklaşım şudur: yeni uygulama sürümüne erişin (GCM'nin kullandığı) ve bunu register ID ile birlikte bit olarak gönderin. Bu bit, sunucuya bu register ID'nin GCM için olduğunu söyleyecek. Eğer ekstra bir bit elde etmezseniz, register ID'yi C2DM olarak işaretleyin. Daha fazla register ID, C2DM olarak işaretlenmediğinde, geçiş işlemi de tamamlanmış demektir.

 

Uygulamalarınızı taşımak

Bu bölümde, mevcut C2DM uygulamalarınızı GCM'ye nasıl geçirebileceğiniz anlatılıyor.

İstemci değişiklikleri: Geçiş işlemi çok basit! İstemci uygulamasını "client implementation" belgesinde açıklandığı şekilde GCM-etkin platformunuz için yeniden kaydedin.

GCM'den yanıt aldıktan sonra register ID, uygulama sunucusuna gönderilmeli. Bunu yaparken, bunun bir GCM register ID'si olduğunu uygulama belirtmelidir. Aksi halde C2DM kayıtları ile bir çakışma yaşanabilir.

Sunucu değişiklikleri: Uygulama sunucusu GCM register ID'sine eriştiğinde, bunu kaydeder ve saklar.

GCM cihazlarına mesaj atmak için ufak birkaç değişiklik yapmak gerekir:

Talebin yeni bir endpoint'e gönderilmesi gerekir: https://gcm-http.googleapis.com/gcm/send

Talebe ait ahuthorization header'ın, kayıt sırasında oluşturulan API anahtarını da içeriyor olması gerekir. Bu anahtar, ClientLogin Auth token'ı ile yer değiştirmektedir.

 

Örnek

Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "registration_id" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
  "data" : {
    "Team" : "Portugal",
    "Score" : "3",
    "Player" : "Varela",
  },
}

 

Legacy istemci uygulama desteği

Bazı legacy istemci uygulamalarının mevcut GCM metotlarını kullanarak gönderici uygulama sunucusundan yetki almak için güncellenmesi mümkün olmayabilir. Bu tür uygulamaların C2DM endpoint kullanarak mesaj alabilmeleri için uygulama sunucusu auth token'ı bu sayfada anlatıldığı şekilde güncelleyebilirsiniz. İşlemi tamamlamak için ihtiyacınız olan şeyler:

  • Uygulama sunucusu için mevcut C2DM auth token'ı.
  • Uygulama projeniz için API key. Bunu Google Developers Console'dan temin edebilirsiniz.

 

Bu iki kimlik bilgisini bir HTTP POST talebi ile https://android.apis.google.com/c2dm/migrate için aşağıdaki şekilde sağlayın:

curl -X POST --header "Content-Type:application/x-www-form-urlencoded;charset=UTF-8"
   --header "Authorization:GoogleLogin auth=<c2dm_auth_token>"
    "https://android.apis.google.com/c2dm/migrate" --data-ascii
    'api_key=<your_api_key>'

Başarılı bir talep, istemci için kullanılabilecek yeni auth token'ı içeren bir HTTP 200 cevabı ile sonuçlanır. Mesajları istemci uygulamasına göndermek için, cevaptan gelen bu yeni tokan'ı çıkarın ve uygulama sunucusundan legacy istemcilere gönderilen tüm mesajlardaki authorization header'da kullanın:

curl -X POST --header "Content-Type:application/x-www-form-urlencoded;charset=UTF-8"
  --header "Authorization:GoogleLogin auth=<new_auth_token>"
   "https://android.apis.google.com/c2dm/send" --data-ascii 'registration_id=<regId>
   &field1=<value1>&...'