2380d37a9e
FirebaseCrashlytics se llevaba los informes de fallo a Google. Los crashes ya llegan a Xcode Organizer por la vía de Apple, así que el sustituto no tiene que enviar nada: DiagnosticsCollector se suscribe a MXMetricManager, guarda los payloads de crash, cuelgue y escritura en disco como JSON en Application Support/Diagnostics y ahí se quedan. - Sin código de red. Retención de 5 informes, los ficheros se marcan como excluidos de backup (son ayuda de depuración, no datos del usuario). - Arranque: AppDelegate llama a DiagnosticsCollector.shared.start() en lugar de FirebaseApp.configure() + MobileAds.shared.start(). - Ajustes → Acerca de: "Compartir diagnósticos", visible solo cuando hay algo recogido. Compartir es la única forma de que un informe salga del iPhone, y la decide el usuario. Cadenas nuevas en los 7 idiomas. Un recolector que guarda y no enseña sería código muerto, y uno que sube sería el problema de antes con otro nombre; por eso guarda en local y deja el envío como acción explícita. Closes #51 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F1u4K16xy7eQVtgsYNZ9Vn
51 lines
1.7 KiB
Swift
51 lines
1.7 KiB
Swift
import UIKit
|
|
import UserNotifications
|
|
|
|
class AppDelegate: NSObject, UIApplicationDelegate {
|
|
func application(
|
|
_ application: UIApplication,
|
|
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil
|
|
) -> Bool {
|
|
// On-device crash/hang diagnostics. Nothing is uploaded anywhere: reports
|
|
// stay in the app container and Apple's own pipeline is what feeds the
|
|
// Xcode Organizer. See DiagnosticsCollector.
|
|
DiagnosticsCollector.shared.start()
|
|
|
|
// Request notification permissions
|
|
requestNotificationPermissions()
|
|
|
|
// Apple Watch bridge: activating early means the first application
|
|
// context lands before the user raises their wrist.
|
|
Task { @MainActor in
|
|
WatchSyncService.shared.activate()
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
private func requestNotificationPermissions() {
|
|
let center = UNUserNotificationCenter.current()
|
|
center.requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
|
|
if let error = error {
|
|
print("Notification permission error: \(error)")
|
|
}
|
|
print("Notification permission granted: \(granted)")
|
|
}
|
|
}
|
|
|
|
func application(
|
|
_ application: UIApplication,
|
|
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
|
|
) {
|
|
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
|
|
print("Device token: \(token)")
|
|
}
|
|
|
|
func application(
|
|
_ application: UIApplication,
|
|
didFailToRegisterForRemoteNotificationsWithError error: Error
|
|
) {
|
|
print("Failed to register for remote notifications: \(error)")
|
|
}
|
|
}
|