1. archiveできない!?
古いXcodeを使っていた時のくせで、archiveの時は[Generic iOS Device]を選ぶものと思い込んでいた。
でもそれだと、ipaファイルしか生成されない。
【処方箋】正解は、[My Mac]を選んでarchive
2. スワイプできなくねぇ?
SceneKit使っていて、2本指によるスワイプ(位置移動)、ピンチイン・アウト(拡大縮小)ができなかった。ドラッグ(回転)は1本指なのでできる。
ググって見ると、ベータ版の頃から話題になっているよう。重大な不具合に思えるが、現状、直されていないし、制限事項にも上がっていない⁉️
option押しながらのマウス操作で、スワイプ ・ドラッグができるのかと思いきや、なんと用意されていない。
Mac miniとかMac Proでは、入力デバイスとしてタブレットが必要になってしまう。
SceneKit、ARKitを使ったiOSアプリでは、Mac Catalyst対応しました!って能天気にリリースできないという厳しい現実。
【処方箋】別途UIを実装する逃げしかない模様。
3. TableViewも変じゃねぇ?
複数選択(multiple selection)が働かない。
【処方箋】willSelectRowAtとwillDeselectRowAtで、むりやり実装するしか無さそう。
mizuBuro_cureさんの記事が参考になった。
このほかハイライト色(GrayとBlueの差別化)にも問題がありそうなので、複数選択をむりやり実装すると、なんか変な感じになる。
がんばったとしても、開発者のバグをカバーする努力に対して、App Store「アプリ審査」が冷や水を浴びせる可能性が高い。
4. SplitViewの幅おかしくねぇ?
起動時、primary側の幅がせまい。
minimum値を設定しても、それを下回る幅で起動する。
【処方箋】maxとminに同じ値を設定して逃げた。
splitViewController.preferredDisplayMode = .allVisible
splitViewController.minimumPrimaryColumnWidth = 300
splitViewController.maximumPrimaryColumnWidth = 300
5. アプリをクリーンインストールできなくねぇ?
~/Library/Containers/(bundle ID)/Data/Document
~/Library/Containers/(bundle ID)/Data/Library/Application Support/(app)
を参照してるので、アプリケーションフォルダから「通常通り」に削除しても、設定(plistやCoreDataなどなど)は残存してしまう。
【処方箋】Terminalで、defaults delete (Bunndle ID)を実行。
※App StoreでReady for Saleになってから確認したが、正式リリース版では「通常通り」の削除で残存物はなく、クリーンインストールは実現できた。
6. アプリ内課金ができない?
request = SKProductsRequest(productIdentifiers: Set([”XXX.XXX.XXX”]))
request.delegate = self
request.start()
のrequestの永続性が、iOSとは違うみたい。
【処方箋】requestは、SKProductsRequestDelegateを継承しているControllerで保持する。
7. ShareExtensionはむずかしい
私のアプリの作りが悪いのか、NSExtensionPrincipalClassを指定しないと、App Storeに上がらなかった。結果、NSExtensionMainStoryboardは排他の関係となるので、削除した。
MainStoryboardがなくなると、@Objcでクラス名を宣言しないと、OSは呼んでくれなくなる。
例:
@objc(ShareViewController)
class ShareViewController: SLComposeServiceViewController {
...
}
8. 勝手にメニューが作成されてしまう
勝手に作ってくれるのはいいのだけれど、問題だらけ。
1. Bundle display nameが使われない。XXX.appのXXXの部分が使われてしまう。
【処方箋】PRODUCT_NAMEを変えるしかなさそう。
2. File > Preferenceで、Version、Build、Acknowledgementが出てくるが空っぽ。
RunScriptで以下のようなスクリプトを走らせてるんだけど、これじゃぜんぜんダメ。
version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE")
build=$CURRENT_PROJECT_VERSION
root=${CODESIGNING_FOLDER_PATH}/Settings.bundle/Root.plist
if test -f $root; then
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $version" "$root"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $build" "$root"
fi
【処方箋】以下のようにしてほぼ削除。
extension AppDelegate {
override func buildMenu(with builder: UIMenuBuilder) {
super.buildMenu(with: builder)
guard builder.system == .main else { return }
builder.remove(menu: .preferences)
builder.remove(menu: .services)
builder.remove(menu: .file)
builder.remove(menu: .edit)
builder.remove(menu: .format)
builder.remove(menu: .view)
builder.remove(menu: .window)
builder.remove(menu: .help)
}
}
「Helpがないと審査に通らない」という書き込みも見たような気がするが、とりあえずこれで挑戦してみる。
追記:
Aboutのコピーライトだけは、NSHumanReadableCopyrightで簡単にできた。