Disable Firebase Analytics for iOS Debug builds - ios

are events from the debug builds included in Firebase Analytics reports by default?
If they're included, how can I disable Firebase Analytics for the iOS debug builds?
Currently I use the following code to configure the Firebase Analytics:
analyticsEnabled = // Fetch whether the analytics should be enabled
FirebaseApp.configure()
// analyticsEnabled = false can be added here for DEBUG builds
updateDataCollectionConfiguration()
}
#objc public static func updateDataCollectionConfiguration() {
Analytics.setAnalyticsCollectionEnabled(analyticsEnabled)
}
I've added a line, where I can force disable analytics for debug builds, but the two questions are still relevant - whether it's needed (is such analytics data even collected for debug builds) and is there any "simpler" way to achieve the same goal, e.g. filter debug-data in the Firebase Console?

Firebase collects data for debug mode also.
You can check for debug mode using :
#ifdef DEBUG
analyticsEnabled = false
updateDataCollectionConfiguration()

Related

Disable iOS OSLog on release build

I want to disable OSLog for my iOS app (release build). I am not using OSLog in my app but I still see some logs in the console app logged by the apple frameworks (like libnetwork, Corefoundation, SystemConfiguration etc.,). Is there is a way to completely turn off all the logs for the app?
I added the below values to the environment variable but still, it disables the logs only when I ran the application from XCode however, I still see OSLog for my app on the console app when I launch it by clicking the App Icon.
OS_ACTIVITY_MODE=disable
Note: My app uses both Objective C and Swift programming language and disabled NSLog(Objective C) and print(Swift) and I do not have an issue with it. I want to disable all the logs including logs from the Apple framework for my release build.
just a quick solution but not the most comfortable..
#ifndef DEBUG
#define OSLog(FORMAT, ...) {}
#endif
if DEBUG mode is not used, which should be RELEASE then, OSLog() will be exchanged with void function content at compile time. Which will apply to code you wrote, not turning off Logs in general outside your sources scope.
To Disable OSLog on Release Builds
You could create a global function like:
func customLogger(_ category: String) -> OSLog {
#if DEBUG
return OSLog(subsystem: Bundle.main.bundleIdentifier!, category: category)
#else
return OSLog.disabled
#endif
}
For more detailed and advanced scenarios please check Apple's official documentation.

Will Firebase Analytics work from the simulator in Xcode?

In an IOS app I have
and I ensured the plist "defeat" entry is not there, and then I have analytics events like
Analytics.logEvent("touchedButton", parameters: nil)
In fact, if I run the app just in the Xcode simulator .. are these events reported to Firebase Analytics and show up?
Or perhaps if you build to an iPhone?
Or does it only work if it's an actual build which has gone through TestFlight?
Surprisingly I couldn't find this info anywhere.
Is it precisely here that such custom events will show:
Yes, both simulator or device will work.
If you haven't already read, read their getting started tutorials, it covers most of it https://firebase.google.com/docs/analytics/ios/start
A couple of points
Make sure when you configure your Firestore settings , you enable analytics
AnalyticsConfiguration.shared().setAnalyticsCollectionEnabled(true)
I do all of this initial settings in AppDelegate
something like
//init Firebase
FirebaseConfiguration.shared.setLoggerLevel(.min)
FirebaseApp.configure()
Fabric.with([Crashlytics.self])
let _ = FirebaseConfig.sharedInstance // This is a custom singelton class where I enable the analytics
In Scheme settings for your target you need to add -FIRAnalyticsDebugEnabled
As you can see I have also a disable option there, sometimes analytics goes crazy and spams the console , so I'd like to disable it with . -FIRDebugDisabled
Analytics clusters your events unless you specify it is a custom event.
For example I use following to tag the viewcontroller names
func logEvent(eventTitle:String , eventContent:String)
{
Analytics.logEvent(AnalyticsEventSelectContent, parameters: [
AnalyticsParameterItemID: "AppName-\(eventTitle)" as NSObject,
AnalyticsParameterItemName: eventTitle as NSObject,
AnalyticsParameterContentType: eventContent as NSObject
])
}
But int the firestore these are clustered under select_content section because I used AnalyticsEventSelectContent key when creating the log.
Under main events screen , select_content my view controlers logged with above function
4.There is a specific DebugView in the FirestoreConsole that works with a device, it updates every 60 seconds as long as settings for -FIRAnalyticsDebugEnabled is true in the scheme.
There is a significant delay in the Event Section of Firestore console, I don't know why this happens, but sometimes there is a delay up to 15 - 30 mins. Havent researched that issue yet, it really doesnt bother me.
Just follow https://firebase.google.com/docs/analytics/ios/start
To enable Analytics Debug mode on your development device, specify the following command line argument in Xcode :
-FIRDebugEnabled
It works perfectly for Simulator and device.
Note: For react-native debugging, launch app from xcode with the selected scheme and not with 'yarn ios', then it works perfectly for Simulator also

