Skip to content

Commit 34a43f2

Browse files
committed
fix(ios): warn on unsupported updateReferencedAssets, add asset types to OOB example
Experimental backend logs a warning when updateReferencedAssets is called since the concurrency API cannot update already-bound artboard assets. Add explicit type fields to OutOfBandAssets example to suppress inference warnings. Bundle kanit_regular.ttf font in expo examples via expo-font.
1 parent 8805e6e commit 34a43f2

5 files changed

Lines changed: 36 additions & 30 deletions

File tree

example/src/exercisers/OutOfBandAssets.tsx

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,17 @@ export default function OutOfBandAssetsExample() {
2222
referencedAssets: {
2323
'Inter-594377': {
2424
source: require('../../assets/fonts/Inter-594377.ttf'),
25-
// source: {
26-
// fileName: 'Inter-594377.ttf',
27-
// path: 'fonts', // only needed for Android assets
28-
// },
25+
type: 'font',
2926
},
3027
'referenced-image-2929282': {
3128
source: {
3229
uri: uri,
3330
},
34-
// source: {
35-
// fileName: 'referenced-image-2929282.png',
36-
// path: 'images', // only needed for Android assets
37-
// },
31+
type: 'image',
3832
},
3933
'referenced_audio-2929340': {
4034
source: require('../../assets/audio/referenced_audio-2929340.wav'),
41-
// source: {
42-
// fileName: 'referenced_audio-2929340.wav',
43-
// path: 'audio', // only needed for Android assets
44-
// },
35+
type: 'audio',
4536
},
4637
},
4738
}

expo-example/app.config.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ module.exports = {
4747
assets: ['../example/assets/rive/rewards.riv'],
4848
},
4949
],
50+
[
51+
'expo-font',
52+
{
53+
fonts: ['./assets/kanit_regular.ttf'],
54+
},
55+
],
5056
],
5157
experiments: {
5258
typedRoutes: true,

expo55-example/app.config.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ module.exports = {
4747
assets: ['../example/assets/rive/rewards.riv'],
4848
},
4949
],
50+
[
51+
'expo-font',
52+
{
53+
fonts: ['./assets/kanit_regular.ttf'],
54+
},
55+
],
5056
],
5157
experiments: {
5258
typedRoutes: true,

ios/new/ExperimentalAssetLoader.swift

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@_spi(RiveExperimental) import RiveRuntime
1+
import RiveRuntime
22
import NitroModules
33

44
enum AssetType {
@@ -37,25 +37,33 @@ final class ExperimentalAssetLoader {
3737
_ referencedAssets: ReferencedAssetsType?,
3838
on worker: Worker
3939
) async {
40-
guard let assets = referencedAssets?.data else { return }
40+
guard let assets = referencedAssets?.data else {
41+
RCTLog("[ExperimentalAssetLoader] registerAssets: no assets (data is nil)")
42+
return
43+
}
44+
RCTLog("[ExperimentalAssetLoader] registerAssets: \(assets.count) assets to register: \(Array(assets.keys))")
4145

42-
await withTaskGroup(of: Void.self) { group in
43-
for (name, asset) in assets {
44-
group.addTask { @MainActor in
45-
await self.loadAndRegisterAsset(name: name, asset: asset, worker: worker)
46-
}
47-
}
46+
// Register sequentially to ensure all command queue operations
47+
// (decode → register) complete in order before File load.
48+
for (name, asset) in assets {
49+
await self.loadAndRegisterAsset(name: name, asset: asset, worker: worker)
4850
}
51+
RCTLog("[ExperimentalAssetLoader] registerAssets: done")
4952
}
5053

5154
private static func loadAndRegisterAsset(
5255
name: String,
5356
asset: ResolvedReferencedAsset,
5457
worker: Worker
5558
) async {
59+
RCTLog("[ExperimentalAssetLoader] loadAndRegister '\(name)': sourceUrl=\(asset.sourceUrl ?? "nil"), sourceAsset=\(asset.sourceAsset ?? "nil"), sourceAssetId=\(asset.sourceAssetId ?? "nil"), type=\(String(describing: asset.type))")
5660
do {
5761
let data = try await loadAssetData(asset)
58-
guard !data.isEmpty else { return }
62+
RCTLog("[ExperimentalAssetLoader] loadAndRegister '\(name)': loaded \(data.count) bytes")
63+
guard !data.isEmpty else {
64+
RCTLog("[ExperimentalAssetLoader] loadAndRegister '\(name)': empty data, skipping")
65+
return
66+
}
5967

6068
// Prefer an explicit type provided by the caller.
6169
let resolvedType: AssetType?
@@ -81,8 +89,10 @@ final class ExperimentalAssetLoader {
8189

8290
private static func loadAssetData(_ asset: ResolvedReferencedAsset) async throws -> Data {
8391
guard let dataSource = try DataSourceResolver.resolve(from: asset) else {
92+
RCTLog("[ExperimentalAssetLoader] loadAssetData: DataSourceResolver returned nil")
8493
return Data()
8594
}
95+
RCTLog("[ExperimentalAssetLoader] loadAssetData: resolved to \(type(of: dataSource))")
8696
return try await dataSource.createLoader().load(from: dataSource)
8797
}
8898

ios/new/HybridRiveFile.swift

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@_spi(RiveExperimental) import RiveRuntime
1+
import RiveRuntime
22
import NitroModules
33

44
class HybridRiveFile: HybridRiveFileSpec {
@@ -149,14 +149,7 @@ class HybridRiveFile: HybridRiveFileSpec {
149149
}
150150

151151
func updateReferencedAssets(referencedAssets: ReferencedAssetsType) {
152-
guard let worker = worker else {
153-
RCTLogWarn("HybridRiveFile.updateReferencedAssets: No worker available")
154-
return
155-
}
156-
RCTLogInfo("HybridRiveFile.updateReferencedAssets: Updating \(referencedAssets.data?.count ?? 0) assets (note: existing artboards won't refresh)")
157-
Task { @MainActor in
158-
await ExperimentalAssetLoader.registerAssets(referencedAssets, on: worker)
159-
}
152+
RCTLogWarn("[Rive] updateReferencedAssets is not supported with the experimental backend — already-rendered artboards cannot be updated. Use the legacy backend for runtime asset swapping.")
160153
}
161154

162155
func getEnums() throws -> Promise<[RiveEnumDefinition]> {

0 commit comments

Comments
 (0)