Привіт спільното! Сподіваюсь, всі в безпеці і ваші станції достатньо заряджені. Маю для вас розповідь про досвід розробки цікавого додатку на Flutter в рамках проєкту we:
Раніше я вже розповідав про наш стартап та базовий функціонал online-платформи we.ua. Безмежно дякую за ваші коментарі, поради та слова підтримки у відповідній статті: https://drukarnia.com.ua/articles/socialna-merezha-vid-we-ua-bOS5R . Буду вдячний, якщо в шановних читачів Друкарні виникнуть нові ідеї чи запитання щодо нашого проєкту.
Розробка додатку та реліз під Android зайняли 9 місяців .Одразу зазначу, що цей термін є доволі розтягнутим в часі, оскільки для безпосереднього створення коду використовувалось в середньому по 4-5 годин на робочий день. Міряючи повними робочими днями, розробку можна було б прискорити до 5-6 місяців, з яких 2 місяці слід виділити на внутрішнє тестування та роботу над очевидними багами.
Власне, чому саме Flutter?
Flutter від Google пропонує кросплатформенність (cross-platform), гнучкість, відкритість та доступність коду. Мова програмування Dart, на якій створюється додаток, максимально нагадує Java, .Net, Kotlin, Swift або навіть JavaScript. Dart є легкою в освоєнні і більш-менш зручною у використанні. Не найкраща мова в світі, але для своєї задачі - цілком топчик.
На даному етапі розробки ми зосередились на створенні додатків для Android та iOS, маючи web-версію проєкту з власним API та WebSockets для обміну повідомленнями. Ми не стали здійснювати розробку web-версії силами Flutter, оскільки переконані, що наш досвід з PHP, JS, Python дасть кращий та очікуваніший результат за максимально короткий проміжок часу. Тим паче, що наша імплементація web-версії Платформи we: показала себе чудово. Ви можете самостійно переконатись в цьому, створивши свій Профіль на сайті https://we.ua/.
Що ми хотіли отримати від мобільних додатків?
Ми хотіли створити зручний додаток для читання каналів, профілів та обміну повідомленнями зі збереженням даних в локальній памʼяті пристрою для максимальної автономності. WebView-додаток з обʼєктивних причин нас не влаштовував.
Базовий функціонал включає:
форми реєстрації/авторизації/відновлення доступу;
налаштування облікового запису (Профілю);
секція Профілю з фото, обкладинкою, описом, додатковою інформацією;
Стрічкою дописів в Профілі користувача (далеко не всі користувачі є творцями контенту і не створюють дописи; більшість реєструється, щоб підписатись на цікаві канали та читати, чи дивитись відео з них);
форма створення/редагування допису в Профілі;
функціонал "Друзі" для запрошення нових учасників, подачі та обробки заявок в спеціальний список довірених користувачів, з якими буде здійснюватись подальша комунікація (на платформі we: Вам не може написати, чи зателефонувати хто-завгодно, лише довірені особи зі списку "Друзі");
пошук користувачів за іменем, нікнеймом (we:nickname), Email, чи мобільним;
підписування на оновлення Користувачів (типово, Ви підписуєтесь на оновлення Профілю, подаючи заявку в Друзі, але можете просто підписатись на оновлення і слідкувати за новими дописами без потреби в подальшій комунікації);
коментарі та вподобайки до дописів Профілю;
секція публічного Каналу (це своєрідний профіль на чітко задану тематику, на який підписуються інші користувачі для отримання оновлень з нього за принципом "один пише, а багато читають");
форма створення/редагування публічного каналу (в одного користувача може бути декілька каналів, оскільки кожна творча особистість може бути різнобічною та різноплановою);
стрічка дописів, коментарі та вподобайки в Каналі, як і в Профілі користувача;
форма пошуку каналів за назвою, або короткою адресою (we:@channel);
загальний overview всіх оновлень з каналів та від користувачів з можливістю перемикання між типами джерел (чітке розділення за потреби між новинами з каналів та оновленнями друзів);
чати миттєвих повідомлень з E2EE, фото відео, вподобайками та локальними сповіщеннями, щоб не пропустити важливе вхідне повідомлення (вийшов повноцінний месенджер);
секція сповіщень про останні дії щодо облікового запису від інших користувачів, або системи (вхідні заявки в Друзі, реакції на коментарі та дописи, тощо);
Ми доклали зусиль, щоб в нашому додатку було що знайти і почитати чи подивитись актуальну інформацію про події в Україні та світі. Для цього є розділ "Всі новини" в навігації. Нудно не має бути точно!
Які програмні пакети були використані
Опишемо лише основні з поясненням для чого вони призначені. Досвідчені розробники можуть висловити свої обʼєктивні і не дуже судження щодо обраних програмних рішень в коментарях.
cached_network_image - кешування зображень в локальній памʼяті при отриманні з серверу; економія трафіку;
cryptography, encrypt, pbkdf2ns - створення хешів та E2EE;
emoji_picker_flutter - для вибору емоджі в IM чатах;
flutter_local_notifications - для локальних сповіщень про вхідне повідомлення, чи заявку в Друзі;
flutter_secure_storage - збереження деяких секретних даних користувача (авторизація, токени доступу до API та WebSockets, тощо)
flutter_staggered_animations - для анімації іконок емоцій (вподобайок) в спеціальному контекстному меню;
package_info_plus, flutter_app_version_checker - показ поточної версії додатку та перевірка оновлень на сервері Google Play або App Store;
path_provider - побудова локальних шляхів в поточній OS;
receive_sharing_intent - отримання поширеного матеріалу (текст/файл/фото/відео) в додаток з подальшим використанням в дописах, чи IM-чатах;
share_plus - поширення контенту з додатку;
sqflite - збереження деяких публічних даних в локальній памʼяті в БД SQLite;
url_launcher - відкриття зовнішніх посилань в типовому браузері;
web_socket_channel - зʼєднання та комунікація по WebSockets;
image - показ зображень різними способами;
image_picker - вибір фото та відео з памʼяті мобільного;
flutter_image_compress - стиснення обраних зображень для подальшого використання в додатку;
custom_image_crop - вибір області та обтинання зображень для аватару та обкладинки;
uuid - створення UUID-ідентифікаторів для локальних файлів в кеші;
flutter_file_downloader - завантаження файлу, фото, чи відео з IM чатів, або дописів у локальну памʼять мобільного;
video_player - відтворення mp4-відео в дописах та IM повідомленнях;
youtube_player_flutter - відтворення YouTube-відео в дописах;
vimeo_video_player - відтворення Vimeo-відео в дописах;
google_mobile_ads - для контекстної реклами в додатку;
connectivity_plus - для перевірки доступності Internet-вузлів перед передачею даних;
permission_handler - для перевірки прав на сповіщення, чи доступ до камери для селфі;
mobile_scanner - для сканування QR-кодів.
Що з цього вийшло
Презентуємо Вам мобільний додаток we: новий комунікаційний канал у Вашому смартфоні!
Для Android: https://play.google.com/store/apps/details?id=we.ua
Для iOS (iPhone) : реліз відбудеться до кінця літа 2024.
Мобільний додаток we: включає 3 складові: Профілі, Канали, Миттєві повідомлення. Кожна з цих частин доповнює іншу і є невідʼємною частиною online-платформи we:.
Профілі та Канали відносяться до теми Публічної інформації (крім авторизаційних користувацьких даних), а чати Миттєвих повідомлень - до Приватної інформації. Публічні дані є загальнодоступним і мають містити лише достовірну та перевірену інформацію, за яку користувач Платформи несе повну публічну відповідальність. Приватні особисті повідомлення захищені сучасними алгоритмами перехресного шифрування одразу "з коробки". Цей захист не можна вимкнути, чи обійти при передачі даних між вузлами.
Профілі користувачів
Для взаємодії з профілями користувачів у нашому додатку діє наступний функціонал:
форми реєстрації, авторизації та відновлення (доступ в додаток без авторизації не можливий);
створення Профілю користувача при реєстрації (вказуються Імʼя та необхідні авторизаційні дані);
персоніфікація Профілів не лише за іменем, а й нікнеймом (вкажіть в online-бесіді we:ваш-нікнейм, щоб Вас могли легко знайти на Платформі у web-версії, чи в додатку);
більше можливостей для Вашого самовираження: аватар, обкладинка, додатковий опис, посилання на інші соцмережі;
стрічка публічних дописів (пости) в Профілі з фото і відео та зовнішніми посиланнями;
форма для створення/редагування дописів у Профілі;
коментарі та вподобайки до постів користувачів;
можливість поширення допису з Профілю в своєму профілі (репост), або в будь-якому іншому додатку;
розділ Налаштувань з можливістю зміни авторизаційних даних, паролю та повного видалення Профілю;
форма пошуку користувачів за іменем, коротким нікнеймом, Email, чи мобільним;
функціонал "Друзі": додавання в друзі зареєстрованого користувача, запрошення друзів за Email чи мобільним, список підтверджених друзів, вхідних та вихідних заявок в друзі, сповіщення про нові заявки в Друзі;
функціонал "Підписок" на оновлення у Профілях дозволяє слідкувати лише за новинами обраних друзів і дозволить не пропустити важливі події в їх публічних постах;
можливість поскаржитись на Профіль користувача;
Як бачите, функціонал Профілю в додатку повторює функціонал web-версії Профілю користувача. Всі профілі мають бути публічними. Користувачі мають використовувати реальні імена і не видавати себе за інших відомих осіб. Короткі нікнейми дозволять встановлювати звʼязки з користувачами більш зручно та оперативно.
Публічні канали
Частина наших користувачів є дуже талановитими та багатогранними особистостями. Їх талант проявляється у творчості, підприємливості, фаховості, чи бажанні служити людям. В кожному разі їм слід ще більше самовиражатись та розповідати про їх особисту діяльність, чи діяльність їх організації широкій аудиторії читачів.
Для такого поширення публічної інформації за принципом "один пише, а багато читають" в online-світі існують канали. Платформа we: - не виключення. Наші зареєстровані користувачі можуть підписуватись на будь-які публічні канали як через web-сайт, так і через додаток. В розділі останніх оновлень будуть доступні короткі сповіщення з фото (тизери) в хронологічному порядку (найновіші - вгорі списку). Кожен користувач може перейти до каналу та бачити повний потік публічних повідомлень про важливі події, чи новини.
Безперечно, створювати і наповнювати канали вручну - це тривалий і складний процес. Ми розуміємо і поважаємо вітчизняних творців контенту. Тому пропонуємо імпортувати контент з їх каналів у YouTube, Telegram, чи з RSS-фідів власних сайтів автоматично. Канали we: - це не замінник наявних та дуже популярних способів доставки інформації (TG, WhatsApp, Signal, тощо), а доповнення, яке може існувати паралельно і слугуватиме для розширення своєї аудиторії підписників на Платформі we:.
Всі імпортовані канали з YouTube та Telegram проходять ретельну перевірку в ручному режимі. Ми не допускаємо для публічного висвітлення на нашій Платформі неперевірену, провокативну, шкідливу, чи ворожу інформацію з так званих "анонімних каналів". Ми не допускаємо існування каналів про-російських посіпак, їх агентів впливу, чи інших осіб з анти-українською риторикою. Від публічних каналів має бути користь перш за все для України, її виживання, зміцнення та відбудови. Ми всебічно підтримуємо про-українські та демократичні ініціативи, спрямовані на посилення демократії, верховенства права та свободи слова.
Деяким користувачам, які створюють публічні канали на платформі we:, буде запропоновано укласти прямі договори про надання інформаційних послуг з метою посилення відповідальності за їх контент перед власниками Платформи, суспільством та Державою. Також, власники каналів з аудиторією понад 100 підписників можуть ініціювати показ контекстної реклами та отримати ще більше вигоди за свою творчість. Принагідно, запрошуємо вітчизняний бізнес до сталої співпраці та пропонуємо вигідні нішеві маркетингові рішення через співпрацю з Платформою, нашим додатком та Авторами контенту.
Функціонал публічних каналів у додатку we:
форма створення та редагування Каналу;
профіль Каналу з назвою, описом, унікальною адресою (легко передавати та знаходити we:@ваш-канал), лого, обкладинкою, посиланнями на інші соцмережі;
забезпечення унікальності з авторським лого та нетривіальною обкладинкою Каналу;
стрічка всіх дописів Каналу з можливістю підписатись/відписатись/поскаржитись;
форма для ручного створення/редагування дописів Каналу;
коментарі та вподобайки до постів Каналу;
репости у свій профіль, або в будь-який інший додаток;
форма пошуку Каналів за їх назвою, чи короткою адресою;
функціонал "Підписок" на оновлення Каналу;
можливість поскаржитись на Канал;
комунікація з підписниками від імені Каналу (в наступних релізах).
Як бачите, функціонал Каналів не дуже відрізняється від функціоналу Профілів, за винятком частин про комунікацію та Друзів. Все тому, що і Канали, і Профілі покликані презентувати світові публічну інформацію. Для того, щоб користувачі додатку могли легко відрізнити Канали від Профілів (не те що в Telegram) ми вказали маленькими надписами "Канал/Користувач" у стрічці оновлень та в каналах, встановили квадратну форму для лого каналів а круглу - лише для Профілів користувачів, використали @ в адресі каналів (we:@ваш-канал) і показали ці короткі адреси безпосередньо в самих каналах.
Миттєві повідомлення
Додаток нашої Платформи має влаштований месенджер з перехресним шифруванням "з коробки", яке неможливо вимкнути чи скомпрометувати в найближчому майбутньому. Наш месенджер не претендує на звання найзахищенішого в світі і ми не гарантуємо Вам, що ваша конфіденційність не буде порушена в інтересах безпеки України, для забезпечення її захисту, суверенітету та територіальної цілісності на момент дії надзвичайного правового військового стану.
Не використовуйте Платформу, додаток, чи месенджер Платформи для поширення анти-українських закликів, виправдання російської військової агресії, поширення порнографії, торгівлі людьми, чи будь-чим забороненим! Наш додаток та чати миттєвих повідомлень не забезпечують 100% анонімності (як і все, що використовує мережу Internet та відкриті канали звʼязку). Для псевдо-анонімності і зручності для спілкування терористів є російські додатки. Ми забороняємо використовувати наш додаток та месенджер миттєвих повідомлень в ньому з територій терористичних та тоталітарних держав, держав-спонсорів тероризму та їхніх посіпак, що не засуджують військову агресію РФ проти України.
Функціонал чатів миттєвих повідомлень:
створення нового чату з користувачем зі списку Друзів (ваш запит в Друзі має бути підтвердженим);
передача тексту та емоджі в повідомленнях;
передача фото та відео в повідомленнях;
передача невеликих файли в повідомленнях (в наступних релізах);
зручні вподобайки до кожного повідомлення в чаті;
групові чати (будуть опубліковані після припинення російсько-української війни, тимчасово вимкнуті з міркувань безпеки);
чати спілкування зі списку Друзів, в розділі "Миттєві повідомлення", або з профілю Друга;
чатботи Каналів (в наступних релізах).
Як бачите, ми потурбувались, щоб Ви не отримували навʼязливі повідомлення від незнайомців. Створювати повідомлення до Вас в додатку we: можуть лише Друзі, яких Ви підтвердили, або бізнес-канали на які Ви підписались (діють обмеження щодо частоти сповіщень від каналу).
Наше API дозволяє надсилати повідомлення користувачам додатку we: за тарифом 5 коп/повідомлення до 255 символів. Відправники повинні мати Отримувача в Друзях, або здійснювати надсилання одиничного (транзакційного) повідомлення від імені Каналу, на який підписаний Отримувач. Даний функціонал забезпечить легким та доступним комунікаційним каналом не лише пересічних користувачів, а й вітчизняний бізнес.
Переваги додатку we:
Окрім того, що наш додаток на 100% український, він також має ряд інших переваг:
влаштоване E2E-шифрування в кожному чаті типово, "з коробки";
ініціювати комунікацію з користувачем можна тільки після підтвердження заявки в Друзі;
зручне та очевидне розділення оновлень з каналів, оновлень від Користувачів та чатів з користувачами;
додатки не використовують доступ до Контактів телефону;
додатки не використовують доступ до геолокації та не передають розташування;
додатки не фіксують і не передають IP-адреси користувачів у відкритому вигляді, або вигляді придатному для декодування;
в додатках не розкриваються такі важливі контактні дані як Email та номер мобільного (не показуються в профілі, чи в чатах);
пошук користувачів за коротким нікнеймом виду we:username, за Email, чи мобільним;
публічний нікнейм не бере участі в авторизації, чи відновленні доступу;
2 теми додатків: світла та темна;
без русні в інтерфейсі та сподіваємось, що без русні в користувачах (вичистимо їх разом!).
модерація здійснюється українською командою;
мінімальна кількість реклами в загальних розділах;
власники каналів самостійно приймають рішення про показ контекстної реклами та отримують 100% прибутку від неї;
можливість відкривати Профілі користувачів та Канали з влаштованим сканером QR-кодів (перетворюйте відвідувачів на підписників свого каналу).
Чого немає в додатку we:
російської мови в інтерфейсі;
русні в засновниках, в ЦА, в користувачах;
руснявих ботів;
про-російської реклами і анти-українського крінжу;
продажі тютюну, алкоголю, наркотиків, чи інших заборонених товарів;
сумнівних крипто-афер, крипто-бірж, незаконне виведення крипти та ін.;
"анонімних каналів", як у Telegram;
каналів про анти-вакцинацію, пласку Землю, чи анти-мобілізаційні заходи;
порнографії та оголеного тіла (блюримо, що можемо; закликаємо скаржитись на неприйнятний контент);
"розумних алгоритмів" для просування нерелевантного контенту, штибу "Марс рекомендує", чи "Вам таке сподобається";
високогуманних ефемерних "стандартів спільноти" і заборони називати кацапів терористами, військовими злочинцями, свино-собаками та іншими синонімами;
ностальгії за тюрмою народів СРСР чи духом епохи;
виправдання російської військової агресії проти України, чи інших держав.
Якщо Ви шукаєте в нашому додатку щось з переліченого, він точно не для Вас і краще повертайтесь в російський Telegram.
Відповіді на очевидні запитання
Q: Хто є власником?
A: На даний момент проєктом we:, додатком та відповідними ТМ одноосібно володіє ФОП Байда Мирослав Володимирович. Детально про структуру власності та відкриття ТОВ буде описано в розділі Інфо https://we.ua/info.
Q: Де знаходяться сервери?
A: Україна (Київ), Польща (Варшава).
Q: Чи можна видалити обліковий запис we: ?
A: Так, кожен користувач може видалити свій обліковий запис повністю в розділі налаштувань. Для цього слід ввести поточний пароль і цим підтвердити санкціонований доступ до облікового запису.
Q: Які саме алгоритми шифрування використовуються в E2EE миттєвих повідомлень?
A: Використовується AES-шифрування з PBKDF2 ключами, що суттєво сповільнює можливість перебору. Детальніше про PBKDF2: https://uk.wikipedia.org/wiki/PBKDF2.
Q: Як ви боретесь з руснею в своєму проєкті?
A: Ми максимально унеможливлюємо реєстрацію та використання online-Платформи з IP-адрес РФ, РБ, Ірану та Китаю. Ми реагуємо на скарги щодо користувачів ("агентура Кремля, про-російські посіпаки", тощо) та контенту протягом кількох годин та блокуємо підозрілі облікові записи. Додаток we: не доступний для встановлення в Google Play в РФ, РБ, Ірані, Китаї та ще кількох країнах. Для підозрілих облікових записів ми пропонуємо пройти додаткову перевірку з використанням Дія.Підпис, або ЕЦП від українського банку (зберігаємо лише ПІБ та Email, для успішної валідації має бути 100% співпадіння по цим 2 параметрам, інакше - автоматичний бан).
Далі буде...
В наступних релізах додатку буде втілено ще багато чого цікавого та корисного для українських користувачів та бізнесу. А саме:
Англійська мова інтерфейсу (можливо і інші, якщо буде потреба ринку).
Обмін файлами на основі peer-to-peer передачі даних без збереження на сервері.
Аудіо- та Відео- дзвінки з E2E шифруванням на основі peer-to-peer потокової передачі даних.
Короткі голосові повідомлення (якість буде недостатня для використання як біометричні голосові дані, але задовільна для прослуховування).
Стікери у Миттєвих повідомленнях.
Нові типи дописів: Оголошення, Опитування, Товар чи Послуга, Запис на прийом, тощо.
Можливість завантаження власних відео (до 60-120 сек) в Дописах.
Можливість комунікації з підписниками від імені Каналу прямо з додатку.
Поділіться інформацією про додаток
Буду вдячний за поширення інформації про наш додаток будь-яким зручним для Вас способом.
Ще раз посилання на додаток для Android: https://play.google.com/store/apps/details?id=we.ua
Всім мирного неба та всього найкращого!