fastlane 2.13.0 → 2.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/credentials_manager/lib/credentials_manager.rb +1 -1
  3. data/fastlane/lib/fastlane/actions/ipa.rb +2 -1
  4. data/fastlane/lib/fastlane/actions/mailgun.rb +15 -2
  5. data/fastlane/lib/fastlane/actions/scan.rb +14 -0
  6. data/fastlane/lib/fastlane/documentation/docs_generator.rb +24 -1
  7. data/fastlane/lib/fastlane/environment_printer.rb +2 -1
  8. data/fastlane/lib/fastlane/fast_file.rb +4 -4
  9. data/fastlane/lib/fastlane/version.rb +1 -1
  10. data/fastlane_core/lib/fastlane_core.rb +1 -1
  11. data/fastlane_core/lib/fastlane_core/configuration/config_item.rb +44 -2
  12. data/fastlane_core/lib/fastlane_core/device_manager.rb +15 -0
  13. data/fastlane_core/lib/fastlane_core/helper.rb +1 -1
  14. data/fastlane_core/lib/fastlane_core/ui/disable_colors.rb +4 -4
  15. data/frameit/lib/frameit/config_parser.rb +8 -13
  16. data/frameit/lib/frameit/editor.rb +3 -2
  17. data/gym/lib/gym/options.rb +4 -2
  18. data/match/README.md +2 -2
  19. data/match/lib/match.rb +5 -19
  20. data/match/lib/match/generator.rb +8 -1
  21. data/match/lib/match/git_helper.rb +3 -1
  22. data/match/lib/match/nuke.rb +18 -14
  23. data/match/lib/match/options.rb +13 -2
  24. data/match/lib/match/runner.rb +20 -8
  25. data/match/lib/match/table_printer.rb +5 -4
  26. data/match/lib/match/utils.rb +12 -8
  27. data/scan/lib/scan/options.rb +24 -1
  28. data/scan/lib/scan/runner.rb +12 -11
  29. data/scan/lib/scan/test_command_generator.rb +10 -2
  30. data/sigh/lib/sigh/download_all.rb +1 -1
  31. data/sigh/lib/sigh/runner.rb +2 -2
  32. data/snapshot/lib/snapshot/options.rb +2 -1
  33. data/snapshot/lib/snapshot/runner.rb +12 -12
  34. data/spaceship/lib/spaceship.rb +1 -0
  35. data/spaceship/lib/spaceship/base.rb +27 -4
  36. data/spaceship/lib/spaceship/client.rb +3 -2
  37. data/spaceship/lib/spaceship/du/du_client.rb +26 -16
  38. data/spaceship/lib/spaceship/portal/app.rb +1 -1
  39. data/spaceship/lib/spaceship/portal/person.rb +53 -0
  40. data/spaceship/lib/spaceship/portal/persons.rb +49 -0
  41. data/spaceship/lib/spaceship/portal/portal.rb +2 -0
  42. data/spaceship/lib/spaceship/portal/portal_client.rb +69 -10
  43. data/spaceship/lib/spaceship/portal/provisioning_profile.rb +29 -1
  44. data/spaceship/lib/spaceship/tunes/application.rb +11 -1
  45. data/spaceship/lib/spaceship/tunes/iap.rb +113 -0
  46. data/spaceship/lib/spaceship/tunes/iap_detail.rb +185 -0
  47. data/spaceship/lib/spaceship/tunes/iap_families.rb +62 -0
  48. data/spaceship/lib/spaceship/tunes/iap_family_details.rb +59 -0
  49. data/spaceship/lib/spaceship/tunes/iap_family_list.rb +33 -0
  50. data/spaceship/lib/spaceship/tunes/iap_list.rb +72 -0
  51. data/spaceship/lib/spaceship/tunes/iap_status.rb +48 -0
  52. data/spaceship/lib/spaceship/tunes/iap_type.rb +45 -0
  53. data/spaceship/lib/spaceship/tunes/tunes.rb +1 -0
  54. data/spaceship/lib/spaceship/tunes/tunes_client.rb +163 -1
  55. metadata +21 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 564e6544aeab7f92fc130134ce78fee3a037cb16
4
- data.tar.gz: 68f2180b569422134323d02514a6c1c6b08d73e4
3
+ metadata.gz: 070a2e3ea852f83722a3a732f385c6d998b4a91f
4
+ data.tar.gz: 6b4a9022927123cece1c49d6a1b691c61ed37f3a
5
5
  SHA512:
