シナリオを使用して、購入した商品を一括アップロード

5656 ワード

0
最近のプロジェクトでは、多くの購入品がアップロードされ、表いっぱいになっています.普段、商品情報が少ない場合は、手動で一つ一つ追加します.しかし、今は効率を高めるために、スクリプトをカプセル化し、大量にアップロードし、両手を解放し、一労永逸しなければならない.誰が私をプログラム猿と呼んでいるのだろうか.
いつものように、googleは既成の解決策があるかどうかを調べます.ネット上の関連情報は少なく、fastlateのプラグインspaceshipを見つけて、商品情報をアップロードすることができます.
これまでfastlateについても知っていましたが、fastlateを使用すると、継続的な統合、自動パッケージ化、サーバへのアップロードなど、多くのことをすることができます.今日はfastlateというspaceshipプラグインをパッケージします.
fastlateはRubyスクリプトを用いて開発した.Rubyスクリプトは簡単で学びやすく、コードがきれいに書かれているので、このようなことに適しています.
考えを言います.
まずexcel表を解析して、表の1行は1つの商品を代表します.商品の情報には、商品id、商品名、金額、商品情報、審査備考、商品スクリーンショットが含まれます.
Excelテーブルの固定フォーマット解析を事前に定義しておくとエラーは発生しません.
spaceshipを呼び出して商品情報をitunesconnectに一つ一つ伝えます.
各Appは個別のディレクトリで、アカウント情報、App情報、excelテーブル、商品のスクリーンショットを含む関連情報を準備します.
環境構築:
1.Xcodeツールのインストール:xcode-select --install2.fastlane:[sudo] gem install fastlane -NVのインストール
3.excel解析ライブラリrooをインストールする:[sudo] gem install rooMacシステム自体にRubyが付いているので、Winの場合は自分でインストールしてください.
コード・セクション:
まずexcelテーブルを解析する方法を見てみましょう.
Rubyには既存のexcel解析ライブラリ:rooがあり、rooをインストールすると使用を開始できます.先にrooをインポート:
require 'roo'

ファイルを開き、最初のテーブルを選択します.
xlsx = Roo::Spreadsheet.open(path, extension: :xlsx) 
sheet = xlsx.sheet(0) 

各セルの内容を取り出すには、セルは座標で表されるので、行の合計数と列の合計数を取得してから反復します.表の行と列のカウントは1から始まることを覚えておいてください.ここではまず表のタイトルを出して、keyとして、セルの内容をvalueとして、各行の内容を辞書として、表全体のフォーマットは1つの配列にいくつかの辞書をネストします.
rows_count = sheet.last_row #    
colunms_count = sheet.last_column #    

titles = []

rows_count.times do |r|

    #          
    if r == 0
      colunms_count.times do |c|
        res = sheet.cell(r + 1, c + 1)
        titles << res
      end

      next
    end

    rows = {}

    colunms_count.times do |c|
      res = sheet.cell(r + 1, c + 1)
      rows[titles[c]] = res #       key ,          value
    end

    @result << rows

end


これで表の内容が解析されresultに保存されます.
次にitunesconnectにコンテンツを転送します.spaceshipをインポートするには:
require 'spaceship'

開発アカウントにログインして、以下のコードを初めて実行すると、コンソールにアカウントとパスワードを入力できます.
Spaceship::Tunes.login(account) 

bundle idを使用して、商品を追加するappを検索します.
app = Spaceship::Application.find(bundle_id)

商品の作成を開始し,表に解析したばかりの配列を反復して順次呼び出す.
def create()
  type = Spaceship::Tunes::IAPType::CONSUMABLE

  @products.each do |product|

    tier = get_tier(product['amount']) #         

    product_id = "#{@bundle_id}.#{product['id']}"

    review_image_path = File::join(@path, "#{product['review_image']}.jpg")
    abort("#review_image=#{review_image_path} not exist") unless File::exist?(review_image_path)

    puts "#uploading ... product=#{product}"

    begin
      @app.in_app_purchases.create!( #     
        type: type,
        versions: {
          'zh-CN': {
            name: product['name'],
            description: product['desc']
          }
        },
        reference_name: product['name'],
        product_id: product_id,
        cleared_for_sale: true,
        review_notes: product['review_desc'], #     
        review_screenshot: review_image_path, #     
        pricing_intervals: [
          {
            country: "WW",
            begin_date: nil,
            end_date: nil,
            tier: tier
          }
        ]
      )
      puts "#upload success"
    rescue Exception => error
      puts "#upload failure, error=#{error}"
    end
  end
end

こちらtypeは商品タイプで、消耗型、購読型などがありますが、ここではすべての商品が消耗型であると仮定します.
product idは、bundle idと商品idで構成されているので、表に記入するときは後ろの半分の商品idだけを記入してください.コードには自動的に前のbundle idが加算されます.
正常に作成すると次のタスクが実行され、作成に失敗すると例外が取得され、実行が続行されます.一般的に捕獲された異常は,既にその商品が存在しているため,繰り返し作成できないことである.また、レビューコメントや商品のスクリーンショットの記入が正しくなくても異常です.
get_Tierは商品の価格等級を取得する方法で、私たちが入力した価格をitunesconnectの価格等級に変換します.
def get_tier(amount)
  tier = {
    6 => 1,
    30 => 5,
    50 => 8,
    88 => 13,
    98 => 15,
    128 => 20,
    198 => 30,
    228 => 34,
    288 => 46,
    328 => 50,
    548 => 57,
    648 => 60
  }
  abort("#tier not exist when amount=#{amount}") unless tier[amount]
  tier[amount]
end

価格の等級はとても多くて、よく使うのはこのいくつかだけで、後で使ってからゆっくりと広げます.
商品情報を修正する原理は、修正した表をもう一度走ることです.注意product idは変更できません:
def modify()
  @products.each do |product|

    product_id = "#{@bundle_id}.#{product['id']}"

    tier = get_tier(product['amount'])

    review_image_path = File::join(@path, "#{product['review_image']}.jpg")
    abort("#review_image=#{review_image_path} not exist") unless File::exist?(review_image_path)

    puts "#modify ... product=#{product}"

    begin
      purch = @app.in_app_purchases.find(product_id) #     
      e = purch.edit #     
      e.versions = {
        'zh-CN': {
          name: product['name'],
          description: product['desc']
        }
      }
      e.reference_name = product['name']
      e.review_notes = product['review_desc']
      e.review_screenshot = review_image_path
      e.pricing_intervals = [
        {
          country: "WW",
          begin_date: nil,
          end_date: nil,
          tier: tier
        }
      ]
      e.save!

      puts "#modify success"
    rescue Exception => error
      puts "#modify failure, error=#{error}"
    end
  end
end

完全なコードと使い方はIAPProductToolをご覧ください.
テキストリンク