iOS Dev
7.51K subscribers
939 photos
64 videos
1 file
1.06K links
🍏Канал об iOS-разработке, необычных подходах и решениях.
👨‍💻Автор: Виктор Грушевский (@Viktorianec)
Темы:
⭐️ Подготовка к собеседованиям.
⭐️ Архитектуры и алгоритмы.
⭐️ Код. Много кода.

⚒️База знаний: https://boosty.to/ios_dev

#ios #mobile #swift
加入频道
Как отследить процесс установки Xcode?

Готов спорить, что хотя бы раз за всю историю обновлений из App Store вам казалось, что всё, установка остановилась, не идёт, и вообще — лучше перезагрузить и попробовать заново!

Так вот, есть способ, проверить так ли это на самом деле.

Четыре скриншота, 10 секунд на открытие и ситуация вновь под контролем присмотром.

Сохраните, чтобы не забыть!
Решение загадочных проблем с разлогиниванием пользователей в iOS 15

🤔 Интересная проблема, которую, я надеюсь, вы не встречали и не повстречаете.

💻 В моём рабочем проекте была похожая история ещё до iOS 15, но само исследование привело к похожим выводам.

Тут об этом больше информации.
9 способов прокачать производительность Swift-приложения

Optimization Level в Build Settings. Увеличится размер билда.

— Используйте final и private для методов и классов. Ограничения: работа с подклассами и диспетчеризацией.

— Избегайте print в релизных билдах.

Последовательный код. Когда вы добавляете новую функцию, вы форсите Swift использовать таблицу виртуализации для динамического выполнения вашего кода.
Этот пункт всегда компромисс между производительностью и чистым кодом.

— Используйте withUnsafeBufferPointer при переборе массива. Что плохого? Безопасность.

ContiguousArray. Вставка может замедлиться.

— Используйте Values (Structs), а не References (Classes) для Array. Ограничения могут быть в зависимости от ваших структур.

— Используйте Linked List вместо Array. Cортировка или поиск могут замедлиться.

— Ограничьте Protocols классами везде, где только возможно. Расплата — в «ограничениях».

Детально по каждому пункту тут (1.2k 👏).

@iOS Dev
Туториал по созданию приложения Wordle

В двух словах, что это такое:

Это игра, в которой вам нужно угадать слово из 5 букв за 6 попыток.

Ее название - это комбинация слова «Word» и второго имени парня, который придумал эту игру и разработал оригинальную версию: Джош Уордл.

📖Автор рассказывает и показывает, как можно реализовать аналог этой игры.

🛠Исходный код: github.

@iOS Dev
🤔 Почему ваше приложение могут не пропустить или даже удалить из App Store?

Собрал список частых причин, как делать не надо. Некоторые из них основаны и на личном опыте, о других вы могли слышать, или даже использовали сами.

1️⃣ Предлагать пользователям делать покупки на вашем сайте.

Пункт правил 3.1.3. Если ваше приложение позволяет людям покупать физические товары или услуги, которые будут потребляться за пределами приложения, вы должны использовать для сбора платежей другие способы покупки, кроме покупки в приложении, например, Apple Pay или кредитную карту.

2️⃣ Скрытие функций приложения на ревью и включение их с помощью, например, серверных изменений

Пункт правил 2.3.1. Не включайте в свое приложение никаких скрытых или недокументированных функций.

3️⃣ Реклама в push-уведомлениях или в виджетах

Пункт правил 3.2.2 — если вкратце, монетизация Push-уведомлений недопустима.
Есть нюанс в 4.5.4, где Apple говорит, что push-уведомления не должны использоваться для рекламных акций или в целях прямого маркетинга, если только клиенты не дали явного согласия.

4️⃣ Включение сторонней аналитики в приложения «для детей»
Пункт правил 1.3 говорит об этом явно

5️⃣ Сбор несанкционированных данных пользователей

В пункте правил 5.1.1. сообщается явно о том, что приложение должно собирать только информацию, необходимую для выполнения задачи.
Не стоит собирать, например, пароли кредитных карт чтобы пройти уровень.

6️⃣ Принуждение для включения трекинга. Для, например, разблокировки каких-то опций.

Пункт правил 3.2.2. Нельзя, например, выпрашивать рейтинг или включать трекинг для получения дополнительного контента.