6
- metadata.gz: 1c65b9bc5a1494d9d9a06fff5dc282293a62082826010a73f6b4edc9a7043fc3d1603591cf265744bdaa86936207561adbf3abfc23ccb98106688d710b9be790
7
- data.tar.gz: 36d5d7e41b5575e3ad1c18875f571322d4fef79172ca881042cc7f516d231b7e35ae158ee1ef06deeaa7538da242c3d60efb8a1d321215b0897a222fc75a271c
6
+ metadata.gz: adf527daf42b09341b84cba7ccd8029de0ffe3303946cce19c89ed6822400dc94223d527fcadad63a75a892351c145d73c1191683f1b12b9ce282841edc8c0a9
7
+ data.tar.gz: 268b99f8538e136d11764042be7d43ecda6f2caffee580413cc25e813ab0ef4fc3abed4f00bc61abb54605a17e6b1b1da77d033e4d1e9ef18215f217e21e97e1
@@ -4,7 +4,7 @@ require 'credentials_manager/cli'
4
4
  require 'credentials_manager/appfile_config'
5
5
 
6
6
  # Third Party code
7
- require 'colored'
7
+ require 'colored2'
8
8
  require 'security'
9
9
  require 'highline/import' # to hide the entered password
10
10
 
@@ -187,7 +187,8 @@ module Fastlane
187
187
  FastlaneCore::ConfigItem.new(key: :xcargs,
188
188
  env_name: "IPA_XCARGS",
189
189
  description: "Pass additional arguments to xcodebuild when building the app. Be sure to quote multiple args",
190
- optional: true)
190
+ optional: true,
191
+ type: :shell_string)
191
192
  ]
192
193
  end
193
194
 
@@ -86,7 +86,12 @@ module Fastlane
86
86
  env_name: "MAILGUN_REPLY_TO",
87
87
  description: "Mail Reply to",
88
88
  optional: true,
89
- is_string: true)
89
+ is_string: true),
90
+ FastlaneCore::ConfigItem.new(key: :attachment,
91
+ env_name: "MAILGUN_ATTACHMENT",
92
+ description: "Mail Attachment filenames, either an array or just one string",
93
+ optional: true,
94
+ is_string: false)
90
95
 
91
96
  ]
92
97
  end
@@ -114,6 +119,13 @@ module Fastlane
114
119
  unless options[:reply_to].nil?
115
120
  params.store(:"h:Reply-To", options[:reply_to])
116
121
  end
122
+
123
+ unless options[:attachment].nil?
124
+ attachment_filenames = [*options[:attachment]]
125
+ attachments = attachment_filenames.map { |filename| File.new(filename, 'rb') }
126
+ params.store(:attachment, attachments)
127
+ end
128
+
117
129
  RestClient.post "https://api:#{options[:apikey]}@api.mailgun.net/v3/#{sandbox_domain}/messages", params
118
130
  mail_template(options)
119
131
  end
@@ -158,7 +170,8 @@ module Fastlane
158
170
  message: "Mail Body",
159
171
  app_link: "http://www.myapplink.com",
160
172
  ci_build_link: "http://www.mycibuildlink.com",
161
- template_path: "HTML_TEMPLATE_PATH"
173
+ template_path: "HTML_TEMPLATE_PATH",
174
+ attachment: "dirname/filename.ext"
162
175
  )'
163
176
  ]
164
177
  end
@@ -77,6 +77,20 @@ module Fastlane
77
77
  workspace: "App.xcworkspace",
78
78
  scheme: "MyTests",
79
79
  clean: false
80
+ )',
81
+ '#Build For Testing
82
+ scan(
83
+ derived_data_path: "my_folder",
84
+ build_for_testing: true
85
+ )',
86
+ '# run tests using derived data from prev. build
87
+ scan(
88
+ derived_data_path: "my_folder",
89
+ test_without_building: true
90
+ )',
91
+ '# or run it from an existing xctestrun package
92
+ scan(
93
+ xctestrun: "/path/to/mytests.xctestrun"
80
94
  )'
81
95
  ]
82
96
  end
@@ -7,9 +7,32 @@ module Fastlane
7
7
  output << "================"
8
8
 
9
9
  output << "# Installation"
10
+ output << ""
11
+ output << "Make sure you have the latest version of the Xcode command line tools installed:"
12
+ output << ""
10
13
  output << "```"
