easy_dev991
628 subscribers
33 photos
21 videos
3 files
173 links
Делюсь интересными находками/лайфхаками в процессе разработки под iOS, и возможно ты найдешь что-то полезное для себя!

GitHub: https://github.com/easydev991
Download Telegram
#ios #swift #notificationcenter #notification

Недавно в рабочем iOS-приложении перестали сохраняться push-уведомления в CoreData: пользователи не видели историю уведомлений, хотя сами уведомления приходили и отображались на экране телефона корректно.
Проблема проявилась где-то после перехода на новый Xcode 16*, что бы это могло быть? 🤔

Выяснилось, что Notification Service Extension не мог получить доступ к Core Data файлам из-за неправильной настройки Target Membership. Файлы модели данных не были включены в target для extension, поэтому при попытке инициализации Core Data возникала ошибка.
Причем раньше все работало отлично, где-то 4-5 релизов назад 😱

Решение оказалось простым - нужно было добавить Core Data файлы в Target Membership для NotificationService. После этого extension снова смог сохранять уведомления в базу данных.

Скорее всего, неправильная настройка Target Membership возникла при рефакторинге проекта или добавлении новых файлов, а может быть и вовсе при переходе с "групп" на "папки" 🙈
Xcode иногда не добавляет автоматически файлы в нужные targets, особенно при работе с `extension`'ами, которые имеют отдельную конфигурацию.

⚠️ Важно всегда проверять Target Membership при добавлении новых файлов в проект, особенно если они используются в нескольких таргетах.
🔥8
easy_dev991
#ios #swiftui #performance Убираем лишние вычисления body в SwiftUI View
#ios #swiftui #equatable

Наглядный пример использования протокола Equatable, чтобы избавиться от лишних перерисовок вьюхи. На первом видео до исправления, на втором - после.

Вьюха принимает на вход несколько свойств, и ни одно из них не изменяется при нажатии на кнопку "избранного" в навбаре, но по умолчанию вьюха обновляется при изменении этого State-свойства на экране.

Все, что нужно было сделать для исправления проблемы:


struct HTMLContentView: UIViewRepresentable, @preconcurrency Equatable {
static func == (lhs: HTMLContentView, rhs: HTMLContentView) -> Bool {
lhs.infopost == rhs.infopost && lhs.fontSize == rhs.fontSize
}
// остальной код
}


Это первый случай, когда мне пригодился протокол Equatable с момента публикации статьи об этом, и все же он пригодился 👌
🔥52
This media is not supported in your browser
VIEW IN TELEGRAM
#ios #ios26 #swiftui #navigationview #bug #contest

Представляю вашему вниманию очередной баг iOS 26 при работе с NavigationView, который отлично работает на всех версиях iOS, в том числе на iOS 26.

На iOS 26 экран автоматически закрывается при первом вызове любого из menu/picker/confirmationDialog, а вот код этого экрана, и там нет никаких ошибок, и чинить там нечего 🤦‍♂️

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

--------

Позже напишу статью на эту тему, а пока что объявляю мини-конкурс: кто правильно назовет причину возникновения бага в iOS 26, тот молодец 🚀
🔥6
#swift #news

Вчера состоялся превью-релиз Swift SDK для Android, весь анонс и детали можно почитать по ссылке.

Кто знает, вдруг через пару лет можно будет с легкостью разрабатывать андроид-приложения на свифте?)
🔥1
#xcode #bug

В Xcode 26 у меня внезапно сломалась локализация для Info.plist-файла - просто перестали работать строки на русском языке, а на английском все ок.

Почистить кэш, пересоздать файл со строками не помогает.

На скриншоте причина, почему мне завернули очередной релиз приложения с площадками.

Исправляется эта фигня откатом с xcstrings на старый формат strings для локализации Info.plist🙈
😨4❤‍🔥1
easy_dev991
#ios #swiftui #scrollview #scrollviewreader #scrollto Скроллим к нужному элементу
#ios #swiftui #scrollview #scrollto

На днях застрял со скроллом к нужному элементу и думал "что же не так?".
У меня есть список элементов в ForEach, внутри массив с Identifiable-элементами, но scrollTo(id) не работает.

Все оказалось очень просто - нужно явным образом добавить модификатор .id для всех элементов в цикле ForEach.

Потом вспомнил, что у меня уже есть статья на эту тему 😁
5😁5😴1
#xcode #simulator #bug

Вчера обновил Xcode до релизной версии 26.1, и второй день подряд ноут сильно греется и шумит вентиляторами.
В чем же дело?

В "мониторинге активности" там висит ReportCrash, который грузит процессор 140%+.
Но что за краши?

Открыл приложение "консоль", и увидел там десятки отчетов о краше для MercuryPosterExtension (кто бы еще знал, что это).

Вот кусок крашлога:

Coalition: com.apple.CoreSimulator.SimDevice.15175812-BCE6-41D0-B391-CEF8416AE15F [12203]
Responsible Process: SimulatorTrampoline [2600]


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

Так что если вы уже обновились до Xcode 26.1, то рекомендую не использовать симуляторы iOS 26.1 на постоянной основе, иначе есть риск словить постоянную нагрузку на процессор из-за ReportCrash 🤪
8
#ios #swift #swiftui #bug

Угадайте, на каком из скриншотов у нас iOS 26 😁

А вот и код:

struct DemoToolbarOpacity: View {
var body: some View {
NavigationStack {
Color.green.ignoresSafeArea()
.toolbar {
ToolbarItem(placement: .topBarLeading) {
if false {
Button("Left") {
print("tap left button")
}
}
}
ToolbarItem(placement: .topBarTrailing) {
Button("right") {
print("tap right button")
}
.opacity(0)
}
}
}
}
}


Вывод:
В iOS 26 больше нельзя использовать opacity для скрытия кнопки - нужно явным образом закрывать кнопку проверкой if/else 👏
5
#ios #xcode #bug

Любопытная аналитика про размер iOS-приложений, собранных в Xcode 26.0.1 и Xcode 26.1 на примере приложения с площадками для тренировок:
- При сборке из Xcode 26.0.1 приложение весит около 11 мб
- При сборке из Xcode 26.1 приложение весит уже 16.5 мб
- При сборке из Xcode 26.1 после доработок (предстоящий релиз) вес почему-то снизился до 15.5 мб, хотя кода стало больше 🙄

Откуда взялись дополнительные 5 мб, эпл 🤯?
👍4😴2
#ios #swiftui #confirmationdialog #bug

Любопытный баг в SwiftUI при работе с confirmationDialog в навбаре.

Во вложении 2 видео, где я делаю одно и то же действие, но во втором видео диалог появляется повторно без триггера с моей стороны.

Код для первого видео (где все ок):

.toolbar {
if !entries.isEmpty {
ToolbarItem(placement: .topBarTrailing) {
deleteAllButton
}
}
}


Код для второго видео (где баг):

.toolbar {
ToolbarItem(placement: .topBarTrailing) {
if !entries.isEmpty {
deleteAllButton
}
}
}
👍1
#ios #swift #swiftui #bug #binding

Кажется, что разница такая небольшая, но в первом случае сборка успешная, а во втором - сборка падает, и в логах Xcode ничего не показывает, а ведь можно долго и упорно дебажить, вот незадача 🤯
🤯4👍1
#ios #appstore #appstoreconnect

Сегодня модераторы одобрили релиз моего нового приложения с тренировками (с четвертого раза), и я узнал на личном опыте, почему же в аппстор пропускают клонов телеграм 🙈

Если интересно узнать, ставьте 👍

Ссылка на гитхаб с новым приложением тут.
👍13