AutorÃa | Ultima modificación | Ver Log |
/** 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 <TargetConditionals.h>#if TARGET_OS_IOS#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h"#import "FirebaseInAppMessaging/Sources/DefaultUI/Banner/FIRIAMBannerViewController.h"#import "FirebaseInAppMessaging/Sources/DefaultUI/Card/FIRIAMCardViewController.h"#import "FirebaseInAppMessaging/Sources/DefaultUI/FIRCore+InAppMessagingDisplay.h"#import "FirebaseInAppMessaging/Sources/DefaultUI/FIRIAMDefaultDisplayImpl.h"#import "FirebaseInAppMessaging/Sources/DefaultUI/FIRIAMRenderingWindowHelper.h"#import "FirebaseInAppMessaging/Sources/DefaultUI/ImageOnly/FIRIAMImageOnlyViewController.h"#import "FirebaseInAppMessaging/Sources/DefaultUI/Modal/FIRIAMModalViewController.h"#import "FirebaseInAppMessaging/Sources/Private/Util/FIRIAMTimeFetcher.h"#import "FirebaseInAppMessaging/Sources/Public/FirebaseInAppMessaging/FIRInAppMessaging.h"@implementation FIRIAMDefaultDisplayImpl+ (void)load {[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(didReceiveConfigureSDKNotification:)name:kFIRAppReadyToConfigureSDKNotificationobject:nil];}+ (void)didReceiveConfigureSDKNotification:(NSNotification *)notification {FIRLogDebug(kFIRLoggerInAppMessagingDisplay, @"I-FID100010",@"Got notification for kFIRAppReadyToConfigureSDKNotification. Setting display ""component on headless SDK.");FIRIAMDefaultDisplayImpl *display = [[FIRIAMDefaultDisplayImpl alloc] init];[FIRInAppMessaging inAppMessaging].messageDisplayComponent = display;}+ (NSBundle *)getViewResourceBundle {static NSBundle *resourceBundle;static dispatch_once_t onceToken;Class myClass = [self class];dispatch_once(&onceToken, ^{NSString *bundledResource;// When using SPM, Xcode scopes resources to a target, creating a bundle.#if SWIFT_PACKAGE// FIAM only provides default UIs for iOS. FIAM for tvOS will not attempt to provide a default// display.bundledResource = @"Firebase_FirebaseInAppMessaging_iOS";#elsebundledResource = @"InAppMessagingDisplayResources";#endif // SWIFT_PACKAGENSBundle *containingBundle;NSURL *bundleURL;// The containing bundle is different whether FIAM is statically or dynamically linked.for (containingBundle in @[ [NSBundle mainBundle], [NSBundle bundleForClass:myClass] ]) {bundleURL = [containingBundle URLForResource:bundledResource withExtension:@"bundle"];if (bundleURL != nil) break;}if (bundleURL == nil) {FIRLogWarning(kFIRLoggerInAppMessagingDisplay, @"I-FID100007",@"FIAM Display Resource bundle ""is missing: not contained within bundle %@",containingBundle);return;}resourceBundle = [NSBundle bundleWithURL:bundleURL];if (resourceBundle == nil) {FIRLogWarning(kFIRLoggerInAppMessagingDisplay, @"I-FID100007",@"FIAM Display Resource bundle ""is missing: not contained within bundle %@",containingBundle);}});return resourceBundle;}+ (void)displayCardViewWithMessageDefinition:(FIRInAppMessagingCardDisplay *)cardMessagedisplayDelegate:(id<FIRInAppMessagingDisplayDelegate>)displayDelegate {dispatch_async(dispatch_get_main_queue(), ^{NSBundle *resourceBundle = [self getViewResourceBundle];if (resourceBundle == nil) {NSError *error =[NSError errorWithDomain:kFirebaseInAppMessagingDisplayErrorDomaincode:FIAMDisplayRenderErrorTypeUnspecifiedErroruserInfo:@{NSLocalizedDescriptionKey : @"Resource bundle is missing."}];[displayDelegate displayErrorForMessage:cardMessage error:error];return;}FIRIAMTimerWithNSDate *timeFetcher = [[FIRIAMTimerWithNSDate alloc] init];FIRIAMCardViewController *cardVC =[FIRIAMCardViewController instantiateViewControllerWithResourceBundle:resourceBundledisplayMessage:cardMessagedisplayDelegate:displayDelegatetimeFetcher:timeFetcher];if (cardVC == nil) {FIRLogWarning(kFIRLoggerInAppMessagingDisplay, @"I-FID100011",@"View controller can not be created.");NSError *error = [NSErrorerrorWithDomain:kFirebaseInAppMessagingDisplayErrorDomaincode:FIAMDisplayRenderErrorTypeUnspecifiedErroruserInfo:@{NSLocalizedDescriptionKey : @"View controller could not be created"}];[displayDelegate displayErrorForMessage:cardMessage error:error];return;}UIWindow *displayUIWindow = [FIRIAMRenderingWindowHelper windowForBlockingView];displayUIWindow.rootViewController = cardVC;[displayUIWindow setHidden:NO];});}+ (void)displayModalViewWithMessageDefinition:(FIRInAppMessagingModalDisplay *)modalMessagedisplayDelegate:(id<FIRInAppMessagingDisplayDelegate>)displayDelegate {dispatch_async(dispatch_get_main_queue(), ^{NSBundle *resourceBundle = [self getViewResourceBundle];if (resourceBundle == nil) {NSError *error = [NSError errorWithDomain:kFirebaseInAppMessagingDisplayErrorDomaincode:FIAMDisplayRenderErrorTypeUnspecifiedErroruserInfo:@{@"message" : @"resource bundle is missing"}];[displayDelegate displayErrorForMessage:modalMessage error:error];return;}FIRIAMTimerWithNSDate *timeFetcher = [[FIRIAMTimerWithNSDate alloc] init];FIRIAMModalViewController *modalVC =[FIRIAMModalViewController instantiateViewControllerWithResourceBundle:resourceBundledisplayMessage:modalMessagedisplayDelegate:displayDelegatetimeFetcher:timeFetcher];if (modalVC == nil) {FIRLogWarning(kFIRLoggerInAppMessagingDisplay, @"I-FID100004",@"View controller can not be created.");NSError *error = [NSError errorWithDomain:kFirebaseInAppMessagingDisplayErrorDomaincode:FIAMDisplayRenderErrorTypeUnspecifiedErroruserInfo:@{}];[displayDelegate displayErrorForMessage:modalMessage error:error];return;}UIWindow *displayUIWindow = [FIRIAMRenderingWindowHelper windowForBlockingView];displayUIWindow.rootViewController = modalVC;[displayUIWindow setHidden:NO];});}+ (void)displayBannerViewWithMessageDefinition:(FIRInAppMessagingBannerDisplay *)bannerMessagedisplayDelegate:(id<FIRInAppMessagingDisplayDelegate>)displayDelegate {dispatch_async(dispatch_get_main_queue(), ^{NSBundle *resourceBundle = [self getViewResourceBundle];if (resourceBundle == nil) {NSError *error = [NSError errorWithDomain:kFirebaseInAppMessagingDisplayErrorDomaincode:FIAMDisplayRenderErrorTypeUnspecifiedErroruserInfo:@{}];[displayDelegate displayErrorForMessage:bannerMessage error:error];return;}FIRIAMTimerWithNSDate *timeFetcher = [[FIRIAMTimerWithNSDate alloc] init];FIRIAMBannerViewController *bannerVC =[FIRIAMBannerViewController instantiateViewControllerWithResourceBundle:resourceBundledisplayMessage:bannerMessagedisplayDelegate:displayDelegatetimeFetcher:timeFetcher];if (bannerVC == nil) {FIRLogWarning(kFIRLoggerInAppMessagingDisplay, @"I-FID100008",@"Banner view controller can not be created.");NSError *error = [NSError errorWithDomain:kFirebaseInAppMessagingDisplayErrorDomaincode:FIAMDisplayRenderErrorTypeUnspecifiedErroruserInfo:@{}];[displayDelegate displayErrorForMessage:bannerMessage error:error];return;}UIWindow *displayUIWindow = [FIRIAMRenderingWindowHelper windowForNonBlockingView];displayUIWindow.rootViewController = bannerVC;[displayUIWindow setHidden:NO];});}+ (void)displayImageOnlyViewWithMessageDefinition:(FIRInAppMessagingImageOnlyDisplay *)imageOnlyMessagedisplayDelegate:(id<FIRInAppMessagingDisplayDelegate>)displayDelegate {dispatch_async(dispatch_get_main_queue(), ^{NSBundle *resourceBundle = [self getViewResourceBundle];if (resourceBundle == nil) {NSError *error = [NSError errorWithDomain:kFirebaseInAppMessagingDisplayErrorDomaincode:FIAMDisplayRenderErrorTypeUnspecifiedErroruserInfo:@{}];[displayDelegate displayErrorForMessage:imageOnlyMessage error:error];return;}FIRIAMTimerWithNSDate *timeFetcher = [[FIRIAMTimerWithNSDate alloc] init];FIRIAMImageOnlyViewController *imageOnlyVC =[FIRIAMImageOnlyViewController instantiateViewControllerWithResourceBundle:resourceBundledisplayMessage:imageOnlyMessagedisplayDelegate:displayDelegatetimeFetcher:timeFetcher];if (imageOnlyVC == nil) {FIRLogWarning(kFIRLoggerInAppMessagingDisplay, @"I-FID100006",@"Image only view controller can not be created.");NSError *error = [NSError errorWithDomain:kFirebaseInAppMessagingDisplayErrorDomaincode:FIAMDisplayRenderErrorTypeUnspecifiedErroruserInfo:@{}];[displayDelegate displayErrorForMessage:imageOnlyMessage error:error];return;}UIWindow *displayUIWindow = [FIRIAMRenderingWindowHelper windowForBlockingView];displayUIWindow.rootViewController = imageOnlyVC;[displayUIWindow setHidden:NO];});}#pragma mark - protocol FIRInAppMessagingDisplay- (void)displayMessage:(FIRInAppMessagingDisplayMessage *)messageForDisplaydisplayDelegate:(id<FIRInAppMessagingDisplayDelegate>)displayDelegate {if ([messageForDisplay isKindOfClass:[FIRInAppMessagingModalDisplay class]]) {FIRLogDebug(kFIRLoggerInAppMessagingDisplay, @"I-FID100000", @"Display a modal message.");[self.class displayModalViewWithMessageDefinition:(FIRInAppMessagingModalDisplay *)messageForDisplaydisplayDelegate:displayDelegate];} else if ([messageForDisplay isKindOfClass:[FIRInAppMessagingBannerDisplay class]]) {FIRLogDebug(kFIRLoggerInAppMessagingDisplay, @"I-FID100001", @"Display a banner message.");[self.class displayBannerViewWithMessageDefinition:(FIRInAppMessagingBannerDisplay *)messageForDisplaydisplayDelegate:displayDelegate];} else if ([messageForDisplay isKindOfClass:[FIRInAppMessagingImageOnlyDisplay class]]) {FIRLogDebug(kFIRLoggerInAppMessagingDisplay, @"I-FID100002", @"Display an image only message.");[self.class displayImageOnlyViewWithMessageDefinition:(FIRInAppMessagingImageOnlyDisplay *)messageForDisplaydisplayDelegate:displayDelegate];} else if ([messageForDisplay isKindOfClass:[FIRInAppMessagingCardDisplay class]]) {FIRLogDebug(kFIRLoggerInAppMessagingDisplay, @"I-FID100009", @"Display a card message.");[self.class displayCardViewWithMessageDefinition:(FIRInAppMessagingCardDisplay *)messageForDisplaydisplayDelegate:displayDelegate];} else {FIRLogWarning(kFIRLoggerInAppMessagingDisplay, @"I-FID100003",@"Unknown message type %@ ""Don't know how to handle it.",messageForDisplay.class);NSError *error = [NSError errorWithDomain:kFirebaseInAppMessagingDisplayErrorDomaincode:FIAMDisplayRenderErrorTypeUnspecifiedErroruserInfo:@{}];[displayDelegate displayErrorForMessage:messageForDisplay error:error];}}@end#endif // TARGET_OS_IOS