11
- output << "sudo gem install fastlane"
14
+ output << "xcode-select --install"
12
15
  output << "```"
16
+ output << ""
17
+ output << "## Choose your installation method:"
18
+ output << ""
19
+ output << "<table width=\"100%\" >"
20
+ output << "<tr>"
21
+ output << "<th width=\"33%\"><a href=\"http://brew.sh\">Homebrew</a></td>"
22
+ output << "<th width=\"33%\">Installer Script</td>"
23
+ output << "<th width=\"33%\">Rubygems</td>"
24
+ output << "</tr>"
25
+ output << "<tr>"
26
+ output << "<td width=\"33%\" align=\"center\">macOS</td>"
27
+ output << "<td width=\"33%\" align=\"center\">macOS</td>"
28
+ output << "<td width=\"33%\" align=\"center\">macOS or Linux with Ruby 2.0.0 or above</td>"
29
+ output << "</tr>"
30
+ output << "<tr>"
31
+ output << "<td width=\"33%\"><code>brew cask install fastlane</code></td>"
32
+ output << "<td width=\"33%\"><a href=\"https://download.fastlane.tools/fastlane.zip\">Download the zip file</a>. Then double click on the <code>install</code> script (or run it in a terminal window).</td>"
33
+ output << "<td width=\"33%\"><code>sudo gem install fastlane -NV</code></td>"
34
+ output << "</tr>"
35
+ output << "</table>"
13
36
 
14
37
  output << "# Available Actions"
15
38
 
@@ -217,7 +217,8 @@ module Fastlane
217
217
  "Host" => "#{product} #{version} (#{build})",
218
218
  "Ruby Lib Dir" => anonymized_path(RbConfig::CONFIG['libdir']),
219
219
  "OpenSSL Version" => OpenSSL::OPENSSL_VERSION,
220
- "Is contained" => Helper.contained_fastlane?.to_s
220
+ "Is contained" => Helper.contained_fastlane?.to_s,
221
+ "Is homebrew" => Helper.homebrew?.to_s
221
222
  }
222
223
 
223
224
  if Helper.mac?
@@ -206,12 +206,12 @@ module Fastlane
206
206
 
207
207
  UI.user_error!("Could not find Fastfile at path '#{path}'") unless File.exist?(path)
208
208
 
209
- collector.did_launch_action(:import)
210
- parse(File.read(path), path)
211
-
212
- # Check if we can also import local actions which are in the same directory as the Fastfile
209
+ # First check if there are local actions to import in the same directory as the Fastfile
213
210
  actions_path = File.join(File.expand_path("..", path), 'actions')
214
211
  Fastlane::Actions.load_external_actions(actions_path) if File.directory?(actions_path)
212
+
213
+ collector.did_launch_action(:import)
214
+ parse(File.read(path), path)
215
215
  end
216
216
 
217
217
  # @param url [String] The git URL to clone the repository from
@@ -1,4 +1,4 @@
1
1
  module Fastlane
2
- VERSION = '2.13.0'.freeze
2
+ VERSION = '2.14.0'.freeze
3
3
  DESCRIPTION = "The easiest way to automate beta deployments and releases for your iOS and Android apps".freeze
4
4
  end
@@ -31,7 +31,7 @@ require 'fastlane_core/keychain_importer'
31
31
  require 'fastlane_core/swag'
32
32
 
33
33
  # Third Party code
34
- require 'colored'
34
+ require 'colored2'
35
35
  require 'commander'
36
36
 
37
37
  # after commander import
@@ -1,6 +1,43 @@
1
1
  module FastlaneCore
2
2
  class ConfigItem
