使用 (Fastlane-) 脚本在 "Target > General"(不是 Info.plist)中更改 "App Icon Source"

Change "App Icon Source" in "Target > General" (not Info.plist) using (Fastlane-)script

我刚开始使用 Fastlane 来自动部署我们的 iOS 应用程序。我们有一些白色标签(相同的应用程序,不同的样式、内容、图标等)。

使用 Fastlane,我可以在开始构建之前更改几乎所有设置(版本和构建编号、启动屏幕文件等)。

我苦苦挣扎的地方是应用程序图标源。我们使用图像集(每个应用一个 AppIcon-NAME.appiconset)。请参阅下图以供参考设置位置:

我将如何使用 Fastlane、任何其他自定义脚本或在构建阶段更改此 属性?这似乎是 xcodeproj.pbxproj 而不是 Info.plist 的变化,这使得它更难找到。

谢谢。

我假设您正在使用 gym 构建应用程序,对吗?

您可以使用 xcargs 参数并使用 ASSETCATALOG_COMPILER_APPICON_NAME 键将路径传递到您的 .appiconset 文件。

gym(
  xcargs: "ASSETCATALOG_COMPILER_APPICON_NAME=./path/to/your/icon/file"
)

您可以找到 gym here 的文档,遗憾的是 ASSETCATALOG_COMPILER_APPICON_NAME 构建设置没有官方文档。

对我来说,我做了一个名为 update_appicon.rb 的自定义操作。

# coding: utf-8
module Fastlane
  module Actions
    class UpdateAppicon < Action
      def self.run(params)
        require 'plist'
        require 'xcodeproj'

        info_plist_key = 'INFOPLIST_FILE'
        appicon_name = 'ASSETCATALOG_COMPILER_APPICON_NAME'

        # Load .xcodeproj
        project_path = params[:xcodeproj]
        project = Xcodeproj::Project.open(project_path)

        # Fetch the build configuration objects
        configs = project.objects.select { |obj| obj.isa == 'XCBuildConfiguration'}
        UI.user_error!("Not found XCBuildConfiguration from xcodeproj") unless configs.count > 0

        configs = configs.select { |obj| obj.build_settings[info_plist_key] == params[:plist_path] }
        UI.user_error!("Xcodeproj doesn't have configuration with info plist #{params[:plist_path]}.") unless configs.count > 0

        # For each of the build configurations, set app identifier
        configs.each do |c|
          c.build_settings[appicon_name] = params[:appicon_name]
        end

        # Write changes to the file
        project.save

        UI.success("Updated #{params[:xcodeproj]} .")
      end

      #####################################################
      # @!group Documentation
      #####################################################

      def self.is_supported?(platform)
        [:ios].include?(platform)
      end

      def self.description
        "Update the project's bundle identifier"
      end

      def self.details
        "Update an app identifier by either setting `ASSETCATALOG_COMPILER_APPICON_NAME`."
      end

      def self.available_options
        [
          FastlaneCore::ConfigItem.new(key: :xcodeproj,
                                       env_name: "FL_UPDATE_APPICON_PROJECT_PATH",
                                       description: "Path to your Xcode project",
                                       default_value: Dir['*.xcodeproj'].first,
                                       verify_block: proc do |value|
                                         UI.user_error!("Please pass the path to the project, not the workspace") unless value.end_with?(".xcodeproj")
                                         UI.user_error!("Could not find Xcode project") unless File.exist?(value)
                                       end),
          FastlaneCore::ConfigItem.new(key: :plist_path,
                                       env_name: "FL_UPDATE_APPICON_PLIST_PATH",
                                       description: "Path to info plist, relative to your Xcode project",
                                       verify_block: proc do |value|
                                         UI.user_error!("Invalid plist file") unless value[-6..-1].casecmp(".plist").zero?
                                       end),
          FastlaneCore::ConfigItem.new(key: :appicon_name,
                                       env_name: 'FL_APPICON_ID',
                                       description: 'appicon name')
        ]
      end

      def self.authors
        ['ruman']
      end

      def self.category
        :project
      end
    end
  end

并应用于fastfile

update_appicon(
    xcodeproj: "YourProjectName.xcodeproj",
    plist_path: "Info.plist",
    appicon_name: "AppIcon#{options[:app_icon]}"
)

希望对您有所帮助!