The summary.
ALL INTERFACE UPDATES MUST HAPPEN ON THE MAIN THREAD
Work elsewhere must return to it, and violations cause intermittent crashes. Enable the main thread checker during development — it catches them immediately.
Blocking the main thread freezes the interface and the system terminates unresponsive applications.
REFERENCE CYCLES ARE THE MEMORY PROBLEM TO WATCH FOR
Closures capturing their owner, and mutual strong references. Capture weakly and check the object still exists.
The symptom is memory rising as screens open and close, never falling.
STOP WORK WHEN A SCREEN DISAPPEARS
Work continuing on a hidden screen wastes battery and may crash. Always support cancellation, and test rapid navigation.
PERMISSIONS NEED USAGE DESCRIPTIONS
Requesting without one crashes, and review rejects vague wording.
PUT CREDENTIALS AND TOKENS IN THE KEYCHAIN, NEVER IN PREFERENCE STORAGE
Preference storage is unencrypted and included in backups.
TEST UPGRADING FROM THE PREVIOUS RELEASE WITH REAL DATA
An unhandled model change loses user data or crashes on launch.