Tüm Platformlar için Hızlı Uygulama Geliştirme --->    Kitabımız...      Delphi

Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Google Cloud Messaging ile anlık Android Bilgi Mesajı (Notification Push Message)
#1
Lightbulb 
Merhaba

Forum mesajlarında 10 resim sınırı olduğu, konu içeriğine eklenen smiley ifadelerin de bu sayıya dahil olduğunu görünce MS-Word ortamında yazıp HTML çıktı alarak örnek host hesabında bulundurarak buraya yansısını eklemek zorunda kaldım.
  • Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol makalenin ilk bölümüne ulaşabilirsiniz. 
  • Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol makalenin ikinci bölümüne (altta gördüğünüz kısım) ulaşabilirsiniz.
  • Makalenin ilk bölümü Google API Key oluşturmak için hangi aşamalarda neler yapmanız gerektiğini içeriyor.
  • Makalenin ikinci bölümü ise Delphi Yakasında ANDROID proje oluşturma aşamalarını anlatıyor. 
sample_init_gcm1.png
  • Bu komplike bir sistemdir.
  • Bu sistemde Kinvey veya Parse isimli hizmet aboneliklerine gerek duymayacaksınız. 

   PAS Unit'in 
  •   "initialization" kısmında  xGCMHelper := TGCM_Helper.Create;

  •   "finalization"   kısmında  FreeAndNil(xGCMHelper);
yerleşik olduğundan ana projede ayrıca create edilmesine lüzum yoktur. USES'a eklendiğinde doğal olarak kendiliğinden kullanıma hazır haldedir. 


Sadece EVENT bağlantıları yapılır.


PHP Yakasından bahsedelim
  • Şöyle ki, bir mobil cihaza kurulum gerçekleştiğinde, çalışır çalışmaz DeviceID ve DeviceToken bilgisi yine proje ile verdiğim PHP kodları sayesinde WEB üzerinde daha önce belirlediğimiz bir MySQL veritabanına kaydedilir.
  • Mesaj gönderilecek cihaz listesi daha sonra bu sayede elde edilebiliyor. 
  • Dinamizm bu şekilde korunabiliyor.
  • Aynı zamanda bu PHP kod bünyesine WEB üzerinden de mesaj gönderme opsiyonunu da dahil ettim.
  • "hostinger.com" üzerinden ücretsiz bir demo hesap açtım
  • Linki http://gcmarman.esy.es/ şeklindedir
  • Buraya (4) adet PHP dosyası ekledim. 
  1. include.php (serverAPI key, MySQL kullanıcı hesap bilgileri barındırır)
  2. index.php ki action ile 3 farklı fonksiyon içerir
  3. Table Create ile tabloları oluşturma
  4. Table Drop ile tabloları silme
WEB üzerinden mesaj yayınlamak için basit bir GET metod satır ile aşağıdaki şekilde
Kod:
http://gcmarman.esy.es/index.php?action=sendmsg&mesText=ARMAN Deneme&msgId=1973

satırı yeterlidir. 
Bu mesaj aynı zamanda MySQL veritabanında saklanır. olası gönderim hataları durumu takip edilebilir niteliktedir.


ctrl.include.php dosyası 
  • web üzerinden uygulama için varsayılan APIKey bilgisi, Veritabanı bilgileri ve Veritabanı Erişim modülü içerir.
PHP Kod:
<?php
/* Google Server GCM API Key */
 
 $serverAPIKey 'AIzaSyDIRV3LPlBVhk7zwkXUaXJAuP0rSuSgfxA';
 
 $sendUrl      'https://gcm-http.googleapis.com/gcm/send';
 

/* Database host */
 
 $dbhost "mysql.hostinger.web.tr";

/* Database name */
 
 $dbname "u181040850_gcm";

/* Database username and password */
 
 $dblogin"u181040850_user";
 
 $dbpass "F6NpS8hyJP";

 
 $failure "MySQL problemi. ".$dbhost." bağlantısı yapılamadı..<br>";

if(!
$connect = @mysql_connect($dbhost$dblogin$dbpass)) {
    die(
$failure);
} else {
    if(!@
mysql_select_db($dbname,$connect)) {
        die(
$failure);
    }
}
// diğer türlü bağlantı sağlanmış demektir.
 
 $dbtable $dbname;
//  echo "Database = ".$dbtable."<br>";
?>

index.php dosyası 
  • action parametresiyle güdümlenen 3 farklı işlevi gerçekleştiren ana yapıdır 'regdevice','sendmsg','tokenlist'
PHP Kod:
<?php
  
// Veritabanı Bağlantı Bilgileri ve Global Değişkenler
 
   include("ctrl.include.php");

 
 // Lazım olabilecek bilgi...
 
   $domain getenv('REMOTE_ADDR');

 
 // "action" parametresine göre hangi fonksiyonun çalışacağına karar verilecek.
    
