Перейти к содержанию
Fire Monkey от А до Я
  • 0

IOS Push сообщения на русском как?


rustam_d

Вопрос

Отправку пушей ИОС написал в vcl на idTcpclient, доходят норм, но на русском никак.

Меняем "Hi" на "Привет" и получаем полный привет...точнее никакой реакции на устройстве.

var
  s,c,t: AnsiString;
  vStr: TStringStream;
begin
  if not tcpclient.connected then tcpclient.connect;
  c := 'qwertyqwertyqwertyqwertyqwertyqwertyqwertyqwertyqwerty'; //token
  s := '{"aps":{"alert":"Hi","sound":"default"}}';
  s := #0#0#32 + HexToAscii(c) + #0 + AnsiChar(Length(s)) + s;
  vStr := TStringStream.Create(s);
  vStr.Seek(0,soBeginning);
  SSLHandler.write(vStr);
  vStr.Free;
end;

что только ни делал, в стримах TEndcoding юзал всякие какие только есть, однако с заголовком #0#0#32 по логике и так не срастуха.

Гонял по cp1251 сам стринг...не доходят пуши.

Может с заголовком по колдовать как-то надо? Тогда и от анси может можно уйти?

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Те кто отправляет пуши в ИОС на русском, прошу выложить строку в HEX-текст, которая уходит в APS.

Конечно можете изменить свой токен. Достаточно слова "Привет" или "Ваш".

Я по строке смогу разгадать кодировку, этот код давинчи и напишу на дельфи.

Всем пригодится!

Эх гонсалес как же ты припек со своими недоделками...

Ссылка на комментарий
  • 0

в стандарте json обычно юникод кодируется как \uXXXX

попробуй сделать JSON-строку не сам, а штатными средствами

это было сделано изначально)
Ссылка на комментарий
  • 0

Мне в свое время помогло:

vStr := TStringStream.Create(s, TEncoding.UTF8);
не пытайтесь "подвести" под ведро...) мак это дело тонкое... если не пробовали то лучше промолчать...). обратили внимание на нолики? там ведь в байтах передача... не как в ведре... если решу проблему сообщу, и тогда весь мир стекется к моему посту, т. к. не нашёл в инете решений на делфи... ну может есть на провайдерах... но хочу простоты.
Ссылка на комментарий
  • 0

 

Мне в свое время помогло:

vStr := TStringStream.Create(s, TEncoding.UTF8);
не пытайтесь "подвести" под ведро...) мак это дело тонкое... если не пробовали то лучше промолчать...). обратили внимание на нолики? там ведь в байтах передача... не как в ведре... если решу проблему сообщу, и тогда весь мир стекется к моему посту, т. к. не нашёл в инете решений на делфи... ну может есть на провайдерах... но хочу простоты.

 

Как вариант, если не выйдет, то разместить php скрипт где нибудь на хостинге и отправлять через него, проблем с русским нет.

Ссылка на комментарий
  • 0

 

 

Мне в свое время помогло:

vStr := TStringStream.Create(s, TEncoding.UTF8);
не пытайтесь "подвести" под ведро...) мак это дело тонкое... если не пробовали то лучше промолчать...). обратили внимание на нолики? там ведь в байтах передача... не как в ведре... если решу проблему сообщу, и тогда весь мир стекется к моему посту, т. к. не нашёл в инете решений на делфи... ну может есть на провайдерах... но хочу простоты.

 

Как вариант, если не выйдет, то разместить php скрипт где нибудь на хостинге и отправлять через него, проблем с русским нет.

 

я об этом и прошу, строчку мне в НЕХ бы глянуть...ну если пипл юзает джейсон конечно. еще просил у галогена, может вышлет ).

такто ессесно не важно где, пхп, хттп и т.п....

Изменено пользователем rustam_d
Ссылка на комментарий
  • 0
Я сделал это !!! И это бесплатно! )) Отправка ИОС пушей на русском из делфи больше не секрет!!!
Полный исходник, максимально упрощенный. Можно указывать циферку на иконке(badge).
Про войну с сертификатом SSL pem писал тут http://fire-monkey.ru/topic/1751-push-soobscheniia-ios-ne-mogu-soedinitsia-s-serverom-dlia-o/
 
procedure TForm1.Button2Click(Sender: TObject);
var
  i: integer;
  s,c,t,m: string;
  vStr: TStringStream;
begin
  m := EscapeString('Удачи друзья в FMX!'); //ready for unicode
  if not tcpclient.connected then tcpclient.connect;
  c := 'qwerqwerqwerqwerqwerqwerqwerqwerqwer'; //your token
  t := '';
  for i := 0 to (length© div 2) - 1 do t := t + AnsiChar(Byte(('$'+copy(c,i*2+1,2)).ToInteger)); //token as hex
  s := '{"aps":{"alert":"'+ m +'","sound":"default","badge":0}}';   //payload
  s := #0#0#32 + t + #0 + AnsiChar(length(s)) + s;     //push message
  vStr := TStringStream.Create(s);
  try
    SSLHandler.write(vStr);
  finally
    vStr.Free;
  end;
end
 
