是的,Swift、Objective-C & C++ 也支持 HotReloading!

本项目是 InjectionIII 应用程序的 Swift Package 版本,可用于实时代码更新。 例如:

Icon

注意:您应该只将 HotReloading 产品添加到您的目标。

然后,您可以注入函数实现而无需重新构建您的应用程序... Icon

要尝试一个已设置好的示例项目,请克隆此 SwiftUI-Kit 的分支。

要在您的项目中使用,请将此 repo 添加为 Swift Package,并添加 “Other Linker Flags”: -Xlinker -interposable。 您不再需要添加 “Run Script” 构建阶段。 如果想在设备上进行注入,请参阅下面的关于如何配置 InjectionIII 应用程序的说明。 但请注意,在 M1/M2 Mac 上,此项目仅适用于 iOS/tvOS 14 或更高版本的模拟器。 此外,由于 Xcode 如何启用 Swift Package 的 DEBUG 构建方式的特殊性,您的 “configuration” 需要包含字符串 “Debug”。

请记住不要在配置了此软件包的情况下发布您的应用程序。

您应该会看到一条消息,表明该应用程序正在监视您主目录中的源文件更改。 您可以通过在环境变量 INJECTION_DIRECTORIES 中添加逗号分隔的列表来更改此范围。 如果您想在使用模拟器时连接到 InjectionIII.app,请将环境变量 INJECTION_DAEMON 添加到您的 scheme。

有关更多信息,特别是如何使用它通过 HotSwiftUI 协议扩展注入 SwiftUI,请参阅 InjectionIII 项目的 README。

使用 VSCode 进行 HotReloading

可以从 VSCode 编辑器内部使用 HotReloading 并实现一种 “VScode Previews” 的形式。 有关所需设置,请参阅 此项目

设备注入

此版本的 HotReloading 项目及其依赖项现在支持在真实的 iOS 或 tvOS 设备上进行注入。

设备注入现在连接到 InjectionIII.appgithub release 4.6.0 或更高版本),并且需要您在终端中键入以下命令,然后重新启动应用程序才能选择接收来自设备的远程连接

$ rm ~/Library/Containers/com.johnholdsworth.InjectionIII/Data/Library/Preferences/com.johnholdsworth.InjectionIII.plist
$ defaults write com.johnholdsworth.InjectionIII deviceUnlock any

注意,如果您过去使用过 App Store 版本的 InjectionIII,则二进制版本具有不同的首选项文件,并且两者可能会混淆并阻止写入此首选项生效。 这就是为什么上述第一个 rm 命令可能是必要的。 如果您的设备未连接,请检查该应用程序是否正在端口 8899 上侦听

% netstat -an | grep LIST | grep 88
tcp4       0      0  127.0.0.1.8898         *.*                    LISTEN
tcp4       0      0  *.8899                 *.*                    LISTEN

如果您的设备仍然没有连接,请将 INJECTION_HOST 环境变量添加到您的 scheme 中,其中包含运行 InjectionIII.app 的主机的 WiFi IP 地址,或者克隆此项目并将您 Mac 的 IP 地址编码到 Package.swift 中的 hostname 变量中。 然后,将克隆拖到您的项目上,使其代替配置的 Swift Package,如 这些说明 中所述。

注意:由于 HotReloading 包需要连接到您 Mac 的网络套接字才能接收命令和新版本的代码,因此请注意在首次添加该包后运行应用程序时会收到一条消息,询问您是否 “信任” 您的应用程序应被允许这样做。 同样,在 Mac 端(由于 InjectionIII 应用程序需要打开一个网络端口来接受此连接),如果您的 macOS 防火墙已打开,则可能会提示您获取权限。

对于 SwiftUI,您可以通过遵循 HotSwiftUI 项目中概述的约定来强制屏幕更新,然后您可以体验类似于 “Xcode Previews” 的东西,除了在实际设备上运行一个功能齐全的应用程序!

Vapor 注入

要将注入与 Vapor Web 服务器一起使用,现在只需下载 InjectionIII.app 并添加以下行,使其在服务器配置时被调用(当从 Xcode 内部运行 Vapor 时)

    #if DEBUG && os(macOS)
    Bundle(path: "/Applications/InjectionIII.app/Contents/Resources/macOSInjection.bundle")?.load()
    #endif

还需要将以下参数添加到您的目标中

    linkerSettings: [.unsafeFlags(["-Xlinker", "-interposable"],
            .when(platforms: [.macOS], configuration: .debug))]

作为替代方案,您可以将此 Swift 包作为依赖项添加到 Vapor 的 “App” 目标的 Package.swift 中。

感谢...

应用程序跟踪功能通过 SwiftTrace 项目,使用 OliverLetterer/imp_implementationForwardingToSelector trampoline 实现,并在 MIT 许可下使用。

SwiftTrace 使用了非常方便的 https://github.com/facebook/fishhook 作为 dyld_dynamic_interpose 动态加载器私有 API 的替代方案。 有关许可详细信息,请参阅框架中包含的项目源文件和头文件。

此项目中允许您从设备捕获视频的 "Remote" 服务器包含改编自 acj/TimeLapseBuilder-Swift 的代码

此版本包含一个非常略微修改过的优秀 canviz 库,用于在 HTML 画布中渲染 "dot" 文件,该文件受 MIT 许可的约束。 这些更改是将节点的 ID 传递到节点标签标签(第 212 行),反转节点及其链接线的渲染(第 406 行),以及存储边缘路径,以便可以在 "canviz-0.1/canviz.js" 中对其着色(第 66 行和第 303 行)。

它还包括 CodeMirror JavaScript 编辑器,用于在 MIT 许可下在 Xprobe 浏览器中评估的代码。

$Date: 2023/09/18 $