Class: Spaceship::Portal::ProvisioningProfile
- Inherits:
-
Spaceship::PortalBase
- Object
- Base
- Spaceship::PortalBase
- Spaceship::Portal::ProvisioningProfile
- Defined in:
- lib/spaceship/portal/provisioning_profile.rb
Overview
Represents a provisioning profile of the Apple Dev Portal
Direct Known Subclasses
Defined Under Namespace
Classes: AdHoc, AppStore, Development, InHouse
Instance Attribute Summary collapse
-
#app ⇒ App
A reference to the app this profile is for.
-
#certificates ⇒ Array
A list of certificates used for this profile.
-
#devices ⇒ Array
A list of devices this profile is enabled for.
-
#distribution_method ⇒ String
The profile distribution type.
-
#expires ⇒ DateTime
The date and time of when the profile expires.
-
#id ⇒ String
The ID generated by the Dev Portal You’ll probably not really need this value.
-
#managing_app ⇒ Object
No information about this attribute.
-
#name ⇒ String
The name of this profile.
-
#platform ⇒ String
The supported platform for this profile.
-
#status ⇒ String
The status of this profile.
-
#type ⇒ String
The type of the profile (development or distribution).
-
#uuid ⇒ String
The UDID of this provisioning profile This value is used for example for code signing It is also contained in the actual profile.
-
#version ⇒ String
This will always be “2”.
Attributes inherited from Base
Class Method Summary collapse
-
.all ⇒ Array
Returns all profiles registered for this account If you’re calling this from a subclass (like AdHoc), this will only return the profiles that are of this type.
-
.create!(name: nil, bundle_id: nil, certificate: nil, devices: []) ⇒ ProvisioningProfile
Create a new provisioning profile.
-
.factory(attrs) ⇒ Object
Create a new object based on a hash.
-
.find_by_bundle_id(bundle_id) ⇒ Array
Returns an array of provisioning profiles matching the bundle identifier Returns [] if no profiles were found This may also contain invalid or expired profiles.
-
.pretty_type ⇒ String
The human readable name of this profile type.
-
.type ⇒ String
The profile type used for web requests to the Dev Portal.
Instance Method Summary collapse
-
#certificate_valid? ⇒ Bool
Is the certificate of this profile available?.
-
#delete! ⇒ Object
Delete the provisioning profile.
-
#download ⇒ String
Download the current provisioning profile.
-
#managed_by_xcode? ⇒ Bool
Is this profile managed by Xcode?.
-
#repair! ⇒ ProvisioningProfile
Repair an existing provisioning profile alias to update!.
-
#update! ⇒ ProvisioningProfile
Updates the provisioning profile from the local data e.g.
-
#valid? ⇒ Bool
Is the current provisioning profile valid?.
Methods inherited from Spaceship::PortalBase
Methods inherited from Base
attr_accessor, attr_mapping, #attributes, attributes, #initialize, #inspect, mapping_module, method_missing, set_client, #setup, #to_s
Constructor Details
This class inherits a constructor from Spaceship::Base
Instance Attribute Details
#app ⇒ App
A reference to the app this profile is for. You can then easily access the value directly
86 87 88 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 86 def app @app end |
#certificates ⇒ Array
Returns A list of certificates used for this profile.
105 106 107 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 105 def certificates @certificates end |
#devices ⇒ Array
Returns A list of devices this profile is enabled for. This will always be [] for AppStore profiles.
120 121 122 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 120 def devices @devices end |
#distribution_method ⇒ String
Returns The profile distribution type. You probably want to use the class type to detect the profile type instead of this string.
32 33 34 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 32 def distribution_method @distribution_method end |
#expires ⇒ DateTime
Returns The date and time of when the profile expires.
22 23 24 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 22 def expires @expires end |
#id ⇒ String
Returns The ID generated by the Dev Portal You’ll probably not really need this value.
9 10 11 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 9 def id @id end |
#managing_app ⇒ Object
No information about this attribute
67 68 69 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 67 def managing_app @managing_app end |
#name ⇒ String
Returns The name of this profile.
37 38 39 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 37 def name @name end |
#platform ⇒ String
Returns The supported platform for this profile.
64 65 66 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 64 def platform @platform end |
#status ⇒ String
Returns The status of this profile.
46 47 48 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 46 def status @status end |
#type ⇒ String
Returns The type of the profile (development or distribution). You’ll probably not need this value.
54 55 56 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 54 def type @type end |
#uuid ⇒ String
Returns The UDID of this provisioning profile This value is used for example for code signing It is also contained in the actual profile.
16 17 18 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 16 def uuid @uuid end |
#version ⇒ String
Returns This will always be “2”.
59 60 61 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 59 def version @version end |
Class Method Details
.all ⇒ Array
Returns all profiles registered for this account If you’re calling this from a subclass (like AdHoc), this will only return the profiles that are of this type
235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 235 def all profiles = client.provisioning_profiles.map do |profile| self.factory(profile) end # filter out the profiles managed by xcode profiles.delete_if(&:managed_by_xcode?) return profiles if self == ProvisioningProfile # only return the profiles that match the class profiles.select do |profile| profile.class == self end end |
.create!(name: nil, bundle_id: nil, certificate: nil, devices: []) ⇒ ProvisioningProfile
Create a new provisioning profile
196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 196 def create!(name: nil, bundle_id: nil, certificate: nil, devices: []) raise "Missing required parameter 'bundle_id'" if bundle_id.to_s.empty? raise "Missing required parameter 'certificate'. e.g. use `Spaceship::Certificate::Production.all.first`" if certificate.to_s.empty? app = Spaceship::App.find(bundle_id) raise "Could not find app with bundle id '#{bundle_id}'" unless app # Fill in sensible default values name ||= [bundle_id, self.pretty_type].join(' ') devices = [] if self == AppStore || self == InHouse # App Store Profiles MUST NOT have devices certificate_parameter = certificate.collect(&:id) if certificate.kind_of? Array certificate_parameter ||= [certificate.id] # Fix https://github.com/KrauseFx/fastlane/issues/349 certificate_parameter = certificate_parameter.first if certificate_parameter.count == 1 if devices.nil? or devices.count == 0 if self == Development or self == AdHoc # For Development and AdHoc we usually want all compatible devices by default devices = Spaceship::Device.all_for_profile_type(self.type) end end profile = client.with_retry do client.create_provisioning_profile!(name, self.type, app.app_id, certificate_parameter, devices.map(&:id)) end self.new(profile) end |
.factory(attrs) ⇒ Object
Create a new object based on a hash. This is used to create a new object based on the server response.
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 149 def factory(attrs) # Ad Hoc Profiles look exactly like App Store profiles, but usually include devices attrs['distributionMethod'] = 'adhoc' if attrs['distributionMethod'] == 'store' && attrs['devices'].size > 0 # available values of `distributionMethod` at this point: ['adhoc', 'store', 'limited'] klass = case attrs['distributionMethod'] when 'limited' Development when 'store' AppStore when 'adhoc' AdHoc when 'inhouse' InHouse else raise "Can't find class '#{attrs['distributionMethod']}'" end # eagerload the Apps, Devices, and Certificates using the same client if we have to. attrs['appId'] = App.set_client(@client).factory(attrs['appId']) attrs['devices'].map! { |device| Device.set_client(@client).factory(device) } attrs['certificates'].map! { |cert| Certificate.set_client(@client).factory(cert) } klass.client = @client klass.new(attrs) end |
.find_by_bundle_id(bundle_id) ⇒ Array
Returns an array of provisioning profiles matching the bundle identifier Returns [] if no profiles were found This may also contain invalid or expired profiles
255 256 257 258 259 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 255 def find_by_bundle_id(bundle_id) all.find_all do |profile| profile.app.bundle_id == bundle_id end end |
.pretty_type ⇒ String
Returns The human readable name of this profile type.
182 183 184 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 182 def pretty_type name.split('::').last end |
.type ⇒ String
Returns The profile type used for web requests to the Dev Portal.
143 144 145 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 143 def type raise "You cannot create a ProvisioningProfile without a type. Use a subclass." end |
Instance Method Details
#certificate_valid? ⇒ Bool
Is the certificate of this profile available?
351 352 353 354 355 356 357 358 359 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 351 def certificate_valid? return false if (certificates || []).count == 0 certificates.each do |c| if Spaceship::Certificate.all.collect(&:id).include?(c.id) return true end end return false end |
#delete! ⇒ Object
Delete the provisioning profile
302 303 304 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 302 def delete! client.delete_provisioning_profile!(self.id) end |
#download ⇒ String
Download the current provisioning profile. This will not store the provisioning profile on the file system. Instead this method will return the content of the profile.
297 298 299 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 297 def download client.download_provisioning_profile(self.id) end |
#managed_by_xcode? ⇒ Bool
Returns Is this profile managed by Xcode?.
367 368 369 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 367 def managed_by_xcode? managing_app == 'Xcode' end |
#repair! ⇒ ProvisioningProfile
Repair an existing provisioning profile alias to update!
310 311 312 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 310 def repair! update! end |
#update! ⇒ ProvisioningProfile
Updates the provisioning profile from the local data e.g. after you added new devices to the profile This will also update the code signing identity if necessary
319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 319 def update! unless certificate_valid? if self.kind_of? Development self.certificates = [Spaceship::Certificate::Development.all.first] elsif self.kind_of? InHouse self.certificates = [Spaceship::Certificate::InHouse.all.first] else self.certificates = [Spaceship::Certificate::Production.all.first] end end client.with_retry do client.repair_provisioning_profile!( id, name, distribution_method, app.app_id, certificates.map(&:id), devices.map(&:id) ) end # We need to fetch the provisioning profile again, as the ID changes profile = Spaceship::ProvisioningProfile.all.find do |p| p.name == self.name # we can use the name as it's valid end return profile end |
#valid? ⇒ Bool
Returns Is the current provisioning profile valid?.
362 363 364 |
# File 'lib/spaceship/portal/provisioning_profile.rb', line 362 def valid? return (status == 'Active' and certificate_valid?) end |