Skip to content

Commit 729fab1

Browse files
committed
Merge branch 'develop'
2 parents d213894 + d0e4507 commit 729fab1

File tree

52 files changed

+1224
-313
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1224
-313
lines changed

Apptentive/Apptentive.xcodeproj/project.pbxproj

+20-4
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,10 @@
378378
EF8EE3A61EBA81880033E7A1 /* ATDataModel v5 to v6.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = EF8EE3A21EBA79EC0033E7A1 /* ATDataModel v5 to v6.xcmappingmodel */; };
379379
EF8EE3AB1EBBA5D00033E7A1 /* ApptentiveJWT.h in Headers */ = {isa = PBXBuildFile; fileRef = EF8EE3A91EBBA5D00033E7A1 /* ApptentiveJWT.h */; };
380380
EF8EE3AC1EBBA5D00033E7A1 /* ApptentiveJWT.m in Sources */ = {isa = PBXBuildFile; fileRef = EF8EE3AA1EBBA5D00033E7A1 /* ApptentiveJWT.m */; };
381+
EF9009901F8D370400DC5B56 /* ApptentiveLogMonitor.h in Headers */ = {isa = PBXBuildFile; fileRef = EF90098E1F8D370400DC5B56 /* ApptentiveLogMonitor.h */; };
382+
EF9009911F8D370400DC5B56 /* ApptentiveLogMonitor.m in Sources */ = {isa = PBXBuildFile; fileRef = EF90098F1F8D370400DC5B56 /* ApptentiveLogMonitor.m */; };
383+
EF9009941F8D64B800DC5B56 /* ApptentiveLogWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = EF9009921F8D64B800DC5B56 /* ApptentiveLogWriter.h */; };
384+
EF9009951F8D64B800DC5B56 /* ApptentiveLogWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = EF9009931F8D64B800DC5B56 /* ApptentiveLogWriter.m */; };
381385
EFC308D21EC52915006B6D36 /* ApptentiveStopWatch.h in Headers */ = {isa = PBXBuildFile; fileRef = EFC308D01EC52915006B6D36 /* ApptentiveStopWatch.h */; };
382386
EFC308D31EC52915006B6D36 /* ApptentiveStopWatch.m in Sources */ = {isa = PBXBuildFile; fileRef = EFC308D11EC52915006B6D36 /* ApptentiveStopWatch.m */; };
383387
EFC308D71ECA6692006B6D36 /* ApptentiveLegacyConversationRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = EFC308D51ECA6692006B6D36 /* ApptentiveLegacyConversationRequest.h */; };
@@ -807,6 +811,10 @@
807811
EF8EE3A21EBA79EC0033E7A1 /* ATDataModel v5 to v6.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; path = "ATDataModel v5 to v6.xcmappingmodel"; sourceTree = "<group>"; };
808812
EF8EE3A91EBBA5D00033E7A1 /* ApptentiveJWT.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApptentiveJWT.h; sourceTree = "<group>"; };
809813
EF8EE3AA1EBBA5D00033E7A1 /* ApptentiveJWT.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ApptentiveJWT.m; sourceTree = "<group>"; };
814+
EF90098E1F8D370400DC5B56 /* ApptentiveLogMonitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApptentiveLogMonitor.h; sourceTree = "<group>"; };
815+
EF90098F1F8D370400DC5B56 /* ApptentiveLogMonitor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ApptentiveLogMonitor.m; sourceTree = "<group>"; };
816+
EF9009921F8D64B800DC5B56 /* ApptentiveLogWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApptentiveLogWriter.h; sourceTree = "<group>"; };
817+
EF9009931F8D64B800DC5B56 /* ApptentiveLogWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ApptentiveLogWriter.m; sourceTree = "<group>"; };
810818
EFC308D01EC52915006B6D36 /* ApptentiveStopWatch.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApptentiveStopWatch.h; sourceTree = "<group>"; };
811819
EFC308D11EC52915006B6D36 /* ApptentiveStopWatch.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ApptentiveStopWatch.m; sourceTree = "<group>"; };
812820
EFC308D51ECA6692006B6D36 /* ApptentiveLegacyConversationRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ApptentiveLegacyConversationRequest.h; sourceTree = "<group>"; };
@@ -1381,6 +1389,10 @@
13811389
EFF3FE3A1E8C2F05006AD2B4 /* ApptentiveLog.m */,
13821390
EFF3FE401E8C386E006AD2B4 /* ApptentiveLogTag.h */,
13831391
EFF3FE411E8C386E006AD2B4 /* ApptentiveLogTag.m */,
1392+
EF90098E1F8D370400DC5B56 /* ApptentiveLogMonitor.h */,
1393+
EF90098F1F8D370400DC5B56 /* ApptentiveLogMonitor.m */,
1394+
EF9009921F8D64B800DC5B56 /* ApptentiveLogWriter.h */,
1395+
EF9009931F8D64B800DC5B56 /* ApptentiveLogWriter.m */,
13841396
EF1812491E8084C80053BD68 /* ApptentiveSafeCollections.h */,
13851397
EF18124A1E8084C80053BD68 /* ApptentiveSafeCollections.m */,
13861398
EFC308D01EC52915006B6D36 /* ApptentiveStopWatch.h */,
@@ -1685,6 +1697,7 @@
16851697
EF8EE3981EB3F37B0033E7A1 /* ApptentiveConversationBaseRequest.h in Headers */,
16861698
01F1DFF81E5BBFBD009AB3D2 /* ApptentiveConversationMetadata.h in Headers */,
16871699
01A2D1AA1E490A9700C2103A /* ApptentiveAppConfiguration.h in Headers */,
1700+
EF9009901F8D370400DC5B56 /* ApptentiveLogMonitor.h in Headers */,
16881701
EF8EE3AB1EBBA5D00033E7A1 /* ApptentiveJWT.h in Headers */,
16891702
01A2D1D81E490A9700C2103A /* ApptentiveDataManager.h in Headers */,
16901703
01A2D0FF1E490A9700C2103A /* ApptentiveNetworkImageIconView.h in Headers */,
@@ -1770,6 +1783,7 @@
17701783
0140D6021E8354A9007B5130 /* ApptentiveMessageSender.h in Headers */,
17711784
014508A81EAABEDE003326E7 /* ApptentiveInteractionsRequest.h in Headers */,
17721785
014508A01EAAB26D003326E7 /* ApptentiveConversationRequest.h in Headers */,
1786+
EF9009941F8D64B800DC5B56 /* ApptentiveLogWriter.h in Headers */,
17731787
0140D60E1E83553C007B5130 /* ApptentiveLegacyMessageSender.h in Headers */,
17741788
01A2D1F21E490A9700C2103A /* ApptentiveSurveyMultilineCell.h in Headers */,
17751789
01A2D0FD1E490A9700C2103A /* ApptentiveHUDViewController.h in Headers */,
@@ -2037,6 +2051,7 @@
20372051
01A2D1441E490A9700C2103A /* ApptentiveBackend+Engagement.m in Sources */,
20382052
01A2D1F51E490A9700C2103A /* ApptentiveSurveyOtherCell.m in Sources */,
20392053
014508B21EAE5F71003326E7 /* ApptentiveClient.m in Sources */,
2054+
EF9009911F8D370400DC5B56 /* ApptentiveLogMonitor.m in Sources */,
20402055
0140D60D1E83553C007B5130 /* ApptentiveLegacyMessage.m in Sources */,
20412056
01A2D1B51E490A9700C2103A /* ApptentiveLegacySurveyResponse.m in Sources */,
20422057
01A2D1181E490A9700C2103A /* ApptentiveInteractionRatingDialogController.m in Sources */,
@@ -2133,6 +2148,7 @@
21332148
01A2D1061E490A9700C2103A /* ApptentiveUnreadMessagesBadgeView.m in Sources */,
21342149
01A2D11A1E490A9700C2103A /* ApptentiveInteractionSurveyController.m in Sources */,
21352150
0134EB1B1EA9930200DA4925 /* ApptentiveDevicePayload.m in Sources */,
2151+
EF9009951F8D64B800DC5B56 /* ApptentiveLogWriter.m in Sources */,
21362152
01A2D1241E490A9700C2103A /* ApptentiveCustomData.m in Sources */,
21372153
01A2D1E31E490A9700C2103A /* ApptentiveSurveyCollectionViewLayout.m in Sources */,
21382154
01A2D1BF1E490A9700C2103A /* ApptentiveRecord.m in Sources */,
@@ -2377,7 +2393,7 @@
23772393
GCC_PREPROCESSOR_DEFINITIONS = "APPTENTIVE_DEBUG=1";
23782394
INFOPLIST_FILE = Apptentive/Info.plist;
23792395
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2380-
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2396+
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
23812397
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
23822398
PRODUCT_BUNDLE_IDENTIFIER = com.apptentive.Apptentive;
23832399
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -2397,7 +2413,7 @@
23972413
GCC_PREFIX_HEADER = "Apptentive/Misc/ApptentiveConnect-Prefix.pch";
23982414
INFOPLIST_FILE = Apptentive/Info.plist;
23992415
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2400-
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2416+
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
24012417
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
24022418
PRODUCT_BUNDLE_IDENTIFIER = com.apptentive.Apptentive;
24032419
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -2448,7 +2464,7 @@
24482464
DYLIB_INSTALL_NAME_BASE = "@rpath";
24492465
INFOPLIST_FILE = ApptentiveDebugging/Info.plist;
24502466
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2451-
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2467+
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
24522468
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
24532469
PRODUCT_BUNDLE_IDENTIFIER = com.apptentive.ApptentiveDebugging;
24542470
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -2467,7 +2483,7 @@
24672483
DYLIB_INSTALL_NAME_BASE = "@rpath";
24682484
INFOPLIST_FILE = ApptentiveDebugging/Info.plist;
24692485
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
2470-
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
2486+
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
24712487
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
24722488
PRODUCT_BUNDLE_IDENTIFIER = com.apptentive.ApptentiveDebugging;
24732489
PRODUCT_NAME = "$(TARGET_NAME)";

