頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


iOSアプリ「個体値チェッカー for ポケモンGO」をリリースしました

ivschecker_mainIconR200.png

個体値チェッカー for ポケモンGO

ポケモンGOで捕まえたポケモンの個体値を調べるアプリをリリースしました。

220512_1.jpg
↑こういう個体値を示すグラフが表示されている画面から読み取ります。
ですのでこの画面を含む
(1)スクリーンショット(複数枚可能)
(2)動画
のどちらかを事前に作成しておきます。


220512_2.gif
↑動画の場合はこのようにグラフを表示しつつポケモンを次々と切り替えていくところを録画してください。
1匹ごとにスクショを作成するのが面倒だと感じる方には動画がおすすめです。多分動画の方が楽です。

220512_3.jpg
↑読み取った結果はこのようにピクチャーインピクチャー機能でポケモンGOと同じ画面で表示させることができます。
ですので結果を見ながら、ポケモンGO側で個体値を入力するとか博士に送るなどの作業ができます。
右側の15というボタンをタップすると次のポケモンの結果が表示されます。
スポンサーサイト






Create MLのObject Detection用のデータセットを作成する

Create ML起動時の画面

↑これはCreate MLのプロジェクト作成時画面だけど、このObject Detectionで生成されたNNは、画像内にどんなオブジェクトがどこにあるかを出力してくれる。
このデータセット(画像とJSONファイル)をmacOSアプリで作成しようとしたんだが、はまったことが二つ。

1つ目)
JSONファイルに画像ファイル名やオブジェクトのラベルや座標を持たせる必要があるんだが、この座標はx, y, width, heightというキーで整数を与える。
このx, yは画像の中心であり、左上でも左下でもない!

2つ目)
macOSでNSViewなどを扱ったことがあればご存じだろうが、、、macOSではiOSと違い、原点が左下だ。うっかり左下を原点とした座標を与えていたのだが、JSONファイルで与えるべき座標は左上が原点としての値だ。

とまあしょうもないところで随分と時間をロスしたのでこれからやる場合にはご注意を。

なお、Create MLで学習させて無事mlmodelファイルを作成し、それをiOSアプリに持ってきて使うと出力される座標は左下が原点になってる。なんでやねーん!


Pik Friendsの開発時の話

ピクミンブルームですでにプレイしてないフレンドを探す方法
↑リリースしましたよ!って記事はこちらに書いたんだけど、iOS開発がらみの話を少々。

動画から文字を読み取る、というのはVisionのVNVideoProcessor, VNRecognizeTextRequestなどのクラスを使用。
残念ながら日本語の読み取りは現在のところ不可らしいので、名前(日本語可能)ではなくAccount ID(英数字のみ)を読み取っている。

前回との比較をするのでデータは保存しておく必要があるんだけど、たいした量でもないのでUserDefaultsでさくっとsave/loadしてる。

このアプリは初のSwiftUIベースのプロジェクト。
いいわあ~、SwiftUI。まあ、たまにイラつくこともあるけど。

こういう他のアプリを使う場合にちょっと便利になるアプリ、というのを作成する場合、元のアプリに変更があった場合に突然動作しなくなる可能性がある。
なので、そうそう時間をかけてらんないよな、ということで英語版のみでリリースした。
タブのアイコンも元々systemが持ってるのを使ってる。
Infoタブあたりのページは以前作成したアプリ(storyboardベースだけど一部はSwiftUI使ってた)からの流用。
流用する場合にSwiftUIの方がラクだなあと改めて思ったわ。
iPadのスクショを用意するのが面倒なのでiPhone専用アプリにした。
App Previewは6.5インチ用だけは作成したが、5.5インチ用は作成せずスクショだけにした。

などなどの簡略化により自分にしては短期間でリリースに至ったと思う。


今回申請した日の夜には審査に入り(最近早いね)、すぐにリジェクトされた。
Guideline 2.1 - Information Needed
で引っかかった。
再申請ではなく、メッセージでこちらが説明の返信、向こうが返信、さらにこちらも返信で再審査に入り、すぐに通過した。


ピクミンブルームですでにプレイしてないフレンドを探す方法

iPhoneでピクミンブルームを楽しんでいます。ポケモンGOもいいですが、歩行時にたいしてやることないのがナイスです。

時々フレンドさんにポストカードを送ります。
ポストカードは手持ちのピクミンが”配達”してくれるのですが、フレンドさんがポストカードを開封すると配達してくれたピクミンは手元に戻ります。しかし、フレンドさんがポストカードを開封しない場合は3日くらい(?)行ったきりになります。
ですので、なるべく開封してくれないフレンドさんにはポストカードを送りたくないなあ、と。送るのも面倒ですしピクミンがなかなか帰ってきませんし。

ポストカードを開けてくれないフレンドさんは、もしかしたらすでにピクミンブルームをプレイしていないかもしれません。
こちらから細かい状況はわからないのですが、フレンドさんの歩数は毎日更新されています(多分一日一回)。

ですから、たまに(数日に一度)歩数をチェックして歩数が変わってなければ「もうこのフレンドさんはプレイしてないかも」と考えていいのでは?
ということで簡単にフレンドさんの歩数をチェックできるiOSアプリを作成、リリースしました。

PikFriendsアイコン
Pik Friends
↑こちら「Pik Friends」です。

使い方は、
1)ピクミンブルームでフレンドさんを見られる画面に行き、全てのフレンドさんが映るような動画を作成します。
2)Pik Friendsでその動画を選択するとアプリは動画の内容を読み取り、フレンドさんの名前(Account ID)と歩数を表にまとめます。


PikFriends分析結果1
↑こんな感じになり、前回の歩数の差に変化がないフレンドさんを簡単に見つけることができます。
私のフレンドさんも何人かすでにプレイしていないようです、、、


PikFriends分析結果2
↑ちなみにアプリはこんな感じで動画内の文字を読み取ります。デフォルトでは0.1秒ごと(変更可能)に調べますので、録画時にまあまあ早くスクロールさせても大丈夫だと思います。


SwiftUIのTextFieldで指定の桁数で浮動小数点数を入力する

アプリでユーザーがあるFloatの値を設定できるようなSwiftUIのTextFieldを置きたい。
何桁入力されても意味ないので小数点以下の桁数を例えば2にしたい。

ようやく辿り着いた記述がこんな感じ。
TextField("",  value: $hoge, format: .number.precision(.fractionLength(2)))
.keyboardType(.decimalPad)
.textFieldStyle(RoundedBorderTextFieldStyle())
TextFieldだとformatter:ってコードがよく見つかるけどformat:ってのもあるんだな。
keyboardTypeをdecimalPadにすれば小数点の入力もできるキーボードが表示される。

入力時は0.12345とか可能ではあるが、TextFieldからフォーカスが外れるなどすると指定の桁数に丸めて表示される。かつ、実際の値を確認しても丸められてる。


↑動作時の様子。

なおキーボードを閉じるのは、ZStackで1番奥のViewに以下のような感じでジェスチャーを設定してresignFirstResponderしてる。
.onTapGesture {
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
}






Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.