rustam_d
Пользователи-
Постов
200 -
Зарегистрирован
-
Посещение
-
Победитель дней
2
Весь контент rustam_d
-
krapotkin снимаю шляпу, вы подсказали правильный путь... пойду выпью за это...php - go home.
-
Я сделал это !!! И это бесплатно! )) Отправка ИОС пушей на русском из делфи больше не секрет!!! Полный исходник, максимально упрощенный. Можно указывать циферку на иконке(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
-
я бы использовал ListView, грид совершенно не оправдан, т.к. нет более 6 полей, также интрефесно подход тоже сделал бы по другому скажем выводил важную инфу в листвью, дале при нажатии уходил бы вправо на другой табшит и там правил, затем возвращался назад а сохранение делал бы с нуля, очистил cds и залил бы конечный результат. пробегать по листвью не проблема, ставить на итемах галочки аналогично
-
почему вас не устраивает ручное сохранение? циклов нет, кучи блоков нет, итераций ноль...нет повода отказываться от ручного... если где-то теряете контроль или хотите быть уверенным с сохранении, то в критически важных местах просто еще раз сохраняйте, одна строка...эт разве проблема )
- 5 ответов
-
- ClientDataSet
- IOS
-
(и ещё 1 )
C тегом:
-
можете описать конечную задачу? ну если не секрет конечно...мало ли...может идея на млн.$ тянет просто путаницы будет гораздо меньше и получите дельный совет...а то вопросы у вас сейчас к делфи или билдеру чем к фмх...
-
не пытайтесь "подвести" под ведро...) мак это дело тонкое... если не пробовали то лучше промолчать...). обратили внимание на нолики? там ведь в байтах передача... не как в ведре... если решу проблему сообщу, и тогда весь мир стекется к моему посту, т. к. не нашёл в инете решений на делфи... ну может есть на провайдерах... но хочу простоты. Как вариант, если не выйдет, то разместить php скрипт где нибудь на хостинге и отправлять через него, проблем с русским нет. я об этом и прошу, строчку мне в НЕХ бы глянуть...ну если пипл юзает джейсон конечно. еще просил у галогена, может вышлет ). такто ессесно не важно где, пхп, хттп и т.п....
-
не пытайтесь "подвести" под ведро...) мак это дело тонкое... если не пробовали то лучше промолчать...). обратили внимание на нолики? там ведь в байтах передача... не как в ведре... если решу проблему сообщу, и тогда весь мир стекется к моему посту, т. к. не нашёл в инете решений на делфи... ну может есть на провайдерах... но хочу простоты.
-
это было сделано изначально)
-
Так сработает только если фрейм создается автоматически. У меня он создается вручную. вы запутали и даже стравили))) а все из-за отсутствия инфы... вы создаете кнопку или нет? ))
-
да все ок Мартифан, сори если неправильно выразился, я то как раз и не проверял еще фреймы, а постоянно открываю в фмх новое ). дикость как раз в том, что это Frame->Button1->Text не сработало...
-
Если это лучший ответ...то наверно пора плакать...неужели в фмх надо получать доступ к объектам фрейма путем "пробежки"...если правда то жесть просто...
-
Те кто отправляет пуши в ИОС на русском, прошу выложить строку в HEX-текст, которая уходит в APS. Конечно можете изменить свой токен. Достаточно слова "Привет" или "Ваш". Я по строке смогу разгадать кодировку, этот код давинчи и напишу на дельфи. Всем пригодится! Эх гонсалес как же ты припек со своими недоделками...
-
Для споров Си или Делфи полно других форумов. И там мало достойных аргументов у разработчиков кто пишет на Делфи, я не про саму Делфи. Сам я уже долго сижу на Делфи, честно скажу я не в восторге от фмх, НО у меня всегда были для VCL такие же будут и для FMX аргументы, я люблю(обожаю если хотите) львиную часть времени тратить на реализацию задачи, а не на анализ кода, сборку и настройку интерфейса. Последнее я называю "настройка красоты блондинок или сислинукс задротов", т.к это НЕ ЗАДАЧА! И так две пропорции "Задача" - "Настройка", за второе НЕ ПЛАТЯТ! Делфи во все времена рвала Си на части в этой пропорции и рвет дальше. Делфи 70%-30%, у Си 20% - 80% FMX 80%-20%, у Си 10% - 90% Если вы считаете что занимаетесь полезным делом...стоит понять о чем я написал...вообщем занимайтесь настройкой...не мешайте бабло рубить...
-
Предлагаю ознакомиться с компонентом 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
-
Лови ipad estay https://www.dropbox.com/s/527supdlc565umw/20150923_183759.jpg?dl=0 Только в модуле uDevice на 137 кажись строке для виза отсутствовал энд. Рекомендую поправить иначе не компилится под ИОС.
- 40 ответов
-
ага, что значит без оплаты? в developer program не заэнролите никак без вечно зеленых )).
-
Отправку пушей ИОС написал в 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 сам стринг...не доходят пуши. Может с заголовком по колдовать как-то надо? Тогда и от анси может можно уйти?
-
Ярослав, поюзал ваши компоненты, очень понравились. Не могли бы вы создать TfgToast? ...на базе скажем TfgActivityDialog. Жутко нужный компонент. Варианты сторонних глючные... Св-ва: длительность, фон, текст, высота - если автовроп сложен будет. (капризы не прошу: алайн и все такое).
-
Разобрался такая ошибка возникает из-за путаницы сертификатов! 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? и т.п. бредом.
-
А может проблема в созданном pem файле. В связке ключей не понятно, там где единственная ссылка на PUSH внутри есть ключ Mac Developer...хм он ли нужен? Может нужен другой ключ? Типа IOS Developer... Сам сертификат пуша пробовал с developer.apple.com качать и вытаскивал сертификат openssl x509 -inform der -in aps_development.cer -out pushcer.pem Но ключ то какой тогда? С ключами походу путаница назрела...
-
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 вылетает ошибка выше. Чую где-то рядом собака зарыта, а вот где...
-
ясно, ну тогда остается решать проблемы с Кинвей...по мне GCM проще не куда...правда группой получать пуши пока незнаю как...
- 13 ответов
-
вот мой рабочий от вашего пару отличий все же есть... 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) -->
- 13 ответов
-
вы говорите все ок...но походу не так )) выложите манифест файл андроида...он важен для пушей, точнее туда дописывать надо права отдельно Я не говорю, что всё ОК. Я говорю, что всё, что вы писали я проверял. Проекты в которых РАБОТАЛИ и РАБОТАЮТ пуши, под Delphi 10 не запускаются, ровно так же, как и новые проекты с компонентом для работы с Push. <?xml version="1.0" encoding="utf-8"?> ... Я правильно понимаю, что этот манифест вам позволял получать пуши в XE8 ?
- 13 ответов