【问题标题】:use_frameworks! for only some pods or swift pods使用_frameworks!仅适用于一些 pod 或 swift pod
【发布时间】:2016-09-20 03:57:30
【问题描述】:

我的项目中有 Objective CSwift Pod。

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

由于 swift POD(XWebView, Starscream) 只能作为我必须使用的框架添加 使用_frameworks!

但这使得所有 POD 都成为框架,包括 Objective-C POD(WBWebViewConsole)。

但这会导致 Objective-C POD 出现问题,但我不打算将 Objective-C POD 作为框架。

那么无论如何我可以忽略几个 POD 被转换为框架?

谢谢。

更新:

如何重现问题?

问题在于 POD WBWebViewConsole

在任何具有互联网连接的 iOS 8+ 设备中运行attached project,因为它会从谷歌驱动器加载 html 文档。

在 html 文档中……点击 General/Info/Warning/Debug/Error Log

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

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

每当您单击按钮时,除了在 html 页面中显示一些文本之外,我都会在后台编写一些日志。

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

Get logs-> 是一个附加在 webview 上的原生按钮。该库让我们可以从 wkwebview 读取控制台日志 ..

现在在 POD 中 u 取消注释以下行

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

然后进行 pod 安装

然后将以下代码粘贴到 ViewController 之上

import WBWebViewConsole

这里是project,其中包含所有未注释的内容以及重现问题所需的所有更改

现在你在设备上运行项目并单击 html 页面中的一些按钮并单击 get logs 你看不到在 html 页面中生成的 cmets

具体来说,以下在 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 页面中的按钮写入日志时,上述委托应该被触发

【问题讨论】:

  • 您知道use_frameworks! 只能与( >= iOS 8.0) 一起使用吗?
  • 哦,我不知道,但我的项目支持仅从 iOS 8 开始..so np
  • 我首先尝试使用pod 'WBWebViewConsole', '~> 1.0.1',然后才添加use_frameworks! pod 'XWebView', '~>0.9.5’ ...现在我有框架和文件。然后你可以删除你不需要的文件/框架。
  • “但它会导致问题”——您能否提供一些有关问题所在的详细信息?我注意到的是,除非 pod 使用静态框架,否则 Obj-C pod 会很好地导入,然后你会得到各种各样的错误。但了解您遇到的实际错误会有所帮助。
  • @tkelly - 我更新了我的问题。

标签: ios objective-c swift cocoapods wbwebviewconsole


【解决方案1】:

基于 CocoaPods 的成员:

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

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

【讨论】:

  • 关于为什么目标 c pod 在转换为框架时无法正常工作的任何想法?
  • 可能是由于损坏的 Header/Library/Framework 搜索路径或其他原因?
  • 检查桥接头
【解决方案2】:
                    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之上指定objective c pod!。

【讨论】:

  • 目标 c pod 在转换为框架时无法正常工作。
【解决方案3】:

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 'WBWebViewConsole', '~> 1.0.2'

  1. pod 安装
  2. 重启 Xcode 并清理您的项目
  3. 再次构建并运行

注意:这是不可能的。如果你使用_frameworks!一切都变成了动态框架。

【讨论】:

    【解决方案4】:

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

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

    请试试这个并在此处更新结果。

    【讨论】:

    • 好的。明白了!它应该可以工作。但它不工作..没有编译时错误......只是在运行时一些委托没有触发..所以它与 Xcode 构建设置中的 Header/Library/Framework 搜索路径有什么关系吗?我还在想为什么?
    • 确保桥接头设置正确 - learnswiftonline.com/getting-started/…
    • 桥接头已正确设置...因为我们正在将 PODS 添加为动态框架。我猜桥接头不是必需的
    • 是的,桥接头应该不是必需的,但是即使您使用动态框架集成它们,仍然很少有 pod 仍然需要桥接头。
    【解决方案5】:

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

    【讨论】:

    • 完美解决方案。但现在 Pod::Target::BuildType 在 cocoapods 1.9.1 中是 Pod::BuildType
    • 绝妙的解决方案!当您将 Amplify Pod 添加到项目时也可以正常工作。以前IT让我头疼!谢谢!
    • 我仍然收到此错误:[!] 'Pods-CallKitExample' 目标具有传递依赖项,包括静态链接的二进制文件:(/Users/thehe/Desktop/CallKitExample/Pods/Vialer-pjsip-iOS /VialerPJSIP.framework) 你能帮忙吗
    猜你喜欢
    • 1970-01-01
    • 2018-12-11
    • 2020-08-28
    • 2017-03-05
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    相关资源
    最近更新 更多