Мобильный кот
2.72K subscribers
88 photos
3 videos
2 files
87 links
Все, что считаю важным про жизнь мобильного разработчика

Шкаф с материалами
https://t.me/cat_with_mobile_cabinet
Download Telegram
🧹Чистим место на вашем mac

- Разрабатываете и постоянно кончается место?
- Не хватает пространства для обновления Xcode?
- У вас 128 ГБ места на ноуте?
- Просто напрягает серое "Другое" (см. скрин)?

Тогда этот пост для вас.

1️⃣ Нажмите кнопку "Управлять" в  -> "Об этом Mac" -> "Хранилище" (см. рисунок). В этом окне отобразятся различные массивные файлы, а так же другие данные (по категориям), которые можно удалить. Особое внимание обратите на раздел "Разработчик", где вы сможете удалить кэши Xcode, архивы проектов, ненужные версии iOS (и других систем) для симуляторов. А это обычно - десятки гигабайт.

2️⃣ Удаляем "Мусор" от Xcode, а это архивы сборок проектов, Derived Data и многое другое, накопившеся в процессе разработки. Для этого прекрасно подходит утилита DevCleaner for Xcode. В ней же можно удалить и ненужные версии симуляторов.
Ну или делаем руками:
- открываем Xcode -> Window -> Organizer для удаления архивов сборок
- удаляем все в папке Library / Developer / Xcode / DerivedData
- удаляем старое в папке Library / Developer / Xcode / Archives
- удаляем старое в папке Library / Developer / Xcode / iOS DeviceSupport

3️⃣ Изучите состав папок, имеющих большой объем. Для этого можно использовать Файлоскоп в CleanMyMac или бесплатную OmniDiskSweeper.
Обычно вашего внимания достойны:
- Library / Application Support
- Library / Developer
- Library / Caches
- Library / Logs
- Downloads

Например Wargaming и Steam хранят свои игры именно в Application Support, а отображаются в том самом "Другое".

4️⃣ Запустите очистку мусора с помощью CleanMyMac или аналога.

Если знаете что-то еще, то пишите ответом на это сообщение.

Другие полезные инструменты ищите по хэштегу #инструменты
TestFlight. Как отключить запрос о соответствии экспортным требования

Каждый раз выкладывая приложения приходится заходить в AppStore Connect и нажимать "Нет" в этом окне (см. рис.), чтобы выложить приложение? А его очень просто отключить.

Для этого в Info.plist создайте ключ App Uses Non-Exempt Encryption со значением NO. После этого все сборки будут автоматически становиться доступными для пользователей.

За подсказку спасибо @Higderin

Другие советы по тегу #xcode
🔧LLDB - это низкоуровневый отладчик (debugger), входящий в состав базового элемента компилятора Swift - LLVM. Многие из нас создают программы не зная о том, что могут использовать его возможности при отладке, об этом мы сегодня и поговорим. LLDB имеет множество команд, которые можно использовать прямо в консоли Xcode.

Как только вы приостановили выполнение приложения (например по сработавшему брейкпоинту), в консоли появляется надпись (lldb), сообщаяющая, что вы можете вводить требуемые команды.

1️⃣Вывод значения параметра
Команды print и po, например
(lldb) po UIApplication.shared.delegate.someGlobalSet

При этом в консоли будет выведена полная структура объекта. Команды po и print имею немного отличающийся формат вывода.
po ...
▿ 2 elements
- 0 : 5
- 1 : 6

print ...
(Set<Int>) $R7 = 2 values {
[0] = 5
[1] = 6
}

2️⃣Изменение значение параметра прямо в ходе исполнения
Команды expression и e, например
(lldb) e parameterName = someValue

Эта команда позволит изменить значение параметра parameterName на someValue. При этом прямо в консоли присутсвует автодополнение, а также происходит проверка типов и изменяемости параметров.

Данная команда поддеживает различные флаги, позволяющие значительно расширить ее функциональность.

3️⃣Текущий состав фрейма стека текущего потока
Команда frame, например
(lldb) frame variable

Просто выводит простыню-структуру текущего фрейма (если не помните, что это, то читайте про стек, кучу и память).

Эти команды лишь для затравки вашего интереса. LLDB предоставлет стооолько всего интересно, что я настоятельно рекомендую вам продолжить знакомтсво с ним самостоятельно. Например с помощью этой статьи или этого видео.

Другие полезные штуки по хэштегам #xcode #инструменты #пишемхорошийкод
Что такое универсальные приложения? У этого понятия, с точки зрения iOS-разработчика, есть два определения:

1) Приложения, которые могут работать не нескольких архитектурных решениях (различных устройствах, операционных системах и т.д.). Например, это единое для iOS, iPadOS и macOS приложение. Это круто, но об этом не сегодня.

2) Приложения, пользователем которого может стать человек вне зависимости от региональных и физических особенностей. И именно об этом я хотел бы сказать несколько слов.

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

При создании универсальных приложений вы решаете три вопроса:

