2023年7月29日土曜日

Android 環境変数や定数を build.gradleに持たせる実装を解説

どうも。どっことです。今回は環境変数や定数を build.gradleで管理する実装を解説します。

build.gradleで環境変数・定数を管理する実装

Gradleが自動生成してくれるBuildConfigを使うことで、buildTypesproductFlavorごとに初期値や定数値を持たせることができます。よくあるのはAPIのドメインや、広告IDの切り分けなどですね。開発版(buildType:debug)とリリース版(buildType:release)で開発用と本番用で切り替えるなどに利用できます。今回はBuildConfigにアプリ内で参照できるパラメータを乗せる実装を解説します。

BuildConfigに定数を乗せる実装

buildTypes(debug/release)ごとに定義する場合は以下でOKです。

  • defaultConfigに初期値を設定する。
  • buildTypesごとに定数の値を上書き設定する。
android {
  // ...
  defaultConfig {
      // buildTypesで上書きがなかった場合に設定される値
      buildConfigField "String", "AD_UNIT_ID", "\"とりあえずな広告ID\""
  }
  // ...

  buildTypes {
    release {
      // 本物の広告IDを上書きして定義
      buildConfigField("String", "AD_UNIT_ID", "\"本物の広告ID\"")
      ...
    }
    // とりあえずな広告IDをdefaultConfigに書いていますが、
    // debugブロックに書いて、defaultConfigは空文字などを指定しても問題ありません。
  }
}

あとは上記の定数を使いたいところで、以下ように参照すれば値を取得することができます。

const val AD_UNIT_ID_SIDE_BAR = BuildConfig.AD_UNIT_ID

まとめ

今回は、BuildConfigに定数を持たせる実装について解説しました。同じアプリでも開発環境やクライアントに見せる版、一般公開版など種別がさまざまになることが多いと思います。このような機能を利用して、ソースコード上に煩わしい実装が増やさないように心がけましょう。

参考

2023年7月27日木曜日

Android キーイベントを発行する実装方法を解説

どうも。どっことです。今回はキーイベントを発行する実装方法を解説します。

キーイベントを発行する

例えば方向キーのキーイベントを発行する場合、以下をつかいます。

KeyEventを生成して、dispatchKeyEventで投げるだけ。これだけです。

dispatchKeyEvent(KeyEvent(ACTION_KEY_DOWN, KEYCODE_DPAD_UP))

気をつけないといけないのは、KeyEventコンストラクタに渡している第一引数には ACTION_KEY_DOWN を指定することです。

そもそもACTION_KEY_DOWNはキー開始(画面やキーが押され始めた)、ACTION_KEY_UPはタッチ終了(画面やキーから離れた)を表すイベントですが、第一引数にACTION_KEY_UPを指定しても、OS側で制御してくれません。というのもOSからしてみれば

「押されてないのに離れたとか何事!?怖いから無視しとこ…」

という形に整理されていそうだからです。そのため、どうしてもACTION_KEY_UPでやりたかったら、ACTION_KEY_DOWNによりキーが押され始めたイベントも一緒に発行する必要があります。(どれだけ頑張る必要があるかは知らない…)ACTION_KEY_UPに思い入れしなければ、非常に簡単ですね。

まとめ

今回はキーイベントを発行する実装方法を解説しました。カスタムキーボードなどに役立てていただければと思います。

参考

2023年7月24日月曜日

iOS Xcode ドキュメンテーションコメントを追加するショートカットキーを紹介

メソッドの上部で option + command + / を入力すると、自動でドキュメンテーションコメントが追加されます。

あとで見返すときのために、「何をするメソッドか」「引数にはどんな値が必要か、どういう値が想定されているか」「戻り値は何か」などを記入しておきましょう。

参考

2023年7月22日土曜日

Swift CocoaPods導入手順をメモ書き程度に紹介

Cocoapodsのインストール

sudo gem install cocoapods

または

sudo gem install -n /usr/local/bin cocoapods

Cocoapodsのセットアップ

インストール完了後、各プロジェクトで利用するためにCocoaPodをセットアップする。

pod setup

その後プロジェクトフォルダでコンソールを開いて以下コマンドを実行する。

pod init

これにより、Podfileが自動生成される。

ライブラリのインストール

自動生成されたPodfileに必要なライブラリの記述し以下を実行。

pod install

初回は上記、2回目以降は以下を使う。

pod update

これにより、.xcworkspaceという拡張子のファイルが生成される。Xcode でプロジェクトを開くときはこのファイルをクリックして開く。

参考

2023年7月21日金曜日

Mac スクリーンショットを撮影するためのショートカットを紹介

