Fastlaneにてcordova(ionic)プロジェクトのiOSアプリをDeploygateにアップロードする手順

今回やりたいことは以下
・cordova(ionic)プロジェクトで作成したアプリをビルド
・ビルドしたアプリをデプロイゲートへアップロード
とりあえずはデプロイゲートまでアップするのが目標

fastlaneインストール

fastlaneをインストール

$ sudo gem install fastlane
AdHoc版のビルドまでできるように

ionicプロジェクトの作成して最新のcordova-iosをインストール

$ ionic start --v1 fastlane_demo
$ cd $_
$ ionic platform rm ios && ionic platform add ios@latest

fastlaneディレクトリを作成

$ cd fastlane_demo
$ mkdir fastlane

fastlane/Appfile

app_identifier "xxx.yyy.zzz" # アプリのバンドルID
apple_id "xxx@xxx"           # AppleID
team_id "xxxxxxxx"           # TeamID

team_idはxcodeのSigningのTeamで選択してるやつのID。
IDはAppleDeveloperのMembershipから確認できる。

fastlane/Fastfile

platform :ios do
  desc "AdHoc Build For iOS"
  lane :build do
    gym(
      workspace: 'platforms/ios/fastlane_demo.xcworkspace',
      silent: true,
      clean: true,
      export_method: "ad-hoc"
    )
  end
end

こちらのFastfileにタスクを記述してコマンドで実行する形。

$ fastlane ios build

成功すればプロジェクト直下のディレクトリに ipaファイルとdSYMファイルが出来上がってるはず。
基本的にxcodeからアーカイブしてエクスポートしてるのと同じはずなので、うまくいかない場合はxcodeから試してみてうまくいくか確認するとよいかも。

Deploygateにアップロード

あとはデプロイゲートにアップロードする

fastlane/Fastfile

platform :ios do
  ・・・
  desc "Upload Deploygate For iOS"
  lane :upload_deploygate do
    deploygate(
      api_token: 'xxxxx'  # デプロイゲートのAPIキー
      user: 'xxxxx',      # デプロイゲートのアカウント
      ipa: 'xxx.ipa'      # ipaのパス
    )
  end
end

実行

$ fastlane ios upload_deploygate
まとめ

git cloneしてから一連の作業をまとめるとこんな感じかな

$ ionic prepare && fastlane ios build && fastlane ios upload_deploygate

とりあえずCircleCIに乗せる前段階の調査としてこんな感じで。以上です

iOS iTunesConnectに継続課金の自動更新登録(Auto-Renewable Subscription)が表示されない原因

https://terakoya.site/ios_dic/ios-dic-in-app-purchese/
こちらを参考にiTunes Connectで設定を行なうところでつまづいた。

App内課金コンテンツを追加するところで以下の3種類しか選択肢に出てこず、自動更新登録が表示されない。。
・消耗型
・非消耗型
・非更新登録

ググるとこちらに解決方法があった
ちゃんと所在を明らかにしろってことですね。色々登録しないとダメみたいです。

iTunes Connect -> Agreements, Tax, and Banking -> Contract Type: Paid Applications and fill fields [Contact Info, Bank Info, Tax Info]

引用元:ios - Why I didn't see Auto-Renewable Subscription in iTunes Connect - Stack Overflow

以上です

【vue.js】コンポーネントを分割してテンプレートを分割

1画面1コンポーネントみたいな形で実装されているプロジェクトで。v-ifが増えてごちゃごちゃしてきたのでコンポーネントの分け方をメモしておく。vue.jsの基本構文だけども。。

Main.vue

<template>
  <div>
    <part-free v-if="user.isFree" v-bind:user"></part-free>
    <part-premium v-if="user.isPremium" v-bind:user"></part-premium>
  </div>
</template>

<script>
import PartFree from './PartFree.vue'
import PartPremium from './PartPremium.vue'

export default {
  data: {
    user: {
      name: 'Yamada',
      isPremium: true,
      // isFree: true
    }
  },
  components: {
    'part-free': PartFree,
    'part-premium': PartPremium,
  }
}
</script>

PartPremium.vue

<template>
  <div>Premium : {{ user.name }}</div>
</template>
<script>
export default {
  props: { user: Object }
}
</script>

PartFree.vue

<template>
  <div>Free : {{ user.name }}</div>
</template>
<script>
export default {
  props: { user: Object }
}
</script>

ずらずら書いたけど、以上です

cordova-plugin-purchaseでQuotaExceededError (DOM Exception 22): The quota has been exceededエラー

cordova-plugin-purchaseを使っての継続課金機能の開発中にこちらのエラーが多発した。iOSの話。

Error in Success callbackId: InAppPurchase1613437489 : QuotaExceededError (DOM Exception 22): The quota has been exceeded.

この辺りの処理も呼ばれなくなり正常に処理できなくなったので調べて見た。

store.when('PRODUCT_ID').approved(function(product) {
  ・・・
})
store.when('PRODUCT_ID').verified(function(product) {
  ・・・
})

プラグインのソースを見ていたらこの辺りの処理や端末から取得可能なレシートを1度ローカルストレージに保存するような実装になっていた。
SandBox環境だと何度も課金するのでレシートデータもどんどん膨大になっていく。それをそのままローカルストレージに保存するところで容量オーバーのエラーになっている様子。アップルIDを変えてログインしなおしても同じ端末だと古いレシートも処理しているようで回避できず。。今時点の対策としては端末を初期化するしかなさそう。。

これ調べるのに1日くらいかかってしまった。。すっきりしないけど、以上です

ionic3でcordova pluginを使用する

ionic2からionic-native経由でcordovaプラグインを使うような形になってる。
素のcordovaプラグインを使うことも多いと思うのでメモしておく。

pages/home/home.ts

import { Component } from '@angular/core';
import { Platform } from 'ionic-angular';

declare var MyPlugin :any

@Component({
  ・・・
})

export class HomePage {
  constructor(public plt: Platform) {
    this.plt.ready().then((readySource) => {
      MyPlugin.myMethod()
    }
  }
}

以上です

multitailでパスワード認証のサーバーを監視

ちょっと調べた感じだとsshpass使わないとできないかも

multitail -s 2 -l "sshpass -p 'password' ssh user@srv1 'tail -f /path/to/log'" \
-l "sshpass -p 'password' ssh user@srv2 'tail -f /path/to/log'"
-l "sshpass -p 'password' ssh user@srv3 'tail -f /path/to/log'"
-l "sshpass -p 'password' ssh user@srv4 'tail -f /path/to/log'"

以上です

【vue.js】mixinでvue-routerを使う

こちらで書いたのとほぼ同じ内容だけれどもいちおうメモしておく。vue-routerの基本的な書き方は省略。

Vueインスタンス生成部分

import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'

var router = new VueRouter({
  routes: routes,
  ・・・
})

// ★ここを追加
Vue.router = router

new Vue({
  ・・・
  router: router
})

mixin/mixinHoge.js

import Vue from 'vue'

export default {
  methods: {
    fuga: function() {
      // vue-routerを使う
      Vue.router.push('/hogefuga')
    }
  }
}

以上です