Class: Fastlane::Actions::UpdateUrlSchemesAction

Inherits:
Fastlane::Action show all
Defined in:
fastlane/lib/fastlane/actions/update_url_schemes.rb

Constant Summary

Constants inherited from Fastlane::Action

Fastlane::Action::AVAILABLE_CATEGORIES, Fastlane::Action::RETURN_TYPES

Class Method Summary collapse

Methods inherited from Fastlane::Action

action_name, author, deprecated_notes, lane_context, method_missing, other_action, return_type, return_value, sample_return_value, shell_out_should_use_bundle_exec?, step_text

Class Method Details

.authorsObject



84
85
86
# File 'fastlane/lib/fastlane/actions/update_url_schemes.rb', line 84

def self.authors
  ['kmikael']
end

.available_optionsObject



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'fastlane/lib/fastlane/actions/update_url_schemes.rb', line 52

def self.available_options
  [
    FastlaneCore::ConfigItem.new(key: :path,
                                 env_name: 'FL_UPDATE_URL_SCHEMES_PATH',
                                 description: 'The Plist file\'s path',
                                 optional: false,
                                 verify_block: proc do |path|
                                   UI.user_error!("Could not find plist at path '#{path}'") unless File.exist?(path)
                                 end),
    FastlaneCore::ConfigItem.new(key: :url_schemes,
                                 env_name: "FL_UPDATE_URL_SCHEMES_SCHEMES",
                                 description: 'The new URL schemes',
                                 type: Array,
                                 optional: true),
    FastlaneCore::ConfigItem.new(key: :update_url_schemes,
                                 description: "Block that is called to update schemes with current schemes passed in as parameter",
                                 optional: true,
                                 type: :string_callback)
  ]
end

.categoryObject



107
108
109
# File 'fastlane/lib/fastlane/actions/update_url_schemes.rb', line 107

def self.category
  :project
end

.descriptionObject



48
49
50
# File 'fastlane/lib/fastlane/actions/update_url_schemes.rb', line 48

def self.description
  'Updates the URL schemes in the given Info.plist'
end

.detailsObject



73
74
75
76
77
78
# File 'fastlane/lib/fastlane/actions/update_url_schemes.rb', line 73

def self.details
  [
    "This action allows you to update the URL schemes of the app before building it.",
    "For example, you can use this to set a different URL scheme for the alpha or beta version of the app."
  ].join("\n")
end

.example_codeObject



92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'fastlane/lib/fastlane/actions/update_url_schemes.rb', line 92

def self.example_code
  [
    'update_url_schemes(
      path: "path/to/Info.plist",
      url_schemes: ["com.myapp"]
    )',
    'update_url_schemes(
      path: "path/to/Info.plist",
      update_url_schemes: proc do |schemes|
        schemes + ["anotherscheme"]
      end
    )'
  ]
end

.is_supported?(platform) ⇒ Boolean

Returns:



88
89
90
# File 'fastlane/lib/fastlane/actions/update_url_schemes.rb', line 88

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

.outputObject



80
81
82
# File 'fastlane/lib/fastlane/actions/update_url_schemes.rb', line 80

def self.output
  []
end

.run(params) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'fastlane/lib/fastlane/actions/update_url_schemes.rb', line 6

def self.run(params)
  path = params[:path]
  url_schemes = params[:url_schemes]
  update_url_schemes = params[:update_url_schemes]

  hash = Plist.parse_xml(path)

  # Create CFBundleURLTypes array with empty scheme if none exist
  unless hash['CFBundleURLTypes']
    hash['CFBundleURLTypes'] = [{
      'CFBundleTypeRole' => 'Editor',
      'CFBundleURLSchemes' => []
    }]
  end

  # Updates schemes with update block if exists
  # Else updates with array of strings if exist
  # Otherwise shows error to user
  if update_url_schemes
    new_schemes = update_url_schemes.call(hash['CFBundleURLTypes'].first['CFBundleURLSchemes'])

    # Verify array of strings
    string = "The URL schemes must be an array of strings, got '#{new_schemes}'."
    verify_schemes!(new_schemes, string)

    hash['CFBundleURLTypes'].first['CFBundleURLSchemes'] = new_schemes
  elsif url_schemes
    hash['CFBundleURLTypes'].first['CFBundleURLSchemes'] = url_schemes
  else
    UI.user_error!("No `url_schemes` or `update_url_schemes` provided")
  end
  File.write(path, Plist::Emit.dump(hash))
end

.verify_schemes!(url_schemes, error_message) ⇒ Object



40
41
42
43
44
45
46
# File 'fastlane/lib/fastlane/actions/update_url_schemes.rb', line 40

def self.verify_schemes!(url_schemes, error_message)
  UI.user_error!(error_message) unless url_schemes.kind_of?(Array)

  url_schemes.each do |url_scheme|
    UI.user_error!(error_message) unless url_scheme.kind_of?(String)
  end
end