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

1. NFCAnalyzer — [weak self] 抜け落ちによるクラッシュリスク
ファイル: NFCAnalyzer.swift:182-183
NFCタグをスキャンした後、tag.queryNDEFStatus のコールバック内で self.guessTagType と self.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トライアル付き
関連プロダクト
NFC SNS CARD MAKERの詳細を見る