Перейти к содержанию

Bob32

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

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

  • Посещение

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

  1. При публикации приложения на AppleStore вылезает ошибка - В каталог объектов xcode необходимо добавить значок приложения с разрешением 1024*1024 пикселей.... такой иконки в свойствах проекта нет. если ручками деплоить - то какое имя давать? сталкивался кто-нить?
  2. если вы не знаете ответа - просто напишите это! ) но не молчите! )))))
  3. Ребят, неужели ни у кого нет инфы? вопросы то типовые для тех, "кто плавал"...
  4. Добрый день! Настраиваю сейчас встроенные покупки по Apple, потом буду под Google. Создал встроенную покупку на сайте AppleStore Connect. Она создалась. Это моя первая встраенная покупка - при попытке ее отправить на ревью - сайт пишет, что ее на ревью можно отправить только с приложением. Оно пока сыровато - и я планировал его заливать чуть позже. В приложении пытаюсь считать этот ProductID (этой встроенной покупки) - но получаю его в списке Invalid Products. Наверное, это правильно - ведь я покупку пока не запостил дальше, ее не проапрувили итп…. Как это все тестировать и что, получается надо заливать на AppStore сырую программу (в которой я даже не оттестировал этот функционал) , чтобы эта покупка "заработала", потом это все тестировать и потом снова выкладывать новый релиз? я правильно мысль Эпла уловил, или что-то не догоняю? ….. и еще, у меня ProductID начинается с цифры - нормально ли это? сайт такое название проглотил. и еще! ) у меня будет пополнение счёта пользователя в Игре. что выбирать расходуемую покупку - знаю. консоль AppleStore Connect предлагает фиксированный выбор стоимости - те 75, 149, 229, 299, 379, 459, 529, 599, 699,749, 849,899,9991090,1150,1190,1290,1390, 1450,1490, 1590 …………….. вероятно, эти цифры "танцуются" от курса рубля - 1 доллар, 2, 3...… хотя встречаются и странные цифры, которые при делении на 75 не дают близкий к целому числу результат. вопрос вот в чем - мне нужно будет завести , допустим 10 встренных покупок - на какую сумму пользователь хочет пополнить счёт. дальше ему их где-нить в комбо-боксе показывать, он выбирает и я совершаю покупку. я правильно мысль уловил? на произвольную сумму он счет увеличить не сможет. Верно? а что будет когда курс доллара поплывёт? мне вручную все это править придется? СПАСИБО ЗА ВАШИ ДЕЛЬНЫЕ СОВЕТЫ!
  5. у меня это код в обработчике onClick на одной из форм. это основной поток?
  6. есть теория, а есть - практика! ) и есть вот такая жизненная ситуация! ) переписывать это не буду - оно работает! но шобы совсем моднявым парнем стать - готов обернуть! от меня не убудет! ))))))))) ну серьезно - вот как в этой ситуации это лучше сделать? )
  7. ну если весь вот этот ужас ) (а это треть этой процедуры) я в один TThread.Synchronize оберну - мне это зачтётся? ) или надо идти внутрь каждой вот например из этих процедур и там это делать? все они меняют данные на формах. TCommand.GetMyQuests : fmQuestsEditor.LoadMyQuestsInListView(ARequest); TCommand.GetAllQuests : ListViewUpdate(ARequest); TCommand.GetQuest : fmQuestsEditor.LoadQuestData(ARequest); TCommand.DeleteQuest, TCommand.CopyQuest : if ARequest.Error then fmQuestsEditor.lbError.Text:='Connection problems... #32'{+ARequest.ErrorMsg} else fmQuestsEditor.LoadMyQuests; TCommand.GetQuestsPOI : GetQuestsPOI(ARequest); TCommand.GetPOI : GetPOI(ARequest); TCommand.LoadQuestLocally : LoadQuestLocally(ARequest); TCommand.ProcessGameData : ; //////////////////////////////////// TCommand.GetAuthorGames : fmFinance.LoadFinanceListView(ARequest); TCommand.GetUserMoneyRequests : fmMoneyRequest.LoadMoneyRequestListView(ARequest); TCommand.ProcessPaymentRequest: fmMoneyRequest.ProcessPaymentRequest(ARequest); TCommand.GetOpenRequests : fmOpenRequests.LoadMoneyRequestListView(ARequest); TCommand.ProcessOpenPaymentRequest: fmOpenRequests.ProcessOpenPaymentRequests(ARequest); TCommand.GetUserDetails : GetUserDetails(ARequest); мне конечно проще - один раз все это обернуть. procedure TfmMain.OnReceiveData(const ARequest : TRequest); begin if ARequest.Error then begin lbError.Text:='Connection problems... #32';//+ARequest.ErrorMsg; // exit; end; case ARequest.Command of TCommand.Log : begin // Log(ARequest.Content); end; TCommand.GetMessagesFromDataBase : ; TCommand.GetMessages : GetMessages(ARequest); TCommand.AddQuestTask: if ARequest.Error then fmQuestsEditor.Label25.Text:='Connection problems... #32'//+ARequest.ErrorMsg else begin fmQuestsEditor.Label25.Text:='Задание успешно добавлено!'; fmQuestsEditor.edTasksQty.Text:=IntToStr(StrToInt(Trim(fmQuestsEditor.edTasksQty.Text))+1); fmQuestsEditor.edCurrentTask.Text:=IntToStr(StrToInt(Trim(fmQuestsEditor.edCurrentTask.Text))+1); fmQuestsEditor.edTasksQtyChange(Self); fmQuestsEditor.CheckBox1.IsChecked:=False; fmQuestsEditor.CheckBox2.IsChecked:=False; fmQuestsEditor.CheckBox3.IsChecked:=False; fmQuestsEditor.CheckBox4.IsChecked:=False; fmQuestsEditor.Memo1.Text:=''; fmQuestsEditor.Edit2.Text:=''; end; TCommand.DeleteQuestTask: begin fmQuestsEditor.SpeedButton11.Enabled:=True; if ARequest.Error then fmQuestsEditor.Label25.Text:='Connection problems... #32'//+ARequest.ErrorMsg else begin fmQuestsEditor.edTasksQty.Text:=IntToStr(StrToInt(Trim(fmQuestsEditor.edTasksQty.Text))-1); fmQuestsEditor.edTasksQtyChange(Self); fmQuestsEditor.CheckBox1.IsChecked:=False; fmQuestsEditor.CheckBox2.IsChecked:=False; fmQuestsEditor.CheckBox3.IsChecked:=False; fmQuestsEditor.CheckBox4.IsChecked:=False; fmQuestsEditor.Memo1.Text:=''; fmQuestsEditor.Edit2.Text:=''; fmQuestsEditor.edCurrentTaskChange(Self); fmQuestsEditor.Label25.Text:='Задание удалено!'; end; end; TCommand.MoveTaskToLeft: begin fmQuestsEditor.SpeedButton14.Enabled:=True; if ARequest.Error then fmQuestsEditor.Label25.Text:='Connection problems... #32'//+ARequest.ErrorMsg else begin fmQuestsEditor.edCurrentTask.Value:=fmQuestsEditor.edCurrentTask.Value-1; fmQuestsEditor.Label25.Text:='Задание перемещено!'; end; end; TCommand.MoveTaskToRight: begin fmQuestsEditor.SpeedButton16.Enabled:=True; if ARequest.Error then fmQuestsEditor.Label25.Text:='Connection problems... #32'//+ARequest.ErrorMsg else begin fmQuestsEditor.edCurrentTask.Value:=fmQuestsEditor.edCurrentTask.Value+1; fmQuestsEditor.Label25.Text:='Задание перемещено!'; end; end; TCommand.UpdateQuestTask: if ARequest.Error then fmQuestsEditor.Label25.Text:='Connection problems... #32'{+ARequest.ErrorMsg} else fmQuestsEditor.Label25.Text:='Задание сохранено!'; // TCommand.GetQuestTask: GetQuestTask(ARequest); TCommand.GetQuestTask4Edit: fmQuestsEditor.LoadTaskData(ARequest); TCommand.GetImage : begin // Memo1.Lines.Add({GetFileNameFromRequest(}ARequest.Query{)}+'-'); //////////////// if Trim(GetFileNameFromRequest(ARequest.Query))='' then begin lbError.Text:='Ошибка!Некорректное имя файла #172'; exit; end; imBuffer.Bitmap.Assign(ARequest.BitmapSurface); imBuffer.Bitmap.SaveToFile(TPath.Combine(TPath.GetDocumentsPath, GetFileNameFromRequest(ARequest.Query))); if Assigned(ARequest.BitmapSurface) then ARequest.BitmapSurface.Free; { этот код был в онлайн версии imMediaFile.Bitmap.Assign(ARequest.BitmapSurface); imMediaFile.Visible:=True; if Assigned(ARequest.BitmapSurface) then ARequest.BitmapSurface.Free;} end; TCommand.GetImageWithCheck : begin fmQuestsEditor.Image1.Bitmap.Assign(ARequest.BitmapSurface); fmQuestsEditor.Memo1.Visible:=False; fmQuestsEditor.SpeedButton27.Visible:=False; fmQuestsEditor.Image1.Visible:=True; fmQuestsEditor.SpeedButton18.Visible:=True; if Assigned(ARequest.BitmapSurface) then ARequest.BitmapSurface.Free; end; TCommand.UpdateUser : UpdateUser(ARequest); TCommand.GetTopPlayers : GetTopPlayers(ARequest); TCommand.AddQuest : begin fmQuestsEditor.GetQuestId(ARequest); fmQuestsEditor.NewQuest:=False; fmQuestsEditor.SpeedButton6.Enabled:=True; end; ….
  8. сорри, у еще один вопрос по этой теме ) у меня в программе общение с сервером происходит в отдельном потоке, когда надо что-то получить - я из основного в тот (в очередь) команду с параметрами ставлю - в том потоке это обрабатывается, когда приходит ответ - вызывается событие onReceiveData, на которое я вешаю обработчик (это процедура из основной формы), в ней CASE на 100+ команд, и по каждой я вызываю какую то процедуру на какой-то из форм и она что-то там отрисовывает. мне нужно в каждой из этих процедур делать свой TThread.Synchronize - там, где я визуальные компоненты меняю, или один раз это сделать в onReceiveData, - фактически - этот CASE of ….. и вызовы 100 процедур в него поместить? как правильно?
  9. я понимаю, что учить меня Вам наверное не очень интересно, но простите меня пожалуйста и за еще один вопрос: а физически какая разница существует между вот таким присвоением TMemo (или любого другого визуального компонента) через TThread.Synchronize - и простым присваиванием без него? что вообще на самом деле этот TThread.Synchronize делает? ….. кстати, события этого кода происходят просто по кнопке в одной из форм приложения. это же основной поток?
  10. Хорошо. ) просто я перестал писать программы на Дельфи ещё при Ельцине ) сейчас пришлось вернуться обратно. Ельцина нет, а привычки остались )
  11. можете кидаться в меня тухлыми помидорами, но я этот турецкий модуль на 3400 строк с амбициозными названиями SuperObject использовать не стал! ) вот так код выглядит на нашем рабоче-крестьянском уровне! и он работает! ) Str:=Memo1.Lines.Text; Str:=Str.Replace('%Amount%',IntToStr(StrToInt(Edit4.Text)*100),[rfReplaceAll]); Str:=Str.Replace('%OrderId%',IntToStr(OrderId)); Str:=Str.Replace('%Email%',fmSettings.Edit5.Text,[rfReplaceAll]); Str:=Str.Replace('%Phone%',fmSettings.Edit4.Text,[rfReplaceAll]); stSrc := TStringStream.Create('', TEncoding.UTF8); stRes := TStringStream.Create('', TEncoding.UTF8); stSrc.WriteString(Str); stSrc.Position := 0; FHTTPClient:=THTTPClient.Create; FHTTPClient.ConnectionTimeout:=ConstHTTPClientConnectionTimeout; FHTTPClient.ResponseTimeout:=ConstHTTPClientResponseTimeout; FHTTPClient.Accept:='application/json'; FHTTPClient.ContentType:='application/json'; FHTTPClient.AcceptCharSet := 'UTF-8'; FHTTPClient.HandleRedirects := false; try try HTTPResponse:=FHTTPClient.Post({'https://umka.space/api/index.php'}'https://securepay.tinkoff.ru/v2/Init',stSrc, stRes); if (HTTPResponse.StatusCode = 200) then begin Str:=stRes.DataString; Memo2.Lines.Text := Str; end else begin end; except Memo2.Lines.Clear; end; finally if Assigned(FHTTPClient) then FHTTPClient.Free; BytesStream.Free; stSrc.Free; stRes.Free; end; JSON:=TJSONObject(TJSONObject.ParseJSONValue(Str));
  12. те - эта схема синхронная и будет ждать? я вординг понял иначе. а какой смысл тогда присвоение в мемо через Thread.Synchronize делать?
  13. Спасибо за пояснение! но разве из хелпа не следует, что в случае поялвения второго стрима в парамтерах POST - основной поток не будет ждать и пойдет дальше? (см текст выше. я это понял так.)
  14. можно вопрос для понимания? r := h.Post(URL, stSrc, stRes); if r.StatusCode=200 then begin x := so(stRes.DataString); tthread.Synchronize(nil, procedure begin m1.Lines.Text := x.AsJSON(True); end); end else begin tthread.Synchronize(nil, procedure begin m1.Lines.Add(r.StatusText); end); вот в этом коде у POST - второй параметр. это значит, что If you want to receive the response data as your HTTP client downloads it from the target server, instead of waiting for your HTTP client to download the whole data, use the AResponseContent parameter to specify a stream to receive the downloaded data. Alternatively, you can wait for your HTTP client to download the whole response data, and obtain the response data as a stream from the ContentStream property of the response object that Get returns. Regardless of whether you receive the data as it comes or wait for the whole data to be available, you can handle the OnReceiveData event to track the progress of the download of the response data. ….надо по окончанию загрузки - ловить момент обработчиком на OnReceiveData. разве нет? как эта схема с tthread.Synchronize в данном случае работает? ВОТ ЭТОГО НЕ ПОНИМАЮ! ) …….. мне кажется - она работает просто потому, что контент маленький и пулей загружается.
  15. просто для моего понимания. вот смотрите - человек в программе нажал на кнопку - оплатить. больше сейчас делать ему нечего.он все равно будет ждать. так ли много смысла это запускать в фоне? длится для пользователя это будет все равно одни и те же доли секунды.
  16. Спасибо Вам огромное за время и помощь! я сделаю, как в вашем коде. справедливости ради , этот Post (с двумя стримами, из которых второй докачиватся в фоне) - это другая функция этого класса. в той есть баг. это моё мнение ) r := h.Post(URL, stSrc, stRes);
  17. вы не поверите, но и у меня позавчера работало. это какой-то плавающий баг. сейчас стабильно нет.
  18. на Берлине? у меня Рио. в этом тоже может быть дело. и на Рио под ИОС-ом тоже работает. под АНдроидом - нет. может как-то изголиться и по другому из реквестконтента сгружать данные до парсера?
  19. вот эту структуру можно залить в Memo1 - тогда и менять в ней ничего не надо вот это не нужно: Str:=Str.Replace('%Amount%',IntToStr(StrToInt(Edit4.Text)*100),[rfReplaceAll]); Str:=Str.Replace('%OrderId%',IntToStr(OrderId)); Str:=Str.Replace('%Email%',fmSettings.Edit5.Text,[rfReplaceAll]); Str:=Str.Replace('%Phone%',fmSettings.Edit4.Text,[rfReplaceAll]); { "TerminalKey": "1595881652554DEMO", "Amount": "140000", "OrderId": "2105094", "Description": "Подарочная карта на 1400.00 рублей", "DATA": { "Phone": "+71234567890", "Email": "a@test.com" }, "Receipt": { "Email": "a@test.ru", "Phone": "+79031234567", "EmailCompany": "b@test.ru", "Taxation": "osn", "Items": [ { "Name": "Наименование товара 1", "Price": 10000, "Quantity": 1.00, "Amount": 10000, "PaymentMethod": "full_prepayment", "PaymentObject": "commodity", "Tax": "vat10", "Ean13": "0123456789" }, { "Name": "Наименование товара 2", "Price": 20000, "Quantity": 2.00, "Amount": 40000, "PaymentMethod": "prepayment", "PaymentObject": "service", "Tax": "vat20" }, { "Name": "Наименование товара 3", "Price": 30000, "Quantity": 3.00, "Amount": 90000, "Tax": "vat10" } ] } }
  20. Str:=Memo1.Lines.Text; Str:=Str.Replace('%Amount%',IntToStr(StrToInt(Edit4.Text)*100),[rfReplaceAll]); Str:=Str.Replace('%OrderId%',IntToStr(OrderId)); Str:=Str.Replace('%Email%',fmSettings.Edit5.Text,[rfReplaceAll]); Str:=Str.Replace('%Phone%',fmSettings.Edit4.Text,[rfReplaceAll]); BytesStream:=TBytesStream.Create(TEncoding.UTF8.GetBytes(Str)); FHTTPClient:=THTTPClient.Create; FHTTPClient.ConnectionTimeout:=ConstHTTPClientConnectionTimeout; FHTTPClient.ResponseTimeout:=ConstHTTPClientResponseTimeout; FHTTPClient.UserAgent:='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586'; FHTTPClient.Accept:='application/json'; FHTTPClient.AcceptEncoding:='gzip, deflate'; FHTTPClient.AcceptLanguage:='ru,en-US;q=0.8,en;q=0.6'; FHTTPClient.ContentType:='application/json'; FHTTPClient.AcceptCharSet := 'UTF-8'; try try HTTPResponse:=FHTTPClient.Post({'https://umka.space/api/index.php'}'https://securepay.tinkoff.ru/v2/Init', BytesStream); if Assigned(HTTPResponse) and (HTTPResponse.StatusCode = 200) then begin if Assigned(HTTPResponse.ContentStream) then Memo2.Lines.LoadFromStream(HTTPResponse.ContentStream) else Memo2.Lines.Clear; end else begin lbError.Text:='Connection problems... #380 '+IntToStr(HTTPResponse.StatusCode); AniIndicator1.Visible:=False; AniIndicator1.Enabled:=False; exit; end; except Memo2.Lines.Clear; end; finally if Assigned(FHTTPClient) then FHTTPClient.Free; BytesStream.Free; end; //Memo2.Lines.LoadFromStream(HTTPResponse.ContentStream); JSON:=TJSONObject(TJSONObject.ParseJSONValue(Memo2.Lines.Text)); if not JSON.TryGetValue('Success', Success) then begin lbError.Text:='Connection problems... #382'; AniIndicator1.Visible:=False; AniIndicator1.Enabled:=False; exit; end;
  21. а что имеется ввиду - форма с кодом? весь проект очень большой. или просто кусок кода?
  22. [Host] => umka.space [Port] => 443 [X-Forwarded-For] => 31.173.84.116 [X-Real-IP] => 31.173.84.116 [X-Forwarded-Port] => 443 [X-MH-Host] => umka.space [Content-Length] => 760 [Accept-Language] => ru,en-US;q=0.8,en;q=0.6 [Accept-Encoding] => gzip, deflate [Accept] => application/json [Content-Type] => application/json [User-Agent] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586 [Accept-Charset] => UTF-8 (в FHTTPClient.Accept:='application/json' оставил только это - выше заголовки уже то, что получается после после этого изменения)
  23. а если он там среди прочих перечислен - могут быть проблемы? (сейчас заголовки подкручу) Спасибо Вам за помощь!
×
×
  • Создать...