diff options
Diffstat (limited to 'StoneIsland/platforms/ios/Pods/FirebaseABTesting')
30 files changed, 2858 insertions, 0 deletions
diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/ABTConditionalUserPropertyController.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/ABTConditionalUserPropertyController.h new file mode 100644 index 00000000..54e10b0c --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/ABTConditionalUserPropertyController.h @@ -0,0 +1,79 @@ +// 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> +#import "FirebaseABTesting/Sources/Private/ABTExperimentPayload.h" + +#import "Interop/Analytics/Public/FIRAnalyticsInterop.h" + +NS_ASSUME_NONNULL_BEGIN + +@class FIRLifecycleEvents; + +/// This class dynamically calls Firebase Analytics API to collect or update experiments +/// information. +/// The experiment in Firebase Analytics is named as conditional user property (CUP) object defined +/// in FIRAConditionalUserProperty.h. +@interface ABTConditionalUserPropertyController : NSObject + +/// Returns the ABTConditionalUserPropertyController singleton. ++ (instancetype)sharedInstanceWithAnalytics:(id<FIRAnalyticsInterop> _Nullable)analytics; + +/// Returns the list of currently set experiments from Firebase Analytics for the provided origin. +- (NSArray *)experimentsWithOrigin:(NSString *)origin; + +/// Returns the experiment ID from Firebase Analytics given an experiment object. Returns empty +/// string if can't find Firebase Analytics service. +- (NSString *)experimentIDOfExperiment:(nullable id)experiment; + +/// Returns the variant ID from Firebase Analytics given an experiment object. Returns empty string +/// if can't find Firebase Analytics service. +- (NSString *)variantIDOfExperiment:(nullable id)experiment; + +/// Returns whether the experiment is the same as the one in the provided payload. +- (BOOL)isExperiment:(id)experiment theSameAsPayload:(ABTExperimentPayload *)payload; + +/// Clears the experiment in Firebase Analytics. +/// @param experimentID Experiment ID to clear. +/// @param variantID Variant ID to clear. +/// @param origin Impacted originating service, it is defined at Firebase Analytics +/// FIREventOrigins.h. +/// @param payload Payload to overwrite event name in events. DO NOT use payload's experiment +/// ID and variant ID as the experiment to clear. +/// @param events Events name for clearing the experiment. +- (void)clearExperiment:(NSString *)experimentID + variantID:(NSString *)variantID + withOrigin:(NSString *)origin + payload:(nullable ABTExperimentPayload *)payload + events:(FIRLifecycleEvents *)events; + +/// Sets the experiment in Firebase Analytics. +/// @param origin Impacted originating service, it is defined at Firebase Analytics +/// FIREventOrigins.h. +/// @param payload Payload to overwrite event name in events. DO NOT use payload's experiment +/// ID and variant ID as the experiment to set. +/// @param events Events name for setting the experiment. +/// @param policy Overflow policy when the number of experiments is over the limit. +- (void)setExperimentWithOrigin:(NSString *)origin + payload:(ABTExperimentPayload *)payload + events:(FIRLifecycleEvents *)events + policy:(ABTExperimentPayloadExperimentOverflowPolicy)policy; + +/** + * Unavailable. Use sharedInstanceWithAnalytics: instead. + */ +- (instancetype)init __attribute__((unavailable("Use +sharedInstanceWithAnalytics: instead."))); +@end + +NS_ASSUME_NONNULL_END diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/ABTConditionalUserPropertyController.m b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/ABTConditionalUserPropertyController.m new file mode 100644 index 00000000..d7601ee1 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/ABTConditionalUserPropertyController.m @@ -0,0 +1,281 @@ +// 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 "FirebaseABTesting/Sources/ABTConditionalUserPropertyController.h" + +#import "FirebaseABTesting/Sources/ABTConstants.h" +#import "FirebaseABTesting/Sources/Public/FIRLifecycleEvents.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" +#import "Interop/Analytics/Public/FIRAnalyticsInterop.h" + +@implementation ABTConditionalUserPropertyController { + dispatch_queue_t _analyticOperationQueue; + id<FIRAnalyticsInterop> _Nullable _analytics; +} + +/// Returns the ABTConditionalUserPropertyController singleton. ++ (instancetype)sharedInstanceWithAnalytics:(id<FIRAnalyticsInterop> _Nullable)analytics { + static ABTConditionalUserPropertyController *sharedInstance = nil; + static dispatch_once_t onceToken = 0; + dispatch_once(&onceToken, ^{ + sharedInstance = [[ABTConditionalUserPropertyController alloc] initWithAnalytics:analytics]; + }); + return sharedInstance; +} + +- (instancetype)initWithAnalytics:(id<FIRAnalyticsInterop> _Nullable)analytics { + self = [super init]; + if (self) { + _analyticOperationQueue = + dispatch_queue_create("com.google.FirebaseABTesting.analytics", DISPATCH_QUEUE_SERIAL); + _analytics = analytics; + } + return self; +} + +#pragma mark - experiments proxy methods on Firebase Analytics + +- (NSArray *)experimentsWithOrigin:(NSString *)origin { + return [_analytics conditionalUserProperties:origin propertyNamePrefix:@""]; +} + +- (void)clearExperiment:(NSString *)experimentID + variantID:(NSString *)variantID + withOrigin:(NSString *)origin + payload:(ABTExperimentPayload *)payload + events:(FIRLifecycleEvents *)events { + // Payload always overwrite event names. + NSString *clearExperimentEventName = events.clearExperimentEventName; + if (payload && payload.clearEventToLog && payload.clearEventToLog.length) { + clearExperimentEventName = payload.clearEventToLog; + } + + [_analytics clearConditionalUserProperty:experimentID + forOrigin:origin + clearEventName:clearExperimentEventName + clearEventParameters:@{experimentID : variantID}]; + + FIRLogDebug(kFIRLoggerABTesting, @"I-ABT000015", @"Clear Experiment ID %@, variant ID %@.", + experimentID, variantID); +} + +- (void)setExperimentWithOrigin:(NSString *)origin + payload:(ABTExperimentPayload *)payload + events:(FIRLifecycleEvents *)events + policy:(ABTExperimentPayloadExperimentOverflowPolicy)policy { + NSInteger maxNumOfExperiments = [self maxNumberOfExperimentsOfOrigin:origin]; + if (maxNumOfExperiments < 0) { + return; + } + + // Clear experiments if overflow + NSArray *experiments = [self experimentsWithOrigin:origin]; + if (!experiments) { + FIRLogInfo(kFIRLoggerABTesting, @"I-ABT000003", + @"Failed to get conditional user properties from Firebase Analytics."); + return; + } + + if (maxNumOfExperiments <= experiments.count) { + ABTExperimentPayloadExperimentOverflowPolicy overflowPolicy = + [self overflowPolicyWithPayload:payload originalPolicy:policy]; + id experimentToClear = experiments.firstObject; + if (overflowPolicy == ABTExperimentPayloadExperimentOverflowPolicyDiscardOldest && + experimentToClear) { + NSString *expID = [self experimentIDOfExperiment:experimentToClear]; + NSString *varID = [self variantIDOfExperiment:experimentToClear]; + + [self clearExperiment:expID variantID:varID withOrigin:origin payload:payload events:events]; + FIRLogDebug(kFIRLoggerABTesting, @"I-ABT000016", + @"Clear experiment ID %@ variant ID %@ due to " + @"overflow policy.", + expID, varID); + + } else { + FIRLogDebug(kFIRLoggerABTesting, @"I-ABT000017", + @"Experiment ID %@ variant ID %@ won't be set due to " + @"overflow policy.", + payload.experimentId, payload.variantId); + + return; + } + } + + // Clear experiment if other variant ID exists. + NSString *experimentID = payload.experimentId; + NSString *variantID = payload.variantId; + for (id experiment in experiments) { + NSString *expID = [self experimentIDOfExperiment:experiment]; + NSString *varID = [self variantIDOfExperiment:experiment]; + if ([expID isEqualToString:experimentID] && ![varID isEqualToString:variantID]) { + FIRLogDebug(kFIRLoggerABTesting, @"I-ABT000018", + @"Clear experiment ID %@ with variant ID %@ because " + @"only one variant ID can be existed " + @"at any time.", + expID, varID); + [self clearExperiment:expID variantID:varID withOrigin:origin payload:payload events:events]; + } + } + + // Set experiment + NSDictionary<NSString *, id> *experiment = [self createExperimentFromOrigin:origin + payload:payload + events:events]; + + [_analytics setConditionalUserProperty:experiment]; + + FIRLogDebug(kFIRLoggerABTesting, @"I-ABT000019", + @"Set conditional user property, experiment ID %@ with " + @"variant ID %@ triggered event %@.", + experimentID, variantID, payload.triggerEvent); + + // Log setEvent (experiment lifecycle event to be set when an experiment is set) + [self logEventWithOrigin:origin payload:payload events:events]; +} + +- (NSMutableDictionary<NSString *, id> *)createExperimentFromOrigin:(NSString *)origin + payload:(ABTExperimentPayload *)payload + events:(FIRLifecycleEvents *)events { + NSMutableDictionary<NSString *, id> *experiment = [[NSMutableDictionary alloc] init]; + NSString *experimentID = payload.experimentId; + NSString *variantID = payload.variantId; + + NSDictionary *eventParams = @{experimentID : variantID}; + + [experiment setValue:origin forKey:kABTExperimentDictionaryOriginKey]; + + NSTimeInterval creationTimestamp = (double)(payload.experimentStartTimeMillis / ABT_MSEC_PER_SEC); + [experiment setValue:@(creationTimestamp) forKey:kABTExperimentDictionaryCreationTimestampKey]; + [experiment setValue:experimentID forKey:kABTExperimentDictionaryExperimentIDKey]; + [experiment setValue:variantID forKey:kABTExperimentDictionaryVariantIDKey]; + + // For the experiment to be immediately activated/triggered, its trigger event must be null. + // Double check if payload's trigger event is empty string, it must be set to null to trigger. + if (payload && payload.triggerEvent && payload.triggerEvent.length) { + [experiment setValue:payload.triggerEvent forKey:kABTExperimentDictionaryTriggeredEventNameKey]; + } else { + [experiment setValue:nil forKey:kABTExperimentDictionaryTriggeredEventNameKey]; + } + + // Set timeout event name and params. + NSString *timeoutEventName = events.timeoutExperimentEventName; + if (payload && payload.timeoutEventToLog && payload.timeoutEventToLog.length) { + timeoutEventName = payload.timeoutEventToLog; + } + NSDictionary<NSString *, id> *timeoutEvent = [self eventDictionaryWithOrigin:origin + eventName:timeoutEventName + params:eventParams]; + [experiment setValue:timeoutEvent forKey:kABTExperimentDictionaryTimedOutEventKey]; + + // Set trigger timeout information on how long to wait for trigger event. + NSTimeInterval triggerTimeout = (double)(payload.triggerTimeoutMillis / ABT_MSEC_PER_SEC); + [experiment setValue:@(triggerTimeout) forKey:kABTExperimentDictionaryTriggerTimeoutKey]; + + // Set activate event name and params. + NSString *activateEventName = events.activateExperimentEventName; + if (payload && payload.activateEventToLog && payload.activateEventToLog.length) { + activateEventName = payload.activateEventToLog; + } + NSDictionary<NSString *, id> *triggeredEvent = [self eventDictionaryWithOrigin:origin + eventName:activateEventName + params:eventParams]; + [experiment setValue:triggeredEvent forKey:kABTExperimentDictionaryTriggeredEventKey]; + + // Set time to live information for how long the experiment lasts. + NSTimeInterval timeToLive = (double)(payload.timeToLiveMillis / ABT_MSEC_PER_SEC); + [experiment setValue:@(timeToLive) forKey:kABTExperimentDictionaryTimeToLiveKey]; + + // Set expired event name and params. + NSString *expiredEventName = events.expireExperimentEventName; + if (payload && payload.ttlExpiryEventToLog && payload.ttlExpiryEventToLog.length) { + expiredEventName = payload.ttlExpiryEventToLog; + } + NSDictionary<NSString *, id> *expiredEvent = [self eventDictionaryWithOrigin:origin + eventName:expiredEventName + params:eventParams]; + [experiment setValue:expiredEvent forKey:kABTExperimentDictionaryExpiredEventKey]; + return experiment; +} + +- (NSDictionary<NSString *, id> *) + eventDictionaryWithOrigin:(nonnull NSString *)origin + eventName:(nonnull NSString *)eventName + params:(nonnull NSDictionary<NSString *, NSString *> *)params { + return @{ + kABTEventDictionaryOriginKey : origin, + kABTEventDictionaryNameKey : eventName, + kABTEventDictionaryTimestampKey : @([NSDate date].timeIntervalSince1970), + kABTEventDictionaryParametersKey : params + }; +} + +#pragma mark - experiment properties +- (NSString *)experimentIDOfExperiment:(id)experiment { + if (!experiment) { + return @""; + } + return [experiment valueForKey:kABTExperimentDictionaryExperimentIDKey]; +} + +- (NSString *)variantIDOfExperiment:(id)experiment { + if (!experiment) { + return @""; + } + return [experiment valueForKey:kABTExperimentDictionaryVariantIDKey]; +} + +- (NSInteger)maxNumberOfExperimentsOfOrigin:(NSString *)origin { + if (!_analytics) { + return 0; + } + return [_analytics maxUserProperties:origin]; +} + +#pragma mark - analytics internal methods + +- (void)logEventWithOrigin:(NSString *)origin + payload:(ABTExperimentPayload *)payload + events:(FIRLifecycleEvents *)events { + NSString *setExperimentEventName = events.setExperimentEventName; + if (payload && payload.setEventToLog && payload.setEventToLog.length) { + setExperimentEventName = payload.setEventToLog; + } + NSDictionary<NSString *, NSString *> *params; + params = payload.experimentId ? @{payload.experimentId : payload.variantId} : @{}; + [_analytics logEventWithOrigin:origin name:setExperimentEventName parameters:params]; +} + +#pragma mark - helper + +- (BOOL)isExperiment:(id)experiment theSameAsPayload:(ABTExperimentPayload *)payload { + NSString *experimentID = [self experimentIDOfExperiment:experiment]; + NSString *variantID = [self variantIDOfExperiment:experiment]; + return [experimentID isEqualToString:payload.experimentId] && + [variantID isEqualToString:payload.variantId]; +} + +- (ABTExperimentPayloadExperimentOverflowPolicy) + overflowPolicyWithPayload:(ABTExperimentPayload *)payload + originalPolicy:(ABTExperimentPayloadExperimentOverflowPolicy)originalPolicy { + if ([payload overflowPolicyIsValid]) { + return payload.overflowPolicy; + } + if (originalPolicy == ABTExperimentPayloadExperimentOverflowPolicyIgnoreNewest || + originalPolicy == ABTExperimentPayloadExperimentOverflowPolicyDiscardOldest) { + return originalPolicy; + } + return ABTExperimentPayloadExperimentOverflowPolicyDiscardOldest; +} + +@end diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/ABTConstants.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/ABTConstants.h new file mode 100644 index 00000000..36457fa8 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/ABTConstants.h @@ -0,0 +1,43 @@ +// 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. + +#define ABT_MSEC_PER_SEC 1000ull + +#pragma mark - Keys for experiment dictionaries. + +static NSString *const kABTExperimentDictionaryCreationTimestampKey = @"creationTimestamp"; +static NSString *const kABTExperimentDictionaryExperimentIDKey = @"name"; +static NSString *const kABTExperimentDictionaryExpiredEventKey = @"expiredEvent"; +static NSString *const kABTExperimentDictionaryOriginKey = @"origin"; +static NSString *const kABTExperimentDictionaryTimedOutEventKey = @"timedOutEvent"; +static NSString *const kABTExperimentDictionaryTimeToLiveKey = @"timeToLive"; +static NSString *const kABTExperimentDictionaryTriggeredEventKey = @"triggeredEvent"; +static NSString *const kABTExperimentDictionaryTriggeredEventNameKey = @"triggerEventName"; +static NSString *const kABTExperimentDictionaryTriggerTimeoutKey = @"triggerTimeout"; +static NSString *const kABTExperimentDictionaryVariantIDKey = @"value"; + +#pragma mark - Keys for event dictionaries. + +static NSString *const kABTEventDictionaryNameKey = @"name"; +static NSString *const kABTEventDictionaryOriginKey = @"origin"; +static NSString *const kABTEventDictionaryParametersKey = @"parameters"; +static NSString *const kABTEventDictionaryTimestampKey = @"timestamp"; + +#pragma mark - Errors + +static NSString *const kABTErrorDomain = @"com.google.abtesting"; + +typedef NS_ENUM(NSUInteger, ABTInternalErrorCode) { + kABTInternalErrorFailedToFetchConditionalUserProperties = 1 +}; diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/ABTExperimentPayload.m b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/ABTExperimentPayload.m new file mode 100644 index 00000000..823193fe --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/ABTExperimentPayload.m @@ -0,0 +1,151 @@ +// Copyright 2020 Google LLC +// +// 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 "FirebaseABTesting/Sources/Private/ABTExperimentPayload.h" + +static NSString *const kExperimentPayloadKeyExperimentID = @"experimentId"; +static NSString *const kExperimentPayloadKeyVariantID = @"variantId"; + +// Start time can either be a date string or integer (milliseconds since 1970). +static NSString *const kExperimentPayloadKeyExperimentStartTime = @"experimentStartTime"; +static NSString *const kExperimentPayloadKeyExperimentStartTimeMillis = + @"experimentStartTimeMillis"; +static NSString *const kExperimentPayloadKeyTriggerEvent = @"triggerEvent"; +static NSString *const kExperimentPayloadKeyTriggerTimeoutMillis = @"triggerTimeoutMillis"; +static NSString *const kExperimentPayloadKeyTimeToLiveMillis = @"timeToLiveMillis"; +static NSString *const kExperimentPayloadKeySetEventToLog = @"setEventToLog"; +static NSString *const kExperimentPayloadKeyActivateEventToLog = @"activateEventToLog"; +static NSString *const kExperimentPayloadKeyClearEventToLog = @"clearEventToLog"; +static NSString *const kExperimentPayloadKeyTimeoutEventToLog = @"timeoutEventToLog"; +static NSString *const kExperimentPayloadKeyTTLExpiryEventToLog = @"ttlExpiryEventToLog"; + +static NSString *const kExperimentPayloadKeyOverflowPolicy = @"overflowPolicy"; +static NSString *const kExperimentPayloadValueDiscardOldestOverflowPolicy = @"DISCARD_OLDEST"; +static NSString *const kExperimentPayloadValueIgnoreNewestOverflowPolicy = @"IGNORE_NEWEST"; + +static NSString *const kExperimentPayloadKeyOngoingExperiments = @"ongoingExperiments"; + +@implementation ABTExperimentLite + +- (instancetype)initWithExperimentId:(NSString *)experimentId { + if (self = [super init]) { + _experimentId = experimentId; + } + return self; +} + +@end + +@implementation ABTExperimentPayload + ++ (NSDateFormatter *)experimentStartTimeFormatter { + NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; + [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"]; + [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; + // Locale needs to be hardcoded. See + // https://developer.apple.com/library/ios/#qa/qa1480/_index.html for more details. + [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; + [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; + return dateFormatter; +} + ++ (instancetype)parseFromData:(NSData *)data { + NSError *error; + NSDictionary *experimentDictionary = + [NSJSONSerialization JSONObjectWithData:data + options:NSJSONReadingAllowFragments + error:&error]; + if (error != nil) { + return nil; + } else { + return [[ABTExperimentPayload alloc] initWithDictionary:experimentDictionary]; + } +} + +- (instancetype)initWithDictionary:(NSDictionary<NSString *, id> *)dictionary { + if (self = [super init]) { + _experimentId = dictionary[kExperimentPayloadKeyExperimentID]; + _variantId = dictionary[kExperimentPayloadKeyVariantID]; + _triggerEvent = dictionary[kExperimentPayloadKeyTriggerEvent]; + _setEventToLog = dictionary[kExperimentPayloadKeySetEventToLog]; + _activateEventToLog = dictionary[kExperimentPayloadKeyActivateEventToLog]; + _clearEventToLog = dictionary[kExperimentPayloadKeyClearEventToLog]; + _timeoutEventToLog = dictionary[kExperimentPayloadKeyTimeoutEventToLog]; + _ttlExpiryEventToLog = dictionary[kExperimentPayloadKeyTTLExpiryEventToLog]; + + // Experiment start time can either be in the form of a date string or milliseconds since 1970. + if (dictionary[kExperimentPayloadKeyExperimentStartTime]) { + // Convert from date string. + NSDate *experimentStartTime = [[[self class] experimentStartTimeFormatter] + dateFromString:dictionary[kExperimentPayloadKeyExperimentStartTime]]; + _experimentStartTimeMillis = + [@([experimentStartTime timeIntervalSince1970] * 1000) longLongValue]; + } else if (dictionary[kExperimentPayloadKeyExperimentStartTimeMillis]) { + // Simply store milliseconds. + _experimentStartTimeMillis = + [dictionary[kExperimentPayloadKeyExperimentStartTimeMillis] longLongValue]; + ; + } + + _triggerTimeoutMillis = [dictionary[kExperimentPayloadKeyTriggerTimeoutMillis] longLongValue]; + _timeToLiveMillis = [dictionary[kExperimentPayloadKeyTimeToLiveMillis] longLongValue]; + + // Overflow policy can be an integer, or string e.g. "DISCARD_OLDEST" or "IGNORE_NEWEST". + if ([dictionary[kExperimentPayloadKeyOverflowPolicy] isKindOfClass:[NSString class]]) { + // If it's a string, pick against the preset string values. + NSString *policy = dictionary[kExperimentPayloadKeyOverflowPolicy]; + if ([policy isEqualToString:kExperimentPayloadValueDiscardOldestOverflowPolicy]) { + _overflowPolicy = ABTExperimentPayloadExperimentOverflowPolicyDiscardOldest; + } else if ([policy isEqualToString:kExperimentPayloadValueIgnoreNewestOverflowPolicy]) { + _overflowPolicy = ABTExperimentPayloadExperimentOverflowPolicyIgnoreNewest; + } else { + _overflowPolicy = ABTExperimentPayloadExperimentOverflowPolicyUnrecognizedValue; + } + } else { + _overflowPolicy = [dictionary[kExperimentPayloadKeyOverflowPolicy] intValue]; + } + + NSMutableArray<ABTExperimentLite *> *ongoingExperiments = [[NSMutableArray alloc] init]; + + NSArray<NSDictionary<NSString *, NSString *> *> *ongoingExperimentsArray = + dictionary[kExperimentPayloadKeyOngoingExperiments]; + + for (NSDictionary<NSString *, NSString *> *experimentDictionary in ongoingExperimentsArray) { + NSString *experimentId = experimentDictionary[kExperimentPayloadKeyExperimentID]; + if (experimentId) { + ABTExperimentLite *liteExperiment = + [[ABTExperimentLite alloc] initWithExperimentId:experimentId]; + [ongoingExperiments addObject:liteExperiment]; + } + } + + _ongoingExperiments = [ongoingExperiments copy]; + } + return self; +} + +- (void)clearTriggerEvent { + _triggerEvent = nil; +} + +- (BOOL)overflowPolicyIsValid { + return self.overflowPolicy == ABTExperimentPayloadExperimentOverflowPolicyIgnoreNewest || + self.overflowPolicy == ABTExperimentPayloadExperimentOverflowPolicyDiscardOldest; +} + +- (void)setOverflowPolicy:(ABTExperimentPayloadExperimentOverflowPolicy)overflowPolicy { + _overflowPolicy = overflowPolicy; +} + +@end diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/FIRExperimentController.m b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/FIRExperimentController.m new file mode 100644 index 00000000..c2e47ea3 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/FIRExperimentController.m @@ -0,0 +1,337 @@ +// 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 "FirebaseABTesting/Sources/Public/FIRExperimentController.h" + +#import "FirebaseABTesting/Sources/ABTConditionalUserPropertyController.h" +#import "FirebaseABTesting/Sources/ABTConstants.h" +#import "FirebaseABTesting/Sources/Private/ABTExperimentPayload.h" +#import "FirebaseABTesting/Sources/Public/FIRLifecycleEvents.h" +#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h" + +#import "Interop/Analytics/Public/FIRAnalyticsInterop.h" + +#ifndef FIRABTesting_VERSION +#error "FIRABTesting_VERSION is not defined: \ +add -DFIRABTesting_VERSION=... to the build invocation" +#endif + +// The following two macros supply the incantation so that the C +// preprocessor does not try to parse the version as a floating +// point number. See +// https://www.guyrutenberg.com/2008/12/20/expanding-macros-into-string-constants-in-c/ +#define STR(x) STR_EXPAND(x) +#define STR_EXPAND(x) #x + +/// Default experiment overflow policy. +const ABTExperimentPayloadExperimentOverflowPolicy FIRDefaultExperimentOverflowPolicy = + ABTExperimentPayloadExperimentOverflowPolicyDiscardOldest; + +/// Deserialize the experiment payloads. +ABTExperimentPayload *ABTDeserializeExperimentPayload(NSData *payload) { + // Verify that we have a JSON object. + NSError *error; + id JSONObject = [NSJSONSerialization JSONObjectWithData:payload options:kNilOptions error:&error]; + if (JSONObject == nil) { + FIRLogError(kFIRLoggerABTesting, @"I-ABT000001", @"Failed to parse experiment payload: %@", + error.debugDescription); + } + return [ABTExperimentPayload parseFromData:payload]; +} + +/// Returns a list of experiments to be set given the payloads and current list of experiments from +/// Firebase Analytics. If an experiment is in payloads but not in experiments, it should be set to +/// Firebase Analytics. +NSArray<ABTExperimentPayload *> *ABTExperimentsToSetFromPayloads( + NSArray<NSData *> *payloads, + NSArray<NSDictionary<NSString *, NSString *> *> *experiments, + id<FIRAnalyticsInterop> _Nullable analytics) { + NSArray<NSData *> *payloadsCopy = [payloads copy]; + NSArray *experimentsCopy = [experiments copy]; + NSMutableArray *experimentsToSet = [[NSMutableArray alloc] init]; + ABTConditionalUserPropertyController *controller = + [ABTConditionalUserPropertyController sharedInstanceWithAnalytics:analytics]; + + // Check if the experiment is in payloads but not in experiments. + for (NSData *payload in payloadsCopy) { + ABTExperimentPayload *experimentPayload = ABTDeserializeExperimentPayload(payload); + if (!experimentPayload) { + FIRLogInfo(kFIRLoggerABTesting, @"I-ABT000002", + @"Either payload is not set or it cannot be deserialized."); + continue; + } + + BOOL isExperimentSet = NO; + for (id experiment in experimentsCopy) { + if ([controller isExperiment:experiment theSameAsPayload:experimentPayload]) { + isExperimentSet = YES; + break; + } + } + + if (!isExperimentSet) { + [experimentsToSet addObject:experimentPayload]; + } + } + return [experimentsToSet copy]; +} + +/// Returns a list of experiments to be cleared given the payloads and current list of +/// experiments from Firebase Analytics. If an experiment is in experiments but not in payloads, it +/// should be cleared in Firebase Analytics. +NSArray *ABTExperimentsToClearFromPayloads( + NSArray<NSData *> *payloads, + NSArray<NSDictionary<NSString *, NSString *> *> *experiments, + id<FIRAnalyticsInterop> _Nullable analytics) { + NSMutableArray *experimentsToClear = [[NSMutableArray alloc] init]; + ABTConditionalUserPropertyController *controller = + [ABTConditionalUserPropertyController sharedInstanceWithAnalytics:analytics]; + + // Check if the experiment is in experiments but not payloads. + for (id experiment in experiments) { + BOOL doesExperimentNoLongerExist = YES; + for (NSData *payload in payloads) { + ABTExperimentPayload *experimentPayload = ABTDeserializeExperimentPayload(payload); + if (!experimentPayload) { + FIRLogInfo(kFIRLoggerABTesting, @"I-ABT000002", + @"Either payload is not set or it cannot be deserialized."); + continue; + } + + if ([controller isExperiment:experiment theSameAsPayload:experimentPayload]) { + doesExperimentNoLongerExist = NO; + } + } + if (doesExperimentNoLongerExist) { + [experimentsToClear addObject:experiment]; + } + } + return experimentsToClear; +} + +// ABT doesn't provide any functionality to other components, +// so it provides a private, empty protocol that it conforms to and use it for registration. + +@protocol FIRABTInstanceProvider +@end + +@interface FIRExperimentController () <FIRABTInstanceProvider, FIRLibrary> +@property(nonatomic, readwrite, strong) id<FIRAnalyticsInterop> _Nullable analytics; +@end + +@implementation FIRExperimentController + ++ (void)load { + [FIRApp registerInternalLibrary:(Class<FIRLibrary>)self + withName:@"fire-abt" + withVersion:[NSString stringWithUTF8String:STR(FIRABTesting_VERSION)]]; +} + ++ (nonnull NSArray<FIRComponent *> *)componentsToRegister { + FIRDependency *analyticsDep = [FIRDependency dependencyWithProtocol:@protocol(FIRAnalyticsInterop) + isRequired:NO]; + FIRComponentCreationBlock creationBlock = + ^id _Nullable(FIRComponentContainer *container, BOOL *isCacheable) { + // Ensure it's cached so it returns the same instance every time ABTesting is called. + *isCacheable = YES; + id<FIRAnalyticsInterop> analytics = FIR_COMPONENT(FIRAnalyticsInterop, container); + return [[FIRExperimentController alloc] initWithAnalytics:analytics]; + }; + FIRComponent *abtProvider = [FIRComponent componentWithProtocol:@protocol(FIRABTInstanceProvider) + instantiationTiming:FIRInstantiationTimingLazy + dependencies:@[ analyticsDep ] + creationBlock:creationBlock]; + + return @[ abtProvider ]; +} + +- (instancetype)initWithAnalytics:(nullable id<FIRAnalyticsInterop>)analytics { + self = [super init]; + if (self != nil) { + _analytics = analytics; + } + return self; +} + ++ (FIRExperimentController *)sharedInstance { + FIRApp *defaultApp = [FIRApp defaultApp]; // Missing configure will be logged here. + id<FIRABTInstanceProvider> instance = FIR_COMPONENT(FIRABTInstanceProvider, defaultApp.container); + + // We know the instance coming from the container is a FIRExperimentController instance, cast it. + return (FIRExperimentController *)instance; +} + +- (void)updateExperimentsWithServiceOrigin:(NSString *)origin + events:(FIRLifecycleEvents *)events + policy:(ABTExperimentPayloadExperimentOverflowPolicy)policy + lastStartTime:(NSTimeInterval)lastStartTime + payloads:(NSArray<NSData *> *)payloads + completionHandler: + (nullable void (^)(NSError *_Nullable error))completionHandler { + FIRExperimentController *__weak weakSelf = self; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ + FIRExperimentController *strongSelf = weakSelf; + [strongSelf updateExperimentConditionalUserPropertiesWithServiceOrigin:origin + events:events + policy:policy + lastStartTime:lastStartTime + payloads:payloads + completionHandler:completionHandler]; + }); +} + +- (void)updateExperimentsWithServiceOrigin:(NSString *)origin + events:(FIRLifecycleEvents *)events + policy:(ABTExperimentPayloadExperimentOverflowPolicy)policy + lastStartTime:(NSTimeInterval)lastStartTime + payloads:(NSArray<NSData *> *)payloads { + [self updateExperimentsWithServiceOrigin:origin + events:events + policy:policy + lastStartTime:lastStartTime + payloads:payloads + completionHandler:nil]; +} + +- (void) + updateExperimentConditionalUserPropertiesWithServiceOrigin:(NSString *)origin + events:(FIRLifecycleEvents *)events + policy: + (ABTExperimentPayloadExperimentOverflowPolicy) + policy + lastStartTime:(NSTimeInterval)lastStartTime + payloads:(NSArray<NSData *> *)payloads + completionHandler: + (nullable void (^)(NSError *_Nullable error)) + completionHandler { + ABTConditionalUserPropertyController *controller = + [ABTConditionalUserPropertyController sharedInstanceWithAnalytics:_analytics]; + + // Get the list of expriments from Firebase Analytics. + NSArray *experiments = [controller experimentsWithOrigin:origin]; + if (!experiments) { + NSString *errorDescription = + @"Failed to get conditional user properties from Firebase Analytics."; + FIRLogInfo(kFIRLoggerABTesting, @"I-ABT000003", @"%@", errorDescription); + + if (completionHandler) { + completionHandler([NSError + errorWithDomain:kABTErrorDomain + code:kABTInternalErrorFailedToFetchConditionalUserProperties + userInfo:@{NSLocalizedDescriptionKey : errorDescription}]); + } + + return; + } + NSArray<ABTExperimentPayload *> *experimentsToSet = + ABTExperimentsToSetFromPayloads(payloads, experiments, _analytics); + NSArray<NSDictionary<NSString *, NSString *> *> *experimentsToClear = + ABTExperimentsToClearFromPayloads(payloads, experiments, _analytics); + + for (id experiment in experimentsToClear) { + NSString *experimentID = [controller experimentIDOfExperiment:experiment]; + NSString *variantID = [controller variantIDOfExperiment:experiment]; + [controller clearExperiment:experimentID + variantID:variantID + withOrigin:origin + payload:nil + events:events]; + } + + for (ABTExperimentPayload *experimentPayload in experimentsToSet) { + if (experimentPayload.experimentStartTimeMillis > lastStartTime * ABT_MSEC_PER_SEC) { + [controller setExperimentWithOrigin:origin + payload:experimentPayload + events:events + policy:policy]; + FIRLogInfo(kFIRLoggerABTesting, @"I-ABT000008", + @"Set Experiment ID %@, variant ID %@ to Firebase Analytics.", + experimentPayload.experimentId, experimentPayload.variantId); + + } else { + FIRLogInfo(kFIRLoggerABTesting, @"I-ABT000009", + @"Not setting experiment ID %@, variant ID %@ due to the last update time %lld.", + experimentPayload.experimentId, experimentPayload.variantId, + (long)lastStartTime * ABT_MSEC_PER_SEC); + } + } + + if (completionHandler) { + completionHandler(nil); + } +} + +- (NSTimeInterval)latestExperimentStartTimestampBetweenTimestamp:(NSTimeInterval)timestamp + andPayloads:(NSArray<NSData *> *)payloads { + for (NSData *payload in [payloads copy]) { + ABTExperimentPayload *experimentPayload = ABTDeserializeExperimentPayload(payload); + if (!experimentPayload) { + FIRLogInfo(kFIRLoggerABTesting, @"I-ABT000002", + @"Either payload is not set or it cannot be deserialized."); + continue; + } + if (experimentPayload.experimentStartTimeMillis > timestamp * ABT_MSEC_PER_SEC) { + timestamp = (double)(experimentPayload.experimentStartTimeMillis / ABT_MSEC_PER_SEC); + } + } + return timestamp; +} + +- (void)validateRunningExperimentsForServiceOrigin:(NSString *)origin + runningExperimentPayloads:(NSArray<ABTExperimentPayload *> *)payloads { + ABTConditionalUserPropertyController *controller = + [ABTConditionalUserPropertyController sharedInstanceWithAnalytics:_analytics]; + + FIRLifecycleEvents *lifecycleEvents = [[FIRLifecycleEvents alloc] init]; + + // Get the list of experiments from Firebase Analytics. + NSArray<NSDictionary<NSString *, NSString *> *> *activeExperiments = + [controller experimentsWithOrigin:origin]; + + NSMutableSet *runningExperimentIDs = [NSMutableSet setWithCapacity:payloads.count]; + for (ABTExperimentPayload *payload in payloads) { + [runningExperimentIDs addObject:payload.experimentId]; + } + + for (NSDictionary<NSString *, NSString *> *activeExperimentDictionary in activeExperiments) { + NSString *experimentID = activeExperimentDictionary[@"name"]; + if (![runningExperimentIDs containsObject:experimentID]) { + NSString *variantID = activeExperimentDictionary[@"value"]; + + [controller clearExperiment:experimentID + variantID:variantID + withOrigin:origin + payload:nil + events:lifecycleEvents]; + } + } +} + +- (void)activateExperiment:(ABTExperimentPayload *)experimentPayload + forServiceOrigin:(NSString *)origin { + ABTConditionalUserPropertyController *controller = + [ABTConditionalUserPropertyController sharedInstanceWithAnalytics:_analytics]; + + FIRLifecycleEvents *lifecycleEvents = [[FIRLifecycleEvents alloc] init]; + + // Ensure that trigger event is nil, which will immediately set the experiment to active. + [experimentPayload clearTriggerEvent]; + + [controller setExperimentWithOrigin:origin + payload:experimentPayload + events:lifecycleEvents + policy:experimentPayload.overflowPolicy]; +} + +@end diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/FIRLifecycleEvents.m b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/FIRLifecycleEvents.m new file mode 100644 index 00000000..83dfc7e0 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/FIRLifecycleEvents.m @@ -0,0 +1,88 @@ +// 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 "FirebaseABTesting/Sources/Public/FIRLifecycleEvents.h" + +#import "FirebaseABTesting/Sources/Public/FIRExperimentController.h" + +/// Default name of the analytics event to be logged when an experiment is set. +NSString *const FIRSetExperimentEventName = @"_exp_set"; +/// Default name of the analytics event to be logged when an experiment is activated. +NSString *const FIRActivateExperimentEventName = @"_exp_activate"; +/// Default name of the analytics event to be logged when an experiment is cleared. +NSString *const FIRClearExperimentEventName = @"_exp_clear"; +/// Default name of the analytics event to be logged when an experiment times out for being +/// activated. +NSString *const FIRTimeoutExperimentEventName = @"_exp_timeout"; +/// Default name of the analytics event to be logged when an experiment is expired as it reaches the +/// end of TTL. +NSString *const FIRExpireExperimentEventName = @"_exp_expire"; +/// Prefix for lifecycle event names. +static NSString *const kLifecycleEventPrefix = @"_"; + +@implementation FIRLifecycleEvents +- (instancetype)init { + self = [super init]; + if (self) { + _setExperimentEventName = FIRSetExperimentEventName; + _activateExperimentEventName = FIRActivateExperimentEventName; + _clearExperimentEventName = FIRClearExperimentEventName; + _timeoutExperimentEventName = FIRTimeoutExperimentEventName; + _expireExperimentEventName = FIRExpireExperimentEventName; + } + return self; +} + +- (void)setSetExperimentEventName:(NSString *)setExperimentEventName { + if (setExperimentEventName && [setExperimentEventName hasPrefix:kLifecycleEventPrefix]) { + _setExperimentEventName = setExperimentEventName; + } else { + _setExperimentEventName = FIRSetExperimentEventName; + } +} + +- (void)setActivateExperimentEventName:(NSString *)activateExperimentEventName { + if (activateExperimentEventName && + [activateExperimentEventName hasPrefix:kLifecycleEventPrefix]) { + _activateExperimentEventName = activateExperimentEventName; + } else { + _activateExperimentEventName = FIRActivateExperimentEventName; + } +} + +- (void)setClearExperimentEventName:(NSString *)clearExperimentEventName { + if (clearExperimentEventName && [clearExperimentEventName hasPrefix:kLifecycleEventPrefix]) { + _clearExperimentEventName = clearExperimentEventName; + } else { + _clearExperimentEventName = FIRClearExperimentEventName; + } +} + +- (void)setTimeoutExperimentEventName:(NSString *)timeoutExperimentEventName { + if (timeoutExperimentEventName && [timeoutExperimentEventName hasPrefix:kLifecycleEventPrefix]) { + _timeoutExperimentEventName = timeoutExperimentEventName; + } else { + _timeoutExperimentEventName = FIRTimeoutExperimentEventName; + } +} + +- (void)setExpireExperimentEventName:(NSString *)expireExperimentEventName { + if (expireExperimentEventName && [_timeoutExperimentEventName hasPrefix:kLifecycleEventPrefix]) { + _expireExperimentEventName = expireExperimentEventName; + } else { + _expireExperimentEventName = FIRExpireExperimentEventName; + } +} + +@end diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/Private/ABTExperimentPayload.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/Private/ABTExperimentPayload.h new file mode 100644 index 00000000..f550a0a0 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/Private/ABTExperimentPayload.h @@ -0,0 +1,96 @@ +// Copyright 2020 Google LLC +// +// 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 + +/// Policy for handling the case where there's an overflow of experiments for an installation +/// instance. +typedef NS_ENUM(int32_t, ABTExperimentPayloadExperimentOverflowPolicy) { + ABTExperimentPayloadExperimentOverflowPolicyUnrecognizedValue = 999, + ABTExperimentPayloadExperimentOverflowPolicyUnspecified = 0, + ABTExperimentPayloadExperimentOverflowPolicyDiscardOldest = 1, + ABTExperimentPayloadExperimentOverflowPolicyIgnoreNewest = 2, +}; + +@interface ABTExperimentLite : NSObject +@property(nonatomic, readonly, copy) NSString *experimentId; + +- (instancetype)initWithExperimentId:(NSString *)experimentId NS_DESIGNATED_INITIALIZER; + +- (instancetype)init NS_UNAVAILABLE; + +@end + +@interface ABTExperimentPayload : NSObject + +/// Unique identifier for this experiment. +@property(nonatomic, readonly, copy) NSString *experimentId; + +/// Unique identifier for the variant to which an installation instance has been assigned. +@property(nonatomic, readonly, copy) NSString *variantId; + +/// Epoch time that represents when the experiment was started. +@property(nonatomic, readonly) int64_t experimentStartTimeMillis; + +/// The event that triggers this experiment into ON state. +@property(nonatomic, nullable, readonly, copy) NSString *triggerEvent; + +/// Duration in milliseconds for which the experiment can stay in STANDBY state (un-triggered). +@property(nonatomic, readonly) int64_t triggerTimeoutMillis; + +/// Duration in milliseconds for which the experiment can stay in ON state (triggered). +@property(nonatomic, readonly) int64_t timeToLiveMillis; + +/// The event logged when impact service sets the experiment. +@property(nonatomic, readonly, copy) NSString *setEventToLog; + +/// The event logged when an experiment goes to the ON state. +@property(nonatomic, readonly, copy) NSString *activateEventToLog; + +/// The event logged when an experiment is cleared. +@property(nonatomic, readonly, copy) NSString *clearEventToLog; + +/// The event logged when an experiment times out after `triggerTimeoutMillis` milliseconds. +@property(nonatomic, readonly, copy) NSString *timeoutEventToLog; + +/// The event logged when an experiment times out after `timeToLiveMillis` milliseconds. +@property(nonatomic, readonly, copy) NSString *ttlExpiryEventToLog; + +@property(nonatomic, readonly) ABTExperimentPayloadExperimentOverflowPolicy overflowPolicy; + +/// A list of all other ongoing (started, and not yet stopped) experiments at the time this +/// experiment was started. Does not include this experiment; only the others. +@property(nonatomic, readonly) NSArray<ABTExperimentLite *> *ongoingExperiments; + +/// Parses an ABTExperimentPayload directly from JSON data. +/// @param data JSON object as NSData. Must be reconstructible as an NSDictionary<NSString* , id>. ++ (instancetype)parseFromData:(NSData *)data; + +/// Initializes an ABTExperimentPayload from a dictionary with experiment metadata. +- (instancetype)initWithDictionary:(NSDictionary<NSString *, id> *)dictionary + NS_DESIGNATED_INITIALIZER; + +- (instancetype)init NS_UNAVAILABLE; + +/// Clears the trigger event associated with this payload. +- (void)clearTriggerEvent; + +/// Checks if the overflow policy is a valid enum object. +- (BOOL)overflowPolicyIsValid; + +@end + +NS_ASSUME_NONNULL_END diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/Private/FirebaseABTestingInternal.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/Private/FirebaseABTestingInternal.h new file mode 100644 index 00000000..c132d86e --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/Private/FirebaseABTestingInternal.h @@ -0,0 +1,24 @@ +// Copyright 2020 Google LLC +// +// 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. + +// An umbrella header, for any other libraries in this repo to access Firebase Public and Private +// headers. Any package manager complexity should be handled here. + +#if SWIFT_PACKAGE +@import FirebaseABTesting; +#else +#import <FirebaseABTesting/FirebaseABTesting.h> +#endif + +#import "FirebaseABTesting/Sources/Private/ABTExperimentPayload.h" diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/Public/FIRExperimentController.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/Public/FIRExperimentController.h new file mode 100644 index 00000000..acff7392 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/Public/FIRExperimentController.h @@ -0,0 +1,103 @@ +// 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> + +@class ABTExperimentPayload; + +// Forward declaration to avoid importing into the module header +typedef NS_ENUM(int32_t, ABTExperimentPayloadExperimentOverflowPolicy); + +NS_ASSUME_NONNULL_BEGIN + +@class FIRLifecycleEvents; + +/// The default experiment overflow policy, that is to discard the experiment with the oldest start +/// time when users start the experiment on the web console. +extern const ABTExperimentPayloadExperimentOverflowPolicy FIRDefaultExperimentOverflowPolicy; + +/// This class is for Firebase services to handle experiments updates to Firebase Analytics. +/// Experiments can be set, cleared and updated through this controller. +NS_SWIFT_NAME(ExperimentController) +@interface FIRExperimentController : NSObject + +/// Returns the FIRExperimentController singleton. ++ (FIRExperimentController *)sharedInstance; + +/// Updates the list of experiments with an optional completion handler. Experiments already +/// existing in payloads are not affected, whose state and payload is preserved. This method +/// compares whether the experiments have changed or not by their variant ID. This runs in a +/// background queue and calls the completion handler when finished executing. +/// @param origin The originating service affected by the experiment. +/// @param events A list of event names to be used for logging experiment lifecycle events, +/// if they are not defined in the payload. +/// @param policy The policy to handle new experiments when slots are full. +/// @param lastStartTime The last known experiment start timestamp for this affected service. +/// (Timestamps are specified by the number of seconds from 00:00:00 UTC on 1 +/// January 1970.). +/// @param payloads List of experiment metadata. +/// @param completionHandler Code to be executed after experiments are updated in the background +/// thread. +- (void)updateExperimentsWithServiceOrigin:(NSString *)origin + events:(FIRLifecycleEvents *)events + policy:(ABTExperimentPayloadExperimentOverflowPolicy)policy + lastStartTime:(NSTimeInterval)lastStartTime + payloads:(NSArray<NSData *> *)payloads + completionHandler: + (nullable void (^)(NSError *_Nullable error))completionHandler; + +/// Updates the list of experiments. Experiments already +/// existing in payloads are not affected, whose state and payload is preserved. This method +/// compares whether the experiments have changed or not by their variant ID. This runs in a +/// background queue.. +/// @param origin The originating service affected by the experiment. +/// @param events A list of event names to be used for logging experiment lifecycle events, +/// if they are not defined in the payload. +/// @param policy The policy to handle new experiments when slots are full. +/// @param lastStartTime The last known experiment start timestamp for this affected service. +/// (Timestamps are specified by the number of seconds from 00:00:00 UTC on 1 +/// January 1970.). +/// @param payloads List of experiment metadata. +- (void)updateExperimentsWithServiceOrigin:(NSString *)origin + events:(FIRLifecycleEvents *)events + policy:(ABTExperimentPayloadExperimentOverflowPolicy)policy + lastStartTime:(NSTimeInterval)lastStartTime + payloads:(NSArray<NSData *> *)payloads + DEPRECATED_MSG_ATTRIBUTE("Please use updateExperimentsWithServiceOrigin:events:policy:" + "lastStartTime:payloads:completionHandler: instead."); + +/// Returns the latest experiment start timestamp given a current latest timestamp and a list of +/// experiment payloads. Timestamps are specified by the number of seconds from 00:00:00 UTC on 1 +/// January 1970. +/// @param timestamp Current latest experiment start timestamp. If not known, affected service +/// should specify -1; +/// @param payloads List of experiment metadata. +- (NSTimeInterval)latestExperimentStartTimestampBetweenTimestamp:(NSTimeInterval)timestamp + andPayloads:(NSArray<NSData *> *)payloads; + +/// Expires experiments that aren't in the list of running experiment payloads. +/// @param origin The originating service affected by the experiment. +/// @param payloads The list of valid, running experiments. +- (void)validateRunningExperimentsForServiceOrigin:(NSString *)origin + runningExperimentPayloads:(NSArray<ABTExperimentPayload *> *)payloads; + +/// Directly sets a given experiment to be active. +/// @param experimentPayload The payload for the experiment that should be activated. +/// @param origin The originating service affected by the experiment. +- (void)activateExperiment:(ABTExperimentPayload *)experimentPayload + forServiceOrigin:(NSString *)origin; + +@end + +NS_ASSUME_NONNULL_END diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/Public/FIRLifecycleEvents.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/Public/FIRLifecycleEvents.h new file mode 100644 index 00000000..889d0331 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/Public/FIRLifecycleEvents.h @@ -0,0 +1,63 @@ +// 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 + +/// Default event name for when an experiment is set. +extern NSString *const FIRSetExperimentEventName NS_SWIFT_NAME(DefaultSetExperimentEventName); +/// Default event name for when an experiment is activated. +extern NSString *const FIRActivateExperimentEventName + NS_SWIFT_NAME(DefaultActivateExperimentEventName); +/// Default event name for when an experiment is cleared. +extern NSString *const FIRClearExperimentEventName NS_SWIFT_NAME(DefaultClearExperimentEventName); +/// Default event name for when an experiment times out for being activated. +extern NSString *const FIRTimeoutExperimentEventName + NS_SWIFT_NAME(DefaultTimeoutExperimentEventName); +/// Default event name for when an experiment is expired as it reaches the end of TTL. +extern NSString *const FIRExpireExperimentEventName NS_SWIFT_NAME(DefaultExpireExperimentEventName); + +/// An Experiment Lifecycle Event Object that specifies the name of the experiment event to be +/// logged by Firebase Analytics. +NS_SWIFT_NAME(LifecycleEvents) +@interface FIRLifecycleEvents : NSObject + +/// Event name for when an experiment is set. It is default to FIRSetExperimentEventName and can be +/// overridden. If experiment payload has a valid string of this field, always use experiment +/// payload. +@property(nonatomic, copy) NSString *setExperimentEventName; + +/// Event name for when an experiment is activated. It is default to FIRActivateExperimentEventName +/// and can be overridden. If experiment payload has a valid string of this field, always use +/// experiment payload. +@property(nonatomic, copy) NSString *activateExperimentEventName; + +/// Event name for when an experiment is cleared. It is default to FIRClearExperimentEventName and +/// can be overridden. If experiment payload has a valid string of this field, always use experiment +/// payload. +@property(nonatomic, copy) NSString *clearExperimentEventName; +/// Event name for when an experiment is timeout from being STANDBY. It is default to +/// FIRTimeoutExperimentEventName and can be overridden. If experiment payload has a valid string +/// of this field, always use experiment payload. +@property(nonatomic, copy) NSString *timeoutExperimentEventName; + +/// Event name when an experiment is expired when it reaches the end of its TTL. +/// It is default to FIRExpireExperimentEventName and can be overridden. If experiment payload has a +/// valid string of this field, always use experiment payload. +@property(nonatomic, copy) NSString *expireExperimentEventName; + +@end + +NS_ASSUME_NONNULL_END diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/Public/FirebaseABTesting.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/Public/FirebaseABTesting.h new file mode 100755 index 00000000..cfa99b4a --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseABTesting/Sources/Public/FirebaseABTesting.h @@ -0,0 +1,16 @@ +// 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 "FIRExperimentController.h" +#import "FIRLifecycleEvents.h" diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRAppInternal.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRAppInternal.h new file mode 100644 index 00000000..9a0c943d --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRAppInternal.h @@ -0,0 +1,173 @@ +/* + * Copyright 2017 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. + */ + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIRApp.h" +#else +#import <FirebaseCore/FIRApp.h> +#endif + +// The has_include is a workaround so the old IID needed for the FIS tests can find FIRErrors.h +#if __has_include("FirebaseCore/Sources/Private/FIRErrors.h") +#import "FirebaseCore/Sources/Private/FIRErrors.h" +#else +#import <FirebaseCore/FIRErrors.h> +#endif + +@class FIRComponentContainer; +@protocol FIRLibrary; + +/** + * The internal interface to FIRApp. This is meant for first-party integrators, who need to receive + * FIRApp notifications, log info about the success or failure of their configuration, and access + * other internal functionality of FIRApp. + * + * TODO(b/28296561): Restructure this header. + */ +NS_ASSUME_NONNULL_BEGIN + +typedef NS_ENUM(NSInteger, FIRConfigType) { + FIRConfigTypeCore = 1, + FIRConfigTypeSDK = 2, +}; + +extern NSString *const kFIRDefaultAppName; +extern NSString *const kFIRAppReadyToConfigureSDKNotification; +extern NSString *const kFIRAppDeleteNotification; +extern NSString *const kFIRAppIsDefaultAppKey; +extern NSString *const kFIRAppNameKey; +extern NSString *const kFIRGoogleAppIDKey; + +/** + * The format string for the User Defaults key used for storing the data collection enabled flag. + * This includes formatting to append the Firebase App's name. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat; + +/** + * The plist key used for storing the data collection enabled flag. + */ +extern NSString *const kFIRGlobalAppDataCollectionEnabledPlistKey; + +/** + * A notification fired containing diagnostic information when SDK errors occur. + */ +extern NSString *const kFIRAppDiagnosticsNotification; + +/** @var FIRAuthStateDidChangeInternalNotification + @brief The name of the @c NSNotificationCenter notification which is posted when the auth state + changes (e.g. a new token has been produced, a user logs in or out). The object parameter of + the notification is a dictionary possibly containing the key: + @c FIRAuthStateDidChangeInternalNotificationTokenKey (the new access token.) If it does not + contain this key it indicates a sign-out event took place. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotification; + +/** @var FIRAuthStateDidChangeInternalNotificationTokenKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new access token. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationTokenKey; + +/** @var FIRAuthStateDidChangeInternalNotificationAppKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the FIRApp associated with the auth instance. + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationAppKey; + +/** @var FIRAuthStateDidChangeInternalNotificationUIDKey + @brief A key present in the dictionary object parameter of the + @c FIRAuthStateDidChangeInternalNotification notification. The value associated with this + key will contain the new user's UID (or nil if there is no longer a user signed in). + */ +extern NSString *const FIRAuthStateDidChangeInternalNotificationUIDKey; + +@interface FIRApp () + +/** + * A flag indicating if this is the default app (has the default app name). + */ +@property(nonatomic, readonly) BOOL isDefaultApp; + +/* + * The container of interop SDKs for this app. + */ +@property(nonatomic) FIRComponentContainer *container; + +/** + * Creates an error for failing to configure a subspec service. This method is called by each + * FIRApp notification listener. + */ ++ (NSError *)errorForSubspecConfigurationFailureWithDomain:(NSString *)domain + errorCode:(FIRErrorCode)code + service:(NSString *)service + reason:(NSString *)reason; +/** + * Checks if the default app is configured without trying to configure it. + */ ++ (BOOL)isDefaultAppConfigured; + +/** + * Registers a given third-party library with the given version number to be reported for + * analytics. + * + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerLibrary:(nonnull NSString *)name withVersion:(nonnull NSString *)version; + +/** + * Registers a given internal library with the given version number to be reported for + * analytics. + * + * @param library Optional parameter for component registration. + * @param name Name of the library. + * @param version Version of the library. + */ ++ (void)registerInternalLibrary:(nonnull Class<FIRLibrary>)library + withName:(nonnull NSString *)name + withVersion:(nonnull NSString *)version; + +/** + * A concatenated string representing all the third-party libraries and version numbers. + */ ++ (NSString *)firebaseUserAgent; + +/** + * Used by each SDK to send logs about SDK configuration status to Clearcut. + * + * @note This API is a no-op, please remove calls to it. + */ +- (void)sendLogsWithServiceName:(NSString *)serviceName + version:(NSString *)version + error:(NSError *)error; + +/** + * Can be used by the unit tests in eack SDK to reset FIRApp. This method is thread unsafe. + */ ++ (void)resetApps; + +/** + * Can be used by the unit tests in each SDK to set customized options. + */ +- (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRComponent.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRComponent.h new file mode 100644 index 00000000..cb51ee70 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRComponent.h @@ -0,0 +1,91 @@ +/* + * Copyright 2018 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> + +@class FIRApp; +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Provides a system to clean up cached instances returned from the component system. +NS_SWIFT_NAME(ComponentLifecycleMaintainer) +@protocol FIRComponentLifecycleMaintainer +/// The associated app will be deleted, clean up any resources as they are about to be deallocated. +- (void)appWillBeDeleted:(FIRApp *)app; +@end + +typedef _Nullable id (^FIRComponentCreationBlock)(FIRComponentContainer *container, + BOOL *isCacheable) + NS_SWIFT_NAME(ComponentCreationBlock); + +@class FIRDependency; + +/// Describes the timing of instantiation. Note: new components should default to lazy unless there +/// is a strong reason to be eager. +typedef NS_ENUM(NSInteger, FIRInstantiationTiming) { + FIRInstantiationTimingLazy, + FIRInstantiationTimingAlwaysEager, + FIRInstantiationTimingEagerInDefaultApp +} NS_SWIFT_NAME(InstantiationTiming); + +/// A component that can be used from other Firebase SDKs. +NS_SWIFT_NAME(Component) +@interface FIRComponent : NSObject + +/// The protocol describing functionality provided from the Component. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// The timing of instantiation. +@property(nonatomic, readonly) FIRInstantiationTiming instantiationTiming; + +/// An array of dependencies for the component. +@property(nonatomic, copy, readonly) NSArray<FIRDependency *> *dependencies; + +/// A block to instantiate an instance of the component with the appropriate dependencies. +@property(nonatomic, copy, readonly) FIRComponentCreationBlock creationBlock; + +// There's an issue with long NS_SWIFT_NAMES that causes compilation to fail, disable clang-format +// for the next two methods. +// clang-format off + +/// Creates a component with no dependencies that will be lazily initialized. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:creationBlock:)); + +/// Creates a component to be registered with the component container. +/// +/// @param protocol - The protocol describing functionality provided by the component. +/// @param instantiationTiming - When the component should be initialized. Use .lazy unless there's +/// a good reason to be instantiated earlier. +/// @param dependencies - Any dependencies the `implementingClass` has, optional or required. +/// @param creationBlock - A block to instantiate the component with a container, and if +/// @return A component that can be registered with the component container. ++ (instancetype)componentWithProtocol:(Protocol *)protocol + instantiationTiming:(FIRInstantiationTiming)instantiationTiming + dependencies:(NSArray<FIRDependency *> *)dependencies + creationBlock:(FIRComponentCreationBlock)creationBlock +NS_SWIFT_NAME(init(_:instantiationTiming:dependencies:creationBlock:)); + +// clang-format on + +/// Unavailable. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRComponentContainer.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRComponentContainer.h new file mode 100644 index 00000000..db2bafef --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRComponentContainer.h @@ -0,0 +1,50 @@ +/* + * Copyright 2018 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> + +// The has_include is a workaround so the old IID needed for the FIS tests can find the headers. +#if __has_include("FirebaseCore/Sources/Private/FIRComponentType.h") +#import "FirebaseCore/Sources/Private/FIRComponentType.h" +#import "FirebaseCore/Sources/Private/FIRLibrary.h" +#else +#import <FirebaseCore/FIRComponentType.h> +#import <FirebaseCore/FIRLibrary.h> +#endif + +NS_ASSUME_NONNULL_BEGIN + +/// A type-safe macro to retrieve a component from a container. This should be used to retrieve +/// components instead of using the container directly. +#define FIR_COMPONENT(type, container) \ + [FIRComponentType<id<type>> instanceForProtocol:@protocol(type) inContainer:container] + +@class FIRApp; + +/// A container that holds different components that are registered via the +/// `registerAsComponentRegistrant:` call. These classes should conform to `FIRComponentRegistrant` +/// in order to properly register components for Core. +NS_SWIFT_NAME(FirebaseComponentContainer) +@interface FIRComponentContainer : NSObject + +/// A weak reference to the app that an instance of the container belongs to. +@property(nonatomic, weak, readonly) FIRApp *app; + +/// Unavailable. Use the `container` property on `FIRApp`. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRComponentType.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRComponentType.h new file mode 100644 index 00000000..6f2aca7b --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRComponentType.h @@ -0,0 +1,34 @@ +/* + * Copyright 2018 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> + +@class FIRComponentContainer; + +NS_ASSUME_NONNULL_BEGIN + +/// Do not use directly. A placeholder type in order to provide a macro that will warn users of +/// mis-matched protocols. +NS_SWIFT_NAME(ComponentType) +@interface FIRComponentType<__covariant T> : NSObject + +/// Do not use directly. A factory method to retrieve an instance that provides a specific +/// functionality. ++ (T)instanceForProtocol:(Protocol *)protocol inContainer:(FIRComponentContainer *)container; + +@end + +NS_ASSUME_NONNULL_END diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h new file mode 100644 index 00000000..76c0c05f --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h @@ -0,0 +1,35 @@ +/* + * 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> + +@class FIRDiagnosticsData; +@class FIROptions; + +NS_ASSUME_NONNULL_BEGIN + +/** Connects FIRCore with the CoreDiagnostics library. */ +@interface FIRCoreDiagnosticsConnector : NSObject + +/** Logs FirebaseCore related data. + * + * @param options The options object containing data to log. + */ ++ (void)logCoreTelemetryWithOptions:(FIROptions *)options; + +@end + +NS_ASSUME_NONNULL_END diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRDependency.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRDependency.h new file mode 100644 index 00000000..46e9b7ea --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRDependency.h @@ -0,0 +1,45 @@ +/* + * Copyright 2018 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 + +/// A dependency on a specific protocol's functionality. +NS_SWIFT_NAME(Dependency) +@interface FIRDependency : NSObject + +/// The protocol describing functionality being depended on. +@property(nonatomic, strong, readonly) Protocol *protocol; + +/// A flag to specify if the dependency is required or not. +@property(nonatomic, readonly) BOOL isRequired; + +/// Initializes a dependency that is required. Calls `initWithProtocol:isRequired` with `YES` for +/// the required parameter. +/// Creates a required dependency on the specified protocol's functionality. ++ (instancetype)dependencyWithProtocol:(Protocol *)protocol; + +/// Creates a dependency on the specified protocol's functionality and specify if it's required for +/// the class's functionality. ++ (instancetype)dependencyWithProtocol:(Protocol *)protocol isRequired:(BOOL)required; + +/// Use `dependencyWithProtocol:isRequired:` instead. +- (instancetype)init NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRErrorCode.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRErrorCode.h new file mode 100644 index 00000000..c90d9eec --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRErrorCode.h @@ -0,0 +1,39 @@ +/* + * Copyright 2017 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. + */ + +/** Error codes in Firebase error domain. */ +typedef NS_ENUM(NSInteger, FIRErrorCode) { + /** + * Unknown error. + */ + FIRErrorCodeUnknown = 0, + /** + * Loading data from the GoogleService-Info.plist file failed. This is a fatal error and should + * not be ignored. Further calls to the API will fail and/or possibly cause crashes. + */ + FIRErrorCodeInvalidPlistFile = -100, + + /** + * Validating the Google App ID format failed. + */ + FIRErrorCodeInvalidAppID = -101, + + /** + * Error code for failing to configure a specific service. It's deprecated, but + * still used after copybara. + */ + FIRErrorCodeConfigFailed = -114, +}; diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRErrors.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRErrors.h new file mode 100644 index 00000000..19e47328 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRErrors.h @@ -0,0 +1,24 @@ +/* + * Copyright 2017 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> + +#include "FIRErrorCode.h" + +extern NSString *const kFirebaseErrorDomain; +extern NSString *const kFirebaseConfigErrorDomain; +extern NSString *const kFirebaseCoreErrorDomain; +extern NSString *const kFirebasePerfErrorDomain; diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h new file mode 100644 index 00000000..bfff73e5 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h @@ -0,0 +1,39 @@ +// 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 + +@interface FIRHeartbeatInfo : NSObject + +// Enum representing the different heartbeat codes. +typedef NS_ENUM(NSInteger, FIRHeartbeatInfoCode) { + FIRHeartbeatInfoCodeNone = 0, + FIRHeartbeatInfoCodeSDK = 1, + FIRHeartbeatInfoCodeGlobal = 2, + FIRHeartbeatInfoCodeCombined = 3, +}; + +/** + * Get heartbeat code requred for the sdk. + * @param heartbeatTag String representing the sdk heartbeat tag. + * @return Heartbeat code indicating whether or not an sdk/global heartbeat + * needs to be sent + */ ++ (FIRHeartbeatInfoCode)heartbeatCodeForTag:(NSString *)heartbeatTag; + +@end + +NS_ASSUME_NONNULL_END diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRLibrary.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRLibrary.h new file mode 100644 index 00000000..e7a9e077 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRLibrary.h @@ -0,0 +1,50 @@ +/* + * Copyright 2018 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. + */ + +#ifndef FIRLibrary_h +#define FIRLibrary_h + +#import <Foundation/Foundation.h> + +// The has_include is a workaround so the old IID needed for the FIS tests can find the headers. +#if __has_include("FirebaseCore/Sources/Private/FIRComponent.h") +#import "FirebaseCore/Sources/Private/FIRComponent.h" +#else +#import <FirebaseCore/FIRComponent.h> +#endif + +@class FIRApp; + +NS_ASSUME_NONNULL_BEGIN + +/// Provide an interface to register a library for userAgent logging and availability to others. +NS_SWIFT_NAME(Library) +@protocol FIRLibrary + +/// Returns one or more FIRComponents that will be registered in +/// FIRApp and participate in dependency resolution and injection. ++ (NSArray<FIRComponent *> *)componentsToRegister; + +@optional +/// Implement this method if the library needs notifications for lifecycle events. This method is +/// called when the developer calls `FirebaseApp.configure()`. ++ (void)configureWithApp:(FIRApp *)app; + +@end + +NS_ASSUME_NONNULL_END + +#endif /* FIRLibrary_h */ diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRLogger.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRLogger.h new file mode 100644 index 00000000..6fd77844 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIRLogger.h @@ -0,0 +1,156 @@ +/* + * Copyright 2017 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> + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIRLoggerLevel.h" +#else +#import <FirebaseCore/FIRLoggerLevel.h> +#endif + +NS_ASSUME_NONNULL_BEGIN + +/** + * The Firebase services used in Firebase logger. + */ +typedef NSString *const FIRLoggerService; + +extern FIRLoggerService kFIRLoggerABTesting; +extern FIRLoggerService kFIRLoggerAdMob; +extern FIRLoggerService kFIRLoggerAnalytics; +extern FIRLoggerService kFIRLoggerAuth; +extern FIRLoggerService kFIRLoggerCrash; +extern FIRLoggerService kFIRLoggerCore; +extern FIRLoggerService kFIRLoggerMLKit; +extern FIRLoggerService kFIRLoggerPerf; +extern FIRLoggerService kFIRLoggerRemoteConfig; + +/** + * The key used to store the logger's error count. + */ +extern NSString *const kFIRLoggerErrorCountKey; + +/** + * The key used to store the logger's warning count. + */ +extern NSString *const kFIRLoggerWarningCountKey; + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +/** + * Enables or disables Analytics debug mode. + * If set to YES, the logging level for Analytics will be set to FIRLoggerLevelDebug. + * Enabling the debug mode has no effect if the app is running from App Store. + * (required) analytics debug mode flag. + */ +void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode); + +/** + * Changes the default logging level of FIRLoggerLevelNotice to a user-specified level. + * The default level cannot be set above FIRLoggerLevelNotice if the app is running from App Store. + * (required) log level (one of the FIRLoggerLevel enum values). + */ +void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel); + +/** + * Checks if the specified logger level is loggable given the current settings. + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) whether or not this function is called from the Analytics component. + */ +BOOL FIRIsLoggableLevel(FIRLoggerLevel loggerLevel, BOOL analyticsComponent); + +/** + * Logs a message to the Xcode console and the device log. If running from AppStore, will + * not log any messages with a level higher than FIRLoggerLevelNotice to avoid log spamming. + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) service name of type FIRLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ +extern void FIRLogBasic(FIRLoggerLevel level, + FIRLoggerService service, + NSString *messageCode, + NSString *message, +// On 64-bit simulators, va_list is not a pointer, so cannot be marked nullable +// See: http://stackoverflow.com/q/29095469 +#if __LP64__ && TARGET_OS_SIMULATOR || TARGET_OS_OSX + va_list args_ptr +#else + va_list _Nullable args_ptr +#endif +); + +/** + * The following functions accept the following parameters in order: + * (required) service name of type FIRLoggerService. + * (required) message code starting from "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * See go/firebase-log-proposal for details. + * (required) message string which can be a format string. + * (optional) the list of arguments to substitute into the format string. + * Example usage: + * FIRLogError(kFIRLoggerCore, @"I-COR000001", @"Configuration of %@ failed.", app.name); + */ +extern void FIRLogError(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogWarning(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogNotice(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogInfo(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); +extern void FIRLogDebug(FIRLoggerService service, NSString *messageCode, NSString *message, ...) + NS_FORMAT_FUNCTION(3, 4); + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +@interface FIRLoggerWrapper : NSObject + +/** + * Objective-C wrapper for FIRLogBasic to allow weak linking to FIRLogger + * (required) log level (one of the FIRLoggerLevel enum values). + * (required) service name of type FIRLoggerService. + * (required) message code starting with "I-" which means iOS, followed by a capitalized + * three-character service identifier and a six digit integer message ID that is unique + * within the service. + * An example of the message code is @"I-COR000001". + * (required) message string which can be a format string. + * (optional) variable arguments list obtained from calling va_start, used when message is a format + * string. + */ + ++ (void)logWithLevel:(FIRLoggerLevel)level + withService:(FIRLoggerService)service + withCode:(NSString *)messageCode + withMessage:(NSString *)message + withArgs:(va_list)args; + +@end + +NS_ASSUME_NONNULL_END diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIROptionsInternal.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIROptionsInternal.h new file mode 100644 index 00000000..acaf4586 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FIROptionsInternal.h @@ -0,0 +1,119 @@ +/* + * Copyright 2017 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. + */ + +#if SWIFT_PACKAGE +// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM. +#import "FIROptions.h" +#else +#import <FirebaseCore/FIROptions.h> +#endif + +/** + * Keys for the strings in the plist file. + */ +extern NSString *const kFIRAPIKey; +extern NSString *const kFIRTrackingID; +extern NSString *const kFIRGoogleAppID; +extern NSString *const kFIRClientID; +extern NSString *const kFIRGCMSenderID; +extern NSString *const kFIRAndroidClientID; +extern NSString *const kFIRDatabaseURL; +extern NSString *const kFIRStorageBucket; +extern NSString *const kFIRBundleID; +extern NSString *const kFIRProjectID; + +/** + * Keys for the plist file name + */ +extern NSString *const kServiceInfoFileName; + +extern NSString *const kServiceInfoFileType; + +/** + * This header file exposes the initialization of FIROptions to internal use. + */ +@interface FIROptions () + +/** + * resetDefaultOptions and initInternalWithOptionsDictionary: are exposed only for unit tests. + */ ++ (void)resetDefaultOptions; + +/** + * Initializes the options with dictionary. The above strings are the keys of the dictionary. + * This is the designated initializer. + */ +- (instancetype)initInternalWithOptionsDictionary:(NSDictionary *)serviceInfoDictionary; + +/** + * defaultOptions and defaultOptionsDictionary are exposed in order to be used in FIRApp and + * other first party services. + */ ++ (FIROptions *)defaultOptions; + ++ (NSDictionary *)defaultOptionsDictionary; + +/** + * Indicates whether or not Analytics collection was explicitly enabled via a plist flag or at + * runtime. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionExplicitlySet; + +/** + * Whether or not Analytics Collection was enabled. Analytics Collection is enabled unless + * explicitly disabled in GoogleService-Info.plist. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionEnabled; + +/** + * Whether or not Analytics Collection was completely disabled. If YES, then + * isAnalyticsCollectionEnabled will be NO. + */ +@property(nonatomic, readonly) BOOL isAnalyticsCollectionDeactivated; + +/** + * The version ID of the client library, e.g. @"1100000". + */ +@property(nonatomic, readonly, copy) NSString *libraryVersionID; + +/** + * The flag indicating whether this object was constructed with the values in the default plist + * file. + */ +@property(nonatomic) BOOL usingOptionsFromDefaultPlist; + +/** + * Whether or not Measurement was enabled. Measurement is enabled unless explicitly disabled in + * GoogleService-Info.plist. + */ +@property(nonatomic, readonly) BOOL isMeasurementEnabled; + +/** + * Whether or not Analytics was enabled in the developer console. + */ +@property(nonatomic, readonly) BOOL isAnalyticsEnabled; + +/** + * Whether or not SignIn was enabled in the developer console. + */ +@property(nonatomic, readonly) BOOL isSignInEnabled; + +/** + * Whether or not editing is locked. This should occur after FIROptions has been set on a FIRApp. + */ +@property(nonatomic, getter=isEditingLocked) BOOL editingLocked; + +@end diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FirebaseCoreInternal.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FirebaseCoreInternal.h new file mode 100644 index 00000000..93af6cb8 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/FirebaseCore/Sources/Private/FirebaseCoreInternal.h @@ -0,0 +1,31 @@ +// Copyright 2020 Google LLC +// +// 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. + +// An umbrella header, for any other libraries in this repo to access Firebase Public and Private +// headers. Any package manager complexity should be handled here. + +#if SWIFT_PACKAGE +@import FirebaseCore; +#else +#import <FirebaseCore/FirebaseCore.h> +#endif + +#import "FirebaseCore/Sources/Private/FIRAppInternal.h" +#import "FirebaseCore/Sources/Private/FIRComponent.h" +#import "FirebaseCore/Sources/Private/FIRComponentContainer.h" +#import "FirebaseCore/Sources/Private/FIRDependency.h" +#import "FirebaseCore/Sources/Private/FIRHeartbeatInfo.h" +#import "FirebaseCore/Sources/Private/FIRLibrary.h" +#import "FirebaseCore/Sources/Private/FIRLogger.h" +#import "FirebaseCore/Sources/Private/FIROptionsInternal.h" diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/Interop/Analytics/Public/FIRAnalyticsInterop.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/Interop/Analytics/Public/FIRAnalyticsInterop.h new file mode 100644 index 00000000..6581b536 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/Interop/Analytics/Public/FIRAnalyticsInterop.h @@ -0,0 +1,66 @@ +/* + * Copyright 2018 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> + +@protocol FIRAnalyticsInteropListener; + +NS_ASSUME_NONNULL_BEGIN + +/// Block typedef callback parameter to getUserPropertiesWithCallback:. +typedef void (^FIRAInteropUserPropertiesCallback)(NSDictionary<NSString *, id> *userProperties); + +/// Connector for bridging communication between Firebase SDKs and FirebaseAnalytics API. +@protocol FIRAnalyticsInterop + +/// Sets user property when trigger event is logged. This API is only available in the SDK. +- (void)setConditionalUserProperty:(NSDictionary<NSString *, id> *)conditionalUserProperty; + +/// Clears user property if set. +- (void)clearConditionalUserProperty:(NSString *)userPropertyName + forOrigin:(NSString *)origin + clearEventName:(NSString *)clearEventName + clearEventParameters:(NSDictionary<NSString *, NSString *> *)clearEventParameters; + +/// Returns currently set user properties. +- (NSArray<NSDictionary<NSString *, NSString *> *> *)conditionalUserProperties:(NSString *)origin + propertyNamePrefix: + (NSString *)propertyNamePrefix; + +/// Returns the maximum number of user properties. +- (NSInteger)maxUserProperties:(NSString *)origin; + +/// Returns the user properties to a callback function. +- (void)getUserPropertiesWithCallback:(FIRAInteropUserPropertiesCallback)callback; + +/// Logs events. +- (void)logEventWithOrigin:(NSString *)origin + name:(NSString *)name + parameters:(nullable NSDictionary<NSString *, id> *)parameters; + +/// Sets user property. +- (void)setUserPropertyWithOrigin:(NSString *)origin name:(NSString *)name value:(id)value; + +/// Registers an Analytics listener for the given origin. +- (void)registerAnalyticsListener:(id<FIRAnalyticsInteropListener>)listener + withOrigin:(NSString *)origin; + +/// Unregisters an Analytics listener for the given origin. +- (void)unregisterAnalyticsListenerWithOrigin:(NSString *)origin; + +@end + +NS_ASSUME_NONNULL_END diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/Interop/Analytics/Public/FIRAnalyticsInteropListener.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/Interop/Analytics/Public/FIRAnalyticsInteropListener.h new file mode 100644 index 00000000..45cde550 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/Interop/Analytics/Public/FIRAnalyticsInteropListener.h @@ -0,0 +1,24 @@ +/* + * 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. + */ + +/// Handles events and messages from Analytics. +@protocol FIRAnalyticsInteropListener <NSObject> + +/// Triggers when an Analytics event happens for the registered origin with +/// `FIRAnalyticsInterop`s `registerAnalyticsListener:withOrigin:`. +- (void)messageTriggered:(NSString *)name parameters:(NSDictionary *)parameters; + +@end
\ No newline at end of file diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/Interop/Analytics/Public/FIRInteropEventNames.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/Interop/Analytics/Public/FIRInteropEventNames.h new file mode 100644 index 00000000..efc54ab2 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/Interop/Analytics/Public/FIRInteropEventNames.h @@ -0,0 +1,28 @@ +/* + * Copyright 2018 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. + */ + +/// @file FIRInteropEventNames.h + +#import <Foundation/Foundation.h> + +/// Notification open event name. +static NSString *const kFIRIEventNotificationOpen = @"_no"; + +/// Notification foreground event name. +static NSString *const kFIRIEventNotificationForeground = @"_nf"; + +/// Campaign event name. +static NSString *const kFIRIEventFirebaseCampaign = @"_cmp"; diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/Interop/Analytics/Public/FIRInteropParameterNames.h b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/Interop/Analytics/Public/FIRInteropParameterNames.h new file mode 100644 index 00000000..ae440bec --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/Interop/Analytics/Public/FIRInteropParameterNames.h @@ -0,0 +1,73 @@ +/* + * Copyright 2018 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> + +/// @file FIRInteropParameterNames.h +/// +/// Predefined event parameter names used by Firebase. This file is a subset of the +/// FirebaseAnalytics FIRParameterNames.h public header. +/// +/// The origin of your traffic, such as an Ad network (for example, google) or partner (urban +/// airship). Identify the advertiser, site, publication, etc. that is sending traffic to your +/// property. Highly recommended (NSString). +/// <pre> +/// NSDictionary *params = @{ +/// kFIRParameterSource : @"InMobi", +/// // ... +/// }; +/// </pre> +static NSString *const kFIRIParameterSource NS_SWIFT_NAME(AnalyticsParameterSource) = @"source"; + +/// The advertising or marketing medium, for example: cpc, banner, email, push. Highly recommended +/// (NSString). +/// <pre> +/// NSDictionary *params = @{ +/// kFIRParameterMedium : @"email", +/// // ... +/// }; +/// </pre> +static NSString *const kFIRIParameterMedium NS_SWIFT_NAME(AnalyticsParameterMedium) = @"medium"; + +/// The individual campaign name, slogan, promo code, etc. Some networks have pre-defined macro to +/// capture campaign information, otherwise can be populated by developer. Highly Recommended +/// (NSString). +/// <pre> +/// NSDictionary *params = @{ +/// kFIRParameterCampaign : @"winter_promotion", +/// // ... +/// }; +/// </pre> +static NSString *const kFIRIParameterCampaign NS_SWIFT_NAME(AnalyticsParameterCampaign) = + @"campaign"; + +/// Message identifier. +static NSString *const kFIRIParameterMessageIdentifier = @"_nmid"; + +/// Message name. +static NSString *const kFIRIParameterMessageName = @"_nmn"; + +/// Message send time. +static NSString *const kFIRIParameterMessageTime = @"_nmt"; + +/// Message device time. +static NSString *const kFIRIParameterMessageDeviceTime = @"_ndt"; + +/// Topic message. +static NSString *const kFIRIParameterTopic = @"_nt"; + +/// Stores the message_id of the last notification opened by the app. +static NSString *const kFIRIUserPropertyLastNotification = @"_ln"; diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/LICENSE b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/LICENSE new file mode 100644 index 00000000..fcce5066 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/LICENSE @@ -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 2020 Firebase, Inc. + + 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. diff --git a/StoneIsland/platforms/ios/Pods/FirebaseABTesting/README.md b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/README.md new file mode 100644 index 00000000..1d9f0f67 --- /dev/null +++ b/StoneIsland/platforms/ios/Pods/FirebaseABTesting/README.md @@ -0,0 +1,298 @@ +[](https://cocoapods.org/pods/Firebase) +[](https://cocoapods.org/pods/Firebase) +[](https://cocoapods.org/pods/Firebase) + +[![Actions Status][gh-abtesting-badge]][gh-actions] +[![Actions Status][gh-auth-badge]][gh-actions] +[![Actions Status][gh-core-badge]][gh-actions] +[![Actions Status][gh-crashlytics-badge]][gh-actions] +[![Actions Status][gh-database-badge]][gh-actions] +[![Actions Status][gh-datatransport-badge]][gh-actions] +[![Actions Status][gh-dynamiclinks-badge]][gh-actions] +[![Actions Status][gh-firebasepod-badge]][gh-actions] +[![Actions Status][gh-firestore-badge]][gh-actions] +[![Actions Status][gh-functions-badge]][gh-actions] +[![Actions Status][gh-inappmessaging-badge]][gh-actions] +[![Actions Status][gh-interop-badge]][gh-actions] +[![Actions Status][gh-messaging-badge]][gh-actions] +[![Actions Status][gh-remoteconfig-badge]][gh-actions] +[![Actions Status][gh-storage-badge]][gh-actions] +[![Actions Status][gh-symbolcollision-badge]][gh-actions] +[![Actions Status][gh-zip-badge]][gh-actions] +[](https://travis-ci.org/firebase/firebase-ios-sdk) + +# Firebase Apple Open Source Development + +This repository contains all Apple platform Firebase SDK source except FirebaseAnalytics, +FirebasePerformance, and FirebaseML. + +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). + +### Using Firebase from a Framework or a library + +[Using Firebase from a Framework or a library](docs/firebase_in_libraries.md) + +## Development + +To develop Firebase software in this repository, ensure that you have at least +the following software: + + * Xcode 10.3 (or later) + * CocoaPods 1.7.2 (or later) + * [CocoaPods generate](https://github.com/square/cocoapods-generate) + +For the pod that you want to develop: + +`pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios` + +Note: If the CocoaPods cache is out of date, you may need to run +`pod repo update` before the `pod gen` command. + +Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for +those platforms. Since 10.2, Xcode does not properly handle multi-platform +CocoaPods workspaces. + +Firestore has a self contained Xcode project. See +[Firestore/README.md](Firestore/README.md). + +### Development for Catalyst +* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios` +* Check the Mac box in the App-iOS Build Settings +* Sign the App in the Settings Signing & Capabilities tab +* Click Pods in the Project Manager +* Add Signing to the iOS host app and unit test targets +* Select the Unit-unit scheme +* Run it to build and test + +### Adding a New Firebase Pod + +See [AddNewPod.md](AddNewPod.md). + +### Managing Headers and Imports + +See [HeadersImports.md](HeadersImports.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`: + +``` +brew install clang-format +brew install swiftformat +``` + +### Running Unit Tests + +Select a scheme and press Command-u to build a component and run its unit tests. + +#### Viewing Code Coverage (Deprecated) + +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 add it to the Xcode project. + +## 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](FirebaseAuth/Tests/Sample/README.md) for instructions about +building and running the FirebaseAuth pod along with various samples and tests. + +### Firebase Database + +The Firebase Database Integration tests can be run against a locally running Database Emulator +or against a production instance. + +To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before +running the integration test. + +To run against a production instance, provide a valid GoogleServices-Info.plist and copy it to +`FirebaseDatabase/Tests/Resources/GoogleService-Info.plist`. Your Security Rule must be set to +[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are +running. + +### Firebase Storage + +To run the Storage Integration tests, follow the instructions in +[FIRStorageIntegrationTests.m](FirebaseStorage/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. + +### tvOS, macOS, watchOS and Catalyst +Thanks to contributions from the community, many of Firebase SDKs now compile, run unit tests, and work on +tvOS, macOS, watchOS and Catalyst. + +For tvOS, checkout the [Sample](Example/tvOSSample). +For watchOS, currently only Messaging and Storage (and their dependencies) have limited support. Checkout the +[Independent Watch App Sample](Example/watchOSSample). + +Keep in mind that macOS, tvOS, watchOS and Catalyst 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, tvOS or watchOS. If you +encounter this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues). + +During app setup in the console, you may get to a step that mentions something like "Checking if the app +has communicated with our servers". This relies on Analytics and will not work on macOS/tvOS/watchOS/Catalyst. +**It's safe to ignore the message and continue**, the rest of the SDKs will work as expected. + +To install, add a subset of the following to the Podfile: + +``` +pod 'Firebase/ABTesting' # No watchOS support yet +pod 'Firebase/Auth' # No watchOS support yet +pod 'Firebase/Crashlytics' # No watchOS support yet +pod 'Firebase/Database' # No watchOS support yet +pod 'Firebase/Firestore' # No watchOS support yet +pod 'Firebase/Functions' # No watchOS support yet +pod 'Firebase/Messaging' +pod 'Firebase/RemoteConfig' # No watchOS support yet +pod 'Firebase/Storage' +``` + +#### Additional Catalyst Notes + +* FirebaseAuth and FirebaseMessaging require adding `Keychain Sharing Capability` +to Build Settings. +* FirebaseFirestore requires signing the +[gRPC Resource target](https://github.com/firebase/firebase-ios-sdk/issues/3500#issuecomment-518741681). + +## 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/). + +[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions +[gh-abtesting-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/abtesting/badge.svg +[gh-auth-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/auth/badge.svg +[gh-core-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core/badge.svg +[gh-crashlytics-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/crashlytics/badge.svg +[gh-database-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/database/badge.svg +[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg +[gh-dynamiclinks-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/dynamiclinks/badge.svg +[gh-firebasepod-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firebasepod/badge.svg +[gh-firestore-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firestore/badge.svg +[gh-functions-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/functions/badge.svg +[gh-inappmessaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/inappmessaging/badge.svg +[gh-interop-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/interop/badge.svg +[gh-messaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/messaging/badge.svg +[gh-remoteconfig-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/remoteconfig/badge.svg +[gh-storage-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/storage/badge.svg +[gh-symbolcollision-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/symbolcollision/badge.svg +[gh-zip-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/zip/badge.svg |
