Модуль скріншотів та анотацій для мобільних додатків (iOS/Android)

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Модуль скріншотів та анотацій для мобільних додатків (iOS/Android)
Середній
~2-3 дні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    562

Скріншот з анотацією та контекстом: модуль зворотного зв'язку в мобільних додатках

Користувач повідомляє про помилку: «кнопка не працює». Розробник гадає: яка кнопка? На якому екрані? In-App Feedback знімає всі питання — користувач буквально показує проблему на скріншоті, виділяє її маркером і додає коментар. Ми реалізуємо такий модуль під ключ: від захоплення екрану до відправки в Jira або Sentry. На одному з проектів з аудиторією в мільйон користувачів впровадження такого модуля дозволило скоротити час на первинний аналіз багів удвічі, а кількість відтворюваних проблем зросла на 70%.

Типові складнощі: відсутність контексту (скріншот дає в 10 разів більше інформації, ніж текст), неповні метадані (версія, ОС, пристрій), неможливість повторити баг (скріншот фіксує стан). Наше рішення автоматично прикріплює всі метадані та зберігає скріншот в систему трекінгу. Ми використовуємо перевірені підходи та гарантуємо продуктивність — скріншот створюється менше ніж за 0.5 секунди. За досвідом, впровадження такого модуля скорочує час на налагодження на 60% та економить до 40 годин роботи інженера на місяць.

Чому In-App Feedback критичний для мобільних додатків?

Без скріншота з контекстом розробник витрачає в середньому 20 хвилин на уточнення деталей багу. In-App Feedback зводить цей час до нуля: вся інформація (зображення, анотація, метадані) надходить в тикет-систему за один клік. Особливо це важливо для додатків з високою динамікою — наприклад, фінтех або логістика, де кожна година простою коштує дорого.

Як захопити скріншот на iOS та Android?

Кожна платформа вимагає свого підходу. Ми комбінуємо методи для максимального покриття.

iOS — UIGraphicsImageRenderer + WKWebView

func captureScreenshot() -> UIImage? {
    let renderer = UIGraphicsImageRenderer(bounds: UIScreen.main.bounds)
    return renderer.image { ctx in
        UIApplication.shared.windows.first?.layer.render(in: ctx.cgContext)
    }
}
// Для WKWebView:
webView.takeSnapshot(with: nil) { image, error in
    // Вставити в підсумковий скріншот через Core Graphics
}

Докладніше: UIGraphicsImageRenderer. Важливий нюанс: layer.render не захоплює контент WKWebView та ARSCNView — вони рендеряться через окремий GPU-контекст. Тому для WebView ми використовуємо метод takeSnapshot(with:).

Android — PixelCopy API

fun captureScreenshot(activity: Activity, callback: (Bitmap?) -> Unit) {
    val bitmap = Bitmap.createBitmap(
        activity.window.decorView.width,
        activity.window.decorView.height,
        Bitmap.Config.ARGB_8888
    )
    PixelCopy.request(activity.window, bitmap, { result ->
        callback(if (result == PixelCopy.SUCCESS) bitmap else null)
    }, Handler(Looper.getMainLooper()))
}

Android Developer Guide рекомендує PixelCopy починаючи з Android 8.0 (API 26). Для старіших пристроїв використовуємо View.getDrawingCache(), але він не захоплює SurfaceView.

Платформа Метод Обмеження
iOS UIGraphicsImageRenderer Не захоплює WKWebView та ARSCNView
Android PixelCopy (API 26+) Не захоплює SurfaceView
Flutter RenderRepaintBoundary Працює лише у Flutter-віджетах

Чому кастомний анотатор кращий за готові рішення?

Готові бібліотеки (PSPDFKit, Pen) економлять час, але обмежують контроль. Кастомний анотатор дає на 40% більше гнучкості та не має ліцензійних обмежень. Розробка власного анотатора займає 2–3 дні і дає повний контроль над UX. На одному проекті ми замінили PSPDFKit на кастомний canvas і отримали:

  • Кастомні форми стрілок (подвійна лінія, вигнуті)
  • Пікселізацію по області (приховування особистих даних)
  • Миттєву реакцію на натискання (без затримок UIKit)

