gonzales

Пользователи
  • Публикаций

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

  • Посещение

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

    1

gonzales стал победителем дня 4 января 2015

gonzales имел наиболее популярный контент!

Информация о gonzales

  • Звание
    Продвинутый пользователь

Посетители профиля

556 просмотров профиля
  1. gonzales

    Пуши в IOS

    Так а в чем конкретно проблема? В коде есть OnReceiveNotificationEvent - вызывается когда придет пуш. Соответственно вместо ShowMessage(aText); пишите вызов новой формы. Если она уже создана, то просто FormB.visible:=true;, если не создана, то вызов конструктора, (примерно так FormB:=TForm.Create;, соответственно конструктор должен быть описан)
  2. gonzales

    Пуши в IOS

    Все правильно, так и работает. При публикации в аппсторе sandbox (песочница) надо снять
  3. Забыл уточнить, что во втором варианте программа вообще завешивается))))
  4. Доброго времени суток! Столкнулся с задачей организовать прием MJPEG c ip-камеры. Само по себе все работает. На кнопке висит GET запрос в камеру procedure TForm1.FormCreate(Sender: TObject); begin FReceivedData := TMemoryStream.Create; FParsedData := TMemoryStream.Create; end; procedure TForm1.DeleteStream(Stream: TMemoryStream; Amount: Integer); var bufStream: TMemoryStream; newSize: int64; begin bufStream := TMemoryStream.Create; // Check size if (Amount < 0) then Amount := 0 else if Amount > Stream.Size then Amount := Stream.Size; Stream.Position := Amount; newSize := Stream.Size - Amount; bufStream.SetSize(newSize); bufStream.Position := 0; bufStream.CopyFrom(Stream, newSize); Stream.Clear; Stream.SetSize(newSize); Stream.Position := 0; bufStream.Position := 0; Stream.CopyFrom(bufStream, newSize); bufStream.Free; bufStream := nil; end; procedure TForm1.Button6Click(Sender: TObject); begin IdHTTP1.Get('http://192.168.0.9/videostream.cgi?user=admin&pwd=888888', FReceivedData); end; На форме idHTTP, idIOHandler и IdConnectionIntercept У IdConnectionIntercept есть метод OnReceive. procedure TForm1.IdConnectionInterceptReceive(ASender: TIdConnectionIntercept; var ABuffer: TIdBytes); begin Form1.ParseJPEGData; end; procedure TForm1.ParseJPEGData; var i: Integer; StartPos, EndPos: Integer; StartPt: Pointer; Data, DataNext: PByte; Amount: Integer; buffer: TBytes; begin // Check size if (FReceivedData.Size < 2) then Exit; // Initialize Amount := 0; StartPos := -1; StartPt := nil; // Data pointers Data := FReceivedData.Memory; DataNext := Data; Inc(DataNext); try // Parsing loop for i := 0 to FReceivedData.Size - 2 do begin // Check if we have found the start code if (StartPos = -1) and (Data^ = $FF) and (DataNext^ = $D8) then begin StartPos := i; StartPt := Data; end // Check if we have found the JPEG end code else if (StartPos >= 0) and (Data^ = $FF) and (DataNext^ = $D9) then begin // End position EndPos := i; // Copy data (Higher performance than passing whole stream to load, // because FBitmap.LoadFromStream will create a memory stream and copy // everything if Position <> 0 FReceivedData.Position := StartPos; FParsedData.SetSize((EndPos + 2) - StartPos); FParsedData.Position := 0; FParsedData.CopyFrom(FReceivedData, (EndPos + 2) - StartPos); // CopyMemory(FParsedData.Memory, StartPt, (EndPos + 2) - StartPos); // Load bitmap on screen Image1.Bitmap.LoadFromStream(FParsedData); FParsedData.Clear; Application.ProcessMessages; // Amount of data to delete Amount := EndPos + 2; // Reset StartPos := -1; StartPt := nil; end; // Next pointer Inc(Data); Inc(DataNext); end; // Delete the amount of parsed data // FReceivedData.Delete(Amount); DeleteStream(FReceivedData, Amount); FReceivedData.Position := FReceivedData.Size; Application.ProcessMessages; except FReceivedData.Clear; end; end; Так все работает, но сильно грузит основной поток, так что даже программу нельзя закрыть. Подумал, что может вынести процедуру ParseJPEGData в поток. Но что-то не срабатывает. Вот код, прокомментируйте пожалуйста procedure TForm1.ParseJPEGDataThread; begin TTask.Run( procedure var aStream, newStream: TMemoryStream; i: Integer; StartPos, EndPos: Integer; StartPt: Pointer; Data, DataNext: PByte; Amount: Integer; begin aStream := TMemoryStream.Create; newStream := TMemoryStream.Create; TThread.Synchronize(TThread.CurrentThread, procedure begin aStream.CopyFrom(FReceivedData, FReceivedData.Size); end); try if (aStream.Size < 2) then Exit; // Initialize Amount := 0; StartPos := -1; StartPt := nil; // Data pointers Data := aStream.Memory; DataNext := Data; Inc(DataNext); try // Parsing loop for i := 0 to aStream.Size - 2 do begin // Check if we have found the start code if (StartPos = -1) and (Data^ = $FF) and (DataNext^ = $D8) then begin StartPos := i; StartPt := Data; end // Check if we have found the JPEG end code else if (StartPos >= 0) and (Data^ = $FF) and (DataNext^ = $D9) then begin // End position EndPos := i; // Copy data (Higher performance than passing whole stream to load, // because FBitmap.LoadFromStream will create a memory stream and copy // everything if Position <> 0 aStream.Position := StartPos; newStream.SetSize((EndPos + 2) - StartPos); newStream.Position := 0; newStream.CopyFrom(aStream, (EndPos + 2) - StartPos); TThread.Synchronize(TThread.CurrentThread, procedure begin Image1.Bitmap.LoadFromStream(newStream); end); // Load bitmap on screen newStream.Clear; Application.ProcessMessages; // Amount of data to delete Amount := EndPos + 2; // Reset StartPos := -1; StartPt := nil; end; // Next pointer Inc(Data); Inc(DataNext); end; // Delete the amount of parsed data // FReceivedData.Delete(Amount); TThread.Synchronize(TThread.CurrentThread, procedure begin DeleteStream(FReceivedData, Amount); FReceivedData.Position := FReceivedData.Size; end); except TThread.Synchronize(TThread.CurrentThread, procedure begin FReceivedData.Clear; end); end; finally FreeAndNil(aStream); FreeAndNil(newStream); end; end) end;
  5. gonzales

    Пуши в IOS

    Еще доп. накину на вентилятор, вдруг кому пригодится. Чтобы в iOS появилась наклейка с цифрой на иконке программы нужно добавить в JSON запроса пуша в объект notification пару badge=цифра
  6. gonzales

    Не отображается Splash форма на iOS

    На всякий случай кидаю ответ. Все остальное в iOS не работает вот статейка вообще конечно костыль, но по другому добиться нормального splashScreen в iOS у меня не получилось
  7. gonzales

    Пуши в IOS

    Вопрос решился. Есть одно дополнение в код ZyBy Если необходимо обработать сообщение внутри программы правильный код будет такой // это событие срабатывает при открытом приложении {$IFDEF ANDROID} // устраняем ошибку с чтением текста уведомления, // если уведомление отправлено из консоли firebase // и не заполнены дополнительные поля (message, title) aObj := ANotification.DataObject.GetValue(GCMSignature); if aObj <> nil then aText := aObj.value else aText := ANotification.DataObject.GetValue(FCMSignature).value; {$ENDIF} {$IFDEF IOS } aObj := ANotification.DataObject.GetValue(APNsSignature); if aObj <> nil then aText := (aObj as TJSONObject).GetValue('body').Value; {$ENDIF}
  8. gonzales

    Пуши в IOS

    Вот процедура конвертации токена APN в FCM uses // RTL System.Net.HttpClient, System.Net.URLClient, System.NetConsts, System.Threading, // REST REST.Types; const cSandboxValues: array[Boolean] of string = ('false', 'true'); cHTTPResultOK = 200; cFCMIIDBatchImportURL = 'https://iid.googleapis.com/iid/v1:batchImport'; cFCMAuthorizationHeader = 'Authorization'; cFCMAuthorizationHeaderValuePair = 'key=%s'; cResultsValueName = 'results'; cStatusValueName = 'status'; cRegistrationTokenValueName = 'registration_token'; cStatusValueOK = 'OK'; cFCMResultError = 'FCM Result Error: %s'; cFCMJSONError = 'FCM Unexpected JSON: %s'; cHTTPError = 'HTTP Error: %s. Response: %s'; cFCMRequestJSONTemplate = '{ "application": "%s", "sandbox": %s, "apns_tokens": [ "%s" ] }'; AAppBundleID = 'xxxxxxxxx'; AServerKey = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; procedure TForm1.Button2Click(Sender: TObject); var ARequest: string; LStream: TStream; LHTTP: THTTPClient; LResponse: IHTTPResponse; begin ARequest:=Format(cFCMRequestJSONTemplate, [AAppBundleID, cSandboxValues[true], Edit1.Text]); LStream := TStringStream.Create(ARequest); LHTTP := THTTPClient.Create; try LHTTP.CustomHeaders[cFCMAuthorizationHeader] := Format(cFCMAuthorizationHeaderValuePair, [AServerKey]); LHTTP.ContentType := CONTENTTYPE_APPLICATION_JSON; LResponse := LHTTP.Post(cFCMIIDBatchImportURL, LStream); if LResponse.StatusCode = cHTTPResultOK then Memo2.Lines.Add(LResponse.ContentAsString); finally LHTTP.Free; end; LStream.Free; end;
  9. gonzales

    Пуши в IOS

    Прошу помощи!!!!! Проблема схожая, поэтому напишу в эту ветку. Не приходят пуши на iOS. С Андроид все в порядке. Пересмотрел все статьи и форум тысячу раз, не могу понять, в чем проблема. Чтобы сразу многие вопросы отсечь, отвечу 1. Приложение в стадии development (release), Delphi 10.1 up2 + xCode 8.2 2. Все сертификаты есть, все установлено и экспортировано в FireBase. Даже заново сделан provising profile с учетом внедрения push notification. 3. Регистрация PushServiceRegister проходит успешно, система отдает FDeviceToken 4. при старте приложения выскакивает окно с разрешением на уведомления, конечно соглашаемся. 5. Для конвертации токена была написана процедура, вот ее возврат {"results":[{"registration_token":"fB5GK_gykQ8:APA91bFtfKYsNbHIlsLEdx0P8BCCddVj2EC0yqFDNPS9sDvo1AHJC4Kc_ydWNZlNeuRUPSDKCjDRlYAAbUEJ3gvOiuBnsv28IgIbHRmfSFjQYq0Cg6wyma4WZrDs6pEMCRIrFuLYWJly","apns_token":"c20590d04800eb051dca60275861ec74a4a93674b4b8e348135a4ad3a04a7bb0","status":"OK"}]} как видно токен валиден, правда я проверял, что если изменить цифры в apns_token то результат все равно положительный 6. Из консоли FireBase пытаюсь отослать пуш по известному токену, система ошибок не выдает, но пуш не приходит(((( 7. Использованный SDK 10.2, на устройстве версия ios - 9.3.5 Если можно, прошу кого-нибудь сконвертировать на php-сервере вот такой apn токен (c20590d04800eb051dca60275861ec74a4a93674b4b8e348135a4ad3a04a7bb0) и сравнить с тем, что я получаю из процедуры (fB5GK_gykQ8:APA91bFtfKYsNbHIlsLEdx0P8BCCddVj2EC0yqFDNPS9sDvo1AHJC4Kc_ydWNZlNeuRUPSDKCjDRlYAAbUEJ3gvOiuBnsv28IgIbHRmfSFjQYq0Cg6wyma4WZrDs6pEMCRIrFuLYWJly) В параметрах конвертации Sandbox = true (приложение не выложено в AppStore). Ноя пробывал и так и так, результат один. Прошу помощи, уже 3 дня бьюсь!!!
  10. gonzales

    TPushClient - нашёл чудесную вещь

    Приведенный здесь код тоже оказался рабочий при посылке пуша по токену. Пуш приходит. Но встает вопрос, как обработать его при открытии приложения?
  11. gonzales

    TPushClient - нашёл чудесную вещь

    Что все завершено, см скрин Нет, пока только тест. Сейчас сделал все по примеру Равиля http://blog.rzaripov.kz/2017/02/firebase-android-ios-2.html В нем работает ПУШ при таргетировании на устройство, обычный так и не приходит
  12. gonzales

    TPushClient - нашёл чудесную вещь

    У меня закрадываются сомнения, что я чего-то не понимаю в отправке пушей. Нужен ли еще дополнительно сервер для отправки пушей, как написано в этой статье Хотя судя по этой статье для тестирования пушей ничего кроме FireBase не надо Евгений, поясните пожалуйста строку GetHTTP(CommandRegisterFCM); В демо примере такого нет.
  13. gonzales

    TPushClient - нашёл чудесную вещь

    Еще раз хочу уточнить технику секса 1. Регистрирую приложение для Андроид в FireBase 2. В настройках проекта на вкладке Cloud Messaging копирую Идентификатор отправителя 3. Открываю Demo проект, кстати вопрос, DW.PushClient.pas и DW.RegisterFCM.pas лежат не в папке с Демо, тем не менее все компилится, как-то странно. Эти файлы никуда не нужно положить? 4. Вношу изменения constructor TForm1.Create(AOwner: TComponent); begin inherited; FPushClient := TPushClient.Create; FPushClient.GCMAppID :='280557678639'; //cFCMSenderID; FPushClient.ServerKey :=''; //cFCMServerKey; FPushClient.BundleID :=''; //cFCMBundleID; FPushClient.UseSandbox := True; // Change this to False for production use! FPushClient.OnChange := PushClientChangeHandler; FPushClient.OnReceiveNotification := PushClientReceiveNotificationHandler; FPushClient.Active := True; end; 5. Запускаю на телефоне. Компилится без ошибок. После старта наблюдаю значения DeviceID и DeviceToken 6. В FireBase на вкладке Notifications создаю новое сообщение, в котором указываю Цель - сегмент пользователей, выбираю свое приложение, жму "Отправить сообщение" По идее все. Может чего упустил? Может ли кто-нибудь повторить такой подход, был бы крайне благодарен?
  14. gonzales

    TPushClient - нашёл чудесную вещь

    попробую подождать, но что-то мне подсказывает, что проблема не в этом.
  15. gonzales

    TPushClient - нашёл чудесную вещь

    И работает демо из коробки, ничего изменять не надо? Только вбить FPushClient.GCMAppID? Я правильно понимаю, что при отправке Notification из консоли Firebase я должен сразу получить уведомление?