function TForm1.EscapeString(const AValue: string): string;
const
  ESCAPE = '\';
  REVERSE_SOLIDUS = '\';
  SOLIDUS = '/';
  BACKSPACE = #8;
  FORM_FEED = #12;
  NEW_LINE = #10;
  CARRIAGE_RETURN = #13;
  HORIZONTAL_TAB = #9;
var
  AChar: Char;
begin
  Result := '';
  for AChar in AValue do
  begin
    case AChar of
      REVERSE_SOLIDUS: Result := Result + ESCAPE + REVERSE_SOLIDUS;
      SOLIDUS: Result := Result + ESCAPE + SOLIDUS;
      BACKSPACE: Result := Result + ESCAPE + 'b';
      FORM_FEED: Result := Result + ESCAPE + 'f';
      NEW_LINE: Result := Result + ESCAPE + 'n';
      CARRIAGE_RETURN: Result := Result + ESCAPE + 'r';
      HORIZONTAL_TAB: Result := Result + ESCAPE + 't';
      else
      begin
        if (Integer(AChar) < 32) or (Integer(AChar) > 126) then
          Result := Result + ESCAPE + 'u' + IntToHex(Integer(AChar), 4)
        else
          Result := Result + AChar;
      end;
    end;
  end;
end;
 
  object TCPClient: TIdTCPClient
    OnStatus = TCPClientStatus
    IOHandler = SSLHandler
    ConnectTimeout = 0
    Host = 'gateway.sandbox.push.apple.com'
    IPVersion = Id_IPv4
    Port = 2195
    ReadTimeout = -1
    Left = 328
    Top = 48
  end
  object SSLHandler: TIdSSLIOHandlerSocketOpenSSL
    OnStatus = SSLHandlerStatus
    Destination = 'gateway.sandbox.push.apple.com:2195'
    Host = 'gateway.sandbox.push.apple.com'
    MaxLineAction = maException
    Port = 2195
    DefaultPort = 0
    SSLOptions.CertFile = 'MyAPN.pem'
    SSLOptions.KeyFile = 'MyAPN.pem'
    SSLOptions.Method = sslvSSLv23
    SSLOptions.SSLVersions = [sslvSSLv2, sslvSSLv3, sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2]
    SSLOptions.Mode = sslmClient
    SSLOptions.VerifyMode = []
    SSLOptions.VerifyDepth = 0
    Left = 328
    Top = 108
  end
Изменено пользователем rustam_d
Ссылка на комментарий
  • 0

krapotkin снимаю шляпу, вы подсказали правильный путь...

пойду выпью за это...php - go home.

Изменено пользователем rustam_d
Ссылка на комментарий
  • 0

В топике старый протокол отправки пушей на ИОС. Не более 256 знаков, а с учетом юникода так вообще не более около 50 букв на русском!!!

Переписал на новый 2-й протокол, чуток попапрился с байтами-битами ), но все же сделал. Теперь на русском можно около 400 букв, а на инглише

как и разрешено около 2000. Это лучший ответ, но не хочу и первую версию снимать со счета...она ведь для ИОС ниже 8.

Вообщем Enjoy :

procedure TForm1.Button2Click(Sender: TObject);
var
  i,j,p: integer;
  s,c,t,m: string;
  vStr: TStringStream;
begin
  if not TCPClient.Connected then TCPClient.Connect;
  m := EscapeString(edMsg.Text);
  c := edToken.Text;
  t := '';
  for i := 0 to (length(c) div 2) - 1 do t := t + AnsiChar(Byte(('$'+copy(c,i*2+1,2)).ToInteger));
  s := '{"aps":{"alert":"'+ m +'","sound":"default","badge":0}}';
  p := length(s);
  j := p + 38;
  s := #2#0#0 + AnsiChar(hi(j)) + AnsiChar(lo(j)) + #1#0#32 + t + #2 + AnsiChar(hi(p)) + AnsiChar(lo(p)) + s;
  vStr := TStringStream.Create(s);
  try
    SSLHandler.write(vStr);
  finally
    vStr.Free;
  end;
end;

p.s: нафиг 4 байта для общей длины...если дали разрешение на длину сообщения в 2 килобайта...

Ссылка на комментарий
  • 0

Я конечно понимаю, что бороться с проблемой весело, но если не секрет, зачем вам серверная часть, отвечающая за пуши в виде экзешника? Почему выбор не пал на давно реализованное PHP решение, которое может работать на любой платформе?

Ссылка на комментарий
  • 0

Я конечно понимаю, что бороться с проблемой весело, но если не секрет, зачем вам серверная часть, отвечающая за пуши в виде экзешника? Почему выбор не пал на давно реализованное PHP решение, которое может работать на любой платформе?

много факторов )

- для тестов на делфях полезно

- я сам не юзаю это как сервер, у меня джобы на MSSQL все делают, что поделать многие адекватные люди выбирают тот путь, где профи

- не у всех заказчиков прямо под рукой есть веб-сервер и понимание как его юзать, это зависит от специфики проекта, а также влияет бюрократия...

у меня извините сроки не резиновые чтобы с ними нянчиться, мне срубить бабки и попрощаться надо еще...а им подавай решение иначе не подпишут АВР

- еще форум этот если не ошибаюсь на fmx заточен (я не спорю php универсально и удобно, но сори не мое, "ну не люблю я его"(с), это на оутсорсе у меня)

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...