Изменить источник значка приложения в Target › General (не Info.plist) с помощью скрипта (Fastlane-)

Я только начал использовать Fastlane для автоматического развертывания наших приложений для iOS. У нас есть несколько белых ярлыков (одно и то же приложение, разные стили, контент, значки и т. д.).

Используя Fastlane, я могу изменить почти все настройки перед началом сборки (номер версии и сборки, файл экрана запуска и т. д.).

Где я борюсь, так это в источнике значков приложений. Мы используем наборы изображений (по одному AppIcon-NAME.appiconset на приложение). См. изображение ниже для справки, где он установлен: введите здесь описание изображения

Как мне изменить это свойство с помощью Fastlane, любого другого пользовательского скрипта или на этапе сборки? Кажется, это изменения в xcodeproj.pbxproj, а не в Info.plist, что значительно усложняет поиск.

Спасибо.


person Jeroen    schedule 21.03.2019    source источник
comment
Я бы попытался выяснить, какой именно файл и местоположение изменяются, когда вы меняете что-то в пользовательском интерфейсе, который вы разместили выше. Это должно облегчить поиск подходящего действия на полосе быстрого доступа (или помочь решить, следует ли использовать xcodeproj ruby-библиотека в полосе Fastfile напрямую, если не существует подходящего действия)   -  person janpio    schedule 21.03.2019


Ответы (2)


Я предполагаю, что вы используете gym для создания приложения, верно?

Вы можете использовать параметр xcargs и передать путь к вашему файлу .appiconset с помощью ключа ASSETCATALOG_COMPILER_APPICON_NAME.

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

Вы можете найти документ для gym здесь, к сожалению, официальной документации для ASSETCATALOG_COMPILER_APPICON_NAME нет. настройка сборки.

person mokagio    schedule 08.04.2019

Для себя я сделал пользовательское действие с именем 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]}"
)

Я надеюсь, что это поможет вам!

person HyoJin KIM    schedule 09.06.2019
comment
Это очень полезно. Спасибо. - person Steven Schmatz; 07.01.2020
comment
Нужно ли после этого пересобирать приложение? - person NikLoy; 04.02.2020
comment
Да. После этого переулка следует строить заново. Что касается меня, я строю с тренажерным залом после этой дорожки. - person HyoJin KIM; 22.02.2020
comment
Это потрясающе! Понятия не имею о рубине и о том, что означает этот код, но я обязательно узнаю после этого. - person Agent Smith; 01.10.2020