if (isset($_REQUEST['action'])) {
 
   switch ($_REQUEST['action']) {
 
     case 'regdevice':
 
       RegisterDevice($_REQUEST['did'], $_REQUEST['token'], $_REQUEST['platform'] );
 
       break;
 
     case 'sendmsg':
 
       SendPush($_REQUEST['mesText'], $_REQUEST['mesId'], $serverAPIKey$sendUrl);
 
       break;
 
     case 'tokenlist':
 
       DeviceList();
 
       break;
 
     default:
 
       DeviceList();
 
       break;
 
   }
 
 }
 
 else
    
{
     
 DeviceList(); //echo '"action" parametreniz uygun değil.<br>Herhangi bir işlem yapılmadı !';
    
}

//  Mob.Cihaz TokenID'yi db'ye yaz, varsa tarih güncelle
// -----------------------------------------------------
 
   function RegisterDevice($deviceId$deviceToken$platform)
 
   {
 
     $sorgu  ""
 
               ."INSERT INTO devices"
 
               ." (deviceID, deviceToken, devicePlatform)"
 
               ." VALUES"
 
               ." ( '$deviceId', '$deviceToken', '$platform' )"
 
               ." ON DUPLICATE KEY UPDATE deviceLastDate=now()"
 
               .";";
 
      echo $sorgu."<br>";
 
     if ( @mysql_query$sorgu ) )
 
       { echo "ok"; }
 
       else
        
{ echo "error_RegDevice"; }
 
   }

//  Notification Gönderim Operasyonu
// -----------------------------------------------------
 
   function SendPush($mesText$mesId$APIKey$Url)
 
   {
 
     $messageData  = array( 'message' => $mesText,
 
                            'id'      => $mesId,
 
                          );

 
     $headers      = array( 'Authorization: key='.$APIKey,
 
                            'Content-Type : application/json'
 
                          );

 
     $fields       = array( 'registration_ids' => getRegistrationIds(),
 
                            'data'             => $messageData,
 
                            'collapse_key'     => 'ARMAN Bilgi',
 
                           );

 
     // Bağlantıyı Hazırladık
 
     $ch curl_init();

 
     // Hazırlanan bağlantıya url, POST variables ile POST data'yı set ettik
 
     curl_setopt($chCURLOPT_URL           $Url);
 
     curl_setopt($chCURLOPT_POST          true);
 
     curl_setopt($chCURLOPT_HTTPHEADER    $headers);
 
     curl_setopt($chCURLOPT_RETURNTRANSFERtrue);

 
     // Geçici olarak SSL sertifika desteğini kapattık çünkü burada gerek yok
 
     curl_setopt($chCURLOPT_SSL_VERIFYPEERfalse);
 
     curl_setopt($chCURLOPT_POSTFIELDS    json_encode($fields));

 
     // post işlemini yaptık
 
     $result curl_exec($ch);

 
     if ($result === FALSE) {
 
         die('Curl failed: ' curl_error($ch));
 
     } else {
 
         print_r"<br>".$result."<br>" );
 
     }
 
   // Bağlantımızı kapattık
 
   curl_close($ch);

 
   // Gönderdiğimiz Mesajı LOG'layalım
 
     $sorgu  ""
 
               ."INSERT INTO messages"
 
               ." (MessageText, MessResult)"
 
               ." VALUES"
 
               ." ( '$mesText', '$result' )"
 
               .";";
 
       // echo $sorgu."<br>";
 
       if ( @mysql_query$sorgu ) )
 
         { echo "ok"; }
 
         else
          
{ echo "error_MesLog"; }
 
     }

//  DeviceID'ye göre gruplandırılmış en son TokenID'ler
// -----------------------------------------------------
 
   function getRegistrationIds()
 
   {
 
     $sorgu  ""
 
               ."SELECT id, deviceID, deviceToken"
 
               ." FROM devices"
 
               ." WHERE id IN ("
 
               ."    SELECT MAX(id)"
 
               ."    FROM devices"
 
               ."    GROUP BY deviceID"
 
               ." );";
 
     $sonuc         mysql_query$sorgu );
 
     $result_array = array();
 
     while($row mysql_fetch_assoc($sonuc ))
 
     {
 
       $result_array[] = $row['deviceToken'];
 
     }
 
     return $result_array;
 
   }

 
   function DeviceList()
 
   {
 
     $sorgu  ""
 
        ."SELECT id, deviceID, deviceToken, devicePlatform, deviceSignDate, deviceLastDate"
 
        ." FROM devices"
 
        ." WHERE id IN ("
 
        ."    SELECT MAX(id)"
 
        ."    FROM devices"
 
        ."    GROUP BY deviceID"
 
        ." );";
 
     //$sorgu  = "SELECT deviceID, deviceToken FROM devices;";
 
     //echo $sorgu."<br>";
 
     $sonuc   mysql_query$sorgu );
 
     $xsql   'select';

 
     if (!$sonuc)
 
          $sayi = -1; }
 
     else $sayi mysql_num_rows($sonuc); }
 
     //echo "SQL Query : ".$sorgu."<br>";
 
     //echo "Rec Count : ".$sayi."<br>";

 
     if $sayi )
 
     {
 
       $Result "<?xml version='1.0' encoding='utf-8'?>\n<arman>\n";
 
       while($data mysql_fetch_assoc($sonuc)) {
 
         $Result .= " <rec>\n";
 
         foreach($data as $key => $value) {
 
           $Result .=  "  <$key>$value</$key>\n"."<br>";
 
         }
 
           $Result .= " </rec>\n"."<br>";
 
       }
 
       $Result .= "</arman>\n";
 
       echo $Result;
 
     }
 
   }
