Today I learned

SwiftUI @main AppDelegate


When using @main on a SwiftUI.App and @UIApplicationDelegateAdaptor(AppDelegate.self) you can still have an AppDelegate without handling SwiftUI manually as without @main.

You don’t even need a SceneDelegate! A huge difference for tiny apps!

Android Permission now requires a description


Now, Android apps require a description for each permission. Back then, it was optional.

In contrast to iOS, this is only a guideline and not enforced by the Android SDK. Instead the developer needs to implement their own alert. But with great power, comes great responsibility as it could be abused.

Updating Bitrise binary uploads


Bitrise binary uploads cannot be updated after saving. Instead they need to be deleted and recreated. Thus all workflow steps need to be updated if they rely on the data.

Pro-tip: when copy-pasting, skip the BITRISE_IO and _URL parts – they will be inserted automatically when using the web UI.

Localization order


When maintaining multiple locales within your project, try to keep line numbers consistent across all locales. Also keep the order of translations consistent.

That makes differences easy to spot.

SwiftUI translations and UIKit


Nothing new today, but a quick reminder:

Even if you don’t need to explicitly localize String literals for Text manually, you can still need to when passing Strings to UIAlertController or other UIKit classes.

Of course. But sometimes I still forget while writing the code.

ftp-simple vscode workspace


ftp-simple allows opening FTP connections as VS Code workspace!

Localizcable vs Swift unicode escapes


Localizable.strings doesn’t support unicode \unnnn escapes, but only \Unnnn! In Swift the \U is for UTF-16 escapes like \Unnnnnnnn.

Android XML Translations


The Android Studio tooling for Android apps checks and validates all translation keys. Even if they are present within the base language. This comes in handy after greater refactorings.

But sadly the XML does not support XML escapes as '.

NSDataDetector


How to detect a URL in a String using NSDataDetector - free Swift 5.1 example code and tips https://www.hackingwithswift.com/example-code/strings/how-to-detect-a-url-in-a-string-using-nsdatadetector

Coordinator [unowned self]


An [unowned self] in a Coordinator is okay.

As the coordinator should live longer than any of its screens, a crash hints to lifecycle issues.