Firebase analytics for iOS Today extension(widget extension)

I tried to add firebase analytics in today extension.
So I input the configuration code
if (![FIRApp defaultApp]) {
[FIRApp configure];
}
in today extension's viewDidLoad.
And in the Xcode's Product > scheme > Edit scheme > Run > Arguments tab, I added the '-FIRAnalyticsDebugEnabled' as I want to show the logged event in firebase console's DebugView page. But, Any events didn't printed in the page.
The log added into App (not today extension) is checked in the DebugView in real time. What should I do to show today extension's log in firebase DebugView in real time?
From my experience, you can't use the app argument on the extension. I could add break point in the extension but I could see that the flag didn't have any effect on the extension. Therefore, extensions cannot send data in debug mode for now.
You can do it from code by calling setLoggerLevel method on FirebaseConfiguration singleton and set the logger level.
please see Firebase analytics documentation :
https://firebase.google.com/docs/reference/ios/firebasecore/api/reference/Classes
Enable debug mode by passing the -FIRDebugEnabled argument to the
application. You can add this argument in the application’s Xcode
scheme. When debug mode is enabled via -FIRDebugEnabled, further
executions of the application will also be in debug mode. In order to
return to default mode, you must explicitly disable the debug mode
with the application argument -FIRDebugDisabled.
It is also possible to change the default logging level in code by
calling setLoggerLevel: on the FIRConfiguration interface.

How to stop Firebase from logging status updates when app is launched

