頭と尻尾はくれてやる!

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


macOSアプリのアプリ名表示は謎だらけ

PokéType Chart(ポケタイプ相性表)をリリースしました
↑この続きなのですが、先日リリースしたiOS/macOSアプリが、macOSだとアプリ名がなぜかプロジェクト名で表示されていました。
InfoPlist.stringsをローカライズして、それぞれのに
CFBundleName = "アプリ名";
CFBundleDisplayName = “アプリ名”;
てな感じで書いておけばいけるものと思っていたのですが、、、

↓こういうのが必要、というのを見たので、

LSHasLocalizedDisplayName = yes

を追加して申請(ver1.0.1(2))したのですが、これもダメ、、、まあそうだよな。以前リリースしたアプリはこれなしで上手くいってるし。
そのアプリと何が違うんだろう?わからん、、、

何かやれることはないかと調べてるとInfoPlist.xcstringsが使える、という記事(1*)を見たので使って申請(ver1.0.2(3))してみたが表示が以下のように表示がおかしいよ!とリジェクト。
App Store Connect Name: PokéType Chart
App Name when Installed: PokeGoChart2
App Name when Launched: PokéType Chart
App Name in About/Quit Menu: PokeGoChart2

結局なるべくやりたくなかったが、プロジェクト名を変更(PokeGoChart2→PokéType Chart)して申請(ver1.0.2(4))したところ審査を通過。


Macで名前が正しく表示されたアプリ
↑ダウンロードしたら無事にローカライズされたアプリ名が表示されてる。
iOSではbundle display nameを設定すればいいがmacOSだとそれだけではうまくいかないんじゃないの?と思わずにはいられないが謎だ。



*1)【最新Xcode15】アプリ名の多言語対応
スポンサーサイト






PokéType Chart(ポケタイプ相性表)をリリースしました

2020年に「わざタイプ相性表」というポケモンGO関連のアプリをリリースしていました。
このアプリはプライマリ言語が日本語のiOSアプリだったのですが、今回外国語版を追加し、かつMultiplatformアプリとしてリリースしました。

わざタイプ相性表forポケモンGOのアイコン
ポケタイプ相性表

元々アップデートで対応するつもりだったのですが、プライマリ言語を日本語から英語に変更するのがややこしそうだったので、旧アプリはApp Storeからの配信を停止して、新規アプリとしてリリースすることにしました。
旧アプリ名は使えませんので、日本語版の名称は「ポケタイプ相性表」としています。

内容も若干変わっているのですが、開発関連で言うとAdMobをやめて、3日間の無料期間を設けてそれ以降は課金してね、というように変更しました。もうAdMobにはうんざりしているのでアプリ内課金の方がよっぽど楽です。
あとはMultiplatformなのでNSUbiquitousKeyValueStoreを使って情報(検索履歴やクイズの成績など)を同じAppleのアカウントで共有できるようにしています。

なお”ポケモン”というワードは当然他社の商標でしょうから、勝手に使うことはできません。審査担当者によっては通過するようでそういうアプリがありますが、、、以前それが理由でリジェクトされたと記憶しており、再度申請してアカウント停止とかされても困るのでここは無難にポケモンという単語はアプリのタイトルに含めませんでした。

ポケタイプ相性表の不具合表示
↑なぜかMacではプロジェクト名が表示されてる、、、orz


MacでPHPの動かし方

以前はMacでPHPを動かすのにApacheを起動してたんだけど、Microsoft Copilot(Bing AI)に聞いたら、次のような方法を教えてくれた。

1.ターミナルからphp -vでインストールされてるか確認する(インストールされてた)
2.PHPファイルを置いてるディレクトリにcdで移動する
3.php -S localhost:8000で組み込みのPHPサーバーを起動する
4.ブラウザからhttp://localhost:8000/xxx.phpで起動

試したら、ちゃんと動いた。
便利だなあ、Microsoft Copilot!
ちなみにmacOSはSonoma 14.2.1


