Мій телеграм канал: https://t.me/uselessit/85
Це буде першою із серії статей які мають на меті дві цілі: показати складність сучасного світу програмування, та розважити майже всіх читачів, хто не має відношення до розробки на Android, хто має відношення - вибачайте, вас очікує масивний жопний біль.
Отже, хочемо ми додати отримання якогось OTP коду з смски одразу в нашу апку, щоб користувач одразу як отримав повідомлення міг не бігти не копіювати циферки, а просто отримати ці дані одразу в поле.
Раніше воно ж як було, запрошуємо доступ до смс і там щось собі шукаємо свою смску і вичитуємо звідти код. Підхід був, м’яко кажучи, підозрілим, мати доступ до всіх повідомлень коли очікуємо лише одного. До речі і в 2024 дуже багато додатків реалізують саме такий сценарій, а знаєте чому? А я знаю. Хоча типу у нас же є офіційний спосіб як отримати код з смс саме для нашої апки без зайвих дозволів сама система Андроїд надішле нам код через listener.
Ну давайте подивимось офіційну документацію як же це нам зробити. Вона складається з двох частин, бекенд та фронтенд, але в фронтенд там все насправді дуже просто, підключіть пару лібок, зареєструйте listener і чекайте на своє щастя.
На бекенді також виглядає наче просто, додайте особливий код до своїх повідомлень і в принципі все. Але це якщо не вдаватись в деталі. А диявол тут в деталях, а саме в питанні: а яким же чином мені отримати цей код?
Я хочу тут повністю привести текст з офіційної документації, але нижче я все одно розшифрую для тих хто не розуміє про що йдеться мова. Отже, документація:
1. If you use�app signing by Google Play, download your app signing certificate (deployment_cert.der) from the�App signing�section of the�Google Play console.
Then, import the app signing certificate into a temporary key store:
keytool -importcert -file deployment_cert.der -keystore temporary.keystore -alias PlayDeploymentCert
If you sign your APKs directly, skip this step.
Get your app signing certificate—either the one you imported above or the one you use to sign your APKs directly—as a lower-case hex string.
For example, to get the hex string from the temporary keystore created above, type the following command:
keytool -exportcert -keystore temporary.keystore -alias PlayDeploymentCert | xxd -p | tr -d "[:space:]"
If you sign your APKs directly, specify your production keystore and certificate alias.If you created a temporary keystore, delete it.
Append the hex string to your app's package name, separated by a single space.
Compute the SHA-256 sum of the combined string. Be sure to remove any leading or trailing whitespace from the string before computing the SHA-256 sum.
Base64-encode the binary value of the SHA-256 sum. You might need to decode the SHA-256 sum from its output format first.
Your app's hash string is the first 11 characters of the base64-encoded hash.
Розшифровка - візьміть сертифікат яким підписана ваша апка в маркеті, з цього сертифікату зробіть хеш-строку. Додайте до кінця цієї строки назву пакету вашої апки через пробіл. Порахуйте SHA-256 суму цієї строки і не забувайте повидаляти пробіли на початку та в кінці вашої хеш строки, бо буде пососамба. Закодуйте в Base64 вашу SHA-256 суму і останні 11 символів цього хешу просто додайте в смс, а далі Google вже все сам розрулити.
IS THIS SIMPLE ENOUGH, M8T???
Я, до речі, це все щастя спробував сам зробити. Результат чомусь не спрацював. План настільки складний, що будь який провтик призводить до того що нічого ж звісно не буде фуричити. Десь години чотири намагався це все разом зібрати щоб воно якось поїхало, але так і не спромігся отримати правильний результат.
Окей каже нам документація, якщо ти настільки тупий і не можем виконати 7 простих пунктів не привертаючи увагу санітарів, ось тобі просто консольна команда яка зробить все для тебе.
Сюрприз сюрприз, на моєму макбуці ця команда просто відмовляється працювати. Не хоче і все тут. Ще десь годинки 4 витрачено на намагання заставити цю команду працювати. Без шансів.
Окей, каже нам документація, ну ти вже зовсім дегенерат, ось на візьми тобі код встав собі в апку, запусти и порахує воно тобі ту срану строку і вставиш ти в смски, абізяна ти безпомічна. Тільки порахуй цей код один раз і не забудь потім це видалити бо таке ж не можна релізити. Питань нема, логічно що не можна.
Цей варіант до речі спрацював для DEV, QA, UAT, але не спрацював для PROD… а чому? А тому що App Bundle релізний Гугл сам підписує самим отим іншим релізним сертефікатом, а коли ми збираємо апку локально у нас же девелоперський сертефікат і вони звичайно різні, це до речі єдине логічне із всього того що я тут описую.
Отже як же нам для продакшну то отримати цю бажану строчку для смс повідомлення?
Є в консолі розробника Андроїд цікава штука - internal testing release, можна туди робити релізи які доступні лише для окремих користувачів які перелічені в списку імейлів тестерів.
Трошки повертаючись назад, отримання цієї строки я зробив таким чином, що воно вставляє результат обчислення в перший ліпший EditText. Тобто один раз запускаємо апку, код який нам дав Гугл рахує цю строчку і вставляє в поле, далі звідти вже копіюємо і скидаємо бекенд команді.
Ну план зрозумілий, робимо Internal Testing Release, качаємо ту апку і отримуємо нарешті наш код для продакшна. Так? Ні! Бо зробивши все це і запустивши апку для внутрішнього тестування я зрозумів, що мені просто ця строчка не вставляється в EditText. От на інших версіях апки вставляється, а тут ні.
Чому? А тому що build optimisation, є така опція в консолі яку ти фіг знайдеш якщо не знаєш що шукати, мій маленький програмістік, він просто взяв і в автоматичному режимі тупо викинув кусок кода тому що ж навіщо це в продакшені. Я знав де шукати і зрозуміти в чому проблема на цей раз не зайняло багато часу.
Отже нарешті відключивши цю оптимізацію і зробивши ще один реліз я отримав цю бажану строчку для смс повідомлення щоб в автоматичному режимі циферки вставляти в поле вводу. А і не забути включити оптимізацію назад для наступних релізів.
Тупо два дні життя витрачено на таку просту річ. Айосник з тією ж задачею впорався десь за 4 годинки максимум.
Невже так важко кудись в консоль розробника накакати кнопочку яка видасть вам цю строчечку для вашої апки.
За що ти так не любиш розробників на своїх платформах, Гугл???