Whenever I launch the FireBase app, it logs the status of various Firebase features. Right now this is what is being logged:
Configuring the default app.
<FIRAnalytics/INFO> Firebase Analytics v.3200000 started
<FIRAnalytics/INFO> To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see ...)
<FIRAnalytics/INFO> Successfully created Firebase Analytics App Delegate Proxy automatically. To disable the proxy, set the flag FirebaseAppDelegateProxyEnabled to NO in the Info.plist
<FIRInstanceID/WARNING> FIRInstanceID AppDelegate proxy enabled, will swizzle app delegate remote notification handlers. To disable add "FirebaseAppDelegateProxyEnabled" to your Info.plist and set it to NO
<FIRAnalytics/INFO> Firebase Analytics enabled
I looked through the pods and didn't find any print statements so how else would I go about stopping these from being logged overtime I run the app?
You can disable the debug logging with the flag -FIRDebugDisabled.
You can add it to your scheme:
Select Scheme toolbar
Edit Scheme
Select Run
Click Arguments and add -FIRDebugDisabled
Add FirebaseConfiguration.shared.setLoggerLevel(.min) before FirebaseApp.configure() to achieve the minimum amount of logging.
func setupFirebase() {
FirebaseConfiguration.shared.setLoggerLevel(.min)
FirebaseApp.configure()
}
By default, Firebase will log info, errors, and warnings.
So u can set the logger level for which ever u need.
If you set for .Error you wil get min log only when error accours.
setLoggerLevel before FirebaseApp.configure() as shown below
In Swift 2.3 and Firebase 4
FirebaseConfiguration.sharedInstance().setLoggerLevel(.Error)
FirebaseApp.configure()
In Swift 3 and Firebase 4
FirebaseConfiguration.shared.setLoggerLevel(.min)
FirebaseApp.configure()
In my case to hide the extra chunk of console log from Firebase I did the following:
Navigate to Product -> Scheme -> Edit Scheme.
Under Arguments tab in the Environment Variables section add OS_ACTIVITY_MODE = disable
Just in case you will need that, just simply uncheck the box.
Disabling OS_ACTIVITY_MODE sometimes will disable logs for all exceptions as well
Edit 1: As #jesus-adolfo-rodriguez said, this is related to Xcode. So, if you don’t want OSLog on the Xcode console, put OS_ACTIVITY_MODE Environment variable to “disable” in your scheme.
Edit 2:
FirebaseConfiguration.shared.setLoggerLevel(FirebaseLoggerLevel.min)
FirebaseApp.configure()
More details in the FIRConfiguration implementation here
Edit 3: 2019
According to this issue:
https://github.com/firebase/firebase-ios-sdk/issues/2774#issuecomment-482780714
Adding -FIRDebugDisabled argument and cleaning the project did the trick.
The logging system in Firebase
The logging system has two modes: default mode and debug mode. In
default mode, only logs with log level Notice, Warning and Error will
be sent to device. In debug mode, all logs will be sent to device. The
log levels that Firebase uses are consistent with the ASL log levels.
Enable debug mode by passing the -FIRDebugEnabled argument to the
application. You can add this argument in the application’s Xcode
scheme. When debug mode is enabled via -FIRDebugEnabled, further
executions of the application will also be in debug mode. In order to
return to default mode, you must explicitly disable the debug mode
with the application argument -FIRDebugDisabled.
It is also possible to change the default logging level in code by
calling setLoggerLevel: on the FIRConfiguration interface.
Swift 4 Firebase 4.10
Set logger level in your AppDelegate.swift
FirebaseConfiguration().setLoggerLevel(FirebaseLoggerLevel.min)
Here is full code:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
FirebaseConfiguration().setLoggerLevel(FirebaseLoggerLevel.min)
FirebaseApp.configure()
return true
}
FIRConfiguration.sharedInstance().setLoggerLevel(.min)
FIRApp.configure()
In Swift 4
By default Firebase Analytics will only log 4 INFO lines in production + errors/warnings. That should be very little output if things work correctly. Adding -noFIRAnalyticsDebugEnabled will only disable DEBUG level logs and ERROR/WARN are always logged. If you see any warnings or errors you probably need to do something to resolve the cause. Some things will likely not work correctly if warnings/errors are logged. App that is correctly setup should not log errors/warnings.
Messages tagged with FIRInstanceID/* are logged by Firebase Notification and errors/warnings are always logged.
I think there is a big and a very important confusion going on.
By using -FIRDebugDisabled it will disable debug mode which then your measurements will be affected during testing and development.
Currently there is no way to enable debug mode and disable logs at the same time. So the FirebaseConfiguration.shared.setLoggerLevel(.min) will work basically on not debug mode only.
As workaround you can use -noFIRAnalyticsDebugEnabled which is only for Xcode console logging, this one does not disable your debug mode.
As djabi said, you cannot disable those logs if they are INFO, WARNING or ERROR.
I want to add to Nitin Gohel's answer since I can't comment: The flag FirebaseAppDelegateProxyEnabled is not for disabling logs. If you turn it off, you will lose the auto campaign tracking and you will need to add the methods from FIRAnalytics(AppDelegate) to handle URL and user activity yourself.
To add to Alex' answer, from https://firebase.google.com/docs/cloud-messaging/ios/client
FirebaseAppDelegateProxyEnabled is for swizzling your app delegate 's methods
The FCM API performs method swizzling in two key areas: mapping your APNs token to the FCM registration token and capturing analytics data during downstream message callback handling. Developers who prefer not to use swizzling can disable it by adding the flag FirebaseAppDelegateProxyEnabled in the app’s Info.plist file and setting it to NO (boolean value). Relevant areas of the guides provide code examples, both with and without method swizzling enabled.
If you want the clean and necessary logs in console, just set your scheme like this. Open the "Edit Scheme" and select "Arguments".
-FIRAnalyticsDebugEnabled (don't forget "-")
OS_ACTIVITY_MODE = disable

Disable Parse Analytics during development

How do I disable Parse Analytics during development. I tried commenting out the setApplicationId: clientKey: call but as there are events being tracked throughout my code this causes an exception.
Parse doesn't have a native functionality for disabling analytics during development, but you can wrap your events code using an #ifdef - #else - #endif statement
#ifdef DEBUG
#else
[PFAnalytics trackEvent:#"eventName" dimensions:#{ #"parameter": #"value" }];
#endif
As long as you are running with DEBUG enabled (dev environments), this event tracker will not run.
You may also need to check the settings for your build to ensure it is DEBUG mode. See this answer for help:
Xcode / iOS: How to determine whether code is running in DEBUG / RELEASE build?

Resources