Skip to content

Crash on Real Device at Launch: dyld Symbol Not Found for ChatChannelListViewModel.handleHideTabBar #4166

Description

@hfabisiak

Summary

Our iOS app crashes immediately on launch on a physical device when linking StreamChatSwiftUI.

The crash reproduces with both:

  • stream-chat-swiftui 5.5.0
  • stream-chat-swiftui 5.6.0

The crash does not reproduce on Simulator.

Environment

  • Device: iPhone17,1
  • OS: iOS 26.5
  • Distribution: TestFlight
  • Xcode: 26.5
  • Xcode build version: 17F42
  • StreamChatSwiftUI: reproduced with 5.5.0 and 5.6.0
  • StreamChat: reproduced with matching 5.5.0 and 5.6.0

Crash

Exception Type:  EXC_CRASH (SIGABRT)
Termination Reason: DYLD 0

Symbol not found:
_$s17StreamChatSwiftUI0B20ChannelListViewModelC16handleHideTabBar33_0BA79752707C776D439FA23BC72A8AA1LLyyF

Referenced from:
<app executable>

Expected as weak-def export from some loaded dylib

Related Source

The missing symbol appears to correspond to this method in Sources/StreamChatSwiftUI/ChatChannelList/ChatChannelListViewModel.swift:

@objc private func handleHideTabBar() {
    hideTabBar = true
}

It is registered as a NotificationCenter selector:

NotificationCenter.default.addObserver(
    self,
    selector: #selector(handleHideTabBar),
    name: NSNotification.Name(hideTabBarNotification),
    object: nil
)

Extra Debugging

Inspecting the built device object shows handleHideTabBar as a weak external symbol rather than a concrete definition:

weak external _$s17StreamChatSwiftUI0B20ChannelListViewModelC16handleHideTabBar33_0BA79752707C776D439FA23BC72A8AA1LLyyF

Then dyld fails during launch on the physical device.

Expected Behavior

The app launches on a physical device.

Actual Behavior

The app aborts before app code runs.

Notes

This looks like a device/archive linker or Swift symbol emission issue around a private @objc method used as a selector. Since it reproduces with both 5.5.0 and 5.6.0, it may be triggered by the Xcode 26.5 / Swift toolchain behavior rather than a specific source change in 5.6.0.

Would it be possible to make handleHideTabBar non-private/internal, or replace the selector-based notification observation with closure-based observation to avoid private Swift symbol binding?

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    🔎 InvestigatingThis issue is currently being investigated (Not reproducible yet)

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions