開発事例

NFC SNS CARD MAKER バグ取り記録 — SwiftUIアプリ開発で実際に直した5つの問題

NFC SNS CARD MAKER バグ取り記録 — SwiftUIアプリ開発で実際に直した5つの問題

クラッシュゼロへ — 実際のコードから見つけたバグ修正記録

アプリをリリースしてからが本当の戦いです。NFC SNS CARD MAKERは2025年末にApp Storeへリリースしましたが、その後も地道なバグ取りを続けています。今回はSwiftソースコードを実際に精査して見つかった問題点と修正内容をまとめました。

NFC SNS CARD MAKERの画面

1. NFCAnalyzer — [weak self] 抜け落ちによるクラッシュリスク

ファイル: NFCAnalyzer.swift:182-183

NFCタグをスキャンした後、tag.queryNDEFStatus のコールバック内で self.guessTagTypeself.guessManufacturer を呼び出していましたが、[weak self] キャプチャが漏れていました。NFCAnalyzer がコールバック実行前にメモリ解放されると確実にクラッシュします。

修正: クロージャ先頭に [weak self] in を追加し、guard let self = self else { return } でガード。

2. NFCWriter — verifyAndFinish の非同期コールバックで self が unsafe

ファイル: NFCWriter.swift:563-615

NFC書き込み後の検証フロー(verifyAndFinish)では、ネストされた複数のコールバックが発生します。外側のクロージャには [weak self] がありますが、内側の readNDEF コールバック(line 563)は強参照のまま。書き込みが長引いてユーザーが画面を離れた場合、参照ダングリングのリスクがありました。

修正: 全ネストクロージャに [weak self] を統一。

3. HistoryManager — エンコード失敗が無音で握りつぶされる

ファイル: HistoryManager.swift:180-181

try? JSONEncoder().encode(items) のエラーを print で捨てているだけで、ユーザーへのフィードバックもリトライもありません。履歴が実は保存されていなかった、という状況が発生しえます。

修正: エンコード失敗時に Supabase へのフォールバック書き込みと、ローカル通知(トースト)でユーザーに通知するフローを追加。

4. PaywallView — 商品が見つからないとき購入ボタンが無音で無効になる

ファイル: PaywallView.swift:373

store.creditProducts.first(where: { $0.id == id })nil を返すケースで、関数が何もせずに return するだけでした。ユーザーには「買えない」という表示すら出ず、タップしても何も起きないUXになっていました。

修正: nil 時にエラートーストを表示し、再取得ボタンを出すフローに変更。

5. StoreManager — 無料クレジット上限チェックがボタン無効化より後に走る

ファイル: StoreManager.swift:364-367

無料プランのクレジット購入上限チェックが、ユーザーが購入ボタンをタップしたに実行されていました。正しくは「上限に達したらボタン自体を disabled にする」べきでした。

修正: PricingGate の判定を PaywallView の button.disabled バインディングに接続し、事前に UI を無効化。

開発者として思うこと

iOSのNFC APIはコールバックが深くネストしやすく、[weak self] の書き忘れが起きやすいです。コードレビューより静的解析(SwiftLint + Periphery)のほうが確実に拾えます。

また「何も起きない」というUXバグは最も見落とされやすく、実機テストでしか気づけないものが多いです。TestFlightで複数端末・複数アカウントを使ったテストを習慣にすると、こういったサイレント失敗を早期発見できます。

NFC SNS CARD MAKERはこれらの修正を含む最新バージョンをApp Storeで公開中です。

Download on the

App Store

NFC SNS CARD MAKER — 無料ダウンロード・7日間PROトライアル付き

この記事が役に立ったらシェアしてください