Var HDevicePushParams : TDevicePushParams;
APushService : TPushService;
AServiceConnection : TPushServiceConnection;
SQuery : String;
begin
APushService:=TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.GCM);
APushService.AppProps[TPushService.TAppPropNames.GCMAppID]:='ХХХХХХХХХХХХХХХХ';
AServiceConnection:=TPushServiceConnection.Create(APushService);
AServiceConnection.Active:=True;
AServiceConnection.OnChange:=ServiceConnectionOnChange;
AServiceConnection.OnReceiveNotification:=ServiceConnectionOnReceiveNotification;
HDevicePushParams.DeviceID:=APushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];
HDevicePushParams.DeviceToken:=APushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];
SQuery:=APIURL+'?DeviceID='+HDevicePushParams.DeviceID+'&DeviceToken='+HDevicePushParams.DeviceToken;
HTTPThread:=THTTPThread.Create(SQuery,FQueue); // Здесь просто отправка на сервер в потоке.
Сервер принимает стоку и складывает в базу пары "DeviceID - DeviceToken", можно еще что нибудь отправлять, чтоб точно идентифицировать клиента.
А на сервере все еще проще. Вот php:
$title = 'Это заголовок';
$message = 'Это текст сообщения.'
$devices = 'DeviceToken - один конкретный получатель';
$apiKey = "AIzaХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ";
$gcpm = new GCMPushMessage($apiKey);
$gcpm->setDevices($devices);
$response = $gcpm->send($message, array('title' => $title));
Лениво было писать велосипед, использовал готовую отсылалку https://github.com/mattg888/GCM-PHP-Server-Push-Message . Там все просто, она заворачивает все в json и отправляет на http