基本方針

print() は禁止Logger(os.log)を使用する(CLAUDE.md準拠)。

共通設定

import OSLog

private static let logger = Logger(
    subsystem: Bundle.main.bundleIdentifier ?? "com.happyboy1002.DailyTips",
    category: "[クラス名]"
)

カテゴリ一覧

カテゴリ用途使用箇所
CoinServiceコイン残高・ボーナス管理CoinService
ThemeServiceテーマ購入・選択ThemeService
PremiumServiceサブスク管理PremiumService
NotificationServiceローカル通知NotificationService
QuizService豆知識クイズQuizService
GenreQuizServiceジャンルクイズGenreQuizService
GenreProgressService進捗管理GenreProgressService
FavoriteServiceお気に入りFavoriteService
HistoryServiceログイン履歴HistoryService
ReviewServiceレビュー誘導ReviewService
ShareServiceSNS共有ShareService
RewardedAdManagerRewarded広告RewardedAdManager
InterstitialAdManagerInterstitial広告InterstitialAdManager
AppOpenAdManagerAppOpen広告AppOpenAdManager
TipLoaderService豆知識読込TipLoaderService
AppViewModelアプリ全体状態AppViewModel
WidgetWidget拡張SmallTipWidget, MediumCalendarWidget

使用例

private static let logger = Logger(
    subsystem: Bundle.main.bundleIdentifier ?? "",
    category: "CoinService"
)

// 通常イベント
logger.info("ログインボーナス付与: streak=\(streak)")

// 警告
logger.warning("動画ボーナス上限到達")

// エラー
logger.error("daily_tips.json decode失敗: \(error.localizedDescription)")

ログレベルの使い分け

レベル用途
.debug開発時のみ確認したい情報Widget タイムライン更新
.info通常のイベントログイン、コイン消費、テーマ購入
.notice注目すべきイベント初回起動、サブスク購入、ジャンル全アンロック
.warning異常だが継続可能広告ロード失敗、AppGroup nil検出
.error機能継続不可JSON decode失敗、StoreKit verification失敗

プライバシー対応

StoreKit のトランザクションID、Apple ID、デバイス識別子等は ログ出力しない。 識別子(豆知識ID、ジャンルID)は privacy: .public を明示。

Widget 拡張のロギング

Widget 拡張からのログも同じ subsystem に集約される。Console.app で subsystem == com.happyboy1002.DailyTips でフィルタすると、本体・Widget双方のログが見える。

変更履歴

バージョン日付変更内容
1.02026-05-09初版作成(ソースコードからリバース)