Wykonał wszystkie życzenia z zadania technicznego, a dodatkowo zrealizował to, o co prosiłem.
Wszystkim polecam freelancera!
Jest aplikacja na Androida, w której zrealizowane są powiadomienia push, ale nie działają tak, jakbym chciał. Jeśli aplikacja jest otwarta, powiadomienia pojawiają się na górze i są widoczne. Ale jeśli aplikacja jest zminimalizowana lub nie uruchomiona, powiadomienia przychodzą, ale bez dźwięku i można się dowiedzieć, że powiadomienie przyszło, tylko otwierając panel powiadomień i znajdując je.
Tak mam zrealizowane powiadomienia w pliku MessagingService.kt
package app.provapp.online
import android.Manifest
import android.annotation.SuppressLint
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.media.RingtoneManager
import android.os.Build
import android.util.Log
import android.widget.RemoteViews
import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
const val channelId = "main_channel"
SuppressLint("MissingFirebaseInstanceTokenRefresh") # Usunąłem znak @, ponieważ freelancer nie publikuje projektu, myśląc, że to e-mail :)
class MessagingService: FirebaseMessagingService() {
override fun onMessageReceived(message: RemoteMessage) {
message.notification!!.title?.let { message.notification!!.body?.let { it1 ->
createNotificationChannel(it, it1
) } }
Log.d("SDDS", "DSADAS")
}
private fun createNotificationChannel(title: String, body: String) {
val notificationChannel = NotificationChannel(channelId,
"Message Channel",
NotificationManager.IMPORTANCE_HIGH)
notificationChannel.canBypassDnd()
notificationChannel.setBypassDnd(true)
notificationChannel.enableVibration(true)
val notificationManager = NotificationManagerCompat.from(this)
notificationManager.createNotificationChannel(notificationChannel)
val notification: Notification = NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(body)
.setChannelId(channelId)
.setDefaults(Notification.DEFAULT_ALL)
.setCategory(NotificationCompat.CATEGORY_CALL)
.setAutoCancel(true)
.setOnlyAlertOnce(true)
.setPriority(NotificationCompat.PRIORITY_HIGH) // heads-up
.setFullScreenIntent(null, true)
.build()
if (ActivityCompat.checkSelfPermission(
this,
Manifest.permission.POST_NOTIFICATIONS
) != PackageManager.PERMISSION_GRANTED
) {
return
}
notificationManager.notify(0, notification)
}
}Ta sama aplikacja ma wersję na iPhone'a i tam powiadomienia działają jak należy - zawsze pojawiają się na górze, nawet jeśli aplikacja nie jest uruchomiona, dzięki czemu użytkownik widzi, że powiadomienie przyszło.
Budżet: 500 UAH Termin: 1 dzień
Zajmijmy się tym, w czym tkwi problem.
Mam doświadczenie z pushami.
Proszę o kontakt.
Budżet: 500 UAH Termin: 1 dzień
Cześć!
Jestem gotowy podjąć się realizacji tego zadania. Mam około trzech lat doświadczenia w tworzeniu aplikacji na Androida, w tym już pracowałem z podobnymi funkcjami. Mogę szybko i jakościowo zrealizować potrzebną funkcjonalność.
Jestem gotowy omówić wszystkie szczegóły w wiadomościach prywatnych. Mogę rozpocząć pracę dzisiaj.
Będę zadowolony ze współpracy!
1. Сповіщення обробляється у фоновому режимі Firebase SDK, але ви не встановлюєте правильний контекст для звукового сигналу.
2. Пріоритет повідомлення може бути недостатнім (хоча у вас стоїть PRIORITY_HIGH).
3. FullScreenIntent може бути некоректно реалізований або не потрібний.
Ось кілька способів вирішити проблему:
1. Налаштуйте звуковий сигнал
У вашому методі createNotificationChannel можна додати кастомний звук для каналу:
val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
notificationChannel.setSound(soundUri, Notification.AUDIO_ATTRIBUTES_DEFAULT)
2. Оновіть FullScreenIntent
Замість null використовуйте PendingIntent для відкриття Activity, якщо це потрібно:
val intent = Intent(this, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
val pendingIntent = PendingIntent.getActivity(
this, 0, intent, PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)
val notification: Notification = NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(body)
.setChannelId(channelId)
.setDefaults(Notification.DEFAULT_ALL)
.setCategory(NotificationCompat.CATEGORY_MESSAGE)
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setFullScreenIntent(pendingIntent, true) // Важливо!
.build()Це змушує Android відображати сповіщення навіть тоді, коли додаток не запущений.
3. Переконайтеся, що IMPORTANCE_HIGH
Канал сповіщень має мати максимальний рівень важливості, як ви вказали:
notificationChannel.importance = NotificationManager.IMPORTANCE_HIGH
4. Перевірте дозволи на сповіщення
Переконайтеся, що у вас є дозвіл POST_NOTIFICATIONS, який потрібен з Android 13. Для пристроїв нижче Android 13 це не потрібно:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
if (ActivityCompat.checkSelfPermission(
this,
Manifest.permission.POST_NOTIFICATIONS
) != PackageManager.PERMISSION_GRANTED
) {
// Запросіть дозвіл
return
}
}
5. Обробка сповіщень у фоновому режимі
В Android, коли додаток у фоновому режимі, Firebase передає сповіщення напряму у системний менеджер сповіщень. У такому разі вам потрібно обробляти дані через RemoteMessage.data, якщо використовуються data-сповіщення:
override fun onMessageReceived(message: RemoteMessage) {
if (message.data.isNotEmpty()) {
val title = message.data["title"] ?: "Default Title"
val body = message.data["body"] ?: "Default Body"
createNotificationChannel(title, body)
} else {
message.notification?.let {
createNotificationChannel(it.title ?: "Default Title", it.body ?: "Default Body")
}
}
}
6. Перевірте серверну конфігурацію
Якщо ви використовуєте Firebase Console для надсилання сповіщень, переконайтеся, що обираєте опцію “High Priority”. Якщо це ваш сервер, у JSON-даних встановіть priority: "high":
{
"to": "DEVICE_TOKEN",
"priority": "high",
"notification": {
"title": "Заголовок",
"body": "Текст повідомлення"
}
}
Після внесення цих змін перевірте додаток. Це має вирішити проблему із фоновими сповіщеннями
При спробі додати
"priority" => "high",отримую помилку
{ "error": { "code": 400, "message": "Invalid JSON payload received. Unknown name \"priority\" at 'message': Cannot find field.", "status": "INVALID_ARGUMENT", "details": [ { "@type": "type.googleapis.com/google.rpc.BadRequest", "fieldViolations": [ { "field": "message", "description": "Invalid JSON payload received. Unknown name \"priority\" at 'message': Cannot find field." } ] } ] } }
Ось правильний формат для запиту до FCM API: {
"message": {
"token": "DEVICE_TOKEN",
"notification": {
"title": "Заголовок",
"body": "Текст повідомлення"
},
"android": {
"priority": "high"
}
}
}
Зараз все по старому: в шторці сповіщення з'являється, але heads-up не відбувається, тобто користувач може дізнатися що було сповіщення лише подивившись в шторці.
У вас буде час подивитися вихідний код андроїду? Може там щось не доналаштовано? Хоча я дивився всі ті параметри що ви наводили в мене прописані: і NotificationCompat.PRIORITY_HIGH і NotificationManager.IMPORTANCE_HIGH
1. Неправильний NotificationChannel
У вашому коді є правильне створення каналу сповіщень, але перевірте, чи дійсно канал налаштований правильно. Зокрема:
• Перевірте, чи використовується IMPORTANCE_HIGH, який дозволяє сповіщенням з’являтися у вигляді heads-up (спливаючих) повідомлень.
• Для пробудження екрана потрібно також забезпечити, щоб канал мав дозвіл на порушення режиму “Не турбувати”. Ви вже викликаєте setBypassDnd(true), але цього недостатньо — на деяких пристроях це потребує явного дозволу від користувача.
Рішення: Додайте код для перевірки та явного дозволу для обходу режиму DND:
if (!notificationManager.areNotificationsEnabled()) {
// Направляємо користувача до налаштувань
val intent = Intent(android.provider.Settings.ACTION_APP_NOTIFICATION_SETTINGS)
.putExtra(android.provider.Settings.EXTRA_APP_PACKAGE, packageName)
startActivity(intent)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = notificationManager.getNotificationChannel(channelId)
if (channel != null && !channel.canBypassDnd()) {
val intent = Intent(android.provider.Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS)
.putExtra(android.provider.Settings.EXTRA_APP_PACKAGE, packageName)
.putExtra(android.provider.Settings.EXTRA_CHANNEL_ID, channelId)
startActivity(intent)
}
}
2. setFullScreenIntent
Ваш setFullScreenIntent налаштований на null, що може не спрацьовувати для heads-up повідомлень або пробудження екрану.
Рішення: Використовуйте реальний PendingIntent:
val fullScreenIntent = Intent(this, MainActivity::class.java)
val fullScreenPendingIntent = PendingIntent.getActivity(
this, 0, fullScreenIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
val notification: Notification = NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(body)
.setChannelId(channelId)
.setDefaults(Notification.DEFAULT_ALL)
.setCategory(NotificationCompat.CATEGORY_CALL)
.setAutoCancel(true)
.setOnlyAlertOnce(true)
.setPriority(NotificationCompat.PRIORITY_HIGH) // heads-up
.setFullScreenIntent(fullScreenPendingIntent, true) // Важливо
.build()3. Специфіка пристрою
Деякі пристрої, такі як Xiaomi, Huawei, Oppo, мають власні обмеження на показ сповіщень:
• Фонова активність: Переконайтесь, що ваш додаток має дозвіл на запуск у фоновому режимі.
• Автоматична оптимізація батареї: Відключіть оптимізацію батареї для вашого додатку через налаштування пристрою.
Код для вимкнення оптимізації батареї:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val intent = Intent(android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
intent.data = Uri.parse("package:$packageName")
startActivity(intent)
}4. Налаштування екрану
Перевірте, чи дозволяє пристрій пробуджувати екран від сповіщень. Додайте це до коду:
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
if (!powerManager.isInteractive) {
val wakeLock = powerManager.newWakeLock(
PowerManager.FULL_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP,
"app:WakeLock"
)
wakeLock.acquire(3000) // Пробудження на 3 секунди
}5. Додаткова перевірка дозволів
На Android 13 і вище потрібні дозволи для відображення heads-up сповіщень.
Переконайтесь, що дозволи POST_NOTIFICATIONS та USE_FULL_SCREEN_INTENT видані:
ActivityCompat.requestPermissions(this, arrayOf(
Manifest.permission.POST_NOTIFICATIONS
), 100)
android:exported
Ви встановили android:exported="false". Це означає, що цей сервіс може бути викликаний тільки вашим додатком, а не іншими програмами або системою.
Для Firebase Cloud Messaging (FCM) сервіс має бути доступним системі Firebase, тому android:exported має бути встановлено у true.
Ви отримуєте сповіщення, коли додаток не запущений? Чи тільки тоді, коли він запущений?
Є рішення для обох випадків…
Сповіщення приходять, але непомітно, тобто вони в шторці з'являються без видимого "вилітання" вгорі екрану (heads-up)
Здравствуйте, вы хотите, чтобы экран пробуждался, когда приходит уведомления?
Дорого, давайте за 500 грн як в задачі ))
Пуши в мене працюють, треба тільки щоб вони вспливали коли додаток згорнутий.
Напевно десь якийсь параметр треба написати і все. Тим паче якщо ви вже це робили то у вас це не займе багато часу.
Jesteśmy marką wellness DTC, sprzedajemy suplementy diety na rynek USA w modelu subskrypcyjnym, a aplikacja jest asystentem, który lepiej poznaje klienta, zbiera jego dane do dalszego wysyłania powiadomień, które przypominają o przyjmowaniu suplementów (AM/PM), zaznacza przyjęcia w kalendarzu, pokazuje postęp. Aplikacja jest z gamifikacją, z osiągnięciami, spersonalizowanymi powiadomieniami push z komplementami na każdy dzień i przyjemnymi przewidywaniami (jak w ciasteczkach). Backend / dane — Firebase 1. OnboardingUżytkownik otwiera aplikację — pierwszy ekran z logo SHE·8, zdjęciem dziewczyny i tekstem „Twoje codzienne resetowanie zaczyna się od Ciebie.” Na dole przycisk „ROZPOCZNIJ”, pod nim link „Masz już konto? Zaloguj się”.2. RejestracjaPo naciśnięciu „Rozpocznij” zaczyna się ankieta z 5 krokami (Krok 1 z 5). Pierwsze pytanie: „Jaki jest Twój główny cel?” — opcje: Lepszy sen, Mniej stresu, Więcej energii (wybrane), Lepsza koncentracja. Przycisk „DALEJ” prowadzi dalej przez kroki.3. Ustawienia przypomnieńPo ankiecie użytkownik ustawia czas dwóch przypomnień — porannego (08:00) i wieczornego (20:00), z wyjaśnieniem, że aplikacja przypomni o przyjmowaniu kapsułek. Przycisk „ZAPISZ”.4. Poranny ResetEkran powitania: „Dzień dobry, Sarah ☀️”, „Dzień 8 Twojego Resetu”, ilustracja kapsułek ze szklanką wody, instrukcja przyjęcia porannych kapsułek. Przycisk „ZROBIŁEM TO ✓” — użytkownik zaznacza wykonanie.5. Późne zameldowanie / Wieczorny ResetCiemny ekran z księżycem — „Wieczorny Reset”, tekst „Czas się zrelaksować i zadbać o siebie”. Przycisk „ZROBIŁEM TO ✓”.6. Przypomnienie, jeśli pominięto wieczorne przyjęcieJeśli użytkownik zapomniał zaznaczyć, wyświetla się ekran „Hej, Sarah! ” z ikoną zmęczonej buźki, tekstem „Nie zaznaczyłeś jeszcze wieczornego przyjęcia” oraz dwoma przyciskami: „Tak, zrób to teraz” (główny) i „Później” (drugorzędny).7. Główna tablicaPo onboardingu lub logowaniu użytkownik trafia na główny ekran: „Cześć, Sarah! ”, motywująca fraza, blok „Aktualna seria — 8 dni ” oraz okrągły wskaźnik „Postęp — 80%”. Na dole dolna nawigacja: Strona główna, Postęp, Kalendarz, Ja.8. PostępZakładka „Mój postęp”: aktualna seria (8 dni), „Dni ukończone 8/10” z paskiem postępu, tygodniowy tracker (Pn–Nd z zaznaczeniami wykonano/pominięto), ogólny „Ogólny postęp — 80%”.9. KalendarzZakładka „Kalendarz”: widok miesięczny (czerwiec 2025), dni zaznaczone kolorem — wykonano (zielony), dzisiaj (niebieski), pominięto (czerwony). Użytkownik może kliknąć na konkretny dzień.10. Szczegóły dniaPo wybraniu dnia (8 czerwca 2025) otwiera się szczegółowy ekran: status porannego (08:15 ✓ Ukończone) i wieczornego (20:05 ✓ Ukończone) przyjęć, plus pole „Codzienna notatka” z osobistą notatką użytkownika.11. Twoje wynikiEkran „Twoje wyniki” — porównanie wskaźników „Przed” i „Po” (Energia, Sen, Stres) w postaci pasków postępu, które wizualnie pokazują poprawę. Przycisk „ZOBACZ MOJĄ DROGĘ”.12. MotywacjaEkran „Codzienna motywacja” z tłem zdjęcia i inspirującym cytatem: „Małe codzienne działania tworzą wielkie zmiany.”13. OsiągnięciaZakładka „Osiągnięcia”: lista zdobytych nagród (Pierwszy krok, 7 dni serii, 10 dni serii) oraz następny cel („Następne osiągnięcie — 30 dni serii”, postęp 8/30).14. ProfilZakładka „Profil”: awatar i imię użytkownika (Sarah), lista ustawień — Informacje osobiste, Przypomnienia, Powiadomienia, Subskrypcja, Pomoc i wsparcie, oraz przycisk „Wyloguj się”.
Przejdziemy przez każdy punkt. Specyfikacja techniczna dla rozwoju aplikacji mobilnej dla usługi dostawy sushi Potrzebna jest aplikacja mobilna (Android i iOS) o funkcjonalności jak najbardziej zbliżonej do strony 911sushi.com.Podstawowe wymaganiaIntegracja Pełna integracja z Poster POS. Wszystkie zamówienia powinny automatycznie trafiać bezpośrednio do Poster. Wykorzystanie istniejącej bazy klientów Poster. Automatyczne stosowanie osobistych rabatów gościa, które są już skonfigurowane w Poster.Autoryzacja użytkowników Rejestracja i autoryzacja. Logowanie za pomocą numeru telefonu (lub inny nowoczesny sposób autoryzacji). Zachowanie historii zamówień. Osobiste rabaty i promocje dla użytkownika.Menu Przegląd kategorii i produktów. Szczegółowe informacje o pozycjach. Możliwość dodawania produktów do koszyka. Wybór modyfikatorów i dodatków (w razie potrzeby).Koszyk i składanie zamówienia Wybór adresu dostawy. Zachowanie kilku adresów użytkownika. Wybór miasta. Wybór czasu dostawy lub "jak najszybciej". Wyświetlanie kosztów dostawy w zależności od strefy. Wsparcie dla stref dostawy z możliwością ich edytowania.Panel administracyjny Potrzebny jest wygodny panel admina z możliwością: edycji menu; dodawania i usuwania pozycji; zmiany cen; zmiany kategorii; zarządzania promocjami; tworzenia i wysyłania kodów promocyjnych; ustawiania limitu użycia kodów promocyjnych; przeglądania statystyk.Promocje i marketing Przewidzieć możliwość: kodu promocyjnego na pierwsze zamówienie; bonusu lub rabatu za zainstalowanie aplikacji; tworzenia kodów promocyjnych z ograniczoną liczbą użyć; masowych wysyłek kodów promocyjnych do użytkowników; przeprowadzania promocji bez konieczności aktualizacji aplikacji.Analiza Potrzebna jest szczegółowa statystyka: ogólna statystyka działania aplikacji; statystyka dla każdej pozycji w menu; konwersja użytkowników; liczba instalacji; liczba złożonych zamówień; średni koszyk; powtarzające się zakupy; analiza dostaw według adresów; wyszukiwanie 100 najpopularniejszych ulic dostawy; inne kluczowe wskaźniki do analizy sprzedaży.Informacyjne sekcje W aplikacji powinny być: linki do mediów społecznościowych; kontakty; mapa z lokalizacją lokalu; informacje o firmie; warunki dostawy i płatności.Wymagania dotyczące działania aplikacji szybka i stabilna praca; brak zawieszeń i krytycznych błędów; nowoczesny i zrozumiały interfejs; wsparcie dla aktualnych wersji Android i iOS.Design Nie ma jeszcze oddzielnego designu. Można wziąć za podstawę istniejącą stronę 911sushi.com. Wszystkie niezbędne materiały są już przygotowane: logotypy; firmowe kolory; menu; księga znaku (jeśli jest dostępna).Etapowa realizacja Rozważam etapowe opracowanie:Etap 1 podstawowa funkcjonalność; integracja z Poster; menu; koszyk; składanie zamówienia; autoryzacja; panel użytkownika.Etap 2 kody promocyjne; system promocji; analiza; statystyka; dodatkowe narzędzia marketingowe; inne funkcje, które mogą się pojawić w trakcie rozwoju projektu.Dodatkowe warunki Po zakończeniu rozwoju należy zapewnić 30 dni okresu testowego, w trakcie którego będą poprawiane ewentualne niedociągnięcia. Po pomyślnym teście - finalne rozliczenie. Ważne, aby wykonawca był gotowy na stopniowe rozszerzanie funkcjonalności, ponieważ nowe zadania mogą pojawić się w trakcie pracy. Priorytet - maksymalnie krótkie terminy realizacji bez utraty jakości. Pożądane, aby wykonawca był z Łucka, ale nie jest to warunek obowiązkowy.Proszę w odpowiedzi na zgłoszenie podać: orientacyjne terminy realizacji; koszt; stos technologii; przykłady podobnych projektów; doświadczenie w integracji z Poster POS; czy są gotowi pracować etapowo; czy zapewniają wsparcie gwarancyjne po uruchomieniu.
Cel: stworzyć APK dla Androida lub Firestick, zainstalować na telewizorze i z komputera uruchamiać wideo, aby na wszystkich telewizorach pokazywało to samo wideo. Będzie stosowane w klinikach do wyświetlania określonych wideo na telewizorach. Również mieć playlisty, aby każdy określony telewizor pokazywał tylko wybraną playlistę. Program powinien pobierać wideo na urządzenie, a nie streamować je, tym samym oszczędzając internet i zasoby. Przy aktualizacji playlisty program zaktualizuje się i będzie pokazywał nowe wideo.