moduleSpaceshipmodulePortal# Represents a provisioning profile of the Apple Dev PortalclassProvisioningProfile<PortalBase# @return (String) The ID generated by the Dev Portal# You'll probably not really need this value# @example# "2MAY7NPHAA"attr_accessor:id# @return (String) The UDID of this provisioning profile# This value is used for example for code signing# It is also contained in the actual profile# @example# "23d7df3b-9767-4e85-a1ea-1df4d8f32fec"attr_accessor:uuid# @return (DateTime) The date and time of when the profile# expires.# @example# #<DateTime: 2015-11-25T22:45:50+00:00 ((2457352j,81950s,0n),+0s,2299161j)>attr_accessor:expires# @return (String) The profile distribution type. You probably want to# use the class type to detect the profile type instead of this string.# @example AppStore Profile# "store"# @example AdHoc Profile# "adhoc"# @example Development Profile# "limited"attr_accessor:distribution_method# @return (String) The name of this profile# @example# "com.krausefx.app AppStore"attr_accessor:name# @return (String) The status of this profile# @example Active (profile is fine)# "Active"# @example Expired (time ran out)# "Expired"# @example Invalid (e.g. code signing identity not available any more)# "Invalid"attr_accessor:status# @return (String) The type of the profile (development or distribution).# You'll probably not need this value# @example Distribution# "iOS Distribution"# @example Development# "iOS Development"attr_accessor:type# @return (String) This will always be "2"# @example# "2"attr_accessor:version# @return (String) The supported platform for this profile# @example# "ios"attr_accessor:platform# No information about this attributeattr_accessor:managing_app# A reference to the app this profile is for.# You can then easily access the value directly# @return (App) The app this profile is for## @example Example Value# <Spaceship::App# @app_id="2UMR2S6PAA"# @name="App Name"# @platform="ios"# @prefix="5A997XSAAA"# @bundle_id="com.krausefx.app"# @is_wildcard=false# @dev_push_enabled=false# @prod_push_enabled=false>## @example Usage# profile.app.nameattr_accessor:app# @return (Array) A list of certificates used for this profile# @example Example Value# [# <Spaceship::Certificate::Production# @status=nil# @id="XC5PH8D4AA"# @name="iOS Distribution"# @created=nil# @expires=#<DateTime: 2015-11-25T22:45:50+00:00 ((2457352j,81950s,0n),+0s,2299161j)># @owner_type="team"# @owner_name=nil# @owner_id=nil# @type_display_id="R58UK2EWAA">]# ]## @example Usage# profile.certificates.first.idattr_accessor:certificates# @return (Array) A list of devices this profile is enabled for.# This will always be [] for AppStore profiles## @example Example Value# <Spaceship::Device# @id="WXQ7V239BE"# @name="Grahams iPhone 4s"# @udid="ba0ac7d70f7a14c6fa02ef0e02f4fe9c5178e2f7"# @platform="ios"# @status="c">]## @example Usage# profile.devices.first.nameattr_accessor:devicesattr_mapping({'provisioningProfileId'=>:id,'UUID'=>:uuid,'dateExpire'=>:expires,'distributionMethod'=>:distribution_method,'name'=>:name,'status'=>:status,'type'=>:type,'version'=>:version,'proProPlatform'=>:platform,'managingApp'=>:managing_app,'appId'=>:app})class<<self# @return (String) The profile type used for web requests to the Dev Portal# @example# "limited"# "store"# "adhoc"# "inhouse"deftyperaise"You cannot create a ProvisioningProfile without a type. Use a subclass."end# Create a new object based on a hash.# This is used to create a new object based on the server response.deffactory(attrs)# Ad Hoc Profiles look exactly like App Store profiles, but usually include devicesattrs['distributionMethod']='adhoc'ifattrs['distributionMethod']=='store'&&attrs['devices'].size>0# available values of `distributionMethod` at this point: ['adhoc', 'store', 'limited']klass=caseattrs['distributionMethod']when'limited'Developmentwhen'store'AppStorewhen'adhoc'AdHocwhen'inhouse'InHouseelseraise"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=@clientklass.new(attrs)end# @return (String) The human readable name of this profile type.# @example# "AppStore"# "AdHoc"# "Development"# "InHouse"defpretty_typename.split('::').lastend# Create a new provisioning profile# @param name (String): The name of the provisioning profile on the Dev Portal# @param bundle_id (String): The app identifier, this paramter is required# @param certificate (Certificate): The certificate that should be used with this# provisioning profile. You can also pass an array of certificates to this method. This will# only work for development profiles# @param devices (Array) (optional): An array of Device objects that should be used in this profile.# It is recommend to not pass devices as spaceship will automatically add all devices for AdHoc# and Development profiles and add none for AppStore and Enterprise Profiles# @param mac (Bool) (optional): Pass true if you're making a Mac provisioning profile# @return (ProvisioningProfile): The profile that was just createddefcreate!(name: nil,bundle_id: nil,certificate: nil,devices: [],mac: false)raise"Missing required parameter 'bundle_id'"ifbundle_id.to_s.empty?raise"Missing required parameter 'certificate'. e.g. use `Spaceship::Certificate::Production.all.first`"ifcertificate.to_s.empty?app=Spaceship::App.find(bundle_id,mac: mac)raise"Could not find app with bundle id '#{bundle_id}'"unlessapp# Fill in sensible default valuesname||=[bundle_id,self.pretty_type].join(' ')devices=[]ifself==AppStore||self==InHouse# App Store Profiles MUST NOT have devicescertificate_parameter=certificate.collect(&:id)ifcertificate.kind_of?Arraycertificate_parameter||=[certificate.id]# Fix https://github.com/KrauseFx/fastlane/issues/349certificate_parameter=certificate_parameter.firstifcertificate_parameter.count==1ifdevices.nil?ordevices.count==0ifself==Developmentorself==AdHoc# For Development and AdHoc we usually want all compatible devices by defaultifmacdevices=Spaceship::Device.all_macselsedevices=Spaceship::Device.all_for_profile_type(self.type)endendendprofile=client.with_retrydoclient.create_provisioning_profile!(name,self.type,app.app_id,certificate_parameter,devices.map(&:id),mac: mac)endself.new(profile)end# @return (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 typedefall(mac: false)profiles=client.provisioning_profiles(mac: mac).mapdo|profile|self.factory(profile)end# filter out the profiles managed by xcodeprofiles.delete_if(&:managed_by_xcode?)returnprofilesifself==ProvisioningProfile# only return the profiles that match the classprofiles.selectdo|profile|profile.class==selfendend# @return (Array) Returns an array of provisioning# profiles matching the bundle identifier# Returns [] if no profiles were found# This may also contain invalid or expired profilesdeffind_by_bundle_id(bundle_id,mac: false)all(mac: mac).find_alldo|profile|profile.app.bundle_id==bundle_idendendend# Represents a Development profile from the Dev PortalclassDevelopment<ProvisioningProfiledefself.type'limited'endend# Represents an AppStore profile from the Dev PortalclassAppStore<ProvisioningProfiledefself.type'store'endend# Represents an AdHoc profile from the Dev PortalclassAdHoc<ProvisioningProfiledefself.type'adhoc'endend# Represents an Enterprise InHouse profile from the Dev PortalclassInHouse<ProvisioningProfiledefself.type'inhouse'endend# 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.# @return (String) The content of the provisioning profile# You'll probably want to store it on the file system# @example# File.write("path.mobileprovision", profile.download)defdownloadclient.download_provisioning_profile(self.id,mac: mac?)end# Delete the provisioning profiledefdelete!client.delete_provisioning_profile!(self.id,mac: mac?)end# Repair an existing provisioning profile# alias to update!# @return (ProvisioningProfile) A new provisioning profile, as# the repair method will generate a profile with a new IDdefrepair!update!end# 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# @return (ProvisioningProfile) A new provisioning profile, as# the repair method will generate a profile with a new IDdefupdate!unlesscertificate_valid?ifmac?ifself.kind_of?Developmentself.certificates=[Spaceship::Certificate::MacDevelopment.all.first]elseself.certificates=[Spaceship::Certificate::MacAppDistribution.all.first]endelseifself.kind_of?Developmentself.certificates=[Spaceship::Certificate::Development.all.first]elsifself.kind_of?InHouseself.certificates=[Spaceship::Certificate::InHouse.all.first]elseself.certificates=[Spaceship::Certificate::Production.all.first]endendendclient.with_retrydoclient.repair_provisioning_profile!(id,name,distribution_method,app.app_id,certificates.map(&:id),devices.map(&:id),mac: mac?)end# We need to fetch the provisioning profile again, as the ID changesprofile=Spaceship::ProvisioningProfile.all(mac: mac?).finddo|p|p.name==self.name# we can use the name as it's validendreturnprofileend# Is the certificate of this profile available?# @return (Bool) is the certificate valid?defcertificate_valid?returnfalseif(certificates||[]).count==0certificates.eachdo|c|ifSpaceship::Certificate.all(mac: mac?).collect(&:id).include?(c.id)returntrueendendreturnfalseend# @return (Bool) Is the current provisioning profile valid?defvalid?return(status=='Active'andcertificate_valid?)end# @return (Bool) Is this profile managed by Xcode?defmanaged_by_xcode?managing_app=='Xcode'end# @return (Bool) Is this a Mac provisioning profile?defmac?platform=='mac'endendendend