3
- attr_accessor :key, :env_name, :description, :short_option, :default_value, :verify_block, :optional, :conflicting_options, :conflict_block, :deprecated, :sensitive
3
+ # [Symbol] the key which is used as command paramters or key in the fastlane tools
4
+ attr_accessor :key
5
+
6
+ # [String] the name of the environment variable, which is only used if no other values were found
7
+ attr_accessor :env_name
8
+
9
+ # [String] A description shown to the user
10
+ attr_accessor :description
11
+
12
+ # [String] A string of length 1 which is used for the command parameters (e.g. -f)
13
+ attr_accessor :short_option
14
+
15
+ # the value which is used if there was no given values and no environment values
16
+ attr_accessor :default_value
17
+
18
+ # An optional block which is called when a new value is set.
19
+ # Check value is valid. This could be type checks or if a folder/file exists
20
+ # You have to raise a specific exception if something goes wrong. Append .red after the string
21
+ attr_accessor :verify_block
22
+
23
+ # [Boolean] is false by default. If set to true, also string values will not be asked to the user
24
+ attr_accessor :optional
25
+
26
+ # [Array] array of conflicting option keys(@param key). This allows to resolve conflicts intelligently
27
+ attr_accessor :conflicting_options
28
+
29
+ # An optional block which is called when options conflict happens
30
+ attr_accessor :conflict_block
31
+
32
+ # [String] Set if the option is deprecated. A deprecated option should be optional and is made optional if the parameter isn't set, and fails otherwise
33
+ attr_accessor :deprecated
34
+
35
+ # [Boolean] Set if the variable is sensitive, such as a password or API token, to prevent echoing when prompted for the parameter
36
+ attr_accessor :sensitive
37
+
38
+ # [Boolean] Set if the variable is to be converted to a shell-escaped String when provided as a Hash or Array
39
+ # Allows items expected to be strings used in shell arguments to be alternatively provided as a Hash or Array for better readability and auto-escaped for us.
40
+ attr_accessor :allow_shell_conversion
4
41
 
5
42
  # Creates a new option
6
43
  # @param key (Symbol) the key which is used as command paramters or key in the fastlane tools
@@ -12,7 +49,7 @@ module FastlaneCore
12
49
  # Check value is valid. This could be type checks or if a folder/file exists
13
50
  # You have to raise a specific exception if something goes wrong. Append .red after the string
14
51
  # @param is_string *DEPRECATED: Use `type` instead* (Boolean) is that parameter a string? Defaults to true. If it's true, the type string will be verified.
15
- # @param type (Class) the data type of this config item. Takes precedence over `is_string`
52
+ # @param type (Class) the data type of this config item. Takes precedence over `is_string`. Use `:shell_string` to allow types `String`, `Hash` and `Array` that will be converted to shell-escaped strings
16
53
  # @param optional (Boolean) is false by default. If set to true, also string values will not be asked to the user
17
54
  # @param conflicting_options ([]) array of conflicting option keys(@param key). This allows to resolve conflicts intelligently
18
55
  # @param conflict_block an optional block which is called when options conflict happens
@@ -53,11 +90,13 @@ module FastlaneCore
53
90
  @verify_block = verify_block
54
91
  @is_string = is_string
55
92
  @data_type = type
93
+ @data_type = String if type == :shell_string
56
94
  @optional = optional
57
95
  @conflicting_options = conflicting_options
58
96
  @conflict_block = conflict_block
59
97
  @deprecated = deprecated
60
98
  @sensitive = sensitive
99
+ @allow_shell_conversion = (type == :shell_string)
61
100
  end
62
101
 
63
102
  # This will raise an exception if the value is not valid
@@ -99,6 +138,9 @@ module FastlaneCore
99
138
  return value.to_i if value.to_i.to_s == value.to_s
100
139
  elsif data_type == Float
101
140
  return value.to_f if value.to_f.to_s == value.to_s
141
+ elsif data_type == String && allow_shell_conversion
142
+ return value.map(&:to_s).map(&:shellescape).join(' ') if value.kind_of?(Array)
143
+ return value.map { |k, v| "#{k.to_s.shellescape}=#{v.shellescape}" }.join(' ') if value.kind_of?(Hash)
102
144
  else
103
145
  # Special treatment if the user specified true, false or YES, NO
104
146
  # There is no boolean type, so we just do it here
@@ -194,6 +194,21 @@ module FastlaneCore
194
194
  all.each(&:reset)
195
195
  end
196
196
 
197
+ def copy_logarchive(device, dest)
198
+ sim_resource_dir = FastlaneCore::CommandExecutor.execute(command: "xcrun simctl getenv #{device.udid} SIMULATOR_SHARED_RESOURCES_DIRECTORY 2>/dev/null", print_all: false, print_command: true)
199
+ logarchive_src = File.join(sim_resource_dir, "system_logs.logarchive")
200
+
201
+ # if logarchive already exists it fails as the .logarchive is a directory, so delete it. to be sure its gone
202
+ FileUtils.rm_rf(logarchive_src)
203
+ FileUtils.rm_rf(dest)
204
+
205
+ command = "xcrun simctl spawn #{device.udid} log collect 2>/dev/null"
206
+ FastlaneCore::CommandExecutor.execute(command: command, print_all: false, print_command: true)
207
+
208
+ FileUtils.cp_r(logarchive_src, dest)
209
+ UI.success "Copying file '#{logarchive_src}' to '#{dest}'..."
210
+ end
211
+
197
212
  def reset_all_by_version(os_version: nil)
