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

rustam_d

Пользователи
  • Постов

    200
  • Зарегистрирован

  • Посещение

  • Победитель дней

    2

Сообщения, опубликованные rustam_d

  1. Я сделал это !!! И это бесплатно! )) Отправка ИОС пушей на русском из делфи больше не секрет!!!
    Полный исходник, максимально упрощенный. Можно указывать циферку на иконке(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
  2. как раз таки проблема в переборе всех значение кроме нужного 

    с хранение проблем нет

     

    я бы использовал ListView, грид совершенно не оправдан, т.к. нет более 6 полей, также интрефесно подход тоже сделал бы по другому

    скажем выводил важную инфу в листвью, дале при нажатии уходил бы вправо на другой табшит и там правил, затем возвращался назад

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

    аналогично

  3. Добрый день использую локальное хранилище настроек подключения к сайту 

    ClientDataSet - XML 

    заметил такую особенность при  закрытии программы под Windows  все изменения  будут перезаписаны в XML   но при  выгрузке  приложение на IOS/Android  сохранения результатов не происходит нужно в ручном режиме  делать сохранение файла

     

    ClientDataSet1.SaveToFile(ClientDataSet1.FileName);

     

    подскажите как можно решить проблему 

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

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

  4. // Как теперь создать переменную класса, хранящегося в Control->TagString?
    // Возможно ли это?

    можете описать конечную задачу? ну если не секрет конечно...мало ли...может идея на млн.$ тянет

    просто путаницы будет гораздо меньше и получите дельный совет...а то вопросы у вас сейчас к делфи или билдеру чем к фмх...

  5.  

     

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

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

     

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

     

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

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

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

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

    Frame.Button1.Text := 'Привет из главной формы!';
    Так сработает только если фрейм создается автоматически. У меня он создается вручную.
    вы запутали и даже стравили)))

    а все из-за отсутствия инфы... вы создаете кнопку или нет? ))

  8. как была поставлена задача этот метод поможет, если другой вариант знаешь место того что умничать мог бы ответить человеку

    да все ок Мартифан, сори если неправильно выразился, я то как раз и не проверял еще фреймы, а постоянно открываю в фмх новое ).

    дикость как раз в том, что это 

    Frame->Button1->Text 

    не сработало...

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

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

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

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

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

  10.  

    если ничего не изменится то уже скоро, не переживайте :)

     

    Для споров Си или Делфи полно других форумов. И там мало достойных аргументов у разработчиков кто пишет на Делфи, я не про саму Делфи.

    Сам я уже долго сижу на Делфи, честно скажу я не в восторге от фмх, НО у меня всегда были для VCL такие же будут и для FMX аргументы,

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

    Последнее я называю "настройка красоты блондинок или сислинукс задротов", т.к это НЕ ЗАДАЧА!

    И так две пропорции "Задача" - "Настройка", за второе НЕ ПЛАТЯТ!

    Делфи во все времена рвала Си на части в этой пропорции и рвет дальше.

    Делфи 70%-30%, у Си 20% - 80%

    FMX 80%-20%, у Си 10% - 90%

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

  11. 795d196b1044.jpg
    Предлагаю ознакомиться с компонентом SDAC для работы с MS SQL.
    Компания - https://www.devart.com/sdac/  Для тех кто еще не использует SDAC в ОС Android и IOS.
     
    С версии 7.0.1 с ноября 2014 года компания доработала комонент SDAC
    и появилась возможность работы с базой данных MS SQL Server из Android и IOS.
    SDAC (pro version) компонент позволяет работать c MS SQL напрямую минуя посредников, 
    в частности DataSnap, который требует разработки и поддержки своих application server.
     
    Отсутсвие возможности соединяться с MS SQL из Android и IOS закрывало мне и массе другим
    разработчикам в мир мобильных приложений на Delphi, всетаки мы не писатели на JDBC. 
    Однако благодаря этому компоненту я снова в строю, хоть и с 2014 года ) никогда не поздно. 
    Древняя технология клиент-сервер вполне работоспособная даже на 128 к/бит.
     
    Разработчики компонента оперативно исправляют баги. Настройка соединения элементарная и
    ничем не отличается от VCL. А последние версии уже почти не отличаются от VCL
    в плане разработки.
     
    В своих программах я предпочитаю использовать TMSStoredProc, но и другие компоненты работают идеально.
    Стоит однако помнить, что для корректного отображения русского языка в гаджетах, важно в БД
    создавать тип NVARCHAR, а в программе обращаться через AsWideString, например часть кода по загрузке меню.
     
     vSp.ParamByName('aSerial').AsWideString
     vSp.FieldByName('menu_text').AsWideString,
     
    function TfmMain.LoadPopup: boolean;
    var
        vSp: TMSStoredProc;
    begin
        Result := false;
        vSp := SpCreate('ppp.sp_menu;3');
        try
          vSp.Open;
          while not vSp.eof do
          begin
            MenuInsert(
              vSp.FieldByName('btn_text').AsWideString,
              vSp.FieldByName('img_index').AsInteger,
              vSp.FieldByName('id').AsInteger
            );
            vSp.Next;
          end;
        finally
          vSp.Free;
        end;
        Result := true;
    end;
     
    function TfmMain.SpCreate(const aName: string):TMSStoredProc;
    var
      vSp: TMSStoredProc;
    begin
      Result := nil;
      vSp := TMSStoredProc.Create(Self);
      vSp.Connection := ssMain;
      vSp.StoredProcName := aName;
      vSp.PrepareSQL;
      Result := vSp;
    end;
     
    в этом примере подчеркнуто:
    - простой SQL описанный в процедуре можно как и в VCL открыть c помощью Open (конечно ExecProc также доступен)
    - префикс "3" означет поддержку префиксов(в одной процедуре более одной, типа oracle.package)
     
    Еще один момент, но возможно разработчики его поправят, если есть OUT параметры, то они должны быть заполнены в процедуре,
    другими словами инициализированы. Ниже упрощенный пример:
     
    procedure TfmMain.actPinExecute(Sender: TObject);
    var
      vSp: TMSStoredProc;
    begin
      vSp := SpCreate('ooo.sp_pin;5');  //spcreate описана выше
      try
        vSp.ParamByName('aSerial').AsWideString := pSerial;
        vSp.ExecProc;
        if vSp.ParamByName('aTxt').AsWideString = 'OK' then
          ShowText(vSp.ParamByName('aTxt').AsWideString);
      finally
        vSp.Free;
      end;
    end;
     
    Скорость авторизации сессии TMSConnection достаточно высокая.
     
    Компоненты проходят BindSource также как и любые другие DataSet.
    Можно поспорить о безопасности клиент-сервер на гаджетах или облачных решениях, но если программер опытный в MS SQL
    в плане безопасности, то проект будет достаточно профессионален, ведь не зря я использую хранимые процедуры, они ведь
    все повязаны на грантах...
     
    Devart разработали Delphi компоненты для всех существующих баз данных. И с работая с ними я также был очень доволен.
    Фишка всех компонентов - отказ от клиентских драйверов. Не секрет, что стандартными компонентами FMX соединяться
    с такими примитивными БД: mysql и sqllite порой "не айс", а иногда весьма сложно доставляя нагрузку поисковику гугл 
    и различным стэковерам... Devart компоненты универсальны, как для VCL так и для FMX и значительно(часы, сутки и недели)
    экономят время в разработке.
     
    Компоненты SDAC проверены на личном опыте Андроида и ИОС, разработчики исправили 2 бага обнаруженые мной достаточно
    оперативно.
     
    Это не реклама, я бы хотел чтобы этот раздел также обсуждался разработчиками на форуме fire-monkey.ru
     
    Ярослав, прошу создать ветку подфорума MS SQL.
     
    С Уважением,
    rustam_d
     
     
  12. Доброго времени суток!

     

    Прошу потестить модуль uDeviceInfo

     

    Лови ipad estay

    https://www.dropbox.com/s/527supdlc565umw/20150923_183759.jpg?dl=0

    Только в модуле uDevice на 137 кажись строке для виза отсутствовал энд. Рекомендую поправить иначе не компилится под ИОС.

  13. Отправку пушей ИОС написал в 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 сам стринг...не доходят пуши.

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

     

  14. Ярослав,

     

    поюзал ваши компоненты, очень понравились.

    Не могли бы вы создать TfgToast? ...на базе скажем TfgActivityDialog.

    Жутко нужный компонент. Варианты сторонних глючные...

    Св-ва: длительность, фон, текст, высота - если автовроп сложен будет. (капризы не прошу: алайн и все такое).

     

  15. Разобрался такая ошибка возникает из-за путаницы сертификатов!

     

    APN сертификат на сайте конечно надо заводить от девелопера, но это у меня и так было.

    А вот в чем траблы были.

    В связке ключей валялись сертификаты пушей моих экспериментов, но только по дате их отличишь.

    Поэтому на всякий случай удалил ВСЕ сертификаты PUSH, тут же все еще на маке зашел в сафари

    и скачал APN сертификат *.cer с сайта developer.apple.

    Кликаем мышкой на этом сертификате и он отображается в связке ключей.

    Затем находим ветку PUSH, открываем ее, ОБЕ строчки выделяем и сохраняем в MyPush.p12, пароль не нужен.

    Далее уже на винде, утилитой ссл генерим pem файл

    openssl pkcs12 -in MyPush.p12 -out MyPush.pem -nodes

    жмем энтер и никаких паролей.

    Далее в проекте делфи в SSLHandler заполняем что и гонсалес показал и cer и key указываем MyPush.pem.

     

    Я потратил много времени на файлы и версии опенссл libeay32.dll и ssleay32.dll...но это НЕ ТО !!!

    По прежнему все просто ложите в папку проекта эти файлы и не выносите мозг никому Wow64 или System32...или 0.9.8m,d,k? и т.п. бредом.

  16. А может проблема в созданном pem файле.

    В связке ключей не понятно, там где единственная ссылка на PUSH внутри есть ключ Mac Developer...хм он ли нужен?

    Может нужен другой ключ? Типа IOS Developer...

    Сам сертификат пуша пробовал с developer.apple.com качать  и вытаскивал сертификат openssl x509 -inform der -in aps_development.cer -out pushcer.pem

    Но ключ то какой тогда?

    С ключами походу путаница назрела...

  17. Push сообщения IOS не могу соединиться с сервером для отправки.

    Что на FMX что на VCL одна и таже ошибка при попытке установить соединение с gateway.sandbox.push.apple.com

    EIdOSSLConnectError with message 'Error connecting with SSL.
    EOF was observed that violates the protocol'
    

    Все сделал как Гонсалес показал http://www.youtube.com/watch?v=n_C5_GxQhk4

    Качал SSL 0.9.8k64 и 1.0.1m x64 https://indy.fulgan.com/SSL/

    Сенерил pem файл (p12 сделал как и Гонсалес с 2 ключей один p12).

    openssl pkcs12 -in Push.p12 -out push.pem

    сослался на него в SSLHandler в cert и key

    Метод 23

    Но вот как делаю TCPClient.Connect вылетает ошибка выше.

    Чую где-то рядом собака зарыта, а вот где...

     

  18.  

    В 8.1 у меня отлично работает стандартный шаблон без каких либо исправлений.

    <?xml version="1.0" encoding="utf-8"?>
    

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

  19. Да с данным манифестом всё работало, хотя уже столько копий проекта, что мог запутаться.

     

    вот мой рабочий

    от вашего пару отличий все же есть...

    1. <permission android:name="%package%.permission....

    2. блок <receiver тоже отличается кажется весь

     

    я добавлял советы сабины блоками Rustam added и end ) 

    не уверен, но вдруг вам поможет

    <?xml version="1.0" encoding="utf-8"?>
    <!-- BEGIN_INCLUDE(manifest) -->
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="%package%"
            android:versionCode="%versionCode%"
            android:versionName="%versionName%"
            android:installLocation="%installLocation%">
    
    
        <!-- This is the platform API where NativeActivity was introduced. -->
        <uses-sdk android:minSdkVersion="%minSdkVersion%" android:targetSdkVersion="%targetSdkVersion%" />
    <%uses-permission%>
        <uses-feature android:glEsVersion="0x00020000" android:required="True"/>
        <application android:persistent="%persistent%" 
            android:restoreAnyVersion="%restoreAnyVersion%" 
            android:label="%label%" 
            android:debuggable="%debuggable%" 
            android:largeHeap="%largeHeap%"
            android:icon="%icon%"
            android:theme="%theme%"
            android:hardwareAccelerated="%hardwareAccelerated%">
        <!--Rustam added -->
        <!-- GCM connects to Google Services. -->
        <uses-permission android:name="android.permission.INTERNET" />
    
    
        <!-- GCM requires a Google account. -->
        <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    
    
        <!-- Keeps the processor from sleeping when a message is received. -->
        <uses-permission android:name="android.permission.WAKE_LOCK" />
    
    
        <!--
         Creates a custom permission so only this app can receive its messages.
    
    
         NOTE: the permission *must* be called PACKAGE.permission.C2D_MESSAGE,
         where PACKAGE is the application's package name.
        -->
        <permission android:name="%package%.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
        <uses-permission android:name="%package%.permission.C2D_MESSAGE" />
    
    
        <!-- This app has permission to register and receive data message. -->
        <uses-permission
        android:name="com.google.android.c2dm.permission.RECEIVE" />
        <!--Rustam added end-->
    <%application-meta-data%>
            <!-- Our activity is a subclass of the built-in NativeActivity framework class.
                 This will take care of integrating with our NDK code. -->
            <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity"
                    android:label="%activityLabel%"
                    android:configChanges="orientation|keyboard|keyboardHidden"
                    android:launchMode="singleTask">
                <!-- Tell NativeActivity the name of our .so -->
                <meta-data android:name="android.app.lib_name"
                    android:value="%libNameValue%" />
                <intent-filter>  
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter> 
            </activity>
        <!--Rustam added -->
        <receiver
              android:name="com.embarcadero.gcm.notifications.GCMNotification" android:exported="true"
              android:permission="com.google.android.c2dm.permission.SEND" >
                <intent-filter>
                  <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                  <category android:name="%package%" />
                </intent-filter>
        </receiver>
        <service android:name="com.embarcadero.gcm.notifications.GCMIntentService" />
        <!--Rustam added end-->
            <%activity%>
            <receiver android:name="com.embarcadero.firemonkey.notifications.FMXNotificationAlarm" />
            <%receivers%>
        </application>
    </manifest>
    <!-- END_INCLUDE(manifest) -->
    
  20.  

     

    Всё делал и как написано, и по всякому.

    В проекте нет кода. Тестовый проект, без всякого кода, просто два элемента на форме. Провайдер и ПушЭвент. Запускаем, получаем чёрный экран. Даже если отключить автоактивацию и пр. Что Kinvey, что Parse, не работает ни то, ни другое в режиме Релиза на андройде.

    вы говорите все ок...но походу не так ))

    выложите манифест файл андроида...он важен для пушей, точнее туда дописывать надо права отдельно

     

    Я не говорю, что всё ОК. Я говорю, что всё, что вы писали я проверял. Проекты в которых РАБОТАЛИ и РАБОТАЮТ пуши, под Delphi 10 не запускаются, ровно так же, как и новые проекты с компонентом для работы с Push.

     

    <?xml version="1.0" encoding="utf-8"?>
    ...
    

    Я правильно понимаю, что этот манифест вам позволял получать пуши в XE8 ?

×
×
  • Создать...