我的项目中有Objective C
和Swift
个广告。
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
每当您点击上述任何按钮时,您都会在html页面上显示一些文字......
该库是关于捕获在html页面中生成的日志......
每当你点击按钮而不是在html页面中显示一些文字时我会在后台写一些日志。
现在点击按钮获取日志 ...并在Xcode IDE中查看日志...您将看到在html中生成的所有控制台日志
获取日志 - >是一个超级强加在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页面中的按钮
时写入日志时触发答案 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'
注意:不可能。如果你使用_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'头文件。
请尝试此操作并在此处更新结果。