Приклад кастомного канвасу

class AnnotationCanvasView: UIView {
    private var paths: [UIBezierPath] = []
    private var currentPath: UIBezierPath?
    var strokeColor: UIColor = .red
    var strokeWidth: CGFloat = 3.0

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        let path = UIBezierPath()
        path.move(to: touches.first!.location(in: self))
        currentPath = path
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        currentPath?.addLine(to: touches.first!.location(in: self))
        setNeedsDisplay()
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if let path = currentPath { paths.append(path) }
        currentPath = nil
    }

    override func draw(_ rect: CGRect) {
        for path in paths {
            strokeColor.setStroke()
            path.lineWidth = strokeWidth
            path.stroke()
        }
        strokeColor.setStroke()
        currentPath?.stroke()
    }
}
Критерій Готові SDK Кастомна реалізація
Швидкість впровадження 1–2 дні 2–3 дні
Контроль над UX Обмежений Повний
Ліцензування Платно (SDK) Безкоштовно
Кастомізація Через API Будь-яка

Збір метаданих

До скріншота автоматично прикріплюємо:

struct FeedbackPayload: Encodable {
    let screenshot: Data          // JPEG, якість 0.7
    let description: String
    let appVersion: String
    let osVersion: String
    let deviceModel: String
    let screenName: String        // поточний екран (роутер/NavigationStack)
    let userId: String?
    let sessionId: String         // UUID сесії для кореляції з логами
    let timestamp: Date
}

screenName особливо важливий — дозволяє одразу зрозуміти, на якому екрані виникла проблема, без розпитувань користувача.

Як відправити feedback у тикет-систему?

Скріншот відправляємо як multipart/form-data. Для зберігання на backend — S3 або аналог з pre-signed URL. У тикет-систему (Jira, Linear, Sentry) прикріплюємо посилання на зображення.

Приклад через Sentry:

let attachment = Attachment(
    data: screenshotData,
    filename: "screenshot.jpg",
    contentType: "image/jpeg"
)
SentrySDK.capture(message: feedback.description) { scope in
    scope.addAttachment(attachment)
    scope.setTag(value: feedback.screenName, key: "screen")
}
Приклад конфігурації Sentry для iOS ```swift SentrySDK.start { options in options.dsn = "https://[email protected]/0" options.enableAutoPerformanceTracking = true } ```

Етапи роботи

  1. Аналіз — тестуємо поточний процес збору багів, виявляємо вузькі місця.
  2. Проектування — вибираємо метод захоплення, малюємо UX анотацій.
  3. Розробка — реалізуємо модуль, інтегруємо з вашою CRM / тикет-системою.
  4. Тестування — навантажувальне тестування (100+ скріншотів на хвилину), перевірка приватності (пікселізація).
  5. Деплой — документація, навчання команди, моніторинг.

Що входить у роботу

  • Архітектурний документ з описом модуля
  • SDK без конфліктів з існуючими залежностями
  • Інтеграція з Jira, Sentry або вашою CRM
  • Інструкція для користувачів
  • Гарантія продуктивності (скріншот < 1 сек)
  • Навчання команди

Орієнтири за термінами та вартістю

Ми — команда з 7+ років досвіду в мобільній розробці, реалізували 15+ проектів з In-App Feedback. Кастомна реалізація займає 1–1.5 тижні. Інтеграція готової бібліотеки — 3–5 днів. Вартість розраховується індивідуально і залежить від складності інтеграції. Зв'яжіться з нами для оцінки вашого проекту — ми запропонуємо оптимальне рішення. Замовте консультацію з інтеграції In-App Feedback у ваш додаток.

