🧑🏻💻 個人開発メモ
SwiftUIのローカライズ(多言語)対応
アプリ表示はこちら。
InfoPlist
の多言語対応は、各言語用のInfoPlist
のstrings
ファイルを作ればOK。
"CFBundleDisplayName" = "Password Gen";
"NSUserTrackingUsageDescription" = "This identifier will be used to deliver personalized ads to you.";
Xcode Tips
キーボードショートカット
- シミュレータのライト / ダークモードの切り替え:
command
+shift
+A
Xcodeでファイルのソートを行う方法
これでいい感じになる。
- プロジェクトフォルダ右クリック
- Sort by Name
- Sort by Type
Core Dataで画像を保存するときのTips
SwiftでRevenueCatを使うとき、StoreKit 2を利用するオプションは使わないほうが安定しそう。
// 🙆♂️ 挙動安定
Purchases.configure(withAPIKey: <public_apple_api_key>)
// 🙅♂️ 挙動不安定
Purchases.configure(
with: Configuration.Builder(withAPIKey: <public_apple_api_key>)
.with(usesStoreKit2IfAvailable: true)
.build()
)
詳細な原因まではわからなかったが、Sandbox環境でまれにエラーが発生した。
[Purchases] - WARN: 🍎⚠️ StoreKit 2 purchase took longer than expected (21.13 seconds)
...
[Purchases] - ERROR: 😿‼️ The receipt is not valid.
...
[Purchases] - ERROR: 💰 Product purchase for 'xxx' failed with error: Error Domain=RevenueCat.ErrorCode Code=8 "The receipt is not valid." UserInfo={readable_error_code=INVALID_RECEIPT, NSLocalizedDescription=The receipt is not valid., source_file=RevenueCat/HTTPClient.swift:379, rc_backend_error_code=7103, source_function=convertUnsuccessfulResponseToError(), rc_response_status_code=400, NSUnderlyingError=0x280c68720 {Error Domain=RevenueCat.BackendErrorCode Code=7103 "The receipt is not valid." UserInfo={rc_backend_error_code=7103, NSLocalizedDescription=The receipt is not valid.}}}
loading end
iOSでサブスク機能実装したアプリがAppleの審査でリジェクトされた。理由は以下のとおり。利用規約を用意する必要があるとのこと。
Guideline 3.1.2 - Business - Payments - Subscriptions
We noticed that your app did not meet all the terms and conditions for auto-renewing subscriptions, as specified in Schedule 2, section 3.8(b) of the Paid Applications agreement.
We were unable to find the following required item(s) in your app's metadata:
– A functional link to the Terms of Use (EULA)
Next Steps
To resolve this issue, please add this missing information. If the above information is present, please reply to this message in App Store Connect to provide details on where to locate it.
If you are using the standard Apple Terms of Use (EULA), you will need to include a link to the Terms of Use in your App Description. If you are using a custom EULA, add it in App Store Connect.
対応方法は以下のとおり。
SwiftUIでUserDefaultsを使うときのTips
iOSの場合、アプリにはじめてサブスクリプションを導入する際、本番環境でサブスクリプションが機能するまでAppleの承認後24時間ほどかかるみたい。自分のアプリでサブスクリプションが機能していないのはこのせいかも。
2023/2/15追記
サブスクリプション承認後に、27時間後 or アプリ空リリースのための審査提出(審査待ち)で本番環境で機能しはじめた。どちらが効いたのかはわからなかった。
App StoreのプロダクトページのURL
Info.plistを「Source Code」で開いて変更するとタブやスペースが混在することがある。その場合、「Property List」で開き適当なKeyを追加→削除するとタブに統一される。
SwiftDataに関するApple公式のサンプルコード
SwiftDataでCloudKitを使うときのモデル設計に関する注意点
- @Attribute(.unique)は利用できない
- @Relationshipの関係にあるすべてのフィールドはオプショナル型にしないといけない
- すべてのフィールドは初期値を設定するかオプショナル型にしないといけない
CloudKitを有効化して実行したときのエラー Invalid bundle ID for container
の対処法。以下で解決した。
Privacy manifest filesのNSPrivacyTrackingDomainsを調査する手順