use_frameworks!仅限一些豆荚或快餐豆荚

时间:2016-05-23 10:07:40

标签: ios objective-c swift cocoapods wbwebviewconsole

我的项目中有Objective CSwift个广告。

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驱动器加载html文档。

在html doc ...中单击General / Info / Warning / Debug / Error Log

enter image description here

每当您点击上述任何按钮时,您都会在html页面上显示一些文字......

该库是关于捕获在html页面中生成的日志......

每当你点击按钮而不是在html页面中显示一些文字时我会在后台写一些日志。

enter image description here

现在点击按钮获取日志 ...并在Xcode IDE中查看日志...您将看到在html中生成的所有控制台日志

enter image description here

获取日志 - >是一个超级强加在webview上的本机按钮。该库让我们从wkwebview中读取控制台日志 ..

现在在POD 你取消注释以下几行

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

并执行pod安装

然后将以下代码粘贴到ViewController

之上
import WBWebViewConsole

以下是project所有这些都没有注释重现问题所需的所有更改

现在你在设备上运行项目并点击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页面中的按钮

时写入日志时触发

5 个答案:

答案 0 :(得分:8)

您可以覆盖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

答案 1 :(得分:4)

JSBridge初始化时,它会向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'WBWebViewConsole','〜&gt; 1.0.2'

  1. pod install
  2. 重新启动Xcode并清理项目
  3. 构建并再次运行
  4. 注意:不可能。如果你使用_frameworks!一切都变成了动态的框架。

答案 2 :(得分:3)

基于CocoaPods的成员:

由于传递依赖性,这对于一般情况来说是不可能的。如果Pod A是动态构建的并且依赖于静态构建的Pod B并且应用程序也依赖于Pod B,则例如无法构建,因为Pod A将在链接时丢失Pod B的符号,或者您最终得到了Pod B的多个副本。可能有更多的场景无法工作。

但是,您应该能够创建一个插件来支持像您这样的特定情况。

答案 3 :(得分:3)

                    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!。

答案 4 :(得分:3)

我在项目中同时使用Objective-C和Swift,pod。如果必须包含用Swift编写的pod,则必须使用指令use_frameworks!。对非Swift pod使用use_frameworks!指令不会导致问题。将指令放在pods列表的顶部。

一般来说,Objective-C pod应该只使用import ModuleName在你想要使用框架的任何swift文件中工作,但如果没有,那么你应该尝试添加 bridging-header.h < / strong>到你的项目和那里的#import objective-c frameworks'头文件。

请尝试此操作并在此处更新结果。