module Fastlane module Actions # Resigns the ipa class ResignAction < Action def self.run(params) require 'sigh' # try to resign the ipa if Sigh::Resign.resign(params[:ipa], params[:signing_identity], params[:provisioning_profile], params[:entitlements], params[:version], params[:display_name], params[:short_version], params[:bundle_version], params[:bundle_id], params[:use_app_entitlements], params[:keychain_path]) UI.success('Successfully re-signed .ipa 🔏.') else UI.user_error!("Failed to re-sign .ipa") end end def self.description "Codesign an existing ipa file" end def self.details sample = <<-SAMPLE.markdown_sample ```ruby resign(ipa: "path", signing_identity: "identity", provisioning_profile: { "com.example.awesome-app" => "App.mobileprovision", "com.example.awesome-app.app-extension" => "Extension.mobileprovision" }) ``` SAMPLE [ "You may provide multiple provisioning profiles if the application contains nested applications or app extensions, which need their own provisioning profile. You can do so by passing an array of provisiong profile strings or a hash that associates provisioning profile values to bundle identifier keys.".markdown_preserve_newlines, sample ].join("\n") end def self.example_code [ 'resign( ipa: "path/to/ipa", # can omit if using the `ipa` action signing_identity: "iPhone Distribution: Luka Mirosevic (0123456789)", provisioning_profile: "path/to/profile", # can omit if using the _sigh_ action )', 'resign( ipa: "path/to/ipa", # can omit if using the `ipa` action signing_identity: "iPhone Distribution: Luka Mirosevic (0123456789)", provisioning_profile: { "com.example.awesome-app" => "path/to/profile", "com.example.awesome-app.app-extension" => "path/to/app-extension/profile" } )' ] end def self.category :code_signing end def self.available_options [ FastlaneCore::ConfigItem.new(key: :ipa, env_name: "FL_RESIGN_IPA", description: "Path to the ipa file to resign. Optional if you use the _gym_ or _xcodebuild_ action", default_value: Actions.lane_context[SharedValues::IPA_OUTPUT_PATH], default_value_dynamic: true, verify_block: proc do |value| UI.user_error!("Couldn't find ipa file at path '#{value}'") unless File.exist?(value) end), FastlaneCore::ConfigItem.new(key: :signing_identity, env_name: "FL_RESIGN_SIGNING_IDENTITY", description: "Code signing identity to use. e.g. \"iPhone Distribution: Luka Mirosevic (0123456789)\""), FastlaneCore::ConfigItem.new(key: :entitlements, env_name: "FL_RESIGN_ENTITLEMENTS", description: "Path to the entitlement file to use, e.g. \"myApp/MyApp.entitlements\"", conflicting_options: [:use_app_entitlements], is_string: true, optional: true), FastlaneCore::ConfigItem.new(key: :provisioning_profile, env_name: "FL_RESIGN_PROVISIONING_PROFILE", description: "Path to your provisioning_profile. Optional if you use _sigh_", default_value: Actions.lane_context[SharedValues::SIGH_PROFILE_PATH], default_value_dynamic: true, is_string: false, verify_block: proc do |value| files = case value when Hash then value.values when Enumerable then value else [value] end files.each do |file| UI.user_error!("Couldn't find provisiong profile at path '#{file}'") unless File.exist?(file) end end), FastlaneCore::ConfigItem.new(key: :version, env_name: "FL_RESIGN_VERSION", description: "Version number to force resigned ipa to use.\nUpdates both CFBundleShortVersionString and CFBundleVersion values in Info.plist.\nApplies for main app and all nested apps or extensions", conflicting_options: [:short_version, :bundle_version], is_string: true, optional: true), FastlaneCore::ConfigItem.new(key: :display_name, env_name: "FL_DISPLAY_NAME", description: "Display name to force resigned ipa to use", is_string: true, optional: true), FastlaneCore::ConfigItem.new(key: :short_version, env_name: "FL_RESIGN_SHORT_VERSION", description: "Short version string to force resigned ipa to use (CFBundleShortVersionString)", conflicting_options: [:version], is_string: true, optional: true), FastlaneCore::ConfigItem.new(key: :bundle_version, env_name: "FL_RESIGN_BUNDLE_VERSION", description: "Bundle version to force resigned ipa to use (CFBundleVersion)", conflicting_options: [:version], is_string: true, optional: true), FastlaneCore::ConfigItem.new(key: :bundle_id, env_name: "FL_RESIGN_BUNDLE_ID", description: "Set new bundle ID during resign (CFBundleIdentifier)", is_string: true, optional: true), FastlaneCore::ConfigItem.new(key: :use_app_entitlements, env_name: "FL_USE_APP_ENTITLEMENTS", description: "Extract app bundle codesigning entitlements\nand combine with entitlements from new provisionin profile", conflicting_options: [:entitlements], is_string: false, optional: true), FastlaneCore::ConfigItem.new(key: :keychain_path, env_name: "FL_RESIGN_KEYCHAIN_PATH", description: "Provide a path to a keychain file that should be used by /usr/bin/codesign", is_string: true, optional: true) ] end def self.author "lmirosevic" end def self.is_supported?(platform) platform == :ios end end end end