【问题标题】:how to send push notification to multiple android devices如何向多个安卓设备发送推送通知
【发布时间】:2015-06-03 11:18:30
【问题描述】:

我在link 中关注了如何使用 GCM 发送推送通知,我设法从应用程序发送和接收通知,但是,我无法接收来自不同 Android 设备的通知,该设备仅发送和接受自己。我需要将它发送到使用相同项目 ID 的所有设备吗? 这是我用过的代码

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);

【问题讨论】:

    标签: android delphi google-cloud-messaging push


    【解决方案1】:

    我不习惯 Delphi,但看起来你需要修改 PushMessage 方法。

    在 Params.Add(...) 中将 registration_id 更改为 registration_ids 并确保 GetDeviceRegistrationId() 返回预期注册 ID 收件人的数组。

    【讨论】:

    • 但是为什么同一应用程序的副本会收到通知?它发送和接收到iteslf!
    • 您的发件人是否拥有这些其他设备的所有注册 ID?发送消息时,您还应该得到响应。这是一个显示成功和失败(如果有)的 JSON 响应。
    • 是的,我有 ID,我尝试通过 lisview 中的循环 ID 发送推送消息,但没有成功! var n:整数; begin for n := 0 to ListView1.Items.Count - 1 do DataModule1.PushMessage(ListView1.ItemAppearanceName[n]);
    • 请看现在@Koh
    猜你喜欢
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多