iOS自動化--Spaceship使用實踐


Spaceship

### 腳本操作 證書,app,provision等一些列apple develop后台操作,快速高效。

github地址

spaceship開發文檔

文檔有列出常用的api調用demo,包括證書,appid,provision等操作。想看更具體詳細的結構文檔,參考Ryby類庫查詢

Spaceship使用

  • 安裝

    1.安裝fastlane
        sudo gem install -n /usr/local/bin fastlane
    
    2.啟動spaceship(后台運行)
        fastlane spaceship
    
    3.安裝pry(虛擬環境 類似於irb,python等環境)
        sudo gem install -n /usr/local/bin pry
    

  • 登錄二次驗證

    1.執行  fastlane Spaceship 
    2.一堆輸出完了,讓你輸入賬號密碼,以及二次驗證碼。
    3.進入到pry環境輸入demo腳本
    注意:
    操作完成之后,會在本地生成一個session保存,網上說會保存一個月,也就是一個月內登錄不需要再二次驗證了。但是,我這邊發現也就幾天就失效了
    

  • pry環境測試腳本

    開發文檔有很多demo了,見上面開發文檔鏈接,直接在pry環境中可進行測試
    
  • 實操腳本編寫

    我們的目標是 生成appid,provision,並且自動安裝。

    1.創建app,添加app權限,創建provision,下載provision。

    require "spaceship"
    
    class DevelopPortalHandle
    	def initialize(appid)
    		@appid = appid
    
    		list = appid.split(".")
    		appidLastName = list.last
    
    		@appName = appidLastName
    		@provisionName = appidLastName
    	end
    
    	def login()
    		Spaceship::Portal.login("賬號","密碼")
    		Spaceship.client.team_id = "這里輸入TeamId"
    	end
    
    	def createApp()
            puts "createApp #{@appid} appName = #{@appName}    "
    		app = Spaceship::Portal.app.find(@appid)
            puts "app =  #{app}  class = #{app.class}"
    		if !app then
    			#生成appid,創建新的app
    			app = Spaceship::Portal.app.create!(bundle_id: @appid, name: @appName)
                puts "createApp #{app}"
    		end
    	end
        
        #appstore or inHouse
    	def createDistributionProvision(provisioningClass)
    		cert = Spaceship::Portal.certificate.production.all.last
            provisionNameDis = @provisionName + '_dis'
    		profile = provisioningClass.create!(bundle_id: @appid,certificate:cert,name:@provisionName)
            return profile
    	end
        
        #appstore or inHouse
        def downloadDistributionProvision(provisioningClass)
            #查找有沒有provision文件
            filtered_profiles = provisioningClass.find_by_bundle_id(bundle_id: @appid)
            profile = nil
            if  0 < filtered_profiles.length then
                profile = filtered_profiles[0]
            elsif 0 == filtered_profiles.length then
                profile = createProvision(provisioningClass)
            end
            
            #沒有找到就創建,找到就下載
            provisionNameDis = @provisionName + '_dis'
            provisionFileName = provisionNameDis + '.mobileprovision'
            File.write(provisionFileName, profile.download)
            return provisionFileName
        end
        
    
        def createDevelopProvision()
            dev_certs = Spaceship::Portal.certificate.development.all
            all_devices = Spaceship::Portal.device.all
            provisionNameDev = @provisionName + '_dev'
            profile = Spaceship::Portal.provisioning_profile.development.create!(bundle_id: @appid,certificate: dev_certs,name: provisionNameDev,devices:all_devices)
            return profile
        end
        
        def downloadDevelopProvision()
            #查找有沒有provision文件
            filtered_profiles = Spaceship::Portal.provisioning_profile.development.find_by_bundle_id(bundle_id: @appid)
            profile = nil
            if  0 < filtered_profiles.length then
                profile = filtered_profiles[0]
            elsif 0 == filtered_profiles.length then
                profile = createDevelopProvision()
            end
            
            #沒有找到就創建,找到就下載
            provisionNameDev = @provisionName + '_dev'
            provisionFileName = provisionNameDev + '.mobileprovision'
            File.write(provisionFileName, profile.download)
            return provisionFileName
        end
    
        def addServices(appServiceObj)
            app = Spaceship::Portal.app.find(@appid)
            app.update_service(appServiceObj)
        end
    end
    
    
        #創建、下載develop的provision文件
    
        appid = ARGV[0]
        handle = DevelopPortalHandle.new(appid)
        handle.login()
        handle.createApp()
        handle.addServices(Spaceship::Portal.app_service.push_notification.on)
        handle.addServices(Spaceship::Portal.app_service.vpn_configuration.on)
        provisionPath = handle.downloadDevelopProvision()
    

    2.安裝provision文件

    這部分代碼我使用py寫的,原理先說一下,安裝provison文件實際上就是,
    1.把profile文件名稱改成本身的內容中的uuid作為名稱,uuid.mobileprovision
    2.把文件移動到~/Library/MobileDevice/Provisioning\ Profiles目錄下
    
    以下是我python寫的代碼。
    
    #!/usr/bin/env python
    #coding:utf-8
    
    import getopt
    import os
    import sys
    import plistlib
    
    
    def provisionInstall(provisionPath,uuid):
        #將provision文件改成uuid命名,並且放入到Provisioning Profiles所在目錄下
        systemProvisionPath = '~/Library/MobileDevice/Provisioning\ Profiles/%s.mobileprovision' % uuid
        dir = os.path.dirname(provisionPath)
        uuidProvision = '%s/%s.mobileprovision' % (dir,uuid)
        cpCMD = 'cp -a %s %s' % (provisionPath,uuidProvision)
        cpUUIDProvision = 'cp -a %s %s' % (uuidProvision,systemProvisionPath)
        os.system(cpCMD)
        os.system(cpUUIDProvision)
    
        pass
    
    #讀provision文件,獲取teamName和uuid
    def readProvision(provisionFilePath):
        #返回teamName 和 UUID
        #轉換provision為xml
    
        transCMD = 'security cms -D -i %s > test.plist' % provisionFilePath
        os.system(transCMD)
    
        #test.plist文件路徑
        dir = os.path.dirname(provisionFilePath)
        plistPath = dir + '/test.plist'
    
        #讀plist文件中內容
        plist = ''
        maj, min, _, _, _ = sys.version_info
        if maj < 3:
            plist = plistlib.readPlist(plistPath)
        else:
            with open(plistPath,'rb') as fp:
                plist = plistlib.load(fp,fmt=None, use_builtin_types=False)
    
        teamNeme = plist['TeamName']
        uuid = plist['UUID']
    
        return teamNeme,uuid
    
        pass
    
    

Ruby類庫查詢

ruby查詢網站

很重要,在上面的網站可以搜索關鍵字,比如xcodeproj,spaceship。左邊就會有Class List,方法/類查詢都很方便。特別實用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM