Swift Package#

The Replay Swift package is hosted on GitHub. Once added as a package dependency to your Xcode project, you can replace the rootViewController:

import Replay
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = ReplayViewController()
self.window = window

Your image and audio assets also need to be added to your Xcode project. See Replay Starter for an example setup.



  • hideStatusBar: (Optional) A boolean to set if the status bar is hidden or not. Default true.
  • userStyles: (Optional) CSS code which will be injected into the web view. Useful for defining custom fonts.
  • jsRun: (Optional) The JS code that starts the game - can be overridden to load assets before starting game. Default ";".
  • onJsCallback: (Optional) A callback for messages sent from your game. See Bridge.
  • webWorkerFiles: (Optional) An array of additional Web Worker JS file names (without .js extension) to load (e.g. ["file1", "file2"]).


  • jsBridge(messageId: String, jsArg: String): Send a value from Swift to your JS game code. See Bridge.


Since Replay Swift embeds your game as a web view, the device.inputs parameter of Sprite methods is an alias of the Web package's inputs:

type iOSInputs = WebInputs;

The @replay/swift package exports this type for TypeScript projects.


You can send asynchronous messages from your game's JS code to your Swift code, and then respond back using a Promise. This allows you to use native features like in-app purchases.

JS side#

import { makeSprite } from "@replay/core";
import { swiftBridge } from "@replay/swift";
export const BridgeSprite = makeSprite({
init({ device }) {
// This should be unique between parallel messages
id: "TestBridge",
// A string to send
message: "Hello!",
}).then((message) => {
// message is a value sent back from Swift code.
// This will log "Bridge response: Hi!"
device.log(`Bridge response: ${message.response}`);
render() {
return [];

Swift side#

var vc: ReplayViewController!
vc = ReplayViewController(onJsCallback: { (message) in
if (message == "Hello!") {
// Here you can call native APIs
let myApiVal = "Hi!"
// This should match the id above
messageId: "TestBridge",
// The return value of the Promise in JS code.
// Use a String which will be evaluated as JS code (like eval)
jsArg: "{ response: `\(myApiVal)` }"