Android Google Cloud Messaging ile Push Notification Gönderimi (PHP + MYSQL)

Merhaba Arkadaşlar,

Not: Firebase Push Notification dersi için tıklayınız.

Mobil Uygulama geliştirme dersleri ile sizlere yardımcı olmaya çalıştığımız mobilhanem.com üzerinden anlattığımız/yayınladığımız derslerimize bugünde Google Cloud Messaging(GCM) ile Push Notification yani notifikasyon gönderme dersi ile devam ediyoruz.

Google servisi olan GCM telefonlarımız açık yada kapalı olsun client yani mobil cihazlar tarafından istek de bulunulmaksızın Notification göndermeye yarar.Yani bir nevi sunucudan cihaza bilgi ve uyarı gönderir. Birden fazla kullanım alanı olabilir. Mesajlaşma servisleri,bankalar,online hizmetler ve daha bir çok uygulama tarafından kullanılır. Hepimizin malumudur ki uygulamayı yazmak kadar kullandırtmakta çok önemlidir. Telefona indirilip kullanılmayan bir uygulama yazmayı hiç birimiz istemeyiz. GCM burda da işe yarıyor ve kullanıcıya Notification göndererek uygulamamızı hatırlatıyor ve kullanım oranlarını arttırıyor.Tabi şunuda unutmamak lazım, gereğinden fazla abartılı notification gönderimi ise kullanıcıyı bunaltır ve uygulamamızı silmesine neden olur.Bu ve bunun gibi bir çok kullanım alanı olan GCM Google tarafından ücretsiz olarak sunulmaktadır.

Bende bu dersimde sizlere detaylı bir anlatımla Google tarafındaki ayarları,uygulamaya entegre edilmesi ve PHP sunucudan notification gönderimini anlatacağım.Dolayısıyla diğer derslerimizden biraz daha uzun ve biraz daha ayrıntılı bir ders olacaktır.

Konuyu daha fazla uzatmadan başlıyorum.

[wpdm_file id=19]

Google Ayarları

Öncelikle https://console.developers.google.com/project sayfasına girerek Create Project diyoruz.

Gcm1

Karşımıza aşağıdaki gibi bir ekran geliyor.

Gcm

Project Name : Projemizin Adı
Project Id: Projenin id si. Kendimiz istenilen şartlarda oluşturabileceğimiz gibi Google’n oluşturduğu id’yide kullanabiliriz.Sonradan değiştirilemez.
1. ve 2 . alanıda check ledikten sonra Create tıklıyoruz ve projemizin oluşmasını bekliyoruz.Projemiz oluştuktan sonra bizi Proje sayfamıza yönlendiriyor. Açılan sayfada sol taraftaki APIs&auth sekmesinin altındaki APIs’e tıklıyoruz.

Gcm3

Açılan sayfadaki listeden Google Cloud Messaging for Android i buluyor ve tıklıyoruz.Karşımıza çıkan ekranda sol üstte yer alan OFF yazan butona tıklıyor ve On olmasını bekliyoruz.

Gcm4

Evet arkadaşlar daha sonra APIs&auth sekmesinin altındaki Credentials’a tıklıyoruz.Açılan sayfada Create New Key’e tıklıyor ve Server Key’e tıklıyoruz.

Gcm6

Karşımıza çıkan bu sayfada herhangi bir IP kısıtlaması yapmıyacaksak Text alanını boş bırakıyır ve Create diyoruz.

Gcm7

Açılan yeni sayfadaki API KEY sonraki aşamlarda işimize yarıyacak. Lazım olduğu zaman bu sayfadan alabiliriz API KEY’imizi.

Gcm8

PHP+MYSQL

Evet arkadaşlar şimdi gelelim işin zor ama zevkli kısmı olan PHP+MYSQL kullanarak server kısmını hazırlamaya.Öncelikle çalışma mantığını anlatayım. Uygulamamız ilk açıldığı zaman bizim belirttiğimiz URL’e her cihaz için ayrı olan GCM register id gönderirir. Ben bu register id leri databasime kaydederim. Notification göndereceğim zamanda ister istediğim register id li cihazlara istersem tüm cihazlara Notification gönderebilirim. Bunu yaparkende ben bu dersimde PHP+MYSQL kullanıcam siz isterseniz farklı platformlarda kullanabilirsiniz.(asp,jsp,mssql,oracle vs..) .

Bunun için öncelikle Mysql databasimizde “wp_gcm_kullanicilar” adinda bir tablo oluşturalım. Bunu yaparken Phpmyadmin kullanabilirsiniz. İşinizi çok kolaylaştırır.


