Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   iOS PushNotifications über TIdTCPClient (https://www.delphipraxis.net/190614-ios-pushnotifications-ueber-tidtcpclient.html)

NickD 20. Okt 2016 08:52

iOS PushNotifications über TIdTCPClient
 
Hallo zusammen,
ich versuche gerade über eine Delphi-Windows-Anwendung eine PushNotification an eine App zu senden. Dies funktioniert auch, solange keine Sonderzeichen, Umlaute, etc.. verwendet werden.
Ich habe dann bei Apple nachgelesen, das ein UTF8 String erwartet wird. Aber egal was ich versuche, die Nachricht kommt nicht an bzw. wird von Apple verworfen.

Hier mein Code um die Notification zu senden, die auskommentierten Stellen sind Versuche die ich unternommen habe, um die Nachricht im UTF-8 Format zu senden:

Delphi-Quellcode:
 
    TCPClient := TIdTCPClient.Create;
    IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create();
    try
      TCPClient.Host := 'gateway.sandbox.push.apple.com';
      TCPClient.Port := 2195;
      TCPClient.IPVersion := TIdIPVersion.Id_IPv4;

      IdSSLIOHandlerSocketOpenSSL1.Host := 'gateway.sandbox.push.apple.com';
      IdSSLIOHandlerSocketOpenSSL1.Port := 2195;
      IdSSLIOHandlerSocketOpenSSL1.Destination := 'gateway.sandbox.push.apple.com:2195';
      IdSSLIOHandlerSocketOpenSSL1.MaxLineAction := maException;
      IdSSLIOHandlerSocketOpenSSL1.SSLOptions.CertFile := '****.pem';
      IdSSLIOHandlerSocketOpenSSL1.SSLOptions.KeyFile := '****.pem';
      IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Method := sslvSSLv23;
      IdSSLIOHandlerSocketOpenSSL1.SSLOptions.Mode := sslmClient;
      IdSSLIOHandlerSocketOpenSSL1.DefStringEncoding := TIdTextEncoding.UTF8;

      IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions := [sslvSSLv2, sslvSSLv3, sslvTLSv1];

      TCPClient.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
      try
        if not TCPClient.Connected then
          TCPClient.Connect;

        strMsg := GetMessageIos(ADeviceToken, GetPayLoadIos(AMessage, 'default', 0, AFrom, ATo));
       // strMsg := UTF8Encode(strMsg);

        //StreamMsg := TStringStream.Create(UTF8Encode(strMsg), TEncoding.UTF8);
        //StreamMsg := TStringStream.Create(strMsg);
        //StreamMsg.SaveToFile('C:\TestOhneEncoding.txt');
        //StreamMsg.Seek(0, soBeginning);

        StreamMsg2 := TStringStream.Create('');
        StreamMsg2.WriteString(strMsg);
        StreamMsg2.Seek(0, soBeginning);

       // TCPClient.IOHandler.WriteLn(strMsg, TEncoding.UTF8);
        TCPClient.IOHandler.Write(StreamMsg2);
        TCPClient.Disconnect;
      except
        Result := False;
      end;
    finally
      TCPClient.Free;
      IdSSLIOHandlerSocketOpenSSL1.Free;
    end;

bra 20. Okt 2016 09:04

AW: iOS PushNotifications über TIdTCPClient
 
http://stackoverflow.com/questions/1...n-message-text

mjustin 20. Okt 2016 09:46

AW: iOS PushNotifications über TIdTCPClient
 
Delphi-Quellcode:
except
  Result := False;
end;
Im Falle einer Exception wird von der Funktion False als Result zurückgeben. Das Programm weiß dann "Oh, da ist offensichtlich irgendetwas unerwartetes passiert!" :)

NickD 20. Okt 2016 10:11

AW: iOS PushNotifications über TIdTCPClient
 
Ist ein Ausschnitt aus einer Testanwendung :-D
Es wird auch keine Exception geworfen. Der Client verbindet sich korrekt und auch der Write-Befehl wird ausgeführt. Nur Apple verwirft die Nachricht vermutlich.

@bra: Ich habe schon vieles versucht um den Text in der richtigen Kodierung zu senden. Welche Info aus deinem Link wäre für mich relevant?

bra 20. Okt 2016 10:34

AW: iOS PushNotifications über TIdTCPClient
 
Zitat:

