AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke iOS PushNotifications über TIdTCPClient
Thema durchsuchen
Ansicht
Themen-Optionen

iOS PushNotifications über TIdTCPClient

Ein Thema von NickD · begonnen am 20. Okt 2016 · letzter Beitrag vom 20. Okt 2016
Antwort Antwort
NickD

Registriert seit: 10. Okt 2012
Ort: Burgsinn
53 Beiträge
 
Delphi 10.3 Rio
 
#1

iOS PushNotifications über TIdTCPClient

  Alt 20. Okt 2016, 08:52
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;
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: iOS PushNotifications über TIdTCPClient

  Alt 20. Okt 2016, 09:04
http://stackoverflow.com/questions/1...n-message-text
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#3

AW: iOS PushNotifications über TIdTCPClient

  Alt 20. Okt 2016, 09:46
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!"
Michael Justin
  Mit Zitat antworten Zitat
NickD

Registriert seit: 10. Okt 2012
Ort: Burgsinn
53 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: iOS PushNotifications über TIdTCPClient

  Alt 20. Okt 2016, 10:11
Ist ein Ausschnitt aus einer Testanwendung
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?
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: iOS PushNotifications über TIdTCPClient

  Alt 20. Okt 2016, 10:34
@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?
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#6

AW: iOS PushNotifications über TIdTCPClient

  Alt 20. Okt 2016, 10:38
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.
Michael Justin
  Mit Zitat antworten Zitat
NickD

Registriert seit: 10. Okt 2012
Ort: Burgsinn
53 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: iOS PushNotifications über TIdTCPClient

  Alt 20. Okt 2016, 11:08
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?
  Mit Zitat antworten Zitat
einbeliebigername

Registriert seit: 24. Aug 2004
140 Beiträge
 
Delphi XE8 Professional
 
#8

AW: iOS PushNotifications über TIdTCPClient

  Alt 20. Okt 2016, 14:57
Hallo,

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 strMsg: string aus. Wieso kodierst du einen Unicode-String mit strMsg := UTF8Encode(strMsg); als UTF8 in einen Unicode-String und kodierst das kauderwelsch anschließend mit TCPClient.IOHandler.Write(strMsg, TEncoding.UTF8); noch mal als UTF8? Wenn das TCPClient.IOHandler.Write als ersten Parameter einen 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 TEncoding wie z.b. TEncoding.UTF8.GetBytes(MyString) .

einbeliebigername.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 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