ios use_frameworks!仅适用于某些pod或swift pod

kd3sttzy  于 2023-01-14  发布在  iOS
关注(0)|答案(7)|浏览(330)

我的项目中同时有Objective CSwift Pod。

pod 'WBWebViewConsole', '~> 1.0.1' 
use_frameworks! 
pod 'XWebView', '~>0.9.5’ 
pod 'Starscream', '~> 1.1.3'

由于swift POD(* XWebView Starscream )只能作为框架添加,因此我必须使用use_frameworks!*
但这使得所有POD都成为框架,包括Objective-C POD(* WBWebViewConsole *)。
但它会导致Objective-C POD的问题,但我不打算使Objective-C POD作为框架。
那么,有没有什么方法可以忽略一些POD,使其不被转换为框架呢?
谢谢。

更新:

  • 如何重现问题?*

POD WBWebViewConsole存在问题
在任何有互联网连接的iOS 8+设备上运行attached project,因为它从Google Drive加载HTML文档。
在html文档中...单击常规/信息/警告/调试/错误日志

每当你点击上面的任何一个按钮时,你会在html页面上出现一些文本。
该库是关于捕获在html页面中生成的日志...
每当你点击按钮,除了显示一些文本在html页面,我写一些日志在后台。

现在单击按钮get logs...并在Xcode IDE中查看日志...您将看到以html格式生成的所有控制台日志

获取日志-〉是webview上的一个本地按钮。该库允许我们从wkwebview读取控制台日志。
现在,在POD中取消注解以下行

use_frameworks!
pod 'PLCrashReporter'
pod 'XWebView', '~> 0.9.5’

并执行pod安装
然后将以下代码粘贴到ViewController顶部

import WBWebViewConsole

下面是project,其中所有这些都是未注解的,并且包含重现问题所需的所有更改
现在u运行项目上的设备,并点击一些按钮在html页面,并点击 * 得到日志 * 你不能看到这是在html页面生成的评论
具体如下,WBWKWebView中实现的委托方法不会被触发。

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
- (void)wb_evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^)(NSString *, NSError *))completionHandler

但是在创建WBWKWebView的示例并加载URL时,该类的所有必要委托都被触发。
当点击html页面中的按钮写入日志时,应该触发上述委托

xqk2d5yq

xqk2d5yq1#

您可以覆盖use_frameworks!并将所有pod安装为静态,但您选择作为框架的pod除外
Podfile中使用use_frameworks!并在文件末尾添加

dynamic_frameworks = ['aaa','bbb'] # <- swift libraries names

# Make all the other frameworks into static frameworks by overriding the static_framework? function to return true
pre_install do |installer|
  installer.pod_targets.each do |pod|
    if !dynamic_frameworks.include?(pod.name)
      puts "Overriding the static_framework? method for #{pod.name}"
      def pod.static_framework?;
        true
      end
      def pod.build_type;
        Pod::BuildType.static_library
      end
    end
  end
end
vof42yt1

vof42yt12#

JSBridge init时会在webview中添加一些"UserScripts",在以前版本中是从[NSBundle mainBundle]中加载的源代码,但如果是在框架中,则资源文件在框架包中,而不是mainBundle
因此,修复位于WBWebViewConsoleDefines
替换此

inline static NSBundle * WBWebBrowserConsoleBundle()
{
return [NSBundle bundleWithPath:[NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] bundlePath], @"WBWebBrowserConsole.bundle"]];
}

inline static NSBundle * WBWebBrowserConsoleBundle()
{
return [NSBundle bundleWithPath:[NSString stringWithFormat:@"%@/%@", [NSBundle bundleForClass:[WBWebViewConsole class]], @"WBWebBrowserConsole.bundle"]]; 
}

其实作者已经发布了新版本,它也有修复
pod "WBWebView控制台","~〉1.0.2 "

  1. pod安装
    1.重新启动Xcode并清理项目
    1.重建并重新运行
    注:这是不可能的.如果你使用_framages!所有的东西都变成动态框架.
wbgh16ku

wbgh16ku3#

基于CocoaPods的成员:

这在一般情况下是不可能的,因为存在可传递的依赖关系。如果Pod A是动态构建的,并且依赖于静态构建的Pod B,而应用也依赖于Pod B,则不可能构建,因为Pod A在链接时会丢失Pod B的符号,或者您最终会得到Pod B的多个副本。
但是,您应该能够创建一个插件来支持像您这样的特定情况。

4bbkushb

4bbkushb4#

source 'https://github.com/CocoaPods/Specs.git'
                    platform :ios, '8.0'
                    use_frameworks!
                    pod 'WBWebViewConsole', '~> 1.0.1' 
                    pod 'XWebView', '~>0.9.5’ 
                    pod 'Starscream', '~> 1.1.3'

不需要在use_framework!上面指定目标c pod。

7lrncoxx

7lrncoxx5#

在我的项目中,我同时使用Objective-C和Swift,pod。如果你必须包含Swift编写的pod,你必须使用use_frameworks!指令。对非Swift pod使用use_frameworks!指令不会导致问题。将该指令放在pod列表的顶部。
一般来说,Objective-C pod应该只使用import ModuleName在你想要使用框架的swift文件中工作,但是如果没有,你应该尝试添加bridging-header.h到你的项目中,并在那里添加#import作为objective-c框架的头文件。
请尝试这个,并在这里做更新的结果.

332nm8kg

332nm8kg6#

从@MujtabaFR的回答来看,我有错误说在我的pod全局导入头文件中找不到文件,我无法解决这些错误。所以在已经工作的静态库中,我尝试插入我的动态框架,所以我尝试了他的向后兼容的解决方案,所以反转他的解决方案对我来说很好,这里供参考

dynamic_frameworks = ['aaa','bbb'] # <- swift libraries names

# Make all the other frameworks into dynamic frameworks by overriding the dynamic_framework? function to return true
pre_install do |installer|
  installer.pod_targets.each do |pod|
    if dynamic_frameworks.include?(pod.name)
      puts "Overriding the dynamic_framework? method for #{pod.name}"
      def pod.dynamic_framework?;
        true
      end
      def pod.build_type;
        Pod::BuildType.dynamic_framework
      end
    end
  end
end

因此,这仍然是我现有的代码,并插入我的新swift pod作为动态框架。
感谢您发送编修。

btqmn9zl

btqmn9zl7#

pre_install do |installer|
    Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {}
end

把这个添加到你的播客文件中试试吧。

相关问题