Skip to main content

Deep Linking

Navigate users directly to specific content — a video, playlist, search results, or sub-channel.

All channel navigation is represented by BBNavigationState:

struct BBNavigationState {
let page: String // "main", "detail", "overview", "search"
let clipId: String?
let clipListId: String?
let query: String?
let subChannelId: String?
}

Initial Navigation State

Open the channel at a specific location:

// Open on a video detail page
BBChannelView(
channelUrl: "https://demo.bbvms.com/ch/channel_name.json",
initialNavigationState: BBNavigationState(
page: "detail", clipId: "12345"
),
viewModel: viewModel,
callbacks: callbacks
)

// Open on a playlist overview
BBChannelView(
channelUrl: "https://demo.bbvms.com/ch/channel_name.json",
initialNavigationState: BBNavigationState(
page: "overview", clipListId: "678"
),
viewModel: viewModel,
callbacks: callbacks
)

// Open with search results
BBChannelView(
channelUrl: "https://demo.bbvms.com/ch/channel_name.json",
initialNavigationState: BBNavigationState(
page: "search", query: "highlights"
),
viewModel: viewModel,
callbacks: callbacks
)

Programmatic Navigation

After the channel is loaded, use view model methods:

// Navigate to a specific entity
viewModel.navigateToEntity(entityType: "mediaclip", entityId: "12345")
viewModel.navigateToEntity(entityType: "mediacliplist", entityId: "678")

// Search
viewModel.search("highlights")

// Navigate to a sub-channel
viewModel.navigateToSubChannel(subChannelId: "sports")

// Go back or reset
viewModel.goBack()
viewModel.navigateTo(page: "main")
warning

Programmatic navigation only works after the channel is ready. Wait for the onReady callback.

Use SwiftUI's onOpenURL to handle deep links:

@main
struct MyApp: App {
@StateObject private var viewModel = BBChannelViewModel()
@State private var initialState: BBNavigationState?

var body: some Scene {
WindowGroup {
BBChannelView(
channelUrl: "https://demo.bbvms.com/ch/channel_name.json",
initialNavigationState: initialState,
viewModel: viewModel,
callbacks: BBChannelCallbacks()
)
.onOpenURL { url in
if let state = parseDeepLink(url) {
viewModel.navigateTo(
page: state.page,
clipId: state.clipId,
query: state.query
)
}
}
}
}

func parseDeepLink(_ url: URL) -> BBNavigationState? {
let path = url.pathComponents
guard path.count >= 2 else { return nil }
switch path[1] {
case "video":
return BBNavigationState(page: "detail", clipId: path[safe: 2])
case "search":
return BBNavigationState(page: "search", query: path[safe: 2])
default:
return nil
}
}
}

URL Scheme Examples

URLNavigation State
myapp://channelpage: "main"
myapp://channel/video/12345page: "detail", clipId: "12345"
myapp://channel/playlist/678page: "overview", clipListId: "678"
myapp://channel/search/highlightspage: "search", query: "highlights"

Configure these in your Info.plist as URL schemes or Universal Links.