Вопрос 1. Локализация - это поддержка приложением нескольких языков. Некоторые относят сюда и часовые пояса/календари, но нет, так как есть ...

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

Решение двух этих вопросов позволит вам значительно расширить аудиторию приложения, а значит и потенциально повысит продажи.

Немного подробнее об этом можете прочитать в моем гите.

Вопрос 3 - Доступность (Accessibilities). На этом я бы хотел заострить ваше внимание. Крайне важно, чтобы вы создавали универсальные приложения, доступные людям с (не)ограниченными возможностями, например слепым. Более того, для этого достаточно лишь немного предварительно продумать структуру интерфейса и воспользоваться доступными из коробки средствами.

Более того, поддежка механизмов доступности позволит вам:
- исключить излишнюю перегруженность интерфейса (если вы не можете добраться до элемента с помощью встроенного в iOS механизма доступности, то вероятно структура интерфейса слишком перегружена);
- подготовить приложение к UI-тестам, так как для их реализации требуется использование механизмов Accessibilities.

И вот вам отличный выпуск подкаста Запуск завтра "Как незрячие люди пользуются технологиями и как сделать их доступнее" - о важности того, чтобы ваши приложения были доступными. Рассказывает незрячий пользователь о крутости Яндекс.Такси и ужасном состоянии Яндекс.Go.

Apple Подкасты
Яндекс Музыка
YouTube
🗺 Roadmap - карта тем для начинающего разработчика.

Отличный проект прекрасной статьи от @artyom_ivanov. Пока еще версия 0.1 (как говорит автор), но надеюсь на скорый релиз 1.0 😀

В статье рассказывают про большинство доступных на рынке источников знаний, а так же приводится список тем, знание которых позволит вам приблизить тим-лидство 😃 Очень советую ознакомиться начинающим, а судя по последнему опросу, их тут большинство.

https://artyom.space/swift-roadmap/

#продуктивность
♥️ Практики, используемые в ядре Swift

Я люблю копать исходный код Swift. Конечно же, как нормальный программист, почти ничего там не понимаю, но от этого интерес только возрастает😂.

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

Каждый раз я изобретаю велосипед и:
- то добавляю запятую перед каждым элементов, и в конце удаляю первый символ;
- то наоборот добавляю ее в конце, и потом удаляю последний символ;
- то контролирую номер элемента и добалвяю только там, где это требуется.

Задача тривиальная и никак не уровня "серьезного" разработчика. Но каждый раз я все делаю новым способом. Причем решение данного вопроса изменяется еще и в зависимости от языка, на котором я пишу код.

Сегодня в процессе изучения исходного кода типа Array и работы над разделом по массивам в моем справочнике по Swift на GitHub я наткнулся на довольно изящную реализацию данного вопроса, используемую при вызове свойства description у коллекций:

var result = ""
// ...
var first = true
for item in self {
if first {
first = false
} else {
result += ", "
}
debugPrint(item, terminator: "", to: &result)
}
// ...


Запятая добавляется перед каждым элементом, начиная со второго.

P.S. И что самое интересное, в данном куске кода используется inout - аргумент. Так что не такая уж это и плохая практика, видимо.

А как вы решаете такой тривиальный вопрос в своем коде?

#пишемхорошийкод #swiftcore
🏟Площадки для прокачки навыков программирования

Прошел отпуск, вышел Xcode 13 и Swift 5.5, а значит пора возвращаться к каналу. Скоро мы погрузимся в изучение акторов, новой асинхронки и зароемся в исходный код языка на яблочном гитхабе. А сейчас о другом.

Одним из важнейших этапов в жизненном цикле Swift-разработчика является трудоустройство. Подготовка к собеседованию - особо ценный, сложный и несомненно интересный процесс, в ходе которого вы прокачаете свои навыки.

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

Советую посмотреть каждый из сервисов.

- CoderByte
- Exercism
- Codewars
- CodingGame

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

Знаете и используете другие? Советуйте в комментариях.

Удачного кодинга!👩‍💻👨🏻‍💻🧑🏾‍💻
📕 Кое-что интересное, что сделает ваши приложения лучше.

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

Несколько дней назад я набрел на книгу Михаила Рубанова «Про доступность iOS». В книге очень доступно описываются доступные в iOS механизмы доступности 🙃 (слишком много доступности не бывает!).

Строго рекомендую к ознакомлению и надеюсь рано или поздно увидеть ее в бумажном формате на своей книжной полке.

Михаил, к слову - ведущий iOS-разработчик DoDo Engineering (пишут весь софт для одноименных пиццерий), и у него есть чему поучиться. Он, как никто другой, знает, насколько важно создавать приложения, которым могут пользоваться все, вне зависимости от физического состояния и возможностей.

☕️ P.S. Я пообщался с Михаилом и он проявил интерес к тому, чтобы стать специальным гостем на одной из наших будущих встреч Coffee&Code в Москве. Ждем с нетерпением!

Ссылка на книгу Про доступность iOS