Apptentive/Apptentive/Apptentive.h

+13-8
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ FOUNDATION_EXPORT double ApptentiveVersionNumber;
2020
FOUNDATION_EXPORT const unsigned char ApptentiveVersionString[];
2121

2222
/** The version number of the Apptentive SDK. */
23-
#define kApptentiveVersionString @"4.0.7"
23+
#define kApptentiveVersionString @"4.1.0"
24+
25+
/** The version number of the Apptentive API platform. */
26+
#define kApptentiveAPIVersionString @"9"
2427

2528
/** The platform that the SDK is built for. */
2629
#define kApptentivePlatformString @"iOS"
@@ -98,18 +101,20 @@ typedef NS_ENUM(NSInteger, ApptentivePushProvider) {
98101
Log levels supported by the logging system. Each level includes those above it on the list.
99102
*/
100103
typedef NS_ENUM(NSUInteger, ApptentiveLogLevel) {
104+
/** Undefined. */
105+
ApptentiveLogLevelUndefined = 0,
101106
/** Critical failure log messages. */
102-
ApptentiveLogLevelCrit = 0,
107+
ApptentiveLogLevelCrit = 1,
103108
/** Error log messages. */
104-
ApptentiveLogLevelError = 1,
109+
ApptentiveLogLevelError = 2,
105110
/** Warning log messages. */
106-
ApptentiveLogLevelWarn = 2,
111+
ApptentiveLogLevelWarn = 3,
107112
/** Informational log messages. */
108-
ApptentiveLogLevelInfo = 3,
113+
ApptentiveLogLevelInfo = 4,
109114
/** Log messages that are potentially useful for debugging. */
110-
ApptentiveLogLevelDebug = 4,
115+
ApptentiveLogLevelDebug = 5,
111116
/** All possible log messages enabled. */
112-
ApptentiveLogLevelVerbose = 5
117+
ApptentiveLogLevelVerbose = 6
113118
};
114119

115120
/**
@@ -514,7 +519,7 @@ typedef NS_ENUM(NSUInteger, ApptentiveLogLevel) {
514519
515520
*/
516521

517-
- (BOOL)didReceveUserNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler;
522+
- (BOOL)didReceveUserNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler NS_AVAILABLE_IOS(10_0);
518523

519524
///-------------------------------------
520525
/// @name Attach Text, Images, and Files

Apptentive/Apptentive/Apptentive.m

+55-18
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#import "ApptentiveMessageManager.h"
2626
#import "ApptentiveMessageSender.h"
2727
#import "ApptentiveAttachment.h"
28+
#import "ApptentiveLogMonitor.h"
2829

2930
NS_ASSUME_NONNULL_BEGIN
3031

@@ -40,12 +41,14 @@
4041
NSNotificationName const ApptentiveInteractionsDidUpdateNotification = @"ApptentiveInteractionsDidUpdateNotification";
4142
NSNotificationName const ApptentiveInteractionsShouldDismissNotification = @"ApptentiveInteractionsShouldDismissNotification";
4243
NSNotificationName const ApptentiveConversationCreatedNotification = @"ApptentiveConversationCreatedNotification";
44+
NSNotificationName const ApptentiveManifestRawDataDidReceiveNotification = @"ApptentiveManifestRawDataDidReceiveNotification";
4345

4446
NSString *const ApptentiveSurveyIDKey = @"ApptentiveSurveyIDKey";
4547
NSString *const ApptentiveInteractionsShouldDismissAnimatedKey = @"ApptentiveInteractionsShouldDismissAnimatedKey";
4648

4749
NSString *const ApptentiveCustomDeviceDataPreferenceKey = @"ApptentiveCustomDeviceDataPreferenceKey";
4850
NSString *const ApptentiveCustomPersonDataPreferenceKey = @"ApptentiveCustomPersonDataPreferenceKey";
51+
NSString *const ApptentiveManifestRawDataKey = @"ApptentiveManifestRawDataKey";
4952

5053
NSString *const ApptentiveErrorDomain = @"com.apptentive";
5154

@@ -108,12 +111,17 @@ - (id)initWithConfiguration:(ApptentiveConfiguration *)configuration {
108111
self = [super init];
109112

110113
if (self) {
114+
// it's important to set the log level first and the initialize log monitor
115+
// otherwise the log monitor configuration would be overwritten by
116+
// the SDK configuration
117+
ApptentiveLogSetLevel(configuration.logLevel);
118+
119+
[ApptentiveLogMonitor tryInitializeWithBaseURL:configuration.baseURL appKey:configuration.apptentiveKey signature:configuration.apptentiveSignature];
120+
111121
_operationQueue = [[NSOperationQueue alloc] init];
112122
_operationQueue.maxConcurrentOperationCount = 1;
113123
_operationQueue.name = @"Apptentive Operation Queue";
114124

115-
ApptentiveLogSetLevel(configuration.logLevel);
116-
117125
_style = [[ApptentiveStyleSheet alloc] init];
118126
_apptentiveKey = configuration.apptentiveKey;
119127
_apptentiveSignature = configuration.apptentiveSignature;
@@ -129,6 +137,8 @@ - (id)initWithConfiguration:(ApptentiveConfiguration *)configuration {
129137
[ApptentiveSDK setDistributionName:configuration.distributionName];
130138
[ApptentiveSDK setDistributionVersion:[[ApptentiveVersion alloc] initWithString:configuration.distributionVersion]];
131139
}
140+
141+
[self registerNotifications];
132142

133143
ApptentiveLogInfo(@"Apptentive SDK Version %@", [ApptentiveSDK SDKVersion].versionString);
134144
}
@@ -738,22 +748,28 @@ - (void)fireLocalNotificationWithUserInfo:(NSDictionary *)userInfo {
738748
NSDictionary *apptentiveUserInfo = @{ @"apptentive": userInfo[@"apptentive"] };
739749
NSString *soundName = userInfo[@"apptentive"][@"sound"];
740750

741-
if ([UNUserNotificationCenter class] && [[UNUserNotificationCenter currentNotificationCenter].delegate respondsToSelector:@selector(userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:)]) {
742-
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
743-
content.title = title;
744-
content.body = body;
745-
content.userInfo = apptentiveUserInfo;
746-
content.sound = [soundName isEqualToString:@"default"] ? [UNNotificationSound defaultSound] : [UNNotificationSound soundNamed:soundName];
751+
if (@available(iOS 10.0, *)) {
752+
if ([[UNUserNotificationCenter currentNotificationCenter].delegate respondsToSelector:@selector(userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:)]) {
753+
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
754+
content.title = title;
755+
content.body = body;
756+
content.userInfo = apptentiveUserInfo;
757+
content.sound = [soundName isEqualToString:@"default"] ? [UNNotificationSound defaultSound] : [UNNotificationSound soundNamed:soundName];
747758

748-
UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:NO];
749-
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"com.apptentive" content:content trigger:trigger];
759+
UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:1 repeats:NO];
760+
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"com.apptentive" content:content trigger:trigger];
750761

751-
[UNUserNotificationCenter.currentNotificationCenter addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
752-
if (error) {
753-
ApptentiveLogError(@"Error posting local notification: %@", error);
754-
}
755-
}];
756-
} else if ([[UIApplication sharedApplication].delegate respondsToSelector:@selector(application:didReceiveLocalNotification:)]) {
762+
[UNUserNotificationCenter.currentNotificationCenter addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
763+
if (error) {
764+
ApptentiveLogError(@"Error posting local notification: %@", error);
765+
}
766+
}];
767+
768+
return;
769+
}
770+
}
771+
772+
if ([[UIApplication sharedApplication].delegate respondsToSelector:@selector(application:didReceiveLocalNotification:)]) {
757773
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
758774
localNotification.alertTitle = title;
759775
localNotification.alertBody = body;
@@ -890,6 +906,26 @@ - (void)setAuthenticationFailureCallback:(ApptentiveAuthenticationFailureCallbac
890906
self.backend.authenticationFailureCallback = authenticationFailureCallback;
891907
}
892908

909+
#pragma mark -
910+
#pragma mark Notifications
911+
912+
- (void)registerNotifications {
913+
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForegroundNotification:) name:UIApplicationWillEnterForegroundNotification object:nil];
914+
}
915+
916+
- (void)applicationWillEnterForegroundNotification:(NSNotification *)notification {
917+
ApptentiveLogMonitor *logMonitor = [ApptentiveLogMonitor sharedInstance];
918+
if (logMonitor) {
919+
ApptentiveLogDebug(ApptentiveLogTagMonitor, @"Resuming log monitor...");
920+
[logMonitor resume];
921+
} else {
922+
ApptentiveLogDebug(ApptentiveLogTagMonitor, @"Trying to initialize log monitor...");
923+
[ApptentiveLogMonitor tryInitializeWithBaseURL:self.baseURL
924+
appKey:self.apptentiveKey
925+
signature:self.apptentiveSignature];
926+
}
927+
}
928+
893929
#pragma mark -
894930
#pragma mark Logging System
895931

