Archived
Push from command line
This commit is contained in:
+674
@@ -0,0 +1,674 @@
|
||||
/*
|
||||
* Copyright 2019 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <objc/runtime.h>
|
||||
#include <sys/utsname.h>
|
||||
|
||||
#import <GoogleDataTransport/GDTConsoleLogger.h>
|
||||
#import <GoogleDataTransport/GDTEvent.h>
|
||||
#import <GoogleDataTransport/GDTTargets.h>
|
||||
#import <GoogleDataTransport/GDTTransport.h>
|
||||
|
||||
#import <GoogleUtilities/GULAppEnvironmentUtil.h>
|
||||
#import <GoogleUtilities/GULLogger.h>
|
||||
|
||||
#import <FirebaseCoreDiagnosticsInterop/FIRCoreDiagnosticsData.h>
|
||||
#import <FirebaseCoreDiagnosticsInterop/FIRCoreDiagnosticsInterop.h>
|
||||
|
||||
#import <nanopb/pb.h>
|
||||
#import <nanopb/pb_decode.h>
|
||||
#import <nanopb/pb_encode.h>
|
||||
|
||||
#import "FIRCDLibrary/Protogen/nanopb/firebasecore.nanopb.h"
|
||||
|
||||
#import "FIRCDLibrary/FIRCoreDiagnosticsDateFileStorage.h"
|
||||
|
||||
/** The logger service string to use when printing to the console. */
|
||||
static GULLoggerService kFIRCoreDiagnostics = @"[FirebaseCoreDiagnostics/FIRCoreDiagnostics]";
|
||||
|
||||
#ifdef FIREBASE_BUILD_ZIP_FILE
|
||||
static BOOL kUsingZipFile = YES;
|
||||
#else // FIREBASE_BUILD_ZIP_FILE
|
||||
static BOOL kUsingZipFile = NO;
|
||||
#endif // FIREBASE_BUILD_ZIP_FILE
|
||||
|
||||
#ifdef FIREBASE_BUILD_CARTHAGE
|
||||
#define kDeploymentType logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_CARTHAGE
|
||||
#elif FIREBASE_BUILD_ZIP_FILE
|
||||
#define kDeploymentType logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_ZIP_FILE
|
||||
#else
|
||||
#define kDeploymentType logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_COCOAPODS
|
||||
#endif
|
||||
|
||||
static NSString *const kFIRServiceMLVisionOnDeviceAutoML = @"MLVisionOnDeviceAutoML";
|
||||
static NSString *const kFIRServiceMLVisionOnDeviceFace = @"MLVisionOnDeviceFace";
|
||||
static NSString *const kFIRServiceMLVisionOnDeviceBarcode = @"MLVisionOnDeviceBarcode";
|
||||
static NSString *const kFIRServiceMLVisionOnDeviceText = @"MLVisionOnDeviceText";
|
||||
static NSString *const kFIRServiceMLVisionOnDeviceLabel = @"MLVisionOnDeviceLabel";
|
||||
static NSString *const kFIRServiceMLVisionOnDeviceObjectDetection =
|
||||
@"MLVisionOnDeviceObjectDetection";
|
||||
static NSString *const kFIRServiceMLModelInterpreter = @"MLModelInterpreter";
|
||||
|
||||
static NSString *const kFIRServiceAdMob = @"AdMob";
|
||||
static NSString *const kFIRServiceAuth = @"Auth";
|
||||
static NSString *const kFIRServiceAuthUI = @"AuthUI";
|
||||
static NSString *const kFIRServiceCrash = @"Crash";
|
||||
static NSString *const kFIRServiceDatabase = @"Database";
|
||||
static NSString *const kFIRServiceDynamicLinks = @"DynamicLinks";
|
||||
static NSString *const kFIRServiceFirestore = @"Firestore";
|
||||
static NSString *const kFIRServiceFunctions = @"Functions";
|
||||
static NSString *const kFIRServiceIAM = @"InAppMessaging";
|
||||
static NSString *const kFIRServiceInstanceID = @"InstanceID";
|
||||
static NSString *const kFIRServiceInvites = @"Invites";
|
||||
static NSString *const kFIRServiceMessaging = @"Messaging";
|
||||
static NSString *const kFIRServiceMeasurement = @"Measurement";
|
||||
static NSString *const kFIRServicePerformance = @"Performance";
|
||||
static NSString *const kFIRServiceRemoteConfig = @"RemoteConfig";
|
||||
static NSString *const kFIRServiceStorage = @"Storage";
|
||||
static NSString *const kGGLServiceAnalytics = @"Analytics";
|
||||
static NSString *const kGGLServiceSignIn = @"SignIn";
|
||||
static NSString *const kFIRAppDiagnosticsConfigurationTypeKey =
|
||||
@"FIRAppDiagnosticsConfigurationTypeKey";
|
||||
static NSString *const kFIRAppDiagnosticsFIRAppKey = @"FIRAppDiagnosticsFIRAppKey";
|
||||
static NSString *const kFIRAppDiagnosticsSDKNameKey = @"FIRAppDiagnosticsSDKNameKey";
|
||||
static NSString *const kFIRAppDiagnosticsSDKVersionKey = @"FIRAppDiagnosticsSDKVersionKey";
|
||||
|
||||
/**
|
||||
* The file name to the recent heartbeat date.
|
||||
*/
|
||||
NSString *const kFIRCoreDiagnosticsHeartbeatDateFileName = @"FIREBASE_DIAGNOSTICS_HEARTBEAT_DATE";
|
||||
|
||||
/**
|
||||
* @note This should implement the GDTEventDataObject protocol, but can't because of weak-linking.
|
||||
*/
|
||||
@interface FIRCoreDiagnosticsLog : NSObject
|
||||
|
||||
/** The config that will be converted to proto bytes. */
|
||||
@property(nonatomic) logs_proto_mobilesdk_ios_ICoreConfiguration config;
|
||||
|
||||
@end
|
||||
|
||||
@implementation FIRCoreDiagnosticsLog
|
||||
|
||||
- (instancetype)initWithConfig:(logs_proto_mobilesdk_ios_ICoreConfiguration)config {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_config = config;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
// Provided and required by the GDTEventDataObject protocol.
|
||||
- (NSData *)transportBytes {
|
||||
pb_ostream_t sizestream = PB_OSTREAM_SIZING;
|
||||
|
||||
// Encode 1 time to determine the size.
|
||||
if (!pb_encode(&sizestream, logs_proto_mobilesdk_ios_ICoreConfiguration_fields, &_config)) {
|
||||
GDTLogError(GDTMCETransportBytesError, @"Error in nanopb encoding for size: %s",
|
||||
PB_GET_ERROR(&sizestream));
|
||||
}
|
||||
|
||||
// Encode a 2nd time to actually get the bytes from it.
|
||||
size_t bufferSize = sizestream.bytes_written;
|
||||
CFMutableDataRef dataRef = CFDataCreateMutable(CFAllocatorGetDefault(), bufferSize);
|
||||
pb_ostream_t ostream = pb_ostream_from_buffer((void *)CFDataGetBytePtr(dataRef), bufferSize);
|
||||
if (!pb_encode(&ostream, logs_proto_mobilesdk_ios_ICoreConfiguration_fields, &_config)) {
|
||||
GDTLogError(GDTMCETransportBytesError, @"Error in nanopb encoding for bytes: %s",
|
||||
PB_GET_ERROR(&ostream));
|
||||
}
|
||||
CFDataSetLength(dataRef, ostream.bytes_written);
|
||||
|
||||
return CFBridgingRelease(dataRef);
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
pb_release(logs_proto_mobilesdk_ios_ICoreConfiguration_fields, &_config);
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/** This class produces a protobuf containing diagnostics and usage data to be logged. */
|
||||
@interface FIRCoreDiagnostics : NSObject <FIRCoreDiagnosticsInterop>
|
||||
|
||||
/** The queue on which all diagnostics collection will occur. */
|
||||
@property(nonatomic, readonly) dispatch_queue_t diagnosticsQueue;
|
||||
|
||||
/** The transport object used to send data. */
|
||||
@property(nonatomic, readonly) GDTTransport *transport;
|
||||
|
||||
/** The storage to store the date of the last sent heartbeat. */
|
||||
@property(nonatomic, readonly) FIRCoreDiagnosticsDateFileStorage *heartbeatDateStorage;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
@implementation FIRCoreDiagnostics
|
||||
|
||||
+ (instancetype)sharedInstance {
|
||||
static FIRCoreDiagnostics *sharedInstance;
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
sharedInstance = [[FIRCoreDiagnostics alloc] init];
|
||||
});
|
||||
return sharedInstance;
|
||||
}
|
||||
|
||||
- (instancetype)init {
|
||||
GDTTransport *transport = [[GDTTransport alloc] initWithMappingID:@"137"
|
||||
transformers:nil
|
||||
target:kGDTTargetCCT];
|
||||
|
||||
FIRCoreDiagnosticsDateFileStorage *dateStorage = [[FIRCoreDiagnosticsDateFileStorage alloc]
|
||||
initWithFileURL:[[self class] filePathURLWithName:kFIRCoreDiagnosticsHeartbeatDateFileName]];
|
||||
|
||||
return [self initWithTransport:transport heartbeatDateStorage:dateStorage];
|
||||
}
|
||||
|
||||
/** Initializer for unit tests.
|
||||
*
|
||||
* @param transport A `GDTTransport` instance which that be used to send event.
|
||||
* @param heartbeatDateStorage An instanse of date storage to track heartbeat sending.
|
||||
* @return Returns the initialized `FIRCoreDiagnostics` instance.
|
||||
*/
|
||||
- (instancetype)initWithTransport:(GDTTransport *)transport
|
||||
heartbeatDateStorage:(FIRCoreDiagnosticsDateFileStorage *)heartbeatDateStorage {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_diagnosticsQueue =
|
||||
dispatch_queue_create("com.google.FIRCoreDiagnostics", DISPATCH_QUEUE_SERIAL);
|
||||
_transport = transport;
|
||||
_heartbeatDateStorage = heartbeatDateStorage;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
#pragma mark - File path helpers
|
||||
|
||||
/** Returns the URL path of the file with name fileName under the Application Support folder for
|
||||
* local logging. Creates the Application Support folder if the folder doesn't exist.
|
||||
*
|
||||
* @return the URL path of the file with the name fileName in Application Support.
|
||||
*/
|
||||
+ (NSURL *)filePathURLWithName:(NSString *)fileName {
|
||||
@synchronized(self) {
|
||||
NSArray<NSString *> *paths =
|
||||
NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);
|
||||
NSArray<NSString *> *components = @[ paths.lastObject, @"Google/FIRApp" ];
|
||||
NSString *directoryString = [NSString pathWithComponents:components];
|
||||
NSURL *directoryURL = [NSURL fileURLWithPath:directoryString];
|
||||
|
||||
NSError *error;
|
||||
if (![directoryURL checkResourceIsReachableAndReturnError:&error]) {
|
||||
// If fail creating the Application Support directory, return nil.
|
||||
if (![[NSFileManager defaultManager] createDirectoryAtURL:directoryURL
|
||||
withIntermediateDirectories:YES
|
||||
attributes:nil
|
||||
error:&error]) {
|
||||
GULLogWarning(kFIRCoreDiagnostics, YES, @"I-COR100001",
|
||||
@"Unable to create internal state storage: %@", error);
|
||||
return nil;
|
||||
}
|
||||
}
|
||||
return [directoryURL URLByAppendingPathComponent:fileName];
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - Metadata helpers
|
||||
|
||||
/** Returns the model of iOS device. Sample platform strings are @"iPhone7,1" for iPhone 6 Plus,
|
||||
* @"iPhone7,2" for iPhone 6, etc. Refer to the Hardware strings at
|
||||
* https://en.wikipedia.org/wiki/List_of_iOS_devices
|
||||
*
|
||||
* @return The device model as an NSString.
|
||||
*/
|
||||
+ (NSString *)deviceModel {
|
||||
static NSString *deviceModel = nil;
|
||||
if (deviceModel == nil) {
|
||||
struct utsname systemInfo;
|
||||
uname(&systemInfo);
|
||||
deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
|
||||
}
|
||||
return deviceModel;
|
||||
}
|
||||
|
||||
#pragma mark - nanopb helper functions
|
||||
|
||||
/** Mallocs a pb_bytes_array and copies the given NSString's bytes into the bytes array.
|
||||
*
|
||||
* @note Memory needs to be free manually, through pb_free or pb_release.
|
||||
* @param string The string to encode as pb_bytes.
|
||||
*/
|
||||
pb_bytes_array_t *FIREncodeString(NSString *string) {
|
||||
NSData *stringBytes = [string dataUsingEncoding:NSUTF8StringEncoding];
|
||||
return FIREncodeData(stringBytes);
|
||||
}
|
||||
|
||||
/** Mallocs a pb_bytes_array and copies the given NSData bytes into the bytes array.
|
||||
*
|
||||
* @note Memory needs to be free manually, through pb_free or pb_release.
|
||||
* @param data The data to copy into the new bytes array.
|
||||
*/
|
||||
pb_bytes_array_t *FIREncodeData(NSData *data) {
|
||||
pb_bytes_array_t *pbBytes = malloc(PB_BYTES_ARRAY_T_ALLOCSIZE(data.length));
|
||||
memcpy(pbBytes->bytes, [data bytes], data.length);
|
||||
pbBytes->size = (pb_size_t)data.length;
|
||||
return pbBytes;
|
||||
}
|
||||
|
||||
/** Maps a service string to the representative nanopb enum.
|
||||
*
|
||||
* @param serviceString The SDK service string to convert.
|
||||
* @return The representative nanopb enum.
|
||||
*/
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType FIRMapFromServiceStringToTypeEnum(
|
||||
NSString *serviceString) {
|
||||
static NSDictionary<NSString *, NSNumber *> *serviceStringToTypeEnum;
|
||||
if (serviceStringToTypeEnum == nil) {
|
||||
serviceStringToTypeEnum = @{
|
||||
kFIRServiceAdMob : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ADMOB),
|
||||
kFIRServiceMessaging : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MESSAGING),
|
||||
kFIRServiceMeasurement :
|
||||
@(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MEASUREMENT),
|
||||
kFIRServiceRemoteConfig :
|
||||
@(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_REMOTE_CONFIG),
|
||||
kFIRServiceDatabase : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_DATABASE),
|
||||
kFIRServiceDynamicLinks :
|
||||
@(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_DYNAMIC_LINKS),
|
||||
kFIRServiceAuth : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_AUTH),
|
||||
kFIRServiceAuthUI : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_AUTH_UI),
|
||||
kFIRServiceFirestore : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_FIRESTORE),
|
||||
kFIRServiceFunctions : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_FUNCTIONS),
|
||||
kFIRServicePerformance :
|
||||
@(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_PERFORMANCE),
|
||||
kFIRServiceStorage : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_STORAGE),
|
||||
kFIRServiceMLVisionOnDeviceAutoML :
|
||||
@(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_AUTOML),
|
||||
kFIRServiceMLVisionOnDeviceFace :
|
||||
@(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_FACE),
|
||||
kFIRServiceMLVisionOnDeviceBarcode :
|
||||
@(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_BARCODE),
|
||||
kFIRServiceMLVisionOnDeviceText :
|
||||
@(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_TEXT),
|
||||
kFIRServiceMLVisionOnDeviceLabel :
|
||||
@(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_LABEL),
|
||||
kFIRServiceMLVisionOnDeviceObjectDetection : @(
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_OBJECT_DETECTION),
|
||||
kFIRServiceMLModelInterpreter :
|
||||
@(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_MODEL_INTERPRETER),
|
||||
kGGLServiceAnalytics : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ANALYTICS),
|
||||
kGGLServiceSignIn : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_SIGN_IN),
|
||||
kFIRServiceIAM : @(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_IN_APP_MESSAGING),
|
||||
};
|
||||
}
|
||||
if (serviceStringToTypeEnum[serviceString] != nil) {
|
||||
return (int32_t)serviceStringToTypeEnum[serviceString].longLongValue;
|
||||
}
|
||||
return logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_UNKNOWN_SDK_SERVICE;
|
||||
}
|
||||
|
||||
#pragma mark - Proto population functions
|
||||
|
||||
/** Populates the given proto with data related to an SDK logDiagnostics call from the
|
||||
* diagnosticObjects dictionary.
|
||||
*
|
||||
* @param config The proto to populate
|
||||
* @param diagnosticObjects The dictionary of diagnostics objects.
|
||||
*/
|
||||
void FIRPopulateProtoWithInfoFromUserInfoParams(logs_proto_mobilesdk_ios_ICoreConfiguration *config,
|
||||
NSDictionary<NSString *, id> *diagnosticObjects) {
|
||||
NSNumber *configurationType = diagnosticObjects[kFIRCDConfigurationTypeKey];
|
||||
if (configurationType != nil) {
|
||||
switch (configurationType.integerValue) {
|
||||
case logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_CORE:
|
||||
config->configuration_type =
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_CORE;
|
||||
config->has_configuration_type = 1;
|
||||
break;
|
||||
case logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_SDK:
|
||||
config->configuration_type =
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_SDK;
|
||||
config->has_configuration_type = 1;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
NSString *sdkName = diagnosticObjects[kFIRCDSdkNameKey];
|
||||
if (sdkName) {
|
||||
config->sdk_name = FIRMapFromServiceStringToTypeEnum(sdkName);
|
||||
config->has_sdk_name = 1;
|
||||
}
|
||||
|
||||
NSString *version = diagnosticObjects[kFIRCDSdkVersionKey];
|
||||
if (version) {
|
||||
config->sdk_version = FIREncodeString(version);
|
||||
}
|
||||
}
|
||||
|
||||
/** Populates the given proto with data from the calling FIRApp using the given
|
||||
* diagnosticObjects dictionary.
|
||||
*
|
||||
* @param config The proto to populate
|
||||
* @param diagnosticObjects The dictionary of diagnostics objects.
|
||||
*/
|
||||
void FIRPopulateProtoWithCommonInfoFromApp(logs_proto_mobilesdk_ios_ICoreConfiguration *config,
|
||||
NSDictionary<NSString *, id> *diagnosticObjects) {
|
||||
config->pod_name = logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_FIREBASE;
|
||||
config->has_pod_name = 1;
|
||||
|
||||
if (!diagnosticObjects[kFIRCDllAppsCountKey]) {
|
||||
GDTLogError(GDTMCEGeneralError, @"%@", @"App count is a required value in the data dict.");
|
||||
}
|
||||
config->app_count = (int32_t)[diagnosticObjects[kFIRCDllAppsCountKey] integerValue];
|
||||
config->has_app_count = 1;
|
||||
|
||||
NSString *googleAppID = diagnosticObjects[kFIRCDGoogleAppIDKey];
|
||||
if (googleAppID.length) {
|
||||
config->app_id = FIREncodeString(googleAppID);
|
||||
}
|
||||
|
||||
NSString *bundleID = diagnosticObjects[kFIRCDBundleIDKey];
|
||||
if (bundleID.length) {
|
||||
config->bundle_id = FIREncodeString(bundleID);
|
||||
}
|
||||
|
||||
NSString *firebaseUserAgent = diagnosticObjects[kFIRCDFirebaseUserAgentKey];
|
||||
if (firebaseUserAgent.length) {
|
||||
config->platform_info = FIREncodeString(firebaseUserAgent);
|
||||
}
|
||||
|
||||
NSNumber *usingOptionsFromDefaultPlist = diagnosticObjects[kFIRCDUsingOptionsFromDefaultPlistKey];
|
||||
if (usingOptionsFromDefaultPlist != nil) {
|
||||
config->use_default_app = [usingOptionsFromDefaultPlist boolValue];
|
||||
config->has_use_default_app = 1;
|
||||
}
|
||||
|
||||
NSString *libraryVersionID = diagnosticObjects[kFIRCDLibraryVersionIDKey];
|
||||
if (libraryVersionID) {
|
||||
config->icore_version = FIREncodeString(libraryVersionID);
|
||||
}
|
||||
|
||||
NSString *deviceModel = [FIRCoreDiagnostics deviceModel];
|
||||
if (deviceModel.length) {
|
||||
config->device_model = FIREncodeString(deviceModel);
|
||||
}
|
||||
|
||||
NSString *osVersion = [GULAppEnvironmentUtil systemVersion];
|
||||
if (osVersion.length) {
|
||||
config->os_version = FIREncodeString(osVersion);
|
||||
}
|
||||
|
||||
config->using_zip_file = kUsingZipFile;
|
||||
config->has_using_zip_file = 1;
|
||||
config->deployment_type = kDeploymentType;
|
||||
config->has_deployment_type = 1;
|
||||
config->deployed_in_app_store = [GULAppEnvironmentUtil isFromAppStore];
|
||||
config->has_deployed_in_app_store = 1;
|
||||
}
|
||||
|
||||
/** Populates the given proto with installed services data.
|
||||
*
|
||||
* @param config The proto to populate
|
||||
*/
|
||||
void FIRPopulateProtoWithInstalledServices(logs_proto_mobilesdk_ios_ICoreConfiguration *config) {
|
||||
NSMutableArray<NSNumber *> *sdkServiceInstalledArray = [NSMutableArray array];
|
||||
|
||||
// AdMob
|
||||
if (NSClassFromString(@"GADBannerView") != nil) {
|
||||
[sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceAdMob))];
|
||||
}
|
||||
// CloudMessaging
|
||||
if (NSClassFromString(@"FIRMessaging") != nil) {
|
||||
[sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMessaging))];
|
||||
}
|
||||
// RemoteConfig
|
||||
if (NSClassFromString(@"FIRRemoteConfig") != nil) {
|
||||
[sdkServiceInstalledArray
|
||||
addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceRemoteConfig))];
|
||||
}
|
||||
// Measurement/Analtyics
|
||||
if (NSClassFromString(@"FIRAnalytics") != nil) {
|
||||
[sdkServiceInstalledArray
|
||||
addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMeasurement))];
|
||||
}
|
||||
// ML Vision On Device AutoML.
|
||||
if (NSClassFromString(@"FIRVisionOnDeviceAutoMLImageLabelerOptions") != nil) {
|
||||
[sdkServiceInstalledArray
|
||||
addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceAutoML))];
|
||||
}
|
||||
// ML Vision On Device Face.
|
||||
if (NSClassFromString(@"FIRVisionFaceDetector") != nil &&
|
||||
NSClassFromString(@"GMVFaceDetector") != nil) {
|
||||
[sdkServiceInstalledArray
|
||||
addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceFace))];
|
||||
}
|
||||
// ML Vision On Device Barcode.
|
||||
if (NSClassFromString(@"FIRVisionBarcodeDetector") != nil &&
|
||||
NSClassFromString(@"GMVBarcodeDetector") != nil) {
|
||||
[sdkServiceInstalledArray
|
||||
addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceBarcode))];
|
||||
}
|
||||
// ML Vision On Device Text.
|
||||
if (NSClassFromString(@"FIRVisionTextDetector") != nil &&
|
||||
NSClassFromString(@"GMVTextDetector") != nil) {
|
||||
[sdkServiceInstalledArray
|
||||
addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceText))];
|
||||
}
|
||||
// ML Vision On Device Image Label.
|
||||
if (NSClassFromString(@"FIRVisionLabelDetector") != nil &&
|
||||
NSClassFromString(@"GMVLabelDetector") != nil) {
|
||||
[sdkServiceInstalledArray
|
||||
addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceLabel))];
|
||||
}
|
||||
// ML Vision On Device Object.
|
||||
if (NSClassFromString(@"FIRVisionObjectDetector") != nil) {
|
||||
[sdkServiceInstalledArray
|
||||
addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLVisionOnDeviceObjectDetection))];
|
||||
}
|
||||
// ML Model Interpreter
|
||||
if (NSClassFromString(@"FIRCustomModelInterpreter") != nil) {
|
||||
[sdkServiceInstalledArray
|
||||
addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceMLModelInterpreter))];
|
||||
}
|
||||
// Database
|
||||
if (NSClassFromString(@"FIRDatabase") != nil) {
|
||||
[sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceDatabase))];
|
||||
}
|
||||
// DynamicDeepLink
|
||||
if (NSClassFromString(@"FIRDynamicLinks") != nil) {
|
||||
[sdkServiceInstalledArray
|
||||
addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceDynamicLinks))];
|
||||
}
|
||||
// Auth
|
||||
if (NSClassFromString(@"FIRAuth") != nil) {
|
||||
[sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceAuth))];
|
||||
}
|
||||
// AuthUI
|
||||
if (NSClassFromString(@"FUIAuth") != nil) {
|
||||
[sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceAuthUI))];
|
||||
}
|
||||
// Firestore
|
||||
if (NSClassFromString(@"FIRFirestore") != nil) {
|
||||
[sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceFirestore))];
|
||||
}
|
||||
// Functions
|
||||
if (NSClassFromString(@"FIRFunctions") != nil) {
|
||||
[sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceFunctions))];
|
||||
}
|
||||
// Performance
|
||||
if (NSClassFromString(@"FIRPerformance") != nil) {
|
||||
[sdkServiceInstalledArray
|
||||
addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServicePerformance))];
|
||||
}
|
||||
// Storage
|
||||
if (NSClassFromString(@"FIRStorage") != nil) {
|
||||
[sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceStorage))];
|
||||
}
|
||||
// SignIn via Google pod
|
||||
if (NSClassFromString(@"GIDSignIn") != nil && NSClassFromString(@"GGLContext") != nil) {
|
||||
[sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kGGLServiceSignIn))];
|
||||
}
|
||||
// Analytics via Google pod
|
||||
if (NSClassFromString(@"GAI") != nil && NSClassFromString(@"GGLContext") != nil) {
|
||||
[sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kGGLServiceAnalytics))];
|
||||
}
|
||||
|
||||
// In-App Messaging
|
||||
if (NSClassFromString(@"FIRInAppMessaging") != nil) {
|
||||
[sdkServiceInstalledArray addObject:@(FIRMapFromServiceStringToTypeEnum(kFIRServiceIAM))];
|
||||
}
|
||||
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType *servicesInstalled =
|
||||
malloc(sizeof(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType) *
|
||||
sdkServiceInstalledArray.count);
|
||||
for (NSUInteger i = 0; i < sdkServiceInstalledArray.count; i++) {
|
||||
NSNumber *typeEnum = sdkServiceInstalledArray[i];
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType serviceType =
|
||||
(int32_t)typeEnum.integerValue;
|
||||
servicesInstalled[i] = serviceType;
|
||||
}
|
||||
|
||||
config->sdk_service_installed = servicesInstalled;
|
||||
config->sdk_service_installed_count = (int32_t)sdkServiceInstalledArray.count;
|
||||
}
|
||||
|
||||
/** Populates the proto with the number of linked frameworks.
|
||||
*
|
||||
* @param config The proto to populate.
|
||||
*/
|
||||
void FIRPopulateProtoWithNumberOfLinkedFrameworks(
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration *config) {
|
||||
int numFrameworks = -1; // Subtract the app binary itself.
|
||||
unsigned int numImages;
|
||||
const char **imageNames = objc_copyImageNames(&numImages);
|
||||
for (unsigned int i = 0; i < numImages; i++) {
|
||||
NSString *imageName = [NSString stringWithUTF8String:imageNames[i]];
|
||||
if ([imageName rangeOfString:@"System/Library"].length != 0 // Apple .frameworks
|
||||
|| [imageName rangeOfString:@"Developer/Library"].length != 0 // Xcode debug .frameworks
|
||||
|| [imageName rangeOfString:@"usr/lib"].length != 0) { // Public .dylibs
|
||||
continue;
|
||||
}
|
||||
numFrameworks++;
|
||||
}
|
||||
free(imageNames);
|
||||
config->dynamic_framework_count = numFrameworks;
|
||||
config->has_dynamic_framework_count = 1;
|
||||
}
|
||||
|
||||
/** Populates the proto with Info.plist values.
|
||||
*
|
||||
* @param config The proto to populate.
|
||||
*/
|
||||
void FIRPopulateProtoWithInfoPlistValues(logs_proto_mobilesdk_ios_ICoreConfiguration *config) {
|
||||
NSDictionary<NSString *, id> *info = [[NSBundle mainBundle] infoDictionary];
|
||||
|
||||
NSString *xcodeVersion = info[@"DTXcodeBuild"] ?: @"";
|
||||
NSString *sdkVersion = info[@"DTSDKBuild"] ?: @"";
|
||||
NSString *combinedVersions = [NSString stringWithFormat:@"%@-%@", xcodeVersion, sdkVersion];
|
||||
config->apple_framework_version = FIREncodeString(combinedVersions);
|
||||
|
||||
NSString *minVersion = info[@"MinimumOSVersion"];
|
||||
if (minVersion) {
|
||||
config->min_supported_ios_version = FIREncodeString(minVersion);
|
||||
}
|
||||
|
||||
// Apps can turn off swizzling in the Info.plist, check if they've explicitly set the value and
|
||||
// report it. It's enabled by default.
|
||||
NSNumber *appDelegateSwizzledNum = info[@"FirebaseAppDelegateProxyEnabled"];
|
||||
BOOL appDelegateSwizzled = YES;
|
||||
if ([appDelegateSwizzledNum isKindOfClass:[NSNumber class]]) {
|
||||
appDelegateSwizzled = [appDelegateSwizzledNum boolValue];
|
||||
}
|
||||
config->swizzling_enabled = appDelegateSwizzled;
|
||||
config->has_swizzling_enabled = 1;
|
||||
}
|
||||
|
||||
#pragma mark - FIRCoreDiagnosticsInterop
|
||||
|
||||
+ (void)sendDiagnosticsData:(nonnull id<FIRCoreDiagnosticsData>)diagnosticsData {
|
||||
FIRCoreDiagnostics *diagnostics = [FIRCoreDiagnostics sharedInstance];
|
||||
[diagnostics sendDiagnosticsData:diagnosticsData];
|
||||
}
|
||||
|
||||
- (void)sendDiagnosticsData:(nonnull id<FIRCoreDiagnosticsData>)diagnosticsData {
|
||||
dispatch_async(self.diagnosticsQueue, ^{
|
||||
NSDictionary<NSString *, id> *diagnosticObjects = diagnosticsData.diagnosticObjects;
|
||||
NSNumber *isDataCollectionDefaultEnabled =
|
||||
diagnosticObjects[kFIRCDIsDataCollectionDefaultEnabledKey];
|
||||
if (isDataCollectionDefaultEnabled && ![isDataCollectionDefaultEnabled boolValue]) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Create the proto.
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration icore_config =
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_init_default;
|
||||
|
||||
icore_config.using_gdt = 1;
|
||||
icore_config.has_using_gdt = 1;
|
||||
|
||||
// Populate the proto with information.
|
||||
FIRPopulateProtoWithInfoFromUserInfoParams(&icore_config, diagnosticObjects);
|
||||
FIRPopulateProtoWithCommonInfoFromApp(&icore_config, diagnosticObjects);
|
||||
FIRPopulateProtoWithInstalledServices(&icore_config);
|
||||
FIRPopulateProtoWithNumberOfLinkedFrameworks(&icore_config);
|
||||
FIRPopulateProtoWithInfoPlistValues(&icore_config);
|
||||
[self setHeartbeatFlagIfNeededToConfig:&icore_config];
|
||||
|
||||
// This log object is capable of converting the proto to bytes.
|
||||
FIRCoreDiagnosticsLog *log = [[FIRCoreDiagnosticsLog alloc] initWithConfig:icore_config];
|
||||
|
||||
// Send the log as a telemetry event.
|
||||
GDTEvent *event = [self.transport eventForTransport];
|
||||
event.dataObject = (id<GDTEventDataObject>)log;
|
||||
[self.transport sendTelemetryEvent:event];
|
||||
});
|
||||
}
|
||||
|
||||
#pragma mark - Heartbeat
|
||||
|
||||
- (void)setHeartbeatFlagIfNeededToConfig:(logs_proto_mobilesdk_ios_ICoreConfiguration *)config {
|
||||
// Check if need to send a heartbeat.
|
||||
NSDate *currentDate = [NSDate date];
|
||||
NSDate *lastCheckin = [self.heartbeatDateStorage date];
|
||||
if (lastCheckin) {
|
||||
// Ensure the previous checkin was on a different date in the past.
|
||||
if ([self isDate:currentDate inSameDayOrBeforeThan:lastCheckin]) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Update heartbeat sent date.
|
||||
NSError *error;
|
||||
if (![self.heartbeatDateStorage setDate:currentDate error:&error]) {
|
||||
GULLogError(kFIRCoreDiagnostics, NO, @"I-COR100004", @"Unable to persist internal state: %@",
|
||||
error);
|
||||
}
|
||||
|
||||
// Set the flag.
|
||||
config->sdk_name = logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ICORE;
|
||||
config->has_sdk_name = 1;
|
||||
}
|
||||
|
||||
- (BOOL)isDate:(NSDate *)date1 inSameDayOrBeforeThan:(NSDate *)date2 {
|
||||
return [[NSCalendar currentCalendar] isDate:date1 inSameDayAsDate:date2] ||
|
||||
[date1 compare:date2] == NSOrderedAscending;
|
||||
}
|
||||
|
||||
@end
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright 2019 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/// Stores a date to a specified file.
|
||||
@interface FIRCoreDiagnosticsDateFileStorage : NSObject
|
||||
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
/**
|
||||
* Default initializer.
|
||||
* @param fileURL The URL of the file to store the date. The directory must exist, the file may not
|
||||
* exist, it will be created if needed.
|
||||
*/
|
||||
- (instancetype)initWithFileURL:(NSURL *)fileURL;
|
||||
|
||||
/**
|
||||
* Saves the date to the specified file.
|
||||
* @return YES on success, NO otherwise.
|
||||
*/
|
||||
- (BOOL)setDate:(nullable NSDate *)date error:(NSError **)outError;
|
||||
|
||||
/**
|
||||
* Reads the date to the specified file.
|
||||
* @return Returns date if exists, otherwise `nil`.
|
||||
*/
|
||||
- (nullable NSDate *)date;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
/*
|
||||
* Copyright 2019 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import "FIRCDLibrary/FIRCoreDiagnosticsDateFileStorage.h"
|
||||
|
||||
@interface FIRCoreDiagnosticsDateFileStorage ()
|
||||
@property(nonatomic, readonly) NSURL *fileURL;
|
||||
@end
|
||||
|
||||
@implementation FIRCoreDiagnosticsDateFileStorage
|
||||
|
||||
- (instancetype)initWithFileURL:(NSURL *)fileURL {
|
||||
if (fileURL == nil) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_fileURL = fileURL;
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (BOOL)setDate:(nullable NSDate *)date error:(NSError **)outError {
|
||||
NSString *stringToSave = @"";
|
||||
|
||||
if (date != nil) {
|
||||
NSTimeInterval timestamp = [date timeIntervalSinceReferenceDate];
|
||||
stringToSave = [NSString stringWithFormat:@"%f", timestamp];
|
||||
}
|
||||
|
||||
return [stringToSave writeToURL:self.fileURL
|
||||
atomically:YES
|
||||
encoding:NSUTF8StringEncoding
|
||||
error:outError];
|
||||
}
|
||||
|
||||
- (nullable NSDate *)date {
|
||||
NSString *timestampString = [NSString stringWithContentsOfURL:self.fileURL
|
||||
encoding:NSUTF8StringEncoding
|
||||
error:nil];
|
||||
if (timestampString.length == 0) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
NSTimeInterval timestamp = timestampString.doubleValue;
|
||||
return [NSDate dateWithTimeIntervalSinceReferenceDate:timestamp];
|
||||
}
|
||||
|
||||
@end
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright 2019 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/* Automatically generated nanopb constant definitions */
|
||||
/* Generated by nanopb-0.3.9.2 */
|
||||
|
||||
#include "firebasecore.nanopb.h"
|
||||
|
||||
/* @@protoc_insertion_point(includes) */
|
||||
#if PB_PROTO_HEADER_VERSION != 30
|
||||
#error Regenerate this file with the current version of nanopb generator.
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
const pb_field_t logs_proto_mobilesdk_ios_ICoreConfiguration_fields[34] = {
|
||||
PB_FIELD( 1, UENUM , OPTIONAL, STATIC , FIRST, logs_proto_mobilesdk_ios_ICoreConfiguration, configuration_type, configuration_type, 0),
|
||||
PB_FIELD( 2, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, version_name, configuration_type, 0),
|
||||
PB_FIELD( 3, INT64 , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, build_number, version_name, 0),
|
||||
PB_FIELD( 4, UENUM , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, build_type, build_number, 0),
|
||||
PB_FIELD( 5, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, plist_version, build_type, 0),
|
||||
PB_FIELD( 6, UENUM , REPEATED, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, sdk_service_enabled, plist_version, 0),
|
||||
PB_FIELD( 7, UENUM , REPEATED, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, sdk_service_installed, sdk_service_enabled, 0),
|
||||
PB_FIELD( 9, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, device_model, sdk_service_installed, 0),
|
||||
PB_FIELD( 10, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, app_id, device_model, 0),
|
||||
PB_FIELD( 11, INT64 , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, project_number, app_id, 0),
|
||||
PB_FIELD( 12, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, bundle_id, project_number, 0),
|
||||
PB_FIELD( 13, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, client_id, bundle_id, 0),
|
||||
PB_FIELD( 14, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, install, client_id, 0),
|
||||
PB_FIELD( 16, UENUM , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, pod_name, install, 0),
|
||||
PB_FIELD( 18, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, icore_version, pod_name, 0),
|
||||
PB_FIELD( 19, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, sdk_version, icore_version, 0),
|
||||
PB_FIELD( 20, UENUM , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, sdk_name, sdk_version, 0),
|
||||
PB_FIELD( 21, INT32 , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, app_count, sdk_name, 0),
|
||||
PB_FIELD( 22, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, os_version, app_count, 0),
|
||||
PB_FIELD( 23, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, itunes_id, os_version, 0),
|
||||
PB_FIELD( 24, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, min_supported_ios_version, itunes_id, 0),
|
||||
PB_FIELD( 25, BOOL , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, use_default_app, min_supported_ios_version, 0),
|
||||
PB_FIELD( 26, BOOL , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, deployed_in_app_store, use_default_app, 0),
|
||||
PB_FIELD( 27, INT32 , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, dynamic_framework_count, deployed_in_app_store, 0),
|
||||
PB_FIELD( 28, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, apple_framework_version, dynamic_framework_count, 0),
|
||||
PB_FIELD( 29, BOOL , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, using_zip_file, apple_framework_version, 0),
|
||||
PB_FIELD( 30, UENUM , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, deployment_type, using_zip_file, 0),
|
||||
PB_FIELD( 31, BYTES , OPTIONAL, POINTER , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, platform_info, deployment_type, 0),
|
||||
PB_FIELD( 32, INT64 , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, app_extensions, platform_info, 0),
|
||||
PB_FIELD( 33, BOOL , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, swizzling_enabled, app_extensions, 0),
|
||||
PB_FIELD( 34, INT32 , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, log_error_count, swizzling_enabled, 0),
|
||||
PB_FIELD( 35, INT32 , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, log_warning_count, log_error_count, 0),
|
||||
PB_FIELD( 36, BOOL , OPTIONAL, STATIC , OTHER, logs_proto_mobilesdk_ios_ICoreConfiguration, using_gdt, log_warning_count, 0),
|
||||
PB_LAST_FIELD
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* @@protoc_insertion_point(eof) */
|
||||
+224
@@ -0,0 +1,224 @@
|
||||
/*
|
||||
* Copyright 2019 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/* Automatically generated nanopb header */
|
||||
/* Generated by nanopb-0.3.9.2 */
|
||||
|
||||
#ifndef PB_LOGS_PROTO_MOBILESDK_IOS_FIREBASECORE_NANOPB_H_INCLUDED
|
||||
#define PB_LOGS_PROTO_MOBILESDK_IOS_FIREBASECORE_NANOPB_H_INCLUDED
|
||||
#include <nanopb/pb.h>
|
||||
|
||||
/* @@protoc_insertion_point(includes) */
|
||||
#if PB_PROTO_HEADER_VERSION != 30
|
||||
#error Regenerate this file with the current version of nanopb generator.
|
||||
#endif
|
||||
|
||||
|
||||
/* Enum definitions */
|
||||
typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType {
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_UNKNOWN_CONFIGURATION_TYPE = 0,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_CORE = 1,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_SDK = 2
|
||||
} logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType;
|
||||
#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_MIN logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_UNKNOWN_CONFIGURATION_TYPE
|
||||
#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_MAX logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_SDK
|
||||
#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_ARRAYSIZE ((logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType)(logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_SDK+1))
|
||||
|
||||
typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType {
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_UNKNOWN_BUILD_TYPE = 0,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_INTERNAL = 1,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_EAP = 2,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_PROD = 3
|
||||
} logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType;
|
||||
#define _logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_MIN logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_UNKNOWN_BUILD_TYPE
|
||||
#define _logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_MAX logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_PROD
|
||||
#define _logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_ARRAYSIZE ((logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType)(logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_PROD+1))
|
||||
|
||||
typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType {
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_UNKNOWN_SDK_SERVICE = 0,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ICORE = 1,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ADMOB = 2,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_APP_INVITE = 3,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_SIGN_IN = 5,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_GCM = 6,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MAPS = 7,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_SCION = 8,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ANALYTICS = 9,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_APP_INDEXING = 10,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_CONFIG = 11,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_DURABLE_DEEP_LINKS = 12,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_CRASH = 13,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_AUTH = 14,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_DATABASE = 15,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_STORAGE = 16,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MESSAGING = 17,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MEASUREMENT = 18,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_REMOTE_CONFIG = 19,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_DYNAMIC_LINKS = 20,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_INVITES = 21,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_AUTH_UI = 22,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_FIRESTORE = 23,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_PERFORMANCE = 24,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_FACE = 26,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_BARCODE = 27,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_TEXT = 28,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_LABEL = 29,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_MODEL_INTERPRETER = 30,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_IN_APP_MESSAGING = 31,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_FUNCTIONS = 32,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_NATURAL_LANGUAGE = 33,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_AUTOML = 34,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_OBJECT_DETECTION = 35
|
||||
} logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType;
|
||||
#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MIN logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_UNKNOWN_SDK_SERVICE
|
||||
#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MAX logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_OBJECT_DETECTION
|
||||
#define _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ARRAYSIZE ((logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType)(logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_ML_VISION_ON_DEVICE_OBJECT_DETECTION+1))
|
||||
|
||||
typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName {
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_UNKNOWN_POD_NAME = 0,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_GOOGLE = 1,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_FIREBASE = 2
|
||||
} logs_proto_mobilesdk_ios_ICoreConfiguration_PodName;
|
||||
#define _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_MIN logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_UNKNOWN_POD_NAME
|
||||
#define _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_MAX logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_FIREBASE
|
||||
#define _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_ARRAYSIZE ((logs_proto_mobilesdk_ios_ICoreConfiguration_PodName)(logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_FIREBASE+1))
|
||||
|
||||
typedef enum _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType {
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_UNKNOWN = 0,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_COCOAPODS = 1,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_ZIP_FILE = 2,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_CARTHAGE = 3,
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_SPM = 4
|
||||
} logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType;
|
||||
#define _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_MIN logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_UNKNOWN
|
||||
#define _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_MAX logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_SPM
|
||||
#define _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_ARRAYSIZE ((logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType)(logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_SPM+1))
|
||||
|
||||
/* Struct definitions */
|
||||
typedef struct _logs_proto_mobilesdk_ios_ICoreConfiguration {
|
||||
bool has_configuration_type;
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType configuration_type;
|
||||
pb_bytes_array_t *version_name;
|
||||
bool has_build_number;
|
||||
int64_t build_number;
|
||||
bool has_build_type;
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType build_type;
|
||||
pb_bytes_array_t *plist_version;
|
||||
pb_size_t sdk_service_enabled_count;
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType *sdk_service_enabled;
|
||||
pb_size_t sdk_service_installed_count;
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType *sdk_service_installed;
|
||||
pb_bytes_array_t *device_model;
|
||||
pb_bytes_array_t *app_id;
|
||||
bool has_project_number;
|
||||
int64_t project_number;
|
||||
pb_bytes_array_t *bundle_id;
|
||||
pb_bytes_array_t *client_id;
|
||||
pb_bytes_array_t *install;
|
||||
bool has_pod_name;
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_PodName pod_name;
|
||||
pb_bytes_array_t *icore_version;
|
||||
pb_bytes_array_t *sdk_version;
|
||||
bool has_sdk_name;
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType sdk_name;
|
||||
bool has_app_count;
|
||||
int32_t app_count;
|
||||
pb_bytes_array_t *os_version;
|
||||
pb_bytes_array_t *itunes_id;
|
||||
pb_bytes_array_t *min_supported_ios_version;
|
||||
bool has_use_default_app;
|
||||
bool use_default_app;
|
||||
bool has_deployed_in_app_store;
|
||||
bool deployed_in_app_store;
|
||||
bool has_dynamic_framework_count;
|
||||
int32_t dynamic_framework_count;
|
||||
pb_bytes_array_t *apple_framework_version;
|
||||
bool has_using_zip_file;
|
||||
bool using_zip_file;
|
||||
bool has_deployment_type;
|
||||
logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType deployment_type;
|
||||
pb_bytes_array_t *platform_info;
|
||||
bool has_app_extensions;
|
||||
int64_t app_extensions;
|
||||
bool has_swizzling_enabled;
|
||||
bool swizzling_enabled;
|
||||
bool has_log_error_count;
|
||||
int32_t log_error_count;
|
||||
bool has_log_warning_count;
|
||||
int32_t log_warning_count;
|
||||
bool has_using_gdt;
|
||||
bool using_gdt;
|
||||
/* @@protoc_insertion_point(struct:logs_proto_mobilesdk_ios_ICoreConfiguration) */
|
||||
} logs_proto_mobilesdk_ios_ICoreConfiguration;
|
||||
|
||||
/* Default values for struct fields */
|
||||
|
||||
/* Initializer values for message structs */
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_init_default {false, _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_MIN, NULL, false, 0, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_MIN, NULL, 0, NULL, 0, NULL, NULL, NULL, false, 0, NULL, NULL, NULL, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_MIN, NULL, NULL, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MIN, false, 0, NULL, NULL, NULL, false, 0, false, 0, false, 0, NULL, false, 0, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_MIN, NULL, false, 0, false, 0, false, 0, false, 0, false, 0}
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_init_zero {false, _logs_proto_mobilesdk_ios_ICoreConfiguration_ConfigurationType_MIN, NULL, false, 0, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_BuildType_MIN, NULL, 0, NULL, 0, NULL, NULL, NULL, false, 0, NULL, NULL, NULL, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_PodName_MIN, NULL, NULL, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_ServiceType_MIN, false, 0, NULL, NULL, NULL, false, 0, false, 0, false, 0, NULL, false, 0, false, _logs_proto_mobilesdk_ios_ICoreConfiguration_DeploymentType_MIN, NULL, false, 0, false, 0, false, 0, false, 0, false, 0}
|
||||
|
||||
/* Field tags (for use in manual encoding/decoding) */
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_pod_name_tag 16
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_configuration_type_tag 1
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_version_name_tag 2
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_icore_version_tag 18
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_sdk_version_tag 19
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_build_number_tag 3
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_build_type_tag 4
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_plist_version_tag 5
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_sdk_service_enabled_tag 6
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_sdk_service_installed_tag 7
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_sdk_name_tag 20
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_device_model_tag 9
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_os_version_tag 22
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_app_id_tag 10
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_project_number_tag 11
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_bundle_id_tag 12
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_client_id_tag 13
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_itunes_id_tag 23
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_min_supported_ios_version_tag 24
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_install_tag 14
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_use_default_app_tag 25
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_app_count_tag 21
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_deployed_in_app_store_tag 26
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_dynamic_framework_count_tag 27
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_apple_framework_version_tag 28
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_using_zip_file_tag 29
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_deployment_type_tag 30
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_platform_info_tag 31
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_app_extensions_tag 32
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_swizzling_enabled_tag 33
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_log_error_count_tag 34
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_log_warning_count_tag 35
|
||||
#define logs_proto_mobilesdk_ios_ICoreConfiguration_using_gdt_tag 36
|
||||
|
||||
/* Struct field encoding specification for nanopb */
|
||||
extern const pb_field_t logs_proto_mobilesdk_ios_ICoreConfiguration_fields[34];
|
||||
|
||||
/* Maximum encoded size of messages (where known) */
|
||||
/* logs_proto_mobilesdk_ios_ICoreConfiguration_size depends on runtime parameters */
|
||||
|
||||
/* Message IDs (where set with "msgid" option) */
|
||||
#ifdef PB_MSGID
|
||||
|
||||
#define FIREBASECORE_MESSAGES \
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
/* @@protoc_insertion_point(eof) */
|
||||
|
||||
#endif
|
||||
Generated
+202
@@ -0,0 +1,202 @@
|
||||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
Generated
+223
@@ -0,0 +1,223 @@
|
||||
# Firebase iOS Open Source Development [](https://travis-ci.org/firebase/firebase-ios-sdk)
|
||||
|
||||
This repository contains a subset of the Firebase iOS SDK source. It currently
|
||||
includes FirebaseCore, FirebaseAuth, FirebaseDatabase, FirebaseFirestore,
|
||||
FirebaseFunctions, FirebaseInstanceID, FirebaseInAppMessaging,
|
||||
FirebaseInAppMessagingDisplay, FirebaseMessaging and FirebaseStorage.
|
||||
|
||||
The repository also includes GoogleUtilities source. The
|
||||
[GoogleUtilities](GoogleUtilities/README.md) pod is
|
||||
a set of utilities used by Firebase and other Google products.
|
||||
|
||||
Firebase is an app development platform with tools to help you build, grow and
|
||||
monetize your app. More information about Firebase can be found at
|
||||
[https://firebase.google.com](https://firebase.google.com).
|
||||
|
||||
## Installation
|
||||
|
||||
See the three subsections for details about three different installation methods.
|
||||
1. [Standard pod install](README.md#standard-pod-install)
|
||||
1. [Installing from the GitHub repo](README.md#installing-from-github)
|
||||
1. [Experimental Carthage](README.md#carthage-ios-only)
|
||||
|
||||
### Standard pod install
|
||||
|
||||
Go to
|
||||
[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup).
|
||||
|
||||
### Installing from GitHub
|
||||
|
||||
For releases starting with 5.0.0, the source for each release is also deployed
|
||||
to CocoaPods master and available via standard
|
||||
[CocoaPods Podfile syntax](https://guides.cocoapods.org/syntax/podfile.html#pod).
|
||||
|
||||
These instructions can be used to access the Firebase repo at other branches,
|
||||
tags, or commits.
|
||||
|
||||
#### Background
|
||||
|
||||
See
|
||||
[the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod)
|
||||
for instructions and options about overriding pod source locations.
|
||||
|
||||
#### Accessing Firebase Source Snapshots
|
||||
|
||||
All of the official releases are tagged in this repo and available via CocoaPods. To access a local
|
||||
source snapshot or unreleased branch, use Podfile directives like the following:
|
||||
|
||||
To access FirebaseFirestore via a branch:
|
||||
```
|
||||
pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master'
|
||||
pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master'
|
||||
```
|
||||
|
||||
To access FirebaseMessaging via a checked out version of the firebase-ios-sdk repo do:
|
||||
|
||||
```
|
||||
pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk'
|
||||
pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk'
|
||||
```
|
||||
|
||||
### Carthage (iOS only)
|
||||
|
||||
Instructions for the experimental Carthage distribution are at
|
||||
[Carthage](Carthage.md).
|
||||
|
||||
### Rome
|
||||
|
||||
Instructions for installing binary frameworks via
|
||||
[Rome](https://github.com/CocoaPods/Rome) are at [Rome](Rome.md).
|
||||
|
||||
## Development
|
||||
|
||||
To develop Firebase software in this repository, ensure that you have at least
|
||||
the following software:
|
||||
|
||||
* Xcode 10.1 (or later)
|
||||
* CocoaPods 1.7.2 (or later)
|
||||
|
||||
For the pod that you want to develop:
|
||||
|
||||
`pod gen Firebase{name here}.podspec --local-sources=./ --auto-open`
|
||||
|
||||
Firestore and Functions have self contained Xcode projects. See
|
||||
[Firestore/README.md](Firestore/README.md) and
|
||||
[Functions/README.md](Functions/README.md).
|
||||
|
||||
### Adding a New Firebase Pod
|
||||
|
||||
See [AddNewPod.md](AddNewPod.md).
|
||||
|
||||
### Code Formatting
|
||||
|
||||
To ensure that the code is formatted consistently, run the script
|
||||
[./scripts/style.sh](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/style.sh)
|
||||
before creating a PR.
|
||||
|
||||
Travis will verify that any code changes are done in a style compliant way. Install
|
||||
`clang-format` and `swiftformat`.
|
||||
These commands will get the right versions:
|
||||
|
||||
```
|
||||
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/773cb75d360b58f32048f5964038d09825a507c8/Formula/clang-format.rb
|
||||
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/3dfea1004e0736754bbf49673cca8aaed8a94089/Formula/swiftformat.rb
|
||||
```
|
||||
|
||||
Note: if you already have a newer version of these installed you may need to
|
||||
`brew switch` to this version.
|
||||
|
||||
### Running Unit Tests
|
||||
|
||||
Select a scheme and press Command-u to build a component and run its unit tests.
|
||||
|
||||
#### Viewing Code Coverage
|
||||
|
||||
First, make sure that [xcov](https://github.com/nakiostudio/xcov) is installed with `gem install xcov`.
|
||||
|
||||
After running the `AllUnitTests_iOS` scheme in Xcode, execute
|
||||
`xcov --workspace Firebase.xcworkspace --scheme AllUnitTests_iOS --output_directory xcov_output`
|
||||
at Example/ in the terminal. This will aggregate the coverage, and you can run `open xcov_output/index.html` to see the results.
|
||||
|
||||
### Running Sample Apps
|
||||
In order to run the sample apps and integration tests, you'll need valid
|
||||
`GoogleService-Info.plist` files for those samples. The Firebase Xcode project contains dummy plist
|
||||
files without real values, but can be replaced with real plist files. To get your own
|
||||
`GoogleService-Info.plist` files:
|
||||
|
||||
1. Go to the [Firebase Console](https://console.firebase.google.com/)
|
||||
2. Create a new Firebase project, if you don't already have one
|
||||
3. For each sample app you want to test, create a new Firebase app with the sample app's bundle
|
||||
identifier (e.g. `com.google.Database-Example`)
|
||||
4. Download the resulting `GoogleService-Info.plist` and replace the appropriate dummy plist file
|
||||
(e.g. in [Example/Database/App/](Example/Database/App/));
|
||||
|
||||
Some sample apps like Firebase Messaging ([Example/Messaging/App](Example/Messaging/App)) require
|
||||
special Apple capabilities, and you will have to change the sample app to use a unique bundle
|
||||
identifier that you can control in your own Apple Developer account.
|
||||
|
||||
## Specific Component Instructions
|
||||
See the sections below for any special instructions for those components.
|
||||
|
||||
### Firebase Auth
|
||||
|
||||
If you're doing specific Firebase Auth development, see
|
||||
[the Auth Sample README](Example/Auth/README.md) for instructions about
|
||||
building and running the FirebaseAuth pod along with various samples and tests.
|
||||
|
||||
### Firebase Database
|
||||
|
||||
To run the Database Integration tests, make your database authentication rules
|
||||
[public](https://firebase.google.com/docs/database/security/quickstart).
|
||||
|
||||
### Firebase Storage
|
||||
|
||||
To run the Storage Integration tests, follow the instructions in
|
||||
[FIRStorageIntegrationTests.m](Example/Storage/Tests/Integration/FIRStorageIntegrationTests.m).
|
||||
|
||||
#### Push Notifications
|
||||
|
||||
Push notifications can only be delivered to specially provisioned App IDs in the developer portal.
|
||||
In order to actually test receiving push notifications, you will need to:
|
||||
|
||||
1. Change the bundle identifier of the sample app to something you own in your Apple Developer
|
||||
account, and enable that App ID for push notifications.
|
||||
2. You'll also need to
|
||||
[upload your APNs Provider Authentication Key or certificate to the Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs)
|
||||
at **Project Settings > Cloud Messaging > [Your Firebase App]**.
|
||||
3. Ensure your iOS device is added to your Apple Developer portal as a test device.
|
||||
|
||||
#### iOS Simulator
|
||||
|
||||
The iOS Simulator cannot register for remote notifications, and will not receive push notifications.
|
||||
In order to receive push notifications, you'll have to follow the steps above and run the app on a
|
||||
physical device.
|
||||
|
||||
## Community Supported Efforts
|
||||
|
||||
We've seen an amazing amount of interest and contributions to improve the Firebase SDKs, and we are
|
||||
very grateful! We'd like to empower as many developers as we can to be able to use Firebase and
|
||||
participate in the Firebase community.
|
||||
|
||||
### macOS and tvOS
|
||||
Thanks to contributions from the community, FirebaseAuth, FirebaseCore, FirebaseDatabase, FirebaseMessaging,
|
||||
FirebaseFirestore, FirebaseFunctions and FirebaseStorage now compile, run unit tests, and work on
|
||||
macOS and tvOS.
|
||||
|
||||
For tvOS, checkout the [Sample](Example/tvOSSample).
|
||||
|
||||
Keep in mind that macOS and tvOS are not officially supported by Firebase, and this repository is
|
||||
actively developed primarily for iOS. While we can catch basic unit test issues with Travis, there
|
||||
may be some changes where the SDK no longer works as expected on macOS or tvOS. If you encounter
|
||||
this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues).
|
||||
|
||||
Note that the Firebase pod is not available for macOS and tvOS.
|
||||
|
||||
To install, add a subset of the following to the Podfile:
|
||||
|
||||
```
|
||||
pod 'FirebaseAuth'
|
||||
pod 'FirebaseCore'
|
||||
pod 'FirebaseDatabase'
|
||||
pod 'FirebaseFirestore'
|
||||
pod 'FirebaseFunctions'
|
||||
pod 'FirebaseMessaging'
|
||||
pod 'FirebaseStorage'
|
||||
```
|
||||
|
||||
## Roadmap
|
||||
|
||||
See [Roadmap](ROADMAP.md) for more about the Firebase iOS SDK Open Source
|
||||
plans and directions.
|
||||
|
||||
## Contributing
|
||||
|
||||
See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase
|
||||
iOS SDK.
|
||||
|
||||
## License
|
||||
|
||||
The contents of this repository is licensed under the
|
||||
[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0).
|
||||
|
||||
Your use of Firebase is governed by the
|
||||
[Terms of Service for Firebase Services](https://firebase.google.com/terms/).
|
||||
Reference in New Issue
Block a user