Підтримка мобільних додатків: моніторинг, хотфікси та оновлення ОС

Після виходу нової major версії ОС кожен другий додаток отримує сплеск crash rate. Background App Refresh перестає працювати, foreground service policy блокує фонові задачі, а новий iPhone з іншим співвідношенням сторін ламає hardcoded layout. Якщо не реагувати протягом 24–48 годин, рейтинг у стор падає, користувачі йдуть до конкурентів. Ми маємо 10+ років досвіду супроводу мобільних додатків і знаємо, як утримати crash-free rate на рівні 99,9% навіть після великих оновлень ОС. Замовте безкоштовний аудит — оцінимо ваш проект за 24 години.

Регулярна підтримка знижує crash rate до 99.9% — це в 10 разів краще, ніж без неї

Без проактивного моніторингу команди витрачають тижні на пошук причини крэшу, а користувачі отримують нестабільну версію. Ми налаштовуємо алерти в реальному часі: Firebase Crashlytics, Sentry з breadcrumbs, а для Flutter — sentry_flutter з WidgetsFlutterBinding.ensureInitialized(). Головна метрика — crash-free users rate нижче 99,5% — тривожний сигнал, нижче 99% — інцидент. Наш SLA: критичний крэш (crash rate >1%) — хотфікс за 24–48 годин до публікації, 3–7 днів до проходження рев'ю Apple. Для Android доступне прискорене рев'ю через Google Play Console. Згідно з Wikipedia, crash-free rate вище 99,9% є стандартом для топових додатків.

Як налаштувати Crash Monitoring в продакшні?

Ми інтегруємо Crashlytics або Sentry, налаштовуємо алерти в Slack/Telegram із зазначенням affected users та velocity. Для React Native додаємо breadcrumbs — видно, які actions передували крэшу. Для Flutter — runZonedGuarded та sentry_flutter. Типовий сценарій: після релізу нової версії ОС з'являється крэш у UISheetPresentationController через зміну поведінки detents. Crashlytics показує 0,3% affected users, але velocity зростає. Оперативно верифікуємо на пристрої, знаходимо причину, випускаємо хотфікс. Моніторинг Crashlytics знижує час пошуку помилок у 5 разів порівняно з ручним логуванням.

Технічні деталі налаштування Sentry

Для максимальної деталізації breadcrumbs додаємо:

  • iOS: SentrySDK.startSession() + кастомні breadcrumbs через SentrySDK.addBreadcrumb
  • Android: SentryAndroid.init() з BeforeSendCallback для фільтрації чутливих даних
  • Flutter: FlutterError.onError + runZonedGuarded

Після налаштування система автоматично класифікує інциденти за рівнем критичності.

Хотфікси: що можна зробити без публікації в стор

App Store забороняє змінювати виконуваний код без рев'ю (App Store Review Guidelines 2.5.2). Але є легальні механізми оперативного втручання.

  • Remote Config (Firebase або власний) — зміна поведінки через прапорці без оновлення. Вимкнути проблемну фічу, показати maintenance banner, змінити URL endpoint — все це за годину, а не за тиждень.
  • OTA оновлення для React Native: react-native-code-push або Expo Updates дозволяють оновити JS-бандл без App Store. Обмеження: тільки JS-код, нативні модулі потребують повного оновлення.
  • Expo EAS Update — сучасна альтернатива CodePush з підтримкою каналів (production/staging) та rollback.

Ми радимо комбінувати Remote Config для критичних перемикачів і OTA для швидких виправлень логіки. Це скорочує час реакції вдвічі порівняно з традиційним релізним циклом.

Що робити при виході нової версії ОС?

Apple анонсує iOS beta на WWDC, фінальний реліз — через три місяці. Ми починаємо тестування з першої бети — це дає запас 3–4 місяці. Критичні області перевірки при кожному major iOS update:

