The two-day Let’s Vision 2025 concluded successfully in a joyful atmosphere, marking my second participation as a speaker in this grand event. Compared to last year, this year’s event not only comprehensively covered the Apple development ecosystem but also integrated the hottest AI-related content.
For me, the gains went far beyond absorbing knowledge from the numerous expert presentations. What was even more valuable was the opportunity to engage in deep, face-to-face conversations with developers from around the world. Many of them were peers I had followed or interacted with online for a long time. The smiles and conversations in person brought a genuine connection that the virtual world simply cannot replicate.
What truly amazed me was the scale and format of this year’s event. The organizing committee chose a garden venue far from the bustling center of Shanghai. Initially, I was concerned that the remote location might dampen the enthusiasm of participants. However, upon arrival, the carnival-like setup, the vibrant atmosphere, and the beautiful weather ignited everyone’s passion. This seemingly “unconventional” choice turned out to be surprisingly effective. In addition to dozens of professional talks, numerous exhibitors brought innovative products and ideas to the attendees. Particularly commendable was the organizing committee’s provision of free exhibition platforms for many small teams and individual developers, not only allowing them to showcase their work but also creating valuable opportunities for networking and connecting with potential investors.
What surprised all attendees was that such a large-scale event was entirely organized by the committee members in their spare time. Each of them has a full-time job, which not only requires exceptional time management and project coordination skills but also a genuine love for the community as a solid foundation to fully commit to this endeavor. The best way to thank them for their selfless dedication is to witness the thriving growth of the Apple developer community. Everyone is both a participant and a co-creator of the community’s vision.
These past few days have been fulfilling yet exhausting. Some parts of this week’s newsletter were completed on the journey back home, but the thought of reuniting with my family and my beloved pets instantly dispelled the fatigue. I sincerely hope that this carnival-like atmosphere can continue to thrive and endure within the Apple development ecosystem.
Original
Animatable Protocol: Taming Unruly SwiftUI Animations
In SwiftUI development, have you ever encountered situations where seemingly correct animation code fails to work as expected? Or animations that run perfectly on certain iOS versions but behave abnormally on others? These frustrating animation issues can often be resolved with a powerful yet understated tool — the Animatable
protocol. This article explores how to use Animatable
to enhance the precision and consistency of animations, making SwiftUI animations more stable and accurate.
Recent Recommendations
New Concurrency Stuff with 6.1
Swift 6.1 will be released alongside Xcode 16.3, and Matt Massicotte introduces several concurrency improvements in Swift 6.1 in this article. While there are no revolutionary new features, these adjustments help improve the development experience and reduce cognitive load.
isolated deinit()
, originally planned for inclusion in 6.1 to support Actor isolation in deinitializers, has been postponed to a future release.
Task.sleep() vs. Task.yield(): The Differences Explained
In Swift concurrency, both Task.sleep()
and Task.yield()
pause task execution, but they do so in different ways. Antoine van der Lee explains their differences in this article: Task.sleep()
suspends a task for a specified duration without blocking the underlying thread and supports cancellation, while Task.yield()
allows the current task to voluntarily yield execution, giving other tasks a chance to run. However, if there are no higher-priority tasks, Task.yield()
may not have a practical effect. Generally, Task.sleep()
is suitable for introducing fixed delays, such as debouncing input or throttling requests, while Task.yield()
is more useful for testing and optimizing task scheduling.
An Ode to Swift Enums: The View Models That Could
Swift enums are more than just collections of multiple-choice values; they can also serve as lightweight ViewModels, enhancing code clarity and maintainability. Jordan Morgan showcases various advanced uses of Swift enums in this article, such as providing user-friendly UI displays through CustomStringConvertible
, adapting to SwiftUI Picker with Identifiable
, and iterating over all enum values using CaseIterable
. Additionally, he explores how to use associated values to represent more complex states (e.g., task progress) and even how enums can play a role in dependency injection and mock data scenarios.
Music Recognition with ShazamKit
ShazamKit enables developers to easily integrate music recognition into iOS apps. Starting with iOS 17, the framework introduced modern concurrency APIs, simplifying data flow processing and reducing the need for manual management of AVAudioEngine
and SHSessionDelegate
. In this article, Artem Novichkov explains in detail how to use SHManagedSession
for real-time music matching and manage recognition history with SHLibrary
. The article also provides complete sample code demonstrating how to build a music recognition interface in SwiftUI and extend SHMediaItem
to support Spotify and YouTube search functionalities.
OpenSwiftUI 0.1.5
Last week, OpenSwiftUI released version 0.1.5, with the highlight being the addition of support for onAppear
and onDisappear
. Although it still cannot render views, under Xcode 16.3, the following code can now produce output identical to SwiftUI, marking a significant step forward in OpenSwiftUI’s functional alignment.
struct OpenSwiftUIContentView: View {
@State private var first = true
var body: some View {
Color(uiColor: first ? .red : .blue)
.onAppear {
print("View appear")
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
first.toggle()
}
}
.onDisappear {
print("View disappear")
}
.id(first)
}
}
Harmony
Harmony is an open-source music player app developed by Gülenay Gül, built with SwiftUI, TCA, and SharingGRDB. It features a clean and elegant UI along with a well-structured codebase. Whether you want to learn how to organize a SwiftUI project or how to use TCA for state management, Harmony is an excellent reference example. Additionally, Gülenay welcomes more developers to contribute and help improve the project.