2015-06-03 2 views
0

Я следил за tut в этом link о том, как отправить push-уведомление с помощью GCM, я смог отправлять и получать уведомления из приложения, однако я не могу получать уведомления от разных Android-систем устройства, устройство только отправляет и получает к себе. Мне нужно, чтобы он отправлялся на все устройства, используя один и тот же идентификатор проекта? это код, я использовалКак отправить push-уведомление нескольким устройствам Android

unit Unit1; 

interface 

uses 
    System.SysUtils, System.Classes, GCMNotification, IndyPeerImpl, 
    IdBaseComponent, IdComponent, IdTCPConnection, 
    IdTCPClient, IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL 
    ; 

type 
    TDataModule1 = class(TDataModule) 
    procedure DataModuleCreate(Sender: TObject); 
    procedure DataModuleDestroy(Sender: TObject); 
    private 
    { Private declarations } 
    {$IFDEF ANDROID} 
    gcmn: TGCMNotification; 
    {$ENDIF} 
    public 
    { Public declarations } 
    function GetDeviceRegistrationId: string; 
    function PushMessage(Pushmessage: string): string; 
    end; 

var 
    DataModule1: TDataModule1; 

    const 
    YOUR_GCM_SENDERID = '1232010xxxxxx'; 
    YOUR_API_ID = 'AIzaSyBzvpTa-xxxxxxxxxxxxxxxxx'; 

implementation 

{%CLASSGROUP 'FMX.Controls.TControl'} 

{$R *.dfm} 

procedure TDataModule1.DataModuleCreate(Sender: TObject); 
var 
    isRegistered : boolean; 
begin 

    isRegistered := true; 
    {$IFDEF ANDROID} 
    try 
    gcmn := TGCMNotification.Create(self); 
    gcmn.SenderID := YOUR_GCM_SENDERID; 
    isRegistered := gcmn.DoRegister; 
    except 
    end; 
    {$ENDIF} 

end; 

procedure TDataModule1.DataModuleDestroy(Sender: TObject); 
begin 
{$IFDEF ANDROID} 
    gcmn.Free(); 
    {$ENDIF} 
end; 

function TDataModule1.GetDeviceRegistrationId: string; 
begin 
    {$IFDEF ANDROID} 
    result := gcmn.RegistrationID; 
    {$ELSE} 
    result := 'Mobile Test'; 
    {$ENDIF} 
end; 

function TDataModule1.PushMessage(Pushmessage : string):string; 
const 
    sendUrl = 'https://android.googleapis.com/gcm/send'; 
var 
    Params: TStringList; 
    AuthHeader: STring; 
    idHTTP: TIDHTTP; 
    SSLIOHandler: TIdSSLIOHandlerSocketOpenSSL; 
begin 
    idHTTP := TIDHTTP.Create(nil); 
    try 
    SslIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); 
    idHTTP.IOHandler := SSLIOHandler; 
    idHTTP.HTTPOptions := []; 
    Params := TStringList.Create; 
    try 
     Params.Add('registration_id='+ GetDeviceRegistrationId()); 
     Params.Values['data.message'] := Pushmessage; 
     idHTTP.Request.Host := sendUrl; 
     AuthHeader := 'Authorization: key=' + YOUR_API_ID; 
     idHTTP.Request.CustomHeaders.Add(AuthHeader); 
     IdHTTP.Request.ContentType := 'application/x-www-form-urlencoded;charset=UTF-8'; 
     result := idHTTP.Post(sendUrl, Params); 
    finally 
     Params.Free; 
    end; 
    finally 
    FreeAndNil(idHTTP); 
    end; 

end; 
end. 

и этот код в кнопку

DataModule1.PushMessage(Edit1.Text); 

ответ

0

Я не привык к Delphi, но это выглядит, как вам нужно изменить метод PushMessage ,

Изменить registration_id на registration_ids в Params.Add (...) и убедиться, что GetDeviceRegistrationId() возвращает массив предполагаемых получателей идентификационных данных.

+0

но почему копии одного и того же приложения могут получать уведомление? он отправляет и получает iteslf! –

+0

Имеет ли ваш отправитель все идентификаторы регистрации этих других устройств? Вы также должны получить ответ при отправке сообщения. Это ответ JSON, который показывает успехи и неудачи, если они есть. – Koh

+0

да, у меня есть идентификаторы, я попытался отправить push-сообщение через идентификаторы циклов в lisview, но он не работал! var n: целое число; begin для n: = 0 в ListView1.Items.Count - 1 do DataModule1.PushMessage (ListView1.ItemAppearanceName [n]); –

Смежные вопросы