Open13

🧑🏻‍💻 個人開発メモ

donchan922donchan922

SwiftUIのローカライズ(多言語)対応

アプリ表示はこちら。
https://zenn.dev/sakutech/articles/swiftui-localization

InfoPlistの多言語対応は、各言語用のInfoPliststringsファイルを作ればOK。

InfoPlist.strings
"CFBundleDisplayName" = "Password Gen";
"NSUserTrackingUsageDescription" = "This identifier will be used to deliver personalized ads to you.";
donchan922donchan922

Xcode Tips

キーボードショートカット

  • シミュレータのライト / ダークモードの切り替え: command + shift + A

Xcodeでファイルのソートを行う方法

これでいい感じになる。

  1. プロジェクトフォルダ右クリック
  2. Sort by Name
  3. Sort by Type
donchan922donchan922

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

https://www.revenuecat.com/docs/configuring-sdk

donchan922donchan922

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.

対応方法は以下のとおり。
https://help.apple.com/app-store-connect/#/dev7fa2fff96
https://starhoshi.hatenablog.com/entry/2023/01/16/085641

donchan922donchan922

iOSの場合、アプリにはじめてサブスクリプションを導入する際、本番環境でサブスクリプションが機能するまでAppleの承認後24時間ほどかかるみたい。自分のアプリでサブスクリプションが機能していないのはこのせいかも。

2023/2/15追記
サブスクリプション承認後に、27時間後 or アプリ空リリースのための審査提出(審査待ち)で本番環境で機能しはじめた。どちらが効いたのかはわからなかった。

https://www.revenuecat.com/docs/launch-checklist#5-prepare-release

donchan922donchan922

Info.plistを「Source Code」で開いて変更するとタブやスペースが混在することがある。その場合、「Property List」で開き適当なKeyを追加→削除するとタブに統一される。

donchan922donchan922

SwiftDataでCloudKitを使うときのモデル設計に関する注意点

  • @Attribute(.unique)は利用できない
  • @Relationshipの関係にあるすべてのフィールドはオプショナル型にしないといけない
  • すべてのフィールドは初期値を設定するかオプショナル型にしないといけない

https://developer.apple.com/documentation/swiftdata/syncing-model-data-across-a-persons-devices
https://zenn.dev/himara2/articles/88d4d873d4078d
https://alexanderlogan.co.uk/blog/wwdc23/08-cloudkit-swift-data