build-ios-binary
/build-ios-binary
Turns the extension's iOS source (ios/RCT<Pascal>Module.{h,m}) into the flat <Pascal>Plugin.framework/ (device slice) that the wrap runtime loads. iOS analogue of /build-android-binary: source in, a prebuilt framework out.
Ship a FLAT
.framework, NOT an.xcframework. The wrap pipeline expectsios/<Name>.frameworkand does not descend into an.xcframework— shipping one fails with "Framework '.framework' not found in plugin." This skill builds the device archive only and copies out the flat.framework. Seeppmplugin-format §5b.
Mac-only. Requires Xcode. On Linux/Windows this skill BLOCKs — Android-only contributors can't produce the iOS slice.
KNOWN LIMITATION — read this. The single hard part is React-Core: the framework compiles against React's headers (
#import <React/RCTBridgeModule.h>) from the control repo's own pinnedreact-nativedevDep, while never embedding React — the wrap host provides it at runtime (weak-link). The coupling that matters is the RN version pin (0.79.7): it must match the RN the wrap host ships. The exact weak-link flags / header-search-path setup aren't yet validated against a live wrap host — that's the main risk area. React symbol/header errors mean the RN pin diverged from the host's RN, not a code bug.
Read shared/ppmplugin-format.md §5b (iOS binary requirements) and the naming-conventions.md iOS rows.
What this skill does NOT do
- Does not author
manifest.json(run/generate-ppmplugin-manifestfirst — this skill reads it for cross-checks and the framework/moduleClass names). - Does not zip the
.ppmplugin— that's/assemble-ppmplugin. - Does not build Android — that's
/build-android-binary. - Does not modify the canonical
ios/or the podspec — all adjustments live in a throwaway copy underppmplugin/staging/ios-build/. - Does not sign the framework — the wrap pipeline signs at packaging time (given
BUILD_LIBRARY_FOR_DISTRIBUTION=YES SKIP_INSTALL=NO). No signing skill needed.