-
Notifications
You must be signed in to change notification settings - Fork 9
feat!: experimental Rive runtime backend (iOS + Android) #134
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
mfazekas
wants to merge
115
commits into
main
Choose a base branch
from
feat/rive-ios-experimental
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
115 commits
Select commit
Hold shift + click to select a range
41d009f
feat: experimental iOS Rive backend with synchronous API
mfazekas 3df9e6f
chore: move docs to .local/docs, remove from git
mfazekas 788d3de
refactor: remove ExperimentalFileSource from legacy backend
mfazekas e50b608
fix: restore whitespace in legacy files, remove fragile asset type gu…
mfazekas dc3e72a
fix: share single Worker across all files, fix artboard property data…
mfazekas ed7e9c2
fix: wire up trigger property to experimental fire/stream API
mfazekas 1c55c87
fix: set fit after view setup to fix .layout mode on initial render
mfazekas 4cbcd0f
test: add advanced data binding harness tests
mfazekas 8233123
fix: guard negative index in legacy viewModelByIndex and createInstan…
mfazekas 2e437e1
fix: correct trigger property listener task type signature
mfazekas 90017a3
fix: embed SPM RiveRuntime.framework via Podfile post_install hook
mfazekas a920d97
refactor: split Android into legacy/experimental backend directories
mfazekas e87fe71
feat: implement Android experimental backend using new app.rive.* API
mfazekas 3fcd575
feat: implement Android experimental backend with CommandQueue API
mfazekas 8ea55d9
feat: migrate getEnums() from sync to async (Promise)
mfazekas 726aac6
fix: color property overflow and test tolerance for cross-platform di…
mfazekas 3d510ad
feat: add backend property to RiveFileFactory for runtime detection
mfazekas 312f208
feat: migrate viewModelByIndex, createInstanceByIndex, viewModel to a…
mfazekas 2b2b396
fix: lint formatting in ViewModel spec and harness test
mfazekas 1128d80
ci: add experimental runtime harness tests for iOS and Android
mfazekas 600162d
ci: increase iOS experimental harness timeout to 90min for cold builds
mfazekas 956d42e
fix: handle throwing Worker() init in rive-ios 6.15.1
mfazekas cc25b29
fix: experimental iOS instance lookup and test guards
mfazekas 7499c32
feat: add async APIs for RiveFile/ViewModel and fix experimental inst…
mfazekas 4a2ec7d
chore: upgrade rive-ios SPM to 6.15.2
mfazekas e6d98ce
fix: only allow snakeLizard enum on android legacy backend
mfazekas ea446a7
test: add useViewModelInstance e2e harness tests
mfazekas 60034a5
fix: implement color property get/listen and fix UInt32 crash on expe…
mfazekas 6416647
feat(ios): decouple SPM from experimental runtime toggle
mfazekas 35fe7b3
fix: unify USE_RIVE_NEW_API flag, replace SPM with CocoaPods, fix exp…
mfazekas 2249388
fix: skip autoPlay test on both experimental backends
mfazekas 4a8b7b2
fix: remove unused Platform import
mfazekas a3e8b3c
chore: update nitrogen generated files
mfazekas a66f3b5
fix: use ArrayBuffer instead of ArrayBufferHolder in new HybridRiveFi…
mfazekas 0a336ce
feat: add async versions of viewModelCount, artboardCount, artboardNames
mfazekas 97a59fd
feat: add async alternatives for ViewModel property value getters
mfazekas 64c5873
fix: add missing Promise import in experimental Android property file…
mfazekas 3023448
ci: remove android style guide enforcement from ktlint
mfazekas c23a288
fix(kotlin): fix all ktlint violations and add lint:fix:kotlin script
mfazekas fdbacab
ci: fail lint-kotlin job on ktlint errors
mfazekas 2df4fb0
feat: add explicit type field to ResolvedReferencedAsset for asset lo…
mfazekas 2e4d65a
fix: format import in ReferencedAssets.ts to satisfy Prettier
mfazekas cffa095
chore: re-run nitrogen to regenerate bridge code for RiveAssetType/ty…
mfazekas c0ae1ff
fix: disable function-naming ktlint rule for Composable PascalCase fu…
mfazekas f5852b7
fix: apply ktlint auto-format to ComposeTestActivity
mfazekas 46daf24
fix(ios): update ExperimentalAssetLoader to use typed RiveAssetType enum
mfazekas eb56abd
fix(android): update ExperimentalAssetLoader to use typed RiveAssetTy…
mfazekas 69e9afb
refactor: API cleanup — validate option, createBlankInstanceAsync ren…
mfazekas a8cb705
fix(ios): correct set(value:) argument label to match generated protocol
mfazekas a77ede1
fix(ios): createInstanceByIndex(Async) now respects the index
mfazekas 8759882
fix: remove createInstanceByIndexAsync, fix createInstanceByIndex on …
mfazekas 98d680c
fix(ios): implement propertyCount and instanceCount using runtime APIs
mfazekas 474cf82
test: strengthen replaceViewModel assertion to verify actual replacement
mfazekas 5892b92
fix(ios): don't set instanceName to property path for nested VMIs
mfazekas 51c13a8
fix(android): remove VM name heuristic, throw on unsupported ops for …
mfazekas cc9f8a8
fix: update Podfile.lock to RiveRuntime 6.17.0 from main
mfazekas 3b93d37
chore: regenerate nitrogen bindings after rebase
mfazekas b6031a0
fix: remove duplicate async methods in legacy files, make HybridRiveV…
mfazekas e880e4d
fix: add missing createInstanceAsync to experimental backends
mfazekas f038fed
fix: remove redundant createInstanceAsync, keep only createBlankInsta…
mfazekas 56efa57
fix: use yarn nitrogen (with postprocess), fix ktlint blank line
mfazekas d9e08fa
chore: add Issue189 reproducer and nodefaultbouncing.riv from fix/and…
mfazekas 58b419b
fix(ios-exp): skip auto-binding when artboard has no default ViewModel
mfazekas 5e11aff
Fix "0x1 not found" error when artboard has no default ViewModel on A…
mfazekas 3499f0a
fix: enable experimental API flag, await Worker init, update Podfile.…
mfazekas 1bccac8
fix: update test harnesses for useViewModelInstance {instance, error}…
mfazekas 9c4a9f1
fix: ktlint spacing between declarations with comments
mfazekas 44fc9ce
test: skip Android experimental tests that need rive-android#443
mfazekas e025dfe
test: clarify skip reasons for Android experimental test guards
mfazekas 6e1185c
fix: clean up legacy files to match upstream, fix Issue159 error type
mfazekas dea92ee
fix: make legacy HybridViewModel identical to main
mfazekas 6cc1bb7
feat: make experimental runtime the default, legacy opt-in via USE_RI…
mfazekas aec3038
refactor: rename android/src/experimental to android/src/new to match…
mfazekas c9a14ff
fix: add missing getPropertyCountAsync/getInstanceCountAsync to new b…
mfazekas 9f61446
chore: enable prerelease (beta) versioning for 0.5.0 release track
mfazekas e96e039
fix(ios): add @MainActor to RiveReactNativeView, guard stale config t…
mfazekas 6fc3aad
fix(ios): make awaitViewReady reentrant, support multiple callers
mfazekas aa805eb
fix(android): use RuntimeException instead of Error for recoverable f…
mfazekas ce29667
fix: log error instead of swallowing in createInstanceByName catch
mfazekas d9fd128
fix(android): log warning when inferFromMagicBytes falls back to IMAG…
mfazekas 074c670
fix(ios): add MainActor.assumeIsolated for calls into @MainActor Rive…
mfazekas aeb9084
fix(ios): port Xcode 26 ODR workaround from main into podspec
mfazekas 3628c5a
fix(ios): add missing try to MainActor.assumeIsolated in afterUpdate
mfazekas 2ece0f7
fix(ios): use onMainSync instead of MainActor.assumeIsolated for JS-c…
mfazekas 3d30764
fix(ios): make onMainSync provide @MainActor isolation, fix infinite …
mfazekas c026f6d
fix(ios): use Result to propagate errors from onMainSync across dispa…
mfazekas 5783bb2
fix(android): use device density for Fit.Layout default scale factor …
mfazekas aac60a3
fix(android): use device density for Fit.Layout in experimental backe…
mfazekas 5d31b0a
feat: add RiveLogger with configurable JS handler and deprecation war…
mfazekas 603eaf3
fix(ios): defer fit assignment until MTKView is ready in experimental…
mfazekas 701b9c1
feat: add RiveLog.setLogLevel() to filter log output (#232)
mfazekas 8832115
chore(ios): bump rive-ios to 6.19.1 (#233)
mfazekas f6e2e74
fix(ios): add backend property to legacy HybridRiveFileFactory (#236)
mfazekas 8a1a35e
fix(ios): prevent crash on color values with high alpha (#234)
mfazekas de915e3
fix(ios): pass fit in constructor, OOB asset improvements (#237)
mfazekas 75e9d81
feat: add async variants for ViewModelListProperty mutation methods
mfazekas 992088c
fix: remove pinned rive-android version from example app
mfazekas 0393c35
chore: upgrade react-native-nitro-modules to 0.35.6
mfazekas 3b4200d
chore: remove ComposeTestActivity and LegacyTestActivity from example…
mfazekas f7666d0
chore(ios): bump rive-ios to 6.19.2
mfazekas 98e2bdf
fix(ios): remove Xcode 26 modulemap stripping workaround (#239)
mfazekas 26aea77
chore(ios): remove 'Experimental' naming and debug logs (#240)
mfazekas f4799c0
fix(android): prevent draw errors on view dispose (#243)
mfazekas 9adfd44
fix(android): await asset registration before file load, fix dispose …
mfazekas 2861aa9
feat: add native iOS code coverage integration
mfazekas 2510967
fix(ios): remove stale experimental iOS test skips (#246)
mfazekas 60cb2a2
chore(android): rename ExperimentalAssetLoader to AssetLoader (#245)
mfazekas dd67305
chore: add kanit_regular.ttf to expo example assets (#242)
mfazekas 78b64b7
chore(ios): bump rive-ios to 6.20.0 (#241)
mfazekas 4fdd1f3
feat: add properties enumeration to ViewModel and ViewModelInstance (…
mfazekas e991261
chore: bump example app to React Native 0.80.3 (#254)
mfazekas 2bf6631
chore: bump react-native-harness to 1.1.0 (#253)
mfazekas ba25bff
test: add async API coverage tests (#258)
mfazekas f299fe1
chore: upgrade react-native-harness to 1.2.0
mfazekas 45f34b0
chore: fix prettier formatting
mfazekas File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,77 @@ | ||
| # Native iOS Code Coverage | ||
|
|
||
| Native iOS code coverage is integrated via `react-native-harness` 1.2.0+, which includes | ||
| `@react-native-harness/coverage-ios` support out of the box. | ||
|
|
||
| ## Prerequisites | ||
|
|
||
| - Xcode with `xcrun llvm-profdata` and `xcrun llvm-cov` available | ||
| - iOS simulator booted (the harness test runner handles this) | ||
|
|
||
| ## Configuration | ||
|
|
||
| The harness config (`example/rn-harness.config.mjs`) specifies which CocoaPods targets | ||
| get instrumented: | ||
|
|
||
| ```js | ||
| coverage: { | ||
| native: { | ||
| ios: { | ||
| pods: ['RNRive', 'RiveRuntime'], | ||
| }, | ||
| }, | ||
| }, | ||
| ``` | ||
|
|
||
| The `pods` array lists which CocoaPods targets get instrumented with | ||
| `-profile-generate -profile-coverage-mapping` (Swift) and | ||
| `-fprofile-instr-generate -fcoverage-mapping` (C/ObjC). | ||
|
|
||
| Start with just `['RNRive']` if you only care about your own code. | ||
| Add `'RiveRuntime'` to also cover the upstream Rive SDK. | ||
|
|
||
| ## Running | ||
|
|
||
| ```bash | ||
| cd example | ||
|
|
||
| # Pod install will auto-instrument the configured pods | ||
| cd ios && pod install && cd .. | ||
|
|
||
| # Clean build required after instrumentation changes | ||
| xcodebuild clean -workspace ios/RiveExample.xcworkspace -scheme RiveExample | ||
| yarn build:ios | ||
|
|
||
| # Run tests with coverage | ||
| yarn test:harness:ios:coverage | ||
| ``` | ||
|
|
||
| When tests finish, the harness merges `.profraw` files and produces an `.lcov` report. | ||
|
|
||
| Profraw files are written to `/tmp/harness-coverage/` which persists across app reinstalls | ||
| on iOS simulators. | ||
|
|
||
| ## Viewing Results | ||
|
|
||
| ```bash | ||
| # Quick summary | ||
| lcov --summary coverage/native-ios.lcov | ||
|
|
||
| # Generate HTML report | ||
| genhtml coverage/native-ios.lcov -o coverage/native-ios-html | ||
| open coverage/native-ios-html/index.html | ||
| ``` | ||
|
|
||
| ## Troubleshooting | ||
|
|
||
| **No `.profraw` files generated:** | ||
| - Verify `pod install` printed the `[HarnessCoverage] Instrumenting pods` message | ||
| - Ensure the app was rebuilt from scratch after `pod install` | ||
| - Check simulator logs: `xcrun simctl spawn booted log show --predicate 'message CONTAINS "HarnessCoverage"' --last 1m` | ||
|
|
||
| **`xcrun llvm-cov` fails:** | ||
| - The `.profraw` file must match the exact binary that produced it — do a clean build | ||
|
|
||
| **Xcode 16+ / debug dylibs:** | ||
| - The app binary may be a thin stub; the real code is in `RiveExample.debug.dylib` | ||
| - The coverage collector handles this automatically via `findAppExecutable()` |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.