?>

ctrl.create.php dosyası 
  • include.php ile yanımlanmış veritabanına otomatik olarak TABLO'ları CREATE eden modüldür. 
  • 1 defa çalıştırmak kurulum işlemi için kafidir.
PHP Kod:
<?php
  include
("ctrl.include.php");
 
$veri[1] = "
CREATE TABLE devices (
  id int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Sıra No'
 ,deviceID varchar(255) NOT NULL COMMENT 'CihazID'
 ,deviceToken varchar(255) NOT NULL COMMENT 'CihazToken'
 ,devicePlatform varchar(255) NOT NULL COMMENT 'CihazPlatform'
 ,deviceSignDate TIMESTAMP NOT NULL DEFAULT now() COMMENT 'Kullanıcı hesabı ilk kayıt tarihi'
 ,deviceLastDate TIMESTAMP NOT NULL DEFAULT 0     COMMENT 'Kullanıcı hesabı son giriş tarihi'
 ,PRIMARY KEY (id)
 ,UNIQUE (deviceToken) COMMENT 'UPDATE aşamasında aynı tokena LastDate yazılacak.'
)
ENGINE = MYISAM
AUTO_INCREMENT = 1
CHARACTER SET utf8
COLLATE utf8_general_ci
COMMENT = 'Mesaj PUSH edilecek cihazların tablosudur.';
"
;

 
$veri[2] = "CREATE TABLE messages (
  ID int(10) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT COMMENT 'Sıra No'
  ,DateTime TIMESTAMP NOT NULL DEFAULT Now() COMMENT 'Mesaj Tarihi'
  ,MessageText text DEFAULT NULL COMMENT 'Mesaj İçeriği'
  ,MessResult  text DEFAULT NULL COMMENT 'GCM Icerik Result'
  ,PRIMARY KEY (ID)
)
ENGINE = MYISAM
AUTO_INCREMENT = 1
CHARACTER SET utf8
COLLATE utf8_general_ci
COMMENT = 'Push edilmiş mesajlar tablosudur.';
"
;

 if ( @
mysql_query$veri[1] ) )
 { echo 
"Tablomuz 'devices' Başarılı bir şekilde create edildi <br>"; }
 else
 { echo 
"HATA: Tablo create edilemedi...<br>"; }

 if ( @
mysql_query$veri[2] ) )
 { echo 
"Tablomuz 'messages' Başarılı bir şekilde create edildi <br>"; }
 else
 { echo 
"HATA: Tablo create edilemedi...<br>"; }
?>

  ctrl.drop.php dosyası 

  • include.php ile yanımlanmış veritabanındaki TABLO'ları SİLMEYE YARAYAN modüldür. 
  • çalıştırılırsa TABLOLAR SİLİNİR.
PHP Kod:
<?php
  include
("ctrl.include.php");
 
$veri[1] = "DROP TABLE devices";
 
$veri[2] = "DROP TABLE messages";
 if ( @
mysql_query$veri[1] ) )
 { echo 
"Tablomuz 'devices' Silindi...<br>"; }
 else
 { echo 
"HATA: Tablo silme işlemi başarısız oldu...<br>"; }

 if ( @
mysql_query$veri[2] ) )
 { echo 
"Tablomuz 'messages' Silindi...<br>"; }
 else
 { echo 
"HATA: Tablo silme işlemi başarısız oldu...<br>"; }
?>





