Delphi Apple Push Notification не работает на iOS при работе на Android

Я пытаюсь включить Apple Push Notifications в свое iOS приложение, следуя этому примеру.

После некоторой отладки мне удалось выяснить, что APushService пусто при работе на iOS, но не на Android.

procedure TFormLogin.Button1Click(Sender: TObject);
var
    APushService           : TPushService;
begin

    APushService       := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.APS);

end;

Я делаю что-то неправильно? Как включить push-уведомления для iOS в Delphi?

Любые идеи будут высоко оценены.


person Machado    schedule 01.12.2015    source источник
comment
Что могло помешать GetServiceByName не найти службу?   -  person Machado    schedule 01.12.2015
comment
Я понятия не имею. У меня нет исходного кода, но у вас есть. Попробуйте поискать подсказки в System.PushNotification.pas. Возможно, сервиса с таким названием не существует. Возможно, у вашего приложения недостаточно прав для просмотра результата.   -  person Rob Kennedy    schedule 01.12.2015


Ответы (2)


Решение было до смешного простым для тех усилий, которые мы приложили для его решения.

FMX.PushNotification.iOS в коде отсутствовал импорт.

Забавно: если мы удалим импорт PushNotifications, Delphi Seattle не будет показывать никаких предупреждений.

person Machado    schedule 02.12.2015

Вот рабочий код, который я использую для Android и iOS:

const
  FAndroidServerKey = '63538920422';

private
  { Private declarations }
  FDeviceID: string;
  FDeviceToken: string;

  FPushService: TPushService;
  FPushServiceConnection: TPushServiceConnection;

  procedure OnReceiveNotificationEvent(Sender: TObject; 
    const ANotification: TPushServiceNotification);
  procedure OnServiceConnectionChange(Sender: TObject; 
    AChange: TPushService.TChanges);

  procedure PushServiceRegister;

procedure TFormMain.OnReceiveNotificationEvent(Sender: TObject; 
  const ANotification: TPushServiceNotification);
const
  FCMSignature = 'gcm.notification.body';
  GCMSignature = 'message';
  APNsSignature = 'alert';
var
  aText: string;
  aObj: TJSONValue;
begin
  // this will fire when only when app is opened
{$IFDEF ANDROID}
  aObj := ANotification.DataObject.GetValue(GCMSignature);
  if aObj <> nil then
    aText := aObj.Value
  else
    aText := ANotification.DataObject.GetValue(FCMSignature).Value;
{$ELSE}
  aObj := ANotification.DataObject.GetValue(APNsSignature);
  if aObj <> nil then
    aText := aObj.Value;
{$ENDIF}
  ShowMessage(aText);
end;

procedure TFormMain.OnServiceConnectionChange(Sender: TObject; 
  AChange: TPushService.TChanges);
begin
  if (TPushService.TChange.DeviceToken in AChange) and
    Assigned(FPushServiceConnection) then
  begin
    FDeviceID := FPushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceID];
    FDeviceToken := FPushService.DeviceTokenValue
      [TPushService.TDeviceTokenNames.DeviceToken];
    // save token and ID to  remote db here
  end;
end;

procedure TFormMain.PushServiceRegister;
begin
  FPushService := nil;
  FPushServiceConnection := nil;

{$IF defined(ANDROID)}
  FPushService := TPushServiceManager.Instance.GetServiceByName<
    (TPushService.TServiceNames.GCM);
  FPushService.AppProps[TPushService.TAppPropNames.GCMAppID] := FAndroidServerKey;
{$ENDIF}
{$IF defined(IOS) AND defined(CPUARM)}
  FPushService := TPushServiceManager.Instance.GetServiceByName
   (TPushService.TServiceNames.APS);
{$ENDIF}
  if Assigned(FPushService) then
  begin
    FPushServiceConnection := TPushServiceConnection.Create(FPushService);
    FPushServiceConnection.OnChange := OnServiceConnectionChange;
    FPushServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent;
    FPushServiceConnection.Active := true; // this will fires OnChange event
  end;
end;

Вот подробная пошаговая статья для Android и iOS (используйте Google Translate) для кода C++ и Delphi с готовым к использованию серверным кодом PHP.

http://blog.rzaripov.kz/2017/02/firebase-android-ios.html http://blog.rzaripov.kz/2017/02/firebase-android-ios-2.html

Используйте этот форум, чтобы задавать вопросы (можно использовать английский язык) http://fire-monkey.ru/topic/1809-%D1%81%D1%82%D0%B0%D1%82%D1%8C%D1%8F-php-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D1%81%D1%81%D1%8B%D0%BB%D0%BA%D0%B8-push-%D0%BD%D0%B0-android-%D0%B8-ios/

person alitrun    schedule 27.05.2017