198
213
  return false unless os_version
199
214
  all.select { |device| device.os_version == os_version }.each(&:reset)
@@ -1,5 +1,5 @@
1
1
  require 'logger'
2
- require 'colored'
2
+ require 'colored2'
3
3
 
4
4
  module FastlaneCore
5
5
  module Helper
@@ -1,15 +1,15 @@
1
1
  # This code overwrites the methods from the colored gem
2
- # via https://github.com/defunkt/colored/blob/master/lib/colored.rb
2
+ # via https://github.com/kigster/colored2/blob/aa274018906641ffb07aaa3015081a174d169dfe/lib/colored2.rb
3
3
 
4
- require 'colored'
4
+ require 'colored2'
5
5
 
6
6
  class String
7
- Colored::COLORS.keys.each do |color|
7
+ Colored2::COLORS.keys.each do |color|
8
8
  define_method(color) do
9
9
  self # do nothing with the string, but return it
10
10
  end
11
11
  end
12
- Colored::EXTRAS.keys.each do |extra|
12
+ Colored2::EXTRAS.keys.each do |extra|
13
13
  define_method(extra) do
14
14
  self # do nothing with the string, but return it
15
15
  end
@@ -64,11 +64,10 @@ module Frameit
64
64
  if value.kind_of?(Hash)
65
65
  validate_values(value) # recursive call
66
66
  else
67
- if key == 'font'
67
+ case key
68
+ when 'font'
68
69
  UI.user_error!("Could not find font at path '#{File.expand_path(value)}'") unless File.exist?(value)
69
- end
70
-
71
- if key == 'fonts'
70
+ when 'fonts'
72
71
  UI.user_error!("`fonts` must be an array") unless value.kind_of?(Array)
73
72
 
74
73
  value.each do |current|
@@ -76,20 +75,16 @@ module Frameit
76
75
  UI.user_error!("Could not find font at path '#{File.expand_path(current.fetch('font'))}'") unless File.exist?(current.fetch('font'))
77
76
  UI.user_error!("`supported` must be an array") unless current.fetch('supported', []).kind_of? Array
78
77
  end
79
- end
80
-
81
- if key == 'background'
78
+ when 'background'
82
79
  UI.user_error!("Could not find background image at path '#{File.expand_path(value)}'") unless File.exist? value
83
- end
84
-
85
- if key == 'color'
80
+ when 'color'
86
81
  UI.user_error!("Invalid color '#{value}'. Must be valid Hex #123123") unless value.include?("#")
87
- end
88
-
89
- if key == 'padding'
82
+ when 'padding'
90
83
  unless value.kind_of?(Integer) || value.split('x').length == 2
91
84
  UI.user_error!("padding must be type integer or pair of integers of format 'AxB'")
92
85
  end
86
+ when 'font_scale_factor'
87
+ UI.user_error! "font_scale_factor must be numeric" unless value.kind_of?(Numeric)
93
88
  end
94
89
  end
95
90
  end
@@ -236,12 +236,13 @@ module Frameit
236
236
  end
237
237
 
238
238
  def actual_font_size
239
- [@image.width / 10.0].max.round
239
+ font_scale_factor = fetch_config['font_scale_factor'] || 0.1
240
+ [@image.width * font_scale_factor].max.round
240
241
  end
241
242
 
242
243
  # The space between the keyword and the title
243
244
  def keyword_padding
244
- (actual_font_size / 2.0).round
245
+ (actual_font_size / 3.0).round
245
246
  end
246
247
 
247
248
  # This will build 2 individual images with the title, which will then be added to the real image
@@ -131,7 +131,8 @@ module Gym
131
131
  conflicting_options: [:use_legacy_build_api],
132
132
  conflict_block: proc do |value|
133
133
  UI.user_error!("'#{value.key}' must be false to use 'export_xcargs'")