どうも。どっことです。Macでスクリーンショットを撮影したいけど、ショートカットキーを忘れて毎回検索しているので、備忘録として紹介します。

画面全体のスクショを撮影する場合

Shift + command + 3

Windowsの printscreen

範囲を指定してスクショを撮影する場合

Shift + command + 4

Windowsの Shift + win + s

ウインドウを指定してスクショを撮影する場合

Shift + command + 4 → Space

Windowsの alt + printscreen

iOS 数値を0埋めしてテキストとして表示する

Androidでは、String.format(text, value)としてテキストを出力させるが、iOSの場合もほぼ同じでStringのコンストラクタに入れるだけ。

let number = 3
let numberString = String(format: "%03d", number) // 003

参考

2023年7月20日木曜日

iOS アラートダイアログを表示するチートシート

iOSでよくあるアラートダイアログを表示する。

let alert = UIAlertController(title: "タイトルテスト", message: "メッセージテスト", preferredStyle: .alert)
// ボタンを追加する
let action = UIAlertAction(title: "ボタン", style: .default, handler: { action in
    /** do something **/
})
// 以下で、ボタンとそのタップ処理を追加する。ボタンは複数追加できる。
alert.addAction(action)
// 表示
present(alert, animated: true)

presentがライフサイクル上でコールするのが早すぎると無視されるので、viewDidAppear()以降のタイミングで呼ぶこと。

参考

2023年7月19日水曜日

iOS Enumの全要素を配列で取得する

enumの定義に、CaseIterable を実装してあげるだけ。

enum Size: CaseIterable {
  case maximum
  case big
  case medium
  case small
  case minimum
}

ってやると、allCasesにアクセスできるようになる

Size.allCases.map { /* do something. */ }

firstIndexでインデックスもとれるようになる

Size.firstIndex(of: .big)!

参考

2023年7月16日日曜日

Swift 引数付きStringイニシャライザ

引数付きString(format:, _ arguments)のイニシャライザの使い方

let month = "12"
let day = "31"
let text = String(format: "%@月%@日", month, day)
print(text)

2023年7月15日土曜日

CI/CD 最近考えていること リリース手順が面倒くさい

毎回毎回、

署名キー探して、
設定値を入力してビルドして
aabファイル生成して
プレイストアにアップロードして

ってフローが面倒になった。どうにかならないものか。

少なくても、署名キー探す~aabファイル生成するまでを自動化できることは知っているけど、例えばGitHubActionでやるなら生成したaabファイルや署名キーを秘匿にしないといけない都合でリポジトリも秘匿にしないといけないし、でもそれを秘匿にするのは正直あまりうれしくない(できるだけパブリックにしておきたい)。どうにかならないものか。

って考えたときに、「ソースを管理する領域(GitHub)とaabファイル生成をする領域を別にすればいいんじゃん。そうすればソースはパブリックのままでいいし、署名キーやら生成したaabファイルやらも秘匿の状態を保てる。とても幸せやん。」と気づいた。

上記を整理すると以下のフローとなる。

  1. ローカル環境で開発
  2. GitHubに変更をプッシュ
  3. GitHubはGitHubActionのジョブを回す
    • テストを回したり
    • Readme更新したり
    • CI/CDサービスに登録してあるジョブのトリガーを引いたり ★1
  4. 前項のトリガーを受けて、CI/CDサービスはaabファイルを生成する。
    1. GitHubからソースコードをクローンしてくる。
    2. aabファイルを生成し、成果物として管理。
  5. CI/CDサービスはプレイストアにaabファイルをアップロードする。 ★2
    1. どこまでできるか次第だが、リリースノートなども合わせてアップロードできればなお嬉しい。
  6. CI/CDサービスはすべての処理が完了したことを通知する。
  7. 私はそれを確認して、特に問題なければリリース。何かあれば適宜修正。

素敵だ。上記フローを実現するために必要な調査は★1,2の内容。

  • ★1:登録したジョブを実行するトリガーを外部から引くことはできる?(CI/CDのサービス次第?)
  • ★2:aabファイルをプレイストアにアップロードするクチ(=IF)は用意されている?どこまでの情報をアップロードできる?

まあ、「そんなのありません」ってことはないんだろうけどね。特に★1については「サービスとしてはあるけど、有料会員様限定のサービスなんすよ」かもしれないし。

というわけで、考えていることでした。調査した結果とか、更新があればまた改めて投稿します。

移行予定

どうも。どっことです。 タイトルの通りですが、諸事情により GitHubPage に移行予定です。 https://mkt120.github.io/ この備忘録に記載の内容を転記しつつ、今後はこちらのページを更新していく予定です。