iOS automation --Spaceship use practices

Spaceship

CLI in the form of a certificate, app, provision and some other apple develop a background operation, fast and efficient.

github address

spaceship development documents

文档有列出常用的api调用demo,包括证书,appid,provision等操作。想看更具体详细的结构文档,参考Ryby类库查询

Spaceship use

  • installation

    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

  • Login secondary verification

    1.执行  fastlane Spaceship 
    2.一堆输出完了,让你输入账号密码,以及二次验证码。
    3.进入到pry环境输入demo脚本
    注意:
    操作完成之后,会在本地生成一个session保存,网上说会保存一个月,暂时没验证。也就是一个月内登录不需要再二次验证了。

  • pry environmental testing scripts

    开发文档有很多demo了,见上面开发文档链接,直接在pry环境中可进行测试
  • Practical operation of script writing

    Our goal is to generate appid, provision, and installed automatically.

    1. Create app, add app permissions, create provision, download 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. Install the provision file

    这部分代码我使用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
    
    def readP12Password(txtPath):
    
        with open(txtPath,'r') as fp:
            str = fp.readline()
            str = str.strip()
    
            return str
        pass

Ruby libraries inquiry

ruby check website

很重要,在上面的网站可以搜索关键字,比如xcodeproj,spaceship。左边就会有Class List,方法/类查询都很方便。特别实用

Guess you like

Origin www.cnblogs.com/xiongwj0910/p/11541103.html