@@ -933,8 +969,9 @@ @implementation ApptentiveNavigationController
933969
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder {
934970
self = [super initWithCoder:aDecoder];
935971
if (self) {
936-
if (!([UINavigationBar appearance].barTintColor || [UINavigationBar appearanceWhenContainedIn:[ApptentiveNavigationController class], nil].barTintColor)) {
937-
[UINavigationBar appearanceWhenContainedIn:[ApptentiveNavigationController class], nil].barTintColor = [UIColor whiteColor];
972+
973+
if (!([UINavigationBar appearance].barTintColor || [UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[ [ApptentiveNavigationController class] ]].barTintColor)) {
974+
[UINavigationBar appearanceWhenContainedInInstancesOfClasses:@[ [ApptentiveNavigationController class] ]].barTintColor = [UIColor whiteColor];
938975
}
939976
}
940977
return self;

Apptentive/Apptentive/ApptentiveStyleSheet.h

+9
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@ NS_ASSUME_NONNULL_BEGIN
3535
*/
3636
@interface ApptentiveStyleSheet : NSObject <ApptentiveStyle>
3737

38+
39+
/**
40+
Creates a stylesheet by loading a property list from the specified file URL.
41+
42+
@param stylePropertyListURL A file URL pointing to a style sheet property list.
43+
@return The newly-initialized style sheet, or nil if there was an error.
44+
*/
45+
- (nullable instancetype)initWithContentsOfURL:(NSURL *)stylePropertyListURL;
46+
3847
/// The font family to be used in the Apptentive UI
3948
@property (copy, nonatomic) NSString *fontFamily;
4049

0 commit comments

Comments
 (0)