Логарифмический контроль громкости
🔊Нашёл замечательный факт от Давида Кордеро.
Представьте, вы смотрите видео в тихой обстановке, установили минимальную громкость, а она всё равно громкая. Поэтому вы пытаетесь уменьшить её, жмёте кнопку... Иии, теперь звука вообще нет. Ну что, жизненно?😄
Или, например, в другой день вы на вечеринке слушаете музыку, но поменяв со 100 до 80% разницы практически нет.
🤔 Как такое возможно, в первом случае одним нажатием мы выключили звук, а во втором случае ничего не изменилось?
Причина в разнице между реализацией громкости и восприятием для наших ушей.
Регуляторы громкости часто реализуются линейно, но наше ухо воспринимает громкость логарифмически.
Это известный факт для аудиоинженеров, использующих децибелы (дБ) для логарифмического восприятия звука.
Поработав на ТВ Давид сделал вывод, что это непопулярное знание в отрасли, и поэтому часто реализуется неправильно.
🧑💻 Поэтому, чтобы регулировать звук корректно, используйте
@iOS Dev
🔊Нашёл замечательный факт от Давида Кордеро.
Представьте, вы смотрите видео в тихой обстановке, установили минимальную громкость, а она всё равно громкая. Поэтому вы пытаетесь уменьшить её, жмёте кнопку... Иии, теперь звука вообще нет. Ну что, жизненно?😄
Или, например, в другой день вы на вечеринке слушаете музыку, но поменяв со 100 до 80% разницы практически нет.
🤔 Как такое возможно, в первом случае одним нажатием мы выключили звук, а во втором случае ничего не изменилось?
Причина в разнице между реализацией громкости и восприятием для наших ушей.
Регуляторы громкости часто реализуются линейно, но наше ухо воспринимает громкость логарифмически.
Это известный факт для аудиоинженеров, использующих децибелы (дБ) для логарифмического восприятия звука.
Поработав на ТВ Давид сделал вывод, что это непопулярное знание в отрасли, и поэтому часто реализуется неправильно.
🧑💻 Поэтому, чтобы регулировать звук корректно, используйте
logarithmicVolume
, как на скриншоте.@iOS Dev
Как создать gradient borders в UIKit?
🛠 Filip Němeček показывает, как при помощи одного расширения для UIImage можно реализовать собственный GradientBorderView.
🛠 Filip Němeček показывает, как при помощи одного расширения для UIImage можно реализовать собственный GradientBorderView.
Предотвращаем гонки данных в Swift, используя actors
😱 Гонки данных — худший кошмар всех разработчиков! Их трудно обнаружить, они очень непредсказуемы, и их крайне сложно исправить. Apple предоставила разработчикам различные инструменты, такие как NSLock и последовательные очереди, чтобы предотвратить возникновение гонок данных во время выполнения, однако ни один из них не способен уловить условия гонки во время компиляции. С выходом Swift 5.5 это больше не проблема, как заявляет автор.
📖 В статье рассматривается, как возникает гонка данных при использовании очередей диспетчеризации и асинхронных задач. После этого автор рассказывает, как actors могут помочь нам выявить условия гонки в нашем коде и предотвратить их возникновение раз и навсегда.
😱 Гонки данных — худший кошмар всех разработчиков! Их трудно обнаружить, они очень непредсказуемы, и их крайне сложно исправить. Apple предоставила разработчикам различные инструменты, такие как NSLock и последовательные очереди, чтобы предотвратить возникновение гонок данных во время выполнения, однако ни один из них не способен уловить условия гонки во время компиляции. С выходом Swift 5.5 это больше не проблема, как заявляет автор.
📖 В статье рассматривается, как возникает гонка данных при использовании очередей диспетчеризации и асинхронных задач. После этого автор рассказывает, как actors могут помочь нам выявить условия гонки в нашем коде и предотвратить их возникновение раз и навсегда.
This media is not supported in your browser
VIEW IN TELEGRAM
Повторяем Apple Photos (и анимации), используя Compositional Layout
📷 Приложение Photos получило довольно большое обновление ещё в iOS 13, и там появились шикарные плавные анимации и переходы при переключении между представлениями "Годы, месяцы, дни" и между всеми фото. Автор решил попробовать реализовать это с помощью Compositional Layout и Diffable Data Source.
📖 В этом посте показано, как реализуется переключение по месяцам и разделом "Все фотографии". А ниже приведен готовый пример в качестве мотивации🙂.
🛠Суть туториала в том, чтобы показать, как подходить к таким макетам, как делить их на отдельные задачи и как переходить между совершенно разными состояниями.
📷 Приложение Photos получило довольно большое обновление ещё в iOS 13, и там появились шикарные плавные анимации и переходы при переключении между представлениями "Годы, месяцы, дни" и между всеми фото. Автор решил попробовать реализовать это с помощью Compositional Layout и Diffable Data Source.
📖 В этом посте показано, как реализуется переключение по месяцам и разделом "Все фотографии". А ниже приведен готовый пример в качестве мотивации🙂.
🛠Суть туториала в том, чтобы показать, как подходить к таким макетам, как делить их на отдельные задачи и как переходить между совершенно разными состояниями.
На своей работе я пишу защищённый мессенджер, поэтому вопросы секьюрности стоят особенно остро.
Любые источники информации в российском сегменте на вес золота, поэтому я хочу поделиться с вами отличным ресурсом про безопасность мобильных приложений.
Его ведёт Юрий — основатель платформы анализа защищенности мобильных приложений iOS и Android. Среди материалов, например, можно прочитать про то, зачем нужен SSL Pinning, какие бывают типы и как проверять сертификаты. Можно узнать и про то, как находят уязвимости при некорректной реализации или как обходят его в iOS.
📖 Если вы ищете уникальную инфу про расшифровку IPA-файлов, то тут можно прочесть, какие есть варианты.
Автор очень тщательно подходит к выбору тем и тем более здорово, что пишет о своих исследованих на хабре. Например, в свежем материале про App Transport Security рассказывается, зачем это нужно, использовать ли его или отключать в приложениях, в чем его польза и многое другое.
Любые источники информации в российском сегменте на вес золота, поэтому я хочу поделиться с вами отличным ресурсом про безопасность мобильных приложений.
Его ведёт Юрий — основатель платформы анализа защищенности мобильных приложений iOS и Android. Среди материалов, например, можно прочитать про то, зачем нужен SSL Pinning, какие бывают типы и как проверять сертификаты. Можно узнать и про то, как находят уязвимости при некорректной реализации или как обходят его в iOS.
📖 Если вы ищете уникальную инфу про расшифровку IPA-файлов, то тут можно прочесть, какие есть варианты.
Автор очень тщательно подходит к выбору тем и тем более здорово, что пишет о своих исследованих на хабре. Например, в свежем материале про App Transport Security рассказывается, зачем это нужно, использовать ли его или отключать в приложениях, в чем его польза и многое другое.
Telegram
Mobile AppSec World
Новости из мира безопасности мобильных приложений, а так же интересные статьи, обзоры инструментов, доклады, митапы и многое другое...
По всем вопросам - @Mr_R1p
По всем вопросам - @Mr_R1p
Как определить, что включён режим энергосбережения?
🔋 Если пользователь включил режим низкого энергопотребления, вероятно, нам стоить избежать задач, требующих больших затрат процессора.
Система не только не сможет предоставить нужные ресурсы, но и мы сможем помочь помочь батарее прослужить дольше.
Есть два способа проверки режима низкого энергопотребления.
🛠 Первый — проверять свойство, когда нам нужно.
🛠 Второй — использовать NotificationCenter.
🔋 Если пользователь включил режим низкого энергопотребления, вероятно, нам стоить избежать задач, требующих больших затрат процессора.
Система не только не сможет предоставить нужные ресурсы, но и мы сможем помочь помочь батарее прослужить дольше.
Есть два способа проверки режима низкого энергопотребления.
🛠 Первый — проверять свойство, когда нам нужно.
🛠 Второй — использовать NotificationCenter.
This media is not supported in your browser
VIEW IN TELEGRAM
Внедрение тёмного режима в приложение с помощью Observations Protocols в Swift
Конечно, существует множество подходов ко внедрению тёмной темы в приложение.
И, скорее всего, вам уже приходилось реализовать динамическую смену отображения.
📖 В этой статье рассматривается способ достижения того, что показано в GIF выше.
🛠 А если вам нужен сразу код, и не хочется читать, то он доступен на Github.
Конечно, существует множество подходов ко внедрению тёмной темы в приложение.
И, скорее всего, вам уже приходилось реализовать динамическую смену отображения.
📖 В этой статье рассматривается способ достижения того, что показано в GIF выше.
🛠 А если вам нужен сразу код, и не хочется читать, то он доступен на Github.
‼️Visa и Stripe приостановили обслуживание виртуальных карт Bankoff из-за наплыва пользователей из России. Деньги клиентов заморожены.
Многие пользователи использовали сервис для оплаты аккаунтов зарубежных сервисов, в том числе и учётной записи Apple Developer.
— Карты Bankoff временно не поддерживаются для любых переводов, а средства клиентов заморожены на американском счёте, сообщили в компании.
— Представители BankOff заявили, что делают всё возможное, чтобы решить проблему.
— Россияне начали открывать виртуальные карты Bankoff для проведения платежей за рубеж после того, как Visa и Mastercard приостановили работу в РФ.
Источник: vc.
Многие пользователи использовали сервис для оплаты аккаунтов зарубежных сервисов, в том числе и учётной записи Apple Developer.
— Карты Bankoff временно не поддерживаются для любых переводов, а средства клиентов заморожены на американском счёте, сообщили в компании.
— Представители BankOff заявили, что делают всё возможное, чтобы решить проблему.
— Россияне начали открывать виртуальные карты Bankoff для проведения платежей за рубеж после того, как Visa и Mastercard приостановили работу в РФ.
Источник: vc.
Простой способ установки и переключения между разными версиями Xcode
🧑💻 Для этого может помочь опенсорсное решение Xcodes.app
Что умеет?
— Все доступные версии Xcode из данных Xcode Releases.
— Установка любой версии Xcode, полностью автоматизированная от начала до конца. Xcodes использует aria2, которая использует до 16 соединений для загрузки, что в 3-5 раз быстрее, чем URLSession.
— Автоматическая установка новых релизов!
— Удобный выбор активной версии.
— Наглядная информация о совместимости, включенные SDK и многое другое.
— Поддерживается темный/светлый режим.
☑️ Кстати, есть и консольная версия.
⭐️2900 на Github.
🧑💻 Для этого может помочь опенсорсное решение Xcodes.app
Что умеет?
— Все доступные версии Xcode из данных Xcode Releases.
— Установка любой версии Xcode, полностью автоматизированная от начала до конца. Xcodes использует aria2, которая использует до 16 соединений для загрузки, что в 3-5 раз быстрее, чем URLSession.
— Автоматическая установка новых релизов!
— Удобный выбор активной версии.
— Наглядная информация о совместимости, включенные SDK и многое другое.
— Поддерживается темный/светлый режим.
☑️ Кстати, есть и консольная версия.
⭐️2900 на Github.
Как группировать пользовательские уведомления в iOS?
🔊Если ваше приложение показывает уведомления, которые можно разделить на группы — например, сообщения от человека, обновления новостей, результаты спортивного матча и так далее - вы можете заставить iOS сгруппировать их вместе, используя свойства
ℹ️ Тогда iOS будет показывать эти сообщения вместе, а не в длинной цепочке вперемешку с другими сообщениями.
Если вам нужна дополнительная кастомизация, то можно использовать
🔔 И тогда iOS покажет что-то вроде «ещё 5 оповещений от канала iOS Dev».
🔊Если ваше приложение показывает уведомления, которые можно разделить на группы — например, сообщения от человека, обновления новостей, результаты спортивного матча и так далее - вы можете заставить iOS сгруппировать их вместе, используя свойства
threadIdentifier
и summaryArgument
в UNMutableNotificationContent
. ℹ️ Тогда iOS будет показывать эти сообщения вместе, а не в длинной цепочке вперемешку с другими сообщениями.
threadIdentifier
— не будет показан пользователям, но это позволит iOS знать, что уведомления должны быть сгруппированы вместе. Если вы, например, делаете аналог Telegram или WhatsApp, то можно использовать ID пользователя (но не имя, которое может быть неуникальным).Если вам нужна дополнительная кастомизация, то можно использовать
summaryArgument
— эта строка будет показана пользователям.🔔 И тогда iOS покажет что-то вроде «ещё 5 оповещений от канала iOS Dev».
Как сделать так, чтобы ваше приложение открывали чаще?
Сергей Москвин первым внимание на проблему у Яндекса год назад, после чего они исправились.
💬 Если у пользователя множество разных приложений, то скорее всего, на первом экране он разместит самые важные. А остальными будет пользоваться с помощью поиска.
Для этого могут помочь ключевые слова.
🔎Они легко добавляются, если вы уже поддерживаете Handoff, то есть бесшовное переключение юзера между разными своими Apple-устройствами, или Siri Shortcuts. Достаточно лишь проставить свойство keywords для объекта NSUserActivity, с которым вы и так работаете.
Например:
На более серьёзном уровне это можно реализовать, используя
ℹ️ Важный момент.
Стоит учитывать количество ключевых слов. Чем их больше — тем приложение будет ниже в выдаче.
Авито, сделайте, пожалуйста, чтобы я мог вас найти, вбив Avito.
Сергей Москвин первым внимание на проблему у Яндекса год назад, после чего они исправились.
💬 Если у пользователя множество разных приложений, то скорее всего, на первом экране он разместит самые важные. А остальными будет пользоваться с помощью поиска.
Для этого могут помочь ключевые слова.
🔎Они легко добавляются, если вы уже поддерживаете Handoff, то есть бесшовное переключение юзера между разными своими Apple-устройствами, или Siri Shortcuts. Достаточно лишь проставить свойство keywords для объекта NSUserActivity, с которым вы и так работаете.
Например:
let activity = NSUserActivity(activityType: typeID)
activity.keywords = ["слово", "или даже ключевая фраза"]
На более серьёзном уровне это можно реализовать, используя
CoreSpotlight
.ℹ️ Важный момент.
Стоит учитывать количество ключевых слов. Чем их больше — тем приложение будет ниже в выдаче.
Авито, сделайте, пожалуйста, чтобы я мог вас найти, вбив Avito.
iOS Keychain: использование ключей, хранящихся в Secure Enclave
📲 Одной из замечательных аппаратных особенностей iPhone является Secure Enclave — аппаратный элемент, предназначенный для защиты конфиденциальных данных, включая биометрические: отпечатки пальцев, если устройство поддерживает Touch ID, и сканирование лица в случае Face ID.
Secure Enclave гарантирует сохранность таких данных, даже если хакер получит доступ к оперативной памяти или дисковому хранилищу.
🔐 ОС или программа может взаимодействовать с Secure Enclave с помощью специальных команд, который не позволяет получить доступ к необработанным данным.
В публикации на Medium рассматривается:
— Генерация и получение ключей.
— Алгоритмы шифрования и дешифрования.
— Как это работает в крипто-API Apple.
— Механизм для подписания и проверки подлинности.
😅Не стоит бояться констант вида:
📖 Рекомендую материал для расширения вашей базы знаний о безопасности.
📲 Одной из замечательных аппаратных особенностей iPhone является Secure Enclave — аппаратный элемент, предназначенный для защиты конфиденциальных данных, включая биометрические: отпечатки пальцев, если устройство поддерживает Touch ID, и сканирование лица в случае Face ID.
Secure Enclave гарантирует сохранность таких данных, даже если хакер получит доступ к оперативной памяти или дисковому хранилищу.
🔐 ОС или программа может взаимодействовать с Secure Enclave с помощью специальных команд, который не позволяет получить доступ к необработанным данным.
В публикации на Medium рассматривается:
— Генерация и получение ключей.
— Алгоритмы шифрования и дешифрования.
— Как это работает в крипто-API Apple.
— Механизм для подписания и проверки подлинности.
😅Не стоит бояться констант вида:
kSecKeyAlgorithmECIESEncryptionCofactorVariableIVX963SHA256AESGCM
📖 Рекомендую материал для расширения вашей базы знаний о безопасности.
Практическое руководство по бинарным операциям с использованием типа UInt8 в Swift
🤔 Вы должны знать, что размер типов Int и UInt может отличаться на разных платформах (32 бита vs 64 бита). Сама Apple рекомендует всегда отдавать предпочтение общему типу Int перед всеми остальными вариантами.
В большинстве случаев вас не будет волновать длина целочисленных типов. Можно сказать, что Int и UInt довольно часто являются лучшим выбором при написании Swift-кода.
ℹ️ За исключением тех случаев, когда ваша цель — написать чрезвычайно экономичный по памяти или низкоуровневый код...
📖 В статье рассматривается, как можно выполнять различные преобразования с использованием нескольких битов.
🤔 Вы должны знать, что размер типов Int и UInt может отличаться на разных платформах (32 бита vs 64 бита). Сама Apple рекомендует всегда отдавать предпочтение общему типу Int перед всеми остальными вариантами.
В большинстве случаев вас не будет волновать длина целочисленных типов. Можно сказать, что Int и UInt довольно часто являются лучшим выбором при написании Swift-кода.
ℹ️ За исключением тех случаев, когда ваша цель — написать чрезвычайно экономичный по памяти или низкоуровневый код...
📖 В статье рассматривается, как можно выполнять различные преобразования с использованием нескольких битов.
🛠 Преобразование
🤔 Для его реализации может возникнуть соблазн преобразовать
🙅♂️ Недостатком такого подхода является то, что при этом не сохранится порядок, что явно нежелательно.
🆗 Используя
Sequence
с целью удаления всех содержащихся в ней дубликатов — это классический случай использования. 🤔 Для его реализации может возникнуть соблазн преобразовать
Sequence
в Set
, а затем обратно в Array
. 🙅♂️ Недостатком такого подхода является то, что при этом не сохранится порядок, что явно нежелательно.
🆗 Используя
reduce()
, можно обеспечить краткую реализацию, сохраняющую порядок, как на скриншоте.Итерация объектов с помощью метода
Однако есть одно ограничение:
Вдохновившись реализацией
forEach(_:)
является отличной альтернативой классическому циклу for
. Однако есть одно ограничение:
forEach(_:)
не позволяет остановить перебор элементов на полпути.Вдохновившись реализацией
Objective-C
, мы можем написать расширение, которая позволит остановить этот процесс, если необходимо.Не нравится Xcode? Переходите на Android Studio Улучшайте его, используя расширения!
🧑💻 Xcode — наш основной инструмент для разработки.
Хотя он хорошо интегрирован в большинство рабочих процессов разработки, время от времени вам может не хватать некоторых базовых функций.
📖 В этой статье вы узнаете, как создать
ℹ️ И хотя процесс создания расширения на первый взгляд может показаться сложной задачей, после изучения XcodeKit, возможно, вы посмотрите на это под другим углом.
🧑💻 Xcode — наш основной инструмент для разработки.
Хотя он хорошо интегрирован в большинство рабочих процессов разработки, время от времени вам может не хватать некоторых базовых функций.
📖 В этой статье вы узнаете, как создать
Xcode Source Editor Extension
, которое добавляет некоторые дополнительные функции в нашу среду разработки.ℹ️ И хотя процесс создания расширения на первый взгляд может показаться сложной задачей, после изучения XcodeKit, возможно, вы посмотрите на это под другим углом.
‼️К слову, про Android (не очень позитивные новости)
Коллеги сообщили сегодня, что появилась страница, в которой сказано буквально следующее:
В рамках мер по обеспечению соответствия требованиям Google Play блокирует загрузку платных приложений и обновлений для платных приложений в России с 5 мая 2022 года.
Больше информации об этом здесь.
Не хотелось бы, чтобы корпорация Apple пошла по этому пути.
Коллеги сообщили сегодня, что появилась страница, в которой сказано буквально следующее:
В рамках мер по обеспечению соответствия требованиям Google Play блокирует загрузку платных приложений и обновлений для платных приложений в России с 5 мая 2022 года.
Больше информации об этом здесь.
Не хотелось бы, чтобы корпорация Apple пошла по этому пути.
Нет никакой документации или хотя бы сессий WWDC, которые рассказывали бы о таких изменениях в iOS 15. Но можно использовать реверс-инжиниринг, чтобы понять, что в Apple изменили и помогает ли это вашим приложениям. И если да, то как именно?
📖 Отличная статья о том, что именно управляет запуском приложений.
Кстати, вот ряд советов, которые помогут вам ускорить этот процесс:
1️⃣ Уменьшите число динамических фреймворков.
2️⃣ Уменьшите размер приложения в целом.
3️⃣ Вынесите код из +load и статических инициализаторов.
4️⃣ Отложите работу до отрисовки первого фрейма.
@iOS Dev
📖 Отличная статья о том, что именно управляет запуском приложений.
Кстати, вот ряд советов, которые помогут вам ускорить этот процесс:
1️⃣ Уменьшите число динамических фреймворков.
2️⃣ Уменьшите размер приложения в целом.
3️⃣ Вынесите код из +load и статических инициализаторов.
4️⃣ Отложите работу до отрисовки первого фрейма.
@iOS Dev