7️⃣ Использование цифрового отпечатка устройства вместо IDFA для целей отслеживания

Отпечатки устройства или fingerprint - это идентификация устройства по его характеристикам: местоположению, данных устройства, языку и многому другому. На десктопах это проще сделать, чем на мобильных устройствах, но точность может составлять от 80% до высоких 90%.

8️⃣ Предложение спорного или даже потенциально опасного продукта

Пункт правил 1.4.3 говорит об этом явно и включает в себя, например, продукты с табаком или алкоголем.

9️⃣ Безумные цены, неадекватные продукту.

Вспомните, было приложение, за 1 000 долларов, которое называлось "я богат" или как-то так. Его удалили из апп стор, но потом вернули за 8.99. Хотя теперь можно сказать, что название приложения вводит в заблуждение.

🔟 Использование приватного API

Пункт правил 2.5.1 говорит именно об этом. Хотя одна из возможных причин, по которым форсили обновление приложений, то, что некоторые API со временем становятся deprecated.

Более развёрнуто можно прочесть на хабре.

@iOS Dev
Как создавать fluid-интерфейсы для iOS?

Что такое fluid-интерфейсы?

Fluid интерфейс также можно назвать «быстрым», «плавным», «естественным», или «волшебным». Это когда чувствуешь, что тут всё как надо.

📖 Nathan Gitter в монументальном туториале показывает на примерах, как их можно реализовать.

Восемь интерфейсов — каждый достоин того, чтобы уделить внимание реализации.

26 000 👏 на Medium.

@iOS Dev
Логарифмический контроль громкости

🔊Нашёл замечательный факт от Давида Кордеро.

Представьте, вы смотрите видео в тихой обстановке, установили минимальную громкость, а она всё равно громкая. Поэтому вы пытаетесь уменьшить её, жмёте кнопку... Иии, теперь звука вообще нет. Ну что, жизненно?😄

Или, например, в другой день вы на вечеринке слушаете музыку, но поменяв со 100 до 80% разницы практически нет.

🤔 Как такое возможно, в первом случае одним нажатием мы выключили звук, а во втором случае ничего не изменилось?

Причина в разнице между реализацией громкости и восприятием для наших ушей.

Регуляторы громкости часто реализуются линейно, но наше ухо воспринимает громкость логарифмически.

Это известный факт для аудиоинженеров, использующих децибелы (дБ) для логарифмического восприятия звука.

Поработав на ТВ Давид сделал вывод, что это непопулярное знание в отрасли, и поэтому часто реализуется неправильно.

🧑‍💻 Поэтому, чтобы регулировать звук корректно, используйте logarithmicVolume, как на скриншоте.

@iOS Dev
Как создать gradient borders в UIKit?

🛠 Filip Němeček показывает, как при помощи одного расширения для UIImage можно реализовать собственный GradientBorderView.
Предотвращаем гонки данных в Swift, используя 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.

📖 В этом посте показано, как реализуется переключение по месяцам и разделом "Все фотографии". А ниже приведен готовый пример в качестве мотивации🙂.

🛠Суть туториала в том, чтобы показать, как подходить к таким макетам, как делить их на отдельные задачи и как переходить между совершенно разными состояниями.
На своей работе я пишу защищённый мессенджер, поэтому вопросы секьюрности стоят особенно остро.

Любые источники информации в российском сегменте на вес золота, поэтому я хочу поделиться с вами отличным ресурсом про безопасность мобильных приложений.

Его ведёт Юрий — основатель платформы анализа защищенности мобильных приложений iOS и Android. Среди материалов, например, можно прочитать про то, зачем нужен SSL Pinning, какие бывают типы и как проверять сертификаты. Можно узнать и про то, как находят уязвимости при некорректной реализации или как обходят его в iOS.

📖 Если вы ищете уникальную инфу про расшифровку IPA-файлов, то тут можно прочесть, какие есть варианты.

Автор очень тщательно подходит к выбору тем и тем более здорово, что пишет о своих исследованих на хабре. Например, в свежем материале про App Transport Security рассказывается, зачем это нужно, использовать ли его или отключать в приложениях, в чем его польза и многое другое.
Как определить, что включён режим энергосбережения?

