2015-12-01 40 views
1

我想包括Apple Push Notifications在我的iOS应用程序后面this example德尔福苹果推送通知不工作在iOS上,而在Android上工作

经过一些调试后,我发现APushServiceiOS上运行时为空,但在Android上运行时没有。

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

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

end; 

我做错了什么?我们如何在Delphi上启用iOS的推送通知?

任何想法将不胜感激。

+0

怎么可能让'GetServiceByName'找不到服务? – Machado

+1

我不知道。我没有源代码,但是你有。尝试寻找* System.PushNotification.pas *寻找线索。也许该名称的服务不存在。也许你的应用程序没有足够的权限来查看结果。 –

回答

2

该解决方案对于我们解决的工作量而言非常简单。

FMX.PushNotification.iOS代码中缺少导入。

有趣的是:如果我们删除PushNotifications进口,Delphi Seattle将不会显示任何警告。

0

这里工作,我使用的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(使用谷歌翻译)对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-статья-php-сервер-для-рассылки-push-на-android-и-ios/