Files
firebase-ios-sdk/FirebaseInAppMessaging/Sources/Public/FIRInAppMessagingRendering.h
T
2020-02-18 14:32:20 -08:00

477 lines
16 KiB
Objective-C

/*
* 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 <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
/// The type and UI style of an in-app message.
typedef NS_ENUM(NSInteger, FIRInAppMessagingDisplayMessageType) {
/// Modal style.
FIRInAppMessagingDisplayMessageTypeModal,
/// Banner style.
FIRInAppMessagingDisplayMessageTypeBanner,
/// Image-only style.
FIRInAppMessagingDisplayMessageTypeImageOnly,
/// Card style.
FIRInAppMessagingDisplayMessageTypeCard
};
/// Represents how an in-app message should be triggered to appear.
typedef NS_ENUM(NSInteger, FIRInAppMessagingDisplayTriggerType) {
/// Triggered on app foreground.
FIRInAppMessagingDisplayTriggerTypeOnAppForeground,
/// Triggered from an analytics event being fired.
FIRInAppMessagingDisplayTriggerTypeOnAnalyticsEvent
};
/** Contains the display information for an action button.
*/
NS_SWIFT_NAME(InAppMessagingActionButton)
@interface FIRInAppMessagingActionButton : NSObject
/**
* Gets the text string for the button
*/
@property(nonatomic, nonnull, copy, readonly) NSString *buttonText;
/**
* Gets the button's text color.
*/
@property(nonatomic, copy, nonnull, readonly) UIColor *buttonTextColor;
/**
* Gets the button's background color
*/
@property(nonatomic, copy, nonnull, readonly) UIColor *buttonBackgroundColor;
/// Unavailable.
- (instancetype)init NS_UNAVAILABLE;
/// Deprecated, this class shouldn't be directly instantiated.
- (instancetype)initWithButtonText:(NSString *)btnText
buttonTextColor:(UIColor *)textColor
backgroundColor:(UIColor *)bkgColor __deprecated;
@end
/** Contain display data for an image for a fiam message.
*/
NS_SWIFT_NAME(InAppMessagingImageData)
@interface FIRInAppMessagingImageData : NSObject
/**
* Gets the image URL from image data.
*/
@property(nonatomic, nonnull, copy, readonly) NSString *imageURL;
/**
* Gets the downloaded image data. It can be null if headless component fails to load it.
*/
@property(nonatomic, readonly, nullable) NSData *imageRawData;
/// Unavailable.
- (instancetype)init NS_UNAVAILABLE;
/// Deprecated, this class shouldn't be directly instantiated.
- (instancetype)initWithImageURL:(NSString *)imageURL imageData:(NSData *)imageData __deprecated;
@end
/** Defines the metadata for the campaign to which a FIAM message belongs.
*/
NS_SWIFT_NAME(InAppMessagingCampaignInfo)
@interface FIRInAppMessagingCampaignInfo : NSObject
/**
* Identifier for the campaign for this message.
*/
@property(nonatomic, nonnull, copy, readonly) NSString *messageID;
/**
* The name of this campaign, as defined in the console on campaign creation.
*/
@property(nonatomic, nonnull, copy, readonly) NSString *campaignName;
/**
* Whether or not this message is being rendered in Test On Device mode.
*/
@property(nonatomic, readonly) BOOL renderAsTestMessage;
/// Unavailable.
- (instancetype)init NS_UNAVAILABLE;
/// Deprecated, this class shouldn't be directly instantiated.
- (instancetype)initWithMessageID:(NSString *)messageID
campaignName:(NSString *)campaignName
renderAsTestMessage:(BOOL)renderAsTestMessage __deprecated;
@end
/** Defines the metadata for a FIAM action.
*/
NS_SWIFT_NAME(InAppMessagingAction)
@interface FIRInAppMessagingAction : NSObject
/**
* The text of the action button, if applicable.
*/
@property(nonatomic, nullable, copy, readonly) NSString *actionText;
/**
* The URL to follow if the action is clicked.
*/
@property(nonatomic, nullable, copy, readonly) NSURL *actionURL;
/// Unavailable.
- (instancetype)init NS_UNAVAILABLE;
/// This class should only be initialized from a custom in-app message UI component implementation.
- (instancetype)initWithActionText:(nullable NSString *)actionText
actionURL:(nullable NSURL *)actionURL;
@end
/**
* Base class representing a FIAM message to be displayed. Don't create instance
* of this class directly. Instantiate one of its subclasses instead.
*/
NS_SWIFT_NAME(InAppMessagingDisplayMessage)
@interface FIRInAppMessagingDisplayMessage : NSObject
/**
* Metadata for the campaign to which this message belongs.
*/
@property(nonatomic, copy, nonnull, readonly) FIRInAppMessagingCampaignInfo *campaignInfo;
/**
* The type and UI style of this message.
*/
@property(nonatomic, readonly) FIRInAppMessagingDisplayMessageType type;
/**
* How this message should be triggered.
*/
@property(nonatomic, readonly) FIRInAppMessagingDisplayTriggerType triggerType;
/**
* Extra key-value dictionary data that can be sent along with the message
*/
@property(nonatomic, nullable, readonly) NSDictionary *appData;
/// Unavailable.
- (instancetype)init NS_UNAVAILABLE;
/// Deprecated, this class shouldn't be directly instantiated.
- (instancetype)initWithMessageID:(NSString *)messageID
campaignName:(NSString *)campaignName
renderAsTestMessage:(BOOL)renderAsTestMessage
messageType:(FIRInAppMessagingDisplayMessageType)messageType
triggerType:(FIRInAppMessagingDisplayTriggerType)triggerType __deprecated;
@end
NS_SWIFT_NAME(InAppMessagingCardDisplay)
@interface FIRInAppMessagingCardDisplay : FIRInAppMessagingDisplayMessage
/**
* Gets the title text for a card FIAM message.
*/
@property(nonatomic, nonnull, copy, readonly) NSString *title;
/**
* Gets the body text for a card FIAM message.
*/
@property(nonatomic, nullable, copy, readonly) NSString *body;
/**
* Gets the color for text in card FIAM message. It applies to both title and body text.
*/
@property(nonatomic, copy, nonnull, readonly) UIColor *textColor;
/**
* Image data for the supplied portrait image for a card FIAM messasge.
*/
@property(nonatomic, nonnull, copy, readonly) FIRInAppMessagingImageData *portraitImageData;
/**
* Image data for the supplied landscape image for a card FIAM message.
*/
@property(nonatomic, nullable, copy, readonly) FIRInAppMessagingImageData *landscapeImageData;
/**
* The background color for a card FIAM message.
*/
@property(nonatomic, copy, nonnull, readonly) UIColor *displayBackgroundColor;
/**
* Metadata for a card FIAM message's primary action button.
*/
@property(nonatomic, nonnull, readonly) FIRInAppMessagingActionButton *primaryActionButton;
/**
* The action URL for a card FIAM message's primary action button.
*/
@property(nonatomic, nullable, readonly) NSURL *primaryActionURL;
/**
* Metadata for a card FIAM message's secondary action button.
*/
@property(nonatomic, nullable, readonly) FIRInAppMessagingActionButton *secondaryActionButton;
/**
* The action URL for a card FIAM message's secondary action button.
*/
@property(nonatomic, nullable, readonly) NSURL *secondaryActionURL;
/// Unavailable.
- (instancetype)init NS_UNAVAILABLE;
@end
/** Class for defining a modal message for display.
*/
NS_SWIFT_NAME(InAppMessagingModalDisplay)
@interface FIRInAppMessagingModalDisplay : FIRInAppMessagingDisplayMessage
/**
* Gets the title for a modal fiam message.
*/
@property(nonatomic, nonnull, copy, readonly) NSString *title;
/**
* Gets the image data for a modal fiam message.
*/
@property(nonatomic, nullable, copy, readonly) FIRInAppMessagingImageData *imageData;
/**
* Gets the body text for a modal fiam message.
*/
@property(nonatomic, nullable, copy, readonly) NSString *bodyText;
/**
* Gets the action button metadata for a modal fiam message.
*/
@property(nonatomic, nullable, readonly) FIRInAppMessagingActionButton *actionButton;
/**
* Gets the action URL for a modal fiam message.
*/
@property(nonatomic, nullable, readonly) NSURL *actionURL;
/**
* Gets the background color for a modal fiam message.
*/
@property(nonatomic, copy, nonnull) UIColor *displayBackgroundColor;
/**
* Gets the color for text in modal fiam message. It would apply to both title and body text.
*/
@property(nonatomic, copy, nonnull) UIColor *textColor;
/// Unavailable.
- (instancetype)init NS_UNAVAILABLE;
/// Deprecated, this class shouldn't be directly instantiated.
- (instancetype)initWithMessageID:(NSString *)messageID
campaignName:(NSString *)campaignName
renderAsTestMessage:(BOOL)renderAsTestMessage
triggerType:(FIRInAppMessagingDisplayTriggerType)triggerType
titleText:(NSString *)title
bodyText:(NSString *)bodyText
textColor:(UIColor *)textColor
backgroundColor:(UIColor *)backgroundColor
imageData:(nullable FIRInAppMessagingImageData *)imageData
actionButton:(nullable FIRInAppMessagingActionButton *)actionButton
actionURL:(nullable NSURL *)actionURL __deprecated;
@end
/** Class for defining a banner message for display.
*/
NS_SWIFT_NAME(InAppMessagingBannerDisplay)
@interface FIRInAppMessagingBannerDisplay : FIRInAppMessagingDisplayMessage
/**
* Gets the title of a banner message.
*/
@property(nonatomic, nonnull, copy, readonly) NSString *title;
/**
* Gets the image data for a banner message.
*/
@property(nonatomic, nullable, copy, readonly) FIRInAppMessagingImageData *imageData;
/**
* Gets the body text for a banner message.
*/
@property(nonatomic, nullable, copy, readonly) NSString *bodyText;
/**
* Gets banner's background color
*/
@property(nonatomic, copy, nonnull, readonly) UIColor *displayBackgroundColor;
/**
* Gets the color for text in banner fiam message. It would apply to both title and body text.
*/
@property(nonatomic, copy, nonnull) UIColor *textColor;
/**
* Gets the action URL for a banner fiam message.
*/
@property(nonatomic, nullable, readonly) NSURL *actionURL;
/// Unavailable.
- (instancetype)init NS_UNAVAILABLE;
/// Deprecated, this class shouldn't be directly instantiated.
- (instancetype)initWithMessageID:(NSString *)messageID
campaignName:(NSString *)campaignName
renderAsTestMessage:(BOOL)renderAsTestMessage
triggerType:(FIRInAppMessagingDisplayTriggerType)triggerType
titleText:(NSString *)title
bodyText:(NSString *)bodyText
textColor:(UIColor *)textColor
backgroundColor:(UIColor *)backgroundColor
imageData:(nullable FIRInAppMessagingImageData *)imageData
actionURL:(nullable NSURL *)actionURL __deprecated;
@end
/** Class for defining a image-only message for display.
*/
NS_SWIFT_NAME(InAppMessagingImageOnlyDisplay)
@interface FIRInAppMessagingImageOnlyDisplay : FIRInAppMessagingDisplayMessage
/**
* Gets the image for this message
*/
@property(nonatomic, nonnull, copy, readonly) FIRInAppMessagingImageData *imageData;
/**
* Gets the action URL for an image-only fiam message.
*/
@property(nonatomic, nullable, readonly) NSURL *actionURL;
/// Unavailable.
- (instancetype)init NS_UNAVAILABLE;
/// Deprecated, this class shouldn't be directly instantiated.
- (instancetype)initWithMessageID:(NSString *)messageID
campaignName:(NSString *)campaignName
renderAsTestMessage:(BOOL)renderAsTestMessage
triggerType:(FIRInAppMessagingDisplayTriggerType)triggerType
imageData:(nullable FIRInAppMessagingImageData *)imageData
actionURL:(nullable NSURL *)actionURL __deprecated;
@end
/// The way that an in-app message was dismissed.
typedef NS_ENUM(NSInteger, FIRInAppMessagingDismissType) {
/// Message was swiped away (only valid for banner messages).
FIRInAppMessagingDismissTypeUserSwipe,
/// The user tapped a button to close this message.
FIRInAppMessagingDismissTypeUserTapClose,
/// The message was automatically dismissed (only valid for banner messages).
FIRInAppMessagingDismissTypeAuto,
/// Dismiss method unknown.
FIRInAppMessagingDismissUnspecified,
};
/// Error code for an in-app message that failed to display.
typedef NS_ENUM(NSInteger, FIAMDisplayRenderErrorType) {
/// The image data for this in-app message is invalid.
FIAMDisplayRenderErrorTypeImageDataInvalid,
/// Unexpected error.
FIAMDisplayRenderErrorTypeUnspecifiedError,
};
/**
* A protocol defining those callbacks to be triggered by the message display component
* under appropriate conditions.
*/
NS_SWIFT_NAME(InAppMessagingDisplayDelegate)
@protocol FIRInAppMessagingDisplayDelegate <NSObject>
@optional
/**
* Called when the message is dismissed. Should be called from main thread.
* @param inAppMessage the message that was dismissed.
* @param dismissType specifies how the message is closed.
*/
- (void)messageDismissed:(FIRInAppMessagingDisplayMessage *)inAppMessage
dismissType:(FIRInAppMessagingDismissType)dismissType;
/**
* Called when the message's action button is followed by the user.
* @param inAppMessage the message that was clicked.
*/
- (void)messageClicked:(FIRInAppMessagingDisplayMessage *)inAppMessage __deprecated;
/**
* Called when the message's action button is followed by the user.
* @param inAppMessage the message that was clicked.
* @param action contains the text and URL for the action that was clicked.
*/
- (void)messageClicked:(FIRInAppMessagingDisplayMessage *)inAppMessage
withAction:(FIRInAppMessagingAction *)action;
/**
* Use this to mark a message as having gone through enough impression so that
* headless component can make appropriate impression tracking for it.
*
* Calling this is optional.
*
* When messageDismissedWithType: or messageClicked is
* triggered, the message would be marked as having a valid impression implicitly.
* Use impressionDetected if the UI implementation would like to mark valid
* impression in additional cases. One example is that the message is displayed for
* N seconds and then the app is killed by the user. Neither
* onMessageDismissedWithType or onMessageClicked would be triggered
* in this case. But if the app regards this as a valid impression and does not
* want the user to see the same message again, call impressionDetected to mark
* a valid impression.
* @param inAppMessage the message for which an impression was detected.
*/
- (void)impressionDetectedForMessage:(FIRInAppMessagingDisplayMessage *)inAppMessage;
/**
* Called when the display component could not render the message due to various reason.
* It's essential for display component to call this when error does arise. On seeing
* this, the headless component of fiam would assume that a prior attempt to render a
* message has finished and therefore it's ready to render a new one when conditions are
* met. Missing this callback in failed rendering attempt would make headless
* component think a fiam message is still being rendered and therefore suppress any
* future message rendering.
* @param inAppMessage the message that encountered a display error.
*/
- (void)displayErrorForMessage:(FIRInAppMessagingDisplayMessage *)inAppMessage
error:(NSError *)error;
@end
/**
* The protocol that a FIAM display component must implement.
*/
NS_SWIFT_NAME(InAppMessagingDisplay)
@protocol FIRInAppMessagingDisplay
/**
* Method for rendering a specified message on client side. It's called from main thread.
* @param messageForDisplay the message object. It would be of one of the three message
* types at runtime.
* @param displayDelegate the callback object used to trigger notifications about certain
* conditions related to message rendering.
*/
- (void)displayMessage:(FIRInAppMessagingDisplayMessage *)messageForDisplay
displayDelegate:(id<FIRInAppMessagingDisplayDelegate>)displayDelegate;
@end
NS_ASSUME_NONNULL_END