Другие книги можно найти по тегу #книга
🛠 Что там с Xcode 13?

После первой недели работы с обновленной средой, свифтом и китом, могу сказать, что…

😊 Понравилось
- Обновление интерфейса.
- Автоимпорт библиотек в swift-файлы. Стоит только упомянуть UILabel, и среда автоматом добавляет import UIKit. Но какого это не работает с либами, загруженными из SPM и CocoaPods?
- Button Configuration. Прямо кайф

🙃 Не понравилось
- Увеличившееся время сборки проектов.
- Странно работающий автокомплит. Может он и крутой, но я пока его не понял.
- Баги, баги, способные привести к потере части кода, что у меня и произошло. Каким-то неведомым образом Xcode начал сохранять часть файлов не в папку проекта, а вообще в другие папки… Но при этом пока еще не было ни одного внезапного краша.

🧐 Вывод
- Если начал проект на предыдущей версии, то лучше заверши версию там же. Избегай мажорных обновлений до выпуска в прод.
- Новые проекты начинай на Xcode 13, особенно если хочешь пощупать новые возможности языка и iOS SDK.
- Храни и используй 2 версии среды, 12.5.1 для стабильной работы со старыми проектами, и 13 (примерно так делаю я всегда).

Вот вам пару программ, которые помогут в этом
- XcLauncher
- Xcodes

Ну или просто качай одну версию со стора, а другую с портала разработчиков.
👮🏼‍♂️О безопасности iOS 🔐

Общаясь с коллегами и знакомыми, пользователями устройств Apple, я стал замечать интересную тенденцию: многие считают, что «Раз я пользуюсь iPhone и mac, то с точки зрения конфиденциальности данных я в полной безопасности. Утечка невозможна, так как система не взламываема, а все устанавливаемые из AppStore приложения проходят жестокую модерацию». Особенно это заметно видно на фоне последней яблочной рекламной компании “Конфиденциальность. Это про iPhone”.

Но iOS и macOS небезупречны. Прекрасным доказательством этому служит расследование организации Amnesty International, получившее название «Проект Пегас» (почитать можно тут | ENG) или в августовском номере журнала Хакер. Если кратко, то на июль 2021 года даже последняя версия iOS (14.6) может быть взломана без необходимости пользователя совершать какие-либо действия.

Это конечно не значит, что за вами охотятся израильские шпионы 🕵🏻, но это говорит о том, что уязвимости существуют, а с выходом новых версий ПО - появляются новые. При этом неумелые действия пользователей делают ситуацию еще хуже, так как большинству из нас не нужно иметь дыры в защите: мы сами устанавливаем приложения из недоверенных источников и переходим по сомнительным ссылкам. Мы же уверены, что «продукцию Apple невозможно взломать».

В результате ваш компьютер становится частью бот-нета, а ваши близкие подвергаются опасности, так как ваши личные данные сливаются в сеть, объединяются в базы, многократно продаются и в итоге маме вашей подруге тёте Нюре звонят из «полиции», так как ее сын задержан после драки и нужно срочно перевести деньги.

Подобная ситуация была и с моими родителями, и это для людей в возрасте настоящее испытание.

К чему это я.

🥸 Будьте бдительны, минимизируйте количество пиратского ПО, не переходите по сомнительным ссылкам, всегда проверяйте домен, на котором вводите пароль или данные банковской карты.

Ну и будьте просто хорошими людьми 😌. Всем отличного воскресенья
🎨 Релиз SF Symbols 3

В конце сентября вышла финальная версия яблочного «каталога и конструктора символов» SF Symbols 3.

Нововведения доступны для iOS 15, iPadOS 15, macOS Monterey (пока что находится в бете), tvOS 15, и watchOS 8.

- 600+ новых символов.
- Расширенные возможности цветовой кастомизации.
- Прокачанный импорт собственных символов.
- Местами обновленный интерфейс.

Скачиваем тут

👨‍🔬Мое мнение: программа обязательно к ознакомлению и употреблению.

Другие полезные #инструменты
💬Текстовое поле для ввода кода подтверждения из смс или email

В ходе работы над небольшой социалкой Swyzzy потребовалось реализовать поле для ввода кода подтверждения. Посмотрел рынок и нашел простую и симпатичную реализацию в мессенджере Signal.

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

В итоге оформил в качестве SPM-пакета.

📒 Кратко о возможностях:

- Настройка количества блоков и элементов в этих блоках (видите в середине разрыв между блоками?);
- использование как в коде, так и с помощью Interface Builder;

🛠 В общем, если кому потребуется:

- пользуйтесь в качестве готового решения;
- используйте в качестве основы для собственной реализации;
- говорите, что еще требуется, я допилю.

В следующем релизе расширю возможности кастомизации и доступное API. Далее добавлю конфигуратор элементов, с помощью которого можно будет формировать поле любого вида (текстовые префиксы, постфиксы, сепараторы между блоками).

Смотреть тут

#библиотека