DELPHI (Andrdoid) Yakasından bahsedelim
  • Proje paketinde birbiriyle ilişkili (3) proje ve bu projelerin ortak paydası (1) Helper Class Unit bulacaksınız.
  • (1) PHP ile MySQL hesabı üzerindeki veritabanınıza devices ve messages isimli iki tablo açacak PHP web desteği. Web üzerinden de mesaj yollayabiliyorsunuz.
  • (2) Helper.PAS dosyamız ki hem android hem de windows yakasına uygun fonksiyonlar barındırıyor.
  • (3) Helper PAS ile Android Push Mesaj dinleyen modül
  • (4) Helper PAS ile Windows Win32 uygulaması olarak Push Mesaj atan modül.


  • Ana Omurga GoogleCloudMessaging_Helper.PAS dosyamız 
{***************************************************************************}
{                                                                           }
{                   Google Cloud Messaging (GCM)  Class                     }
{                                                                           }
{                    Copyright © 2016 Muharrem ARMAN                      }
{                         muharrem.arman@trt.net.tr                         }
{                                                                           }
{***************************************************************************}
{                                                                           }
{  Google Cloud Messaging (GCM) Servisinden Yardım alarak                   }
{  Mobil cihazlara PUSH mesaj yollamak amacıyla tasarlanmıştır.             }
{                                                                           }
{  php ile veritabanı modülü de mevcuttur. Bu veritabanından mobil cihaz    }
{  listesi alınarak TokenID'lerine mesaj yollamak için kullanılmaktadır.    }
{                                                                           }
{  USES listesine bu UNIT'in eklenmesi yeterlidir.                          }
{  Ekstra bir tanımlamaya gerek yoktur.                                     }
{  Sistem kendiliğinden NOTIFICATION takibine girecektir                    }
{                                                                           }
{  Kullanımı :                                                              }
{ (1) Formunuzun Private kısmına aşağıdaki tanımı ekleyiniz...              }
{                                                                           }
{   procedure NotificationGeldi(Sender: TObject; const                      }
{     strSent_time,                                                         }
{     strId,                                                                }
{     strFrom,                                                              }
{     strMessage_id,                                                        }
{     strMessage,                                                           }
{     strCollapse_key : String );                                           }
{                                                                           }
{ (2) Formun OnCreate olayına da aşağıdaki size özel tanımları yapınız.     }
{                                                                           }
{  xGCMHelper.GCM_ID              := '713......490';                        }
{  xGCMHelper.API_Key             := 'AIz...........................eFI';   }
{  xGCMHelper.PHPPushHost         := 'http://www.domaininiz.com/push/';     }
{  xGCMHelper.OnNotificationGeldi := NotificationGeldi;                     }
{                                                                           }
{ (3) Notification geldi olayına da aşağıdaki dilediğinizi yapınız.         }
{                                                                           }
{  procedure TForm1.NotificationGeldi(Sender: TObject; const                }
{        strSent_time,                                                      }
{        strId,                                                             }
{        strFrom,                                                           }
{        strMessage_id,                                                     }
{        strMessage,                                                        }
{        strCollapse_key : String );                                        }
{  begin                                                                    }
{    Memo1.Lines.Add( 'OnNotificationGeldi:' );                             }
{      Memo1.Lines.Add( '  SentTime: '     + strSent_time    );             }
{      Memo1.Lines.Add( '  Id: '           + strId           );             }
{      Memo1.Lines.Add( '  From: '         + strFrom         );             }
{      Memo1.Lines.Add( '  MessageId: '    + strMessage_id   );             }
{      Memo1.Lines.Add( '  Message: '      + strMessage      );             }
{      Memo1.Lines.Add( '  Collapse_key: ' + strCollapse_key );             }
{  end;                                                                     }
{                                                                           }
{  Üzerinde değişiklik yapmak serbesttir ancak lütfen bu etiket bloğu       }
{  içine yaptığınız değişikliği ve künyenizi yazmayı ihmal etmeyiniz.       }
{                                                                           }
{***************************************************************************}
{  Değişikliği Yapan,  Yapılan Ekleme/Değişiklik bilgisi :                  }
{                                                                           }
{                                                                           }
{                                                                           }
{***************************************************************************}

// Başlangıçta Dikkat Edilecek Hususlar :
// --------------------------------------
// (1) Manifest Dosyasındaki  <%receivers%> başlığının hemen altına
//     Aşağıdaki TAG bloğunu ekleyiniz.
//     (Bu sayede programımız çalışmıyor olsa dahi Push uyarı alınır.)
//     <service android:name="com.embarcadero.gcm.notifications.GCMIntentService" />

// (2) "Project" / "Options" / "Entitlement List" kısmına gelerek
//     "Receive push notifications" başlığını TRUE yapınız.

// (3) "Project" / "Options" / "Uses Permissions" kısmına gelerek
//     "Internet" başlığını TRUE yapınız.

unit GoogleCloudMessaging_Helper;

interface
Uses
 {$IF defined(MSWINDOWS)}
   Windows, Forms, Graphics, Controls, GifImg, Dialogs, IdAntiFreeze,
   ShellApi,
 {$ELSEIF defined(ANDROID)}
   System.Notification,
   System.PushNotification,
   FMX.PushNotification.Android,
 {$ENDIF}
   IdHttp, IdUri, IdSSLOpenSSL, IdSSLOpenSSLHeaders,
   SysUtils, Classes, DateUtils;

 Type
   pCihaz = ^tCihaz;
   tCihaz = Record
     CihazId,
     CihazToken,
     CihazPlatform,
     CihazTarih : String;
   End;
   pCihazBilgileri_Genel = Array of pCihaz;

   pIcerik = ^tIcerik;
   tIcerik = Record
     strSent_time,
     strId,
     strFrom,
     strMessage_id,
     strMessage,
     strCollapse_key : String;
   End;
   pMesajGrubu = Array of pIcerik;

Type
 TOnEvent = procedure(Sender: TObject; const
     strSent_time,
     strId,
     strFrom,
     strMessage_id,
     strMessage,
     strCollapse_key : String ) of object;

Type
 TGCM_Helper = Class(TObject)
 private
   FNotifyTitle          : String;
   FGCM_ID,
   FApiKey,
   FPhpPush              : String;
 {$IF defined(ANDROID)}
   FNotificationCenter   : System.Notification.TNotificationCenter;
   FNotify               : System.Notification.TNotification;
   FOnNotificationGeldi  : TOnEvent;
   FPushService          : TPushService;
   FServiceConnection    : TPushServiceConnection;
   FDeviceID,
   FDeviceToken          : String;
   FMesaj                : pIcerik;
   procedure FOnReceiveNotificationEvent(Sender: TObject;
     const ANotification: TPushServiceNotification);
   function  FDeviceIdToken: boolean;
   procedure FMesajParse( strIcerik: String );
 {$ENDIF}
   function AradanSec( var strIcerik: String; strBas, strSon: String; boolTrim:boolean=false ): string;
 Const
   GCM_OpenUrl   = 'http://gcm-http.googleapis.com/gcm/send';
   GCM_SecureUrl = 'https://gcm-http.googleapis.com/gcm/send';
 public
   constructor Create;
   destructor  Destroy; Override;
   property    GCM_ID  : string read FGCM_ID Write FGCM_ID;
   property    API_Key : string read FApiKey Write FApiKey;
   property    NotifyTitle : string read FNotifyTitle Write FNotifyTitle;
   property    PHPPushHost : String read FPhpPush Write FPhpPush;
 {$IF defined(MSWINDOWS)}
   function    PushMessage( strMesaj, strMesajID: String; boolSecure:Boolean = false ): String;
 {$ENDIF}
 {$IF defined(ANDROID)}
   property    OnNotificationGeldi : TOnEvent read FOnNotificationGeldi write FOnNotificationGeldi;
   property    GelenMesaj  : pIcerik read FMesaj;
   property    HazirlikYap : boolean read FDeviceIdToken;
   property    DeviceID    : String Read FDeviceID;
   property    DeviceToken : String Read FDeviceToken;
   procedure   MesajTest( strMesaj: String; SaniyeSonra:Integer = -1 );
   function    PHPRegisterDevice( DeviceID : string; DeviceToken : string ): boolean;
 {$ENDIF}
 end;

Var
 xGCMHelper : TGCM_Helper;

implementation

{$R RES\RES.RES} // SSL DLL'leri Resource olarak saklanacak...

function TGCM_Helper.AradanSec(var strIcerik: String; strBas, strSon: String; boolTrim:boolean=false ): string;
Var
 strOrjKaynak : String;
begin
 Result := '';
 strOrjKaynak := strIcerik;
 if Pos( strBas, strIcerik ) > 0 then
 begin
   System.Delete( strIcerik, 1, Pos( strBas, strIcerik )+ Length( strBas )-1 );
   if strSon <> ''
     then Result := Trim( Copy(strIcerik, 1, Pos( strSon, StrIcerik ) -1) )
     else Result := Trim( strIcerik );
 end;
 if NOT boolTrim then strIcerik := strOrjKaynak;
end;

constructor TGCM_Helper.Create;
begin
 Inherited;  // Create'de  daima başta call edicez...
 //...
end;

destructor TGCM_Helper.Destroy;
begin
 //...
 Inherited;  // Destroy'da daima sonda call edicez...
end;

{$IF defined(ANDROID)}
function TGCM_Helper.FDeviceIdToken: boolean;
begin
 if FNotifyTitle = '' then FNotifyTitle := 'ARMAN Bilgi Merkezi';
 FNotificationCenter := System.Notification.TNotificationCenter.Create(nil); // USES'da FMX.PushNotification.Android olmazsa çakılıyor...
 FPushService        := TPushServiceManager.Instance.GetServiceByName( TPushService.TServiceNames.GCM );
 FPushService.AppProps[ TPushService.TAppPropNames.GCMAppID ] := FGCM_ID;  // GCM App ID
 FServiceConnection  := TPushServiceConnection.Create( FPushService );
 FServiceConnection.Active                := True;
 FServiceConnection.OnReceiveNotification := FOnReceiveNotificationEvent;
   FDeviceID    := FPushService.DeviceIDValue[ TPushService.TDeviceIDNames.DeviceID ];
   FDeviceToken := FPushService.DeviceTokenValue[ TPushService.TDeviceTokenNames.DeviceToken ];
 if    (FDeviceID    <> '')
   AND (FDeviceToken <> '')
   AND (FPhpPush     <> '')
 then begin
   PHPRegisterDevice( FDeviceID, FDeviceToken );
 end;
 Result := ( FDeviceID <> '' ) AND ( FDeviceToken <> '' );
end;

procedure TGCM_Helper.FMesajParse(strIcerik: String);
begin
 if Assigned( FMesaj ) then Dispose( FMesaj );
 New( FMesaj );
 FMesaj.strSent_time    := AradanSec( strIcerik, '"google.sent_time":"', '"' );
 FMesaj.strId           := AradanSec( strIcerik, '"id":"', '"' );
 FMesaj.strFrom         := AradanSec( strIcerik, '"from":"', '"' );
 FMesaj.strMessage_id   := AradanSec( strIcerik, '"google.message_id":"', '"' );
 FMesaj.strMessage      := AradanSec( strIcerik, '"message":"', '"' );
 FMesaj.strCollapse_key := AradanSec( strIcerik, '"collapse_key":"', '"' );
end;

procedure TGCM_Helper.FOnReceiveNotificationEvent(Sender: TObject;
 const ANotification: TPushServiceNotification);
begin
 if Assigned(OnNotificationGeldi) then // tests if the event is assigned
 begin
   FMesajParse( ANotification.Json.ToString );
   OnNotificationGeldi(Sender, FMesaj.strSent_time, FMesaj.strId, FMesaj.strFrom, FMesaj.strMessage_id, FMesaj.strMessage, FMesaj.strCollapse_key ); // calls the event.
 end;
end;

procedure TGCM_Helper.MesajTest(strMesaj: String; SaniyeSonra: Integer);
begin
   if Assigned(FNotificationCenter) AND (FNotificationCenter.Supported) then begin
    FNotify := FNotificationCenter.CreateNotification;
    Try
      FNotify.Name      := FNotifyTitle;
      FNotify.Title     := FNotifyTitle;
      FNotify.AlertBody := strMesaj;

      if SaniyeSonra < 0 then begin
        // Hemen Yayınlansın
        // Bu şekliyle yayınlansın
        FNotificationCenter.PresentNotification( FNotify );
      end else
      begin
        // SaniySonra kadar saniye bekledikten sonra yayına çıksın
        FNotify.FireDate  := Now + EncodeTime(0, 0, SaniyeSonra, 0);
        FNotificationCenter.ScheduleNotification( FNotify );
      end;
    Finally
      FNotify.DisposeOf;
    End;
 end;
end;

function TGCM_Helper.PHPRegisterDevice(DeviceID : string; DeviceToken : string): boolean;
var
 slPostData: TStringList;
 IdHttp : TIdHTTP;
begin
 Result := False;
 if FPhpPush <> '' then
 begin
   IdHttp     := TIdHTTP.Create;
   slPostData := TStringList.Create;
   try
     slPostData.Add('action=regdevice');
     slPostData.Add('did='   + DeviceID     );
     slPostData.Add('token=' + DeviceToken  );
     {$ifdef ANDROID}
       slPostData.Add('platform=android');
     {$else}
       slPostData.Add('platform=ios');
     {$endif}
     IdHttp.Post( FPHPPush + 'index.php', slPostData );
   finally
     slPostData.Free;
     IdHttp.Disconnect;
     IdHttp.DisposeOf;
     Result := True;
   end;
 end;
end;
{$ENDIF}

{$IF defined(MSWINDOWS)}
function TGCM_Helper.PushMessage( strMesaj, strMesajID: String; boolSecure:Boolean = false ): String;
 function GetTempDir: string;
 var
   TempDir:     DWORD;
 begin
   SetLength(Result, MAX_PATH);
   TempDir := GetTempPath(MAX_PATH, PChar(Result));
   SetLength(Result, TempDir);
 end;
var
 idHTTP       : TIDHTTP;
 strJson      : String;
 JsonStream   : TStringStream;
 strGelen     : String;
 DeviceList   : TStringList;
 SslIOHandler : TIdSSLIOHandlerSocketOpenSSL;
begin
 if FApiKey <> '' then
 begin
   DeviceList := TStringList.Create;
   IdHTTP := TIdHTTP.Create(nil);
   try
     IdHTTP.Name                := 'IdHTTP';
     IdHTTP.AllowCookies        :=  True;
     IdHTTP.HandleRedirects     :=  True;
     IdHTTP.HTTPOptions         := [hoForceEncodeParams];
     IdHTTP.Request.ContentType := 'application/xml';
     IdHttp.Request.CharSet     := 'UTF-8';
     IdHTTP.Response.KeepAlive  :=  False;
     strGelen := IdHTTP.Get( FPhpPush + 'index.php?action=tokenlist' );
     while Pos('<deviceToken>', strGelen) > 0 do begin
       DeviceList.Add( AradanSec( strGelen, '<deviceToken>', '</deviceToken>', True ) );
     end;
     strJson := '{'
               +'"registration_ids":'
               +'[';
     while DeviceList.Count > 0 do begin
       strJson := strJson + '"' + DeviceList[0] + '",';
       DeviceList.Delete(0);
     end;
     System.Delete( strJson, Length(strJson), 1 );
     strJson := strJson
             +']'
             +','
             +'"data":'
             +'{'
             +'"id":"'+ strMesajID +'"'
             +','
             +'"message":"'+strMesaj+ '"'
             +','
             +'}'
             +','
             +'"collapse_key":"Bilgi_Mesaj"'
             +','
             +'}'
             ;
 //D2007 ve öncesi için
 //  JsonStream := TStringStream.Create( Utf8Encode(strJson) );
 //D2009 ve sonrası için :
     JsonStream := TStringStream.Create(strJson, TEncoding.UTF8);
     try
       // HTTPS erişim yapılacak...
       // OpenSSL kütüphaneleri Gerekli.
       if boolSecure then
       begin
         if NOT FileExists(GetTempDir + 'ssleay32.dll') then
           With TResourceStream.Create(HInstance, Format('ssl_%.2d', [1]), RT_RCDATA) do
           begin
             SaveToFile( GetTempDir + 'ssleay32.dll' );
             Free;
           end;

         if NOT FileExists(GetTempDir + 'libeay32.dll') then
           With TResourceStream.Create(HInstance, Format('ssl_%.2d', [2]), RT_RCDATA) do
           begin
             SaveToFile( GetTempDir + 'libeay32.dll' );
             Free;
           end;
         IdSSLOpenSSLHeaders.IdOpenSSLSetLibPath( GetTempDir );
         IdSSLOpenSSLHeaders.Load;

         SslIOHandler        := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
         IdHTTP.IOHandler    := SSLIOHandler;
       end else begin
         IdHTTP.IOHandler    := nil;
       end;
       IdHTTP.HTTPOptions  := [];
       if boolSecure
         then IdHTTP.Request.Host := GCM_SecureUrl
         else idHTTP.Request.Host := GCM_OpenUrl;
       IdHttp.Request.CustomHeaders.AddValue('Authorization', 'key=' + FAPIKey );
       IdHTTP.Request.ContentType := 'application/json'; // Plain Text için 'application/x-www-form-urlencoded;charset=UTF-8'
       IdHTTP.Request.CharSet     := 'utf-8';
       Result := IdHTTP.Post(idHTTP.Request.Host, JsonStream);
     finally
       JsonStream.Free;
     end;
   finally
     if boolSecure then FreeAndNil(SslIOHandler);
     FreeAndNil(IdHTTP);
     DeviceList.Free;
   end;
 end else begin
   Result := 'Google API Key girilmemiş...';
 end;
end;
{$ENDIF}

initialization
 xGCMHelper := TGCM_Helper.Create;

finalization
 FreeAndNil(xGCMHelper);

end.
  • Android Projesi (Mobil Cihaz üzerinde, Mesaj Dinleyen) Kaynak Kodu
uses GoogleCloudMessaging_Helper;
{$R *.LgXhdpiPh.fmx ANDROID}

procedure TForm1.FormCreate(Sender: TObject);
begin
 inherited;
 //...

 // Project           : GCM-Helper-Class-by-ARMAN
 // Project ID        : gcm-helper-class-by-arman
 // Project number    : 1070957438881
 // Credental Api KEY : AIzaSyDIRV3LPlBVhk7zwkXUaXJAuP0rSuSgfxA
 xGCMHelper.GCM_ID              := '1070957438881';
 xGCMHelper.API_Key             := 'AIzaSyDIRV3LPlBVhk7zwkXUaXJAuP0rSuSgfxA';
 xGCMHelper.NotifyTitle         := 'ARMAN Bilgi Merkezi';
 xGCMHelper.PHPPushHost         := 'http://gcmarman.esy.es/';
 xGCMHelper.OnNotificationGeldi := NotificationGeldi;

 if xGCMHelper.HazirlikYap then begin
   Memo1.Lines.Add( 'DeviceID : '    + xGCMHelper.DeviceID    );
   Memo1.Lines.Add( 'DeviceToken : ' + xGCMHelper.DeviceToken );
 end else begin
   Memo1.Lines.Add( 'PHP Veritabanına ID ve Token yazılamadı...!' );
 end;
end;

procedure TForm1.NotificationGeldi(Sender: TObject; const
     strSent_time,
     strId,
     strFrom,
     strMessage_id,
     strMessage,
     strCollapse_key : String );
begin
 Memo1.Lines.Add( 'OnNotificationGeldi:' );
   Memo1.Lines.Add( '  SentTime: '     + strSent_time    );
   Memo1.Lines.Add( '  Id: '           + strId           );
   Memo1.Lines.Add( '  From: '         + strFrom         );
   Memo1.Lines.Add( '  MessageId: '    + strMessage_id   );
   Memo1.Lines.Add( '  Message: '      + strMessage      );
   Memo1.Lines.Add( '  Collapse_key: ' + strCollapse_key );
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 FreeAndNil(Application);
end;

  • Win32 Projesi ( Push Mesaj Yollayıcı ) Kaynak Kodu
uses GoogleCloudMessaging_Helper;

procedure TForm1.BitBtn1Click(Sender: TObject);
Var
 strResult : String;
begin
 xGCMHelper.GCM_ID              := '1070957438881';
 xGCMHelper.API_Key             := 'AIzaSyDIRV3LPlBVhk7zwkXUaXJAuP0rSuSgfxA';
 xGCMHelper.NotifyTitle         := 'ARMAN Bilgi Merkezi';
 xGCMHelper.PHPPushHost         := 'http://gcmarman.esy.es/';

 strResult := xGCMHelper.PushMessage( Memo1.Lines.Text, '01234' );
 Memo2.Lines.Add('Send result: ' + strResult );
end;


Şimdi Delphi Yakasında ilerleyelim.
-------------------------------------------------
Android Uygulaması ile PushMesaj alma kısmına çalışalım.
Öncelikle herkesin bildiği şekilde yeni bir “Multi-Device Application” proje açıyoruz.
kEZQE7.png
 
  • Öncelikli dikkat gerektiren husus 
Project / Options  / Entitlement List başlığından
Receive push notfication özelliğinin TRUE yapılmasıdır.
 
NkYXkN.png
 
  • Sonra PUSH iletilerin WEB üzerinden geldiğini dikkate aldığımızda ihtiyacımız olan
Project / Options  / Uses Permissions başlığından
Internet özelliğinin TRUE yapılmasıdır.
Zaten bu özellik varsayılan olarak açıktır. Sadece hatırlatalım.
 
A3ZVn7.png
 
  • Açtığımız bu boş projeyi bir defalığına BUILD ALL yapıyoruz ki AndroidManifest XML dosyamız CREATE edilsin. 
Çünkü bir sonraki aşamada bu dosya içerisine önemli bir satır ekleyeceğiz.
 
0ybXlD.png
           

 
40YA10.png
 
J3d9qq.png
 
OEJbV0.png
 
  • Helper PAS dosyası içinde copy/paste yapabileceğiniz şekilde Manifest dosyasına eklenecek satır yer almaktadır.

znQZaB.png
 
 
 

Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol  Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol da projelere kaynak kodlarıyla birlikte ulaşabilirsiniz.
Saygılarımla
Muharrem ARMAN

WE75nm.gif
Cevapla
#2
Vaaay hazine var burda
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Kuvvete dayanamayan adalet aciz, 
Adalete dayanamayan kuvvet zalimdir.
WWW
Cevapla
#3
Hocam,
Ellerinize sağlık. 
Formumuzun hedefleri doğrultusunda (Yeni Nesil Teknoloji) hazırlanmış olduğunuz bu kaliteli makalenizden dolayı teşekkür ederim.
Allah sizi ve sizin gibileri başımızdan (formumuzdan  Wink ) eksik etmesin.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#4
mrmarman hocam,
Proje indirme linkinizde şifre istiyor. Şifresiz yayınlaam imkanınız var mı? veya şifreyi de paylaşabilir misiniz?
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#5
Şifre yanlışlıkla olmuş update ettim. 

rghost.png
Saygılarımla
Muharrem ARMAN

WE75nm.gif
Cevapla
#6
(12-08-2016, Saat: 21:04)mrmarman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlŞifre yanlışlıkla olmuş update ettim. 

rghost.png

abi ana konunun en altındaki link hala şifre istiyor bende mi sorun var acıba? Şu Res dosyana ulaşmam gerek (dlller için)  Angel
Cevapla
#7
Şimdi bir daha dener misin.
Olmazsa sıfırdan yollarım.
Denedim indiriyor.
Saygılarımla
Muharrem ARMAN

WE75nm.gif
Cevapla
#8
(12-08-2016, Saat: 22:42)mrmarman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlŞimdi bir daha dener misin.
Olmazsa sıfırdan yollarım.
Denedim indiriyor.

Şimdi oldu abilerin kralı eline sağlık  Cool
Cevapla
#9
Web üzerinden de denemeyi unutma. Onu da seveceksin.

Kod:
http://gcmarman.esy.es/index.php?action=sendmsg&mesText=ARMAN Deneme&msgId=1973
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Saygılarımla
Muharrem ARMAN

WE75nm.gif
Cevapla
#10
(12-08-2016, Saat: 23:02)mrmarman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlWeb üzerinden de denemeyi unutma. Onu da seveceksin.

Kod:
http://gcmarman.esy.es/index.php?action=sendmsg&mesText=ARMAN Deneme&msgId=1973
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol

Web olayı nefis bişey olmuş. Kullanırken aklıma bir şeyler geldi,

 * Bu sistemi kullanarak forumlara takip edilmek istenen konulara cevap geldiğinde bilgilendirme yapılabilir.
 * Uzaktan komutlarla cihazlar çalıştırılabilir.
 * Lokasyon takibi yapılabilir  Cool (Küçük bir ekleme ile)
 * Bilgisayar üzerinde kullanıcılar takip edilebilir.
 * Personel Giriş Çıkışları takip edilebilir
 * Uzaktan bilgisayarlar açılıp kapatılabilir (Bir kaç modifikasyon ile)
 * Haber Servisi amaçlı kullanılabilir
 * Update sistemi olarak kullanılabilir.
 * Casus yazılım olarak kullanılabilir.
 * Akıllı ev otomasyonları hazırlanabilir.
 
Acayip bir şey geldi aklıma ama bunu şimdi söylemeyeceğim, ki %100 muharrem abinin aklına gelmiştir.  Big Grin bunu toparlayıp bir fikrim var bölümüne açıcam. İsteyen istediği gibi geliştirebilir.

Tekrardan çook teşekkürler abicim. @mrmarman
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Tüm platformlar (Android, iOS vb.)  için telefon çağrı durumunu yakalamak Fesih ARSLAN 18 3.905 14-04-2017, Saat: 21:17
Son Yorum: Paranoyaq
  Delphi Firemonkey Android İzin Kontrolü esrehmaan 2 637 23-12-2016, Saat: 22:22
Son Yorum: esrehmaan



Konuyu Okuyanlar: 1 Ziyaretçi