134
- end),
134
+ end,
135
+ type: :shell_string),
135
136
  FastlaneCore::ConfigItem.new(key: :skip_build_archive,
136
137
  env_name: "GYM_SKIP_BUILD_ARCHIVE",
137
138
  description: "Export ipa from previously build xarchive. Uses archive_path as source",
@@ -196,7 +197,8 @@ module Gym
196
197
  short_option: "-x",
197
198
  env_name: "GYM_XCARGS",
198
199
  description: "Pass additional arguments to xcodebuild for the build phase. Be sure to quote the setting names and values e.g. OTHER_LDFLAGS=\"-ObjC -lstdc++\"",
199
- optional: true),
200
+ optional: true,
201
+ type: :shell_string),
200
202
  FastlaneCore::ConfigItem.new(key: :xcconfig,
201
203
  short_option: "-y",
202
204
  env_name: "GYM_XCCONFIG",
@@ -377,13 +377,13 @@ In general those profiles are harmless as they can only be used to install a sig
377
377
 
378
378
  Attackers could use an In-House profile to distribute signed application to a potentially unlimited number of devices. All this would run under your company name and it could eventually lead to Apple revoking your In-House account. However it is very easy to revoke a certificate to remotely break the app on all devices.
379
379
 
380
- Because of the potentially dangerous nature of In-House profiles we decided to not allow the use of `match` with enterprise accounts.
380
+ Because of the potentially dangerous nature of In-House profiles please use _match_ with enterprise profiles with caution, ensure your git repository is private and use a secure password.
381
381
 
382
382
  ##### To sum up
383
383
 
384
384
  - You have full control over the access list of your Git repo, no third party service involved
385
385
  - Even if your certificates are leaked, they can't be used to cause any harm without your iTunes Connect login credentials
386
- - `match` does not currently support In-House Enterprise profiles as they are harder to control
386
+ - Use In-House enterprise profile with _match_ with caution
387
387
  - If you use GitHub or Bitbucket we encourage enabling 2 factor authentication for all accounts that have access to the certificates repo
388
388
  - The complete source code of `match` is fully open source on [GitHub](https://github.com/fastlane/fastlane/tree/master/match)
389
389
 
@@ -21,31 +21,17 @@ module Match
21
21
  DESCRIPTION = "Easily sync your certificates and profiles across your team using git"
22
22
 
23
23
  def self.environments
24
- envs = %w(appstore adhoc development)
25
- envs << "enterprise" if self.enterprise?
26
- return envs
27
- end
28
-
29
- # @return [Boolean] returns true if the unsupported enterprise mode should be enabled
30
- def self.enterprise?
31
- return FastlaneCore::Env.truthy?("MATCH_FORCE_ENTERPRISE")
32
- end
33
-
34
- # @return [Boolean] returns true if match should interpret the given [certificate|profile] type as an enterprise one
35
- def self.type_is_enterprise?(type)
36
- Match.enterprise? && type != "development"
24
+ return %w(appstore adhoc development enterprise)
37
25
  end
38
26
 
39
27
  def self.profile_type_sym(type)
40
- return :enterprise if self.type_is_enterprise? type
41
- return :adhoc if type == "adhoc"
42
- return :appstore if type == "appstore"
43
- return :development
28
+ return type.to_sym
44
29
  end
45
30
 
46
31
  def self.cert_type_sym(type)
47
- return :enterprise if self.type_is_enterprise? type
32
+ return :enterprise if type == "enterprise"
48
33
  return :development if type == "development"
49
- return :distribution
34
+ return :distribution if type == "adhoc" || type == "appstore"
35
+ raise "Unknown cert type: '#{type}'"
50
36
  end
51
37
  end
@@ -39,7 +39,13 @@ module Match
39
39
 
40
40
  prov_type = Match.profile_type_sym(params[:type])
41
41
 
42
- profile_name = ["match", profile_type_name(prov_type), app_identifier].join(" ")
42
+ names = ["match", profile_type_name(prov_type), app_identifier]
43
+
44
+ if params[:platform].to_s != :ios.to_s # For ios we do not include the platform for backwards compatibility
45
+ names << params[:platform]
46
+ end
47
+
48
+ profile_name = names.join(" ")
43
49
 
44
50
  values = {
45
51
  app_identifier: app_identifier,
@@ -52,6 +58,7 @@ module Match
52
58
  team_id: params[:team_id]
53
59
  }
54
60
 
61
+ values[:platform] = params[:platform]
55
62
  values[:adhoc] = true if prov_type == :adhoc
56
63
  values[:development] = true if prov_type == :development
57
64