🔋 Если пользователь включил режим низкого энергопотребления, вероятно, нам стоить избежать задач, требующих больших затрат процессора.

Система не только не сможет предоставить нужные ресурсы, но и мы сможем помочь помочь батарее прослужить дольше.

Есть два способа проверки режима низкого энергопотребления.

🛠 Первый — проверять свойство, когда нам нужно.

🛠 Второй — использовать NotificationCenter.
This media is not supported in your browser
VIEW IN TELEGRAM
Внедрение тёмного режима в приложение с помощью Observations Protocols в Swift

Конечно, существует множество подходов ко внедрению тёмной темы в приложение.

И, скорее всего, вам уже приходилось реализовать динамическую смену отображения.

📖 В этой статье рассматривается способ достижения того, что показано в GIF выше.

🛠 А если вам нужен сразу код, и не хочется читать, то он доступен на Github.
‼️Visa и Stripe приостановили обслуживание виртуальных карт Bankoff из-за наплыва пользователей из России. Деньги клиентов заморожены.

Многие пользователи использовали сервис для оплаты аккаунтов зарубежных сервисов, в том числе и учётной записи Apple Developer.

— Карты Bankoff временно не поддерживаются для любых переводов, а средства клиентов заморожены на американском счёте, сообщили в компании.

— Представители BankOff заявили, что делают всё возможное, чтобы решить проблему.

— Россияне начали открывать виртуальные карты Bankoff для проведения платежей за рубеж после того, как Visa и Mastercard приостановили работу в РФ.

Источник: vc.
Простой способ установки и переключения между разными версиями Xcode

🧑‍💻 Для этого может помочь опенсорсное решение Xcodes.app

Что умеет?

— Все доступные версии Xcode из данных Xcode Releases.

— Установка любой версии Xcode, полностью автоматизированная от начала до конца. Xcodes использует aria2, которая использует до 16 соединений для загрузки, что в 3-5 раз быстрее, чем URLSession.

— Автоматическая установка новых релизов!

— Удобный выбор активной версии.

— Наглядная информация о совместимости, включенные SDK и многое другое.

— Поддерживается темный/светлый режим.

☑️ Кстати, есть и консольная версия.

⭐️2900 на Github.
Как группировать пользовательские уведомления в iOS?

🔊Если ваше приложение показывает уведомления, которые можно разделить на группы — например, сообщения от человека, обновления новостей, результаты спортивного матча и так далее - вы можете заставить iOS сгруппировать их вместе, используя свойства threadIdentifier и summaryArgument в UNMutableNotificationContent.

ℹ️ Тогда iOS будет показывать эти сообщения вместе, а не в длинной цепочке вперемешку с другими сообщениями.

threadIdentifier — не будет показан пользователям, но это позволит iOS знать, что уведомления должны быть сгруппированы вместе. Если вы, например, делаете аналог Telegram или WhatsApp, то можно использовать ID пользователя (но не имя, которое может быть неуникальным).

Если вам нужна дополнительная кастомизация, то можно использовать summaryArgument — эта строка будет показана пользователям.

🔔 И тогда iOS покажет что-то вроде «ещё 5 оповещений от канала iOS Dev».
Как сделать так, чтобы ваше приложение открывали чаще?

Сергей Москвин первым внимание на проблему у Яндекса год назад, после чего они исправились.

💬 Если у пользователя множество разных приложений, то скорее всего, на первом экране он разместит самые важные. А остальными будет пользоваться с помощью поиска.

Для этого могут помочь ключевые слова.

🔎Они легко добавляются, если вы уже поддерживаете Handoff, то есть бесшовное переключение юзера между разными своими Apple-устройствами, или Siri Shortcuts. Достаточно лишь проставить свойство keywords для объекта NSUserActivity, с которым вы и так работаете.

Например:

let activity = NSUserActivity(activityType: typeID)
activity.keywords = ["слово", "или даже ключевая фраза"]


На более серьёзном уровне это можно реализовать, используя CoreSpotlight.

ℹ️ Важный момент.

Стоит учитывать количество ключевых слов. Чем их больше — тем приложение будет ниже в выдаче.

Авито, сделайте, пожалуйста, чтобы я мог вас найти, вбив Avito.