同一Xcode项目内Swift App能否跨应用调用函数?
回答
同一个Xcode项目内的两个独立Swift应用(.app 类型target)之间,无法直接互相调用对方内部实现的函数;被调用的代码也不是必须封装为静态库,但绝对不能直接留在独立应用的target里供其他应用调用。
为什么不能直接跨app target调用
- 每个独立的Swift应用在Xcode中都是单独编译、链接、签名的独立二进制,编译时内部代码的符号默认仅对当前target可见,不会对外导出,其他target在编译阶段根本找不到这些函数的符号定义。
- 运行时iOS/macOS的应用沙盒机制会把每个app限制在独立进程空间内,既不允许跨进程直接调用其他app的内部函数,也禁止加载其他app二进制内的代码执行,系统层面就堵死了直接调用的可能。
可行的实现方案
你不需要从零重写代码,也不是只能选静态库,以下方案都可以实现需求,维护成本远低于你预期:
- 抽离共享代码为独立库target:在现有Xcode项目里新建一个静态库/动态Framework类型的target,把你需要对外提供的函数从原app target中勾选归属到这个新建的库target下,你原有的app和第三方app只要链接这个库,就可以直接调用对应函数,原有代码逻辑不需要修改,只需要调整下文件的target归属即可。
- 本地Swift Package抽离:如果觉得配置库target麻烦,可以在项目里新建本地Swift Package,把共享代码放到Package内,不管是你自己的现有app还是第三方app,都可以直接依赖这个本地包调用函数,配置比传统库更简单。
注意:如果你是要给第三方应用提供可调用的能力,千万不要尝试直接把函数写在现有app的target里——不管是编译期链接还是运行时调用,这条路在苹果平台的开发规则下完全走不通。你只需要把需要对外暴露的代码从现有app里拆到独立的可链接产物里就行,不需要额外重写逻辑,实际开发中这个抽离操作的工作量非常小。
内容的提问来源于stack exchange,提问作者Doug Null
相关产品推荐
相关产品推荐

