From 2852dfb0e63b68b4bcb804b05bff02609fa1f03c Mon Sep 17 00:00:00 2001 From: Jeriel Ng Date: Wed, 6 Nov 2024 09:33:16 -0500 Subject: [PATCH] Version 11.3.0 --- BrazeKit.podspec | 6 +- BrazeKitCompat.podspec | 8 +- BrazeLocation.podspec | 8 +- BrazeNotificationService.podspec | 6 +- BrazePushStory.podspec | 6 +- BrazeUI.podspec | 6 +- BrazeUICompat.podspec | 6 +- CHANGELOG.md | 10 + .../project.pbxproj | 241 +++++++++++++ .../xcschemes/BannerUI-iOS.xcscheme | 95 +++++ .../xcschemes/BannerUI-visionOS.xcscheme | 95 +++++ .../Examples-Manual.xcodeproj/project.pbxproj | 154 ++++++++ .../xcshareddata/xcschemes/BannerUI.xcscheme | 95 +++++ .../project.pbxproj | 154 ++++++++ .../xcshareddata/xcschemes/BannerUI.xcscheme | 95 +++++ Examples/ObjC/Podfile | 12 + Examples/ObjC/Sources/BannerUI/AppDelegate.h | 14 + Examples/ObjC/Sources/BannerUI/AppDelegate.m | 62 ++++ .../BannerUI/FullScreenBannerViewController.h | 10 + .../BannerUI/FullScreenBannerViewController.m | 90 +++++ Examples/ObjC/Sources/BannerUI/Readme.m | 42 +++ .../BannerUI/WideBannerViewController.h | 10 + .../BannerUI/WideBannerViewController.m | 76 ++++ Examples/ObjC/manual-integration-setup.sh | 2 +- Examples/README.md | 7 + .../project.pbxproj | 243 +++++++++++++ .../xcschemes/BannerUI-iOS.xcscheme | 95 +++++ .../xcschemes/BannerUI-visionOS.xcscheme | 95 +++++ .../Examples-Manual.xcodeproj/project.pbxproj | 154 ++++++++ .../xcshareddata/xcschemes/BannerUI.xcscheme | 95 +++++ .../project.pbxproj | 154 ++++++++ .../xcshareddata/xcschemes/BannerUI.xcscheme | 95 +++++ Examples/Swift/Podfile | 12 + .../Swift/Sources/BannerUI/AppDelegate.swift | 70 ++++ .../BannerUI/FullScreenBannerView.swift | 50 +++ .../FullScreenBannerViewController.swift | 78 +++++ Examples/Swift/Sources/BannerUI/Readme.swift | 57 +++ .../Sources/BannerUI/WideBannerView.swift | 45 +++ .../BannerUI/WideBannerViewController.swift | 74 ++++ Examples/Swift/manual-integration-setup.sh | 2 +- Package.swift | 16 +- README.md | 2 +- .../BrazeKitCompat/AppboyKit/ABKContentCard.m | 4 +- .../BannerUI/BannerContentUpdates+ObjC.swift | 12 + .../BannerUI/BannerContentUpdates.swift | 21 ++ Sources/BrazeUI/BannerUI/BannerUI.swift | 2 + Sources/BrazeUI/BannerUI/BannerUIError.swift | 51 +++ Sources/BrazeUI/BannerUI/BannerUIView.swift | 331 ++++++++++++++++++ Sources/BrazeUI/BannerUI/BannerView.swift | 117 +++++++ .../BannerUI/BannerViewWebKitExt.swift | 46 +++ .../BannerUI/BannersImpressionTracker.swift | 152 ++++++++ .../BrazeUI/Dependencies/StructWrapper.swift | 14 + .../BrazeUI/Dependencies/WKWebViewExt.swift | 75 ++++ .../InAppMessageUI/InAppMessageUI.swift | 2 +- .../InAppMessageUI/InAppMessageUIExt.swift | 19 - .../Views/InAppMessageUIControlView.swift | 2 +- .../Views/InAppMessageUIHtmlView.swift | 72 +--- .../Views/InAppMessageUIModalImageView.swift | 2 +- .../Views/InAppMessageUIModalView.swift | 2 +- .../Views/InAppMessageUISlideupView.swift | 2 +- .../Views/InAppMessageViewWebKitExt.swift | 1 + .../Views/Misc/ButtonView.swift | 2 +- .../InAppMessageUI/Views/Misc/IconView.swift | 2 +- 63 files changed, 3457 insertions(+), 121 deletions(-) create mode 100644 Examples/ObjC/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-iOS.xcscheme create mode 100644 Examples/ObjC/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-visionOS.xcscheme create mode 100644 Examples/ObjC/Examples-Manual.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme create mode 100644 Examples/ObjC/Examples-SwiftPM.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme create mode 100644 Examples/ObjC/Sources/BannerUI/AppDelegate.h create mode 100644 Examples/ObjC/Sources/BannerUI/AppDelegate.m create mode 100644 Examples/ObjC/Sources/BannerUI/FullScreenBannerViewController.h create mode 100644 Examples/ObjC/Sources/BannerUI/FullScreenBannerViewController.m create mode 100644 Examples/ObjC/Sources/BannerUI/Readme.m create mode 100644 Examples/ObjC/Sources/BannerUI/WideBannerViewController.h create mode 100644 Examples/ObjC/Sources/BannerUI/WideBannerViewController.m create mode 100644 Examples/Swift/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-iOS.xcscheme create mode 100644 Examples/Swift/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-visionOS.xcscheme create mode 100644 Examples/Swift/Examples-Manual.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme create mode 100644 Examples/Swift/Examples-SwiftPM.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme create mode 100644 Examples/Swift/Sources/BannerUI/AppDelegate.swift create mode 100644 Examples/Swift/Sources/BannerUI/FullScreenBannerView.swift create mode 100644 Examples/Swift/Sources/BannerUI/FullScreenBannerViewController.swift create mode 100644 Examples/Swift/Sources/BannerUI/Readme.swift create mode 100644 Examples/Swift/Sources/BannerUI/WideBannerView.swift create mode 100644 Examples/Swift/Sources/BannerUI/WideBannerViewController.swift create mode 100644 Sources/BrazeUI/BannerUI/BannerContentUpdates+ObjC.swift create mode 100644 Sources/BrazeUI/BannerUI/BannerContentUpdates.swift create mode 100644 Sources/BrazeUI/BannerUI/BannerUI.swift create mode 100644 Sources/BrazeUI/BannerUI/BannerUIError.swift create mode 100644 Sources/BrazeUI/BannerUI/BannerUIView.swift create mode 100644 Sources/BrazeUI/BannerUI/BannerView.swift create mode 100644 Sources/BrazeUI/BannerUI/BannerViewWebKitExt.swift create mode 100644 Sources/BrazeUI/BannerUI/BannersImpressionTracker.swift create mode 100644 Sources/BrazeUI/Dependencies/StructWrapper.swift create mode 100644 Sources/BrazeUI/Dependencies/WKWebViewExt.swift diff --git a/BrazeKit.podspec b/BrazeKit.podspec index 9d6a08b0f6..7ed54af2be 100644 --- a/BrazeKit.podspec +++ b/BrazeKit.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'BrazeKit' - s.version = '11.2.0' + s.version = '11.3.0' s.summary = 'Braze Main SDK library providing support for analytics and push notifications.' s.homepage = 'https://braze.com' @@ -9,8 +9,8 @@ Pod::Spec.new do |s| s.authors = 'Braze, Inc.' s.source = { - :http => 'https://github.com/braze-inc/braze-swift-sdk/releases/download/11.2.0/BrazeKit.zip', - :sha256 => 'a0158a907dadd39b1fcb7344d9f0531e58ef72433fd7f4c04c7412291d790870' + :http => 'https://github.com/braze-inc/braze-swift-sdk/releases/download/11.3.0/BrazeKit.zip', + :sha256 => '0a2cdaef910c1154f1cd62c47db782dd7b66e2f0e9a8cdb9745f2516bbc7b707' } s.swift_version = '5.0' diff --git a/BrazeKitCompat.podspec b/BrazeKitCompat.podspec index 2324307cc7..21f2df7180 100644 --- a/BrazeKitCompat.podspec +++ b/BrazeKitCompat.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'BrazeKitCompat' - s.version = '11.2.0' + s.version = '11.3.0' s.summary = 'Compatibility library for users migrating from AppboyKit.' s.homepage = 'https://braze.com' @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.license = { :type => 'Commercial' } s.authors = 'Braze, Inc.' - s.source = { :git => 'https://github.com/braze-inc/braze-swift-sdk.git', :tag => '11.2.0' } + s.source = { :git => 'https://github.com/braze-inc/braze-swift-sdk.git', :tag => '11.3.0' } s.swift_version = '5.0' s.ios.deployment_target = '12.0' @@ -18,8 +18,8 @@ Pod::Spec.new do |s| s.public_header_files = 'Sources/BrazeKitCompat/include/*.h' s.static_framework = true - s.dependency 'BrazeKit', '11.2.0' - s.dependency 'BrazeLocation', '11.2.0' + s.dependency 'BrazeKit', '11.3.0' + s.dependency 'BrazeLocation', '11.3.0' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } end diff --git a/BrazeLocation.podspec b/BrazeLocation.podspec index fd0de33cd4..c238d224d1 100644 --- a/BrazeLocation.podspec +++ b/BrazeLocation.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'BrazeLocation' - s.version = '11.2.0' + s.version = '11.3.0' s.summary = 'Braze location library providing support for location analytics and geofence monitoring.' s.homepage = 'https://braze.com' @@ -9,8 +9,8 @@ Pod::Spec.new do |s| s.authors = 'Braze, Inc.' s.source = { - :http => 'https://github.com/braze-inc/braze-swift-sdk/releases/download/11.2.0/BrazeLocation.zip', - :sha256 => 'c7f7c9dfc721efd2df26e2566e4a1687750b251fea18432d38d51577b8afd76b' + :http => 'https://github.com/braze-inc/braze-swift-sdk/releases/download/11.3.0/BrazeLocation.zip', + :sha256 => 'ca6f518ca8017d11584c0897a701f52f20620b508208d6da68447d4e40a38ffa' } s.swift_version = '5.0' @@ -21,7 +21,7 @@ Pod::Spec.new do |s| s.vendored_framework = 'BrazeLocation.xcframework' s.resource_bundles = { 'BrazeLocation' => ['Sources/BrazeLocationResources/Resources/**/*'] } - s.dependency 'BrazeKit', '11.2.0' + s.dependency 'BrazeKit', '11.3.0' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } end diff --git a/BrazeNotificationService.podspec b/BrazeNotificationService.podspec index 2be8c3a768..681a9ca188 100644 --- a/BrazeNotificationService.podspec +++ b/BrazeNotificationService.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'BrazeNotificationService' - s.version = '11.2.0' + s.version = '11.3.0' s.summary = 'Braze notification service extension library providing support for Rich Push notifications.' s.homepage = 'https://braze.com' @@ -9,8 +9,8 @@ Pod::Spec.new do |s| s.authors = 'Braze, Inc.' s.source = { - :http => 'https://github.com/braze-inc/braze-swift-sdk/releases/download/11.2.0/BrazeNotificationService.zip', - :sha256 => '3b3c3de36795e43b5e87b4465da929226149ca1885e0a358b753f027af99af22' + :http => 'https://github.com/braze-inc/braze-swift-sdk/releases/download/11.3.0/BrazeNotificationService.zip', + :sha256 => '491f300cd9d69e00050b0480dd096a9fac742cebbf2f024fc0b5535a88e8d19c' } s.swift_version = '5.0' diff --git a/BrazePushStory.podspec b/BrazePushStory.podspec index 3f2ee3e130..f9f921437e 100644 --- a/BrazePushStory.podspec +++ b/BrazePushStory.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'BrazePushStory' - s.version = '11.2.0' + s.version = '11.3.0' s.summary = 'Braze notification content extension library providing support for Push Stories.' s.homepage = 'https://braze.com' @@ -9,8 +9,8 @@ Pod::Spec.new do |s| s.authors = 'Braze, Inc.' s.source = { - :http => 'https://github.com/braze-inc/braze-swift-sdk/releases/download/11.2.0/BrazePushStory.zip', - :sha256 => '8a06ac8bff6e8dd9a715a4fe65bb04dce9d44be38ad7cab02c8c2ed34134948e' + :http => 'https://github.com/braze-inc/braze-swift-sdk/releases/download/11.3.0/BrazePushStory.zip', + :sha256 => '13ad2cee5f3ae70ee581f257b64dae0010c849370004a979cbe2d7b3b481efda' } s.swift_version = '5.0' diff --git a/BrazeUI.podspec b/BrazeUI.podspec index 21197307ba..7ae554d1ae 100644 --- a/BrazeUI.podspec +++ b/BrazeUI.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'BrazeUI' - s.version = '11.2.0' + s.version = '11.3.0' s.summary = 'Braze-provided user interface library for In-App Messages and Content Cards.' s.homepage = 'https://braze.com' @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.license = { :type => 'Commercial' } s.authors = 'Braze, Inc.' - s.source = { :git => 'https://github.com/braze-inc/braze-swift-sdk.git', :tag => '11.2.0' } + s.source = { :git => 'https://github.com/braze-inc/braze-swift-sdk.git', :tag => '11.3.0' } s.swift_version = '5.0' s.ios.deployment_target = '12.0' @@ -18,7 +18,7 @@ Pod::Spec.new do |s| s.resource_bundles = { 'BrazeUI' => ['Sources/BrazeUI/Resources/**/*'] } s.static_framework = true - s.dependency 'BrazeKit', '11.2.0' + s.dependency 'BrazeKit', '11.3.0' s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } end diff --git a/BrazeUICompat.podspec b/BrazeUICompat.podspec index 9dfa0f8a59..6fd9280af3 100644 --- a/BrazeUICompat.podspec +++ b/BrazeUICompat.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'BrazeUICompat' - s.version = '11.2.0' + s.version = '11.3.0' s.summary = 'Compatibility UI library for users migrating from AppboyUI.' s.homepage = 'https://braze.com' @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.license = { :type => 'Commercial' } s.authors = 'Braze, Inc.' - s.source = { :git => 'https://github.com/braze-inc/braze-swift-sdk.git', :tag => '11.2.0' } + s.source = { :git => 'https://github.com/braze-inc/braze-swift-sdk.git', :tag => '11.3.0' } s.swift_version = '5.0' s.ios.deployment_target = '12.0' @@ -18,7 +18,7 @@ Pod::Spec.new do |s| s.resource_bundles = { 'BrazeUICompat' => 'Sources/BrazeUICompat/*/Resources/**/*.*' } s.static_framework = true - s.dependency 'BrazeKitCompat', '11.2.0' + s.dependency 'BrazeKitCompat', '11.3.0' s.dependency 'SDWebImage', '>= 5.19.7', '< 6' s.user_target_xcconfig = { 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES' } diff --git a/CHANGELOG.md b/CHANGELOG.md index e31427824f..c4ee5ac200 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +## 11.3.0 + +##### Fixed +- Fixes a behavior where calling the `logClick` bridge method in HTML in-app messages with `""` as the button ID would log an error. + - Instead, this would log an in-app message body click to match other platforms. + +##### Added +- Adds support for the Braze Banner Cards product. + - For usage details, refer to our tutorial [here](https://braze-inc.github.io/braze-swift-sdk/tutorials/braze/c4-bannersui). + ## 11.2.0 ##### Fixed diff --git a/Examples/ObjC/Examples-CocoaPods.xcodeproj/project.pbxproj b/Examples/ObjC/Examples-CocoaPods.xcodeproj/project.pbxproj index d5f5ec8ba1..d7f72a9f9c 100644 --- a/Examples/ObjC/Examples-CocoaPods.xcodeproj/project.pbxproj +++ b/Examples/ObjC/Examples-CocoaPods.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ 026882EA86255E4AA554035A /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = 77273E47E0A73317EF0235A7 /* Credentials.m */; }; 02D39B681AC38D3E38167BC9 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E06A48D3D2F38E11DAA4C05E /* ReadmeViewController.m */; }; 0474AF59A3BBD8ADD1EA136E /* BRZGIFViewProvider+SDWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 21C04E748BC80720A72FE18A /* BRZGIFViewProvider+SDWebImage.m */; }; + 050F4233BFD50E658876B373 /* FullScreenBannerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 288AD91FB9535494739F57A9 /* FullScreenBannerViewController.m */; }; 056AB4AFF6BEC7205C874129 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0EA46B7F46275141BF76209 /* main.m */; }; 0575EAD45DC713FDFA430364 /* CustomInAppMessagePresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 2697E60398EE452C7E362B83 /* CustomInAppMessagePresenter.m */; }; 08B5B0B4850594BD052D8A4A /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A77FC218A1A67D5037DC3FF /* empty-file.swift */; }; @@ -23,6 +24,7 @@ 0E0A608E0864361CAC7512BD /* NotificationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61DA261A3969E80D4910B919 /* NotificationViewController.swift */; }; 0FBA9A6BF5F0972F15075730 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E06A48D3D2F38E11DAA4C05E /* ReadmeViewController.m */; }; 102CF63E686EDC624805B196 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0EA46B7F46275141BF76209 /* main.m */; }; + 132424772CC351CCEAA2F735 /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = B6847C1027BF34B7177EA70B /* Readme.m */; }; 134617EE423ED9AA507DF6AD /* PushNotificationsContentExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = EB96485E099438DAB9547DF5 /* PushNotificationsContentExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 163526223623B063A095F0E3 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A77FC218A1A67D5037DC3FF /* empty-file.swift */; }; 17D29A1B76A1C42B44C7A8BC /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CABCDD10D6E23AB146F9F7BA /* LaunchScreen.storyboard */; }; @@ -31,6 +33,7 @@ 189EE6D3E6666D84E091A8E9 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 88414679C671DCEC826AE04E /* AppDelegate.m */; }; 18DE204B580AF59319172A34 /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = 77273E47E0A73317EF0235A7 /* Credentials.m */; }; 197CC45A9866F6536844449F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; + 1AAB452EDBDC5D9F084DF9A5 /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = 77273E47E0A73317EF0235A7 /* Credentials.m */; }; 1EB7F46010C2EE195B7F82DA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; 2004486C1F497F0D78D3C3C7 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CABCDD10D6E23AB146F9F7BA /* LaunchScreen.storyboard */; }; 20EA0B03CAEC54003499D8D4 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E06A48D3D2F38E11DAA4C05E /* ReadmeViewController.m */; }; @@ -51,9 +54,11 @@ 2CFB9852DA7AD64058AF53FA /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0EA46B7F46275141BF76209 /* main.m */; }; 2D02D8ADF963BCFCAB1D3683 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6208C00FB5F7F0284A26EF20 /* UserNotifications.framework */; }; 2EF8FB56D4B1954D5FDE8AAC /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = 52B0E04E20E4B1C458222BA1 /* Readme.m */; }; + 314F9EAF101B0AA0E283BB89 /* WideBannerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 356CB255CC90C5C9DAC29848 /* WideBannerViewController.m */; }; 3170955318006DA2CDC1D371 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0EA46B7F46275141BF76209 /* main.m */; }; 330538042DBA8D66FE29106B /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = 77273E47E0A73317EF0235A7 /* Credentials.m */; }; 3378DAE43C5EDE386F72D7BB /* PushNotificationsServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 025C514A87C7682650C8F612 /* PushNotificationsServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 33EBE6E0A3C2703734EF9C34 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0EA46B7F46275141BF76209 /* main.m */; }; 34A7652FC91B0C32C6FBDDA3 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A77FC218A1A67D5037DC3FF /* empty-file.swift */; }; 34C9C566ACB7B6220C782866 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5A56AB422F8DA782A8D2B6FD /* LaunchScreen.storyboard */; }; 3A0E77C6129C6E64AF9BB382 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0EA46B7F46275141BF76209 /* main.m */; }; @@ -68,7 +73,9 @@ 40BBC96C23C0D03C1876EFB3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; 41CAA99CD3F8DF599AFB2109 /* NotAvailableInObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 22CCAE08D319D0CD9AC2E7BC /* NotAvailableInObjC.m */; }; 42A9ED09E8E44A858AE13EFC /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A77FC218A1A67D5037DC3FF /* empty-file.swift */; }; + 453330607F35D913C48DDCE8 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E06A48D3D2F38E11DAA4C05E /* ReadmeViewController.m */; }; 4668AEE87D6BFB57357E49F8 /* InAppMessageInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 763258DB970F0A96B2A3DF74 /* InAppMessageInfoViewController.m */; }; + 46990FDB3A6018F0B87122E7 /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = B6847C1027BF34B7177EA70B /* Readme.m */; }; 474A97EA37572E933D5B17B8 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0EA46B7F46275141BF76209 /* main.m */; }; 47BF889155DEA885F5077C07 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E06A48D3D2F38E11DAA4C05E /* ReadmeViewController.m */; }; 48F75AD192CDFD6BC1FFC575 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BBDB1613508BE9FFD3D05EA /* AppDelegate.m */; }; @@ -82,9 +89,12 @@ 4FBBFDC7A8AD63635182DCCC /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = 77273E47E0A73317EF0235A7 /* Credentials.m */; }; 505878B30DC03D2DEDE05E05 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; 5064BAE3FFA9153AFCCE50DF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CABCDD10D6E23AB146F9F7BA /* LaunchScreen.storyboard */; }; + 518FE99CB2BEAA57753E2A14 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = AFAE486C714A1CDE35BC69BA /* AppDelegate.m */; }; 523DC27FE8962E3A3CE695F0 /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C307795934847C752765580 /* Readme.m */; }; + 5312D66C95FC98E34439D9B0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; 5443B297E55EFFA3D9531EB5 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A9AF15EF29118835FEB5D5E2 /* AppDelegate.m */; }; 55204FC9ED5EA1C9F6F1260D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B05D9F05DB566D0DE7AE92C9 /* AppDelegate.m */; }; + 579386C6FBD6BAAAEFFD6882 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A77FC218A1A67D5037DC3FF /* empty-file.swift */; }; 5A11F40332720602D77FB878 /* CheckoutViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 133CC7FED120DA4BC4F63478 /* CheckoutViewController.m */; }; 614C896736BBDCBB171D6D3C /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6208C00FB5F7F0284A26EF20 /* UserNotifications.framework */; }; 615E27ED764B63BE6414F1C2 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A77FC218A1A67D5037DC3FF /* empty-file.swift */; }; @@ -107,6 +117,7 @@ 7493B2FFD2F11599A02795B2 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A77FC218A1A67D5037DC3FF /* empty-file.swift */; }; 7541DB19315B784540A1675C /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 88414679C671DCEC826AE04E /* AppDelegate.m */; }; 756350E7C92625894BC8B509 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0EA46B7F46275141BF76209 /* main.m */; }; + 7A3054A03EF9AE28014994FD /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = 77273E47E0A73317EF0235A7 /* Credentials.m */; }; 7A584EF597483821706EC8BB /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0EA46B7F46275141BF76209 /* main.m */; }; 7B42DB1C3DB17FD665F00A85 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A77FC218A1A67D5037DC3FF /* empty-file.swift */; }; 7B687808B107F9D98A010616 /* CustomInAppMessagePresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 2697E60398EE452C7E362B83 /* CustomInAppMessagePresenter.m */; }; @@ -115,6 +126,7 @@ 7E8AD3897D9983306EE938B9 /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = 77273E47E0A73317EF0235A7 /* Credentials.m */; }; 7E93EB8FDF68F8127A0003CF /* PushNotificationsContentExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 2F8034AC1A6839C07DF75941 /* PushNotificationsContentExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 7EDA3421CAC61750552B52C1 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E06A48D3D2F38E11DAA4C05E /* ReadmeViewController.m */; }; + 7F1111D6FB86D3950005D97A /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E06A48D3D2F38E11DAA4C05E /* ReadmeViewController.m */; }; 8179A760938B01AA674C5E9F /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 201DC51A7B4BD5035790D967 /* AppDelegate.m */; }; 832C94F7802D74360050627C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; 85C631B6E1D8BE584F1F4D4A /* PushNotificationsServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 72614321094796ABD86A5AA6 /* PushNotificationsServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; @@ -132,6 +144,7 @@ 8FD0F8EF53945DCDBDD405C3 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 453E08A2BFC20694C68880F0 /* AppDelegate.m */; }; 90A4F6B53E0118D3661585D4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0EA46B7F46275141BF76209 /* main.m */; }; 921A10D04DDEA806DF21F29B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0EA46B7F46275141BF76209 /* main.m */; }; + 93D55D7EFEE70FD39AD4EF13 /* WideBannerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 356CB255CC90C5C9DAC29848 /* WideBannerViewController.m */; }; 93F51ADCC2F81D43C7200194 /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = 45F98A25BAAEE5DC418161B1 /* Readme.m */; }; 94B4B2402F3B4DF699641CE9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; 9ACDCF377DDDFE68EC46E40C /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 201DC51A7B4BD5035790D967 /* AppDelegate.m */; }; @@ -145,6 +158,7 @@ A5879CAB0B6EB4B04AA8B083 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A77FC218A1A67D5037DC3FF /* empty-file.swift */; }; A59B5541D8BDA70A1818AFDB /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0EA46B7F46275141BF76209 /* main.m */; }; A5C3AEA8DEAB2F5A5B83E470 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E06A48D3D2F38E11DAA4C05E /* ReadmeViewController.m */; }; + A60B2E77DFACCA5AE551786D /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = AFAE486C714A1CDE35BC69BA /* AppDelegate.m */; }; A6FAADE725F752D3BD3C170F /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = 77273E47E0A73317EF0235A7 /* Credentials.m */; }; A834575E7697CCF6782DB0C7 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E06A48D3D2F38E11DAA4C05E /* ReadmeViewController.m */; }; A841C03E3FC310874204BBBF /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DCD5EA6DB57BDEF9D156AF3B /* AppDelegate.m */; }; @@ -154,6 +168,7 @@ AA9687A7D3DF585AC6F6D718 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 201DC51A7B4BD5035790D967 /* AppDelegate.m */; }; AB2FE63CFBECFD1045D16ED7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; AC9B0B424486FC0912BD72D9 /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = 77273E47E0A73317EF0235A7 /* Credentials.m */; }; + ADEEA01EFF0D87591BE5FD74 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; AE2F0A77BEBE9A60E448A1C7 /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = 3EE8EFDC1CAFFB4F4CB5D00D /* Readme.m */; }; AE68881832BF3782E13CB456 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CABCDD10D6E23AB146F9F7BA /* LaunchScreen.storyboard */; }; AED9CDDB610D3B9FF090A880 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0EA46B7F46275141BF76209 /* main.m */; }; @@ -177,12 +192,15 @@ C0D33859C6D3087FCD453D9F /* PushNotificationsContentExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = EB96485E099438DAB9547DF5 /* PushNotificationsContentExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; C0D38B13A94DADB550966E38 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5A56AB422F8DA782A8D2B6FD /* LaunchScreen.storyboard */; }; C25E42027E9FF502BA7D7269 /* CardsInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CF4B96FFF47505E424237B85 /* CardsInfoViewController.m */; }; + C3EFEE994DA198C7D420FE6B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CABCDD10D6E23AB146F9F7BA /* LaunchScreen.storyboard */; }; C650783920A53EDD98DD19E5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CABCDD10D6E23AB146F9F7BA /* LaunchScreen.storyboard */; }; C670BDE41367D4C18C9C27D3 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A77FC218A1A67D5037DC3FF /* empty-file.swift */; }; C6A06C3B17248E8369F21897 /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C307795934847C752765580 /* Readme.m */; }; + C7007E9DB1B18A24E8F1506E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0EA46B7F46275141BF76209 /* main.m */; }; C75C09FC6605F02E7646AF0F /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = 52B0E04E20E4B1C458222BA1 /* Readme.m */; }; C8506C62CCCD592FDF718D48 /* PushNotificationsContentExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 2F8034AC1A6839C07DF75941 /* PushNotificationsContentExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; CD226CFF2170628172C6385B /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A77FC218A1A67D5037DC3FF /* empty-file.swift */; }; + CE06F05766F725C6B571CB5F /* FullScreenBannerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 288AD91FB9535494739F57A9 /* FullScreenBannerViewController.m */; }; CF19792AFCEF53A28612612B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; D01C0090F24D13062F394593 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0EA46B7F46275141BF76209 /* main.m */; }; D0DECD56C8F8201D27F59B32 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E06A48D3D2F38E11DAA4C05E /* ReadmeViewController.m */; }; @@ -237,6 +255,7 @@ FA75B7DE8BC13AF86D469465 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = A9AF15EF29118835FEB5D5E2 /* AppDelegate.m */; }; FABBA04DA0A4157969DC55B6 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A77FC218A1A67D5037DC3FF /* empty-file.swift */; }; FACAC893B82FD5F310E63BBF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; + FD44D510CB7B092B6AD0E733 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A77FC218A1A67D5037DC3FF /* empty-file.swift */; }; FDFE0B5AD6C85ABC76895E1F /* CheckoutViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 133CC7FED120DA4BC4F63478 /* CheckoutViewController.m */; }; FE5B1117D24926292E583750 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E06A48D3D2F38E11DAA4C05E /* ReadmeViewController.m */; }; FE95DF7DDE9D81181A89AB00 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E06A48D3D2F38E11DAA4C05E /* ReadmeViewController.m */; }; @@ -413,6 +432,7 @@ 0D27FC50D2EF457F536B1D05 /* Analytics.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = Analytics.app; sourceTree = BUILT_PRODUCTS_DIR; }; 11D86AE9D1DC590AC4694323 /* AuthenticationManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AuthenticationManager.m; sourceTree = ""; }; 133CC7FED120DA4BC4F63478 /* CheckoutViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CheckoutViewController.m; sourceTree = ""; }; + 14BBB11A8EAB3794FCB52C38 /* BannerUI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = BannerUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1874579DE7E406E73A3CB3A1 /* UserNotificationsUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotificationsUI.framework; path = System/Library/Frameworks/UserNotificationsUI.framework; sourceTree = SDKROOT; }; 1CA06BB2ED58DC38DE098EEB /* CustomInAppMessagePresenter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CustomInAppMessagePresenter.h; sourceTree = ""; }; 201DC51A7B4BD5035790D967 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; @@ -421,11 +441,14 @@ 22CCAE08D319D0CD9AC2E7BC /* NotAvailableInObjC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotAvailableInObjC.m; sourceTree = ""; }; 249AA3BCC2DA49BBBD853C61 /* InAppMessageInfoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = InAppMessageInfoViewController.h; sourceTree = ""; }; 2697E60398EE452C7E362B83 /* CustomInAppMessagePresenter.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CustomInAppMessagePresenter.m; sourceTree = ""; }; + 288AD91FB9535494739F57A9 /* FullScreenBannerViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FullScreenBannerViewController.m; sourceTree = ""; }; 2F8034AC1A6839C07DF75941 /* PushNotificationsContentExtension.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = PushNotificationsContentExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 30A0DFD80FCA5043A1BEE12E /* PushNotifications-DelayedInitialization.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "PushNotifications-DelayedInitialization.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3151B323AB3A5ECF3CA4A0A2 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 318B57C50A12DB5F02FC6224 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 320771F5F893662C2BA93D24 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 34DB46A770028DFE645A3AE4 /* Location.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = Location.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 356CB255CC90C5C9DAC29848 /* WideBannerViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WideBannerViewController.m; sourceTree = ""; }; 36429750999AB8D731442248 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 3EE8EFDC1CAFFB4F4CB5D00D /* Readme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Readme.m; sourceTree = ""; }; 42BA0F61D883E0421B3FA7CA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; @@ -445,10 +468,12 @@ 6208C00FB5F7F0284A26EF20 /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; 6832319B66FB76CAA84519FA /* Location.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = Location.app; sourceTree = BUILT_PRODUCTS_DIR; }; 686098660857D5462CAF8E48 /* Readme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Readme.m; sourceTree = ""; }; + 6CD4675CD37E8D52090B309D /* BannerUI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = BannerUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; 7127ABB9B4C02043D02B278E /* InAppMessageUI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = InAppMessageUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; 72614321094796ABD86A5AA6 /* PushNotificationsServiceExtension.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = PushNotificationsServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 763258DB970F0A96B2A3DF74 /* InAppMessageInfoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InAppMessageInfoViewController.m; sourceTree = ""; }; 77273E47E0A73317EF0235A7 /* Credentials.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Credentials.m; sourceTree = ""; }; + 79FA659C77CFB82709B7532A /* FullScreenBannerViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FullScreenBannerViewController.h; sourceTree = ""; }; 80CF36610D640D20AB35926E /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 8644B16658ADD00DC06DA1DE /* BRZGIFViewProvider+SDWebImage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "BRZGIFViewProvider+SDWebImage.m"; sourceTree = ""; }; 88414679C671DCEC826AE04E /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; @@ -465,8 +490,11 @@ A77BCD95413ADCF8578235CE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; A9AF15EF29118835FEB5D5E2 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; AE1E01D537E51875B6C2DD5A /* Readme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Readme.m; sourceTree = ""; }; + AFAE486C714A1CDE35BC69BA /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; B05D9F05DB566D0DE7AE92C9 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + B518E4E09D196D7C45E30A38 /* WideBannerViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WideBannerViewController.h; sourceTree = ""; }; B65615CB6F044C414CAF1654 /* ContentCardUI-Customization.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "ContentCardUI-Customization.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + B6847C1027BF34B7177EA70B /* Readme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Readme.m; sourceTree = ""; }; BA064323F91A22F4E14CAE9D /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; BA37FE8457A48CD8683BE79A /* CardsInfoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CardsInfoViewController.h; sourceTree = ""; }; BDC50080223D78243A47D144 /* PushNotifications-Automatic.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "PushNotifications-Automatic.app"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -607,6 +635,7 @@ children = ( EB043806B7BB06DCA25E0177 /* Common */, 51FBDA444B2130ED53F050CB /* Analytics */, + 7E7E0C2117F579E6C76C0B82 /* BannerUI */, 6F112DA3865BFE3961698859 /* ContentCards-Custom-UI */, F500AE7A04E46943FAA225C4 /* ContentCardUI */, CFAE53A0FC9D7251D24F9F70 /* ContentCardUI-Customization */, @@ -665,12 +694,29 @@ path = tvOS; sourceTree = ""; }; + 7E7E0C2117F579E6C76C0B82 /* BannerUI */ = { + isa = PBXGroup; + children = ( + 3151B323AB3A5ECF3CA4A0A2 /* AppDelegate.h */, + AFAE486C714A1CDE35BC69BA /* AppDelegate.m */, + 79FA659C77CFB82709B7532A /* FullScreenBannerViewController.h */, + 288AD91FB9535494739F57A9 /* FullScreenBannerViewController.m */, + B6847C1027BF34B7177EA70B /* Readme.m */, + B518E4E09D196D7C45E30A38 /* WideBannerViewController.h */, + 356CB255CC90C5C9DAC29848 /* WideBannerViewController.m */, + ); + name = BannerUI; + path = Sources/BannerUI; + sourceTree = ""; + }; 944D5C0BF6DC0B28ACDA2036 /* Products */ = { isa = PBXGroup; children = ( 9E2B80BBE3951963FBA6BBD3 /* Analytics.app */, DE3608B9E460175A349CDB87 /* Analytics.app */, 0D27FC50D2EF457F536B1D05 /* Analytics.app */, + 6CD4675CD37E8D52090B309D /* BannerUI.app */, + 14BBB11A8EAB3794FCB52C38 /* BannerUI.app */, 8854CADF86F02FA64B2CC3F1 /* ContentCards-Custom-UI.app */, C78E0B5A5D52F990511A4091 /* ContentCards-Custom-UI.app */, 552EA65890BB8DAA0D631388 /* ContentCards-Custom-UI.app */, @@ -1072,6 +1118,22 @@ productReference = F3C2ED512ED12F090A1DC54C /* PushNotifications-Manual.app */; productType = "com.apple.product-type.application"; }; + 7C8E32C853480800C57DC8E7 /* BannerUI-visionOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 38C0BD9C07673F37A09A19E3 /* Build configuration list for PBXNativeTarget "BannerUI-visionOS" */; + buildPhases = ( + CA22BA010905FB1B028F5E91 /* Sources */, + 0F5408060052FDBB85EAE34A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "BannerUI-visionOS"; + productName = "BannerUI-visionOS"; + productReference = 14BBB11A8EAB3794FCB52C38 /* BannerUI.app */; + productType = "com.apple.product-type.application"; + }; A003570FDB24621EC4EA44CD /* InAppMessageUI-iOS */ = { isa = PBXNativeTarget; buildConfigurationList = 164687F613B08495D152F03E /* Build configuration list for PBXNativeTarget "InAppMessageUI-iOS" */; @@ -1267,6 +1329,22 @@ productReference = F90C9DB8B3DF39E04E70DAAB /* ContentCardUI.app */; productType = "com.apple.product-type.application"; }; + FAFC8B1833A6F20A7D444193 /* BannerUI-iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 109F81262E896319C249EA14 /* Build configuration list for PBXNativeTarget "BannerUI-iOS" */; + buildPhases = ( + 42183F1691A493E061D74045 /* Sources */, + 6BC3A42AA571E6E4A914E021 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "BannerUI-iOS"; + productName = "BannerUI-iOS"; + productReference = 6CD4675CD37E8D52090B309D /* BannerUI.app */; + productType = "com.apple.product-type.application"; + }; FDA0A7B4C40914EAF405D9FC /* Analytics-tvOS */ = { isa = PBXNativeTarget; buildConfigurationList = 33A0A8897465C6BD7C17C2E6 /* Build configuration list for PBXNativeTarget "Analytics-tvOS" */; @@ -1343,6 +1421,9 @@ 7A56C6610176F67086A05593 = { ProvisioningStyle = automatic; }; + 7C8E32C853480800C57DC8E7 = { + ProvisioningStyle = automatic; + }; A003570FDB24621EC4EA44CD = { ProvisioningStyle = automatic; }; @@ -1379,6 +1460,9 @@ F7627CCAD54F489968127C71 = { ProvisioningStyle = automatic; }; + FAFC8B1833A6F20A7D444193 = { + ProvisioningStyle = automatic; + }; FDA0A7B4C40914EAF405D9FC = { ProvisioningStyle = automatic; }; @@ -1399,6 +1483,8 @@ A0EF8DC5C1ED6288C32D3D23 /* Analytics-iOS */, FDA0A7B4C40914EAF405D9FC /* Analytics-tvOS */, 1A20DFCA0DF677F61651351C /* Analytics-visionOS */, + FAFC8B1833A6F20A7D444193 /* BannerUI-iOS */, + 7C8E32C853480800C57DC8E7 /* BannerUI-visionOS */, 027F5C80F4345CD80EAB6233 /* ContentCardUI-Customization-iOS */, 75C44F728211105AB0B11127 /* ContentCardUI-Customization-visionOS */, C160EA300423AABE590DA8FE /* ContentCardUI-iOS */, @@ -1431,6 +1517,14 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 0F5408060052FDBB85EAE34A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ADEEA01EFF0D87591BE5FD74 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 13074D7ABBEC686036D4B4ED /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1551,6 +1645,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 6BC3A42AA571E6E4A914E021 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5312D66C95FC98E34439D9B0 /* Assets.xcassets in Resources */, + C3EFEE994DA198C7D420FE6B /* LaunchScreen.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 7299DD69BA7DDA59FA7F954F /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1781,6 +1884,21 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 42183F1691A493E061D74045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A60B2E77DFACCA5AE551786D /* AppDelegate.m in Sources */, + 1AAB452EDBDC5D9F084DF9A5 /* Credentials.m in Sources */, + 050F4233BFD50E658876B373 /* FullScreenBannerViewController.m in Sources */, + 46990FDB3A6018F0B87122E7 /* Readme.m in Sources */, + 453330607F35D913C48DDCE8 /* ReadmeViewController.m in Sources */, + 314F9EAF101B0AA0E283BB89 /* WideBannerViewController.m in Sources */, + FD44D510CB7B092B6AD0E733 /* empty-file.swift in Sources */, + 33EBE6E0A3C2703734EF9C34 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4A2ADA87B5A7F8E2B9688416 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1925,6 +2043,21 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + CA22BA010905FB1B028F5E91 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 518FE99CB2BEAA57753E2A14 /* AppDelegate.m in Sources */, + 7A3054A03EF9AE28014994FD /* Credentials.m in Sources */, + CE06F05766F725C6B571CB5F /* FullScreenBannerViewController.m in Sources */, + 132424772CC351CCEAA2F735 /* Readme.m in Sources */, + 7F1111D6FB86D3950005D97A /* ReadmeViewController.m in Sources */, + 93D55D7EFEE70FD39AD4EF13 /* WideBannerViewController.m in Sources */, + 579386C6FBD6BAAAEFFD6882 /* empty-file.swift in Sources */, + C7007E9DB1B18A24E8F1506E /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; CC26E24EBD92820E5DD0488B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2547,6 +2680,28 @@ }; name = Release; }; + 4BFEADB9B0027E777D3C7794 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = automatic; + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.braze.BannerUI-visionOS"; + PRODUCT_NAME = BannerUI; + SDKROOT = xros; + SUPPORTS_MACCATALYST = YES; + "SUPPORTS_MACCATALYST[sdk=appletvos*]" = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = 7; + }; + name = Debug; + }; 4EBD32EE3B16C9EBF7493F73 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3215,6 +3370,29 @@ }; name = Release; }; + B7779E3DFA5B6D0B19DA5EBA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = automatic; + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.braze.BannerUI-iOS"; + PRODUCT_NAME = BannerUI; + SDKROOT = iphoneos; + SUPPORTS_MACCATALYST = YES; + "SUPPORTS_MACCATALYST[sdk=appletvos*]" = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; BA01071103F7280839CDFBF1 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3494,6 +3672,29 @@ }; name = Debug; }; + F1F0BAE70D9F7A6F01185BC3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = automatic; + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.braze.BannerUI-iOS"; + PRODUCT_NAME = BannerUI; + SDKROOT = iphoneos; + SUPPORTS_MACCATALYST = YES; + "SUPPORTS_MACCATALYST[sdk=appletvos*]" = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; F5929C3F0AEDBA673A70D39A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3517,6 +3718,28 @@ }; name = Debug; }; + F6D1095489DB346DC0EF951F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = automatic; + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.braze.BannerUI-visionOS"; + PRODUCT_NAME = BannerUI; + SDKROOT = xros; + SUPPORTS_MACCATALYST = YES; + "SUPPORTS_MACCATALYST[sdk=appletvos*]" = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = 7; + }; + name = Release; + }; F97E175B39C55208E8A73860 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3627,6 +3850,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 109F81262E896319C249EA14 /* Build configuration list for PBXNativeTarget "BannerUI-iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F1F0BAE70D9F7A6F01185BC3 /* Debug */, + B7779E3DFA5B6D0B19DA5EBA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; 164687F613B08495D152F03E /* Build configuration list for PBXNativeTarget "InAppMessageUI-iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -3663,6 +3895,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 38C0BD9C07673F37A09A19E3 /* Build configuration list for PBXNativeTarget "BannerUI-visionOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4BFEADB9B0027E777D3C7794 /* Debug */, + F6D1095489DB346DC0EF951F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; 38CA0A5742C4A4988D4584C2 /* Build configuration list for PBXNativeTarget "ContentCards-Custom-UI-tvOS" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Examples/ObjC/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-iOS.xcscheme b/Examples/ObjC/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-iOS.xcscheme new file mode 100644 index 0000000000..84ccec1f2d --- /dev/null +++ b/Examples/ObjC/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-iOS.xcscheme @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/ObjC/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-visionOS.xcscheme b/Examples/ObjC/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-visionOS.xcscheme new file mode 100644 index 0000000000..bbec544ab5 --- /dev/null +++ b/Examples/ObjC/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-visionOS.xcscheme @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/ObjC/Examples-Manual.xcodeproj/project.pbxproj b/Examples/ObjC/Examples-Manual.xcodeproj/project.pbxproj index eccd126d3a..6f2ed30a7c 100644 --- a/Examples/ObjC/Examples-Manual.xcodeproj/project.pbxproj +++ b/Examples/ObjC/Examples-Manual.xcodeproj/project.pbxproj @@ -41,12 +41,16 @@ 355BBF4B6E8689E0CE5D41AB /* BrazeKit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 963312B05750D1D4DA77128F /* BrazeKit.bundle */; }; 391C03356324006B0FFB97C2 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = FD2B01F5A3DBFBBA7D8F3B8E /* AppDelegate.m */; }; 3BAE2C980D9120D9600A6680 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DEEEEC6C495A8FB90C87DF /* empty-file.swift */; }; + 3BD6A35018FC2A4C76AE0530 /* BrazeUI.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 85365B9C180AB9BA57FBD249 /* BrazeUI.bundle */; }; 3C26CEE31384DDD8FE6C2BB8 /* InAppMessageInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FF70757F8A0B7AF074017E1 /* InAppMessageInfoViewController.m */; }; 3FB06BB3F6967AD6EBAC533F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AEF0FF04032299A31D37CDE4 /* Assets.xcassets */; }; 409298693A8374A7F8734E0C /* BrazeKit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 963312B05750D1D4DA77128F /* BrazeKit.bundle */; }; 40D7B28F3472BA18FC36845E /* BrazeUI.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF2ED58955148E8CDC8E8666 /* BrazeUI.xcframework */; }; 41BB9F80FCFCA93D27CE0C26 /* PushNotificationsServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = A9A04673678B1EEA9C7559C6 /* PushNotificationsServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 41D6E795D0E5ABE4045EB223 /* BrazeKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE1AFA11EB03A5B1BEA614A2 /* BrazeKit.xcframework */; }; 44172750F5FB20FE4607F6DA /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 81C45FA8942EBB59E74A5B38 /* AppDelegate.m */; }; + 444F050EFACA151D1C062162 /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = 300EE8F0E93BE17A2E191D94 /* Credentials.m */; }; + 4543C718999B2E1B8BEDA310 /* WideBannerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0278A1ADBD861A848C8038F3 /* WideBannerViewController.m */; }; 494B43DC45CECDE1E0479BEB /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C7CD7AB410DAB0417F872BA8 /* ReadmeViewController.m */; }; 495BF744D66F999FF8B4A4AC /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DEEEEC6C495A8FB90C87DF /* empty-file.swift */; }; 4E5A3E6B086DCDA601A8A014 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AEF0FF04032299A31D37CDE4 /* Assets.xcassets */; }; @@ -64,11 +68,13 @@ 5DA56B71104A85AF4B922AF5 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95ACBEAE19ACF0BAFECD47EB /* UserNotifications.framework */; }; 5E3E68099D1B5E370178846F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AEF0FF04032299A31D37CDE4 /* Assets.xcassets */; }; 5F5660D8B8A46B88335DE902 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DEEEEC6C495A8FB90C87DF /* empty-file.swift */; }; + 6448DCF373ADA01F8F4198D5 /* BrazeUI.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF2ED58955148E8CDC8E8666 /* BrazeUI.xcframework */; }; 68D9FE94418D0B5F1F72030E /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DEEEEC6C495A8FB90C87DF /* empty-file.swift */; }; 68F4DFCF05663ED0A9594194 /* BrazePushStory.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 57FB3263FD36197097B5BE6D /* BrazePushStory.xcframework */; }; 699FAE89EED5EF3C2EBCD51F /* BRZGIFViewProvider+SDWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8BB8D0C42DD214E799D07D /* BRZGIFViewProvider+SDWebImage.m */; }; 6C065226833B8EC7CCEEDA05 /* BrazeKit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 963312B05750D1D4DA77128F /* BrazeKit.bundle */; }; 6FD038989CBFFFF22C8255EF /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C8D7F1FE2EE80796BE4B2B76 /* main.m */; }; + 718AAE986BC68399FAA5348A /* FullScreenBannerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 480C92516E1646A791F1DFB6 /* FullScreenBannerViewController.m */; }; 753ADE8311DFFFAFC36F0CCB /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C7CD7AB410DAB0417F872BA8 /* ReadmeViewController.m */; }; 7801A2CF2663FCC7A4D1D854 /* AuthenticationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 70C9AC9B199D50C1B6B422B3 /* AuthenticationManager.m */; }; 799207DEB712E13B6E05DE2C /* BrazeKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE1AFA11EB03A5B1BEA614A2 /* BrazeKit.xcframework */; }; @@ -78,6 +84,7 @@ 87B56CCE5A48D906FC4EFEEA /* BrazeUI.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 85365B9C180AB9BA57FBD249 /* BrazeUI.bundle */; }; 8B0FD329DA9C8718F16815A6 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DEEEEC6C495A8FB90C87DF /* empty-file.swift */; }; 8CF50D30A2CDC7546362F501 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FE136ACE6CEBDCB80A043F8 /* AppDelegate.m */; }; + 8D46DC758445E0040EFA3E71 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DEEEEC6C495A8FB90C87DF /* empty-file.swift */; }; 8E063012B69E9A6DB62071E7 /* SDWebImage.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE6FAA10D6D23B01068CC18C /* SDWebImage.xcframework */; }; 9113FB5F9C9F3DD15C140945 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C8D7F1FE2EE80796BE4B2B76 /* main.m */; }; 97056EA2050118D53C498800 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DEEEEC6C495A8FB90C87DF /* empty-file.swift */; }; @@ -89,6 +96,7 @@ 9F3AC9D1DDCAF648DD0B6429 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DEEEEC6C495A8FB90C87DF /* empty-file.swift */; }; 9FA9D948525624B0203FC558 /* BRZGIFViewProvider+SDWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 87C1CF136D11D5168491F769 /* BRZGIFViewProvider+SDWebImage.m */; }; A1E8B7883D7845AC370E5F8B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C8D7F1FE2EE80796BE4B2B76 /* main.m */; }; + A209C2D9D02408F5C7A8282E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AEF0FF04032299A31D37CDE4 /* Assets.xcassets */; }; A23043648FD2CC23749714C0 /* BrazeKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE1AFA11EB03A5B1BEA614A2 /* BrazeKit.xcframework */; }; A3899B99283411D1D254D7B8 /* SDWebImage.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A4862669D8E8CC116B81CDB2 /* SDWebImage.bundle */; }; A4445C57E438F59CE5E4470D /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C7CD7AB410DAB0417F872BA8 /* ReadmeViewController.m */; }; @@ -101,6 +109,7 @@ AC42EEC63BB5C2C2E2B14DCF /* BrazeNotificationService.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30D72A9C07BEDB9E09FAE84D /* BrazeNotificationService.xcframework */; }; AE1DA3ADF30A1A8DA05C2DCC /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C8D7F1FE2EE80796BE4B2B76 /* main.m */; }; AE653674B3D5051B3FB4F677 /* PushNotificationsServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = A9A04673678B1EEA9C7559C6 /* PushNotificationsServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + B03C2D3483B55F3B62C3A284 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C8D7F1FE2EE80796BE4B2B76 /* main.m */; }; B07454F08044C816DC655B50 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AEF0FF04032299A31D37CDE4 /* Assets.xcassets */; }; B168C83BBDE130867FC3AF3D /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = 300EE8F0E93BE17A2E191D94 /* Credentials.m */; }; B1C3CFCC7C0D81F1C169DF2F /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DEEEEC6C495A8FB90C87DF /* empty-file.swift */; }; @@ -114,6 +123,7 @@ BCDCB5A2B878D59CEC6F7A78 /* BrazeUI.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 85365B9C180AB9BA57FBD249 /* BrazeUI.bundle */; }; BDB36CBB33D0B3199832A497 /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = 9455F390E4F3380AF100069F /* Readme.m */; }; BF3E00BF746510504CA6D052 /* BrazeKit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 963312B05750D1D4DA77128F /* BrazeKit.bundle */; }; + BFC816360200ED8B5B0E3B08 /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A03F2F7AC34DF5D1FE98BB0 /* Readme.m */; }; C0B3D5E2CE9698CB65AAAA68 /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = 300EE8F0E93BE17A2E191D94 /* Credentials.m */; }; C119F9D4D037385C7A6D539F /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C7CD7AB410DAB0417F872BA8 /* ReadmeViewController.m */; }; C2C0054EA8B2CD0FE02300A7 /* BrazeLocation.bundle in Resources */ = {isa = PBXBuildFile; fileRef = EB8AF6AAFE01DAED72696307 /* BrazeLocation.bundle */; }; @@ -130,7 +140,10 @@ DCA35F3923F60DC1D453E42C /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = 300EE8F0E93BE17A2E191D94 /* Credentials.m */; }; DE94AAA2B0E9BDF19C99418C /* NotAvailableInObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = AE76D32E01BF5A7187E220F5 /* NotAvailableInObjC.m */; }; E23BEBB47BCB32C0740CD6E1 /* SDWebImage.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A4862669D8E8CC116B81CDB2 /* SDWebImage.bundle */; }; + E29D5BAB7B18E58011A0BECA /* BrazeKit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 963312B05750D1D4DA77128F /* BrazeKit.bundle */; }; E317AF1ABD3251AC5EEB4314 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DEEEEC6C495A8FB90C87DF /* empty-file.swift */; }; + E371831985827B1BBFA39011 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C7CD7AB410DAB0417F872BA8 /* ReadmeViewController.m */; }; + E59FAD5D495F078293152221 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4149C443B3FDA69854646550 /* AppDelegate.m */; }; E887494ABCDD317C782E1D7F /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 533195F22A1588713AF533FD /* NotificationService.swift */; }; EAAE90780460DB91BC0C4590 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AEF0FF04032299A31D37CDE4 /* Assets.xcassets */; }; EC7AD29DA6734849DEC75FEC /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D9AEB92C8612C8AD37E9358 /* Readme.m */; }; @@ -230,20 +243,26 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0278A1ADBD861A848C8038F3 /* WideBannerViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WideBannerViewController.m; sourceTree = ""; }; 174C8DF24400B46DB84C9645 /* BRZGIFViewProvider+SDWebImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BRZGIFViewProvider+SDWebImage.h"; sourceTree = ""; }; 178C2C03C17DFB514FCC95BF /* CardsInfoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CardsInfoViewController.m; sourceTree = ""; }; + 18C909A59B3FFC873242CC2F /* WideBannerViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WideBannerViewController.h; sourceTree = ""; }; 1D9AEB92C8612C8AD37E9358 /* Readme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Readme.m; sourceTree = ""; }; 1F1631DFDCE0C1B3F41E792E /* PushNotifications-Automatic.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "PushNotifications-Automatic.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 23775435322EF231161D5367 /* CardsInfoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CardsInfoViewController.h; sourceTree = ""; }; + 2664B66D1D6CE8AE64A10922 /* FullScreenBannerViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FullScreenBannerViewController.h; sourceTree = ""; }; 300EE8F0E93BE17A2E191D94 /* Credentials.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Credentials.m; sourceTree = ""; }; 3071AD3E5782D08FC88FCA68 /* NotAvailableInObjC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotAvailableInObjC.m; sourceTree = ""; }; 30D72A9C07BEDB9E09FAE84D /* BrazeNotificationService.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = BrazeNotificationService.xcframework; path = "braze-swift-sdk-prebuilt/static/BrazeNotificationService.xcframework"; sourceTree = ""; }; + 328BCBC8BD6E7F3E8ACCCC74 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 334A021F30FF4114F75E59A1 /* PushNotificationsContentExtension.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = PushNotificationsContentExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 3684C71FB2813470651513A7 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 39B760D798A1106EC4FDD2AB /* InAppMessages-Custom-UI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "InAppMessages-Custom-UI.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 3AFA91B6028D67A3FDF7B083 /* InAppMessageUI-Customization.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "InAppMessageUI-Customization.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4149C443B3FDA69854646550 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 42F1A1CD4644026244BE2F84 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 437F6450A861B53F8C59ED33 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 480C92516E1646A791F1DFB6 /* FullScreenBannerViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FullScreenBannerViewController.m; sourceTree = ""; }; 4FE136ACE6CEBDCB80A043F8 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 52E9A2F2A90CD27D63E5F049 /* ContentCards-Custom-UI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "ContentCards-Custom-UI.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 53287D0E6FFFAFDBC1C4223C /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; @@ -265,6 +284,7 @@ 7DEA0C6639997814399BC75B /* ContentCardUI-Customization.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "ContentCardUI-Customization.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 7FF70757F8A0B7AF074017E1 /* InAppMessageInfoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InAppMessageInfoViewController.m; sourceTree = ""; }; 81C45FA8942EBB59E74A5B38 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 852DD8ED34234337913161C1 /* BannerUI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = BannerUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; 85365B9C180AB9BA57FBD249 /* BrazeUI.bundle */ = {isa = PBXFileReference; lastKnownFileType = wrapper.cfbundle; name = BrazeUI.bundle; path = "braze-swift-sdk-prebuilt/bundle/BrazeUI.bundle"; sourceTree = ""; }; 87C1CF136D11D5168491F769 /* BRZGIFViewProvider+SDWebImage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "BRZGIFViewProvider+SDWebImage.m"; sourceTree = ""; }; 892C81C4FA9E8A7692363B5A /* PushNotifications-Manual.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "PushNotifications-Manual.app"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -278,6 +298,7 @@ 963312B05750D1D4DA77128F /* BrazeKit.bundle */ = {isa = PBXFileReference; lastKnownFileType = wrapper.cfbundle; name = BrazeKit.bundle; path = "braze-swift-sdk-prebuilt/bundle/BrazeKit.bundle"; sourceTree = ""; }; 9737080E688F7CC1AE86D451 /* Readme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Readme.m; sourceTree = ""; }; 99485A247A6D99729F74D785 /* AuthenticationManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AuthenticationManager.h; sourceTree = ""; }; + 9A03F2F7AC34DF5D1FE98BB0 /* Readme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Readme.m; sourceTree = ""; }; 9BD64137870DE7C6D6ECB508 /* Location.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = Location.app; sourceTree = BUILT_PRODUCTS_DIR; }; A3DEEEEC6C495A8FB90C87DF /* empty-file.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "empty-file.swift"; sourceTree = ""; }; A4862669D8E8CC116B81CDB2 /* SDWebImage.bundle */ = {isa = PBXFileReference; lastKnownFileType = wrapper.cfbundle; name = SDWebImage.bundle; path = "braze-swift-sdk-prebuilt/bundle/SDWebImage.bundle"; sourceTree = ""; }; @@ -331,6 +352,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 428FEE70D753BF8F8D0AB0AE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 41D6E795D0E5ABE4045EB223 /* BrazeKit.xcframework in Frameworks */, + 6448DCF373ADA01F8F4198D5 /* BrazeUI.xcframework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 46451458FBDF142DB7694C90 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -447,6 +477,7 @@ isa = PBXGroup; children = ( 758DEDBCB620A5640515A39F /* Analytics.app */, + 852DD8ED34234337913161C1 /* BannerUI.app */, 52E9A2F2A90CD27D63E5F049 /* ContentCards-Custom-UI.app */, 7DEA0C6639997814399BC75B /* ContentCardUI-Customization.app */, 8FDDEDFBD839855424A46CD3 /* ContentCardUI.app */, @@ -476,6 +507,21 @@ path = Sources/InAppMessageUI; sourceTree = ""; }; + 3AC38B133E4D7582E310D4AC /* BannerUI */ = { + isa = PBXGroup; + children = ( + 328BCBC8BD6E7F3E8ACCCC74 /* AppDelegate.h */, + 4149C443B3FDA69854646550 /* AppDelegate.m */, + 2664B66D1D6CE8AE64A10922 /* FullScreenBannerViewController.h */, + 480C92516E1646A791F1DFB6 /* FullScreenBannerViewController.m */, + 9A03F2F7AC34DF5D1FE98BB0 /* Readme.m */, + 18C909A59B3FFC873242CC2F /* WideBannerViewController.h */, + 0278A1ADBD861A848C8038F3 /* WideBannerViewController.m */, + ); + name = BannerUI; + path = Sources/BannerUI; + sourceTree = ""; + }; 4CCE6170371FD8120E5B1290 /* InAppMessageUI-Customization */ = { isa = PBXGroup; children = ( @@ -490,6 +536,7 @@ children = ( FBA27B1AC5B0687D963FB7AA /* Common */, BFDCF0E5D62AB33DDEB1E4D7 /* Analytics */, + 3AC38B133E4D7582E310D4AC /* BannerUI */, A34B68986DE12152585A32EF /* ContentCards-Custom-UI */, 01F2F51AADCF696ECCAFD12B /* ContentCardUI */, C5873688162F3F46F2B5802F /* ContentCardUI-Customization */, @@ -876,6 +923,23 @@ productReference = 39B760D798A1106EC4FDD2AB /* InAppMessages-Custom-UI.app */; productType = "com.apple.product-type.application"; }; + D1C9312F07AC04FAF7F688B6 /* BannerUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 712B6302BFCDB9DC954541A7 /* Build configuration list for PBXNativeTarget "BannerUI" */; + buildPhases = ( + 38690E494A33AEB956C25C98 /* Sources */, + FE01C4E37A1BAC2907EED357 /* Resources */, + 428FEE70D753BF8F8D0AB0AE /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = BannerUI; + productName = BannerUI; + productReference = 852DD8ED34234337913161C1 /* BannerUI.app */; + productType = "com.apple.product-type.application"; + }; D80CA9EE4DC950087B08CC18 /* PushNotifications-DelayedInitialization */ = { isa = PBXNativeTarget; buildConfigurationList = 05451D3DEE54A70DB9AF72AC /* Build configuration list for PBXNativeTarget "PushNotifications-DelayedInitialization" */; @@ -941,6 +1005,9 @@ CC8373AC31E15FD5A870D3BB = { ProvisioningStyle = automatic; }; + D1C9312F07AC04FAF7F688B6 = { + ProvisioningStyle = automatic; + }; D80CA9EE4DC950087B08CC18 = { ProvisioningStyle = automatic; }; @@ -959,6 +1026,7 @@ projectRoot = ""; targets = ( 3424DE025B55C57D8D88CF98 /* Analytics */, + D1C9312F07AC04FAF7F688B6 /* BannerUI */, 4CF94578CDC41CCB2531C03E /* ContentCardUI */, 7A8A97B5756032F77C72A0FF /* ContentCardUI-Customization */, 8CE88AF5BE8687E1035552BA /* ContentCards-Custom-UI */, @@ -1092,6 +1160,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + FE01C4E37A1BAC2907EED357 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A209C2D9D02408F5C7A8282E /* Assets.xcassets in Resources */, + E29D5BAB7B18E58011A0BECA /* BrazeKit.bundle in Resources */, + 3BD6A35018FC2A4C76AE0530 /* BrazeUI.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1128,6 +1206,21 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 38690E494A33AEB956C25C98 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E59FAD5D495F078293152221 /* AppDelegate.m in Sources */, + 444F050EFACA151D1C062162 /* Credentials.m in Sources */, + 718AAE986BC68399FAA5348A /* FullScreenBannerViewController.m in Sources */, + BFC816360200ED8B5B0E3B08 /* Readme.m in Sources */, + E371831985827B1BBFA39011 /* ReadmeViewController.m in Sources */, + 4543C718999B2E1B8BEDA310 /* WideBannerViewController.m in Sources */, + 8D46DC758445E0040EFA3E71 /* empty-file.swift in Sources */, + B03C2D3483B55F3B62C3A284 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 441F878F10BD09F523587E11 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1450,6 +1543,32 @@ }; name = Debug; }; + 23746A54D808F5F4CD9919AE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = automatic; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"braze-swift-sdk-prebuilt/static\"", + ); + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.braze.BannerUI; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = "1,2,7"; + }; + name = Debug; + }; 292F260EB50572BC94C1FCC3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2102,6 +2221,32 @@ }; name = Release; }; + FCA376615716FA018A60BF01 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = automatic; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"braze-swift-sdk-prebuilt/static\"", + ); + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.braze.BannerUI; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = "1,2,7"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -2186,6 +2331,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 712B6302BFCDB9DC954541A7 /* Build configuration list for PBXNativeTarget "BannerUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 23746A54D808F5F4CD9919AE /* Debug */, + FCA376615716FA018A60BF01 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; DFDBB0CB913332453DAA4492 /* Build configuration list for PBXNativeTarget "ContentCardUI-Customization" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Examples/ObjC/Examples-Manual.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme b/Examples/ObjC/Examples-Manual.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme new file mode 100644 index 0000000000..eeba885473 --- /dev/null +++ b/Examples/ObjC/Examples-Manual.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/ObjC/Examples-SwiftPM.xcodeproj/project.pbxproj b/Examples/ObjC/Examples-SwiftPM.xcodeproj/project.pbxproj index b9fa561a16..088e82f1fe 100644 --- a/Examples/ObjC/Examples-SwiftPM.xcodeproj/project.pbxproj +++ b/Examples/ObjC/Examples-SwiftPM.xcodeproj/project.pbxproj @@ -34,6 +34,7 @@ 3B5A9CCB48E3991920B2C446 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6459ADE015D6A93F4DDEF4D8 /* main.m */; }; 3C2431D4633D61A92CD9F814 /* PushNotificationsContentExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = A7B092ACAEC915379923328F /* PushNotificationsContentExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 3C39E7E58C01C8CE44D9BAC5 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6459ADE015D6A93F4DDEF4D8 /* main.m */; }; + 3E6B194C548511577D79ACA9 /* BrazeUI in Frameworks */ = {isa = PBXBuildFile; productRef = E8F0CDD2BA63A81551367410 /* BrazeUI */; }; 3E6D81E2DD6BA6B5F8E30BAE /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EA72C16B9A189DE9D4D7A58 /* ReadmeViewController.m */; }; 41CFC07655CF0A3FB6E2ADE2 /* NotAvailableInObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = EF84C935C8D4200A2401B6E1 /* NotAvailableInObjC.m */; }; 4484E207BCFD002822F2BB7D /* NotificationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE00D10FF658213E5A00188D /* NotificationViewController.swift */; }; @@ -51,15 +52,19 @@ 6D2A781F030467865F95A781 /* InAppMessageInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AF02C869BF9AFF144C7C90DF /* InAppMessageInfoViewController.m */; }; 6D37F619E60F577AF2FB208D /* BrazeKit in Frameworks */ = {isa = PBXBuildFile; productRef = 9720FE32CFB77D7E0319A501 /* BrazeKit */; }; 72B34E806548749A8D2BB495 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EA72C16B9A189DE9D4D7A58 /* ReadmeViewController.m */; }; + 75230F2FAD54A48F6AAE5341 /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = A900B781B2DFE220B129E338 /* Credentials.m */; }; 7CFDF51A3B73EE52EFB93AE6 /* PushNotificationsServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = B5666DA142189EEEDFAFB41F /* PushNotificationsServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 7F18A6ABA418E714F2E9FC75 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6459ADE015D6A93F4DDEF4D8 /* main.m */; }; 80A7523D239AEE0E2DEE0DBB /* PushNotificationsServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = B5666DA142189EEEDFAFB41F /* PushNotificationsServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 83179E87F34EF8488F3C09EE /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37F9A5B35B5C55AF7BAC0EA5 /* empty-file.swift */; }; 84B02A6E08D76AE5A66A561D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6459ADE015D6A93F4DDEF4D8 /* main.m */; }; 850853B18B7DB34ADBCB56D2 /* SDWebImage in Frameworks */ = {isa = PBXBuildFile; productRef = 6406D8C02D350722AE48DE31 /* SDWebImage */; }; + 85961060173CC12347896B7C /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EA72C16B9A189DE9D4D7A58 /* ReadmeViewController.m */; }; 86FE98F6F784798BAD8E759E /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EA72C16B9A189DE9D4D7A58 /* ReadmeViewController.m */; }; 87824C15AAA2003EC964C107 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 08CE7C19F258AF40B394B358 /* UserNotifications.framework */; }; 87C3CFDDFECB5F3B4477D98B /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37F9A5B35B5C55AF7BAC0EA5 /* empty-file.swift */; }; + 89759DEB80D4EEE3A9DFA3F7 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37F9A5B35B5C55AF7BAC0EA5 /* empty-file.swift */; }; + 8E665BA6E1ECBC079DC8F962 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F5CA3297B4978C4916EBCC5 /* AppDelegate.m */; }; 8FEC271CD3BBE8918EAC74D0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0FCD17EEF41713F18F4CA702 /* Assets.xcassets */; }; 904106D5D0DCB422BFFC0702 /* BrazeKit in Frameworks */ = {isa = PBXBuildFile; productRef = 9BAE4406D94C39537917176F /* BrazeKit */; }; 9045C48A41E6C9FE7BF2DB50 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6459ADE015D6A93F4DDEF4D8 /* main.m */; }; @@ -75,6 +80,7 @@ 9A4DB2119944DCC81C5561CF /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6459ADE015D6A93F4DDEF4D8 /* main.m */; }; 9AF111E606D01AE0A6083C4D /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = A900B781B2DFE220B129E338 /* Credentials.m */; }; 9BF21EBB274A7B94D2B601CC /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0013D8D56F5E3C7963E30A2E /* AppDelegate.m */; }; + A0289110223C950C43155634 /* FullScreenBannerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = B61B2602706102FC4E64E5B9 /* FullScreenBannerViewController.m */; }; A7D7689D324CFB54651FC94D /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EA72C16B9A189DE9D4D7A58 /* ReadmeViewController.m */; }; A993F9AB30617C5759D76985 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37F9A5B35B5C55AF7BAC0EA5 /* empty-file.swift */; }; AA286BBF813DDDFA3A9E1440 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37F9A5B35B5C55AF7BAC0EA5 /* empty-file.swift */; }; @@ -84,6 +90,7 @@ B3BDA4F943A5C0AD2DEF5A7C /* SDWebImage in Frameworks */ = {isa = PBXBuildFile; productRef = 2DFFD8844A474098D6408946 /* SDWebImage */; }; B5C4502619ADB8C486E46AEC /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = A900B781B2DFE220B129E338 /* Credentials.m */; }; B703505115C6B4659E0FE981 /* BrazeLocation in Frameworks */ = {isa = PBXBuildFile; productRef = FCFA9573D5A8726847280A8C /* BrazeLocation */; }; + B7ABA845C1D8F0EA259FE018 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6459ADE015D6A93F4DDEF4D8 /* main.m */; }; B9FD0579C0BD5CB2E1C11C6D /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = A900B781B2DFE220B129E338 /* Credentials.m */; }; BBD9966C313CE224A9B7194F /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = 40B1FA52497F602A50792867 /* Readme.m */; }; BCC0EAFB4BE6ACFA69A9729D /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37F9A5B35B5C55AF7BAC0EA5 /* empty-file.swift */; }; @@ -92,11 +99,13 @@ BF41216C1D111CE29716A956 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0FCD17EEF41713F18F4CA702 /* Assets.xcassets */; }; C0BE8ED350B4792E68B0460F /* CustomInAppMessagePresenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A8584CCE6D9BBC4C2F634BB /* CustomInAppMessagePresenter.m */; }; C0EB0E00F930078EBD44FFD4 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EA72C16B9A189DE9D4D7A58 /* ReadmeViewController.m */; }; + C19B7582791B96C003F1E05D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0FCD17EEF41713F18F4CA702 /* Assets.xcassets */; }; C20761A80E31DE7D15ADE19C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6459ADE015D6A93F4DDEF4D8 /* main.m */; }; C29066DEB0CD5F8386A25B2C /* Credentials.m in Sources */ = {isa = PBXBuildFile; fileRef = A900B781B2DFE220B129E338 /* Credentials.m */; }; C610684B33610C4253D8CA2C /* AuthenticationManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BF7AC51A554A71CFA452B84 /* AuthenticationManager.m */; }; C7D552BC12B80792646ED3B5 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37F9A5B35B5C55AF7BAC0EA5 /* empty-file.swift */; }; CBA72F5F963855C68A676FB6 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EA72C16B9A189DE9D4D7A58 /* ReadmeViewController.m */; }; + CF598F420E2A091247934D57 /* WideBannerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 84C80857918925CBF34BB326 /* WideBannerViewController.m */; }; D117EDCFC5FADDCD2F3C475F /* NotAvailableInObjC.m in Sources */ = {isa = PBXBuildFile; fileRef = 71CF9250418324FDD933C503 /* NotAvailableInObjC.m */; }; D9C6A59CE85BAB7EFE4861B0 /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EA72C16B9A189DE9D4D7A58 /* ReadmeViewController.m */; }; DA9105FC44F03B9C044F6C1B /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = 75CC1E79A9D6815B60835BA2 /* Readme.m */; }; @@ -109,6 +118,7 @@ E2E95C34F86FA357D6BCAE54 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0FCD17EEF41713F18F4CA702 /* Assets.xcassets */; }; E40CF734FBAC13C6792F5DE5 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37F9A5B35B5C55AF7BAC0EA5 /* empty-file.swift */; }; E57EF4D623F7C39F800DF8CB /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = 742A9C4C4D1368BA62472F8B /* Readme.m */; }; + E661F97A6D1858D647AF0EAB /* BrazeKit in Frameworks */ = {isa = PBXBuildFile; productRef = 8790507F4D5F35EB03D127E1 /* BrazeKit */; }; E6C6496228FD5FEF34994381 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 971900217FE69BE4658FE8B2 /* AppDelegate.m */; }; EAC53BC784BF380F8205F01F /* BrazeKit in Frameworks */ = {isa = PBXBuildFile; productRef = E045FE65756A230024955AD5 /* BrazeKit */; }; EAE5019C370440A40B31D2AC /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6459ADE015D6A93F4DDEF4D8 /* main.m */; }; @@ -118,6 +128,7 @@ EE3106CED8AA29A095639237 /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = 625BB7F254E41A663E8F5B26 /* Readme.m */; }; F0ABA2C708B18F9BFB743F87 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 95789D924A98ADC813B250FA /* AppDelegate.m */; }; F1E61D7B1116B3BC042B1750 /* empty-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37F9A5B35B5C55AF7BAC0EA5 /* empty-file.swift */; }; + F29E1A116AF3E52AE5210430 /* Readme.m in Sources */ = {isa = PBXBuildFile; fileRef = 55CBEA31B5EB1B86C498A465 /* Readme.m */; }; F96C05B7AD7E6B52CA3F826D /* ReadmeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1EA72C16B9A189DE9D4D7A58 /* ReadmeViewController.m */; }; F97087EBFD4931AA7C9F3463 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0FCD17EEF41713F18F4CA702 /* Assets.xcassets */; }; FD9823DF369C66F24A265598 /* BRZGIFViewProvider+SDWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CD7D38FC280085F402924CA /* BRZGIFViewProvider+SDWebImage.m */; }; @@ -234,6 +245,7 @@ 4CD7D38FC280085F402924CA /* BRZGIFViewProvider+SDWebImage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "BRZGIFViewProvider+SDWebImage.m"; sourceTree = ""; }; 54B2132B425902ECA87672DE /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 54DC394BE5B4E5BA7093FEEF /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 55CBEA31B5EB1B86C498A465 /* Readme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Readme.m; sourceTree = ""; }; 5634FD53344A83FD267AB580 /* CardsInfoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CardsInfoViewController.m; sourceTree = ""; }; 5DA022D2664E917AB6DF910C /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 5FFCA5A7A3B8EF9BFE4BF145 /* Readme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Readme.m; sourceTree = ""; }; @@ -243,16 +255,20 @@ 6459ADE015D6A93F4DDEF4D8 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 64B22ACFDEB977C9F3B3B67E /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 67B6F9D3158877B0045A2F80 /* PushNotifications-Automatic.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "PushNotifications-Automatic.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 68F135007650E2777AB21639 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 6A76DADC444C28D2653F471B /* InAppMessageUI-Customization.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "InAppMessageUI-Customization.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 6CB7B2B6C601A32E293D5298 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 71CF9250418324FDD933C503 /* NotAvailableInObjC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotAvailableInObjC.m; sourceTree = ""; }; 742A9C4C4D1368BA62472F8B /* Readme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Readme.m; sourceTree = ""; }; 7509FFDD2664F798C716F648 /* Readme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Readme.m; sourceTree = ""; }; 75CC1E79A9D6815B60835BA2 /* Readme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Readme.m; sourceTree = ""; }; + 7F5CA3297B4978C4916EBCC5 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 84C80857918925CBF34BB326 /* WideBannerViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WideBannerViewController.m; sourceTree = ""; }; 85EB91B2555C84CBD26F79F6 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 8783B6A324D425D55615AFD9 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 95789D924A98ADC813B250FA /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 971900217FE69BE4658FE8B2 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 98ADD07CC89BDF408F0F8288 /* BannerUI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = BannerUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; A7B092ACAEC915379923328F /* PushNotificationsContentExtension.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = PushNotificationsContentExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; A900B781B2DFE220B129E338 /* Credentials.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Credentials.m; sourceTree = ""; }; AF02C869BF9AFF144C7C90DF /* InAppMessageInfoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InAppMessageInfoViewController.m; sourceTree = ""; }; @@ -260,6 +276,7 @@ B29D192E53C1405628200101 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; B558422CCA055B4615F43572 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; B5666DA142189EEEDFAFB41F /* PushNotificationsServiceExtension.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = PushNotificationsServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + B61B2602706102FC4E64E5B9 /* FullScreenBannerViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FullScreenBannerViewController.m; sourceTree = ""; }; B9D5BBC757BE390849FCDD52 /* ContentCards-Custom-UI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "ContentCards-Custom-UI.app"; sourceTree = BUILT_PRODUCTS_DIR; }; BAE951BE8F753A9864D29D6C /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; BC5EE8BE3BAD32DB6D66AC70 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; @@ -270,10 +287,12 @@ D63F498CAD1B487B718A6064 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; D65F1DF14BBFB716FC3B8EA8 /* ContentCardUI-Customization.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "ContentCardUI-Customization.app"; sourceTree = BUILT_PRODUCTS_DIR; }; E10D62519894CE82ED94A20E /* BRZGIFViewProvider+SDWebImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "BRZGIFViewProvider+SDWebImage.h"; sourceTree = ""; }; + E402AD8F8CC6ED4C9C97FCE4 /* WideBannerViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WideBannerViewController.h; sourceTree = ""; }; E5F704300A66AB9522AA5F94 /* CheckoutViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CheckoutViewController.h; sourceTree = ""; }; ED657ED06A52B67E6F53309B /* Analytics.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = Analytics.app; sourceTree = BUILT_PRODUCTS_DIR; }; EE718585DF8925CE6290EB8E /* ReadmeViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ReadmeViewController.h; sourceTree = ""; }; EF84C935C8D4200A2401B6E1 /* NotAvailableInObjC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotAvailableInObjC.m; sourceTree = ""; }; + F3EC9FBBF2D073B40B1CD637 /* FullScreenBannerViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FullScreenBannerViewController.h; sourceTree = ""; }; F7D912E013554F7C8A41F0ED /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; F860D740F25C10FAE51F0DB3 /* Readme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Readme.m; sourceTree = ""; }; F9E6C11F27DDDD5C6E6AD3AE /* Readme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Readme.m; sourceTree = ""; }; @@ -327,6 +346,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 2FA2F0A335091CF440592398 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E661F97A6D1858D647AF0EAB /* BrazeKit in Frameworks */, + 3E6B194C548511577D79ACA9 /* BrazeUI in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 3389685734F96A39F6C8534E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -399,6 +427,21 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 0C988F6B125C5EE79E59318D /* BannerUI */ = { + isa = PBXGroup; + children = ( + 68F135007650E2777AB21639 /* AppDelegate.h */, + 7F5CA3297B4978C4916EBCC5 /* AppDelegate.m */, + F3EC9FBBF2D073B40B1CD637 /* FullScreenBannerViewController.h */, + B61B2602706102FC4E64E5B9 /* FullScreenBannerViewController.m */, + 55CBEA31B5EB1B86C498A465 /* Readme.m */, + E402AD8F8CC6ED4C9C97FCE4 /* WideBannerViewController.h */, + 84C80857918925CBF34BB326 /* WideBannerViewController.m */, + ); + name = BannerUI; + path = Sources/BannerUI; + sourceTree = ""; + }; 119FF3F930BD1BF66DEB0B47 /* ContentCards-Custom-UI */ = { isa = PBXGroup; children = ( @@ -547,6 +590,7 @@ isa = PBXGroup; children = ( ED657ED06A52B67E6F53309B /* Analytics.app */, + 98ADD07CC89BDF408F0F8288 /* BannerUI.app */, B9D5BBC757BE390849FCDD52 /* ContentCards-Custom-UI.app */, D65F1DF14BBFB716FC3B8EA8 /* ContentCardUI-Customization.app */, 43898C005AA33A7630288625 /* ContentCardUI.app */, @@ -578,6 +622,7 @@ E3AF9F206199B993ACB3E63D /* Packages */, B4F25C051708E808116165D4 /* Common */, 258F28BC46EE3F2D3E079C37 /* Analytics */, + 0C988F6B125C5EE79E59318D /* BannerUI */, 119FF3F930BD1BF66DEB0B47 /* ContentCards-Custom-UI */, 518A861147034CC7C7A6F886 /* ContentCardUI */, D03146EA39AB44D97182A5DF /* ContentCardUI-Customization */, @@ -713,6 +758,27 @@ productReference = 67B6F9D3158877B0045A2F80 /* PushNotifications-Automatic.app */; productType = "com.apple.product-type.application"; }; + 67EDD4489E05F820AC5C4C72 /* BannerUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5C9226DEFB56FCE86BDECA11 /* Build configuration list for PBXNativeTarget "BannerUI" */; + buildPhases = ( + 97924445A853B859FE3B47C9 /* Sources */, + 81A915DDC95E775F4BC5C01D /* Resources */, + 2FA2F0A335091CF440592398 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = BannerUI; + packageProductDependencies = ( + 8790507F4D5F35EB03D127E1 /* BrazeKit */, + E8F0CDD2BA63A81551367410 /* BrazeUI */, + ); + productName = BannerUI; + productReference = 98ADD07CC89BDF408F0F8288 /* BannerUI.app */; + productType = "com.apple.product-type.application"; + }; 6F0145EB7E39FDE6D8D6FD4C /* PushNotifications-Manual */ = { isa = PBXNativeTarget; buildConfigurationList = CD229DA33B161BD356A199E5 /* Build configuration list for PBXNativeTarget "PushNotifications-Manual" */; @@ -923,6 +989,9 @@ 59B8633A44EBC4A918E17FBF = { ProvisioningStyle = automatic; }; + 67EDD4489E05F820AC5C4C72 = { + ProvisioningStyle = automatic; + }; 6F0145EB7E39FDE6D8D6FD4C = { ProvisioningStyle = automatic; }; @@ -969,6 +1038,7 @@ projectRoot = ""; targets = ( 0642C7DCDAD9AB0330096707 /* Analytics */, + 67EDD4489E05F820AC5C4C72 /* BannerUI */, 0A1211FC31CA5DD9A5E1D18E /* ContentCardUI */, C86DEA9CD6ED7E7E75358AD0 /* ContentCardUI-Customization */, 908A74E9B2A6D8455EB2933D /* ContentCards-Custom-UI */, @@ -1018,6 +1088,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 81A915DDC95E775F4BC5C01D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C19B7582791B96C003F1E05D /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 865BE7921091ADCB20B8EBC2 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1138,6 +1216,21 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 97924445A853B859FE3B47C9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8E665BA6E1ECBC079DC8F962 /* AppDelegate.m in Sources */, + 75230F2FAD54A48F6AAE5341 /* Credentials.m in Sources */, + A0289110223C950C43155634 /* FullScreenBannerViewController.m in Sources */, + F29E1A116AF3E52AE5210430 /* Readme.m in Sources */, + 85961060173CC12347896B7C /* ReadmeViewController.m in Sources */, + CF598F420E2A091247934D57 /* WideBannerViewController.m in Sources */, + 89759DEB80D4EEE3A9DFA3F7 /* empty-file.swift in Sources */, + B7ABA845C1D8F0EA259FE018 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; A46B2EB718DACFE4899DAD66 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1322,6 +1415,28 @@ }; name = Debug; }; + 0E16DC639408818C18DA1706 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = automatic; + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.braze.BannerUI; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = "1,2,7"; + }; + name = Debug; + }; 24337AEDDB9E06E25C8FD74E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1915,6 +2030,28 @@ }; name = Release; }; + C5E70E219CFA85111DF5B129 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = automatic; + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.braze.BannerUI; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = "1,2,7"; + }; + name = Release; + }; EE68CEA71696509EBFD2C020 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2046,6 +2183,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 5C9226DEFB56FCE86BDECA11 /* Build configuration list for PBXNativeTarget "BannerUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0E16DC639408818C18DA1706 /* Debug */, + C5E70E219CFA85111DF5B129 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; A6A1E4C76F43C48C764BB3A6 /* Build configuration list for PBXNativeTarget "InAppMessageUI-Customization" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -2198,6 +2344,10 @@ isa = XCSwiftPackageProductDependency; productName = BrazeKit; }; + 8790507F4D5F35EB03D127E1 /* BrazeKit */ = { + isa = XCSwiftPackageProductDependency; + productName = BrazeKit; + }; 96F76CB78E3FFBBBCDE87EBD /* BrazeUI */ = { isa = XCSwiftPackageProductDependency; productName = BrazeUI; @@ -2218,6 +2368,10 @@ isa = XCSwiftPackageProductDependency; productName = BrazeKit; }; + E8F0CDD2BA63A81551367410 /* BrazeUI */ = { + isa = XCSwiftPackageProductDependency; + productName = BrazeUI; + }; FCFA9573D5A8726847280A8C /* BrazeLocation */ = { isa = XCSwiftPackageProductDependency; productName = BrazeLocation; diff --git a/Examples/ObjC/Examples-SwiftPM.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme b/Examples/ObjC/Examples-SwiftPM.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme new file mode 100644 index 0000000000..96a7d04013 --- /dev/null +++ b/Examples/ObjC/Examples-SwiftPM.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/ObjC/Podfile b/Examples/ObjC/Podfile index 7100d13cbe..91fbc56d9c 100644 --- a/Examples/ObjC/Podfile +++ b/Examples/ObjC/Podfile @@ -119,6 +119,18 @@ target 'ContentCards-Custom-UI-visionOS' do pod 'BrazeKit' end +target 'BannerUI-iOS' do + platform :ios, '12.0' + pod 'BrazeKit' + pod 'BrazeUI' +end + +target 'BannerUI-visionOS' do + platform :visionos, '12.0' + pod 'BrazeKit' + pod 'BrazeUI' +end + target 'Location-iOS' do platform :ios, '12.0' pod 'BrazeKit' diff --git a/Examples/ObjC/Sources/BannerUI/AppDelegate.h b/Examples/ObjC/Sources/BannerUI/AppDelegate.h new file mode 100644 index 0000000000..855195bc31 --- /dev/null +++ b/Examples/ObjC/Sources/BannerUI/AppDelegate.h @@ -0,0 +1,14 @@ +@import UIKit; +@import BrazeKit; + +extern NSString *const brazeApiKey; +extern NSString *const brazeEndpoint; + +@interface AppDelegate : UIResponder + +@property(class, strong, nonatomic) Braze *braze; + +- (void)displayFullScreenBanner; +- (void)displayWideBanner; + +@end diff --git a/Examples/ObjC/Sources/BannerUI/AppDelegate.m b/Examples/ObjC/Sources/BannerUI/AppDelegate.m new file mode 100644 index 0000000000..36cb6e38af --- /dev/null +++ b/Examples/ObjC/Sources/BannerUI/AppDelegate.m @@ -0,0 +1,62 @@ +#import "AppDelegate.h" +#import "FullScreenBannerViewController.h" +#import "WideBannerViewController.h" + +@import BrazeKit; +@import BrazeUI; + +@implementation AppDelegate + +#pragma mark - Lifecycle + +- (BOOL)application:(UIApplication *)application +didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // Setup Braze + BRZConfiguration *configuration = + [[BRZConfiguration alloc] initWithApiKey:brazeApiKey + endpoint:brazeEndpoint]; + configuration.logger.level = BRZLoggerLevelInfo; + Braze *braze = [[Braze alloc] initWithConfiguration:configuration]; + AppDelegate.braze = braze; + + // Request updated banners. + [braze.banners requestBannersRefreshForPlacementIds:@[ + @"sdk-test-1", + @"sdk-test-2", + ]]; + + [self.window makeKeyAndVisible]; + return YES; +} + +#pragma mark - AppDelegate.braze + +static Braze *_braze = nil; + ++ (Braze *)braze { + return _braze; +} + ++ (void)setBraze:(Braze *)braze { + _braze = braze; +} + +- (void)displayFullScreenBanner { + UIViewController *viewController = [[FullScreenBannerViewController alloc] init]; + UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; + if (navigationController) { + [navigationController pushViewController:viewController + animated:YES]; + } +} + +- (void)displayWideBanner { + UIViewController *viewController = [[WideBannerViewController alloc] init]; + UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; + if (navigationController) { + [navigationController pushViewController:viewController + animated:YES]; + } +} + +@end diff --git a/Examples/ObjC/Sources/BannerUI/FullScreenBannerViewController.h b/Examples/ObjC/Sources/BannerUI/FullScreenBannerViewController.h new file mode 100644 index 0000000000..cfa6371007 --- /dev/null +++ b/Examples/ObjC/Sources/BannerUI/FullScreenBannerViewController.h @@ -0,0 +1,10 @@ +@import UIKit; +@import BrazeUI; + +@interface FullScreenBannerViewController : UIViewController + +@property (nonatomic, strong) UIActivityIndicatorView *loadingView; +@property (nonatomic, strong) BRZBannerUIView *bannerView; +@property (nonatomic, strong) UILabel *errorView; + +@end diff --git a/Examples/ObjC/Sources/BannerUI/FullScreenBannerViewController.m b/Examples/ObjC/Sources/BannerUI/FullScreenBannerViewController.m new file mode 100644 index 0000000000..e09916217f --- /dev/null +++ b/Examples/ObjC/Sources/BannerUI/FullScreenBannerViewController.m @@ -0,0 +1,90 @@ +#import "FullScreenBannerViewController.h" +#import "AppDelegate.h" + +@implementation FullScreenBannerViewController + ++ (NSString *)bannerPlacementID { + return @"sdk-test-1"; +} + +- (UIActivityIndicatorView *)loadingView { + if (!_loadingView) { + _loadingView = [[UIActivityIndicatorView alloc] init]; + _loadingView.translatesAutoresizingMaskIntoConstraints = NO; + } + return _loadingView; +} + +- (BRZBannerUIView *)bannerView { + if (AppDelegate.braze && !_bannerView) { + __weak typeof(self) weakSelf = self; + _bannerView = [[BRZBannerUIView alloc] + initWithPlacementId:[FullScreenBannerViewController bannerPlacementID] + braze:AppDelegate.braze + processContentUpdates:^(BrazeBannerUIContentUpdates * _Nullable updates, + NSError * _Nullable error) { + // Update layout properties when banner content has finished loading. + dispatch_async(dispatch_get_main_queue(), ^{ + __strong typeof(weakSelf) strongSelf = weakSelf; + if (!strongSelf) return; + + strongSelf.loadingView.hidden = YES; + if (error) { + strongSelf.errorView.hidden = NO; + } else { + strongSelf.bannerView.hidden = NO; + } + }); + }]; + + _bannerView.translatesAutoresizingMaskIntoConstraints = NO; + _bannerView.hidden = YES; + } + return _bannerView; +} + +- (UILabel *)errorView { + if (!_errorView) { + _errorView = [[UILabel alloc] init]; + _errorView.text = @"An error occurred while loading the banner."; + _errorView.textAlignment = NSTextAlignmentCenter; + _errorView.translatesAutoresizingMaskIntoConstraints = NO; + _errorView.hidden = YES; + } + return _errorView; +} + +- (void)loadView { + [super loadView]; + + self.view.backgroundColor = [UIColor whiteColor]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + [self.view addSubview:self.loadingView]; + [self.view addSubview:self.bannerView]; + [self.view addSubview:self.errorView]; + + [NSLayoutConstraint activateConstraints:@[ + [self.loadingView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor], + [self.loadingView.leadingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.leadingAnchor], + [self.loadingView.trailingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor], + [self.loadingView.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor], + + [self.bannerView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor], + [self.bannerView.leadingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.leadingAnchor], + [self.bannerView.trailingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor], + [self.bannerView.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor], + + [self.errorView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor], + [self.errorView.leadingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.leadingAnchor], + [self.errorView.trailingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor], + [self.errorView.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor] + ]]; + + [self.loadingView startAnimating]; +} + +@end diff --git a/Examples/ObjC/Sources/BannerUI/Readme.m b/Examples/ObjC/Sources/BannerUI/Readme.m new file mode 100644 index 0000000000..69f00b22f9 --- /dev/null +++ b/Examples/ObjC/Sources/BannerUI/Readme.m @@ -0,0 +1,42 @@ +#import "AppDelegate.h" +#import "ReadmeAction.h" +#import "ReadmeViewController.h" + +@import BrazeKit; + +#pragma mark - Internal + +void fullScreenBanner(ReadmeViewController *viewController) { + [(AppDelegate *)UIApplication.sharedApplication + .delegate displayFullScreenBanner]; +} + +void wideBanner(ReadmeViewController *viewController) { + [(AppDelegate *)UIApplication.sharedApplication + .delegate displayWideBanner]; +} + +#pragma mark - Readme + +NSString *const readme = + @"This sample presents how to use the Braze provided Banner UI:\n" + @"\n" + @"- AppDelegate.{h,m}\n" + @" - Requesting Banners refresh\n" + @" - Banner UI presentation\n"; + +NSInteger const actionsCount = 2; + +ReadmeAction const actions[] = { + { @"Display a full-screen banner", @"", + ^(ReadmeViewController *_Nonnull viewController) { + fullScreenBanner(viewController); + } + }, + { @"Display a wide banner", @"", + ^(ReadmeViewController *_Nonnull viewController) { + wideBanner(viewController); + } + }, +} +; diff --git a/Examples/ObjC/Sources/BannerUI/WideBannerViewController.h b/Examples/ObjC/Sources/BannerUI/WideBannerViewController.h new file mode 100644 index 0000000000..844b21d38d --- /dev/null +++ b/Examples/ObjC/Sources/BannerUI/WideBannerViewController.h @@ -0,0 +1,10 @@ +@import UIKit; +@import BrazeUI; + +@interface WideBannerViewController : UIViewController + +@property (nonatomic, strong) UILabel *contentView; +@property (nonatomic, strong) BRZBannerUIView *bannerView; +@property (nonatomic, strong) NSLayoutConstraint *bannerHeightConstraint; + +@end diff --git a/Examples/ObjC/Sources/BannerUI/WideBannerViewController.m b/Examples/ObjC/Sources/BannerUI/WideBannerViewController.m new file mode 100644 index 0000000000..18e26c02d2 --- /dev/null +++ b/Examples/ObjC/Sources/BannerUI/WideBannerViewController.m @@ -0,0 +1,76 @@ +#import "WideBannerViewController.h" +#import "AppDelegate.h" + +@implementation WideBannerViewController + ++ (NSString *)bannerPlacementID { + return @"sdk-test-2"; +} + +- (UILabel *)contentView { + if (!_contentView) { + _contentView = [[UILabel alloc] init]; + _contentView.text = @"Your Content Here"; + _contentView.textAlignment = NSTextAlignmentCenter; + _contentView.translatesAutoresizingMaskIntoConstraints = NO; + } + return _contentView; +} + +- (BRZBannerUIView *)bannerView { + if (AppDelegate.braze && !_bannerView) { + __weak typeof(self) weakSelf = self; + _bannerView = [[BRZBannerUIView alloc] + initWithPlacementId:[WideBannerViewController bannerPlacementID] + braze:AppDelegate.braze + processContentUpdates:^(BrazeBannerUIContentUpdates * _Nullable updates, + NSError * _Nullable error) { + // Update layout properties when banner content has finished loading. + dispatch_async(dispatch_get_main_queue(), ^{ + __strong typeof(weakSelf) strongSelf = weakSelf; + if (!strongSelf) return; + + if (!error && updates.height) { + CGFloat height = updates.height.floatValue; + strongSelf.bannerView.hidden = NO; + strongSelf.bannerHeightConstraint.constant = MIN(height, 80); + } + }); + }]; + + _bannerView.translatesAutoresizingMaskIntoConstraints = NO; + _bannerView.hidden = YES; + } + return _bannerView; +} + +- (void)loadView { + [super loadView]; + + self.view.backgroundColor = [UIColor whiteColor]; +} + +- (void)viewDidLoad { + [super viewDidLoad]; + + [self.view addSubview:self.contentView]; + [self.view addSubview:self.bannerView]; + + self.bannerHeightConstraint = [self.bannerView.heightAnchor constraintEqualToConstant:0]; + + [NSLayoutConstraint activateConstraints:@[ + [self.contentView.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor], + [self.contentView.leadingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.leadingAnchor], + [self.contentView.trailingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor], + + [self.bannerView.topAnchor constraintEqualToAnchor:self.contentView.bottomAnchor], + + [self.bannerView.leadingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.leadingAnchor], + [self.bannerView.trailingAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor], + [self.bannerView.bottomAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor], + + self.bannerHeightConstraint, + ]]; +} + +@end diff --git a/Examples/ObjC/manual-integration-setup.sh b/Examples/ObjC/manual-integration-setup.sh index 767aa4a848..186d21cb37 100755 --- a/Examples/ObjC/manual-integration-setup.sh +++ b/Examples/ObjC/manual-integration-setup.sh @@ -20,7 +20,7 @@ if [ ! -f "manual-integration-setup.sh" ]; then fi # Constants -url="https://github.com/braze-inc/braze-swift-sdk/releases/download/11.2.0/braze-swift-sdk-prebuilt.zip" +url="https://github.com/braze-inc/braze-swift-sdk/releases/download/11.3.0/braze-swift-sdk-prebuilt.zip" echo "→" "Cleaning up" rm -rf braze-swift-sdk-prebuilt diff --git a/Examples/README.md b/Examples/README.md index a53d1ff0f2..69edcd7fcc 100644 --- a/Examples/README.md +++ b/Examples/README.md @@ -31,6 +31,13 @@ Follow the instructions below for your preferred integration method to get start - Demonstrates how to use the analytics features of the SDK. - Related tutorial: [Analytics](https://braze-inc.github.io/braze-swift-sdk/tutorials/braze/a3-analytics). +#### BannerUI + +- iOS, visionOS, Mac Catalyst. +- Swift, Objective-C. +- Demonstrates how to use the Braze provided Banners UI. +- Related tutorial: [Banners UI](https://braze-inc.github.io/braze-swift-sdk/tutorials/braze/c4-bannersui). + #### ContentCardUI - iOS, visionOS, Mac Catalyst. diff --git a/Examples/Swift/Examples-CocoaPods.xcodeproj/project.pbxproj b/Examples/Swift/Examples-CocoaPods.xcodeproj/project.pbxproj index 55dce4b5a0..b241318c96 100644 --- a/Examples/Swift/Examples-CocoaPods.xcodeproj/project.pbxproj +++ b/Examples/Swift/Examples-CocoaPods.xcodeproj/project.pbxproj @@ -13,6 +13,8 @@ 069F4D1FC2D1AAE0CF69F4C8 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; 06C97BF64E9A3B3D120DC5DA /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4946E4B2E8F15E1A3241324 /* Readme.swift */; }; 080BBDE75ABB2E0DADB67039 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76740E64DEB7874C6DA73841 /* ReadmeViewController.swift */; }; + 09ACDDCCE6B523D8B4FE5B73 /* FullScreenBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D421408E341011D424067888 /* FullScreenBannerView.swift */; }; + 09B1343DC6C992FF28F227C4 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76740E64DEB7874C6DA73841 /* ReadmeViewController.swift */; }; 0C12495B170FB199C95069B4 /* PushNotificationsServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 025C514A87C7682650C8F612 /* PushNotificationsServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 0C5F124D581FF4E46B1504D8 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; 0D6BFB49878D5CC48424A07E /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; @@ -32,6 +34,7 @@ 1CC87CB163B19FF99D59E189 /* SDWebImageGIFViewProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = F224F57B3C4BE13C161148B0 /* SDWebImageGIFViewProvider.swift */; }; 1D794C5E189200718ED42641 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; 1EB7F46010C2EE195B7F82DA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; + 1EF554A50A1216254FFB5FB8 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA2A3D76B00A6BEA65421FEA /* AppDelegate.swift */; }; 1F73E5982977DF8B1CBDEAA6 /* CustomInAppMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFB1DEB4CDC0C09DF4FF9DC /* CustomInAppMessagePresenter.swift */; }; 2004486C1F497F0D78D3C3C7 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CABCDD10D6E23AB146F9F7BA /* LaunchScreen.storyboard */; }; 205B074E35873EF92413D18D /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76740E64DEB7874C6DA73841 /* ReadmeViewController.swift */; }; @@ -44,12 +47,14 @@ 2710F3AE64ADADA029F47AFE /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; 272A23EAF6BAD8414B08EBBC /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76740E64DEB7874C6DA73841 /* ReadmeViewController.swift */; }; 292FEAABE62351F10BD7242B /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76740E64DEB7874C6DA73841 /* ReadmeViewController.swift */; }; + 2A30540E44CBF218FEB46764 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76740E64DEB7874C6DA73841 /* ReadmeViewController.swift */; }; 2C9AF12DBFA862672C30D2A5 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = C938B015CECD020B6FA2206F /* Readme.swift */; }; 2CF3E11C7FFCA09427FEABCC /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76740E64DEB7874C6DA73841 /* ReadmeViewController.swift */; }; 2D02D8ADF963BCFCAB1D3683 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6208C00FB5F7F0284A26EF20 /* UserNotifications.framework */; }; 2D09AF026442A34EA10220ED /* CustomClassicImageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10E9BA8357610D7CCDC06664 /* CustomClassicImageCell.swift */; }; 2DFA95DE4E06424D334DFA68 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDDE1D547738FC75F10AD5E3 /* AppDelegate.swift */; }; 30489BB559111E4249FB3AB3 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; + 3074378F8043D1C2965E1918 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3A14E86E6AA4CC7D8BFCEB /* Readme.swift */; }; 307E7DE030198D472A0793BE /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6992ACA4C973FAF6333EE4B2 /* Readme.swift */; }; 30D6D47D9794D2218AB06B72 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; 3326437C7B041FF7467D5810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDDE1D547738FC75F10AD5E3 /* AppDelegate.swift */; }; @@ -59,6 +64,7 @@ 34C9C566ACB7B6220C782866 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5A56AB422F8DA782A8D2B6FD /* LaunchScreen.storyboard */; }; 356FD93DCAEAD68D24E91795 /* InAppMessageInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D93378C85712C1E5E9146B7 /* InAppMessageInfoViewController.swift */; }; 3781F2BE6289AA47C84F66EB /* AppDelegate+Xcode16.swift in Sources */ = {isa = PBXBuildFile; fileRef = E52769C8F4926DE1AE9B5C40 /* AppDelegate+Xcode16.swift */; }; + 37B50C8BB725C30297D605BB /* WideBannerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E80E353EFF241ED8AB09692 /* WideBannerViewController.swift */; }; 383D757BFC1CFD0BE5D70CAB /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; 3848E121BD7880E965B1E928 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6742114C06FC93D4AA30B5B /* Readme.swift */; }; 3C6B1FC5F61A52BDC162A342 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; @@ -69,6 +75,7 @@ 3FDAB2D5E66213A52992C885 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; 40BBC96C23C0D03C1876EFB3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; 429668D7E26EA305BA4A64E4 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; + 42F2573DBA38537BC54FC655 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA2A3D76B00A6BEA65421FEA /* AppDelegate.swift */; }; 432D837B85AECB56882916FE /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; 44DADB7B7CFA12B9AB9CA455 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; 44F4784C360A17F59782C9F2 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76740E64DEB7874C6DA73841 /* ReadmeViewController.swift */; }; @@ -80,20 +87,24 @@ 4FCBD886C8E6369A34F9F34F /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; 505878B30DC03D2DEDE05E05 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; 5064BAE3FFA9153AFCCE50DF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CABCDD10D6E23AB146F9F7BA /* LaunchScreen.storyboard */; }; + 5312D66C95FC98E34439D9B0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; 567E59F0E3667B58443A0A67 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; 582BF08BAF99A14629AD5213 /* SDWebImageGIFViewProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2EDAC4345C8A7EC73C0A9C /* SDWebImageGIFViewProvider.swift */; }; 584387A3A80A86D5F630ABBE /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; 5895FE9958ED00F6EB101FE3 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0041AFC6938603AA8E408C85 /* AppDelegate.swift */; }; 58FD9E2C770FCCBFC2E62FCF /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; + 5C15CF9A910741E8927051B9 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3A14E86E6AA4CC7D8BFCEB /* Readme.swift */; }; 5D0DCB646641CE7207E1BD64 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6742114C06FC93D4AA30B5B /* Readme.swift */; }; 5F5E5B8EBF6083B3DAD5878E /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFF5B7638E61D0A89CA64347 /* Readme.swift */; }; 5FC97622559904A83BEB7082 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44FBE4BAAD0A7EFA2E43ED70 /* Readme.swift */; }; 60CF14BBAE42D94C389102B4 /* InAppMessageInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D93378C85712C1E5E9146B7 /* InAppMessageInfoViewController.swift */; }; + 611DC86C902AEDEEB384BA42 /* FullScreenBannerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20159671F23FF2158E99805 /* FullScreenBannerViewController.swift */; }; 614C896736BBDCBB171D6D3C /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6208C00FB5F7F0284A26EF20 /* UserNotifications.framework */; }; 619F5F639E4766776527132C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CABCDD10D6E23AB146F9F7BA /* LaunchScreen.storyboard */; }; 636943DDB4AFE57A51F085B1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CABCDD10D6E23AB146F9F7BA /* LaunchScreen.storyboard */; }; 639A93232862A95314463DE5 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; 644D7407D3D94DA3DD6229D4 /* ConfirmButtonSlideupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 96894D8C1584EE12A5157761 /* ConfirmButtonSlideupView.swift */; }; + 64DFF75B22AADA180BF17F7A /* FullScreenBannerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20159671F23FF2158E99805 /* FullScreenBannerViewController.swift */; }; 67058DC19EFF4F37D190035A /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; 684401812C4C2490603788C1 /* FullWidthSlideupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93C74A8AB0317373366057E4 /* FullWidthSlideupView.swift */; }; 6A1B61950E0EEE8F2CC58222 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; @@ -106,6 +117,7 @@ 6F2E37C2C6236133A73B2DA7 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; 7246237C3E3EFEE060D4520F /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = C938B015CECD020B6FA2206F /* Readme.swift */; }; 72791FE82F8241C0D961A970 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16ACF11150875C20E08B3AC /* AppDelegate.swift */; }; + 728480514BDF1C6D66016875 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; 72BE89025E94DA8F7F7970AB /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; 751629820C901B270690774F /* CardsInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CEB9D205C9479024B2674FA /* CardsInfoViewController.swift */; }; 752889412180A38071C99A4A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C30CE34888116E754351344 /* AppDelegate.swift */; }; @@ -129,6 +141,7 @@ 8AA046F58DFE835A8DBDC2FB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; 8B1BBB06A40509279B6EBF54 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; 8CB6F5A018D7808951CEC81E /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76740E64DEB7874C6DA73841 /* ReadmeViewController.swift */; }; + 8CE4EAFEBBAEFFC2B9EEC490 /* WideBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84A20963BE0347B89E06ADEA /* WideBannerView.swift */; }; 8D3BC628AF159AB7C8F52527 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; 8F97B2F73B06A36A7F3AAE48 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76740E64DEB7874C6DA73841 /* ReadmeViewController.swift */; }; 8FC48E82C09FB867DB946AEC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A62CFC2A1D9B50D275C2AE0 /* AppDelegate.swift */; }; @@ -151,10 +164,12 @@ A944CE162F11533F7130A559 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4946E4B2E8F15E1A3241324 /* Readme.swift */; }; A9AED96799D5C2D0AEC7DDDB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; A9EB3B851AA2C5B372FD9BB3 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E5C167310C6007B13D010C5 /* Readme.swift */; }; + AA897BC8AB91D7E2A6AD5ABA /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; AB2FE63CFBECFD1045D16ED7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; AB90E69DF960F3664C2FA3D7 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0041AFC6938603AA8E408C85 /* AppDelegate.swift */; }; AC6C05AB9022A1F300FF867F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10608DDB131D70F8273A64B7 /* AppDelegate.swift */; }; ADA008AB7C4BFD9176F0FA27 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76740E64DEB7874C6DA73841 /* ReadmeViewController.swift */; }; + ADEEA01EFF0D87591BE5FD74 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; AE68881832BF3782E13CB456 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CABCDD10D6E23AB146F9F7BA /* LaunchScreen.storyboard */; }; AFF7AD3EF499610DAD67F807 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; B0A717F2025D431940B10D7D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B16ACF11150875C20E08B3AC /* AppDelegate.swift */; }; @@ -164,6 +179,7 @@ B38285F23CE784F512B294B9 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; B3DD5AA6ACFA7EDB1E09DC5A /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; B4E24ECC58CDBA768C88094C /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; + B4F21205DF1B8AB9F7FF74AE /* WideBannerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E80E353EFF241ED8AB09692 /* WideBannerViewController.swift */; }; B51C66151E35B868B223CF1E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; B5D55C089EF137CF95BE7363 /* PushNotificationsServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 025C514A87C7682650C8F612 /* PushNotificationsServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; B623DADAA2CD790DE1B3FBF6 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; @@ -176,6 +192,7 @@ B9FD7A99B38E4F820A640660 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76740E64DEB7874C6DA73841 /* ReadmeViewController.swift */; }; BAE074F57F9EBA0A105F6211 /* FullWidthSlideupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93C74A8AB0317373366057E4 /* FullWidthSlideupView.swift */; }; BC3E36C23AE0BDDAAEDCF26F /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; + BCA05BA080227BAABF95CFCB /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; BEA3BD15D40DE822A1BBF0F8 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; BF2115A813673E375B6E90FD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7B31A0AD9310E76D8820B67 /* AppDelegate.swift */; }; BF4E8A203E306C324C3D7EEA /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76740E64DEB7874C6DA73841 /* ReadmeViewController.swift */; }; @@ -185,9 +202,13 @@ C316513BDED32D1DCEADBCDD /* CustomInAppMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBFB1DEB4CDC0C09DF4FF9DC /* CustomInAppMessagePresenter.swift */; }; C32CF7F49CA5C89710284E26 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; C3C9A5BFE51607749618DFB1 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76740E64DEB7874C6DA73841 /* ReadmeViewController.swift */; }; + C3EFEE994DA198C7D420FE6B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CABCDD10D6E23AB146F9F7BA /* LaunchScreen.storyboard */; }; C650783920A53EDD98DD19E5 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CABCDD10D6E23AB146F9F7BA /* LaunchScreen.storyboard */; }; C8506C62CCCD592FDF718D48 /* PushNotificationsContentExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 2F8034AC1A6839C07DF75941 /* PushNotificationsContentExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + C8BC827FA4FA2A49400C8556 /* FullScreenBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D421408E341011D424067888 /* FullScreenBannerView.swift */; }; + C915A4DC29C9FAD4F77C7AB0 /* WideBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84A20963BE0347B89E06ADEA /* WideBannerView.swift */; }; CBD0DCC6126437ADCBB9317A /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; + CE7EA5D32051A7A6AEE2065E /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1099A7C7E5E89E130751B24C /* MockImage.swift */; }; CF19792AFCEF53A28612612B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0340E1FFDDBC0C9D72FCD4D4 /* Assets.xcassets */; }; CF50B197D481944888D97C06 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0078638D97BB480D82B18D6C /* Credentials.swift */; }; D043379496CD796896B44512 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BA4A3B91B682BDF5707A9B8 /* AppDelegate.swift */; }; @@ -409,6 +430,7 @@ 10608DDB131D70F8273A64B7 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 1099A7C7E5E89E130751B24C /* MockImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockImage.swift; sourceTree = ""; }; 10E9BA8357610D7CCDC06664 /* CustomClassicImageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomClassicImageCell.swift; sourceTree = ""; }; + 14BBB11A8EAB3794FCB52C38 /* BannerUI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = BannerUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1874579DE7E406E73A3CB3A1 /* UserNotificationsUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotificationsUI.framework; path = System/Library/Frameworks/UserNotificationsUI.framework; sourceTree = SDKROOT; }; 1994AAD3540F9A97336B542D /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; 20ACDCAF82FAFB8B4915FF5D /* SDWebImageGIFViewProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDWebImageGIFViewProvider.swift; sourceTree = ""; }; @@ -418,6 +440,7 @@ 30A0DFD80FCA5043A1BEE12E /* PushNotifications-DelayedInitialization.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "PushNotifications-DelayedInitialization.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 34DB46A770028DFE645A3AE4 /* Location.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = Location.app; sourceTree = BUILT_PRODUCTS_DIR; }; 3CEB9D205C9479024B2674FA /* CardsInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardsInfoViewController.swift; sourceTree = ""; }; + 3F3A14E86E6AA4CC7D8BFCEB /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; 405EC9F18FB085ECB16DB4F2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 420D88B3AD402F98096C9F08 /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; 42BA0F61D883E0421B3FA7CA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; @@ -436,12 +459,15 @@ 6208C00FB5F7F0284A26EF20 /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; 6832319B66FB76CAA84519FA /* Location.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = Location.app; sourceTree = BUILT_PRODUCTS_DIR; }; 6992ACA4C973FAF6333EE4B2 /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; + 6CD4675CD37E8D52090B309D /* BannerUI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = BannerUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; 7127ABB9B4C02043D02B278E /* InAppMessageUI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = InAppMessageUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; 72614321094796ABD86A5AA6 /* PushNotificationsServiceExtension.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = PushNotificationsServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 76740E64DEB7874C6DA73841 /* ReadmeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReadmeViewController.swift; sourceTree = ""; }; + 84A20963BE0347B89E06ADEA /* WideBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WideBannerView.swift; sourceTree = ""; }; 8854CADF86F02FA64B2CC3F1 /* ContentCards-Custom-UI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "ContentCards-Custom-UI.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 8A11FA051B21C67BB9D89127 /* CheckoutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckoutViewController.swift; sourceTree = ""; }; 8D93378C85712C1E5E9146B7 /* InAppMessageInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InAppMessageInfoViewController.swift; sourceTree = ""; }; + 8E80E353EFF241ED8AB09692 /* WideBannerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WideBannerViewController.swift; sourceTree = ""; }; 93C74A8AB0317373366057E4 /* FullWidthSlideupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullWidthSlideupView.swift; sourceTree = ""; }; 96894D8C1584EE12A5157761 /* ConfirmButtonSlideupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfirmButtonSlideupView.swift; sourceTree = ""; }; 9A62CFC2A1D9B50D275C2AE0 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -451,6 +477,7 @@ A77BCD95413ADCF8578235CE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; AFF5B7638E61D0A89CA64347 /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; B16ACF11150875C20E08B3AC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + B20159671F23FF2158E99805 /* FullScreenBannerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullScreenBannerViewController.swift; sourceTree = ""; }; B65615CB6F044C414CAF1654 /* ContentCardUI-Customization.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "ContentCardUI-Customization.app"; sourceTree = BUILT_PRODUCTS_DIR; }; B7B31A0AD9310E76D8820B67 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; BA064323F91A22F4E14CAE9D /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; @@ -461,6 +488,7 @@ C4899C134FF6B31F1A51075B /* PushNotifications-Automatic.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "PushNotifications-Automatic.app"; sourceTree = BUILT_PRODUCTS_DIR; }; C78E0B5A5D52F990511A4091 /* ContentCards-Custom-UI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "ContentCards-Custom-UI.app"; sourceTree = BUILT_PRODUCTS_DIR; }; C938B015CECD020B6FA2206F /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; + D421408E341011D424067888 /* FullScreenBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullScreenBannerView.swift; sourceTree = ""; }; D6742114C06FC93D4AA30B5B /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; D6D87B0B28882DFD35A2BE4B /* InAppMessageUI-Customization.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "InAppMessageUI-Customization.app"; sourceTree = BUILT_PRODUCTS_DIR; }; DE3608B9E460175A349CDB87 /* Analytics.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = Analytics.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -473,6 +501,7 @@ F50B74B9EF809701B466BF97 /* PushNotifications-DelayedInitialization.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "PushNotifications-DelayedInitialization.app"; sourceTree = BUILT_PRODUCTS_DIR; }; F55146C540D887C65DD6EFA9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; F90C9DB8B3DF39E04E70DAAB /* ContentCardUI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = ContentCardUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; + FA2A3D76B00A6BEA65421FEA /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; FCE4295F977362ED7183C4CF /* InAppMessages-Custom-UI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "InAppMessages-Custom-UI.app"; sourceTree = BUILT_PRODUCTS_DIR; }; FE50398A21EB6A33EE9874A2 /* InAppMessages-Custom-UI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "InAppMessages-Custom-UI.app"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -595,6 +624,7 @@ children = ( EB043806B7BB06DCA25E0177 /* Common */, 51FBDA444B2130ED53F050CB /* Analytics */, + 7E7E0C2117F579E6C76C0B82 /* BannerUI */, 6F112DA3865BFE3961698859 /* ContentCards-Custom-UI */, F500AE7A04E46943FAA225C4 /* ContentCardUI */, CFAE53A0FC9D7251D24F9F70 /* ContentCardUI-Customization */, @@ -658,12 +688,28 @@ path = tvOS; sourceTree = ""; }; + 7E7E0C2117F579E6C76C0B82 /* BannerUI */ = { + isa = PBXGroup; + children = ( + FA2A3D76B00A6BEA65421FEA /* AppDelegate.swift */, + D421408E341011D424067888 /* FullScreenBannerView.swift */, + B20159671F23FF2158E99805 /* FullScreenBannerViewController.swift */, + 3F3A14E86E6AA4CC7D8BFCEB /* Readme.swift */, + 84A20963BE0347B89E06ADEA /* WideBannerView.swift */, + 8E80E353EFF241ED8AB09692 /* WideBannerViewController.swift */, + ); + name = BannerUI; + path = Sources/BannerUI; + sourceTree = ""; + }; 944D5C0BF6DC0B28ACDA2036 /* Products */ = { isa = PBXGroup; children = ( 9E2B80BBE3951963FBA6BBD3 /* Analytics.app */, DE3608B9E460175A349CDB87 /* Analytics.app */, 0D27FC50D2EF457F536B1D05 /* Analytics.app */, + 6CD4675CD37E8D52090B309D /* BannerUI.app */, + 14BBB11A8EAB3794FCB52C38 /* BannerUI.app */, 8854CADF86F02FA64B2CC3F1 /* ContentCards-Custom-UI.app */, C78E0B5A5D52F990511A4091 /* ContentCards-Custom-UI.app */, 552EA65890BB8DAA0D631388 /* ContentCards-Custom-UI.app */, @@ -1061,6 +1107,22 @@ productReference = F3C2ED512ED12F090A1DC54C /* PushNotifications-Manual.app */; productType = "com.apple.product-type.application"; }; + 7C8E32C853480800C57DC8E7 /* BannerUI-visionOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 38C0BD9C07673F37A09A19E3 /* Build configuration list for PBXNativeTarget "BannerUI-visionOS" */; + buildPhases = ( + CA22BA010905FB1B028F5E91 /* Sources */, + 0F5408060052FDBB85EAE34A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "BannerUI-visionOS"; + productName = "BannerUI-visionOS"; + productReference = 14BBB11A8EAB3794FCB52C38 /* BannerUI.app */; + productType = "com.apple.product-type.application"; + }; A003570FDB24621EC4EA44CD /* InAppMessageUI-iOS */ = { isa = PBXNativeTarget; buildConfigurationList = 164687F613B08495D152F03E /* Build configuration list for PBXNativeTarget "InAppMessageUI-iOS" */; @@ -1256,6 +1318,22 @@ productReference = F90C9DB8B3DF39E04E70DAAB /* ContentCardUI.app */; productType = "com.apple.product-type.application"; }; + FAFC8B1833A6F20A7D444193 /* BannerUI-iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 109F81262E896319C249EA14 /* Build configuration list for PBXNativeTarget "BannerUI-iOS" */; + buildPhases = ( + 42183F1691A493E061D74045 /* Sources */, + 6BC3A42AA571E6E4A914E021 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "BannerUI-iOS"; + productName = "BannerUI-iOS"; + productReference = 6CD4675CD37E8D52090B309D /* BannerUI.app */; + productType = "com.apple.product-type.application"; + }; FDA0A7B4C40914EAF405D9FC /* Analytics-tvOS */ = { isa = PBXNativeTarget; buildConfigurationList = 33A0A8897465C6BD7C17C2E6 /* Build configuration list for PBXNativeTarget "Analytics-tvOS" */; @@ -1332,6 +1410,9 @@ 7A56C6610176F67086A05593 = { ProvisioningStyle = automatic; }; + 7C8E32C853480800C57DC8E7 = { + ProvisioningStyle = automatic; + }; A003570FDB24621EC4EA44CD = { ProvisioningStyle = automatic; }; @@ -1368,6 +1449,9 @@ F7627CCAD54F489968127C71 = { ProvisioningStyle = automatic; }; + FAFC8B1833A6F20A7D444193 = { + ProvisioningStyle = automatic; + }; FDA0A7B4C40914EAF405D9FC = { ProvisioningStyle = automatic; }; @@ -1388,6 +1472,8 @@ A0EF8DC5C1ED6288C32D3D23 /* Analytics-iOS */, FDA0A7B4C40914EAF405D9FC /* Analytics-tvOS */, 1A20DFCA0DF677F61651351C /* Analytics-visionOS */, + FAFC8B1833A6F20A7D444193 /* BannerUI-iOS */, + 7C8E32C853480800C57DC8E7 /* BannerUI-visionOS */, 027F5C80F4345CD80EAB6233 /* ContentCardUI-Customization-iOS */, 75C44F728211105AB0B11127 /* ContentCardUI-Customization-visionOS */, C160EA300423AABE590DA8FE /* ContentCardUI-iOS */, @@ -1420,6 +1506,14 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 0F5408060052FDBB85EAE34A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ADEEA01EFF0D87591BE5FD74 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 13074D7ABBEC686036D4B4ED /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1540,6 +1634,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 6BC3A42AA571E6E4A914E021 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5312D66C95FC98E34439D9B0 /* Assets.xcassets in Resources */, + C3EFEE994DA198C7D420FE6B /* LaunchScreen.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 7299DD69BA7DDA59FA7F954F /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1770,6 +1873,22 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 42183F1691A493E061D74045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1EF554A50A1216254FFB5FB8 /* AppDelegate.swift in Sources */, + 728480514BDF1C6D66016875 /* Credentials.swift in Sources */, + 09ACDDCCE6B523D8B4FE5B73 /* FullScreenBannerView.swift in Sources */, + 64DFF75B22AADA180BF17F7A /* FullScreenBannerViewController.swift in Sources */, + BCA05BA080227BAABF95CFCB /* MockImage.swift in Sources */, + 5C15CF9A910741E8927051B9 /* Readme.swift in Sources */, + 2A30540E44CBF218FEB46764 /* ReadmeViewController.swift in Sources */, + 8CE4EAFEBBAEFFC2B9EEC490 /* WideBannerView.swift in Sources */, + B4F21205DF1B8AB9F7FF74AE /* WideBannerViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 4A2ADA87B5A7F8E2B9688416 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1911,6 +2030,22 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + CA22BA010905FB1B028F5E91 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 42F2573DBA38537BC54FC655 /* AppDelegate.swift in Sources */, + AA897BC8AB91D7E2A6AD5ABA /* Credentials.swift in Sources */, + C8BC827FA4FA2A49400C8556 /* FullScreenBannerView.swift in Sources */, + 611DC86C902AEDEEB384BA42 /* FullScreenBannerViewController.swift in Sources */, + CE7EA5D32051A7A6AEE2065E /* MockImage.swift in Sources */, + 3074378F8043D1C2965E1918 /* Readme.swift in Sources */, + 09B1343DC6C992FF28F227C4 /* ReadmeViewController.swift in Sources */, + C915A4DC29C9FAD4F77C7AB0 /* WideBannerView.swift in Sources */, + 37B50C8BB725C30297D605BB /* WideBannerViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; CC26E24EBD92820E5DD0488B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -2529,6 +2664,28 @@ }; name = Release; }; + 4BFEADB9B0027E777D3C7794 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = automatic; + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.braze.BannerUI-visionOS"; + PRODUCT_NAME = BannerUI; + SDKROOT = xros; + SUPPORTS_MACCATALYST = YES; + "SUPPORTS_MACCATALYST[sdk=appletvos*]" = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = 7; + }; + name = Debug; + }; 4EBD32EE3B16C9EBF7493F73 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3197,6 +3354,29 @@ }; name = Release; }; + B7779E3DFA5B6D0B19DA5EBA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = automatic; + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.braze.BannerUI-iOS"; + PRODUCT_NAME = BannerUI; + SDKROOT = iphoneos; + SUPPORTS_MACCATALYST = YES; + "SUPPORTS_MACCATALYST[sdk=appletvos*]" = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; BA01071103F7280839CDFBF1 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3476,6 +3656,29 @@ }; name = Debug; }; + F1F0BAE70D9F7A6F01185BC3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = automatic; + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.braze.BannerUI-iOS"; + PRODUCT_NAME = BannerUI; + SDKROOT = iphoneos; + SUPPORTS_MACCATALYST = YES; + "SUPPORTS_MACCATALYST[sdk=appletvos*]" = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; F5929C3F0AEDBA673A70D39A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3499,6 +3702,28 @@ }; name = Debug; }; + F6D1095489DB346DC0EF951F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = automatic; + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.braze.BannerUI-visionOS"; + PRODUCT_NAME = BannerUI; + SDKROOT = xros; + SUPPORTS_MACCATALYST = YES; + "SUPPORTS_MACCATALYST[sdk=appletvos*]" = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = 7; + }; + name = Release; + }; F97E175B39C55208E8A73860 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -3609,6 +3834,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 109F81262E896319C249EA14 /* Build configuration list for PBXNativeTarget "BannerUI-iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F1F0BAE70D9F7A6F01185BC3 /* Debug */, + B7779E3DFA5B6D0B19DA5EBA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; 164687F613B08495D152F03E /* Build configuration list for PBXNativeTarget "InAppMessageUI-iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -3645,6 +3879,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 38C0BD9C07673F37A09A19E3 /* Build configuration list for PBXNativeTarget "BannerUI-visionOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4BFEADB9B0027E777D3C7794 /* Debug */, + F6D1095489DB346DC0EF951F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; 38CA0A5742C4A4988D4584C2 /* Build configuration list for PBXNativeTarget "ContentCards-Custom-UI-tvOS" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Examples/Swift/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-iOS.xcscheme b/Examples/Swift/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-iOS.xcscheme new file mode 100644 index 0000000000..84ccec1f2d --- /dev/null +++ b/Examples/Swift/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-iOS.xcscheme @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Swift/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-visionOS.xcscheme b/Examples/Swift/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-visionOS.xcscheme new file mode 100644 index 0000000000..bbec544ab5 --- /dev/null +++ b/Examples/Swift/Examples-CocoaPods.xcodeproj/xcshareddata/xcschemes/BannerUI-visionOS.xcscheme @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Swift/Examples-Manual.xcodeproj/project.pbxproj b/Examples/Swift/Examples-Manual.xcodeproj/project.pbxproj index 7db7745fc7..b1daf1302c 100644 --- a/Examples/Swift/Examples-Manual.xcodeproj/project.pbxproj +++ b/Examples/Swift/Examples-Manual.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 03F471437ECF0E971EBD7791 /* SDWebImage.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A4862669D8E8CC116B81CDB2 /* SDWebImage.bundle */; }; 05E79F99B30429A2502BC7F4 /* BrazeKit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 963312B05750D1D4DA77128F /* BrazeKit.bundle */; }; 06B41135C711D26296E4CB72 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01CEC1A3A03568BC7B5FB442 /* Credentials.swift */; }; + 075FC91520C52D053CC8D39E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 256D73D7DFAD869BB17DE489 /* AppDelegate.swift */; }; 079178CB6ED09627A113150A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFBFE564453A1C1C9CDC8E16 /* AppDelegate.swift */; }; 0A7EA99BD8C303884C6C93AE /* BrazeKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE1AFA11EB03A5B1BEA614A2 /* BrazeKit.xcframework */; }; 0ECDB684C71C7BD798DBE858 /* BrazeKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE1AFA11EB03A5B1BEA614A2 /* BrazeKit.xcframework */; }; @@ -29,11 +30,13 @@ 293B3962C8D61CA48BDE7056 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01CEC1A3A03568BC7B5FB442 /* Credentials.swift */; }; 2BC23851A958ED4FDF0003C5 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01CEC1A3A03568BC7B5FB442 /* Credentials.swift */; }; 2E7B629B9B167DE44FE5EF3A /* SDWebImage.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE6FAA10D6D23B01068CC18C /* SDWebImage.xcframework */; }; + 2F6788C2734C28C58568B144 /* FullScreenBannerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 434B671F0808365AC46FE830 /* FullScreenBannerViewController.swift */; }; 30F321BD55DD7FFBDF1F3A26 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 638F5E553254E25AD567160B /* AppDelegate.swift */; }; 32147D3B7AAB40B41F664A5F /* BrazeKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE1AFA11EB03A5B1BEA614A2 /* BrazeKit.xcframework */; }; 32F46E702F80BFFF8BD77C7F /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99F5F7DADAE59DAF19615685 /* Readme.swift */; }; 34C96AF2258869951165A6B1 /* BrazeKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE1AFA11EB03A5B1BEA614A2 /* BrazeKit.xcframework */; }; 355BBF4B6E8689E0CE5D41AB /* BrazeKit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 963312B05750D1D4DA77128F /* BrazeKit.bundle */; }; + 3BD6A35018FC2A4C76AE0530 /* BrazeUI.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 85365B9C180AB9BA57FBD249 /* BrazeUI.bundle */; }; 3C0214814040DA5270457B61 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1CEE532EAF4BB49965CFD3D /* AppDelegate.swift */; }; 3C59FBCD7B0DD2225CCEF296 /* ConfirmButtonSlideupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5039B504EF5CFE2AD99088B /* ConfirmButtonSlideupView.swift */; }; 3F8777E99E48FF771CE67004 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07DE243578DBC5FA4DF8237E /* MockImage.swift */; }; @@ -41,6 +44,7 @@ 409298693A8374A7F8734E0C /* BrazeKit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 963312B05750D1D4DA77128F /* BrazeKit.bundle */; }; 40D7B28F3472BA18FC36845E /* BrazeUI.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF2ED58955148E8CDC8E8666 /* BrazeUI.xcframework */; }; 41BB9F80FCFCA93D27CE0C26 /* PushNotificationsServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = A9A04673678B1EEA9C7559C6 /* PushNotificationsServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 41D6E795D0E5ABE4045EB223 /* BrazeKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE1AFA11EB03A5B1BEA614A2 /* BrazeKit.xcframework */; }; 4953E427D367ECA7FDC5C0B5 /* CustomClassicImageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59B7972BA21D047FB9DD5434 /* CustomClassicImageCell.swift */; }; 4B9F7A761E9FC0206EB888A1 /* CardsInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E119A40D1B488091F2D29EE8 /* CardsInfoViewController.swift */; }; 4E5A3E6B086DCDA601A8A014 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AEF0FF04032299A31D37CDE4 /* Assets.xcassets */; }; @@ -56,10 +60,12 @@ 5DA56B71104A85AF4B922AF5 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95ACBEAE19ACF0BAFECD47EB /* UserNotifications.framework */; }; 5E3E68099D1B5E370178846F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AEF0FF04032299A31D37CDE4 /* Assets.xcassets */; }; 6277831AF3EAEC5649D638B7 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0617474A1F534AFBE702090C /* ReadmeViewController.swift */; }; + 6448DCF373ADA01F8F4198D5 /* BrazeUI.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF2ED58955148E8CDC8E8666 /* BrazeUI.xcframework */; }; 68F4DFCF05663ED0A9594194 /* BrazePushStory.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 57FB3263FD36197097B5BE6D /* BrazePushStory.xcframework */; }; 6C065226833B8EC7CCEEDA05 /* BrazeKit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 963312B05750D1D4DA77128F /* BrazeKit.bundle */; }; 6D13BBC0068BD17CAB930ACD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5256781FE6611430C077175 /* AppDelegate.swift */; }; 71610D8029EFB74E779CB704 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0617474A1F534AFBE702090C /* ReadmeViewController.swift */; }; + 76BCF8A496F9D39E19031EC7 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01CEC1A3A03568BC7B5FB442 /* Credentials.swift */; }; 799207DEB712E13B6E05DE2C /* BrazeKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE1AFA11EB03A5B1BEA614A2 /* BrazeKit.xcframework */; }; 7AFD9C6A3FAE0BC3B0EECEB1 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07DE243578DBC5FA4DF8237E /* MockImage.swift */; }; 7B24B540AA7946B259E6355F /* BrazeKit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 963312B05750D1D4DA77128F /* BrazeKit.bundle */; }; @@ -72,6 +78,7 @@ 8A9714FF325FCD3A8EC04F24 /* InAppMessageInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC126939B2257D75B5DEDC4E /* InAppMessageInfoViewController.swift */; }; 8D70FD57499056375C897D5F /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D34CFD4F0F28B78BD6C416B /* Readme.swift */; }; 8E063012B69E9A6DB62071E7 /* SDWebImage.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE6FAA10D6D23B01068CC18C /* SDWebImage.xcframework */; }; + 8F2F13E46F5E02A1C4534389 /* WideBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 49922A76153A261CDD5C690C /* WideBannerView.swift */; }; 956602757E1D1B3FF897C512 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95146249FC6DFA62963BFC01 /* AppDelegate.swift */; }; 978E44C7BA19CC47A6583139 /* BrazeKit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 963312B05750D1D4DA77128F /* BrazeKit.bundle */; }; 98536812008B5E46932D21C6 /* SDWebImageGIFViewProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDA121B4870060B2DD43FB22 /* SDWebImageGIFViewProvider.swift */; }; @@ -80,6 +87,7 @@ A017E7671D0F2E74041A621D /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01CEC1A3A03568BC7B5FB442 /* Credentials.swift */; }; A0E0A38DCF1576B301F37A04 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01CEC1A3A03568BC7B5FB442 /* Credentials.swift */; }; A11C816BE6C7F8508374868B /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970FEBFCFF80A684AD29EE90 /* Readme.swift */; }; + A209C2D9D02408F5C7A8282E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AEF0FF04032299A31D37CDE4 /* Assets.xcassets */; }; A23043648FD2CC23749714C0 /* BrazeKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE1AFA11EB03A5B1BEA614A2 /* BrazeKit.xcframework */; }; A3899B99283411D1D254D7B8 /* SDWebImage.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A4862669D8E8CC116B81CDB2 /* SDWebImage.bundle */; }; A5171A5ECEC1421B76E99848 /* SDWebImageGIFViewProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FFD57A976BE8350B2E0529C /* SDWebImageGIFViewProvider.swift */; }; @@ -106,6 +114,7 @@ BF7233DE7007E5E231FA48BB /* AppDelegate+Xcode16.swift in Sources */ = {isa = PBXBuildFile; fileRef = 233D96191DCA8E6AD3D42D11 /* AppDelegate+Xcode16.swift */; }; C00AE8D9608F09A56D03B49C /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55E49D89F598192D2C7522BE /* Readme.swift */; }; C2C0054EA8B2CD0FE02300A7 /* BrazeLocation.bundle in Resources */ = {isa = PBXBuildFile; fileRef = EB8AF6AAFE01DAED72696307 /* BrazeLocation.bundle */; }; + C2EBE37C2030F1B86EED62DA /* WideBannerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA32B7E19BF4CA81A4AE81C5 /* WideBannerViewController.swift */; }; C52569EE1C4FC5B2E83739AC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AEF0FF04032299A31D37CDE4 /* Assets.xcassets */; }; C9A4905EA63DA015B0A4B30F /* BrazeUI.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 85365B9C180AB9BA57FBD249 /* BrazeUI.bundle */; }; CA2EDD56A6001241C3F63015 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0617474A1F534AFBE702090C /* ReadmeViewController.swift */; }; @@ -121,7 +130,10 @@ D6EAAB5502A9BA76C9BE8866 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC51D2209600CED7B9043D01 /* AppDelegate.swift */; }; DA47B24FA215F807B70B8D4C /* BrazeUI.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CF2ED58955148E8CDC8E8666 /* BrazeUI.xcframework */; }; DB3E577E33C62FEECE5FCF8F /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01CEC1A3A03568BC7B5FB442 /* Credentials.swift */; }; + DD3ABB6CF81334612F7FB881 /* FullScreenBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABB2973236989E92EA82CB53 /* FullScreenBannerView.swift */; }; + E0F6572D72FBE2FEC520E6B5 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90811594EF13DF398BDD0B72 /* Readme.swift */; }; E23BEBB47BCB32C0740CD6E1 /* SDWebImage.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A4862669D8E8CC116B81CDB2 /* SDWebImage.bundle */; }; + E29D5BAB7B18E58011A0BECA /* BrazeKit.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 963312B05750D1D4DA77128F /* BrazeKit.bundle */; }; E352515AA2E8573F81EE4F90 /* CheckoutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 627406F5A099BE6947DE116F /* CheckoutViewController.swift */; }; E629D507069FAC182B04BBBF /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0617474A1F534AFBE702090C /* ReadmeViewController.swift */; }; E6DF2E44081D08C690C2FC49 /* SDWebImageGIFViewProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A4F7F81F66CDA13C9604FDA /* SDWebImageGIFViewProvider.swift */; }; @@ -132,6 +144,7 @@ EB6C8041CD7DDF8207D37646 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07DE243578DBC5FA4DF8237E /* MockImage.swift */; }; EC93033856DCA82BFD60BD21 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 590B9E6A3257E78D0EAD6A81 /* Readme.swift */; }; ECF0705E66A355F6A522CD04 /* AuthenticationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A44AB6CF753C2512EA4D110C /* AuthenticationManager.swift */; }; + EDD3BAE2621170F9975784D1 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0617474A1F534AFBE702090C /* ReadmeViewController.swift */; }; EE1C5AC0018BC5820B5567CF /* SDWebImage.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE6FAA10D6D23B01068CC18C /* SDWebImage.xcframework */; }; F12A0D7DD1578FB848CEDC93 /* SDWebImage.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = CE6FAA10D6D23B01068CC18C /* SDWebImage.xcframework */; }; F205773604C16B2A873B11C9 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8336D4BB1A8E983EF334361 /* Readme.swift */; }; @@ -140,6 +153,7 @@ F4614BFB3B0846850399E6D3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AEF0FF04032299A31D37CDE4 /* Assets.xcassets */; }; F646B1FF70F027C387555FDF /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0617474A1F534AFBE702090C /* ReadmeViewController.swift */; }; F89CD2EB10DCB566C20D739C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4F7E5A96D302B8CA3D7FCE5 /* AppDelegate.swift */; }; + F9797C4B17CDEAA88A3331BB /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07DE243578DBC5FA4DF8237E /* MockImage.swift */; }; FC8A419CB477428EFE88152F /* BrazeKit.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = EE1AFA11EB03A5B1BEA614A2 /* BrazeKit.xcframework */; }; /* End PBXBuildFile section */ @@ -234,6 +248,7 @@ 1F1631DFDCE0C1B3F41E792E /* PushNotifications-Automatic.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "PushNotifications-Automatic.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 233D96191DCA8E6AD3D42D11 /* AppDelegate+Xcode16.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "AppDelegate+Xcode16.swift"; sourceTree = ""; }; 239CF1158BD0D1AB82866793 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 256D73D7DFAD869BB17DE489 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 2FFD57A976BE8350B2E0529C /* SDWebImageGIFViewProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDWebImageGIFViewProvider.swift; sourceTree = ""; }; 30D72A9C07BEDB9E09FAE84D /* BrazeNotificationService.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = BrazeNotificationService.xcframework; path = "braze-swift-sdk-prebuilt/static/BrazeNotificationService.xcframework"; sourceTree = ""; }; 32DFBEB40F1E345DACF93396 /* SDWebImageGIFViewProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDWebImageGIFViewProvider.swift; sourceTree = ""; }; @@ -241,6 +256,8 @@ 39B760D798A1106EC4FDD2AB /* InAppMessages-Custom-UI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "InAppMessages-Custom-UI.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 3A4F7F81F66CDA13C9604FDA /* SDWebImageGIFViewProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDWebImageGIFViewProvider.swift; sourceTree = ""; }; 3AFA91B6028D67A3FDF7B083 /* InAppMessageUI-Customization.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "InAppMessageUI-Customization.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 434B671F0808365AC46FE830 /* FullScreenBannerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullScreenBannerViewController.swift; sourceTree = ""; }; + 49922A76153A261CDD5C690C /* WideBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WideBannerView.swift; sourceTree = ""; }; 52B2A24F812A684E253E1C55 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 52E9A2F2A90CD27D63E5F049 /* ContentCards-Custom-UI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "ContentCards-Custom-UI.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 533195F22A1588713AF533FD /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; @@ -255,10 +272,12 @@ 758DEDBCB620A5640515A39F /* Analytics.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = Analytics.app; sourceTree = BUILT_PRODUCTS_DIR; }; 7A078FB1132FB5E11A432E19 /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; 7DEA0C6639997814399BC75B /* ContentCardUI-Customization.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "ContentCardUI-Customization.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 852DD8ED34234337913161C1 /* BannerUI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = BannerUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; 85365B9C180AB9BA57FBD249 /* BrazeUI.bundle */ = {isa = PBXFileReference; lastKnownFileType = wrapper.cfbundle; name = BrazeUI.bundle; path = "braze-swift-sdk-prebuilt/bundle/BrazeUI.bundle"; sourceTree = ""; }; 892C81C4FA9E8A7692363B5A /* PushNotifications-Manual.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "PushNotifications-Manual.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 89EA34CA16304FF0F987694F /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; 8FDDEDFBD839855424A46CD3 /* ContentCardUI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = ContentCardUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 90811594EF13DF398BDD0B72 /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; 94272233486EA1A8ABB554F2 /* InAppMessageUI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = InAppMessageUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; 95146249FC6DFA62963BFC01 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 95ACBEAE19ACF0BAFECD47EB /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; @@ -271,12 +290,14 @@ A4862669D8E8CC116B81CDB2 /* SDWebImage.bundle */ = {isa = PBXFileReference; lastKnownFileType = wrapper.cfbundle; name = SDWebImage.bundle; path = "braze-swift-sdk-prebuilt/bundle/SDWebImage.bundle"; sourceTree = ""; }; A5256781FE6611430C077175 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; A9A04673678B1EEA9C7559C6 /* PushNotificationsServiceExtension.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = PushNotificationsServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; + ABB2973236989E92EA82CB53 /* FullScreenBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullScreenBannerView.swift; sourceTree = ""; }; AC126939B2257D75B5DEDC4E /* InAppMessageInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InAppMessageInfoViewController.swift; sourceTree = ""; }; AC9CF4A73393593A05187CAC /* FullWidthSlideupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullWidthSlideupView.swift; sourceTree = ""; }; ADE8605DB3AE191A4546EFB8 /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; AEF0FF04032299A31D37CDE4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; AFC77805EAA869EA96F0BA02 /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; B0A9DDFB66D2EE1C542B675F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + BA32B7E19BF4CA81A4AE81C5 /* WideBannerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WideBannerViewController.swift; sourceTree = ""; }; BE7CF3E9F05C416B3F94F7D6 /* BrazePushStory.bundle */ = {isa = PBXFileReference; lastKnownFileType = wrapper.cfbundle; name = BrazePushStory.bundle; path = "braze-swift-sdk-prebuilt/bundle/BrazePushStory.bundle"; sourceTree = ""; }; C1D163F4C981902AAE2C5031 /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; C248D54740025F7A153AA681 /* NotificationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationViewController.swift; sourceTree = ""; }; @@ -319,6 +340,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 428FEE70D753BF8F8D0AB0AE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 41D6E795D0E5ABE4045EB223 /* BrazeKit.xcframework in Frameworks */, + 6448DCF373ADA01F8F4198D5 /* BrazeUI.xcframework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 46451458FBDF142DB7694C90 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -433,6 +463,7 @@ isa = PBXGroup; children = ( 758DEDBCB620A5640515A39F /* Analytics.app */, + 852DD8ED34234337913161C1 /* BannerUI.app */, 52E9A2F2A90CD27D63E5F049 /* ContentCards-Custom-UI.app */, 7DEA0C6639997814399BC75B /* ContentCardUI-Customization.app */, 8FDDEDFBD839855424A46CD3 /* ContentCardUI.app */, @@ -469,6 +500,20 @@ path = Sources/InAppMessageUI; sourceTree = ""; }; + 3AC38B133E4D7582E310D4AC /* BannerUI */ = { + isa = PBXGroup; + children = ( + 256D73D7DFAD869BB17DE489 /* AppDelegate.swift */, + ABB2973236989E92EA82CB53 /* FullScreenBannerView.swift */, + 434B671F0808365AC46FE830 /* FullScreenBannerViewController.swift */, + 90811594EF13DF398BDD0B72 /* Readme.swift */, + 49922A76153A261CDD5C690C /* WideBannerView.swift */, + BA32B7E19BF4CA81A4AE81C5 /* WideBannerViewController.swift */, + ); + name = BannerUI; + path = Sources/BannerUI; + sourceTree = ""; + }; 4CCE6170371FD8120E5B1290 /* InAppMessageUI-Customization */ = { isa = PBXGroup; children = ( @@ -486,6 +531,7 @@ children = ( FBA27B1AC5B0687D963FB7AA /* Common */, BFDCF0E5D62AB33DDEB1E4D7 /* Analytics */, + 3AC38B133E4D7582E310D4AC /* BannerUI */, A34B68986DE12152585A32EF /* ContentCards-Custom-UI */, 01F2F51AADCF696ECCAFD12B /* ContentCardUI */, C5873688162F3F46F2B5802F /* ContentCardUI-Customization */, @@ -870,6 +916,23 @@ productReference = 39B760D798A1106EC4FDD2AB /* InAppMessages-Custom-UI.app */; productType = "com.apple.product-type.application"; }; + D1C9312F07AC04FAF7F688B6 /* BannerUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 712B6302BFCDB9DC954541A7 /* Build configuration list for PBXNativeTarget "BannerUI" */; + buildPhases = ( + 38690E494A33AEB956C25C98 /* Sources */, + FE01C4E37A1BAC2907EED357 /* Resources */, + 428FEE70D753BF8F8D0AB0AE /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = BannerUI; + productName = BannerUI; + productReference = 852DD8ED34234337913161C1 /* BannerUI.app */; + productType = "com.apple.product-type.application"; + }; D80CA9EE4DC950087B08CC18 /* PushNotifications-DelayedInitialization */ = { isa = PBXNativeTarget; buildConfigurationList = 05451D3DEE54A70DB9AF72AC /* Build configuration list for PBXNativeTarget "PushNotifications-DelayedInitialization" */; @@ -935,6 +998,9 @@ CC8373AC31E15FD5A870D3BB = { ProvisioningStyle = automatic; }; + D1C9312F07AC04FAF7F688B6 = { + ProvisioningStyle = automatic; + }; D80CA9EE4DC950087B08CC18 = { ProvisioningStyle = automatic; }; @@ -953,6 +1019,7 @@ projectRoot = ""; targets = ( 3424DE025B55C57D8D88CF98 /* Analytics */, + D1C9312F07AC04FAF7F688B6 /* BannerUI */, 4CF94578CDC41CCB2531C03E /* ContentCardUI */, 7A8A97B5756032F77C72A0FF /* ContentCardUI-Customization */, 8CE88AF5BE8687E1035552BA /* ContentCards-Custom-UI */, @@ -1086,6 +1153,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + FE01C4E37A1BAC2907EED357 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A209C2D9D02408F5C7A8282E /* Assets.xcassets in Resources */, + E29D5BAB7B18E58011A0BECA /* BrazeKit.bundle in Resources */, + 3BD6A35018FC2A4C76AE0530 /* BrazeUI.bundle in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -1124,6 +1201,22 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 38690E494A33AEB956C25C98 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 075FC91520C52D053CC8D39E /* AppDelegate.swift in Sources */, + 76BCF8A496F9D39E19031EC7 /* Credentials.swift in Sources */, + DD3ABB6CF81334612F7FB881 /* FullScreenBannerView.swift in Sources */, + 2F6788C2734C28C58568B144 /* FullScreenBannerViewController.swift in Sources */, + F9797C4B17CDEAA88A3331BB /* MockImage.swift in Sources */, + E0F6572D72FBE2FEC520E6B5 /* Readme.swift in Sources */, + EDD3BAE2621170F9975784D1 /* ReadmeViewController.swift in Sources */, + 8F2F13E46F5E02A1C4534389 /* WideBannerView.swift in Sources */, + C2EBE37C2030F1B86EED62DA /* WideBannerViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 441F878F10BD09F523587E11 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1442,6 +1535,32 @@ }; name = Debug; }; + 23746A54D808F5F4CD9919AE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = automatic; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"braze-swift-sdk-prebuilt/static\"", + ); + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.braze.BannerUI; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = "1,2,7"; + }; + name = Debug; + }; 292F260EB50572BC94C1FCC3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2094,6 +2213,32 @@ }; name = Release; }; + FCA376615716FA018A60BF01 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = automatic; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "\"braze-swift-sdk-prebuilt/static\"", + ); + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.braze.BannerUI; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = "1,2,7"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -2178,6 +2323,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 712B6302BFCDB9DC954541A7 /* Build configuration list for PBXNativeTarget "BannerUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 23746A54D808F5F4CD9919AE /* Debug */, + FCA376615716FA018A60BF01 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; DFDBB0CB913332453DAA4492 /* Build configuration list for PBXNativeTarget "ContentCardUI-Customization" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Examples/Swift/Examples-Manual.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme b/Examples/Swift/Examples-Manual.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme new file mode 100644 index 0000000000..eeba885473 --- /dev/null +++ b/Examples/Swift/Examples-Manual.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Swift/Examples-SwiftPM.xcodeproj/project.pbxproj b/Examples/Swift/Examples-SwiftPM.xcodeproj/project.pbxproj index 1832338e7d..13e363945a 100644 --- a/Examples/Swift/Examples-SwiftPM.xcodeproj/project.pbxproj +++ b/Examples/Swift/Examples-SwiftPM.xcodeproj/project.pbxproj @@ -23,6 +23,7 @@ 1706C805A425B9891F03C685 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0FCD17EEF41713F18F4CA702 /* Assets.xcassets */; }; 19210C4C3F84E4FCEF294DDA /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E59EF18571FF184E5965819 /* MockImage.swift */; }; 192400F4407E861A42E5D31B /* BrazeKit in Frameworks */ = {isa = PBXBuildFile; productRef = 56B0C3BB439D22B39FD34A28 /* BrazeKit */; }; + 1B0009A5BF554FC7A7674215 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E59EF18571FF184E5965819 /* MockImage.swift */; }; 1B1E05801B0FD5BD680AAF12 /* CustomInAppMessagePresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F28A24B0752E1A7F5C2E760 /* CustomInAppMessagePresenter.swift */; }; 1DF1C08B07EE12BE36E9D54A /* CardsInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F8AD06FAD6F81E92F64DD72 /* CardsInfoViewController.swift */; }; 1EEDCADAEE7204185CC6967E /* SDWebImageGIFViewProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4FE3CE0839B9CDC3DBD854F1 /* SDWebImageGIFViewProvider.swift */; }; @@ -39,27 +40,34 @@ 3C02C1D2705DD7EA7DDBB1F3 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0C3766DAA0E86C999794A8F /* ReadmeViewController.swift */; }; 3C2431D4633D61A92CD9F814 /* PushNotificationsContentExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = A7B092ACAEC915379923328F /* PushNotificationsContentExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 3DB4EEAF2E9C2939B89DA1F8 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCAE9DDCCBE7557171C3574D /* Credentials.swift */; }; + 3E6B194C548511577D79ACA9 /* BrazeUI in Frameworks */ = {isa = PBXBuildFile; productRef = E8F0CDD2BA63A81551367410 /* BrazeUI */; }; 3F89717369F2843ADE0A6C72 /* InAppMessageInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9558DB2C4D4AC89D4AF89D2A /* InAppMessageInfoViewController.swift */; }; 415A15C183F0F1C99F81F869 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA2073DD85CD3A92784EC1F4 /* Readme.swift */; }; 428899E5A2B3E55F5D5584BA /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCCC91596E91D51EABEC2401 /* Readme.swift */; }; + 435184022629B52F5501E541 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCAE9DDCCBE7557171C3574D /* Credentials.swift */; }; 441B48CAD39A1021EF88BEA6 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E59EF18571FF184E5965819 /* MockImage.swift */; }; 4484E207BCFD002822F2BB7D /* NotificationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE00D10FF658213E5A00188D /* NotificationViewController.swift */; }; 4A7CFEAEF687982DD12D2985 /* PushNotificationsContentExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = A7B092ACAEC915379923328F /* PushNotificationsContentExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 4E986F1ED04C2A28C3F0C90D /* FullScreenBannerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1740BB61C34E6BCBDA6F3F06 /* FullScreenBannerViewController.swift */; }; 4ED0AB723C077D7353F8E18E /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0C3766DAA0E86C999794A8F /* ReadmeViewController.swift */; }; 4F846A08AD6511B92F7D1EA7 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3779C8A71C6D78BBBD104EE0 /* Readme.swift */; }; 50D8D4EB19BF8DB20DF34B8D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0FCD17EEF41713F18F4CA702 /* Assets.xcassets */; }; 52CAA705E5A2A6B084470A6B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0FCD17EEF41713F18F4CA702 /* Assets.xcassets */; }; 5489F499BAD776AAF047FE41 /* PushNotificationsContentExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = A7B092ACAEC915379923328F /* PushNotificationsContentExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 55575A615424AB84B62EA11D /* AppDelegate+Xcode16.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43029D0CF2FFD58212D8A976 /* AppDelegate+Xcode16.swift */; }; + 5606EFC24899773A0167896E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E8361A451688DDD9588B5C8 /* AppDelegate.swift */; }; 56D5E2804EA244C26A6C7084 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0C3766DAA0E86C999794A8F /* ReadmeViewController.swift */; }; + 581BE073EED9A7F7DF18FAC3 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = D903A056458272184BA387B0 /* Readme.swift */; }; 5C46A726B573C78D24809762 /* BrazeKit in Frameworks */ = {isa = PBXBuildFile; productRef = 1BF6D20F4E3962FBB5B92AF3 /* BrazeKit */; }; 61A171370197788908EC6E6C /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0C3766DAA0E86C999794A8F /* ReadmeViewController.swift */; }; 64FA8C3157DE02D59358B389 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0C3766DAA0E86C999794A8F /* ReadmeViewController.swift */; }; 69EFC44917551E618D408078 /* AuthenticationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 591F3570467FB230FB58226B /* AuthenticationManager.swift */; }; 6A57DC306722BCFB4E0CE424 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E59EF18571FF184E5965819 /* MockImage.swift */; }; 6B20D783226EC21AD5B2FCE9 /* SDWebImageGIFViewProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4A7BDBC78AFBA13FE890836 /* SDWebImageGIFViewProvider.swift */; }; + 6C33A4039AA2C6434E4C2BCB /* WideBannerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB1BAFFE38985F8A4C3C60A /* WideBannerViewController.swift */; }; 6CB3AC485F3CFBA9395977A1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A02B81A3965D35DA6381280B /* AppDelegate.swift */; }; 6D37F619E60F577AF2FB208D /* BrazeKit in Frameworks */ = {isa = PBXBuildFile; productRef = 9720FE32CFB77D7E0319A501 /* BrazeKit */; }; + 6EAC7E6B09832F4AE89EED28 /* FullScreenBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58144D9A782909488951B3C0 /* FullScreenBannerView.swift */; }; 76D388C71E54AC6F93A16056 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7B5CF8D1D25040DF4009F8D /* Readme.swift */; }; 77D0B2EF2C33D791B3324AD2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69A95BD7429DEEF38D2D3902 /* AppDelegate.swift */; }; 7CFDF51A3B73EE52EFB93AE6 /* PushNotificationsServiceExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = B5666DA142189EEEDFAFB41F /* PushNotificationsServiceExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; @@ -96,6 +104,7 @@ BF41216C1D111CE29716A956 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0FCD17EEF41713F18F4CA702 /* Assets.xcassets */; }; C0D24609493996E29265747A /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7097EB3ABED4921B719078C /* Readme.swift */; }; C18EE9EE632F602ED54A3E25 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCAE9DDCCBE7557171C3574D /* Credentials.swift */; }; + C19B7582791B96C003F1E05D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0FCD17EEF41713F18F4CA702 /* Assets.xcassets */; }; CB098C7D232762AE7FBE8C1E /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E59EF18571FF184E5965819 /* MockImage.swift */; }; D2C67400FFB0B1B2704FBC1E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1547060F01C454ED90CBC172 /* AppDelegate.swift */; }; D52CCDAF5D7012F377EA5942 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E59EF18571FF184E5965819 /* MockImage.swift */; }; @@ -103,10 +112,12 @@ DD04470BAE6FBDC467DBDA53 /* BrazeKit in Frameworks */ = {isa = PBXBuildFile; productRef = 40864C1ED6466B40F23B72D8 /* BrazeKit */; }; DE620D05A5DCCA569EE55A19 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0FCD17EEF41713F18F4CA702 /* Assets.xcassets */; }; DED6497BFC44ADEAA7CF1A65 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99BC5C30464318DD5BAD679C /* Readme.swift */; }; + E118DCD0E5E68391043F15BF /* WideBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 512457F3EE742BCEBF70A97D /* WideBannerView.swift */; }; E2498F93471B3ED7DCF4F798 /* BrazeKit in Frameworks */ = {isa = PBXBuildFile; productRef = 1587AFA62763A9B75CA01C6C /* BrazeKit */; }; E293C55F39CB2FB23B1FC702 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCAE9DDCCBE7557171C3574D /* Credentials.swift */; }; E2E95C34F86FA357D6BCAE54 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0FCD17EEF41713F18F4CA702 /* Assets.xcassets */; }; E5131ADF55A3FB4A71A0EBC7 /* SDWebImageGIFViewProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 727E0E49D4446141F00905B4 /* SDWebImageGIFViewProvider.swift */; }; + E661F97A6D1858D647AF0EAB /* BrazeKit in Frameworks */ = {isa = PBXBuildFile; productRef = 8790507F4D5F35EB03D127E1 /* BrazeKit */; }; E784AA64821A0E83F5F90128 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCAE9DDCCBE7557171C3574D /* Credentials.swift */; }; E7A502FBBA81B6005B62EE82 /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCAE9DDCCBE7557171C3574D /* Credentials.swift */; }; E923E134167C0E49D15A2990 /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45164B1D1773E47F1B4F4671 /* Readme.swift */; }; @@ -118,6 +129,7 @@ ECF4EB3AB84967F7DBDB8452 /* BrazeUI in Frameworks */ = {isa = PBXBuildFile; productRef = 96F76CB78E3FFBBBCDE87EBD /* BrazeUI */; }; F3F3CC7273572BF814DE3243 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E59EF18571FF184E5965819 /* MockImage.swift */; }; F97087EBFD4931AA7C9F3463 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0FCD17EEF41713F18F4CA702 /* Assets.xcassets */; }; + FA131E4DEC9D70B1E040C0D2 /* ReadmeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0C3766DAA0E86C999794A8F /* ReadmeViewController.swift */; }; FB5AC9ED72701723CF8DC3E9 /* MockImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E59EF18571FF184E5965819 /* MockImage.swift */; }; FD58E69D42E36415DB32AEAD /* Readme.swift in Sources */ = {isa = PBXBuildFile; fileRef = E86FBC0C8BC857C247C84103 /* Readme.swift */; }; /* End PBXBuildFile section */ @@ -214,6 +226,7 @@ 0BDEF769FDC6414D453D28CE /* InAppMessages-Custom-UI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "InAppMessages-Custom-UI.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 0FCD17EEF41713F18F4CA702 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 1547060F01C454ED90CBC172 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 1740BB61C34E6BCBDA6F3F06 /* FullScreenBannerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullScreenBannerViewController.swift; sourceTree = ""; }; 1A008F2386666F587E975D0D /* InAppMessageUI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = InAppMessageUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1F8AD06FAD6F81E92F64DD72 /* CardsInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardsInfoViewController.swift; sourceTree = ""; }; 220432BEC0EA7628608EA5BA /* braze-swift-sdk */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "braze-swift-sdk"; path = ../..; sourceTree = SOURCE_ROOT; }; @@ -224,7 +237,9 @@ 43898C005AA33A7630288625 /* ContentCardUI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = ContentCardUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; 45164B1D1773E47F1B4F4671 /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; 4FE3CE0839B9CDC3DBD854F1 /* SDWebImageGIFViewProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDWebImageGIFViewProvider.swift; sourceTree = ""; }; + 512457F3EE742BCEBF70A97D /* WideBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WideBannerView.swift; sourceTree = ""; }; 57D73DD16728C7AD0A7EA662 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 58144D9A782909488951B3C0 /* FullScreenBannerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullScreenBannerView.swift; sourceTree = ""; }; 591F3570467FB230FB58226B /* AuthenticationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationManager.swift; sourceTree = ""; }; 61323FF27FE35756D97CED2B /* Location.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = Location.app; sourceTree = BUILT_PRODUCTS_DIR; }; 631DCED7E638A6BD4C9D95C2 /* CheckoutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckoutViewController.swift; sourceTree = ""; }; @@ -232,11 +247,13 @@ 69A95BD7429DEEF38D2D3902 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 6A76DADC444C28D2653F471B /* InAppMessageUI-Customization.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "InAppMessageUI-Customization.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 6A7EC3A55D550F5ADC29F4F4 /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; + 6E8361A451688DDD9588B5C8 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 727E0E49D4446141F00905B4 /* SDWebImageGIFViewProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SDWebImageGIFViewProvider.swift; sourceTree = ""; }; 7E59EF18571FF184E5965819 /* MockImage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockImage.swift; sourceTree = ""; }; 8B1C56F36CEB28971F181FAC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 8F28A24B0752E1A7F5C2E760 /* CustomInAppMessagePresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomInAppMessagePresenter.swift; sourceTree = ""; }; 9558DB2C4D4AC89D4AF89D2A /* InAppMessageInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InAppMessageInfoViewController.swift; sourceTree = ""; }; + 98ADD07CC89BDF408F0F8288 /* BannerUI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = BannerUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; 99BC5C30464318DD5BAD679C /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; 9AE5A233316273D84DDDECFB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; A02B81A3965D35DA6381280B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -250,6 +267,7 @@ B5666DA142189EEEDFAFB41F /* PushNotificationsServiceExtension.appex */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "wrapper.app-extension"; path = PushNotificationsServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; B6A36D1600434E690C1F9910 /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; B9D5BBC757BE390849FCDD52 /* ContentCards-Custom-UI.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "ContentCards-Custom-UI.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + BBB1BAFFE38985F8A4C3C60A /* WideBannerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WideBannerViewController.swift; sourceTree = ""; }; C7097EB3ABED4921B719078C /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; CCAE9DDCCBE7557171C3574D /* Credentials.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Credentials.swift; sourceTree = ""; }; CCCC91596E91D51EABEC2401 /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; @@ -258,6 +276,7 @@ D63F498CAD1B487B718A6064 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = ""; }; D65F1DF14BBFB716FC3B8EA8 /* ContentCardUI-Customization.app */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.application; path = "ContentCardUI-Customization.app"; sourceTree = BUILT_PRODUCTS_DIR; }; D80C5976EE2C1D5CE55B90B5 /* ConfirmButtonSlideupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfirmButtonSlideupView.swift; sourceTree = ""; }; + D903A056458272184BA387B0 /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; DD38A4655755B813B9D207F9 /* Readme.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Readme.swift; sourceTree = ""; }; E2DBE68CBD1A748542579E66 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; E7F9F8EF80EC7B30AB429008 /* FullWidthSlideupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FullWidthSlideupView.swift; sourceTree = ""; }; @@ -315,6 +334,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 2FA2F0A335091CF440592398 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E661F97A6D1858D647AF0EAB /* BrazeKit in Frameworks */, + 3E6B194C548511577D79ACA9 /* BrazeUI in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 3389685734F96A39F6C8534E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -387,6 +415,20 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 0C988F6B125C5EE79E59318D /* BannerUI */ = { + isa = PBXGroup; + children = ( + 6E8361A451688DDD9588B5C8 /* AppDelegate.swift */, + 58144D9A782909488951B3C0 /* FullScreenBannerView.swift */, + 1740BB61C34E6BCBDA6F3F06 /* FullScreenBannerViewController.swift */, + D903A056458272184BA387B0 /* Readme.swift */, + 512457F3EE742BCEBF70A97D /* WideBannerView.swift */, + BBB1BAFFE38985F8A4C3C60A /* WideBannerViewController.swift */, + ); + name = BannerUI; + path = Sources/BannerUI; + sourceTree = ""; + }; 119FF3F930BD1BF66DEB0B47 /* ContentCards-Custom-UI */ = { isa = PBXGroup; children = ( @@ -539,6 +581,7 @@ isa = PBXGroup; children = ( ED657ED06A52B67E6F53309B /* Analytics.app */, + 98ADD07CC89BDF408F0F8288 /* BannerUI.app */, B9D5BBC757BE390849FCDD52 /* ContentCards-Custom-UI.app */, D65F1DF14BBFB716FC3B8EA8 /* ContentCardUI-Customization.app */, 43898C005AA33A7630288625 /* ContentCardUI.app */, @@ -573,6 +616,7 @@ E3AF9F206199B993ACB3E63D /* Packages */, B4F25C051708E808116165D4 /* Common */, 258F28BC46EE3F2D3E079C37 /* Analytics */, + 0C988F6B125C5EE79E59318D /* BannerUI */, 119FF3F930BD1BF66DEB0B47 /* ContentCards-Custom-UI */, 518A861147034CC7C7A6F886 /* ContentCardUI */, D03146EA39AB44D97182A5DF /* ContentCardUI-Customization */, @@ -707,6 +751,27 @@ productReference = 67B6F9D3158877B0045A2F80 /* PushNotifications-Automatic.app */; productType = "com.apple.product-type.application"; }; + 67EDD4489E05F820AC5C4C72 /* BannerUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5C9226DEFB56FCE86BDECA11 /* Build configuration list for PBXNativeTarget "BannerUI" */; + buildPhases = ( + 97924445A853B859FE3B47C9 /* Sources */, + 81A915DDC95E775F4BC5C01D /* Resources */, + 2FA2F0A335091CF440592398 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = BannerUI; + packageProductDependencies = ( + 8790507F4D5F35EB03D127E1 /* BrazeKit */, + E8F0CDD2BA63A81551367410 /* BrazeUI */, + ); + productName = BannerUI; + productReference = 98ADD07CC89BDF408F0F8288 /* BannerUI.app */; + productType = "com.apple.product-type.application"; + }; 6F0145EB7E39FDE6D8D6FD4C /* PushNotifications-Manual */ = { isa = PBXNativeTarget; buildConfigurationList = CD229DA33B161BD356A199E5 /* Build configuration list for PBXNativeTarget "PushNotifications-Manual" */; @@ -917,6 +982,9 @@ 59B8633A44EBC4A918E17FBF = { ProvisioningStyle = automatic; }; + 67EDD4489E05F820AC5C4C72 = { + ProvisioningStyle = automatic; + }; 6F0145EB7E39FDE6D8D6FD4C = { ProvisioningStyle = automatic; }; @@ -963,6 +1031,7 @@ projectRoot = ""; targets = ( 0642C7DCDAD9AB0330096707 /* Analytics */, + 67EDD4489E05F820AC5C4C72 /* BannerUI */, 0A1211FC31CA5DD9A5E1D18E /* ContentCardUI */, C86DEA9CD6ED7E7E75358AD0 /* ContentCardUI-Customization */, 908A74E9B2A6D8455EB2933D /* ContentCards-Custom-UI */, @@ -1012,6 +1081,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 81A915DDC95E775F4BC5C01D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C19B7582791B96C003F1E05D /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 865BE7921091ADCB20B8EBC2 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1131,6 +1208,22 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 97924445A853B859FE3B47C9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5606EFC24899773A0167896E /* AppDelegate.swift in Sources */, + 435184022629B52F5501E541 /* Credentials.swift in Sources */, + 6EAC7E6B09832F4AE89EED28 /* FullScreenBannerView.swift in Sources */, + 4E986F1ED04C2A28C3F0C90D /* FullScreenBannerViewController.swift in Sources */, + 1B0009A5BF554FC7A7674215 /* MockImage.swift in Sources */, + 581BE073EED9A7F7DF18FAC3 /* Readme.swift in Sources */, + FA131E4DEC9D70B1E040C0D2 /* ReadmeViewController.swift in Sources */, + E118DCD0E5E68391043F15BF /* WideBannerView.swift in Sources */, + 6C33A4039AA2C6434E4C2BCB /* WideBannerViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; A46B2EB718DACFE4899DAD66 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1314,6 +1407,28 @@ }; name = Debug; }; + 0E16DC639408818C18DA1706 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = automatic; + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.braze.BannerUI; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = "1,2,7"; + }; + name = Debug; + }; 24337AEDDB9E06E25C8FD74E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1907,6 +2022,28 @@ }; name = Release; }; + C5E70E219CFA85111DF5B129 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = automatic; + INFOPLIST_FILE = Sources/BannerUI/Info.plist; + "IPHONEOS_DEPLOYMENT_TARGET[sdk=macosx*]" = 14.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.braze.BannerUI; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator xros xrsimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + TARGETED_DEVICE_FAMILY = "1,2,7"; + }; + name = Release; + }; EE68CEA71696509EBFD2C020 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2038,6 +2175,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Debug; }; + 5C9226DEFB56FCE86BDECA11 /* Build configuration list for PBXNativeTarget "BannerUI" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0E16DC639408818C18DA1706 /* Debug */, + C5E70E219CFA85111DF5B129 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; A6A1E4C76F43C48C764BB3A6 /* Build configuration list for PBXNativeTarget "InAppMessageUI-Customization" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -2190,6 +2336,10 @@ isa = XCSwiftPackageProductDependency; productName = BrazeKit; }; + 8790507F4D5F35EB03D127E1 /* BrazeKit */ = { + isa = XCSwiftPackageProductDependency; + productName = BrazeKit; + }; 96F76CB78E3FFBBBCDE87EBD /* BrazeUI */ = { isa = XCSwiftPackageProductDependency; productName = BrazeUI; @@ -2210,6 +2360,10 @@ isa = XCSwiftPackageProductDependency; productName = BrazeKit; }; + E8F0CDD2BA63A81551367410 /* BrazeUI */ = { + isa = XCSwiftPackageProductDependency; + productName = BrazeUI; + }; FCFA9573D5A8726847280A8C /* BrazeLocation */ = { isa = XCSwiftPackageProductDependency; productName = BrazeLocation; diff --git a/Examples/Swift/Examples-SwiftPM.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme b/Examples/Swift/Examples-SwiftPM.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme new file mode 100644 index 0000000000..96a7d04013 --- /dev/null +++ b/Examples/Swift/Examples-SwiftPM.xcodeproj/xcshareddata/xcschemes/BannerUI.xcscheme @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Examples/Swift/Podfile b/Examples/Swift/Podfile index 7100d13cbe..91fbc56d9c 100644 --- a/Examples/Swift/Podfile +++ b/Examples/Swift/Podfile @@ -119,6 +119,18 @@ target 'ContentCards-Custom-UI-visionOS' do pod 'BrazeKit' end +target 'BannerUI-iOS' do + platform :ios, '12.0' + pod 'BrazeKit' + pod 'BrazeUI' +end + +target 'BannerUI-visionOS' do + platform :visionos, '12.0' + pod 'BrazeKit' + pod 'BrazeUI' +end + target 'Location-iOS' do platform :ios, '12.0' pod 'BrazeKit' diff --git a/Examples/Swift/Sources/BannerUI/AppDelegate.swift b/Examples/Swift/Sources/BannerUI/AppDelegate.swift new file mode 100644 index 0000000000..1499fda626 --- /dev/null +++ b/Examples/Swift/Sources/BannerUI/AppDelegate.swift @@ -0,0 +1,70 @@ +import BrazeKit +import BrazeUI +import SwiftUI +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { + + static var braze: Braze? = nil + + func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + // Setup Braze + let configuration = Braze.Configuration(apiKey: brazeApiKey, endpoint: brazeEndpoint) + configuration.logger.level = .info + let braze = Braze(configuration: configuration) + AppDelegate.braze = braze + + // Request updated banners. + braze.banners.requestBannersRefresh(placementIds: [ + "sdk-test-1", + "sdk-test-2", + ]) + + window?.makeKeyAndVisible() + return true + } + + // MARK: - Displaying Banners + + enum UIFramework { + case uiKit + case swiftUI + } + + func displayFullScreenBanner(framework: UIFramework) { + guard let navigationController = window?.rootViewController as? UINavigationController else { + return + } + + switch framework { + case .uiKit: + navigationController.pushViewController(FullScreenBannerViewController(), animated: true) + case .swiftUI: + if #available(iOS 13.0, *) { + let hostingController = UIHostingController(rootView: FullScreenBannerView()) + navigationController.pushViewController(hostingController, animated: true) + } + } + } + + func displayWideBanner(framework: UIFramework) { + guard let navigationController = window?.rootViewController as? UINavigationController else { + return + } + + switch framework { + case .uiKit: + navigationController.pushViewController(WideBannerViewController(), animated: true) + case .swiftUI: + if #available(iOS 13.0, *) { + let hostingController = UIHostingController(rootView: WideBannerView()) + navigationController.pushViewController(hostingController, animated: true) + } + } + } + +} diff --git a/Examples/Swift/Sources/BannerUI/FullScreenBannerView.swift b/Examples/Swift/Sources/BannerUI/FullScreenBannerView.swift new file mode 100644 index 0000000000..41cbb1519e --- /dev/null +++ b/Examples/Swift/Sources/BannerUI/FullScreenBannerView.swift @@ -0,0 +1,50 @@ +import BrazeKit +import BrazeUI +import SwiftUI + +@available(iOS 13.0, *) +struct FullScreenBannerView: View { + + static let bannerPlacementID = "sdk-test-1" + + @State var hasBannerForPlacement: Bool = false + @State var contentHeight: CGFloat = 0 + + var body: some View { + fullScreenView + .onAppear { + AppDelegate.braze?.banners.getBanner( + for: FullScreenBannerView.bannerPlacementID, + { banner in + hasBannerForPlacement = banner != nil + } + ) + } + } + + @MainActor + @ViewBuilder + var fullScreenView: some View { + if let braze = AppDelegate.braze, + hasBannerForPlacement + { + BrazeBannerUI.BannerView( + placementId: FullScreenBannerView.bannerPlacementID, + braze: braze, + processContentUpdates: { result in + switch result { + case .success(let updates): + if let height = updates.height { + self.contentHeight = height + } + case .failure(_): + return + } + } + ) + } else { + Text("An error occurred while loading the banner.") + } + } + +} diff --git a/Examples/Swift/Sources/BannerUI/FullScreenBannerViewController.swift b/Examples/Swift/Sources/BannerUI/FullScreenBannerViewController.swift new file mode 100644 index 0000000000..a366aae0d5 --- /dev/null +++ b/Examples/Swift/Sources/BannerUI/FullScreenBannerViewController.swift @@ -0,0 +1,78 @@ +import BrazeUI +import UIKit + +final class FullScreenBannerViewController: UIViewController { + + static let bannerPlacementID = "sdk-test-1" + + var hasBannerForPlacement: Bool = false { + didSet { + self.bannerView.isHidden = !hasBannerForPlacement + self.errorView.isHidden = hasBannerForPlacement + } + } + + lazy var bannerView: BrazeBannerUI.BannerUIView = { + var bannerView = BrazeBannerUI.BannerUIView( + placementId: FullScreenBannerViewController.bannerPlacementID, + braze: AppDelegate.braze!, + processContentUpdates: { [weak self] result in + // Update layout properties when banner content has finished loading. + DispatchQueue.main.async { + guard let self else { return } + + switch result { + case .success(_): + self.hasBannerForPlacement = true + case .failure(_): + self.hasBannerForPlacement = false + } + } + } + ) + + bannerView.translatesAutoresizingMaskIntoConstraints = false + bannerView.isHidden = true + + return bannerView + }() + + lazy var errorView: UILabel = { + let errorView = UILabel() + errorView.text = "An error occurred while loading the banner." + errorView.textAlignment = .center + errorView.translatesAutoresizingMaskIntoConstraints = false + errorView.isHidden = true + return errorView + }() + + override func loadView() { + super.loadView() + + view.backgroundColor = .white + } + + override func viewDidLoad() { + super.viewDidLoad() + + self.view.addSubview(bannerView) + self.view.addSubview(errorView) + + NSLayoutConstraint.activate([ + bannerView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor), + bannerView.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor), + bannerView.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor), + bannerView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor), + + errorView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor), + errorView.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor), + errorView.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor), + errorView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor), + ]) + + AppDelegate.braze?.banners.getBanner(for: FullScreenBannerViewController.bannerPlacementID) { + [weak self] banner in + self?.hasBannerForPlacement = banner != nil + } + } +} diff --git a/Examples/Swift/Sources/BannerUI/Readme.swift b/Examples/Swift/Sources/BannerUI/Readme.swift new file mode 100644 index 0000000000..d2ffe20a58 --- /dev/null +++ b/Examples/Swift/Sources/BannerUI/Readme.swift @@ -0,0 +1,57 @@ +import BrazeKit +import UIKit + +let readme = + """ + This sample demonstrates how to use the Braze provided Banner UI: + + - AppDelegate.swift: + - Requesting Banners refresh + - Banner UI presentation + """ + +@MainActor +let actions: [(String, String, @MainActor (ReadmeViewController) -> Void)] = [ + ( + "Display a full-screen banner using UIKit", + "", + fullScreenBannerUIKit + ), + ( + "Display a full-screen banner using SwiftUI", + "", + fullScreenBannerSwiftUI + ), + ( + "Display a wide banner using UIKit", + "", + wideBannerUIKit + ), + ( + "Display a wide banner using SwiftUI", + "", + wideBannerSwiftUI + ), +] + +// MARK: - Internal + +@MainActor +func fullScreenBannerUIKit(_ viewController: ReadmeViewController) { + (UIApplication.shared.delegate as? AppDelegate)?.displayFullScreenBanner(framework: .uiKit) +} + +@MainActor +func fullScreenBannerSwiftUI(_ viewController: ReadmeViewController) { + (UIApplication.shared.delegate as? AppDelegate)?.displayFullScreenBanner(framework: .swiftUI) +} + +@MainActor +func wideBannerUIKit(_ viewController: ReadmeViewController) { + (UIApplication.shared.delegate as? AppDelegate)?.displayWideBanner(framework: .uiKit) +} + +@MainActor +func wideBannerSwiftUI(_ viewController: ReadmeViewController) { + (UIApplication.shared.delegate as? AppDelegate)?.displayWideBanner(framework: .swiftUI) +} diff --git a/Examples/Swift/Sources/BannerUI/WideBannerView.swift b/Examples/Swift/Sources/BannerUI/WideBannerView.swift new file mode 100644 index 0000000000..8ebc3ece10 --- /dev/null +++ b/Examples/Swift/Sources/BannerUI/WideBannerView.swift @@ -0,0 +1,45 @@ +import BrazeKit +import BrazeUI +import SwiftUI + +@available(iOS 13.0, *) +struct WideBannerView: View { + + static let bannerPlacementID = "sdk-test-2" + + @State var hasBannerForPlacement: Bool = false + @State var contentHeight: CGFloat = 0 + + var body: some View { + VStack { + Text("Your Content Here") + .frame(maxWidth: .infinity, maxHeight: .infinity) + if let braze = AppDelegate.braze, + hasBannerForPlacement + { + BrazeBannerUI.BannerView( + placementId: WideBannerView.bannerPlacementID, + braze: braze, + processContentUpdates: { result in + switch result { + case .success(let updates): + if let height = updates.height { + self.contentHeight = height + } + case .failure(_): + return + } + } + ) + .frame(height: min(contentHeight, 80)) + } + }.onAppear { + AppDelegate.braze?.banners.getBanner( + for: WideBannerView.bannerPlacementID, + { banner in + hasBannerForPlacement = banner != nil + } + ) + } + } +} diff --git a/Examples/Swift/Sources/BannerUI/WideBannerViewController.swift b/Examples/Swift/Sources/BannerUI/WideBannerViewController.swift new file mode 100644 index 0000000000..0b2ae417c7 --- /dev/null +++ b/Examples/Swift/Sources/BannerUI/WideBannerViewController.swift @@ -0,0 +1,74 @@ +import BrazeUI +import UIKit + +final class WideBannerViewController: UIViewController { + + static let bannerPlacementID = "sdk-test-2" + + var bannerHeightConstraint: NSLayoutConstraint? + + lazy var contentView: UILabel = { + let contentView = UILabel() + contentView.text = "Your Content Here" + contentView.textAlignment = .center + contentView.translatesAutoresizingMaskIntoConstraints = false + return contentView + }() + + lazy var bannerView: BrazeBannerUI.BannerUIView = { + var bannerView = BrazeBannerUI.BannerUIView( + placementId: WideBannerViewController.bannerPlacementID, + braze: AppDelegate.braze!, + processContentUpdates: { [weak self] result in + // Update layout properties when banner content has finished loading. + DispatchQueue.main.async { + guard let self else { return } + + switch result { + case .success(let updates): + if let height = updates.height { + self.bannerView.isHidden = false + self.bannerHeightConstraint?.constant = min(height, 80) + } + case .failure(let error): + return + } + } + } + ) + + bannerView.translatesAutoresizingMaskIntoConstraints = false + bannerView.isHidden = true + + return bannerView + }() + + override func loadView() { + super.loadView() + + view.backgroundColor = .white + } + + override func viewDidLoad() { + super.viewDidLoad() + + self.view.addSubview(contentView) + self.view.addSubview(bannerView) + + bannerHeightConstraint = bannerView.heightAnchor.constraint(equalToConstant: 0) + + NSLayoutConstraint.activate([ + contentView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor), + contentView.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor), + contentView.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor), + + bannerView.topAnchor.constraint(equalTo: self.contentView.bottomAnchor), + + bannerView.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor), + bannerView.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor), + bannerView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor), + + bannerHeightConstraint!, + ]) + } +} diff --git a/Examples/Swift/manual-integration-setup.sh b/Examples/Swift/manual-integration-setup.sh index 767aa4a848..186d21cb37 100755 --- a/Examples/Swift/manual-integration-setup.sh +++ b/Examples/Swift/manual-integration-setup.sh @@ -20,7 +20,7 @@ if [ ! -f "manual-integration-setup.sh" ]; then fi # Constants -url="https://github.com/braze-inc/braze-swift-sdk/releases/download/11.2.0/braze-swift-sdk-prebuilt.zip" +url="https://github.com/braze-inc/braze-swift-sdk/releases/download/11.3.0/braze-swift-sdk-prebuilt.zip" echo "→" "Cleaning up" rm -rf braze-swift-sdk-prebuilt diff --git a/Package.swift b/Package.swift index 386d45d4a7..f2ef2cbdc7 100644 --- a/Package.swift +++ b/Package.swift @@ -49,8 +49,8 @@ let package = Package( targets: [ .binaryTarget( name: "BrazeKit", - url: "https://github.com/braze-inc/braze-swift-sdk/releases/download/11.2.0/BrazeKit.zip", - checksum: "a0158a907dadd39b1fcb7344d9f0531e58ef72433fd7f4c04c7412291d790870" + url: "https://github.com/braze-inc/braze-swift-sdk/releases/download/11.3.0/BrazeKit.zip", + checksum: "0a2cdaef910c1154f1cd62c47db782dd7b66e2f0e9a8cdb9745f2516bbc7b707" ), .target( name: "BrazeKitResources", @@ -67,8 +67,8 @@ let package = Package( ), .binaryTarget( name: "BrazeLocation", - url: "https://github.com/braze-inc/braze-swift-sdk/releases/download/11.2.0/BrazeLocation.zip", - checksum: "c7f7c9dfc721efd2df26e2566e4a1687750b251fea18432d38d51577b8afd76b" + url: "https://github.com/braze-inc/braze-swift-sdk/releases/download/11.3.0/BrazeLocation.zip", + checksum: "ca6f518ca8017d11584c0897a701f52f20620b508208d6da68447d4e40a38ffa" ), .target( name: "BrazeLocationResources", @@ -78,13 +78,13 @@ let package = Package( ), .binaryTarget( name: "BrazeNotificationService", - url: "https://github.com/braze-inc/braze-swift-sdk/releases/download/11.2.0/BrazeNotificationService.zip", - checksum: "3b3c3de36795e43b5e87b4465da929226149ca1885e0a358b753f027af99af22" + url: "https://github.com/braze-inc/braze-swift-sdk/releases/download/11.3.0/BrazeNotificationService.zip", + checksum: "491f300cd9d69e00050b0480dd096a9fac742cebbf2f024fc0b5535a88e8d19c" ), .binaryTarget( name: "BrazePushStory", - url: "https://github.com/braze-inc/braze-swift-sdk/releases/download/11.2.0/BrazePushStory.zip", - checksum: "8a06ac8bff6e8dd9a715a4fe65bb04dce9d44be38ad7cab02c8c2ed34134948e" + url: "https://github.com/braze-inc/braze-swift-sdk/releases/download/11.3.0/BrazePushStory.zip", + checksum: "13ad2cee5f3ae70ee581f257b64dae0010c849370004a979cbe2d7b3b481efda" ), .target( name: "BrazePushStoryResources", diff --git a/README.md b/README.md index 3caddaf9d6..317605e4f5 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@

- Version: 11.2.0 + Version: 11.3.0 ) -> Void)? + + var webView: WKWebView? + var banner: Braze.Banner? + + public lazy var scriptMessageHandler: Braze.WebViewBridge.ScriptMessageHandler = + webViewScriptMessageHandler() + public lazy var schemeHandler: Braze.WebViewBridge.SchemeHandler = webViewSchemeHandler() + public var queryHandler: Braze.WebViewBridge.QueryHandler { + get { + queryHandlerWrapper.wrappedValue + } + set { + queryHandlerWrapper.wrappedValue = newValue + } + } + + /// Wrapper for the `QueryHandler` object. + /// + /// Structs from `BrazeKit` cannot generate a proper Objective-C metaclass and will cause a crash if subclassed. + lazy var queryHandlerWrapper: StructWrapper = .init( + wrappedValue: webViewQueryHandler()) + + /// Initializes and registers a Braze banner view. + /// + /// - Parameter placementId: The placement ID of the banner. + /// - Parameter braze: The Braze instance. + /// - Parameter processContentUpdates: A closure that provides the updated properties of the banner view after content has finished rendering. + public init( + placementId: String, + braze: Braze, + processContentUpdates: ( + @MainActor (Result) -> Void + )? = nil + ) { + self.placementId = placementId + self.braze = braze + self.processContentUpdates = processContentUpdates + self.impressionTracker = .shared + + super.init(frame: .zero) + + setupWebView() + braze.banners.registerView(self) + impressionTracker.startSessionTracking(with: braze) + } + + /// Internal default initializer without auto-registration. + init( + placementId: String, + braze: Braze, + processContentUpdates: ( + @MainActor (Result) -> Void + )? = nil, + impressionTracker: BrazeBannerUI.BannersImpressionTracker + ) { + self.placementId = placementId + self.braze = braze + self.processContentUpdates = processContentUpdates + self.impressionTracker = impressionTracker + + super.init(frame: .zero) + setupWebView() + } + + deinit { + // Cleanup userContentController because: + // - It strongly retains its scripts and script message handlers + // - It seems to outlive the configuration / web view instance + // - Manual cleanup here ensure proper deallocation of those objects + isolatedMainActorDeinit { [webView] in + let userContentController = webView?.configuration.userContentController + userContentController?.removeAllUserScripts() + userContentController?.removeScriptMessageHandler( + forName: Braze.WebViewBridge.ScriptMessageHandler.name + ) + } + } + + open func setupWebView() { + let configuration = WKWebViewConfiguration.forBrazeBridge( + scriptMessageHandler: scriptMessageHandler) + let webView = WKWebView(frame: .zero, configuration: configuration) + webView.navigationDelegate = self + webView.clipsToBounds = true + self.webView = webView + self.addSubview(webView) + + webView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + webView.topAnchor.constraint(equalTo: self.topAnchor), + webView.leadingAnchor.constraint(equalTo: self.leadingAnchor), + webView.trailingAnchor.constraint(equalTo: self.trailingAnchor), + webView.bottomAnchor.constraint(equalTo: self.bottomAnchor), + ]) + } + + required public init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + /// Renders the banner content into the view if there are updates. + /// + /// - Parameter banner: The Braze banner model. + open func render(with banner: Braze.Banner) { + if self.banner != banner { + self.banner = banner + DispatchQueue.main.async { [weak self] in + self?.webView?.loadHTMLString(banner.html, baseURL: nil) + } + } + } + + /// Processes errors encountered during loading. + /// + /// - Parameter error: The error object. + open func notifyError(_ error: Swift.Error) { + if let brazeError = error as? BrazeBannerUI.Error { + logError(brazeError) + } + self.processContentUpdates?(.failure(error)) + } + + /// Logs an error related to the banner. + /// + /// - Parameter error: The banner UI error. + open func logError(_ error: BrazeBannerUI.Error) { + banner?.context?.logError(error) + ?? print("[BrazeUI]", error.flattened) + } + + open func processNavigationAction(_ navigationAction: WKNavigationAction) { + guard let url = navigationAction.request.url else { return } + + if let action = schemeHandler.action(url: url) { + schemeHandler.process(action: action, url: url) + return + } + + let clickAction = queryHandler.processBannerURL(url) + process(clickAction: clickAction) + } + + public func process( + clickAction: Braze.Banner.ClickAction, + target: Any? = nil + ) { + guard let context = banner?.context else { + logError(.noContextProcessClickAction) + return + } + + context.processClickAction(clickAction, target: target) + } + + } + +} + +// MARK: - Public Initializers + +extension BrazeBannerUI.BannerUIView { + + /// Initializes and registers a Braze banner view. + /// + /// - Parameter placementId: The placement ID of the banner. + /// - Parameter braze: The Braze instance. + /// - Parameter processContentUpdates: A closure that provides the updated properties of the banner view after content has finished rendering. + @objc + @available(swift, obsoleted: 0.0.1) + public convenience init( + placementId: String, + braze: Braze, + processContentUpdates: ((BrazeBannerUI.ContentUpdates?, Error?) -> Void)? = nil + ) { + var resultClosure: ((Result) -> Void)? + if let processContentUpdates { + resultClosure = { result in + switch result { + case .success(let updates): + processContentUpdates(updates, nil) + case .failure(let error): + processContentUpdates(nil, error) + } + } + } + self.init( + placementId: placementId, + braze: braze, + processContentUpdates: resultClosure + ) + } + +} + +// MARK: - WKNavigationDelegate + +extension BrazeBannerUI.BannerUIView: WKNavigationDelegate { + + /// This method triggers when the `WKWebView` finishes loading the content. + /// + /// Note that web views don't start loading until the user has scrolled to it. + open func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { + // Drag and drop interaction handler does not exist until the message is loaded. + webView.disableDragAndDrop() + // Disable selection by inserting CSS + webView.disableSelection() + + DispatchQueue.main.async { [weak self] in + webView.evaluateJavaScript("document.readyState") { (complete, error) in + if let error { + self?.processContentUpdates?(.failure(error)) + } else if complete != nil { + webView.evaluateJavaScript("document.documentElement.scrollHeight") { (height, error) in + guard let self else { return } + + if let error { + self.processContentUpdates?(.failure(error)) + } else { + // Start tracking the view after it has successfully loaded. + self.impressionTracker.trackView(self) + + if let height = height as? Double, height > 0 { + self.processContentUpdates?( + .success(.init(height: height)) + ) + } else { + self.processContentUpdates?( + .failure(BrazeBannerUI.Error.bannerHeightUnavailable) + ) + } + } + } + } + } + } + } + + public func webView( + _ webView: WKWebView, + decidePolicyFor navigationAction: WKNavigationAction, + decisionHandler: @escaping (WKNavigationActionPolicy) -> Void + ) { + if shouldProcessNavigationAction(navigationAction) { + decisionHandler(.cancel) + processNavigationAction(navigationAction) + } else { + decisionHandler(.allow) + } + } + + public func webView( + _ webView: WKWebView, + didFail navigation: WKNavigation!, + withError error: Error + ) { + notifyError( + BrazeBannerUI.Error.webViewNavigation(.init(error)) + ) + } + +} + +// MARK: - Impression Logging + +@objc +extension BrazeBannerUI.BannerUIView { + + /// Logs an impression for the banner. + open func logImpression() { + guard let context = banner?.context else { + logError(BrazeBannerUI.Error.noContextLogImpression) + return + } + context.logImpression() + } + + /// Logs a click for the banner. + /// + /// - Parameter buttonId: The optional button identifier. + open func logClick(buttonId: String?) { + guard let context = banner?.context else { + logError(BrazeBannerUI.Error.noContextLogClick) + return + } + context.logClick(buttonId: buttonId) + } + + /// Determines if the banner view is currently visible and not occluded. + /// + /// - Returns: Whether the banner is currently in view. + open func isCurrentlyVisible() -> Bool { + guard let window = self.window, !self.isHidden else { + return false + } + + // Iteratively check if any superviews are hidden. + var superview = self.superview + while let view = superview { + if view.isHidden { + return false + } + superview = view.superview + } + + let viewFrame = self.convert(self.bounds, to: window) + let intersection = viewFrame.intersection(window.bounds) + if intersection.isNull { + return false + } + + return window.bounds.intersects(viewFrame) + } + +} diff --git a/Sources/BrazeUI/BannerUI/BannerView.swift b/Sources/BrazeUI/BannerUI/BannerView.swift new file mode 100644 index 0000000000..9fda45cdb0 --- /dev/null +++ b/Sources/BrazeUI/BannerUI/BannerView.swift @@ -0,0 +1,117 @@ +// Disable SwiftUI features for: +// - `arch(arm)` (armv7 - 32 bit arm) +// - `arch(i386)` (32 bit intel simlulator) +// Those architectures do not ship with SwiftUI symbols +// See: https://archive.ph/eMbWT (FB7431741) +#if canImport(SwiftUI) && !arch(arm) && !arch(i386) + + import BrazeKit + import SwiftUI + import WebKit + + extension BrazeBannerUI { + + /// A SwiftUI-compatible version of the Braze banner view. + @MainActor + @available(iOS 13.0, *) + public struct BannerView: UIViewRepresentable { + + let placementId: String + let braze: Braze + let processContentUpdates: ((Result) -> Void)? + + /// Internal state property to trigger `updateUIView` whenever new banners are received from the platform. + @State var banner: Braze.Banner? = nil + + /// Internal state property to trigger `updateUIView` whenever banners are refreshed with an error. + @State var error: Swift.Error? = nil + + /// Initializes a SwiftUI-compatible version of the Braze Banner view. + /// + /// - Parameter placementId: The placement ID for the banner. + /// - Parameter braze: The Braze instance. + /// - Parameter processContentUpdates: A closure that provides updated properties. + public init( + placementId: String, + braze: Braze, + processContentUpdates: ((Result) -> Void)? = nil + ) { + self.placementId = placementId + self.braze = braze + self.processContentUpdates = processContentUpdates + } + + public func makeUIView(context: Context) -> BannerUIView { + BannerUIView( + placementId: self.placementId, + braze: self.braze, + processContentUpdates: self.processContentUpdates, + impressionTracker: .shared + ) + } + + public func updateUIView(_ uiView: BannerUIView, context: Context) { + if let banner { + uiView.render(with: banner) + } else if let error { + uiView.notifyError(error) + } + } + + } + + } + + // MARK: - Coordinator + + @available(iOS 13.0, *) + extension BrazeBannerUI.BannerView { + + // Since SwiftUI views are structs, neither they nor their underlying UIViews are retained in memory. + // The coordinator is the only reference that persists throughout the view lifecycle. + // We implement it as the `BrazeBannerPlacement` to receive updates from the platform. + @MainActor + public class Coordinator: NSObject, BrazeBannerPlacement { + + public let placementId: String + let impressionTracker: BrazeBannerUI.BannersImpressionTracker + + var didReceiveUpdate: (Result) -> Void + + init( + placementId: String, + didReceiveUpdate: @escaping (Result) -> Void, + impressionTracker: BrazeBannerUI.BannersImpressionTracker = .shared + ) { + self.placementId = placementId + self.didReceiveUpdate = didReceiveUpdate + self.impressionTracker = impressionTracker + } + + public func render(with banner: BrazeKit.Braze.Banner) { + didReceiveUpdate(.success(banner)) + } + + public func notifyError(_ error: Error) { + didReceiveUpdate(.failure(error)) + } + + } + + public func makeCoordinator() -> Coordinator { + let coordinator = Coordinator(placementId: self.placementId) { result in + switch result { + case .success(let banner): + self.banner = banner + case .failure(let error): + self.error = error + } + } + self.braze.banners.registerView(coordinator) + coordinator.impressionTracker.startSessionTracking(with: braze) + return coordinator + } + + } + +#endif diff --git a/Sources/BrazeUI/BannerUI/BannerViewWebKitExt.swift b/Sources/BrazeUI/BannerUI/BannerViewWebKitExt.swift new file mode 100644 index 0000000000..017fb903c2 --- /dev/null +++ b/Sources/BrazeUI/BannerUI/BannerViewWebKitExt.swift @@ -0,0 +1,46 @@ +import BrazeKit +import WebKit + +extension BrazeBannerUI.BannerUIView { + + /// Creates and returns a script message handler implementing the Braze JavaScript bridge API. + public func webViewScriptMessageHandler() -> Braze.WebViewBridge.ScriptMessageHandler { + .init( + channel: .banner, + logClick: { [weak self] in + self?.logClick(buttonId: $0) + }, + logError: { [weak self] in self?.logError(.webViewScript($0)) }, + showNewsFeed: { [weak self] in self?.process(clickAction: .newsFeed) }, + closeMessage: { [weak self] in + self?.logError(.webViewFeatureNotAvailable) + }, + braze: self.braze + ) + } + + /// Creates and returns a custom scheme handler implementing the logic for scheme-based actions. + public func webViewSchemeHandler() -> Braze.WebViewBridge.SchemeHandler { + .init( + channel: .banner, + logError: { [weak self] in self?.logError(.webViewScheme($0)) }, + showNewsFeed: { [weak self] in self?.process(clickAction: .newsFeed) }, + closeMessage: { [weak self] in + self?.logError(.webViewFeatureNotAvailable) + }, + queryHandler: queryHandler, + braze: self.braze + ) + } + + /// Creates and returns an url query handler implementing the logic for query-based actions. + public func webViewQueryHandler() -> Braze.WebViewBridge.QueryHandler { + .init( + logClick: { [weak self] in + self?.logClick(buttonId: $0) + }, + logError: { [weak self] in self?.logError(.webViewQuery($0)) } + ) + } + +} diff --git a/Sources/BrazeUI/BannerUI/BannersImpressionTracker.swift b/Sources/BrazeUI/BannerUI/BannersImpressionTracker.swift new file mode 100644 index 0000000000..ada8739969 --- /dev/null +++ b/Sources/BrazeUI/BannerUI/BannersImpressionTracker.swift @@ -0,0 +1,152 @@ +import BrazeKit +import Foundation + +extension BrazeBannerUI.BannersImpressionTracker { + + /// The shared impression tracker for banners. + static let shared = BrazeBannerUI.BannersImpressionTracker() + +} + +// MARK: - Banners Impression Tracker + +extension BrazeBannerUI { + + /// The default implementation of impression tracking for Braze banners. + @MainActor + open class BannersImpressionTracker { + + public var visibilityTracker: VisibilityTracker? { + get { lock.sync { _visibilityTracker } } + set { lock.sync { _visibilityTracker = newValue } } + } + private var _visibilityTracker: VisibilityTracker? + + /// Whether the impression tracker is currently running. + var isCurrentlyTracking: Bool { + get { lock.sync { _isCurrentlyTracking } } + set { lock.sync { _isCurrentlyTracking = newValue } } + } + private var _isCurrentlyTracking: Bool = false + + /// Banner views currently tracked for impression logging. + /// + /// Banner views are tracked and managed with their banner IDs (tracking string). + var trackedBanners: NSMapTable { + get { lock.sync { _trackedBanners } } + set { lock.sync { _trackedBanners = newValue } } + } + private var _trackedBanners: NSMapTable = .init( + keyOptions: .copyIn, + valueOptions: .weakMemory + ) + + // Session + + /// The Braze cancellable watching the current session. + var sessionSubscriber: Braze.Cancellable? { + get { lock.sync { _sessionSubscriber } } + set { lock.sync { _sessionSubscriber = newValue } } + } + private var _sessionSubscriber: Braze.Cancellable? + + /// The banner IDs that have been viewed this session. + var viewedInSessionBanners: Set { + get { lock.sync { _viewedInSessionBanners } } + set { lock.sync { _viewedInSessionBanners = newValue } } + } + private var _viewedInSessionBanners: Set = [] + + /// The lock guarding the properties. + private let lock = NSRecursiveLock() + + /// Starts observing session updates to reset banner impressions. + /// + /// - Parameter braze: The Braze instance. + public func startSessionTracking(with braze: Braze) { + sessionSubscriber = braze.subscribeToSessionUpdates { [weak self] event in + guard let self else { return } + + switch event { + case .started: + self.startVisibilityTracking() + case .ended: + self.viewedInSessionBanners = [] + self.stopVisibilityTracking() + @unknown default: + break + } + } + } + + /// Register a Banner view for visibility tracking. + /// + /// - Parameter view: The Braze banner view. + public func trackView(_ view: BrazeBannerUI.BannerUIView) { + guard let bannerId = view.banner?.id, + !viewedInSessionBanners.contains(bannerId) + else { return } + + trackedBanners.setObject(view, forKey: bannerId as NSString) + startVisibilityTracking() + } + + /// Starts visibility and session tracking if tracking is not already running. + func startVisibilityTracking() { + guard !isCurrentlyTracking else { return } + + isCurrentlyTracking = true + visibilityTracker = VisibilityTracker( + interval: 0.1, + visibleIdentifiers: bannerIdentifiers, + visibleForInterval: logBannerImpression + ) + visibilityTracker?.start() + } + + /// Stops visibility and session tracking. + /// + /// Aim to minimize operations whenever there are no longer any banners eligible for tracking. + func stopVisibilityTracking() { + guard isCurrentlyTracking else { return } + + isCurrentlyTracking = false + visibilityTracker?.stop() + visibilityTracker = nil + } + } + +} + +// MARK: - VisibilityTracker methods + +extension BrazeBannerUI.BannersImpressionTracker { + + func bannerIdentifiers() -> [String] { + return trackedBanners.keyEnumerator().allObjects.compactMap { key in + guard let nsStringKey = key as? NSString, + let view = trackedBanners.object(forKey: nsStringKey) + else { + return nil + } + return view.isCurrentlyVisible() ? nsStringKey as String : nil + } + } + + func logBannerImpression(bannerId: String) { + guard let bannerView = trackedBanners.object(forKey: bannerId as NSString), + let actualBannerId = bannerView.banner?.id, + !viewedInSessionBanners.contains(actualBannerId) + else { return } + + bannerView.logImpression() + viewedInSessionBanners.insert(actualBannerId) + + // All banners that were visible are already tracked + let allKeys = trackedBanners.keyEnumerator().allObjects.compactMap { $0 as? String } + if viewedInSessionBanners.elementsEqual(allKeys) { + stopVisibilityTracking() + } + } + +} diff --git a/Sources/BrazeUI/Dependencies/StructWrapper.swift b/Sources/BrazeUI/Dependencies/StructWrapper.swift new file mode 100644 index 0000000000..8e58c4e51c --- /dev/null +++ b/Sources/BrazeUI/Dependencies/StructWrapper.swift @@ -0,0 +1,14 @@ +/// Wrapper class to contain the corresponding `BrazeKit` struct. +/// +/// Various BrazeUI types are represented as structs and imported from BrazeKit. +/// This wrapper acts as a workaround to prevent Objective-C metaclass errors. +class StructWrapper { + var wrappedValue: WrappedType + + /// Initializes the wrapper with the wrapped struct. + /// + /// - Parameter wrappedValue: The wrapped struct type. + init(wrappedValue: WrappedType) { + self.wrappedValue = wrappedValue + } +} diff --git a/Sources/BrazeUI/Dependencies/WKWebViewExt.swift b/Sources/BrazeUI/Dependencies/WKWebViewExt.swift new file mode 100644 index 0000000000..0829f877b0 --- /dev/null +++ b/Sources/BrazeUI/Dependencies/WKWebViewExt.swift @@ -0,0 +1,75 @@ +import BrazeKit +import WebKit + +extension WKWebViewConfiguration { + + /// Returns a web view configuration equipped with Braze bridge scripting. + /// + /// - Parameter scriptMessageHandler: The script handler for executing bridge API methods. + static func forBrazeBridge(scriptMessageHandler: WKScriptMessageHandler) -> WKWebViewConfiguration + { + let configuration = WKWebViewConfiguration() + configuration.suppressesIncrementalRendering = true + configuration.allowsInlineMediaPlayback = true + + typealias ScriptMessageHandler = Braze.WebViewBridge.ScriptMessageHandler + configuration.userContentController.addUserScript(ScriptMessageHandler.script) + configuration.userContentController.add( + scriptMessageHandler, + name: ScriptMessageHandler.name + ) + + return configuration + } + +} + +extension WKNavigationDelegate { + + /// Validates if a navigation action should occur from a web view context. + func shouldProcessNavigationAction(_ navigationAction: WKNavigationAction) -> Bool { + let isIframeLoad = + navigationAction.targetFrame != nil + && navigationAction.sourceFrame != navigationAction.targetFrame + let isIframeNavigation = navigationAction.targetFrame?.isMainFrame == false + + if let url = navigationAction.request.url { + return !url.isFileURL && !isIframeLoad && !isIframeNavigation + } + + return false + } + +} + +extension WKWebView { + + func disableDragAndDrop() { + bfsSubviews + .lazy + .first { $0.interactions.contains(where: { $0 is UIDragInteraction }) }? + .interactions + .filter { $0 is UIDragInteraction } + .forEach { $0.view?.removeInteraction($0) } + } + + func disableSelection() { + evaluateJavaScript( + """ + const css = `* { + -webkit-touch-callout: none; + -webkit-user-select: none; + } + input, textarea { + -webkit-touch-callout: initial !important; + -webkit-user-select: initial !important; + }` + var style = document.createElement('style') + style.type = 'text/css' + style.appendChild(document.createTextNode(css)) + head.appendChild(style) + """ + ) + } + +} diff --git a/Sources/BrazeUI/InAppMessageUI/InAppMessageUI.swift b/Sources/BrazeUI/InAppMessageUI/InAppMessageUI.swift index 7af568c275..cdc8e49d83 100644 --- a/Sources/BrazeUI/InAppMessageUI/InAppMessageUI.swift +++ b/Sources/BrazeUI/InAppMessageUI/InAppMessageUI.swift @@ -8,7 +8,7 @@ import UIKit /// in-app messages to the user. /// /// To add GIF support to the in-app message UI components, set a valid -/// ``gifViewProvider-swift.var``. +/// ``GIFViewProvider-swift.struct/shared``. @objc(BrazeInAppMessageUI) @MainActor open class BrazeInAppMessageUI: diff --git a/Sources/BrazeUI/InAppMessageUI/InAppMessageUIExt.swift b/Sources/BrazeUI/InAppMessageUI/InAppMessageUIExt.swift index d19164779b..3c3496028c 100644 --- a/Sources/BrazeUI/InAppMessageUI/InAppMessageUIExt.swift +++ b/Sources/BrazeUI/InAppMessageUI/InAppMessageUIExt.swift @@ -93,22 +93,3 @@ extension BrazeInAppMessageUI { } } - -extension BrazeInAppMessageUI { - - /// Wrapper class to contain the corresponding `BrazeKit` struct. - /// - /// InAppMessage types are represented as structs and imported from BrazeKit. - /// This wrapper acts as a workaround to prevent Objective-C metaclass errors. - final class MessageWrapper { - var wrappedValue: WrappedType - - /// Initializes the wrapper with the wrapped struct. - /// - /// - Parameter wrappedValue: The wrapped struct type. - init(wrappedValue: WrappedType) { - self.wrappedValue = wrappedValue - } - } - -} diff --git a/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIControlView.swift b/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIControlView.swift index ef07e2966e..e3c7be759d 100644 --- a/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIControlView.swift +++ b/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIControlView.swift @@ -17,7 +17,7 @@ extension BrazeInAppMessageUI { } /// Internal wrapper for the control in-app message. - let messageWrapper: MessageWrapper + let messageWrapper: StructWrapper /// Creates and returns a control in-app message view. /// - Parameter message: The message. diff --git a/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIHtmlView.swift b/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIHtmlView.swift index 292f685745..08a0a12c2e 100644 --- a/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIHtmlView.swift +++ b/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIHtmlView.swift @@ -18,7 +18,7 @@ extension BrazeInAppMessageUI { } /// Internal wrapper for the html in-app message. - let messageWrapper: MessageWrapper + let messageWrapper: StructWrapper // MARK: - Attributes @@ -145,7 +145,7 @@ extension BrazeInAppMessageUI { } } - lazy var queryHandlerWrapper: MessageWrapper = .init( + lazy var queryHandlerWrapper: StructWrapper = .init( wrappedValue: webViewQueryHandler()) // MARK: - LifeCycle @@ -295,18 +295,12 @@ extension BrazeInAppMessageUI { open func setupWebView() { // Configuration - let configuration = WKWebViewConfiguration() - configuration.suppressesIncrementalRendering = true - configuration.allowsInlineMediaPlayback = true + let configuration = WKWebViewConfiguration.forBrazeBridge( + scriptMessageHandler: scriptMessageHandler) // - Customization attributes.configure?(configuration) - // - Script message handler - typealias ScriptMessageHandler = Braze.WebViewBridge.ScriptMessageHandler - configuration.userContentController.addUserScript(ScriptMessageHandler.script) - configuration.userContentController.add(scriptMessageHandler, name: ScriptMessageHandler.name) - // WebView let webView = WKWebView(frame: .zero, configuration: configuration) webView.uiDelegate = self @@ -368,8 +362,8 @@ extension BrazeInAppMessageUI { return } - let (clickAction, buttonId) = queryHandler.process( - url: url, + let (clickAction, buttonId) = queryHandler.processInAppMessageURL( + url, logBodyClick: message.legacy || attributes.automaticBodyClicks ) @@ -401,23 +395,15 @@ extension BrazeInAppMessageUI.HtmlView: WKNavigationDelegate { decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void ) { - let isIframeLoad = - navigationAction.targetFrame != nil - && navigationAction.sourceFrame != navigationAction.targetFrame - let isIframeNavigation = navigationAction.targetFrame?.isMainFrame == false - - guard let url = navigationAction.request.url, - url.isFileURL == false, - isIframeLoad == false, - isIframeNavigation == false - else { + if shouldProcessNavigationAction(navigationAction) { + decisionHandler(.cancel) + processNavigationAction( + navigationAction, + isTransientOpen: navigationAction.isTransientOpen + ) + } else { decisionHandler(.allow) - return } - - decisionHandler(.cancel) - - processNavigationAction(navigationAction, isTransientOpen: navigationAction.isTransientOpen) } public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { @@ -542,38 +528,6 @@ extension BrazeInAppMessageUI.HtmlView { } -extension WKWebView { - - fileprivate func disableDragAndDrop() { - bfsSubviews - .lazy - .first { $0.interactions.contains(where: { $0 is UIDragInteraction }) }? - .interactions - .filter { $0 is UIDragInteraction } - .forEach { $0.view?.removeInteraction($0) } - } - - fileprivate func disableSelection() { - evaluateJavaScript( - """ - const css = `* { - -webkit-touch-callout: none; - -webkit-user-select: none; - } - input, textarea { - -webkit-touch-callout: initial !important; - -webkit-user-select: initial !important; - }` - var style = document.createElement('style') - style.type = 'text/css' - style.appendChild(document.createTextNode(css)) - head.appendChild(style) - """ - ) - } - -} - extension WKNavigationAction { /// Returns whether the navigation action is considered _transient_. diff --git a/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIModalImageView.swift b/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIModalImageView.swift index 3a5419a97d..e45a3e8719 100644 --- a/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIModalImageView.swift +++ b/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIModalImageView.swift @@ -17,7 +17,7 @@ extension BrazeInAppMessageUI { } /// Internal wrapper for the modal image in-app message. - let messageWrapper: MessageWrapper + let messageWrapper: StructWrapper // MARK: - Attributes diff --git a/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIModalView.swift b/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIModalView.swift index a9f0989628..7f53dba404 100644 --- a/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIModalView.swift +++ b/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUIModalView.swift @@ -28,7 +28,7 @@ extension BrazeInAppMessageUI { } /// Internal wrapper for the modal in-app message. - let messageWrapper: MessageWrapper + let messageWrapper: StructWrapper // MARK: - Attributes diff --git a/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUISlideupView.swift b/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUISlideupView.swift index e2cbaeb023..4d600651f2 100644 --- a/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUISlideupView.swift +++ b/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageUISlideupView.swift @@ -17,7 +17,7 @@ extension BrazeInAppMessageUI { } /// Internal wrapper for the slideup in-app message. - let messageWrapper: MessageWrapper + let messageWrapper: StructWrapper // MARK: - Attributes diff --git a/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageViewWebKitExt.swift b/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageViewWebKitExt.swift index b151f106cc..2471b36aa7 100644 --- a/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageViewWebKitExt.swift +++ b/Sources/BrazeUI/InAppMessageUI/Views/InAppMessageViewWebKitExt.swift @@ -23,6 +23,7 @@ extension InAppMessageView { let braze = controller?.message.context?.braze as? Braze return .init( + channel: .inAppMessage, logError: { [weak self] in self?.logError(.webViewScheme($0)) }, showNewsFeed: { [weak self] in self?.process(clickAction: .newsFeed, buttonId: nil) }, closeMessage: closeMessage, diff --git a/Sources/BrazeUI/InAppMessageUI/Views/Misc/ButtonView.swift b/Sources/BrazeUI/InAppMessageUI/Views/Misc/ButtonView.swift index 66e6449968..0351fee095 100644 --- a/Sources/BrazeUI/InAppMessageUI/Views/Misc/ButtonView.swift +++ b/Sources/BrazeUI/InAppMessageUI/Views/Misc/ButtonView.swift @@ -17,7 +17,7 @@ extension BrazeInAppMessageUI { } /// Internal wrapper for the in-app message button. - let buttonWrapper: MessageWrapper + let buttonWrapper: StructWrapper /// Creates and returns a Braze in-app message compatible button. /// - Parameters: diff --git a/Sources/BrazeUI/InAppMessageUI/Views/Misc/IconView.swift b/Sources/BrazeUI/InAppMessageUI/Views/Misc/IconView.swift index 1e6e4d45f5..f75157ec4c 100644 --- a/Sources/BrazeUI/InAppMessageUI/Views/Misc/IconView.swift +++ b/Sources/BrazeUI/InAppMessageUI/Views/Misc/IconView.swift @@ -120,7 +120,7 @@ extension BrazeInAppMessageUI { } /// Internal wrapper for the in-app message theme. - let themeWrapper: MessageWrapper + let themeWrapper: StructWrapper /// Apply the current ``theme`` to the view. ///