Problema
Incluir o agente iOS da New Relic e certos SDKs do Firebase no mesmo aplicativo pode causar conflitos devido à sobreposição de instrumentação. Os SDKs do Firebase afetados são:
- FirebasePerformance — faz swizzling em
NSURLSessionpara monitoramento de rede e em métodos de ciclo de vida deUIViewControllerpara rastreamentos de tela, sobrepondo-se diretamente à instrumentação automática da New Relic. - FirebaseCrashlytics — instala seu próprio manipulador de exceções não tratadas e manipuladores de sinais (SIGABRT, SIGSEGV, etc.), que podem sobrescrever ou ser sobrescritos pelo relator de falhas da New Relic, dependendo da ordem de inicialização.
Sintomas conhecidos incluem:
- Falhas em funções autoinstrumentadas causadas por method swizzling conflitante de
NSURLSessionouUIViewController. - Relatórios de falhas ausentes ou incompletos em uma ou ambas as ferramentas, pois apenas um manipulador de exceções pode estar ativo por vez.
- Eventos de rede duplicados aparecendo nos consoles do New Relic ou Firebase.
Solução
Preferencial: Remova componentes conflitantes do Firebase
Se você precisa apenas de relatórios de falhas e monitoramento de rede de uma única fonte, a solução mais limpa é remover os pods do Firebase conflitantes:
- Remova
FirebasePerformancepara eliminar conflitos de swizzling deNSURLSessioneUIViewController. - Remova
FirebaseCrashlyticspara eliminar conflitos de manipuladores de exceção e sinal.
Se você estiver usando o Firebase para analytics ou outros recursos (por exemplo, FirebaseAnalytics, FirebaseAuth, FirebaseFirestore), esses pods não entram em conflito com o agente New Relic e podem permanecer.
Alternativa: Desativar recursos sobrepostos
Se remover os componentes do Firebase não for uma opção, desative explicitamente a instrumentação sobreposta:
Desativar a instrumentação automática do Firebase Performance:
// In your AppDelegate, before FirebaseApp.configure()Performance.sharedInstance().isInstrumentationEnabled = falseCrashlytics.crashlytics().setCrashlyticsCollectionEnabled(false)Desative os recursos do New Relic que se sobrepõem ao Crashlytics:
Consulte o guia de configuração do New Relic iOS SDK para flags como NRFeatureFlag_CrashReporting e NRFeatureFlag_NSURLSessionInstrumentation.
Ordem de inicialização
Se ambos os SDKs permanecerem ativos, inicialize o agente New Relic o mais cedo possível — como a primeira chamada em application(_:didFinishLaunchingWithOptions:) — antes de FirebaseApp.configure(). Isso garante que os manipuladores de exceção e sinal da New Relic sejam registrados primeiro, embora o Crashlytics ainda possa sobrescrevê-los via métodos +load que são executados antes do código do seu aplicativo.
Se precisar de ajuda adicional, obtenha suporte em support.newrelic.com.