macOSアプリの名前が日本語で表示されない

年賀状の宛名印刷アプリ「CSVから宛名印刷」をリリース
↑という記事を先日書きましたが、このアプリはその用途から日本語専用にしています。
多言語でアプリをリリースする場合、通常は基本が英語で、多言語を追加、みたいな感じにすると思いますし、実際過去に日本語専用のiOSアプリをリリースしたことがあります。
macOSアプリで日本語専用は初めてだなあ、と思いつつ同じような手順で開発、申請したわけですが、、、
一番最初のver1.0はすんなり審査通過でリリースに至りました。

ところが、すごくささいな修正でver1.1 -> ver1.1.1にする時に審査担当者から、アプリ名の表示がおかしいよ?とリジェクトされました。

iTunes Connect Name: CSVから宛名印刷
App Name when Installed: Postcard/AddressPrinter
App Name when Launched: CSVから宛名印刷
App Name in About/Hide/Quit Menu: CSVから宛名印刷

↑こんな感じやでー!と言われて、え?そうなの?と調べたら、確かに、LaunchPadで表示されるアイコンを見ると、、、
LaunchPadで表示したアイコン
↑あら?日本語になってない、、、?!気付かなかったなあ、、、
(ちなみに横のはベースが英語で日本語を追加している場合で、意図通り日本語のタイトルが表示されています)

審査担当者が、君がそれでいいならいいけど?みたいなコメントもあったのですが、これは修正した方がいいなと思い、いろいろと修正を試みた。しかし、、、最終的には諦めました。私にはできませんでした。
何回もリジェクトされた後に、もうこれでいいです、、、(涙)
とリプライしてver1.1.1をリリースしてもらいました。悲しい。


SwiftUIのTextFieldがSonomaにしたら動かなくなった

「CSVから宛名印刷」というmacOSアプリのユーザーさんから「数値の入力ができない」と連絡がありまして、、、
そんなアホな?!と思いつつ調べたところ、どうやらそのユーザーさんのmacOSがSonomaでした。その頃はまだ自分は様子見でSonomaにしていない状態だったのですが、原因が他に思いつかなかったので、試しにSonomaにアップデートしたところ、見事に不具合が再現されました。
問題の箇所はこんな感じのTextFieldです。
TextField("x[mm]", value: binding_offsetX, 
formatter: numberFormatter2 , onEditingChanged: { (editingChanged) in
})

TextFieldにはいろんなイニシャライザがあるのですが、上記のはリファレンスにはなくて、deprecatedになってた、、、Xcode!教えてよ!

Deprecated
Use init(_:value:formatter:prompt:) instead. Add the onSubmit(of:_:) view modifier for the onCommit behavior. Use FocusState and focused(_:equals:) for the onEditingChanged behavior.


↑deprecatedなので今後はこういうの使ってね、とあるのでその通り↓このような形式で書き直しました。
TextField("x[mm]", value: binding_offsetX, formatter: numberFormatter2)
.focused($offsetXFieldIsFocused)
.onSubmit {
}
.onChange(of: offsetXFieldIsFocused) { newValue in
}

また、別なmacOSアプリ(AppPreview Editor)でも同様の不具合が発生したのですが、こちらはいろんな理由(値を保存するとか、undo/redoを有効にするとか)で上記のコードでは不十分でしたので、以下のようにしました。
import Combine

@State private var strokeWidthString: String = ""

TextField("", text: $strokeWidthString, onCommit: {
newMaterial .text_strokeWidth = value
viewModel.save([newMaterial], undoManager: undoManager)
})
.onReceive(viewModel.$model, perform: { value in
strokeWidthString = value.hoge
})
.onReceive(Just(strokeWidthString), perform: { newValue in
let filtered = newValue.retainNumericCharacters
if filtered != newValue {
strokeWidthString = filtered
}
})
だいぶはしょってるけど、こんな感じで記述しています。
ちなみにBing AIに教えてもらいました。ホント助かるわあ〜




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