Компонент Що змінюється Ризики
Privacy Manifest Обов'язковий для використання ряду API Reject при рев'ю
UIScene lifecycle Зміни в управлінні сценою Завершення фонових задач
UICollectionView/UITableView анімації Зміна дефолтних анімацій Візуальні баги
Swift Concurrency Поведінка TaskGroup, async let Гонки даних

На Android target SDK зобов'язаний оновлюватися щорічно. Google Play вимагає targetSdk мінімум Android -1. Перехід з targetSdk 33 на 34 змінює behaviour для foreground services, broadcast receivers, implicit intents. Ми тестуємо на реальних пристроях із кожною бетою, щоб уникнути сюрпризів у день релізу.

Як підготувати додаток до нової версії ОС: покроковий план

  1. Завантажити бета-версію Xcode або Android Studio.
  2. Зібрати проект з новим SDK і виправити компіляційні помилки.
  3. Запустити на реальному пристрої та перевірити критичні flows (авторизація, платежі, push-сповіщення).
  4. Оновити залежності з відомими вразливостями через Dependabot.
  5. Виправити deprecated API, які будуть видалені в релізі.
  6. Зімітувати сплеск користувачів (load testing) для виявлення race conditions.
  7. Опублікувати оновлення за 2 тижні до релізу ОС.

Процес роботи

Етап Що робимо Типові терміни
Аудит поточного стану Аналізуємо crash logs, dependency граф, target SDK, версії бібліотек 1–2 дні
Планування Складаємо backlog технічного боргу, пріоритезуємо хотфікси, встановлюємо SLA 1 день
Реалізація Пишемо хотфікси, налаштовуємо Remote Config, оновлюємо залежності 1–4 тижні
Тестування Перевіряємо на реальних пристроях, використовуємо Firebase Test Lab та XCTest/Espresso 2–5 днів
Деплой Публікація в App Store та Google Play, моніторинг crash rate після релізу 1–3 дні
Пост-релізний моніторинг Відстежуємо метрики, реагуємо на нові інциденти Безстроково

Технічний борг та планування

Підтримка — це не тільки реакція на баги. Ми плануємо технічний борг: застарілі залежності з відомими вразливостями (npm audit / bundler-audit), deprecated API, які будуть видалені в наступному Xcode, бібліотеки без активної підтримки. Dependabot або Renovate автоматично створюють PR при виході нових версій. Мінімальну підтримувану версію ОС переглядаємо щорічно — підняття з iOS 15 на iOS 16 дозволяє видалити значний обсяг workaround-коду. Регулярне оновлення залежностей знижує витрати на підтримку в 2–3 рази порівняно з реактивним підходом.

Як уникнути типових помилок при супроводі?

  • Ігнорувати crash rate нижче 1% — з часом він накопичується і падає рейтинг.
  • Використовувати OTA для зміни нативного коду — порушення гайдлайнів Apple.
  • Не перевіряти сумісність з новими версіями iOS до виходу фінального релізу — втрачаєте 3 місяці.
  • Оновлювати залежності вручну без Dependabot — ризик забути про критичні вразливості.

Що входить в роботу (deliverables)

  • Налаштування моніторингу (Crashlytics, Sentry або інший інструмент)
  • SLA-реагування на інциденти (24/7 для critical, 48h для high)
  • Документація відомих крэшів та workaround-ів
  • Доступи до консолей розробника (App Store Connect, Google Play Console)
  • Навчання команди роботі з Crashlytics та Remote Config
  • Щомісячні звіти з метриками stability та recommendations

Строки орієнтовно: від 1 місяця (базова підтримка) до 6+ місяців (повний супровід з розвитком фіч). Вартість розраховується індивідуально — зв'яжіться з нами, і ми підготуємо комерційну пропозицію за 24 години.

Гарантія стабільності вашого додатку — це наш досвід 10+ років та сертифіковані спеціалісти з iOS та Android. Замовте безкоштовний аудит поточного стану вже сьогодні та отримайте план дій для підтримки на рівні top-grossing додатків.