#if canImport (CoreImage) не работает в диспетчере пакетов Swift

Я сделал библиотеку, которая использует CoreImage. Библиотека поддерживает пакетный менеджер Cocoapods, Carthage и Swift.

Когда я собираю его в Swift Package Manager, я получил эту ошибку:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_CIFilter", referenced from:
      objc-class-ref in EIP67Code.swift.o
  "_OBJC_CLASS_$_CIImage", referenced from:
      objc-class-ref in EIP67Code.swift.o
ld: symbol(s) not found for architecture x86_64

Когда я использую #if canImport(CoreImage)

#if canImport(CoreImage)
import CoreImage
extension Web3 {
  public struct EIP67CodeGenerator {
    public static func createImage(from: EIP67Code, scale: Double = 1.0) -> CIImage {
      guard let string = from.toString().addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) else { return CIImage() }
      guard let data = string.data(using: .utf8, allowLossyConversion: false) else { return CIImage() }
      let filter = CIFilter(name: "CIQRCodeGenerator", parameters: ["inputMessage" : data, "inputCorrectionLevel":"L"])
      guard var image = filter?.outputImage else { return CIImage() }
      let transformation = CGAffineTransform(scaleX: CGFloat(scale), y: CGFloat(scale))
      image = image.transformed(by: transformation)
      return image
    }
  }
}
extension Web3.EIP67Code {
  public func toImage(scale: Double = 1.0) -> CIImage {
    return Web3.EIP67CodeGenerator.createImage(from: self, scale: scale)
  }
}
#endif

Он отлично работает, если я использую #if os(iOS) || os(tvOS)

Но CoreImage работает на macOS, поэтому мне все еще нужен этот код, по крайней мере, для carthage / cocoapods.


person Dmitry Kozlov    schedule 04.10.2018    source источник
comment
Вы нашли решение?   -  person t.ios    schedule 19.08.2019
comment
Я только что удалил этот файл в Package.swift .target (имя: web3swift, исключить: [ObjectiveC, Utils / EIP67Code.swift, Migration-iOS.swift]),   -  person Dmitry Kozlov    schedule 29.08.2019


Ответы (3)


Не нашел решения, поэтому просто исключил этот файл из Package.swift.

.target(
name: "web3swift",
dependencies: ["BigInt", "secp256k1", "keccak", "scrypt", "PromiseKit", "base58"],
exclude: ["ObjectiveC", "Utils/EIP67Code.swift", "Migration-iOS.swift"]
),
person Dmitry Kozlov    schedule 29.08.2019

Возможно, какая-то функция в вашей структуре, зависящая от CoreImage, не поддерживает macOS 10.10, которая используется по умолчанию Package.swift. Попробуйте обновить поддержку пакетов, начиная с macOS 10.12.

let package = Package(
    name: "Example",
    platforms: [
      .macOS(.v10_12),
    ]
)
person Liang Zeng    schedule 18.10.2019

Это ошибка компоновщика, которая проявляется для фреймворков, имена которых были перемещены или изменены. Для конкретного случая CoreImage вы можете решить проблему, установив в качестве цели развертывания macOS 10.12 или импортировав QuartzCore вместо CoreImage.

Если вы откроете tbd-файл платформы ($(xcrun --sdk macosx --show-sdk-path)/System/Library/Frameworks/CoreImage.framework/Versions/A/CoreImage.tbd) и найдете символы, которые начинаются с $ld$install_name$os, то эта платформа затронет эту ошибку, и вам потребуется либо использовать цель развертывания, которая более поздняя, ​​чем последнее имя_установки в списке (в данном случае , более поздняя, ​​чем 10.11), или вам необходимо импортировать фреймворк с его старым именем (в этом имени QuartzCore).

person zneak    schedule 23.04.2021