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

rustam_d

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

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

  • Посещение

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

    2

Весь контент rustam_d

  1. krapotkin снимаю шляпу, вы подсказали правильный путь... пойду выпью за это...php - go home.
  2. Я сделал это !!! И это бесплатно! )) Отправка ИОС пушей на русском из делфи больше не секрет!!! Полный исходник, максимально упрощенный. Можно указывать циферку на иконке(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
  3. я бы использовал ListView, грид совершенно не оправдан, т.к. нет более 6 полей, также интрефесно подход тоже сделал бы по другому скажем выводил важную инфу в листвью, дале при нажатии уходил бы вправо на другой табшит и там правил, затем возвращался назад а сохранение делал бы с нуля, очистил cds и залил бы конечный результат. пробегать по листвью не проблема, ставить на итемах галочки аналогично
  4. почему вас не устраивает ручное сохранение? циклов нет, кучи блоков нет, итераций ноль...нет повода отказываться от ручного... если где-то теряете контроль или хотите быть уверенным с сохранении, то в критически важных местах просто еще раз сохраняйте, одна строка...эт разве проблема )
  5. можете описать конечную задачу? ну если не секрет конечно...мало ли...может идея на млн.$ тянет просто путаницы будет гораздо меньше и получите дельный совет...а то вопросы у вас сейчас к делфи или билдеру чем к фмх...
  6. не пытайтесь "подвести" под ведро...) мак это дело тонкое... если не пробовали то лучше промолчать...). обратили внимание на нолики? там ведь в байтах передача... не как в ведре... если решу проблему сообщу, и тогда весь мир стекется к моему посту, т. к. не нашёл в инете решений на делфи... ну может есть на провайдерах... но хочу простоты. Как вариант, если не выйдет, то разместить php скрипт где нибудь на хостинге и отправлять через него, проблем с русским нет. я об этом и прошу, строчку мне в НЕХ бы глянуть...ну если пипл юзает джейсон конечно. еще просил у галогена, может вышлет ). такто ессесно не важно где, пхп, хттп и т.п....
  7. не пытайтесь "подвести" под ведро...) мак это дело тонкое... если не пробовали то лучше промолчать...). обратили внимание на нолики? там ведь в байтах передача... не как в ведре... если решу проблему сообщу, и тогда весь мир стекется к моему посту, т. к. не нашёл в инете решений на делфи... ну может есть на провайдерах... но хочу простоты.
  8. Так сработает только если фрейм создается автоматически. У меня он создается вручную. вы запутали и даже стравили))) а все из-за отсутствия инфы... вы создаете кнопку или нет? ))
  9. да все ок Мартифан, сори если неправильно выразился, я то как раз и не проверял еще фреймы, а постоянно открываю в фмх новое ). дикость как раз в том, что это Frame->Button1->Text не сработало...
  10. Если это лучший ответ...то наверно пора плакать...неужели в фмх надо получать доступ к объектам фрейма путем "пробежки"...если правда то жесть просто...
  11. Те кто отправляет пуши в ИОС на русском, прошу выложить строку в HEX-текст, которая уходит в APS. Конечно можете изменить свой токен. Достаточно слова "Привет" или "Ваш". Я по строке смогу разгадать кодировку, этот код давинчи и напишу на дельфи. Всем пригодится! Эх гонсалес как же ты припек со своими недоделками...
  12. Для споров Си или Делфи полно других форумов. И там мало достойных аргументов у разработчиков кто пишет на Делфи, я не про саму Делфи. Сам я уже долго сижу на Делфи, честно скажу я не в восторге от фмх, НО у меня всегда были для VCL такие же будут и для FMX аргументы, я люблю(обожаю если хотите) львиную часть времени тратить на реализацию задачи, а не на анализ кода, сборку и настройку интерфейса. Последнее я называю "настройка красоты блондинок или сислинукс задротов", т.к это НЕ ЗАДАЧА! И так две пропорции "Задача" - "Настройка", за второе НЕ ПЛАТЯТ! Делфи во все времена рвала Си на части в этой пропорции и рвет дальше. Делфи 70%-30%, у Си 20% - 80% FMX 80%-20%, у Си 10% - 90% Если вы считаете что занимаетесь полезным делом...стоит понять о чем я написал...вообщем занимайтесь настройкой...не мешайте бабло рубить...
  13. rustam_d

    MS SQL Server

    Предлагаю ознакомиться с компонентом 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
  14. Лови ipad estay https://www.dropbox.com/s/527supdlc565umw/20150923_183759.jpg?dl=0 Только в модуле uDevice на 137 кажись строке для виза отсутствовал энд. Рекомендую поправить иначе не компилится под ИОС.
  15. ага, что значит без оплаты? в developer program не заэнролите никак без вечно зеленых )).
  16. Отправку пушей ИОС написал в 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 сам стринг...не доходят пуши. Может с заголовком по колдовать как-то надо? Тогда и от анси может можно уйти?
  17. Ярослав, поюзал ваши компоненты, очень понравились. Не могли бы вы создать TfgToast? ...на базе скажем TfgActivityDialog. Жутко нужный компонент. Варианты сторонних глючные... Св-ва: длительность, фон, текст, высота - если автовроп сложен будет. (капризы не прошу: алайн и все такое).
  18. Разобрался такая ошибка возникает из-за путаницы сертификатов! 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? и т.п. бредом.
  19. А может проблема в созданном pem файле. В связке ключей не понятно, там где единственная ссылка на PUSH внутри есть ключ Mac Developer...хм он ли нужен? Может нужен другой ключ? Типа IOS Developer... Сам сертификат пуша пробовал с developer.apple.com качать и вытаскивал сертификат openssl x509 -inform der -in aps_development.cer -out pushcer.pem Но ключ то какой тогда? С ключами походу путаница назрела...
  20. не помогло, скачал ssl1.0.2d x64 и ssl1.0.2d x32 раскидал как по линку 64 в систем32 и 32 в вов64 ошибка таже...EOF was observed that violates the protocol может есть у кого работащий код скиньте плиз...
  21. 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 вылетает ошибка выше. Чую где-то рядом собака зарыта, а вот где...
  22. ясно, ну тогда остается решать проблемы с Кинвей...по мне GCM проще не куда...правда группой получать пуши пока незнаю как...
  23. вот мой рабочий от вашего пару отличий все же есть... 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) -->
  24. вы говорите все ок...но походу не так )) выложите манифест файл андроида...он важен для пушей, точнее туда дописывать надо права отдельно Я не говорю, что всё ОК. Я говорю, что всё, что вы писали я проверял. Проекты в которых РАБОТАЛИ и РАБОТАЮТ пуши, под Delphi 10 не запускаются, ровно так же, как и новые проекты с компонентом для работы с Push. <?xml version="1.0" encoding="utf-8"?> ... Я правильно понимаю, что этот манифест вам позволял получать пуши в XE8 ?
×
×
  • Создать...