CREATE TABLE `wp_gcm_kullanicilar` ( `id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `registration_id` TEXT NOT NULL ) ENGINE = INNODB

Yukarıdaki kodu ile tablomuzu oluşturduk.

Database bağlantımızı sağlayacak baglanti.php dosyamızı hazırlayalım.

baglanti.php

<?php
define('DB_NAME', '********');
/** MySQL veritabanı kullanıcısı */
define('DB_USER', '*********');
/** MySQL veritabanı parolası */
define('DB_PASSWORD', '*********');
/** MySQL sunucusu */
define('DB_HOST', 'localhost');
/** Yaratılacak tablolar için veritabanı karakter seti. */
define('DB_CHARSET', 'utf8');
$con=mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);

// Check connection
if (mysqli_connect_errno())
  {
  echo "Bağlanırken hata oluştu : " . mysqli_connect_error();
  }

?>

Evet arkadaşlar bağlantıyı oluşturduk şimdi gelelim Android cihazlardan uygulamamız ilk açıldığında gelecek olan GCM register id’leri kaydedecek php dosyamıza.

register.php


<?php 
require_once("baglan.php");//database bağlantısı gercekleştirdik
 if (isset($_GET["regId"])) { //Kontrol
 
 $regId = $_GET['regId']; //GET ile gelen regId değerini aldık
 
 $sql = "INSERT INTO wp_gcm_kullanicilar (registration_id) values ('$regId')"; //regId yi database kaydedicek sorgu
 
 if(!mysqli_query($con, $sql)){//sorguyu çalıştırdık
  die('MySQL query failed'.mysql_error());
	}
 }
mysqli_close($con);//mysql connection kapattık
 
 
?>

Arkadaşlar şimdi gelelim Notification göndereceğimiz php dosyasına. Html formdan aldığımız veriyi(mesajı) databasede GCM register id leri kayıtlı olan cihazlara notification göndereceğiz.Aslında biz direk kendi serverlarımızdan göndermiyoruz. Biz bilgileri GCM servicelerine gönderiyoruz. GCM serverlarıda gelen bilgilere göre register id li cihazlara bizim belirlediğimiz mesajı notification gönderiyor.

send.php


<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <!--Türkçe karakter sorunu yaşamamak için-->

 <title>GCM Send</title>
</head>
<body>
 <?php
  if(isset($_POST['submit'])){//kontrol
   require_once("baglan.php");//database bağlantısı gercekleştirdik
   $registatoin_ids = array();//registration idlerimizi tutacak array ı oluşturuyoruz
   
   $sql = "SELECT *FROM wp_gcm_kullanicilar";//Tüm kullanıcı gcm registration idlerini alıcak sql sorgumuz
   $result = mysqli_query($con, $sql);//sorguyu çalıştırıyoruz
   while($row = mysqli_fetch_assoc($result)){
    array_push($registatoin_ids, $row['registration_id']);//databaseden dönen registration idleri $registatoin_ids arrayine atıyoruz
   }
 
   // GCM servicelerine gidecek veri
   //Arkadaşlar aşşağıdaki PHP kodlarıyla oynamıyoruz. Bu Google 'n bizden kullanmamızı istediği kodlar
   //Sadece registration_ids,mesaj ve Authorization: key değerlerini değiştiriyoruz
    $url = 'https://android.googleapis.com/gcm/send';
   
    $mesaj = array("notification_message" => $_POST['mesaj']); //gönderdiğimiz mesaj POST 'tan alıyoruz.Androidde okurken notification_message değerini kullanacağız
         $fields = array(
             'registration_ids' => $registatoin_ids,
             'data' => $mesaj,
         );
		
		//Alttaki Authorization: key= kısmına Google Apis kısmında oluşturduğumuz key'i yazacağız
         $headers = array(
             'Authorization: key=AIzaSyBf--subbkkRuEKbmxn3pXZCpY4u9OuTL8', 
             'Content-Type: application/json'
         );
         // Open connection
         $ch = curl_init();
   
         // Set the url, number of POST vars, POST data
         curl_setopt($ch, CURLOPT_URL, $url);
   
         curl_setopt($ch, CURLOPT_POST, true);
         curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
   
         // Disabling SSL Certificate support temporarly
         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
   
         curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
   
         // Execute post
         $result = curl_exec($ch);
         if ($result === FALSE) {
             die('Curl failed: ' . curl_error($ch));
         }
   
         // Close connection
         curl_close($ch);
         echo $result;
  }
 ?>
 
 <form method="post" action="send.php">
  <label>Mesajı giriniz: </label><input type="text" name="mesaj" />
 
  <input type="submit" name="submit" value="Send" />
 </form>
</body>
</html>

Yukarıda yaptığımız işlemleri kısaca toparlıcak olursak sistem şu şekilde işleyecek. Uygulama android cihazdan açıldığı zaman bizim register.php mize registeri_id yi post edicek. Biz post edilen id yi kaydedeceğiz ve notification göndermek istedimizde ise send .php yi çalıştıracağız. Mesajımızı yazıp gönderdiğimizde send.php database kayıtlı olan register_id leri ve mesajımızı GCM servisine gönderecek.GCM serviste gelen register_id li cihazlara mesajımızı Notification olarak gönderecek.

ANDROID

Gelelim android kısmına.

Öncelikle yeni bir proje oluşturuyoruz.Arkadaşlar ben bu dersimde oluşturduğum ve bu dersimde Google Play’e nasıl yükleneceğini anlattığım projem üzerinden devam edicem.Bu proje zaten basit bir Webview uygulamasıydı.Ben projeye Splash Screen ekleyerek gerekli başlangıç işlemlerini orda yapıcam. Yani bir nevi sıfırdan proje oluşturmuş olacağız.Oluşturduğumuz projeye Google Play Service Lib dosyasını ekliyoruz. Google Play Service lib ekleme konusunda detaylı anlatımımı bu dersimizde yapmıştım.Google Play Service dosyasını projemize import ettikten sonra Android Manifest dosyasında gerekli izinlerle gerekli ayarlamaları yapıyoruz. Benim Android Manifest dosyam aşşağıdaki gibi

AndroidManifest.xml



<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mobilhanem.webviewkullanimi"
    android:versionCode="2"
    android:versionName="1.1" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="19" />
	<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <permission android:name="com.example.gcm.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />
    <uses-permission android:name="android.permission.VIBRATE" />
    
    
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        
         <activity
            android:label="@string/app_name"
            android:name=".SplashScreen"
			android:screenOrientation="portrait"
			android:theme="@android:style/Theme.Black.NoTitleBar" >
			
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
		<activity
            android:label="@string/app_name"
            android:name=".Anasayfa"
			android:screenOrientation="portrait"
			android:theme="@android:style/Theme.Black.NoTitleBar" >
        </activity>
        <receiver
            android:name="com.mobilhanem.gcm.GcmBroadcastReceiver"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.mobilhanem.gcm" />
            </intent-filter>
        </receiver>
         <service android:name="com.mobilhanem.gcm.GcmIntentService" />

        <meta-data android:name="com.google.android.gms.version"
           android:value="@integer/google_play_services_version" />
    </application>

</manifest>

Başlangıç işlemlerini yaptığım yani kendi server’ıma register_id yi gönderdiğim java dosyaları ise aşağıdaki gibidir.Zaten kod üzerinde gerekli açıklamaları yaptım.

SplashScreen.java



import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.android.gms.gcm.GoogleCloudMessaging;
import com.mobilhanem.gcm.RegisterApp;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.util.Log;
import android.widget.Toast;
 
public class SplashScreen extends Activity {
  
 private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
 public static final String PROPERTY_REG_ID = "registration_id";
 private static final String PROPERTY_APP_VERSION = "appVersion";
 private static final String TAG = "Mobilhanem GCM";
 GoogleCloudMessaging gcm;
 String regid;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.splash);

  
  if (checkPlayServices()) {//GOOGLE PLAY SERVİCE APK YÜKLÜMÜ
		gcm = GoogleCloudMessaging.getInstance(getApplicationContext());//GoogleCloudMessaging objesi oluşturduk
		regid = getRegistrationId(getApplicationContext()); //registration_id olup olmadığını kontrol ediyoruz
		
		if(regid.isEmpty()){//YENİ KAYIT
			  //regid değerimiz boş gelmişse uygulama ya ilk kez acılıyor yada güncellenmiş demektir.Registration işlemleri tekrardan yapılacak.
	          new RegisterApp(getApplicationContext(), gcm, getAppVersion(getApplicationContext())).execute(); //RegisterApp clasını çalıştırıyoruz ve değerleri gönderiyoruz
		}else{
			  //regid değerimiz boş gelmemişse önceden registration işlemleri tamamlanmış ve güncelleme olmamış demektir.Yani uygulama direk açılacak
			  //Arkadaşlar eğer splash ekranının gözükmesini istiyorsanız thread kullanıp 2 3 sn bekletebilirsiniz.Daha sonra aşağıdaki işlemlere başlayabilirsiniz

		       Toast.makeText(getApplicationContext(), "Bu cihaz önceden kaydedilmiş", Toast.LENGTH_SHORT).show();
		       Intent i = new Intent(getApplicationContext(),Anasayfa.class);//Anasayfaya Yönlendir
       		   startActivity(i);
       		   finish();
		   }
          
  }
   
 }
 
 private boolean checkPlayServices() { 
	//Google Play Servis APK yüklümü
	 //Yüklü Değilse Log basıp kapatıcak uygulamayı
	 //Siz kullanıcıya uyarı verdirip Google Play Apk Kurmasını isteyebilirsiniz
	 
     int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
     if (resultCode != ConnectionResult.SUCCESS) {
         if (GooglePlayServicesUtil.isUserRecoverableError(resultCode)) {
             GooglePlayServicesUtil.getErrorDialog(resultCode, this,
                     PLAY_SERVICES_RESOLUTION_REQUEST).show();
         } else {
             Log.i(TAG, "Google Play Servis Yükleyin.");
             finish();
         }
         return false;
     }
     return true;
 }
 private String getRegistrationId(Context context) { //registration_id geri döner
	 //Bu method registration id ye bakar.
	 //Bu uygulamada registration id nin önceden olabilmesi için uygulamanın önceden açılmış ve registration işlemlerini yapmış olması lazım
	 //Uygulama önceden acıldıysa registration_id SharedPreferences yardımı ile kaydedilir.
	 
     final SharedPreferences prefs = getGCMPreferences(context);
     String registrationId = prefs.getString(PROPERTY_REG_ID, "");//registration_id değeri alındı
     if (registrationId.isEmpty()) {//eğer boşsa önceden kaydedilmemiş yani uygulama ilk kez çalışıyor.
         Log.i(TAG, "Registration id bulunamadı.");
         return "";
     }
    
     int registeredVersion = prefs.getInt(PROPERTY_APP_VERSION, Integer.MIN_VALUE);
     int currentVersion = getAppVersion(getApplicationContext());//yine SharedPreferences a kaydedilmiş version değerini aldık
     if (registeredVersion != currentVersion) {//versionlar uyuşmuyorsa güncelleme olmuş demektir. Yani tekrardan registration işlemleri yapılcak
         Log.i(TAG, "App version değişmiş.");
         return "";
     }
     return registrationId;
 }
  
 private SharedPreferences getGCMPreferences(Context context) {
     return getSharedPreferences(SplashScreen.class.getSimpleName(),
             Context.MODE_PRIVATE);
 }
  
 private static int getAppVersion(Context context) { //Versiyonu geri döner
     try {
         PackageInfo packageInfo = context.getPackageManager()
                 .getPackageInfo(context.getPackageName(), 0);
         return packageInfo.versionCode;
     } catch (NameNotFoundException e) {
         // should never happen
         throw new RuntimeException("Paket versiyonu bulunamadı: " + e);
     }
 }
}

SplashScreen uygulama ilk açıldığında önceden registration işlemlerinin yapılıp yapılmadığını kontrol eder. Eğer yapılmışsa uygulama normal açılır. Eğer yapılmamışsa uygulama RegisterApp.java dosyasını çağırarak registration işlemlerini başlatır.

RegisterApp.java



import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import com.google.android.gms.gcm.GoogleCloudMessaging;
import com.mobilhanem.webviewkullanimi.Anasayfa;
import com.mobilhanem.webviewkullanimi.SplashScreen;

import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast;
 
 
public class RegisterApp extends AsyncTask<Void, Void, String> {
 
 private static final String TAG = "Mobilhanem GCM";
 Context ctx;
 GoogleCloudMessaging gcm;//Google Cloud referansı
 final String PROJECT_ID = "149270419021";//Bu değer Google Apı sayfasında Owerview menüsünde(Giriş sayfası) yukarıda yer alır. Project Number:987... şeklinde
 String regid = null; 
 private int appVersion;
 
 public RegisterApp(Context ctx, GoogleCloudMessaging gcm, int appVersion){ //SplassScreen den gelen değerleri aldık
  this.ctx = ctx;
  this.gcm = gcm;
  this.appVersion = appVersion;
 }
  
  
 @Override
 protected void onPreExecute() {
  super.onPreExecute();
 }
 
 
 @Override
 protected String doInBackground(Void... arg0) { //
  String msg = "";
        try {
            if (gcm == null) {
                gcm = GoogleCloudMessaging.getInstance(ctx);//GCM objesi oluşturduk ve gcm referansına bağladık
            }
            regid = gcm.register(PROJECT_ID);//gcm objesine PROJECT_ID mizi göndererek regid değerimizi aldık.Bu değerimizi hem sunucularımıza göndereceğiz Hemde Androidde saklıyacağız
            msg = "Registration ID=" + regid;

            
            sendRegistrationIdToBackend();//Sunuculara regid gönderme işlemini yapacak method
            
            storeRegistrationId(ctx, regid);//Androidde regid saklı tutacak method
            
        } catch (IOException ex) {
            msg = "Error :" + ex.getMessage();
           
        }
        return msg;
 }
 
 private void storeRegistrationId(Context ctx, String regid) {//Androidde regid ve appversion saklı tutacak method
	 //Burada SharedPreferences kullanarak kayıt yapmaktadır
	 //SharedPreferences hakkında ayrıntılı dersi Bloğumuzda bulabilirsiniz.
   final SharedPreferences prefs = ctx.getSharedPreferences(SplashScreen.class.getSimpleName(),
             Context.MODE_PRIVATE);
     Log.i(TAG, "Saving regId on app version " + appVersion);
     SharedPreferences.Editor editor = prefs.edit();
     editor.putString("registration_id", regid);
     editor.putInt("appVersion", appVersion);
     editor.commit();
   
 }
 
 
 private void sendRegistrationIdToBackend() {//Sunucuya regid değerini gönderecek method
	 //Arkadaşlar biz burda get methodu ile gönderdik .
	 //Siz isterseniz post methoduda kullanabilirsiniz
	 //HTTP Post ie ilgili dersimiz blog umuzda bulunmaktadır.
  URI url = null;
  try {
   url = new URI("http://www.mobilhanem.com/test/register.php?regId=" + regid);
  } catch (URISyntaxException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 
  HttpClient httpclient = new DefaultHttpClient();
  HttpGet request = new HttpGet();
  request.setURI(url);
  try {
   httpclient.execute(request);
  } catch (ClientProtocolException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 
 
 @Override
 protected void onPostExecute(String result) {
	 //doInBackground işlemi bittikten sonra çalışır
  super.onPostExecute(result);
  Toast.makeText(ctx, "Registration Tamamlandı.Artık notification alabilirsiniz", Toast.LENGTH_SHORT).show();
  Log.v(TAG, result);
  Intent i = new Intent(ctx,Anasayfa.class);//Anasayfaya Yönlendir
  i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
  ctx.startActivity(i);
 
 }
}

Buraya kadar olan kısım register işlemleri içindi. Şimdi ise Notification geldiği zaman uygulamamızın ne yapcağını ayarlamaya. Burda Servis ve BroadCastReciver sınıflarını kullandık. Servis sınıfı hakkında yazımız blog içinde mevcuttur. BroadCastReciver sınıfı hakkında ise en kısa zamanda yazacağım.

Arkadaşlar aşağıdaki kodlar Notification geldiği zaman çalışacaktır.

GcmBroadcastReceiver.java

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.WakefulBroadcastReceiver;
 
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
 
    @Override
    public void onReceive(Context context, Intent intent) {
        // Explicitly specify that GcmIntentService will handle the intent.
        ComponentName comp = new ComponentName(context.getPackageName(),
                GcmIntentService.class.getName());
        // Start the service, keeping the device awake while it is launching.
        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
    }
}

Yukarıdaki kod Android ağını dinlemektedir. GCM servislerinden bir PUSH Notification gelirse uygulamayı uyandırır ve GCMIntentService’i çalıştırır.

GCMIntentService.java

package com.mobilhanem.gcm;

import com.google.android.gms.gcm.GoogleCloudMessaging;
import com.mobilhanem.webviewkullanimi.R;
import com.mobilhanem.webviewkullanimi.SplashScreen;

import android.app.IntentService;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
 
public class GcmIntentService extends IntentService {
    public static final int NOTIFICATION_ID = 1;
    private NotificationManager mNotificationManager;
    NotificationCompat.Builder builder;
 
    public GcmIntentService() {
        super("GcmIntentService");
    }
 
    @Override
    protected void onHandleIntent(Intent intent) {
        Bundle extras = intent.getExtras();
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
        //Gelen mesaj tipini alıyoruz
        String messageType = gcm.getMessageType(intent);
        String mesaj = intent.getExtras().getString("notification_message");
        Log.d("mesaj--->>>",mesaj);
        
        if (!extras.isEmpty()) {  // has effect of unparcelling Bundle
            
            if (GoogleCloudMessaging.
                    MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {
                sendNotification("Send error: " + extras.toString());
            } else if (GoogleCloudMessaging.
                    MESSAGE_TYPE_DELETED.equals(messageType)) {
                sendNotification("Deleted messages on server: " +
                        extras.toString());
            } else if (GoogleCloudMessaging.
                    MESSAGE_TYPE_MESSAGE.equals(messageType)) {//Herhangi bir sorun yoksa Notification mızı oluşturacak methodu çağırıyoruz
                sendNotification(mesaj);
            }
        }
        GcmBroadcastReceiver.completeWakefulIntent(intent);
    }

    private void sendNotification(String msg) { //Burda Status barda gösterilecek Notificationın ayarları yapılıyor(titreşim,bildirim,text boyutu vs..)
        mNotificationManager = (NotificationManager)
                this.getSystemService(Context.NOTIFICATION_SERVICE);
 
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                new Intent(this, SplashScreen.class), 0);
 
        NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(this)
        .setContentTitle("Mobilhanem")
        .setSmallIcon(R.drawable.ic_launcher)
        .setStyle(new NotificationCompat.BigTextStyle()
        .bigText(msg))
        .setContentText(msg)
        .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
        .setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 });
 
        
        mBuilder.setContentIntent(contentIntent);
        mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());//Notification gösteriliyor.
    }
}

Evet arkadaşlar açıklamaları kod üzerinde yapmaya çalıştım. Bugüne kadar anlattığım dersler arasında beni en çok yoran dersti. İnşallah sizleri yormadan halledebilirsiniz.Ama bu dersimde altını çizerek söylüyorum örnek projeyi kesinlikle indirerek çalışın.İndirmeden anlamanız çok zor olacaktır. Ben projenin bu halini Google Play’e koyacağım ve ders eklediğim zaman notification ile bildireceğim.

Sormak istediğiniz veya eklemek istediğiniz bir yer olursa çekinmeden yorum bırakabilirsiniz.Sizlerden ricam facebook.com/mobilhanem sayfamızı beğenmenizdir. Birdahaki dersimde Androidde Custom Listview kullanımını anlatacağım.Birdahaki dersimize kadar kendinize iyi bakın.

GCM12

NOT:Android Studio için Google Play Service import dersimiz için tıklayınız.

[wpdm_file id=19] 0

Taha Kırca

iOS & Android & Apple Watch Developer, Mobilhanem.com yazarı, Karadeniz Uşağu, Ordu Sevdalısı

240 Yorum

  • Emeğinize sağlık. GCM’de tek seferde en fazla 1000 cihaza gönderim yapılabiliyor.*** Bu konuda php kodlarınızda nasıl bir değişiklik yapılmalı ki limit sorunumuz olmasın ?

    *** GCM allows us to send a notification to up to 1000 device at a time

    Selamlar,

    • Bunu birden fazla yöntemle çözebiliriz.

      Ben iki tanesinden bahsedicem bir tanesi php fonksiyonu olan “array_chunk” fonksiyonu. Elimizde arrayi istediğimiz uzunluktaki arraylere bölmeye yarayan fonksiyondur.Biz elimizdeki $registatoin_ids şu şekilde bölebiliriz.

      $newArray = array_chunk($registatoin_ids, 1000);

      foreach ($newArray as $inner_array) {

      //Burdaki $inner_array artık boyutu 1000 olan arrayimiz

      //Curl işlemlerini burda devam edicek ama burada tekli curl değil multi curl işlem gerekecek

      //Yani Curl biri bitince diğeri başlaması lazım bunuda multi curl işlemleri ile yapıcağız

      //Multi curl hakkında detaylı bilgiyi http://php.net/manual/tr/function.curl-multi-init.php bu adresten bakabilirsin

      }

      Bir diğeri ise databaseden çekerken limit koyup 1000’er 1000’er çekmek
      $i = 0;
      while(true){

      $sql = “SELECT *FROM wp_gcm_kullanicilar Order By id ASC LIMIT ($i*1000),(($i+1)*1000)”;

      //gelen cevabı myqli_num_rows ile saydır

      if($saydir==1000){
      multi CURL işlemleri
      $i++;

      }else{//1000 den küçükse son kayıt demektir

      multi CURL işlemleri

      break;//bu while döngüsünden cıkmaya yarar

      }

      }

  • Merhabalar, denilen her şeyi eksiksiz yaptım. Güzelce de çalışıyor eyvallah ama kayıt işlemini yapmıyor. SQL’e baktığımda boş bir veri geliyor. Sorun nereden kaynaklanıyor anlamıyorum. Ayrıca SQL’i boşalttığım halde uygulamaya tekrar telefondan girdiğim zaman bu kayıtlı diyor. Ama SQL’e kayıt yapmıyor malesef. Acaba sorun nerede bunu bir türlü çözemedim, mobilehanem yazan yerleri de editledim site olarak, attığım php dosyasının yolu bile doğru. Cevap bekliyorum, iyi günler.

  • Uygulama aktif bir şekilde iken, yani açıkken, bildirim alınmaması durumunu nasıl ayarlayabilirim ?

    • Aklıma gelen ilk yol şu:
      “wp_gcm_kullanicilar” tablosunda bir sütun açar 1 veya 0 değeri tutarım. Kullanıcı notification istemediğini belirttiği zaman sunucuya istekde bulunur o registration_Id ye ait 1 olan değeri 0 yaparım. Notification göndeririken de değeri 1 olanlara gönderirim.

  • tabloda bu hatayı alyorum

    Hata

    SQL sorgunuzda bir hata olduğu görünüyor. MySQL sunucusu hata çıktısı aşağıdadır, eğer varsa, sorunu teşhis etmenizde ayrıca size yardımcı olabilir.

    ERROR: Bilinmeyen Noktalama İşareti Dizgisi @ 40
    STR: </
    SQL: CREATE TABLE wp_gcm_kullanicilar (
    id INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    registration_id TEXT NOT NULL
    ) ENGINE = INNODB

    SQL sorgusu:

    CREATE TABLE wp_gcm_kullanicilar ( id INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , registration_id TEXT NOT NULL ) ENGINE = INNODB

    MySQL çıktısı:

    #1064 – You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘wp_gcm_kullanicilar (
    id INT( 10 ) NOT NULL AUTO_INCR’ at line 1

    • 
      
      CREATE TABLE `wp_gcm_kullanicilar`  ( `id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `registration_id` TEXT NOT NULL ) ENGINE = INNODB
      
      

      Burdaki back tırnakları nedense wp de yazamadım.Kendisi otomatik code diye çeviriyor.

  • GET_ACCOUNTS iznini almasak sorun olur mu ? Çalışır mı Kullanıcılar pek hoşlanmıyor bu izinden 🙂

      • FileZilla ile hostingime atıp ordan çağırabilirim demi ?
        Sabahtan beri deniyorum, cihaz kaydediliyor fakat bildirim gelmiyor.

        (Projenin gereken yerlerini değiştirip kendi Project ID mi ve Api Key’imi ekledim)
        Yardımcı olursanız sevinirim hocam 🙂

        • Evet filezilla veya herhangi bir ftp programıyla atıcaksın linux hostingine. Ben android tarafında değerleri get ile gönderdikten sonra daha cevabı beklemeden get başarı ile gittiyse direk cihaz kaydedildi diyorum.Ama kendim bir projede kullanılacak olsam sunucudan basarılı cevap geldiğinde register edildi mesajı veririm.

  • Merhaba, öncelikle örnek uygulamanız için teşekkürler.

    Benim sunucu tarafıyla ilgili bir sorum olacak.

    Örneğinizde birden fazla kullanıcıya aynı bildirimi gönderiyorsunuz.

    Benim sormak istediğim; birden fazla kullanıcıya dinamik içerikli bildirimleri tek bir curl komutu çalıştırarak nasıl gönderebiliriz?

    Örneğin 100 tane kullanıcım var. Kullanıcı isimleri; x, y, z …………
    Gidecek bildirimlerde kullanıcılara özel içerikler olmasını istiyorum.

    Örneğin;
    x kullanıcısı için “Merhaba x”,
    y kullanıcısı için “Merhaba y”


    şeklinde mesajları tamponlayarak tek bir curl komutu ile tüm bildirimleri nasıl gönderebilirim?

    Döngü içerisinde 100 kere curl komutu çalıştırmak muhtemelen performansı etkileyecektir. Ayrıca Google sunucuları ard arda bu kadar çok istek yapılmasını saldırı olarak algılar mı bilmiyorum.

    Yardımcı olursanız sevinirim. İyi çalışmalar.

  • Emeğine sağlık kardeşim çok ihtiyaç duyduğum birşey ama bende mesaj gönderdiğimde Unauthorized Error 401 hatası veriyo. Tabi normal olarakta bildirimler gitmiyor yardımcı olurmusun acaba nerde yanlış yapmış olabilirm?

  • Hocam elinize sağlık. Ben bu kadar detaylı değil de sadece on off butonu koyarak ve kullanıcıdan saat isteyerek her gün o saatte belirli bir yazıyı bildirim göndermesini istiyorum. Nasıl yapabilirim

    • Senin istediğin yapı bundan biraz daha detaylı:) Bunu yapmak zor değil ama daha çok uğraştırır. Kullanıcı istediği saati seçtiğinde sen bu saat bilgisini Android’den server’a yolluyacaksın ve bu bilgiyi veritabanında tutacaksın. Serverda ise her dakika çalışıp databaseden saatleri kontrol eden bir php dosyan olacak. Örneğin şuan saat 19:00 ise veritabanında 19:00 kayıtlı olan kullanıcıyı bulacak ve sadece ona bildirim gönderecek. Yani iş daha çok server tarafında . Burda sana tavsiyem dakikalar bazında çalışıp server yormaktansa en azından yarım saatte bir çalışan php dosyası ile 19:00 ile 19:30 arasındakilere göndermen senin için daha iyi olacaktır.

      • Ben hiç servera göndersin istemiyorum. Hatırlatıcı, alarm gibi düşünün. Metin sabit, sadece kullanıcı açık veya kapalı diye seçecek, açık ise belirtilen saatte hatırlatacak.

        • O zaman Google Cloud Messaging ile alakası yok sorunun Alarm Manager aratacaksın. Benim Alarm Manager ile yazdığım bir ders yok malesef.İnternetten araştırman gerekecek.

          • Local Notification aratması sorunun çözümü değil.Belirli saatlerde notification göndermesi için Alarm Manager kullanmalı. Notification çıkarmak zaten Google cloud messaging deki Notification göstermekten farklı değil.

  • Hocam çok güzel örnek olmuş fakat google ı aradan çıkarsak, kendi sunucumuzdan doğrudan gönderme şansımız yok mu? Nodejs bu işi yapabilir diye umuyorum ki web tabanlı çok güzel yapıyor. Bu konuda bilginiz var mı? Teşekkür ederim.

    • Öncelikle yorum için teşekkür ederim. Ben kullanmadım node.js konu hakkındada pek bir bilgim yok. Ama Google Cloud Messaging ile de gayet kolay. Node.js ile nasıl kolay mı zor mu pek bilmiyorum.

  • Database’deki kullanıcı sayısı 1000’i geçtiğinde
    Number of messages on bulk (1012) exceeds maximum allowed (1000) şeklinde bir hata veriyor ve mesajı göndermiyor nasıl çözebiliriz

    • Google tek seferde 1000 tane notification göndermeye izin veriyor. 1000 üzerinde notification için php curl ile göndermen gerekir notificationları.

  • Hocam değerli dersleriniz ve bilgilerinizi paylaştığınız için çok teşekkür ederim. Öncelikle bloğunuzdaki tüm derslerinizi takip etmeye çalışıyorum. Amatörce merak sardığım bu işte bir noktada takıldım. GCM ve webview’i birleştirdim ancak login uygulamasını bu uygulamalarla birleştiremedim. Amacım bir kullanıcı önce login olsun daha sonra notification alsın. Nasıl yapabileceğimle ilgili küçük de olsa bilgi verirseniz sevinirim. Teşekkürler..

    • Öncelikle yorum için ben teşekkür ederim.Bence login uygulama ile başla .Yani demek istediğim önce login uygulamasını indir. Onu çalıştırdıktan sonra açılan activitye webview koy. Sonrasında ise Push Notification olayını ekle .Bu sıra ile gidersen entegre etmen kolay olacaktır.

  • Hocam bildirim uygulamasını denemek için illa Google Play Store’da olması mı gerekiyor uygulamanın. Yani Emülatör üzerinden deneme yapamayız değil mi?

  • Önceden belirlediğimiz sabit bir mesajı bir event gerçekleştiğinde gönderebilmek için send.php dosyasını nasıl düzenlemeliyiz ?.

    • Send.php içindeki
      $mesaj = array(“notification_message” => $_POST[‘mesaj’]); kısmındaki

      $_POST[‘mesaj’] yerine “Yazacağın mesaj şeklinde static mesaj set edebilirsin”

  • 1-Türkçe karakter kullanıldığında bildirim boş olarak gidiyor. Bunun çözümü var mıdır ?
    2- Denemelerimde ortalama bildirim gönderilme süresi 17 saniye çıktı. Bildirim gönderildiğinde örneğin 1000 kişilik bir üye grubunda bildirimi ilk alan ile son alan arasında ne kadar bir süre fark olur ?

  • private static final int PLAY_SERVICES_RESOLUTION_REQUEST = 9000;
    bu satırdaki 9000 neyi ifade ediyor?

  • regid uygulama içinde kontrol ediliyor fakat versiyon değiştirip güncelleme yapılınca regid değeri database için primary key olmadığından bir cihaz için birden çok kayıt yapabiliyor…Doğru mudur? Bu bizim için bir problem değil midir ?

    • Merhaba , soru gerçekten siteye gelmiş en güzel sorulardan bir tanesi öncelikle ben teşekkür ederim:) Konuya açıklık getirelim. Google dökümanlarında, versiyon değişimlerinde eski registration id’nin değişebileceğini söylemiş. Yani registration id nin değişmesi demek cihaza notification gelmemesi demek. Biz bunu handle edip Databasimize yeni registration id yi kaydetmemiz, eskisini güncellememiz gerekir. Eskisi ile güncellemeyip yeni kayıt açmamizda bir problem olmaz ama sağlıklı olan eskisinin yerine yenisi ile güncellemek. Bunuda şöyle yapabiliriz .Sharedpref de regId’yi tutarken yanında versiyon bilgisinide tutabilirsin. Baktın ki sharedpref deki versiyon ile mevcut versiyon tutmuyor yeni bir webservis ile eski regId ile yeni regId ni database’e gönderip eskisinin yerine yenisini kaydedebilirsin.

      • Merhaba ;), 2 cihaz içinde aynı sorunla karşılaşınca sormak istedim uygulamaya güncelleme verdiğimde kayıt edilen regid değerlerinin değişmediğini gördüm..Eğer bir değişiklik varsa kontrol edip kayıt etmek tabiki doğru olan;aksi halde gereksiz işlem yapmılmış olacak…Sanırım uygulama tarafında değilde register.php de sql ile bunu çözmek doğru olacaktır…

        • diger bir konu ise gonderilen mesajda karakter sayisi fazla ise notification expand olabilmeli,bunu eklemekte fayda var..

  • Merhaba ben bu projeyi yaptım çalışıyor ama bir şey eksik.Uygulamayı açıyorum farklı bir activity butona basınca bu activity e ekledim php ile bağladım üyeleri fln görebiliyorum üye kayıt oluyor isim ve e-mail ile fakat sonrasında uygulamayı kapattıp tekrar açtığımda aynı activityi açıyorum tekrar kayıt kısmına tıkladığımda kayıt kısmı açılıyor ben oraya eğer üye daha önce kayıt oldu ise o isim ile direk başka bir activity e yönlendirmek istiyorum.Algoritma şöyle
    1-Ana Aktivitiyi aç
    2-kullanıcı Bildirim Sistemine Giriş yap butonuna bassın
    3-Kullanıcının e-mailini kontrol et
    4-eğer kayıtlı ise direk bildirimler kısmına gönder yoksa kayıt ekranını aç?
    nasıl yapabilirim bilgisi olan ?

    • Sorduğun sorunun bu konuyla pek alakası bulunmuyor. Kişi kayıt olduğunda bilgilerini Sharedpreferences yada Sqlite kullanarak kaydedersin. Kayıt sayfası acıldıgında buradan kontrol edip kayıt varsa Bildirimler sayfasına gönderirsin yoksa Kayıt sayfasında bırakır Kayıt olmasını sağlarsın.

        • Peki, gelen bildirimi açtığında kullanıcı onu bir layouta yönlendirebilirmiyiz ? yani bildirimin olduğu bir layouta giricek kullanıcı sonra geri bastığında anamenüye dönecek.

          • İşte bunun konuyla alakası bulunuyor:) Bunu yapabilirsin zor değil.

            PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, SplashScreen.class), 0);

            Burda SplashScreen Yerine açtırmak istediğin sayfayı yazabilirsin.

          • eyw abi yaptım onuda şimdide şöyle bir sorun var.257 kullanıcı vardı sql de kayıtlı.bir bildirim yolladım telefon çıldırdı bildirim arka arkaya 20 30 kere sesi geldi sonra bir kere titredi.her telefonda aynısı oldu 20-30 kere ses geldi bildirim sesi.sonra mesaj geldi

          • Demek ki bişeyleri yanlış yapmışsın.Büyük ihtimal yanlışın PHP kodlarında. Bildirimi birden fazla defa gönderiyorsun. PHP kodlarını kontrol et. Kullanıcı sayısı kadar mı gönderiyorsun acaba?

          • Mesajın uzunluğu bişeyi değiştirirmi abi hani default bir karakter sayısı varmı? atıyorum her gönderimde 8 karakter sınırı var gibi.benimkisi 40-50 karakter oldu onu parça parça göndermiş olabilirmi ?

          • send.php’den yolladğımda 500 tane alt alta multicast log u çıkıyor ama 3 farklı log var;
            {“registration_id”:”APA91bGPnI6jxJsbngmXXdymmxcucbfHpTk9IliCOm13XzohsKn32OxHD3h8yjGmQ0hEZz0OmamRFUEvF0EOMUw1Pa8FYtWcXPAxJF9SIDymhzJlbdQ3z0nWEDMRAQV6hIy8xRFkmnlAiPuoXZ_3xKiBn99NTAt5disAD4BEeCZtg9XoCuZzMTw”,”message_id”:”0:1430476173852969%37b8606af9fd7ecd”}
            2.şekil
            {“message_id”:”0:1430476173853603%37b8606af9fd7ecd”},
            3.şekil;
            {“registration_id”:”APA91bGPnI6jxJsbngmXXdymmxcucbfHpTk9IliCOm13XzohsKn32OxHD3h8yjGmQ0hEZz0OmamRFUEvF0EOMUw1Pa8FYtWcXPAxJF9SIDymhzJlbdQ3z0nWEDMRAQV6hIy8xRFkmnlAiPuoXZ_3xKiBn99NTAt5disAD4BEeCZtg9XoCuZzMTw”,”message_id”:”0:1430476173863943%37b8606af9fd7ecd
            4.şekil
            {“message_id”:”0:1430476173870998%37b8606af9fd7ecd”},{“message_id”:”0:1430476173872419%37b8606af9fd7ecd”},{“message_id”:”0:1430476173870992%37b8606af9fd7ecd”},{“message_id”:”0:1430476173871965%37b8606af9fd7ecd”},{“message_id”:”0:1430476173871966%37b8606af9fd7ecd”},{“message_id”:”0:1430476173871969%37b8606af9fd7ecd”},{“message_id”:”0:1430476173871971%37b8606af9fd7ecd”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”},{“error”:”NotRegistered”

          • EDIT: SOrun galiba şurda abi, Manifest dosyasında permission kısmında

            kısmında ben bunu direk yazmışım example yerine paket id sini girmem gerekicek.

  • konu için teşekürler. bildirimleri ben son dakika haber olarak atmak için kullanıcam bunun için bildirime tıklandıgında sitenin manşet sayfasına gitmesini istiyorum. bunu nasıl yaparım?

    • PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, SplashScreen.class), 0);

      Burda SplashScreen Yerine açtırmak istediğin sayfayı yazabilirsin.

      • mesaj göndermek istediğim zaman şöyle hata alıyorum abi

        “registration_ids” field cannot be empty

        • Google a gönderdiğin reqistration_ids boş gidiyor. Ya kaydederken hata alıyorsun yada geri çekerken . Mysqlden kontrol et ilgili alan boş mu dolu mu?

          • bu sorunu halletim abi şöyle bir konudan bahsetmek istiyorum;
            ben mesajyı gönderdim telefondan o bildirime tıklandımı başlığını yazdıgım habere gitsin istiyorum. SplashScreen ile tek bir sayfaya gönderebildim.

          • Sen her sayfa için ayrı activity mi oluşturmayı düşünüosun? Elbette tek sayfayı açıcaksın onun içinde haberin id sine göre ilgili haberi açtıracaksın. Bu id yide sharedpref gibi bir yapıda tutabilirsin.Notification gösteririken haberin id sini kaydet SharedPrefe sonra o sayfa acıldıgı zaman id sini cek ilgili haber göster.

          • bu olayın bir kaynak kodu varmı abi? nasıl yapacam pek bişi anlamadım 🙂

  • Merhaba Uygulamamda Parse ile push notification bildirimi gönderebiliyorum fakat benim sormak istediğim push bildirimine onclick olayını nasıl yapabilirim…clickledikten sonra gönderdiğim datayı farklı bir activity içinde nasıl gösterebilirim…şuan bildirime tıklanınca sadece mainactivity’i gösteriyor.

    • PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, SplashScreen.class), 0);

      Burda SplashScreen Yerine açtırmak istediğin sayfayı yazabilirsin.

  • Merhabalar, öncelikle anlatımınız için teşekkür ederim. her şeyi yaptım. hiç hata yok. apk yı telefona attığım zaman ‘malesef durdu’ uyarısı veriyor. ne yapmam lazım ?

  • Merhaba, Öncelikle Teşekkür ederim eline sağlık. Herşeyi yaptım, phpde echolattırdığımda aşağıdaki gibi sonuçta alıyorum, fakat cihaza herhangi bir şekilde bildirim gelmiyor ne yapmalıyım? Teşekkürler

    “success”:1,”failure”:0,”canonical_ids”:0,”results”:[{“message_id”:”0:1431944525654327%3c47560df9fd7ecd”}]}

    • Buraya kadar sorunsuz calıstıysa cok büyük ihtimal Android kısmında sorun var.
      Log.d(“mesaj—>>>”,mesaj);
      Bu kısımdan Log alamıyor musun?

      • Merhaba, manifest.xml’de küçük bi hata varmış ondan dolayı olmuyormuş, teşekkür ederim.

  • Merhabalar, generateNotification fonksiyonum resimde göründüğü şekildedir. Fakat; Gelen bildirime tıkladığım zaman MainActivity.java class’ını çağırmak yerine: bildirimi temizliyor. Bunu (benim kaynak koduma göre) nasıl çözebilirim?

    Teşekkür ediyorum 🙂

    • Senin koduna göre bilmiyorum ama hatan bence Panding Intent kısmında.

      PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
      new Intent(this, SplashScreen.class), 0);

      Burda Açtırmak istediğin Activity ile SplashScreen değiştir bakalım çözülüyor mu?

  • Mysql veritabanında birbirinin aynı registration id birden fazla olursa sorun olur mu ?. Bunları teke indirmek gerekli midir ?

    • birden fazla olması durumunda aynı kişiye birden fazla bildirim gideceğini düşünüyorum. Sorun bu olur. O yüzden registration id’yi tuttuğun alanı Unique yapıp mükerrer kayıtı engelleyebilirsin.

      • Mükerrer kayıtları manuel olarak sildikten sonra o sütunu unique yapmak istediğimde aşağıdaki uyarı geliyor :

        Hata

        SQL sorgusu:

        ALTER TABLE `wp_gcm_kullanicilar` ADD UNIQUE (

        `registration_id`);

        MySQL çıktısı: #1170 – BLOB/TEXT column ‘registration_id’ used in key specification without a key length

        Bunu nasıl çözebilirim ?

  • @integer/google_play_services_version kısmının altı kırmızı çizgi ile çizili bu yüzden uygulama çalışmıyor. @integer/google_play_services_version altı neden hatalı olabilir.

  • {“multicast_id”:9137775754851854025,”success”:0,”failure”:1,”canonical_ids”:0,”results”:[{“error”:”MismatchSenderId”}]}’

    Hatanın sebebi nedir?

    Emeğinize sağlık bu konu gerçekten çok önemliydi sizde çok iyi bir şekilde izah etmişsiniz .)

  • oncelikle mukkemmel bir ders oldugunu soylemem gerekli ancak ben bildirimleri cok gec aliyorum nereden baksaniz 20 dk gec geliyor bunun sebebi ne olabilir ?

    • Yorum için teşekkür ederim.Geç gelmesinin sebebi Google ile alakalı bir durum. Sizin sunucudan çıktıktan sonra Telefona gelene kadar sizin yapacak birşeyiniz olmuyor. Ama 20 dakika geç gelmesi pekde mantıklı değil. Benim denemelerimde hemen geliyor.

      • bende emuletorden kaynaklı oldugunu dusundum baska emuletorlerde denenedim ancak onda da aynı sekilde success result u almam 1 sn ye bile sürmüyor ancak bildirim oldukca geç geliyor.. Aklıma takılan bir sürü futbol skorunu gönderen uygulamanın olması ve bir cogu skoru ligtv yanından önce gönderiyor bunu nasıl yapıyorlar ? demem o ki client tarafında bir hatam olabilir mi Gcmbroadcastim yavas algılıyor veya onHandleIntent methodum gec işlem yapıyor olabilir mi ? Regıster kaydında da hiç bir beklemem yok çünkü

  • Merhaba bana böyle bir değer dönüyor ama bildirim gelmiyor sıkıntı neyden kaynaklanmış olabilir

    (id=0:1439205975029375%be313eb766d6cf16)

  • Merhaba öncelerde sorduğum sorunun cevabını buldum ama notification kısmına gelen mesaj null değer alıyor. Onu server tarafından gelen değerle nasıl doldurabiliriz. Teşekkürler.

    • 
      
      String messageType = gcm.getMessageType(intent);
      String mesaj = intent.getExtras().getString("notification_message"); 
      
      

      Burda “notification_message” kısmı sunucudan gönderdiğiniz mesaj değişken değeri ile aynı olmalıdır.

    • Hatalı kısımları paylaşırsanız düzeltiriz. Burdaki kaynak kodların hiç biri çalışmadan buraya yüklenmiyor. Siz kendi projenize entegre ederken sorunlarla karşılaşmış olabilirsiniz.

  • Merhaba uygulamamda telefon nosu adı ve soyadını almak istiyorum GCM de telefon ID Ve Mail adresini aldım ama telefonno ve adını alamadım bilgisi olan arkadaş varmıdır

  • Panel işinide hallettim bilgim var zaten php kısmını yaparken kodları tamamen çözdüm 🙂

    şimdi ben push yollarken title yide yolluyorum ama bir türlü alamadım String leri 2 tane yapıyorum hata veriyor çözemedim bi türlü yani burayıda “.setContentTitle”

  • Push Notification﹕ Received: Bundle[{message=mesajımmmm, title=başlıkkk,

    üsttekini görüyorum altta ama yazdırmaya gelince hoşaf oluyor 🙂

    • Çözümü paylaştığın için teşekkürler. Yanlız direk sorduğun sorunun altına cevap Yanıtla diyerek cevap verirsen daha toplu olur.
      Kolay Gelsin.

  • Error:(94, 13) error: cannot access HttpRequest

    class file for org.apache.http.HttpRequest not found

    Böyle bi hata alıyorum nasıl çözebilirim?

  • Merhaba push olarak link yollamak istiyorum yani webview olarak mesaja tıklanınca yolladığım link açılsın konu hakkında bilgisi olan varmıydı php ile yolluyorum ama if elselerle uğraştım java da çözemedim

  • {“multicast_id”:8035945768882311296,”success”:0,”failure”:2,”canonical_ids”:0,”results”:[{“error”:”InvalidRegistration”},{“error”:”InvalidRegistration”}]}

    Hatasını alıyorum 🙁

  • ellerine sağlık aşamaları düzgün takip edip uygulayınca çalışıyor.
    Bundan ekstra olarak daha kapsamlı daha özelleştirilebilir dersler bekliyoruz..

  • Kaynak kodları aynen içeri aktardım fakat böyle hatalar alıyorum. Atladığım bir aşama mı var? Neyi yanlış yapıyorum bir türlü çözemedim

  • Curl failed: Unknown SSL protocol error in connection to android.googleapis.com:443 hatası alıyorum 4-5 aydır çalışıyodu bugün bu hatayı veriyor nasıl düzeltebilirim, bildirim gönderdiğim php dosyasından kaynaklanıyor

  • Örnek için teşekkürler, gayet açıklayıcı ve net olmuş. Sorum şu, benim veri tabanımda kullanıcı tipi olarak 10’dan fazla tip var. Her bir tür için belirli push notification atmak istiyorum, nasıl yapabilirim. Mesela a grubuna bu notification’u alırken b grubu almayacak, ve belirli bir görev dahilinde olacak. Hastane sistemini örnek olarak verecek olursam, diyelim ki dahiliye servisinde hastanın birinin ilaç zamanı geldi ki bu da sistem saatiyle anlaşılacak ve bu durumda otomatik olarak bir notification gönderilecek, yardımlarınız için şimdiden teşekkürler.

    • Bunu Android tarafında değil PHP tarafında halledeceksin.

      PHP de tüm kullanıcıları çektiğim satır var

      
      
      $sql = "SELECT *FROM wp_gcm_kullanicilar";
      
      

      yerine

      
      
      $sql = "SELECT *FROM wp_gcm_kullanicilar WHERE group="a" ";
      
      

      şeklinde yapmalısın.

      Tabiki burda group kısmını sen kendi veritabanındaki kayıtlara göre yapmalısın.

    • Merhaba veritabanına ekleme işini halletim fakat regId kısmı boş geliyor bu google cloud manager la alakalı olabilir mi ? proje numarası doğru proje number kısmını ekledim sizin kodları çalıştırıyorum ama regId boş değer veritanına ekleniyor.

    • regId yi external storage ile halletim ama bu sefer buluttan bildirim gelmiyor cihaza send kısmı çalışmıyor galiba

    • Merhaba send kısmını şimdi çalıştırdım ama sadece titreşim geliyor ekrana birşey düşmüyor nereye bakmam gerekiyor ?

      • Eğer yinede gelmiyorsa
        NotificationCompat.Builder
        içindeki

        .setContentTitle(“Mobilhanem”)
        .setSmallIcon(R.drawable.ic_launcher)
        .setStyle(new NotificationCompat.BigTextStyle() .bigText(msg))
        .setContentText(msg)
        Bu kısımları iyice kontrol et.

  • Merhabalar, öncelikle elinize saglık harika bir örnek uygulama olmuş. Ben bu uygulamayı note2 de denedim ve çalıştırdım. Sorunum şu: uygulama boyutu yaklaşık 8-10Mb. Bu uygulama boyutunu nasıl minimum seviyeye düşürebilirim ?

  • merhaba projeyi uyguladım çalışıyor ancak veritabanına gelen bir id yok. şöyle bir mesaj alıyorum.

    02-05 10:23:59.055 23503-23503/? I/Haber5N GCM: Registration id bulunamadı.

    02-05 10:24:04.115 23503-23503/com.rasimakar.haber5n I/dalvikvm: Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations

    02-05 10:24:04.115 23503-23503/com.rasimakar.haber5n W/dalvikvm: VFY: unable to resolve virtual method 575: android/content/res/TypedArray;.getChangingConfigurations ()I

    02-05 10:24:04.115 23503-23503/com.rasimakar.haber5n I/dalvikvm: Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType

    02-05 10:24:04.115 23503-23503/com.rasimakar.haber5n W/dalvikvm: VFY: unable to resolve virtual method 597: Landroid/content/res/TypedArray;.getType (I)I

    02-05 10:24:04.205 23503-23503/com.rasimakar.haber5n E/com.parse.PushService: Could not start the push service. Make sure that the XML tag is in your AndroidManifest.xml as a child of the element.

    02-05 10:24:04.280 23503-23503/com.rasimakar.haber5n I/chromium: [INFO:library_loader_hooks.cc(112)] Chromium logging enabled: level = 0, default verbosity = 0

    02-05 10:24:04.280 23503-23503/com.rasimakar.haber5n I/BrowserProcessMain: Initializing chromium process, renderers=0

    02-05 10:24:04.285 23503-23503/com.rasimakar.haber5n I/chromium: [INFO:url_util.cc(429)] AddStandardScheme is not supported

    02-05 10:24:04.285 23503-23503/com.rasimakar.haber5n I/chromium: [INFO:url_util.cc(429)] AddStandardScheme is not supported

    02-05 10:24:04.285 23503-23503/com.rasimakar.haber5n I/chromium: [INFO:url_util.cc(429)] AddStandardScheme is not supported

    02-05 10:24:04.285 23503-23503/com.rasimakar.haber5n I/chromium: [INFO:url_util.cc(429)] AddStandardScheme is not supported

    02-05 10:24:04.310 23503-23721/com.rasimakar.haber5n W/chromium: [WARNING:proxy_service.cc(888)] PAC support disabled because there is no system implementation

    02-05 10:24:04.670 23503-23503/com.rasimakar.haber5n I/dalvikvm: Could not find method android.security.NetworkSecurityPolicy.getInstance, referenced from method com.google.android.gms.ads.internal.t.e.a

    02-05 10:24:04.670 23503-23503/com.rasimakar.haber5n W/dalvikvm: VFY: unable to resolve static method 1032: Landroid/security/NetworkSecurityPolicy;.getInstance ()Landroid/security/NetworkSecurityPolicy;

    02-05 10:24:04.680 23503-23503/com.rasimakar.haber5n I/dalvikvm: Could not find method android.content.pm.PackageManager.getPackageInstaller, referenced from method com.google.android.gms.common.nb.a

    02-05 10:24:04.685 23503-23503/com.rasimakar.haber5n W/dalvikvm: VFY: unable to resolve virtual method 424: Landroid/content/pm/PackageManager;.getPackageInstaller ()Landroid/content/pm/PackageInstaller;

    02-05 10:24:04.715 23503-23743/com.rasimakar.haber5n I/OMXClient: Using client-side OMX mux.

    02-05 10:24:04.720 23503-23503/com.rasimakar.haber5n I/OMXClient: Using client-side OMX mux.

    02-05 10:24:04.875 23503-23503/com.rasimakar.haber5n I/Ads: Starting ad request.

    02-05 10:24:04.875 23503-23503/com.rasimakar.haber5n I/Ads: Use AdRequest.Builder.addTestDevice(“595CF596D3F04D38FEA78959B140622F”) to get test ads on this device.

    02-05 10:24:04.885 23503-23503/com.rasimakar.haber5n I/Ads: Please set theme of AdActivity to @android:style/Theme.Translucent to enable transparent background interstitial ad.

    02-05 10:24:04.910 23503-23503/com.rasimakar.haber5n I/Ads: Starting ad request.

    02-05 10:24:04.910 23503-23503/com.rasimakar.haber5n I/Ads: Use AdRequest.Builder.addTestDevice(“595CF596D3F04D38FEA78959B140622F”) to get test ads on this device.

    02-05 10:24:04.920 23503-23503/com.rasimakar.haber5n I/Ads: Please set theme of AdActivity to @android:style/Theme.Translucent to enable transparent background interstitial ad.

    02-05 10:24:05.185 23503-23503/com.rasimakar.haber5n I/Choreographer: Skipped 66 frames! The application may be doing too much work on its main thread.

    02-05 10:24:05.830 23503-23755/com.rasimakar.haber5n W/Ads: There was a problem getting an ad response. ErrorCode: 1

    02-05 10:24:05.890 23503-23503/com.rasimakar.haber5n W/Ads: Failed to load ad: 1

    02-05 10:24:06.815 23503-23514/com.rasimakar.haber5n I/Ads: No fill from ad server.

    02-05 10:24:06.965 23503-23503/com.rasimakar.haber5n W/Ads: Failed to load ad: 3

  • Hocam bu kaynak kodları Android Studio ‘ya import etmek istediğimde Settings.jar bulunamadı diye hata veriyor. Nasıl çözebiliriz.

  • İndirdiğim Kaynak kodunu Android Studio ya import ettiğimde resimdeki gibi bir hata alıyorum. sorun nedir acaba yardımcı olur musunuz?

    • Şuan uygulamada hiç bir hata yok fakat emulatorde çalıştırdığımda Google Play Service yok diyor. Derslerinizdeki Google Play Services ekleme işlemini de yaptım. Fakat hala aynı sorun var.

        • Peki Genymotion emülatorlerine google play servislerini nasıl ekleyebilirim. yardımcı olur musunuz?

          • Abi gerçek cihazda dene . Genymotion dersimiz var orda anlatmıştım ama ordaki gapps(google appslerde ) artık servis dışı kalmış. Ama dersimi incelersen anlayacaksın ne demek istediğimi.

          • Taha Hocam gerçek cihazda denedim Uygulama durduruldu dedi açmadı. Buradaki Kaynak kodu indiriyorum Google Play Services dersinizdeki gibi servisleri ekliyorum. Zaten daha önceki oluşturduğum uygulamalarada ordaki dersinizden bakarak eklemiştim. onlarda problem olmadı ama bunda sıkıntı çıkıyor. Lütfen yardımcı ol hocam bu bildirim işini halletmeme

          • Ne zaman crash oluyor. Uygulama çalışır çaılşmaz mı yoksa notification gönderdiğin zaman mı? Crash olunca logcat çıktısını paylaşır mısın?

          • {“multicast_id”:4955136517638728213,”success”:0,”failure”:1,”canonical_ids”:0,”results”:[{“error”:”MismatchSenderId”}]} bunu nasıl duzeltebilirim yardımcı olurmusun

  • Merhaba,
    Örnek kod çok güzel çalışıyor ancak takıldığım bir konu var.
    Kullanıcı uygulamayı kaldırıp yeniden kurduğunda, register işlemi sırasında yeni bir regid üretiyor ve bizde bu yeni regid’yi de veritabanına yeni bir kullanıcıymış gibi ekliyoruz ancak tahminimce aslında yeni bir regid atamıyor sadece aynı regid’ye yeniden hashing yapıyor ve bize yeni bir regid gibi görünüyor, çünkü push notification gönderdiğimizde o kullanıcıya birden fazla bildirim gidiyor. (kaç defa kaldırıp kurduysa o sayıda bildirim geliyor)

    Tahminimce bunun 2 çözümü olabilir,
    1- Kullanıcı uninstall yaptığında bir event tetiklenmeli bizde o kaydı veritabanımızdan kaldırmalıyız?
    2- Kullanıcı uninstall yapıp yeniden install yaptığında, yeni oluşam kaydın aslında eskiden var olan bir kayıt olduğunu fark edip regid’yi güncellemeliyiz?
    ama nasıl?

    Yardımınız için şimdiden teşekkürler.

    • Aynı cihazdan aynı uygulama reg_id üretilir farklı reg_id üretmez. Diyelim ki üretti bir uygulamaya iki tane aynı Push atacağını sanmıyorum.
      çözüm için unique olan device_id yi kullanabilirsin. reg_id ile birlikte device_id sini alabilirsin. Aynı device_id den baska reg_id geldiğinde güncellersin. Ama uninstall u tetikleyen bir yapı yok.

  • Merhaba,
    Kodu çok güzel açıklamışsın ama benim gibi acemiler için gerçekten bu bildirim işi çok zor 🙂 benim sorunum uygulamayı açtığımda register yapıyor veritabanına ekliyor. Ama bildirim gönderdiğimde telefona bildirim gelmiyor buradaki hatayı nasıl kontrol edebilirim? Eğer bir log dosyasını görmek isterseniz o log dosyasını nerde söylebilir misiniz?
    yardımlarınız için simdiden teşekkurler

      • Hocam

        GcmIntentService classında
        @Override
        protected void onHandleIntent(Intent intent) {
        Bundle extras = intent.getExtras();
        GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
        //Gelen mesaj tipini alıyoruz
        String messageType = gcm.getMessageType(intent);
        String mesaj = intent.getExtras().getString(“notification_message”);

        intentden gelen extras lar gelmiyor ve mesajı Log.e ile yazdırmaya çalıştığımızda null hatası veriyor

        sebebini çözemedim

  • uygulama çok güzel çalışıyor. Fakat bildirime tıklandığında uygulama açılıyor ama yazı uygulama içerisnde yok. uygulamaya kaydedemezmiyiz ? kullanıcı bildirime tıkladığında uygulama açılsın ve gelen yazıyı görsün ?

    • Evet yapabilirsin. Gelen mesajı SharedPreference içine kaydedersin. Sonrasına PendingIntent olarak bir Activity açtırırsın ve o activity içinde SharedPreference içinde kaydettiğin değeri gösterirsin.

      • Hocam eline sağlık, “Evet yapabilirsin. Gelen mesajı SharedPreference içine kaydedersin. Sonrasına PendingIntent olarak bir Activity açtırırsın ve o activity içinde SharedPreference içinde kaydettiğin değeri gösterirsin.” örnek kodla açılayabilirmisin?

  • verdiğiniz AndroidManifest.xml, SplashScreen.java , RegisterApp.java , GcmBroadcastReceiver.java , GCMIntentService.java kodlarının hangi satırlarını kendi uygulamamıza eklememiz gerekiyor?

    uygulamam tamamen hazırlandı. bu verdiğiniz kodların hangi bölümünü eklemem gerekiyor?

  • Öncelikle teşekkür ederim paylaşımınız çok güzel.

    2 sorum var:

    1- Bildirime tıklayınca activity nasıl açtırabiliriz? şuan bildirim gelince otomatikmen activity açılıyor.

    2- bildirime tıklayınca bildirimi nasıl cancel yaparız?

    • Yorum için teşekkür ederim.
      1- PendingIntent contentIntent = PendingIntent.getActivity(this, 0,new Intent(this, SplashScreen.class), 0);

      bu kısımda SplashScreen yerine açtırmak istediğin Activity yazabilirsin.

      2- NotificationCompat.Builder mBuilder =

      new NotificationCompat.Builder(this)

      .setContentTitle("Mobilhanem")

      .setSmallIcon(R.drawable.ic_launcher)

      .setStyle(new NotificationCompat.BigTextStyle()

      .setAutoCancel(true)

      .bigText(msg))

      .setContentText(msg)

      .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))

      .setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 });

      Android Notification iptal etmek için yukarıdaki setAutoCancel(true) eklemeyi yapacağız.

  • Merhaba uygulama sorunsuz olusturuldu fakat anlamadigim olay su elimde 3 tane telefon var playstoredan uygulamayi 3 ünede yükledim ama telefonlardan sadece 1 tanesi bildirimleri alabiliyor sizce nedeni nedir ?

  • Güzel anlatım teşekkürler tek denemede oldu malum parse kapatılacak olduğu için mecbur kendi sistemimize geçtik.

  • Herşeyi yaptım send.php yi çalıştırdığımda iletiyi yazıyorum gönder dediğimde hiçbişey olmuyor. browser ekranındaki herşey de kayboluyor sebebi ne olabilir yardımcı olursanız çok sevinirim. İyi günler

  • Anlatım için teşekürler, uygulama hatasız açılıyor user mysql’e kaydoluyor. send.php den mesaj succes=1 ile gidiyor fakat telefona notification gelmiyor. project Id ve uygulama api keylerini kendiminkiyle değiştirdim projede ve php de ve uygulamayı android studiodan run diyerek çalıştıruyorum yani google playe yüklemedim. Neden olabilir?

  • Peki bu şekilde çeşitli formatlarda materyaller gönderebilirmiyiz. bir uygulama ile pc üzerinden uygulamayı kullananlara html, excel veya jpg formatlı olarak en kolay şekilde hangisi göderilebilir. Uygulamayı eclipse ile phonegap aracılığıyla web view şeklinde yaptım tek eksiğim, elimdeki bu öğeleri uygulama kullanıcılarına gönderebilmek kaldı. yardımcı olursanız sevinirim

  • Çok ayrıntılı ve başarılı bir anlatım olmuş teşekkürler. Program çalıştı ancak
    if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType))
    kısmında DEPRECATED yani geçersiz ve ya önerilmeyen bir kullanım olduğunu söylüyor. Bunun yerine ne kullanabiliriz. Teşekkürler.

  • Merhaba performans ve birçok şeyi göz önüne aldığımızda bu tarz bir yazılım geliştirmemi yoksa firebase üzerinden mi yazılım geliştirmemizi tavsiye edersiniz?

  • Hocam çok açıklayıcı bi yazı olmuş.Fakat gelen bildirime tıklayınca gidecegi sayfayı nasıl ayarlayacaz.

    • PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
      new Intent(this, SplashScreen.class), 0);
      Burda splashScreen yerine actırmak istediğin activty’i yazabilirsin.

  • S.A. Kolay gelsin ;

    Hocam push bildirim ekranında görünüyor. Fakat bildirim ekranına tıkladıktan sonra uygulama açıldıktan sonra da nasıl bildirimi gösterebiliriz?
    Uygulama açıkken push gelirse alert ile yazdırıyorum ama uygulama kapalıyken bildirim panelinden tıklayınca alert çalışmıyor . Yardımlarınızı bekliyorum Teşekkürler…

    • Gelen Bildirimi SharedPreference kullanarak kaydedebilirsin. Sonra uygulama acıldıgında gösterebilirsin. Yada uygulama acıldıgında webservice bağlantısı kurup son gelen notification mesajını servisten çekip gösterebilirsin.

  • Merhaba,

    Anlatım harika. Büyük emek vermişsiniz. Çok teşekkürler. Ben de ilk aşamada çalıştırdım, mysql e birkaç id kaydettim ve send.php den bunlara bildirim gönderdim. Daha sonra Google tarafında HTTP referrers (web sites) ekledim. Yalnızca izin verdiğim domain altında çalışan php sayfasından bildirim gönderilebilsin istedim. O andan sonra her ne yaptıysam (kısıtlamayı kaldırdım, yeni API Key ler oluşturdum, projeyi dahi yeniden oluşturdum) bir türlü send.php de şu uyarıyı aşamadım. Unauthorized Error 401. Sebebi hakkında fikriniz var mı?

  • Maksimum 1.000 bildirim gönderiliyor. 1.000 üzerinde şöyle bir hata veriyor Number of messages on bulk (1237) exceeds maximum allowed (1000)

    Bu sayısı nereden arttırabilirim?

  • Merhaba. sistemi locale kurdum ve ip adresim üzerinden uygulama registration_id leri mysql e gönderiyor ancak send.php den mesaj gönderirken, Unauthorized Error 401 hatası alıyorum. Proje kimliği ve Proje numarası diye 2 bölüm var. Ben Proje numarası nı ekledim. Key i de send.php yi ekledim. Kodlarda bunun dışında herhangi bir değişiklik yapmadım.

    Hata neden olabilir.

    Aklıma gelenler; google proje sayasında yapmadığım bir ayar olabilir mi veya send işlemini değiştirmiş olabilir mi google

  • webView kısmına cihaz idsinide ekleyebilir miyiz?

    Anasayfa.java daki

    private String Url = “http://siteadresi.com?kod=”;

    kod kısmına sqlle kayıt olan cihaz id yi eklemek istiyorum. Zaten bu id yi alıp yolluyoruz. Yardımcı olur musunuz?

  • Merhaba, anlatım için çok teşekkürler öncelikle. Uygulama ile ilgili sorunum var yardımcı olursanız çok sevinirim.
    send butonuna bastığımda –> registration_ids” field cannot be empty hatasını alıyorum. registration id’ler veri tabanına kaydolmuyor. reg id değerini log cat ile alıp burada yerine koyunca
    –> http://192.168.42.255/gcmphp/register.php?regId=” + regid
    yani bu satırı tarayıcıma yazınca regid veri tabanına kaydediliyor ve bildirim alabiliyorum. Fakat regid değerlerini db’den silip uygulamayı çalıştırdığımda –> httpclient.execute(request); satırında Connection to http://localhost refused şeklinde bir exception veriyor.
    Umarım sorunumu anlatabilmişimdir. Çözüm olabilecek her fikre ihtiyacım var. Yardım eder misiniz?

  • Yenilik Ararken Gözüme carptı fcm den 1000 1000 yollamak için bu kodu kullana bilirsiniz Ben kullanıyorum sıkıntı cıkmıyor.

    $totalToken = count($token_id);
    $multiplier = 1000;
    $offset = 0;
    while ($offset <= $totalToken) {
        $newCounter = $multiplier;
        if($totalToken - $offset < $newCounter) $newCounter = $totalToken - $offset;
        $slicedTokens = array_slice($token_id, $offset, $newCounter);
    	
    	$fields = array(
            'registration_ids' => $slicedTokens,
            'data' => array( "title" => $title, "message" => $message ),);
    	
    	echo $offset." - ".($offset + $newCounter)."  Arası Üyelere Bildirim Yollandı..";
        $offset = $offset + $multiplier;
    }
    
  • Merhaba bu bildirimler ile Mesajlaşma servisleri nasıl yazabiliriz yani kullanıcıya bildirim gönderme işini hallettik ama her kullanıcıya ayrı mesela sipariş verdiğinde o kullanıcıya bildirim gitmesi cevap atması yani bi karşılıklı mesajlaşma işlemini nasıl yapabiliriz

  • Artık bu yöntem google cloud message kapatılmasından dolayı depracet olmuş keşke konu başında belirtilseydi. Not var ama dikkat den kaçabiliyor.

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?