Comment ajouter des bibliothèques .a sur un plugin Flutter via podspec

2020-06-02 flutter cocoapods flutter-plugin

J'essaie d'inclure des fichiers .a du côté iOS du plugin. Voici ma structure de fichiers. entrez la description de l'image ici

Maintenant, lorsque j'essaie d'ajouter des fichiers .a via vendored_libraries sur podspec , l'installation du pod est terminée avec succès. Et quand je compile le code, j'obtiens Library Not Found -lAccuraFace

J'ai essayé d'ajouter le fichier .a dans la section Link Binary With Libraries sur la phase de construction sur la cible Pod. C'est toujours la même chose, comment puis-je définir la podspec de telle manière que le fichier .a soit inclus et lié automatiquement.

Voici mon fichier podspec pour le plugin

Pod::Spec.new do |s|
  s.name             = 'accuraemirates'
  s.version          = '0.0.1'
  s.summary          = 'A new Flutter plugin.'
  s.description      = <<-DESC
A new Flutter plugin.
                       DESC
  s.homepage         = 'http://example.com'
  s.license          = { :file => '../LICENSE' }
  s.author           = { 'Your Company' => '[email protected]' }
  s.source           = { :path => '.' }
  s.source_files = 'Classes/**/*'
  s.dependency 'Flutter'
  s.public_header_files = 'Classes/*{.h}'
  s.private_header_files = 'Classes/CodeScan/**/*{.h,.cpp,.a}'
  s.platform = :ios, '8.0'
  s.preserve_paths = 'opencv2.framework'
  s.xcconfig = { 
    'OTHER_LDFLAGS' => '-framework opencv2 -lAccuraFace',
  }
  s.ios.vendored_frameworks = 'opencv2.framework', "CoreVideo.framework", "Foundation.framework", "CoreGrpahics.framework", 
  "Accelerate.framework", "CoreMedia.framework", "CoreImage.framework", "QuartzCore.framework", "AudioToolbox.framework", "CoreData.framework", "SystemConfiguration.framework"
  s.ios.vendored_libraries = 'Classes/Framework/*{.a}', "libz.1.dylib", "c++", "stdc++"

  # Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported.
  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'VALID_ARCHS[sdk=iphonesimulator*]' => 'x86_64' }
  s.swift_version = '5.0'
end

Voici le podfile racine

ENV['COCOAPODS_DISABLE_STATS'] = 'true'

project 'Runner', {
  'Debug' => :debug,
  'Profile' => :release,
  'Release' => :release,
}

def parse_KV_file(file, separator='=')
  file_abs_path = File.expand_path(file)
  if !File.exists? file_abs_path
    return [];
  end
  generated_key_values = {}
  skip_line_start_symbols = ["#", "/"]
  File.foreach(file_abs_path) do |line|
    next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ }
    plugin = line.split(pattern=separator)
    if plugin.length == 2
      podname = plugin[0].strip()
      path = plugin[1].strip()
      podpath = File.expand_path("#{path}", file_abs_path)
      generated_key_values[podname] = podpath
    else
      puts "Invalid plugin specification: #{line}"
    end
  end
  generated_key_values
end

target 'Runner' do
  use_frameworks!
  use_modular_headers!

  # Flutter Pod

  copied_flutter_dir = File.join(__dir__, 'Flutter')
  copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework')
  copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec')
  unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path)
    # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet.
    # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration.
    # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist.

    generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig')
    unless File.exist?(generated_xcode_build_settings_path)
      raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first"
    end
    generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path)
    cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR'];

    unless File.exist?(copied_framework_path)
      FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir)
    end
    unless File.exist?(copied_podspec_path)
      FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir)
    end
  end

  # Keep pod path relative so it can be checked into Podfile.lock.
  pod 'Flutter', :path => 'Flutter'

  # Plugin Pods

  # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock
  # referring to absolute paths on developers' machines.
  system('rm -rf .symlinks')
  system('mkdir -p .symlinks/plugins')
  plugin_pods = parse_KV_file('../.flutter-plugins')
  plugin_pods.each do |name, path|
    symlink = File.join('.symlinks', 'plugins', name)
    File.symlink(path, symlink)
    pod name, :path => File.join(symlink, 'ios')
  end
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['ENABLE_BITCODE'] = 'NO'
    end
  end
end

Est - il pas possible d'ajouter / lien .a bibliothèques à partir podspec fichier sur un plugin flottement.

Answers

Enfin trouvé le problème ..

Pod::Spec.new do |s|
  # other obvious values
  s.source_files = 'Classes//*{.h,.a,.swift,.mm,.m,.hpp}'
  s.resources = 'Resources//'
  s.static_framework = true 
  s.public_header_files = "Classes/VideoCamera/VideoCameraWrapperDelegate.h", "Classes/VideoCamera/VideoCameraWrapper.h",'Classes/.h',
  s.private_header_files = 'Classes/CodeScan//{.h,.cpp,.hpp}'
  s.platform = :ios, '8.0'
  s.preserve_paths = 'opencv2.framework', 'Classes/Framework/.a'

  s.xcconfig = { 
     # here on LDFLAG, I had to set -l and then the library name (without lib prefix although the file name has it).
    'OTHER_LDFLAGS' => '-framework opencv2 -lc++ -lAccuraFace -lAccuraEmirate -lDocRecog -lz',
    'USER_HEADER_SEARCH_PATHS' => '"${PROJECT_DIR}/.."/',
    "LIBRARY_SEARCH_PATHS" => '"${PROJECT_DIR}/.."/*',
  }
  s.vendored_frameworks = 'opencv2.framework' # Various framworks you need
  # Here the name of the library can include lib as the file name has it too.
  s.vendored_libraries = 'AccuraFace','libAccuraEmirate','libDocRecog'
end

Remarquez deux valeurs ici OTHER_LDFLAGS et vendored_libraries . Bien que j'aie le même fichier, ils ont besoin de noms avec ou sans préfixe lib. Bizarre mais fonctionnait.

Vous POUVEZ certainement ajouter des bibliothèques .a , essayez de vérifier le chemin de configuration suivant

TARGETS->Build Settings->Search Paths-> Library Search Paths

Là, ajoutez le chemin où se .a bibliothèque.

Voici une démo de configuration de chemin valide:

entrez la description de l'image ici

=================================================== ========================

METTRE À JOUR

Pour le plugin Flutter

En ce qui concerne le flutter plugin , le fichier avec .a suffixe .a est en fait une bibliothèque statique, voici un extrait pour savoir comment le faire dans un fichier .podspec :

 s.subspec 'Core' do |sc|
    sc.ios.library = 'z'
    sc.frameworks = 'SystemConfiguration', 'QuartzCore', 'CoreText', 'WebKit'
    sc.source_files = 'AppboyKit/headers/AppboyKitLibrary/*.h', 'AppboyKit/ABKIdentifierForAdvertisingProvider.m', 'AppboyKit/ABKModalWebViewController.m', 'AppboyKit/ABKNoConnectionLocalization.m', 'AppboyKit/ABKLocationManagerProvider.m'
    sc.resource = 'AppboyKit/Appboy.bundle'
    sc.vendored_libraries = 'AppboyKit/libAppboyKitLibrary.a'
    sc.weak_framework = 'CoreTelephony', 'Social', 'Accounts', 'AdSupport', 'UserNotifications'
  end

Faites attention au début de la ligne avec sc.vendored_libraries la source complète .

Related