मेरे पास वर्तमान में मेरे स्पंदन आईओएस/एंड्रॉइड विकास प्रक्रिया में निम्न स्थिति है:

हर बार flutter build इसे निष्पादित करता है pod install जो नियमित स्पंदन पॉडफाइल स्थापित करता है

# Uncomment this line to define a global platform for your project
platform :ios, '10.0'

# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'false'

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

target 'OneSignalNotificationServiceExtension' do
  use_frameworks!
  pod 'OneSignal', '>= 2.9.3', '< 3.0'
end

जैसा कि मेरे ऐप में OneSignal पुश नोटिफिकेशन को सक्षम करने के लिए अंत में देखा गया है, मैंने OneSignalNotificationServiceExtension. चूँकि फ़्लटर रनर को use_frameworks! की आवश्यकता होती है, इसलिए मुझे इस लाइन को OneSignal एक्सटेंशन लक्ष्य में भी जोड़ना होगा।

यह निम्न फ़ाइल को मेरे OneSignal लक्ष्य ("Pods_OneSignalNotificationServiceExtension.framework") पर "सामान्य"> "फ्रेमवर्क और लाइब्रेरी" में शामिल करने की ओर ले जाता है: गलत तरीके से लिंक की गई फ़ाइल

लेकिन यह फ़ाइल शायद मौजूद नहीं है इसलिए बिल्ड विफल हो जाता है।

यदि मैं मैन्युअल रूप से इस फ़ाइल को XCode से हटाता हूं, तो बिल्ड कार्य करता है।

लेकिन मेरे आईडीई से डिबग मोड में फ़्लटर चलाने के बाद से pod install फिर से चलता है, मैं इस लिंक को नहीं हटा सकता, इसलिए मेरा विचार पॉडफाइल के अंदर post_install हुक में हटाने को स्वचालित करना था।

लेकिन चूंकि मैं न तो रूबी से वास्तव में परिचित हूं और न ही इस कॉलबैक में विधियों/गुणों के लिए अच्छा दस्तावेज ढूंढने में सक्षम हूं, इसलिए मुझे यह काम नहीं मिल रहा है।

यहां कुछ ऐसा है जिसे मैंने अभी तक आजमाया है:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['ENABLE_BITCODE'] = 'NO'
    end
    
    if target.name == 'Pods-OneSignalNotificationServiceExtension'
      all_filerefs = installer.pods_project.files
      all_filerefs.each do |fileref|
        #puts(fileref.path)
        if fileref.path.end_with? "Pods_OneSignalNotificationServiceExtension.framework"
         puts("Found Pods_OneSignalNotificationServiceExtension.framework fileref.")
         build_phase = target.frameworks_build_phase
         #puts("Determining if build phase needs correction.")
         
         #all_filerefs.delete(fileref)
         build_phase.remove_file_reference(fileref)
         puts("Removing Pods_OneSignalNotificationServiceExtension.framework from OneSignalNotificationServiceExtension target")
        end
      end
    end
  end
end

लेकिन न तो इसे all_filerefs से हटाना और न ही build_phase.remove_file_reference से काफी काम हो रहा है। क्या कोई जानता है कि मैं एक्सकोड में "फ्रेमवर्क और लाइब्रेरीज़" अनुभाग से लिंक की गई फ़ाइलों तक कैसे पहुंच सकता हूं और कहा गया .framework-file कैसे हटा सकता हूं?

बहुत - बहुत धन्यवाद!

0
Reesz 2 जिंदा 2021, 23:18

1 उत्तर

सबसे बढ़िया उत्तर

सही Google खोज के साथ मैंने इस विषय के संबंध में एक एकल परिणाम खोजने में कामयाबी हासिल की है: https://titanwolf.org/Network/Articles/Article?AID=18711f19-4d55-49b9-a49e-8c4652dc0262#gsc.tab=0

मैंने उनका कार्य "चौथा, लक्ष्य के लिए ढांचे को जोड़ें या हटाएं" से लिया है

def updateCustomFramework(project,target,path,name,command)

    # Get useful variables
    frameworks_group = project.groups.find { |group| group.display_name == 'Frameworks' }
    frameworks_build_phase = target.build_phases.find { |build_phase| build_phase.to_s == 'FrameworksBuildPhase' }
    embed_frameworks_build_phase = nil
    target.build_phases.each do |phase|
        if phase.display_name == 'Embed Frameworks'
            embed_frameworks_build_phase = phase
        end
        # puts phase
    end

    if command == :add
        # Add new "Embed Frameworks" build phase to target
        if embed_frameworks_build_phase.nil?
            embed_frameworks_build_phase = project.new(Xcodeproj::Project::Object::PBXCopyFilesBuildPhase)
            embed_frameworks_build_phase.name = 'Embed Frameworks'
            embed_frameworks_build_phase.symbol_dst_subfolder_spec = :frameworks
            target.build_phases << embed_frameworks_build_phase
        end

        # Add framework search path to target
        ['Debug', 'Release'].each do |config|
            paths = ['$(inherited)', path]
            orgpath = target.build_settings(config)['FRAMEWORK_SEARCH_PATHS']
            if orgpath.nil?
                puts "path is empty----------"
                target.build_settings(config)['FRAMEWORK_SEARCH_PATHS'] = paths
        else
                puts "path is not empty----------"
                paths.each do |p|
                    if !orgpath.include?(p)
                        orgpath << p
                    end
                end
            end
        end

        # Add framework to target as "Embedded Frameworks"
        framework_ref = frameworks_group.new_file("#{path}#{name}")
        exsit = false
        embed_frameworks_build_phase.files_references.each do |ref|
            if ref.name = name
                exsit = true
            end
        end
        if !exsit
            build_file = embed_frameworks_build_phase.add_file_reference(framework_ref)
            frameworks_build_phase.add_file_reference(framework_ref)
            build_file.settings = { 'ATTRIBUTES' => ['CodeSignOnCopy'] }
        end
    else
        frameworks_build_phase.files_references.each do |ref|
            #puts(ref.path)
            if ref.path == "#{name}"
                puts "delete #{name}"
                frameworks_build_phase.remove_file_reference(ref)
                #embed_frameworks_build_phase.remove_file_reference(ref)
                break
            end
        end
        
    end

end

और केवल if ref.name == "#{name}" को if ref.path == "#{name}" में बदल दिया। मैंने यह भी महसूस किया कि मैं installer से pods_projects का उपयोग नहीं कर सकता, लेकिन मुझे स्वयं xcodeproj-file खोलने की आवश्यकता है। यहाँ मेरी अंतिम post_install स्क्रिप्ट है:

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
  
  project_path = 'Runner.xcodeproj'
  project = Xcodeproj::Project.open(project_path) # Opening the Runner.xcodeproj in the same folder as the Podfile
  project.targets.each do |target|
    if target.name == "OneSignalNotificationServiceExtension" # Find the OneSignal Target
      updateCustomFramework(project, target, '', 'Pods_OneSignalNotificationServiceExtension.framework', ':remove') # Run the function on the target with the framework name
    end
  end
  project.save() # Don't forget to save the project, or the changes won't stay
end

उसके बाद एक flutter clean आवश्यक था और बाद में flutter build एक आकर्षण की तरह काम करता है। उम्मीद है कि भविष्य में इससे किसी का 6 घंटे का समय बचेगा।

0
Reesz 3 जिंदा 2021, 00:27