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

Kitty

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

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

  • Посещение

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

    16

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

  1. Вроде все сделал как надо. Тестирую на стенде где было собрано давно нормальное приложение. Теперь добавляю приложение с пушами... и не работает...

    Теперь или баг С++ Builder или моя тупость при работе с ios...

    123.jpg

  2. Цитата

    Китти, сори за off top, но, мне кажется, ты бы обошлась меньшей кровью, если бы уже перешла на дельфи))).

    А зачем? Все работает и на С++. Был баг. Его решили. Равиль помог определить и суппорт быстро решил. А что в делфи багов нет? Из-за бага менять язык? Нет.

  3. И снова наш любимый ios для домохозяек...:)
    Нормально запустить дебаг не получается так как все время: Session ended
    Однако с помощью лейбл имеем такое:

    FDeviceToken = FPushService->DeviceTokenValue[TPushService_TDeviceTokenNames_DeviceToken];
    //добавлено для теста
    Label1->Text = L"Что тут? " + FDeviceToken;
    и видим что FDeviceToken пустой.

    Куда копать? Спасибо.

     

     

     

  4. В общем все нормально и заголовок и перенос текста работает. Видимо один раз был сбой, но это совсем не проблема.

    Спасибо за статью! Все работает и пуши живут теперь и в билдере. :D

    P.S.

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

    А так все работает. Только отменила ShowMessage(aText) на посылку Notification, а то два подряд ShowMessage не очень. :)

  5. 2 минуты назад, Равиль Зарипов (ZuBy) сказал:

    а что конкретно сделала? подключила fmx.jar?

     

    можно, если заголовка нет, там будет отображаться название приложения

    А как правильно сформировать ссылку?

    {"status":"ERROR","text":"Параметр `title` не передан"}

  6. Что-то не получается перенос строк в пуш уведомлении. Сделала как в последнем посте темы:

    перенос строк

    А строки в этом проекте не переносятся.

    А еще вопрос, можно послать пуш без заголовка?

    Спасибо.

  7. Если при открытом приложение срабатывает два раза OnReceiveNotificationEvent, может заменить ShowMessage тоже на сообщение в шторку? Вторая сработка чистит первую и со стороны вроде работает для пользователя:

    void __fastcall TForm1::OnReceiveNotificationEvent(TObject *Sender,
    	TPushServiceNotification* const ANotification)
    {
    
     ClearAllNotification();
    
     const String FCMSignature = L"gcm.notification.body";
     const String GCMSignature = L"message";
     const String APNsSignature = L"alert";
     String aText = "";
     TJSONValue * aObj;
    
    	#if defined(__ANDROID__)
    		aObj = ANotification->DataObject->GetValue(GCMSignature);
    		if(aObj != NULL)
    		   {
    			aText = aObj->Value();
    		   }
    		   else
    			  {
    			   aText = ANotification->DataObject->GetValue(FCMSignature)->Value();
                  }
    	#endif
    
    	#if defined(__APPLE__) && (defined(__arm__) || defined(__arm64__))
    	  aObj = ANotification->DataObject->GetValue(APNsSignature);
    	  if (aObj != NULL)
    	   {
    		aText = aObj->Value();
    	   }
         #endif
    
     //ShowMessage(aText);
    
     //шлем Notification
     if (NotificationCenter1->Supported() && aText != "")
      {
       TNotification * myNotification = NotificationCenter1->CreateNotification();
    
    	__try
    	{
         NotificationCenter1->CancelAll();
    	 myNotification->AlertBody = aText;
    	 NotificationCenter1->PresentNotification(myNotification);
    	}
    	__finally
    			{
    			 myNotification->DisposeOf();
    			}
      }
    
    }

     

  8. Проект нормально компилировался в режиме дебаг. При переходе в режим релиз возникла ошибка на картинке. Затем сдела Build All и снова попробовала запустить - ошибка пропала. С чем это может быть связано, на что обратить внимание?

     

     

    java.jpg

  9. Подскажите, пожалуйста, в чем может быть дело? В базе вижу одну запись.

    Отправила пуш в строке браузера ({"status":"OK"}) и код ниже почему-то отработал два раза и я получила два одинаковых друг за другом ShowMessage? :o

    void __fastcall TForm1::OnReceiveNotificationEvent(TObject *Sender,
    	TPushServiceNotification* const ANotification)
    {
    
     const String FCMSignature = L"gcm.notification.body";
     const String GCMSignature = L"message";
     const String APNsSignature = L"alert";
     String aText = "";
     TJSONValue * aObj;
    
    	#if defined(__ANDROID__)
    		aObj = ANotification->DataObject->GetValue(GCMSignature);
    		if(aObj != NULL)
    		   {
    			aText = aObj->Value();
    		   }
    		   else
    			  {
    			   aText = ANotification->DataObject->GetValue(FCMSignature)->Value();
                  }
    	#endif
    
    	#if defined(__APPLE__) && (defined(__arm__) || defined(__arm64__))
    	  aObj = ANotification->DataObject->GetValue(APNsSignature);
    	  if (aObj != NULL)
    	   {
    		aText = aObj->Value();
    	   }
         #endif
    
     ShowMessage(aText);
    
    }

    А если приложение выгрузить и послать пуш, то в шторке одно уведомление как и положено...

  10. Цитата

    Вот как раз об unique_ptr тоже вопрос, как умные указатели ведут себя на мобильных платформах?

    Нормально ведет.
    Начиная с 8:17 до 12:00 минуты видео:
    *На слайде сказано: используйте unigue_ptr везде где возможно - Use unigue_ptr where possible.
    *Не используйте new/delete

    https://youtu.be/14w26ACHrII

  11. Ошибку можно поймать если из консоли послать пуш с не заполненными messsge title, а когда пуш прийдет тапнуть по нему. Эти действия не правильные, поля надо заполнять, просто доп. проверка в коде могла бы наверное пригодиться...

  12. void __fastcall TForm1::OnReceiveNotificationEvent(TObject *Sender,
    	TPushServiceNotification* const ANotification) {
    
    	String MessageText = "";
    	// Получаем текст сообщения в зависимости от платформы
    	#if defined(__ANDROID__)
    		MessageText = ANotification->DataObject->GetValue("message")->Value();
    	#endif
    	#if defined(__APPLE__) && (defined(__arm__) || defined(__arm64__))
    		MessageText = ANotification->DataObject->GetValue("alert")->Value();
    	#endif
    	if (MessageText != "")
    		ShowNotification(MessageText, 0);
    
    }

    Все чтобы я не делала на срроке

    MessageText = ANotification->DataObject->GetValue("message")->Value();

    получаю Error: segmentation fault 11

  13. Цитата

    а написать самой уже никак?

    Спасибо получилось.

    Для таких не умных как я, которые не понимают, что в консоли FCM надо писать самой:

    1. Откройте дополнительные параметры в консоли FCM .

    2. В первом поле КЛЮЧ принудительно самостоятельно напечатайте "mеssage" без ошибок в первом поле. В поле напротив напишите текст сообщения.

    3. При этом появиться дополнительные поля ввода ниже.

    4. В первом новом поле ниже напишите принудительно title без ошибок и напротив в значении ваш текст...

     

     

  14. void __fastcall TForm1::OnReceiveNotificationEvent(TObject *Sender,
    	TPushServiceNotification* const ANotification) {
    
        String JsonMemberName;
    	String JsonMemberValue;
        std::unique_ptr<TJSONValue> LJSONValue(TJSONObject::ParseJSONValue(ANotification->Json->ToString()));
    	TJSONObject *LJSONObject = dynamic_cast<TJSONObject*>(LJSONValue.get());
    	if(LJSONObject != NULL)
    	 {
    	  TJSONPair * JSONPair;
    	  for (int i = 0; i < LJSONObject->Count; i++)
    		{
             JSONPair = LJSONObject->Pairs[i];
    		 if(JSONPair != NULL)
    			{
    			 JsonMemberName = JSONPair->JsonString->Value();
    			 JsonMemberValue = JSONPair->JsonValue->ToString();
    			 if(JsonMemberName == L"gcm.notification.body")
    				 {
    				  ShowMessage(JsonMemberValue);
    				 }
    
                }
    		}
    	 }
    
     if(JsonMemberValue != "" )
      {
    	ShowNotification(JsonMemberValue, 0);
      }
          
     }     
    procedure ShowNotification(MessageText : string; BadgeNumber : integer);
    var
      NotificationC: TNotificationCenter;
      Notification: TNotification;
    begin
    
      // Создаём центр уведомлений и уведомление для отправки
      NotificationC := TNotificationCenter.Create(nil);
      Notification := NotificationC.CreateNotification;
    
      try
        // Если центр уведомлений поддерживается системой
        if NotificationC.Supported then
        begin
          // Устанавливаем текст сообщения
          Notification.AlertBody := MessageText;
          // Включаем звук при выводе сообщение
          Notification.EnableSound := true;
          // Устанавливаем цифру на иконке приложения
          Notification.Number := BadgeNumber;
          NotificationC.ApplicationIconBadgeNumber := BadgeNumber;
          // Выводим сообщение из приложения
          NotificationC.PresentNotification(Notification);
        end;
      finally
        // Очищаем переменные
        Notification.DisposeOf;
        NotificationC.Free;
        NotificationC.DisposeOf;
      end;
    end;
    
    end.

     

    В ShowMessage вижу нормальное сообщение, а  шторке вижу название пакета, а не само сообщение.. :(

  15. Я не понимаю где надо дублировать заголовок и сообщение в пользовательских данных, поэтому и прошу помочь в этом в этом вопросе. Где в консоли 

    • message - мое сообщение
    • title - мой заголовок

    Где это???

    Своим путем, чтобы добраться до сообщения из FCM сделала такой код. Работает, но это не то, чтобы хотелось:

    
    void __fastcall TForm1::OnReceiveNotificationEvent(TObject *Sender,
    	TPushServiceNotification* const ANotification) {
    
        String JsonMemberName;
    	String JsonMemberValue;
        std::unique_ptr<TJSONValue> LJSONValue(TJSONObject::ParseJSONValue(ANotification->Json->ToString()));
    	TJSONObject *LJSONObject = dynamic_cast<TJSONObject*>(LJSONValue.get());
    	if(LJSONObject != NULL)
    	 {
    	  TJSONPair * JSONPair;
    	  for (int i = 0; i < LJSONObject->Count; i++)
    		{
             JSONPair = LJSONObject->Pairs[i];
    		 if(JSONPair != NULL)
    			{
    			 JsonMemberName = JSONPair->JsonString->Value();
    			 JsonMemberValue = JSONPair->JsonValue->ToString();
    			 if(JsonMemberName == L"gcm.notification.body")
    				 {
    				  ShowMessage(JsonMemberValue);
    				 }
    
                }
    		}
    	 }
    }

     

     

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