Zitat von NickD (Beitrag 1351456)
@bra: Ich habe schon vieles versucht um den Text in der richtigen Kodierung zu senden. Welche Info aus deinem Link wäre für mich relevant?



Zitat:

Have you tried the JSON ASCII escape for Unicode? Send \u00A3 for £ and \u20AC for €.
Also die Umlaute/Sonderzeichen als \uxxxx-Code kodieren?

mjustin 20. Okt 2016 10:38

AW: iOS PushNotifications über TIdTCPClient
 
Zitat:

Zitat von NickD (Beitrag 1351456)
Welche Info aus deinem Link wäre für mich relevant?

Das "JSON ASCII escape for Unicode" ist relevant. Wie sieht der String strMsg aus, der gesendet werden soll, aber nicht ankommt? Sind die Umlaute in die richtige JSON Unicode Escape Notation (\u00..) umgewandelt?

Andererseits: wenn ich http://stackoverflow.com/questions/583562 richtig verstehe, kann man entweder normales UTF-8 verwenden (dann muss der Client dieses Encoding explizit dem IOHandler.Write mitgeben) oder die Escape Notation verwenden.

Wenn die Escape-Notation verwendet wird, sollte als Encoding ASCII angegeben werden. Das Encoding im Write nicht anzugeben ist gleichbedeutend mit "Default Encoding verwenden". Sicherer ist es, das richtige Encoding explizit anzugeben.

NickD 20. Okt 2016 11:08

AW: iOS PushNotifications über TIdTCPClient
 
Folgendes hat ohne Umlaute, Sonderzeichen, etc. funktioniert:
Delphi-Quellcode:
 
  if not TCPClient.Connected then
    TCPClient.Connect;

  strMsg := GetMessageIos(ADeviceToken, GetPayLoadIos(AMessage, 'default', 0, AFrom, ATo));

  TCPClient.IOHandler.Write(strMsg, TEncoding.ANSI);
  TCPClient.Disconnect;
Dann habe ich versucht das ganze über UTF8 zu lösen, mit diesem Versuch ist überhaupt keine Notification angekommen egal ob mit oder ohne Sonderzeichen:
Delphi-Quellcode:
 
  if not TCPClient.Connected then
    TCPClient.Connect;

  strMsg := GetMessageIos(ADeviceToken, GetPayLoadIos(AMessage, 'default', 0, AFrom, ATo));
  strMsg := UTF8Encode(strMsg);

  TCPClient.IOHandler.Write(strMsg, TEncoding.UTF8);
  TCPClient.Disconnect;
Wie würde das ganze mit der Escape-Notation aussehen?

einbeliebigername 20. Okt 2016 14:57

AW: iOS PushNotifications über TIdTCPClient
 
Hallo,

Zitat:

Zitat von NickD (Beitrag 1351471)
Delphi-Quellcode:
 
  if not TCPClient.Connected then
    TCPClient.Connect;

  strMsg := GetMessageIos(ADeviceToken, GetPayLoadIos(AMessage, 'default', 0, AFrom, ATo));
  strMsg := UTF8Encode(strMsg);

  TCPClient.IOHandler.Write(strMsg, TEncoding.UTF8);
  TCPClient.Disconnect;

Das kann auch nicht wirklich funktionieren. Ich gehe jetzt mal von
Delphi-Quellcode:
strMsg: string
aus. Wieso kodierst du einen Unicode-String mit
Delphi-Quellcode:
strMsg := UTF8Encode(strMsg);
als UTF8 in einen Unicode-String und kodierst das kauderwelsch anschließend mit
Delphi-Quellcode:
TCPClient.IOHandler.Write(strMsg, TEncoding.UTF8);
noch mal als UTF8? Wenn das
Delphi-Quellcode:
TCPClient.IOHandler.Write
als ersten Parameter einen
Delphi-Quellcode:
string
erwartet, wäre es richtig dort auch einen korrekten Unicode-String rein zu werfen. Und im zweiten Parameter nur anzugeben wie der weitergereicht werden soll.

Ob das dann mit Apple funktioniert weiß ich nicht.

Mit den verschiedenen String-Kodierungen habe ich mich neulich selbst beschäftigt. Wenn man selbst einen String in einer speziellen Kodierung haben will, dann mit den Mitteln von
Delphi-Quellcode:
TEncoding
wie z.b.
Delphi-Quellcode:
TEncoding.UTF8.GetBytes(MyString)
.

einbeliebigername.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz