Showing preview only (2,047K chars total). Download the full file or copy to clipboard to get everything.
Repository: Appboy/appboy-ios-sdk
Branch: master
Commit: 2afdd54b1718
Files: 582
Total size: 1.8 MB
Directory structure:
gitextract_0k488zaf/
├── .github/
│ └── ISSUE_TEMPLATE/
│ ├── bug.yml
│ ├── config.yml
│ └── feature.yml
├── .gitignore
├── Appboy-Push-Story.podspec
├── Appboy-iOS-SDK.podspec
├── Appboy-tvOS-SDK/
│ └── AppboyTVOSKit.framework/
│ ├── AppboyTVOSKit
│ ├── Headers/
│ │ ├── ABKAttributionData.h
│ │ ├── ABKBannerCard.h
│ │ ├── ABKBannerContentCard.h
│ │ ├── ABKCaptionedImageCard.h
│ │ ├── ABKCaptionedImageContentCard.h
│ │ ├── ABKCard.h
│ │ ├── ABKClassicCard.h
│ │ ├── ABKClassicContentCard.h
│ │ ├── ABKContentCard.h
│ │ ├── ABKFacebookUser.h
│ │ ├── ABKFeedController.h
│ │ ├── ABKSdkAuthenticationDelegate.h
│ │ ├── ABKSdkAuthenticationError.h
│ │ ├── ABKSdkMetadata.h
│ │ ├── ABKTextAnnouncementCard.h
│ │ ├── ABKTwitterUser.h
│ │ ├── ABKUser.h
│ │ ├── Appboy.h
│ │ └── AppboyKit.h
│ ├── Info.plist
│ └── Modules/
│ └── module.modulemap
├── Appboy-tvOS-SDK.podspec
├── AppboyKit/
│ ├── ABKLocationManagerProvider.m
│ ├── ABKModalWebViewController.m
│ ├── ABKNoConnectionLocalization.m
│ ├── ABKSDWebImageProxy.m
│ ├── Appboy.bundle/
│ │ ├── Info.plist
│ │ ├── PrivacyInfo.xcprivacy
│ │ ├── ZipArchive_LICENSE.txt
│ │ ├── _CodeSignature/
│ │ │ ├── CodeDirectory
│ │ │ ├── CodeRequirements
│ │ │ ├── CodeRequirements-1
│ │ │ ├── CodeResources
│ │ │ └── CodeSignature
│ │ ├── appboy-spm-cleanup.sh
│ │ ├── ar.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── cs.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── da.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── de.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── en.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── es-419.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── es-MX.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── es.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── et.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── fi.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── fil.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── fr.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── he.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── hi.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── id.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── it.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── ja.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── km.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── ko.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── lo.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── ms.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── my.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── nb.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── nl.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── pl.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── pt-PT.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── pt.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── ru.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── sv.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── th.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── uk.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── vi.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── zh-HK.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── zh-Hans.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── zh-Hant.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ ├── zh-TW.lproj/
│ │ │ └── LocalizedAppboyUIString.strings
│ │ └── zh.lproj/
│ │ └── LocalizedAppboyUIString.strings
│ └── include/
│ ├── ABKAttributionData.h
│ ├── ABKBannerCard.h
│ ├── ABKBannerContentCard.h
│ ├── ABKCaptionedImageCard.h
│ ├── ABKCaptionedImageContentCard.h
│ ├── ABKCard.h
│ ├── ABKClassicCard.h
│ ├── ABKClassicContentCard.h
│ ├── ABKContentCard.h
│ ├── ABKContentCardsController.h
│ ├── ABKFacebookUser.h
│ ├── ABKFeedController.h
│ ├── ABKIDFADelegate.h
│ ├── ABKImageDelegate.h
│ ├── ABKInAppMessage.h
│ ├── ABKInAppMessageButton.h
│ ├── ABKInAppMessageControl.h
│ ├── ABKInAppMessageController.h
│ ├── ABKInAppMessageControllerDelegate.h
│ ├── ABKInAppMessageDarkButtonTheme.h
│ ├── ABKInAppMessageDarkTheme.h
│ ├── ABKInAppMessageFull.h
│ ├── ABKInAppMessageHTML.h
│ ├── ABKInAppMessageHTMLBase.h
│ ├── ABKInAppMessageHTMLFull.h
│ ├── ABKInAppMessageImmersive.h
│ ├── ABKInAppMessageModal.h
│ ├── ABKInAppMessageSlideup.h
│ ├── ABKInAppMessageUIControlling.h
│ ├── ABKInAppMessageWebViewBridge.h
│ ├── ABKLocationManager.h
│ ├── ABKLocationManagerProvider.h
│ ├── ABKModalWebViewController.h
│ ├── ABKNoConnectionLocalization.h
│ ├── ABKPushUtils.h
│ ├── ABKSDWebImageProxy.h
│ ├── ABKSdkAuthenticationDelegate.h
│ ├── ABKSdkAuthenticationError.h
│ ├── ABKSdkMetadata.h
│ ├── ABKTextAnnouncementCard.h
│ ├── ABKTwitterUser.h
│ ├── ABKURLDelegate.h
│ ├── ABKUser.h
│ ├── Appboy.h
│ └── AppboyKit.h
├── AppboyPushStory/
│ ├── Dummy.m
│ ├── Resources/
│ │ └── ABKPageView.nib
│ └── include/
│ └── AppboyPushStory/
│ ├── ABKStoriesView.h
│ ├── ABKStoriesViewDataSource.h
│ └── AppboyPushStory.h
├── AppboyUI/
│ ├── ABKContentCards/
│ │ ├── AppboyContentCards.h
│ │ ├── Resources/
│ │ │ ├── Base.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── ar.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── cs.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── da.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── de.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── en.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── es-419.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── es-MX.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── es.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── et.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── fi.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── fil.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── fr.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── he.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── hi.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── id.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── it.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── ja.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── km.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── ko.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── lo.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── ms.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── my.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── nb.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── nl.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── pl.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── pt-PT.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── pt.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── ru.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── sv.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── th.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── uk.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── vi.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── zh-HK.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── zh-Hans.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── zh-Hant.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ ├── zh-TW.lproj/
│ │ │ │ └── AppboyContentCardsLocalizable.strings
│ │ │ └── zh.lproj/
│ │ │ └── AppboyContentCardsLocalizable.strings
│ │ └── ViewControllers/
│ │ ├── ABKContentCardsTableViewController.h
│ │ ├── ABKContentCardsTableViewController.m
│ │ ├── ABKContentCardsViewController.h
│ │ ├── ABKContentCardsViewController.m
│ │ ├── ABKContentCardsWebViewController.h
│ │ ├── ABKContentCardsWebViewController.m
│ │ └── Cells/
│ │ ├── ABKBannerContentCardCell.h
│ │ ├── ABKBannerContentCardCell.m
│ │ ├── ABKBaseContentCardCell.h
│ │ ├── ABKBaseContentCardCell.m
│ │ ├── ABKCaptionedImageContentCardCell.h
│ │ ├── ABKCaptionedImageContentCardCell.m
│ │ ├── ABKClassicContentCardCell.h
│ │ ├── ABKClassicContentCardCell.m
│ │ ├── ABKClassicImageContentCardCell.h
│ │ ├── ABKClassicImageContentCardCell.m
│ │ ├── ABKControlTableViewCell.h
│ │ └── ABKControlTableViewCell.m
│ ├── ABKInAppMessage/
│ │ ├── ABKInAppMessageUIButton.h
│ │ ├── ABKInAppMessageUIButton.m
│ │ ├── ABKInAppMessageUIController.h
│ │ ├── ABKInAppMessageUIController.m
│ │ ├── ABKInAppMessageUIDelegate.h
│ │ ├── ABKInAppMessageView.h
│ │ ├── ABKInAppMessageView.m
│ │ ├── ABKInAppMessageWindow.h
│ │ ├── ABKInAppMessageWindow.m
│ │ ├── AppboyInAppMessage.h
│ │ ├── Resources/
│ │ │ ├── ABKInAppMessageFullViewController.xib
│ │ │ ├── ABKInAppMessageModalViewController.xib
│ │ │ ├── ABKInAppMessageSlideupViewController.xib
│ │ │ ├── Base.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── FontAwesome.otf
│ │ │ ├── ar.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── cs.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── da.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── de.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── en.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── es-419.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── es-MX.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── es.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── et.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── fi.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── fil.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── fr.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── he.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── hi.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── id.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── it.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── ja.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── km.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── ko.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── lo.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── ms.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── my.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── nb.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── nl.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── pl.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── pt-PT.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── pt.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── ru.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── sv.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── th.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── uk.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── vi.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── zh-HK.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── zh-Hans.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── zh-Hant.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ ├── zh-TW.lproj/
│ │ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ │ └── zh.lproj/
│ │ │ └── AppboyInAppMessageLocalizable.strings
│ │ └── ViewControllers/
│ │ ├── ABKInAppMessageFullViewController.h
│ │ ├── ABKInAppMessageFullViewController.m
│ │ ├── ABKInAppMessageHTMLBaseViewController.h
│ │ ├── ABKInAppMessageHTMLBaseViewController.m
│ │ ├── ABKInAppMessageHTMLFullViewController.h
│ │ ├── ABKInAppMessageHTMLFullViewController.m
│ │ ├── ABKInAppMessageHTMLViewController.h
│ │ ├── ABKInAppMessageHTMLViewController.m
│ │ ├── ABKInAppMessageImmersiveViewController.h
│ │ ├── ABKInAppMessageImmersiveViewController.m
│ │ ├── ABKInAppMessageModalViewController.h
│ │ ├── ABKInAppMessageModalViewController.m
│ │ ├── ABKInAppMessageSlideupViewController.h
│ │ ├── ABKInAppMessageSlideupViewController.m
│ │ ├── ABKInAppMessageViewController.h
│ │ ├── ABKInAppMessageViewController.m
│ │ ├── ABKInAppMessageWindowController.h
│ │ └── ABKInAppMessageWindowController.m
│ ├── ABKNewsFeed/
│ │ ├── AppboyNewsFeed.h
│ │ ├── Resources/
│ │ │ ├── Base.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── ar.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── cs.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── da.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── de.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── en.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── es-419.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── es-MX.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── es.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── et.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── fi.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── fil.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── fr.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── he.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── hi.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── id.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── it.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── ja.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── km.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── ko.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── lo.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── ms.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── my.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── nb.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── nl.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── pl.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── pt-PT.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── pt.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── ru.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── sv.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── th.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── uk.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── vi.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── zh-HK.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── zh-Hans.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── zh-Hant.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ ├── zh-TW.lproj/
│ │ │ │ └── AppboyFeedLocalizable.strings
│ │ │ └── zh.lproj/
│ │ │ └── AppboyFeedLocalizable.strings
│ │ └── ViewControllers/
│ │ ├── ABKFeedWebViewController.h
│ │ ├── ABKFeedWebViewController.m
│ │ ├── ABKNewsFeedTableViewController.h
│ │ ├── ABKNewsFeedTableViewController.m
│ │ ├── ABKNewsFeedViewController.h
│ │ ├── ABKNewsFeedViewController.m
│ │ └── Cells/
│ │ ├── ABKNFBannerCardCell.h
│ │ ├── ABKNFBannerCardCell.m
│ │ ├── ABKNFBaseCardCell.h
│ │ ├── ABKNFBaseCardCell.m
│ │ ├── ABKNFCaptionedMessageCardCell.h
│ │ ├── ABKNFCaptionedMessageCardCell.m
│ │ ├── ABKNFClassicCardCell.h
│ │ └── ABKNFClassicCardCell.m
│ └── ABKUIUtils/
│ ├── ABKSDWebImageImageDelegate.h
│ ├── ABKSDWebImageImageDelegate.m
│ ├── ABKUIURLUtils.h
│ ├── ABKUIURLUtils.m
│ ├── ABKUIUtils.h
│ └── ABKUIUtils.m
├── CHANGELOG.md
├── Example/
│ ├── Podfile
│ ├── README.md
│ ├── Stopwatch/
│ │ ├── Resources/
│ │ │ ├── ABKContentCardsCustomStoryboard.storyboard
│ │ │ ├── ABKContentCardsStoryboard.storyboard
│ │ │ ├── ABKNewsFeedCardStoryboard.storyboard
│ │ │ ├── Assets.xcassets/
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ ├── IAM.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Icons_Read.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Icons_Unread.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── appboy_cc_noimage_lrg.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── bolt.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── newsfeed.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── stopwatch_cc_icon_pinned.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── user.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── LaunchScreen.storyboard
│ │ │ ├── en.lproj/
│ │ │ │ ├── Localizable.strings
│ │ │ │ └── MainStoryboard.storyboard
│ │ │ ├── he.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ ├── zh-Hans.lproj/
│ │ │ │ └── Localizable.strings
│ │ │ └── zh-Hant.lproj/
│ │ │ └── Localizable.strings
│ │ ├── Sources/
│ │ │ ├── AppDelegate.h
│ │ │ ├── AppDelegate.m
│ │ │ ├── Categories/
│ │ │ │ ├── UIViewController+Keyboard.h
│ │ │ │ └── UIViewController+Keyboard.m
│ │ │ ├── Utils/
│ │ │ │ ├── AlertControllerUtils.h
│ │ │ │ ├── AlertControllerUtils.m
│ │ │ │ ├── ColorUtils.h
│ │ │ │ ├── ColorUtils.m
│ │ │ │ ├── IDFADelegate.h
│ │ │ │ ├── IDFADelegate.m
│ │ │ │ ├── LoggerUtils.h
│ │ │ │ ├── SdkAuthDelegate.h
│ │ │ │ └── SdkAuthDelegate.m
│ │ │ ├── ViewControllers/
│ │ │ │ ├── Advanced/
│ │ │ │ │ ├── About/
│ │ │ │ │ │ ├── AboutViewController.h
│ │ │ │ │ │ └── AboutViewController.m
│ │ │ │ │ ├── Data/
│ │ │ │ │ │ ├── DataViewController.h
│ │ │ │ │ │ └── DataViewController.m
│ │ │ │ │ └── Misc/
│ │ │ │ │ ├── CustomThemesDataSource.h
│ │ │ │ │ ├── CustomThemesDataSource.m
│ │ │ │ │ ├── GeofencesViewController.h
│ │ │ │ │ ├── GeofencesViewController.m
│ │ │ │ │ ├── MiscViewController.h
│ │ │ │ │ └── MiscViewController.m
│ │ │ │ ├── Braze UI/
│ │ │ │ │ ├── FeedUIViewController.h
│ │ │ │ │ └── FeedUIViewController.m
│ │ │ │ ├── ContainerViewController.h
│ │ │ │ ├── ContainerViewController.m
│ │ │ │ ├── CustomTabBarController.h
│ │ │ │ ├── CustomTabBarController.m
│ │ │ │ ├── IAM/
│ │ │ │ │ ├── Controls/
│ │ │ │ │ │ ├── InAppMessageTestViewController.h
│ │ │ │ │ │ └── InAppMessageTestViewController.m
│ │ │ │ │ └── UI/
│ │ │ │ │ ├── HTML/
│ │ │ │ │ │ ├── InAppMessageWithJS.html
│ │ │ │ │ │ └── InAppMessageWithoutAssetZip.html
│ │ │ │ │ ├── InAppMessageHTMLComposerViewController.h
│ │ │ │ │ ├── InAppMessageHTMLComposerViewController.m
│ │ │ │ │ ├── InAppMessageUICells.h
│ │ │ │ │ ├── InAppMessageUICells.m
│ │ │ │ │ ├── InAppMessageUIViewController.h
│ │ │ │ │ └── InAppMessageUIViewController.m
│ │ │ │ └── User/
│ │ │ │ ├── Alias/
│ │ │ │ │ ├── AliasViewController.h
│ │ │ │ │ └── AliasViewController.m
│ │ │ │ ├── Array/
│ │ │ │ │ ├── UserAttributesArrayViewController.h
│ │ │ │ │ └── UserAttributesArrayViewController.m
│ │ │ │ ├── Attributes/
│ │ │ │ │ ├── Location Custom Attribute/
│ │ │ │ │ │ ├── LocationAnnotation.h
│ │ │ │ │ │ ├── LocationAnnotation.m
│ │ │ │ │ │ ├── LocationCustomAttributeViewController.h
│ │ │ │ │ │ └── LocationCustomAttributeViewController.m
│ │ │ │ │ ├── UserAttributesViewController.h
│ │ │ │ │ ├── UserAttributesViewController.m
│ │ │ │ │ └── Views/
│ │ │ │ │ ├── UserCells.h
│ │ │ │ │ ├── UserCells.m
│ │ │ │ │ ├── UserCustomAttribute.h
│ │ │ │ │ ├── UserCustomAttribute.m
│ │ │ │ │ ├── UserCustomAttributeCell.h
│ │ │ │ │ ├── UserCustomAttributeCell.m
│ │ │ │ │ ├── UserSubscriptionGroup.h
│ │ │ │ │ ├── UserSubscriptionGroup.m
│ │ │ │ │ ├── UserSubscriptionGroupCell.h
│ │ │ │ │ └── UserSubscriptionGroupCell.m
│ │ │ │ └── Events/
│ │ │ │ ├── EventsViewController.h
│ │ │ │ └── EventsViewController.m
│ │ │ ├── Views/
│ │ │ │ ├── ScrollContentView.h
│ │ │ │ ├── ScrollContentView.m
│ │ │ │ ├── StopwatchButton.h
│ │ │ │ ├── StopwatchButton.m
│ │ │ │ ├── StopwatchSegmentedControl.h
│ │ │ │ └── StopwatchSegmentedControl.m
│ │ │ └── main.m
│ │ └── Supporting Files/
│ │ ├── Info.plist
│ │ ├── Stopwatch-Prefix.pch
│ │ └── Stopwatch.entitlements
│ ├── Stopwatch.xcodeproj/
│ │ ├── project.pbxproj
│ │ └── project.xcworkspace/
│ │ └── contents.xcworkspacedata
│ ├── Stopwatch.xcworkspace/
│ │ └── contents.xcworkspacedata
│ ├── StopwatchNotificationContentExtension/
│ │ ├── Base.lproj/
│ │ │ └── MainInterface.storyboard
│ │ ├── Info.plist
│ │ ├── NotificationViewController.h
│ │ ├── NotificationViewController.m
│ │ └── StopwatchNotificationContentExtension.entitlements
│ ├── StopwatchNotificationService/
│ │ ├── Info.plist
│ │ ├── NotificationService.h
│ │ └── NotificationService.m
│ ├── tvOS_Stopwatch/
│ │ ├── AppDelegate.h
│ │ ├── AppDelegate.m
│ │ ├── Assets.xcassets/
│ │ │ ├── App Icon & Top Shelf Image.brandassets/
│ │ │ │ ├── App Icon - Large.imagestack/
│ │ │ │ │ ├── Back.imagestacklayer/
│ │ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── Front.imagestacklayer/
│ │ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Middle.imagestacklayer/
│ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── App Icon - Small.imagestack/
│ │ │ │ │ ├── Back.imagestacklayer/
│ │ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── Front.imagestacklayer/
│ │ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ │ └── Contents.json
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Middle.imagestacklayer/
│ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ ├── Top Shelf Image Wide.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Top Shelf Image.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ └── LaunchImage.launchimage/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ ├── ViewController.h
│ │ ├── ViewController.m
│ │ └── main.m
│ └── tvOS_TVML_Stopwatch/
│ ├── AppDelegate.h
│ ├── AppDelegate.m
│ ├── AppboyBridge.h
│ ├── AppboyBridge.m
│ ├── Assets.xcassets/
│ │ ├── App Icon & Top Shelf Image.brandassets/
│ │ │ ├── App Icon - Large.imagestack/
│ │ │ │ ├── Back.imagestacklayer/
│ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ ├── Front.imagestacklayer/
│ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Middle.imagestacklayer/
│ │ │ │ ├── Content.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── App Icon - Small.imagestack/
│ │ │ │ ├── Back.imagestacklayer/
│ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ ├── Front.imagestacklayer/
│ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Middle.imagestacklayer/
│ │ │ │ ├── Content.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ └── Top Shelf Image.imageset/
│ │ │ └── Contents.json
│ │ ├── Contents.json
│ │ └── LaunchImage.launchimage/
│ │ └── Contents.json
│ ├── Info.plist
│ ├── application.js
│ └── main.m
├── HelloSwift/
│ ├── HelloSwift/
│ │ ├── AppDelegate.swift
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.xib
│ │ │ └── Main.storyboard
│ │ ├── HelloSwift-Bridging-Header.h
│ │ ├── HelloSwift.entitlements
│ │ ├── Images.xcassets/
│ │ │ └── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Info.plist
│ │ └── ViewController.swift
│ ├── HelloSwift.xcodeproj/
│ │ └── project.pbxproj
│ ├── HelloSwift.xcworkspace/
│ │ └── contents.xcworkspacedata
│ ├── HelloSwiftNotificationContentExtension/
│ │ ├── Base.lproj/
│ │ │ └── MainInterface.storyboard
│ │ ├── HelloSwiftNotificationContentExtension.entitlements
│ │ ├── Info.plist
│ │ └── NotificationViewController.swift
│ ├── HelloSwiftNotificationExtension/
│ │ ├── HelloSwiftNotificationExtension.entitlements
│ │ ├── Info.plist
│ │ └── NotificationService.swift
│ ├── HelloSwiftTests/
│ │ └── AppboyPushUnitTests.m
│ ├── Podfile
│ └── tvOS_HelloSwift/
│ ├── AppDelegate.swift
│ ├── Assets.xcassets/
│ │ ├── App Icon & Top Shelf Image.brandassets/
│ │ │ ├── App Icon - App Store.imagestack/
│ │ │ │ ├── Back.imagestacklayer/
│ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ ├── Front.imagestacklayer/
│ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Middle.imagestacklayer/
│ │ │ │ ├── Content.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── App Icon.imagestack/
│ │ │ │ ├── Back.imagestacklayer/
│ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ ├── Front.imagestacklayer/
│ │ │ │ │ ├── Content.imageset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Middle.imagestacklayer/
│ │ │ │ ├── Content.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── Contents.json
│ │ │ ├── Top Shelf Image Wide.imageset/
│ │ │ │ └── Contents.json
│ │ │ └── Top Shelf Image.imageset/
│ │ │ └── Contents.json
│ │ └── Contents.json
│ ├── Base.lproj/
│ │ └── LaunchScreen.storyboard
│ ├── ContentView.swift
│ ├── Info.plist
│ └── Preview Content/
│ └── Preview Assets.xcassets/
│ └── Contents.json
├── LICENSE
├── Package.swift
├── README.md
├── Samples/
│ ├── ContentCards/
│ │ └── BrazeContentCardsSampleApp/
│ │ ├── BrazeContentCardsSampleApp/
│ │ │ ├── AppDelegate.h
│ │ │ ├── AppDelegate.m
│ │ │ ├── Assets.xcassets/
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj/
│ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ └── Main.storyboard
│ │ │ ├── CustomCaptionedImageContentCardCell.h
│ │ │ ├── CustomCaptionedImageContentCardCell.m
│ │ │ ├── CustomClassicContentCardCell.h
│ │ │ ├── CustomClassicContentCardCell.m
│ │ │ ├── CustomContentCardsTableViewController.h
│ │ │ ├── CustomContentCardsTableViewController.m
│ │ │ ├── Info.plist
│ │ │ ├── ViewController.h
│ │ │ ├── ViewController.m
│ │ │ └── main.m
│ │ ├── BrazeContentCardsSampleApp.xcodeproj/
│ │ │ └── project.pbxproj
│ │ ├── BrazeContentCardsSampleApp.xcworkspace/
│ │ │ └── contents.xcworkspacedata
│ │ ├── Podfile
│ │ └── Podfile.lock
│ ├── Core/
│ │ └── ObjCSample/
│ │ ├── ObjCSample/
│ │ │ ├── AppDelegate.h
│ │ │ ├── AppDelegate.m
│ │ │ ├── Assets.xcassets/
│ │ │ │ └── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj/
│ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ └── Main.storyboard
│ │ │ ├── Info.plist
│ │ │ ├── ObjCSample.entitlements
│ │ │ ├── ViewController.h
│ │ │ ├── ViewController.m
│ │ │ └── main.m
│ │ ├── ObjCSample.xcodeproj/
│ │ │ └── project.pbxproj
│ │ ├── ObjCSample.xcworkspace/
│ │ │ └── contents.xcworkspacedata
│ │ ├── Podfile
│ │ └── Podfile.lock
│ ├── InAppMessage/
│ │ └── BrazeInAppMessageSample/
│ │ ├── BrazeInAppMessageSample/
│ │ │ ├── AppDelegate.h
│ │ │ ├── AppDelegate.m
│ │ │ ├── Assets.xcassets/
│ │ │ │ └── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ ├── Base.lproj/
│ │ │ │ ├── LaunchScreen.storyboard
│ │ │ │ └── Main.storyboard
│ │ │ ├── CustomInAppMessageViewController.h
│ │ │ ├── CustomInAppMessageViewController.m
│ │ │ ├── CustomInAppMessageViewController.xib
│ │ │ ├── Info.plist
│ │ │ ├── ViewController.h
│ │ │ ├── ViewController.m
│ │ │ └── main.m
│ │ ├── BrazeInAppMessageSample.xcodeproj/
│ │ │ └── project.pbxproj
│ │ ├── BrazeInAppMessageSample.xcworkspace/
│ │ │ └── contents.xcworkspacedata
│ │ ├── Podfile
│ │ └── Podfile.lock
│ └── NewsFeed/
│ └── BrazeNewsFeedSample/
│ ├── BrazeNewsFeedSample/
│ │ ├── AppDelegate.h
│ │ ├── AppDelegate.m
│ │ ├── Assets.xcassets/
│ │ │ └── AppIcon.appiconset/
│ │ │ └── Contents.json
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ ├── CustomFeedTableViewController.h
│ │ ├── Info.plist
│ │ ├── ViewController.h
│ │ ├── ViewController.m
│ │ └── main.m
│ ├── BrazeNewsFeedSample.xcodeproj/
│ │ └── project.pbxproj
│ ├── BrazeNewsFeedSample.xcworkspace/
│ │ └── contents.xcworkspacedata
│ ├── Podfile
│ └── Podfile.lock
├── appboy_ios_sdk.json
├── appboy_ios_sdk_core.json
└── appboy_ios_sdk_full.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/bug.yml
================================================
name: 🐞 Bug report
description: File a Bug Report for unexpected or incorrect SDK Behavior
title: '[Bug]: '
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report! Please consider contacting support@braze.com for faster integration troubleshooting and to avoid leaking private information to our public Github issues.
Consider upgrading to the new [Braze Swift SDK](https://github.com/braze-inc/braze-swift-sdk), the bug might not exist in this new SDK.
- type: dropdown
id: platform
attributes:
label: Platform
multiple: false
options:
- iOS
- tvOS
- Mac Catalyst
- Other
validations:
required: true
- type: input
id: platform_version
attributes:
label: Platform Version
placeholder: ex. iOS 15.1
validations:
required: true
- type: input
id: sdk_version
attributes:
label: Braze SDK Version
placeholder: ex. 4.3.0
validations:
required: true
- type: input
id: xcode_version
attributes:
label: Xcode Version
placeholder: ex. Xcode 10.1
validations:
required: true
- type: dropdown
id: integration_method
attributes:
label: Integration Method
multiple: false
options:
- Swift Package Manager
- Cocoapods
- Carthage
- Manually
- Other
validations:
required: true
- type: dropdown
id: processor
attributes:
label: Computer Processor
multiple: false
options:
- Intel
- Apple (M1)
validations:
required: true
- type: input
id: repro_rate
attributes:
label: Repro Rate
description: How often can you reproduce this bug?
placeholder: ex. 100% of the time
validations:
required: true
- type: textarea
id: repro_steps
attributes:
label: Steps To Reproduce
description: Please provide a [minimal reproducible example](https://stackoverflow.com/help/minimal-reproducible-example)
value: |
Example:
1. Add `pod 'Appboy-iOS-SDK'` to the Podspec file.
2. Add `[Appboy startWithApiKey:inApplication:withLaunchOptions:];` method in `application:didFinishLaunchingWithOptions:` method in `AppDelegate.m`.
3. Run the app.
validations:
required: true
- type: textarea
id: expected_behavior
attributes:
label: Expected Behavior
description: What was supposed to happen?
validations:
required: true
- type: textarea
id: actual_behavior
attributes:
label: Actual Incorrect Behavior
description: What incorrect behavior happened instead?
validations:
required: true
- type: textarea
id: verbose_logs
attributes:
label: Verbose Logs
description: Please copy and paste verbose log output. This will be automatically formatted into code, so no need for backticks.
render: shell
- type: textarea
id: other_info
attributes:
label: Additional Information
description: Anything else you'd like to share?
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
- name: Braze Swift SDK
url: https://github.com/braze-inc/braze-swift-sdk/
about: Consider upgrading to the new Braze Swift SDK for a better experience.
- name: Braze Support
url: https://support.braze.com/
about: Contact Braze Support for company or campaign-specific troubleshooting
- name: Security Issues
url: https://www.braze.com/docs/developer_guide/disclosures/security_and_vulnerability_disclosure/
about: Please report security vulnerabilities here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature.yml
================================================
name: ✅ Feature Request
description: Request New SDK Features
title: '[Feature]: '
labels: ["feature-request"]
body:
- type: markdown
attributes:
value: |
Did you know: You can also submit feature requests in our [Public Roadmap Portal](https://dashboard.braze.com/resources/roadmap)
- type: textarea
id: problem
attributes:
label: What problem are you facing?
description: Help us understand what you're unable to accomplish, or what's difficult with your integration
placeholder: |
ex: I am unable to accomplish XYZ today, since the SDK does not allow me to...
validations:
required: true
- type: textarea
id: workarounds
attributes:
label: Workarounds
description: Are there any workarounds you can use? How complicated are they?
validations:
required: true
- type: textarea
id: ideal_solution
attributes:
label: Ideal Solution
description: What would your ideal solution look like?
validations:
required: false
- type: textarea
id: other_information
attributes:
label: Other Information
description: Any additional information you'd like to share?
validations:
required: false
================================================
FILE: .gitignore
================================================
.DS_Store
Example/build/
Example/builds/
Pods/
Podfile.lock
!Samples/**/Podfile.lock
xcuserdata/
.idea/
**xcshareddata**
# Emacs temporary files
*~
# XCFrameworks
*.xcframework
================================================
FILE: Appboy-Push-Story.podspec
================================================
Pod::Spec.new do |s|
s.name = "Appboy-Push-Story"
s.version = "4.7.0"
s.summary = "This is the Braze Push Story SDK for Mobile Marketing Automation"
s.homepage = "http://www.braze.com"
s.license = { :type => 'Commercial', :text => 'Please refer to https://github.com/Appboy/appboy-ios-sdk/blob/master/LICENSE'}
s.author = { "Appboy" => "http://www.braze.com" }
s.source = { :http => "https://github.com/Appboy/appboy-ios-sdk/releases/download/#{s.version.to_s}/AppboyPushStory.zip" }
s.platform = :ios
s.ios.deployment_target = '11.0'
s.requires_arc = true
s.documentation_url = 'https://www.braze.com/docs'
s.vendored_frameworks = 'AppboyPushStory/AppboyPushStory.xcframework'
s.resource_bundle = { 'AppboyPushStory' => 'AppboyPushStory/Resources/*' }
s.user_target_xcconfig = { 'OTHER_LDFLAGS' => '-ObjC' }
end
================================================
FILE: Appboy-iOS-SDK.podspec
================================================
Pod::Spec.new do |s|
s.name = "Appboy-iOS-SDK"
s.version = "4.7.0"
s.summary = "This is the Braze iOS SDK for Mobile Marketing Automation"
s.homepage = "http://www.braze.com"
s.license = { :type => 'Commercial', :text => 'Please refer to https://github.com/Appboy/appboy-ios-sdk/blob/master/LICENSE'}
s.author = { "Appboy" => "http://www.braze.com" }
s.source = { :http => "https://github.com/Appboy/appboy-ios-sdk/releases/download/#{s.version.to_s}/Appboy_iOS_SDK.zip" }
s.platform = :ios
s.ios.deployment_target = '11.0'
s.requires_arc = true
s.documentation_url = 'https://www.braze.com/docs'
s.exclude_files = 'AppboyKit/**/*.txt'
s.preserve_paths = 'AppboyKit/**/*.*'
s.default_subspec = 'UI'
s.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-ObjC' }
s.subspec 'Core' do |sc|
sc.ios.library = 'z'
sc.frameworks = 'SystemConfiguration', 'QuartzCore', 'CoreText', 'WebKit'
sc.source_files = 'AppboyKit/include/*.h', 'AppboyKit/ABKModalWebViewController.m', 'AppboyKit/ABKNoConnectionLocalization.m', 'AppboyKit/ABKLocationManagerProvider.m'
sc.resource_bundle = { 'Appboy' => ['AppboyKit/Appboy.bundle/*.{lproj,txt,xcprivacy}'] }
sc.vendored_framework = 'AppboyKit/AppboyKitLibrary.xcframework'
sc.weak_framework = 'CoreTelephony', 'UserNotifications'
end
s.subspec 'UI' do |sui|
sui.dependency 'Appboy-iOS-SDK/NewsFeed'
sui.dependency 'Appboy-iOS-SDK/InAppMessage'
sui.dependency 'Appboy-iOS-SDK/ContentCards'
sui.dependency 'Appboy-iOS-SDK/Core'
end
s.subspec 'NewsFeed' do |snf|
snf.source_files = 'AppboyUI/ABKNewsFeed/*.*', 'AppboyUI/ABKNewsFeed/ViewControllers/**/*.*', 'AppboyUI/ABKUIUtils/**/*.*', 'AppboyKit/ABKSDWebImageProxy.m'
snf.resource_bundle = { 'AppboyUI.NewsFeed' => 'AppboyUI/ABKNewsFeed/Resources/**/*.*' }
snf.dependency 'Appboy-iOS-SDK/Core'
snf.dependency 'SDWebImage', '>= 5.18.7', '< 6'
end
s.subspec 'InAppMessage' do |siam|
siam.source_files = 'AppboyUI/ABKUIUtils/**/*.*', 'AppboyUI/ABKInAppMessage/*.*', 'AppboyUI/ABKInAppMessage/ViewControllers/*.*', 'AppboyKit/ABKSDWebImageProxy.m'
siam.resource_bundle = { 'AppboyUI.InAppMessage' => 'AppboyUI/ABKInAppMessage/Resources/*.*' }
siam.dependency 'Appboy-iOS-SDK/Core'
siam.dependency 'SDWebImage', '>= 5.18.7', '< 6'
end
s.subspec 'ContentCards' do |scc|
scc.source_files = 'AppboyUI/ABKContentCards/*.*', 'AppboyUI/ABKContentCards/ViewControllers/**/*.*', 'AppboyUI/ABKUIUtils/**/*.*', 'AppboyKit/ABKSDWebImageProxy.m'
scc.resource_bundle = { 'AppboyUI.ContentCards' => 'AppboyUI/ABKContentCards/Resources/**/*.*' }
scc.dependency 'Appboy-iOS-SDK/Core'
scc.dependency 'SDWebImage', '>= 5.18.7', '< 6'
end
end
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKAttributionData.h
================================================
#import <Foundation/Foundation.h>
/*
* Braze Public API: ABKAttributionData
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKAttributionData : NSObject
/*!
* @param network The attribution network
* @param campaign The attribution campaign
* @param adGroup The attribution adGroup
* @param creative The attribution creative
*
* @discussion: Creates an ABKAttributionData object to send to Braze servers.
*/
- (instancetype)initWithNetwork:(nullable NSString *)network
campaign:(nullable NSString *)campaign
adGroup:(nullable NSString *)adGroup
creative:(nullable NSString *)creative;
@property (nonatomic, readonly, nullable) NSString *network;
@property (nonatomic, readonly, nullable) NSString *campaign;
@property (nonatomic, readonly, nullable) NSString *adGroup;
@property (nonatomic, readonly, nullable) NSString *creative;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKBannerCard.h
================================================
#import "ABKCard.h"
/*
* Braze Public API: ABKBannerCard
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKBannerCard : ABKCard <NSCoding>
/*
* This property is the URL of the card's image.
*/
@property (copy) NSString *image;
/*
* The link text for the property url, like @"blog.appboy.com". It can be displayed on the card's
* UI to indicate the action/direction of clicking on the card.
*/
@property (copy, nullable) NSString *domain;
/*
* This property is the aspect ratio of the card's image. It is meant to serve as a hint before
* image loading completes. Note that the property may not be supplied in certain circumstances.
*/
@property float imageAspectRatio;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKBannerContentCard.h
================================================
#import "ABKContentCard.h"
@interface ABKBannerContentCard : ABKContentCard <NSCoding>
/*
* The URL of the card's image.
*/
@property (copy) NSString *image;
/*
* This property is the aspect ratio of the card's image. It is meant to serve as a hint before
* image loading completes. Note that the property may not be supplied in certain circumstances.
*/
@property float imageAspectRatio;
@end
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKCaptionedImageCard.h
================================================
#import "ABKCard.h"
/*
* Braze Public API: ABKCaptionedImageCard
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKCaptionedImageCard : ABKCard <NSCoding>
/*
* This property is the URL of the card's image.
*/
@property (copy) NSString *image;
/*
* This property is the aspect ratio of the card's image. It is meant to serve as a hint before
* image loading completes. Note that the property may not be supplied in certain circumstances.
*/
@property float imageAspectRatio;
/*
* The title text for the card.
*/
@property (copy) NSString *title;
/*
* The description text for the card.
*/
@property (copy) NSString *cardDescription;
/*
* The link text for the property url, like @"blog.appboy.com". It can be displayed on the card's
* UI to indicate the action/direction of clicking on the card.
*/
@property (copy, nullable) NSString *domain;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKCaptionedImageContentCard.h
================================================
#import "ABKContentCard.h"
NS_ASSUME_NONNULL_BEGIN
@interface ABKCaptionedImageContentCard : ABKContentCard <NSCoding>
/*
* The URL of the card's image.
*/
@property (copy) NSString *image;
/*
* This property is the aspect ratio of the card's image. It is meant to serve as a hint before
* image loading completes. Note that the property may not be supplied in certain circumstances.
*/
@property float imageAspectRatio;
/*
* The title text for the card.
*/
@property (copy) NSString *title;
/*
* The description text for the card.
*/
@property (copy) NSString *cardDescription;
/*
* The link text for the property url, like @"blog.appboy.com". It can be displayed on the card's
* UI to indicate the action/direction of clicking on the card.
*/
@property (copy, nullable) NSString *domain;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKCard.h
================================================
#import <Foundation/Foundation.h>
#import "ABKFeedController.h"
/*
* Braze Public API: ABKCard
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKCard : NSObject <NSCopying, NSCoding>
/*
* Card's ID.
*/
@property (readonly) NSString *idString;
/*
* This property reflects if the card is read or unread by the user.
*/
@property (nonatomic) BOOL viewed;
/*
* The property is the unix timestamp of the card's creation time from Braze dashboard.
*/
@property (nonatomic, readonly) double created;
/*
* The property is the unix timestamp of the card's latest update time from Braze dashboard.
*/
@property (nonatomic, readonly) double updated;
/*
* The categories assigned to the card.
*/
@property ABKCardCategory categories;
/*
* The property is the unix timestamp of the card's expiration time. When the value is less than 0, it means the card
* doesn't an expire date.
*/
@property (readonly) double expiresAt;
/*!
* This property carries extra data in the form of an NSDictionary which can be sent down via the Braze Dashboard.
* You may want to design and implement a custom handler to access this data depending on your use case.
*/
@property (strong, nullable) NSDictionary *extras;
//Optional:
/*
* The URL string that will be opened after the card is clicked on.
*/
@property (copy, nullable) NSString *urlString;
/*!
* When the card's urlString is not nil, if the property is set to YES, the URL will be opened in a modal WKWebView
* inside the app. If this property is set to NO, the URL will be opened by the OS and web URLs will be opened in
* an external web browser app.
*
* This property defaults to NO.
*/
@property BOOL openUrlInWebView;
/*
* @param cardDictionary The dictionary for card deserialization.
*
* Deserializes the dictionary to a card for use by wrappers such as Braze's Unity SDK for iOS.
* When the deserialization isn't successful, this method returns nil; otherwise, it returns the deserialized card.
*/
+ (nullable ABKCard *)deserializeCardFromDictionary:(nullable NSDictionary *)cardDictionary;
/*
* Serializes the card to binary data for use by wrappers such as Braze's Unity SDK for iOS.
*/
- (nullable NSData *)serializeToData;
/*
* Manually log an impression to Braze for the card.
* This should only be used for custom news feed view controller. ABKFeedViewController already has card impression logging.
*/
- (void)logCardImpression;
/*
* Manually log a click to Braze for the card.
* This should only be used for custom news feed view controller. ABKFeedViewController already has card click logging.
* The SDK will only log a card click when the card has the url property with a valid url.
*/
- (void)logCardClicked;
- (BOOL)hasSameId:(ABKCard *)card;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKClassicCard.h
================================================
#import "ABKCard.h"
/*
* Braze Public API: ABKClassicCard
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKClassicCard : ABKCard <NSCoding>
/*
* This property is the URL of the card's image.
*/
@property (copy, nullable) NSString *image;
/*
* The description text for the card.
*/
@property (copy) NSString *cardDescription;
/*
* The news title text for the card.
*/
@property (copy, nullable) NSString *title;
/*
* The link text for the property url, like @"blog.appboy.com". It can be displayed on the card's
* UI to indicate the action/direction of clicking on the card.
*/
@property (copy, nullable) NSString *domain;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKClassicContentCard.h
================================================
#import "ABKContentCard.h"
NS_ASSUME_NONNULL_BEGIN
@interface ABKClassicContentCard : ABKContentCard <NSCoding>
/*
* The URL of the card's image.
*/
@property (copy, nullable) NSString *image;
/*
* The news title text for the card.
*/
@property (copy) NSString *title;
/*
* The description text for the card.
*/
@property (copy) NSString *cardDescription;
/*
* The link text for the property url, like @"blog.appboy.com". It can be displayed on the card's
* UI to indicate the action/direction of clicking on the card.
*/
@property (copy, nullable) NSString *domain;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKContentCard.h
================================================
#import <Foundation/Foundation.h>
/*
* Braze Public API: ABKContentCard
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKContentCard : NSObject <NSCopying, NSCoding>
/*!
* Card's ID.
*/
@property (readonly) NSString *idString;
/*!
* This property reflects if the card is read or unread by the user.
*/
@property (nonatomic) BOOL viewed;
/*!
* The property is the unix timestamp of the card's creation time from Braze dashboard.
*/
@property (nonatomic, readonly) double created;
/*!
* The property is the unix timestamp of the card's expiration time. When the value is less than 0, it means the card
* doesn't an expire date.
*/
@property (readonly) double expiresAt;
/*!
* This property reflects if the card can be dismissed by the user.
*/
@property (nonatomic) BOOL dismissible;
/*!
* This property reflects if the card has been pinned by the user.
*/
@property (nonatomic) BOOL pinned;
/*!
* This property reflects if the card has been dimissed.
*/
@property (nonatomic) BOOL dismissed;
/*!
* This property reflects if the card has been clicked.
*/
@property (nonatomic) BOOL clicked;
/*!
* This property carries extra data in the form of an NSDictionary which can be sent down via the Braze Dashboard.
* You may want to design and implement a custom handler to access this data depending on your use case.
*/
@property (strong, nullable) NSDictionary *extras;
/*!
* This property is set to YES if the instance represents a test content card
*/
@property (nonatomic, readonly) BOOL isTest;
/*!
* The URL string that will be opened after the card is clicked on.
*/
@property (copy, nullable) NSString *urlString;
/*!
* When the card's urlString is not nil, if the property is set to YES, the URL will be opened in a modal WKWebView
* inside the app. If this property is set to NO, the URL will be opened by the OS and web URLs will be opened in
* an external web browser app.
*
* This property defaults to NO.
*/
@property BOOL openUrlInWebView;
/*!
* @param cardDictionary The dictionary for card deserialization.
*
* Deserializes the dictionary to a card for use by wrappers such as Braze's Unity SDK for iOS.
* When the deserialization isn't successful, this method returns nil; otherwise, it returns the deserialized card.
*/
+ (nullable ABKContentCard *)deserializeCardFromDictionary:(nullable NSDictionary *)cardDictionary;
/*!
* Serializes the card to binary data for use by wrappers such as Braze's Unity SDK for iOS.
*/
- (nullable NSData *)serializeToData;
/*!
* Manually log an impression to Braze for the card.
* This should only be used for custom content card view controllers.
*/
- (void)logContentCardImpression;
/*!
* Manually log a click to Braze for the card.
* This should only be used for custom contentcard view controllers.
*/
- (void)logContentCardClicked;
/*!
* Manually dismiss a card.
* Sets the card's `dismissed` property to YES and logs the dismissal to Braze.
* Only has effect if the card is dismissible and if the `dismissed` property is currently set to NO.
*/
- (void)logContentCardDismissed;
- (BOOL)isControlCard;
- (BOOL)hasSameId:(ABKContentCard *)card;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKFacebookUser.h
================================================
#import <Foundation/Foundation.h>
#import "ABKUser.h"
NS_ASSUME_NONNULL_BEGIN
extern NSInteger const DefaultNumberOfFriends;
/*
* Braze Public API: ABKFacebookUser
*/
@interface ABKFacebookUser : NSObject
/*!
* @param facebookUserDictionary The dictionary returned from facebook with facebook graph api endpoint "/me". Please
* refer to https://developers.facebook.com/docs/graph-api/reference/v4.0/user for more information.
* @param numberOfFriends The length of the friends array from facebook. You can get the array from the dictionary returned
* from facebook with facebook graph api endpoint "/me/friends", under the key "data". Please refer to
* https://developers.facebook.com/docs/graph-api/reference/v4.0/user/friends for more information.
* @param likes The array of user's facebook likes from facebook. You can get the array from the dictionary returned
* from facebook with facebook graph api endpoint "/me/likes", under the key "data"; Please refer to
* https://developers.facebook.com/docs/graph-api/reference/v4.0/user/likes for more information.
*
* @discussion: This method is to generate a ABKFacebookUser so you can pass the user's facebook account data to Braze.
* After a ABKFacebookUser object is generated, you can check the value of properties but you cannot change it.
* If you want to update the user's facebook data, you need to generate a new ABKFacebookUser instance and set it as
* [Appboy sharedInstance].user.facebookUser.
*/
- (instancetype)initWithFacebookUserDictionary:(nullable NSDictionary *)facebookUserDictionary
numberOfFriends:(NSInteger)numberOfFriends
likes:(nullable NSArray *)likes;
@property (readonly, nullable) NSDictionary *facebookUserDictionary;
@property (readonly) NSInteger numberOfFriends;
@property (readonly, nullable) NSArray *likes;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKFeedController.h
================================================
#import <Foundation/Foundation.h>
/* ------------------------------------------------------------------------------------------------------
* Notifications
*/
/*!
* When the news feed is updated, Braze will post a notification through the NSNotificationCenter.
* The name of the notification is the string constant referred to by ABKFeedUpdatedNotification. The
* userInfo dictionary associated with the notification will has one object, with key the same string
* as ABKFeedUpdatedIsSuccessfulKey, to indicate whether the update is successful or not.
*
* To listen for this notification, you would register an object as an observer of the notification
* using something like:
*
* <pre>
* [[NSNotificationCenter defaultCenter] addObserver:self
* selector:@selector(feedUpdatedNotificationReceived:)
* name:ABKFeedUpdatedNotification
* object:nil];
* </pre>
*
* where "feedUpdatedNotificationReceived:" is your callback method for handling the notification:
*
* <pre>
* - (void)feedUpdatedNotificationReceived:(NSNotification *)notification {
* BOOL updateIsSuccessful = [notification.userInfo[ABKFeedUpdatedIsSuccessfulKey] boolValue];
* < Do something in response to the notification >
* }
* </pre>
*/
NS_ASSUME_NONNULL_BEGIN
extern NSString *const ABKFeedUpdatedNotification;
extern NSString *const ABKFeedUpdatedIsSuccessfulKey;
/* ------------------------------------------------------------------------------------------------------
* Enums
*/
/*!
* Values representing the news feed cards' categories recognized by the SDK.
*/
typedef NS_OPTIONS(NSUInteger, ABKCardCategory) {
ABKCardCategoryNoCategory = 1 << 0,
ABKCardCategoryNews = 1 << 1,
ABKCardCategoryAdvertising = 1 << 2,
ABKCardCategoryAnnouncements = 1 << 3,
ABKCardCategorySocial = 1 << 4,
ABKCardCategoryAll = 1 << 0 | 1 << 1 | 1 << 2 | 1 << 3 | 1 << 4
};
/*
* Braze Public API: ABKFeedController
*/
@interface ABKFeedController : NSObject
/*!
* The latest cards of the Braze News Feed saved in memory and disk. Right now the available card types are ABKBannerCard,
* ABKCaptionedImageCard, ABKClassicCard and ABKTextAnnouncementCard. They are all subclasses
* of ABKCard.
*/
@property (readonly, getter=getNewsFeedCards) NSArray *newsFeedCards;
/*!
* The NSDate object that indicates the last time the newsFeedCards property was updated from the Braze server.
*/
@property (readonly, nullable) NSDate *lastUpdate;
/*!
* This method returns the number of currently active cards which have not been viewed in the given categories.
* A "view" happens when a card becomes visible in the feed view. This differentiates
* between cards which are off-screen in the scrolling view, and those which
* are on-screen; when a card scrolls onto the screen, it's counted as viewed.
*
* Cards are counted as viewed only once -- if a card scrolls off the screen and
* back on, it's not re-counted.
*
* Cards are counted only once even if they appear in multiple feed views or across multiple devices.
*/
- (NSInteger)unreadCardCountForCategories:(ABKCardCategory)categories;
/*!
* This method returns the total number of currently active cards belongs to given categories. Cards are
* counted only once even if they appear in multiple feed views.
*/
- (NSInteger)cardCountForCategories:(ABKCardCategory)categories;
/*!
* @param categories An ABKCardCategory indicating the categories that you want to get. You can pass more than one category
* at one time by using "|" to separate categories like: ABKCardCategoryNews | ABKCardCategoryAnnouncements | ABKCardCategorySocial
* @return An array of cards of the given categories.
*
* @discussion This method will find the cards of given categories and return them.
* When the given categories don't exist in any card, this method will return an empty array.
*/
- (NSArray *)getCardsInCategories:(ABKCardCategory)categories;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKSdkAuthenticationDelegate.h
================================================
#import <Foundation/Foundation.h>
#import "ABKSdkAuthenticationError.h"
/*
* Braze Public API: ABKSdkAuthenticationDelegate
*/
NS_ASSUME_NONNULL_BEGIN
@protocol ABKSdkAuthenticationDelegate <NSObject>
/*!
* This method is fired when an SDK Authentication error is returned by the server, for example, if
* the signature is expired or invalid.
*
* You are responsible for providing the Braze SDK a valid signature when this delegate method is
* called.
* SDK requests will retry periodically using an exponential backoff approach. After 50 consecutive
* failed attempts, retries will be paused until the next session start.
*
* @param authError The SDK Authentication error returned by the server
*/
- (void)handleSdkAuthenticationError:(ABKSdkAuthenticationError *)authError;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKSdkAuthenticationError.h
================================================
#import <Foundation/Foundation.h>
/*
* Braze Public API: ABKSdkAuthenticationError
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKSdkAuthenticationError : NSObject
/*!
* The error code for the SDK Authentication failure.
*/
@property (readonly) NSInteger code;
/*!
* The reason for the SDK Authentication failure.
*/
@property (nullable, readonly) NSString *reason;
/*!
* The user ID associated with the request that failed due to SDK Authentication failure.
*/
@property (nullable, readonly) NSString *userId;
/*!
* The signature that was sent with the request that failed due to SDK Authentication failure.
*/
@property (readonly) NSString *signature;
- (instancetype)initWithCode:(NSInteger)code
reason:(NSString *)reason
userId:(NSString *)userId
signature:(NSString *)signature;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKSdkMetadata.h
================================================
/*!
* Enum representing the accepted SDK Metatadata.
* See addSdkMetadata for more details.
*/
typedef NSString *ABKSdkMetadata NS_TYPED_EXTENSIBLE_ENUM;
extern ABKSdkMetadata const ABKSdkMetadataAdjust;
extern ABKSdkMetadata const ABKSdkMetadataAirBridge;
extern ABKSdkMetadata const ABKSdkMetadataAppsFlyer;
extern ABKSdkMetadata const ABKSdkMetadataBluedot;
extern ABKSdkMetadata const ABKSdkMetadataBranch;
extern ABKSdkMetadata const ABKSdkMetadataCordova;
extern ABKSdkMetadata const ABKSdkMetadataCarthage;
extern ABKSdkMetadata const ABKSdkMetadataCocoaPods;
extern ABKSdkMetadata const ABKSdkMetadataCordovaPM;
extern ABKSdkMetadata const ABKSdkMetadataExpo;
extern ABKSdkMetadata const ABKSdkMetadataFoursquare;
extern ABKSdkMetadata const ABKSdkMetadataFlutter;
extern ABKSdkMetadata const ABKSdkMetadataGoogleTagManager;
extern ABKSdkMetadata const ABKSdkMetadataGimbal;
extern ABKSdkMetadata const ABKSdkMetadataGraddle;
extern ABKSdkMetadata const ABKSdkMetadataIonic;
extern ABKSdkMetadata const ABKSdkMetadataKochava;
extern ABKSdkMetadata const ABKSdkMetadataManual;
extern ABKSdkMetadata const ABKSdkMetadataMParticle;
extern ABKSdkMetadata const ABKSdkMetadataNativeScript;
extern ABKSdkMetadata const ABKSdkMetadataNPM;
extern ABKSdkMetadata const ABKSdkMetadataNuGet;
extern ABKSdkMetadata const ABKSdkMetadataPub;
extern ABKSdkMetadata const ABKSdkMetadataRadar;
extern ABKSdkMetadata const ABKSdkMetadataReactNative;
extern ABKSdkMetadata const ABKSdkMetadataSegment;
extern ABKSdkMetadata const ABKSdkMetadataSingular;
extern ABKSdkMetadata const ABKSdkMetadataSwiftPM;
extern ABKSdkMetadata const ABKSdkMetadataTealium;
extern ABKSdkMetadata const ABKSdkMetadataUnreal;
extern ABKSdkMetadata const ABKSdkMetadataUnityPM;
extern ABKSdkMetadata const ABKSdkMetadataUnity;
extern ABKSdkMetadata const ABKSdkMetadataVizbee;
extern ABKSdkMetadata const ABKSdkMetadataXamarin;
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKTextAnnouncementCard.h
================================================
#import "ABKCard.h"
/*
* Braze Public API: ABKTextAnnouncementCard
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKTextAnnouncementCard : ABKCard <NSCoding>
/*
* The title text for the card.
*/
@property (copy) NSString *title;
/*
* The description text for the card.
*/
@property (copy) NSString *cardDescription;
/*
* The link text for the property url, like @"blog.appboy.com". It can be displayed on the card's
* UI to indicate the action/direction of clicking on the card.
*/
@property (copy, nullable) NSString *domain;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKTwitterUser.h
================================================
#import <Foundation/Foundation.h>
/*
* Braze Public API: ABKTwitterUser
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKTwitterUser : NSObject
/*!
* The value returned from Twitter's Users API with key "description". Please refer to
* https://dev.twitter.com/overview/api/users for more information.
*/
@property (copy, nullable) NSString* userDescription;
/*!
* The value returned from Twitter's Users API with key "name". Please refer to
* https://dev.twitter.com/overview/api/users for more information.
*/
@property (copy, nullable) NSString* twitterName;
/*!
* The value returned from Twitter's Users API with key "profile_image_url". Please refer to
* https://dev.twitter.com/overview/api/users for more information.
*/
@property (copy, nullable) NSString* profileImageUrl;
/*!
* The value returned from Twitter's Users API with key "screen_name". Please refer to
* https://dev.twitter.com/overview/api/users for more information.
*/
@property (copy, nullable) NSString* screenName;
/*!
* The value returned from Twitter's Users API with key "followers_count". Please refer to
* https://dev.twitter.com/overview/api/users for more information.
*/
@property NSInteger followersCount;
/*!
* The value returned from Twitter's Users API with key "friends_count". Please refer to
* https://dev.twitter.com/overview/api/users for more information.
*/
@property NSInteger friendsCount;
/*!
* The value returned from Twitter's Users API with key "statuses_count". Please refer to
* https://dev.twitter.com/overview/api/users for more information.
*/
@property NSInteger statusesCount;
/*!
* The value returned from Twitter's Users API with key "id". Please refer to
* https://dev.twitter.com/overview/api/users for more information.
*/
@property NSInteger twitterID;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKUser.h
================================================
//
// ABKUser.h
// AppboySDK
#import <Foundation/Foundation.h>
@class ABKFacebookUser;
@class ABKTwitterUser;
@class ABKAttributionData;
NS_ASSUME_NONNULL_BEGIN
/* ------------------------------------------------------------------------------------------------------
* Enums
*/
/*!
* Genders recognized by the SDK.
*/
typedef NS_ENUM(NSInteger, ABKUserGenderType) {
ABKUserGenderMale,
ABKUserGenderFemale,
ABKUserGenderOther,
ABKUserGenderUnknown,
ABKUserGenderNotApplicable,
ABKUserGenderPreferNotToSay
};
/*!
* Convenience enum to represent notification status, for email and push notifications.
*
* OPTED_IN: subscribed, and explicitly opted in.
* SUBSCRIBED: subscribed, but not explicitly opted in.
* UNSUBSCRIBED: unsubscribed and/or explicitly opted out.
*/
typedef NS_ENUM(NSInteger, ABKNotificationSubscriptionType) {
ABKOptedIn,
ABKSubscribed,
ABKUnsubscribed
};
/*!
* When setting the custom attributes with custom keys:
* 1. The maximum key length is 255 characters; longer keys are truncated.
* 2. The maximum length for a string value in a custom attribute is 255 characters; longer values are truncated.
*/
/*
* Braze Public API: ABKUser
*/
@interface ABKUser : NSObject
/*!
* The User's first name (String)
*/
@property (nonatomic, copy, nullable) NSString *firstName;
/*!
* The User's last name (String)
*/
@property (nonatomic, copy, nullable) NSString *lastName;
/*!
* The User's email (String)
*/
@property (nonatomic, copy, nullable) NSString *email;
/*!
* The User's date of birth (NSDate)
*/
@property (nonatomic, copy, nullable) NSDate *dateOfBirth;
/*!
* The User's country (String)
*/
@property (nonatomic, copy, nullable) NSString *country;
/*!
* The User's home city (String)
*/
@property (nonatomic, copy, nullable) NSString *homeCity;
/*!
* The User's language (String)
*
* Language Strings should be valid ISO 639-1 language codes.
* See https://www.loc.gov/standards/iso639-2/php/code_list.php.
*
* If not set here, user language will be inferred from the device language.
*/
@property (nonatomic, copy, nullable) NSString *language;
/*!
* The User's phone number (String)
*/
@property (nonatomic, copy, nullable) NSString *phone;
@property (nonatomic, copy, nullable, readonly) NSString *userID;
/*!
* The User's avatar image URL. This URL will be processed by the server and used in their user profile on the
* dashboard. (String)
*/
@property (nonatomic, copy, nullable) NSString *avatarImageURL;
/*!
* The User's Facebook account information. For more detail, please refer to ABKFacebookUser.h.
*/
@property (strong, nullable) ABKFacebookUser *facebookUser;
/*!
* The User's Twitter account information. For more detail, please refer to ABKTwitterUser.h.
*/
@property (strong, nullable) ABKTwitterUser *twitterUser;
/*!
* Sets the attribution information for the user. For in apps that have an install tracking integration.
* For more information, please refer to ABKAttributionData.h.
*/
@property (strong, nullable) ABKAttributionData *attributionData;
/*!
* Adds an an alias for the current user. Individual (alias, label) pairs can exist on one and only one user.
* If a different user already has this alias or external user id, the alias attempt will be rejected
* on the server.
*
* @param alias The alias of the current user.
* @param label The label of the alias; used to differentiate it from other aliases for the user.
* @return Whether or not the alias and label are valid. Does not guarantee they won't collide with
* an existing pair.
*/
- (BOOL)addAlias:(NSString *)alias withLabel:(NSString *)label;
/*!
* @param gender ABKUserGender enum representing the user's gender.
* @return YES if the user gender is set properly
*/
- (BOOL)setGender:(ABKUserGenderType)gender;
/*!
* Sets whether or not the user should be sent email campaigns. Setting it to unsubscribed opts the user out of
* an email campaign that you create through the Braze dashboard.
*
* @param emailNotificationSubscriptionType enum representing the user's email notifications subscription type.
* @return YES if the field is set successfully, else NO.
*/
- (BOOL)setEmailNotificationSubscriptionType:(ABKNotificationSubscriptionType)emailNotificationSubscriptionType;
/*!
* Sets the push notification subscription status of the user. Used to collect information about the user.
*
* @param pushNotificationSubscriptionType enum representing the user's push notifications subscription type.
* @return YES if the field is set successfully, else NO.
*/
- (BOOL)setPushNotificationSubscriptionType:(ABKNotificationSubscriptionType)pushNotificationSubscriptionType;
/*!
* Adds the user to a Subscription Group.
*
* @param groupId The string UUID corresponding to the subscription group, provided by the Braze dashboard.
* @return YES if the user was successfully added, else NO. If not, the groupId might have been nil or invalid.
*/
- (BOOL)addToSubscriptionGroupWithGroupId:(NSString *)groupId;
/*!
* Removes the user from a Subscription Group.
*
* @param groupId The string UUID corresponding to the subscription group, provided by the Braze dashboard.
* @return YES if the user was successfully removed, else NO. If not, the groupId might have been nil or invalid.
*/
- (BOOL)removeFromSubscriptionGroupWithGroupId:(NSString *)groupId;
/*!
* @param key The String name of the custom user attribute
* @param value A boolean value to set as a custom attribute
* @return whether or not the custom user attribute was set successfully; If not, your key might have been nil or empty,
* your value might have been invalid (either nil, or not of the correct type), or you tried to set a value for
* one of the reserved keys. Please check the log for more details about the specific failure you encountered.
*/
- (BOOL)setCustomAttributeWithKey:(NSString *)key andBOOLValue:(BOOL)value;
/*!
* @param key The String name of the custom user attribute
* @param value An integer value to set as a custom attribute
* @return whether or not the custom user attribute was set successfully; If not, your key might have been nil or empty,
* your value might have been invalid (either nil, or not of the correct type), or you tried to set a value for
* one of the reserved keys. Please check the log for more details about the specific failure you encountered.
*/
- (BOOL)setCustomAttributeWithKey:(NSString *)key andIntegerValue:(NSInteger)value;
/*!
* @param key The String name of the custom user attribute
* @param value A double value to set as a custom attribute
* @return whether or not the custom user attribute was set successfully; If not, your key might have been nil or empty,
* your value might have been invalid (either nil, or not of the correct type), or you tried to set a value for
* one of the reserved keys. Please check the log for more details about the specific failure you encountered.
*/
- (BOOL)setCustomAttributeWithKey:(NSString *)key andDoubleValue:(double)value;
/*!
* @param key The String name of the custom user attribute
* @param value An NSString value to set as a custom attribute
* @return whether or not the custom user attribute was set successfully; If not, your key might have been nil or empty,
* your value might have been invalid (either nil, or not of the correct type), or you tried to set a value for
* one of the reserved keys. Please check the log for more details about the specific failure you encountered.
*/
- (BOOL)setCustomAttributeWithKey:(NSString *)key andStringValue:(NSString *)value;
/*!
* @param key The String name of the custom user attribute
* @param value An NSDate value to set as a custom attribute
* @return whether or not the custom user attribute was set successfully; If not, your key might have been nil or empty,
* your value might have been invalid (either nil, or not of the correct type), or you tried to set a value for
* one of the reserved keys. Please check the log for more details about the specific failure you encountered.
*/
- (BOOL)setCustomAttributeWithKey:(NSString *)key andDateValue:(NSDate *)value;
/*!
* @param key The String name of the custom user attribute to unset
* @return whether or not the custom user attribute was unset successfully
*/
- (BOOL)unsetCustomAttributeWithKey:(NSString *)key;
/**
* Increments the value of an custom attribute by one. Only integer and long custom attributes can be incremented.
* Attempting to increment a custom attribute that is not an integer or a long will be ignored. If you increment a
* custom attribute that has not previously been set, a custom attribute will be created and assigned a value of one.
*
* @param key The identifier of the custom attribute
* @return YES if the increment for the custom attribute of given key is saved
*/
- (BOOL)incrementCustomUserAttribute:(NSString *)key;
/**
* Increments the value of an custom attribute by a given amount. Only integer and long custom attributes can be
* incremented. Attempting to increment a custom attribute that is not an integer or a long will be ignored. If
* you increment a custom attribute that has not previously been set, a custom attribute will be created and assigned
* the value of incrementValue. To decrement the value of a custom attribute, use a negative incrementValue.
*
* @param key The identifier of the custom attribute
* @param incrementValue The amount by which to increment the custom attribute
* @return YES if the increment for the custom attribute of given key is saved
*/
- (BOOL)incrementCustomUserAttribute:(NSString *)key by:(NSInteger)incrementValue;
/**
* Adds the string value to a custom attribute string array specified by the key. If you add a key that has not
* previously been set, a custom attribute string array will be created containing the value.
*
* @param key The custom attribute key
* @param value A string to be added to the custom attribute string array
* @return YES if the operation was successful
*/
- (BOOL)addToCustomAttributeArrayWithKey:(NSString *)key value:(NSString *)value;
/**
* Removes the string value from a custom attribute string array specified by the key. If you remove a key that has not
* previously been set, nothing will be changed.
*
* @param key The custom attribute key
* @param value A string to be removed from the custom attribute string array
* @return YES if the operation was successful
*/
- (BOOL)removeFromCustomAttributeArrayWithKey:(NSString *)key value:(NSString *)value;
/**
* Sets a string array from a custom attribute specified by the key.
*
* @param key The custom attribute key
* @param valueArray A string array to set as a custom attribute. If this value is nil, then Braze will unset the custom
* attribute and remove the corresponding array if there is one.
* @return YES if the operation was successful
*/
- (BOOL)setCustomAttributeArrayWithKey:(NSString *)key array:(nullable NSArray *)valueArray;
/*!
* Sets the last known location for the user. Intended for use with ABKDisableLocationAutomaticTrackingOptionKey set to YES
* when starting Braze, so that the only locations being set are by the integrating app. Otherwise, calls to this
* method will be contending with automatic location update events.
*
* @param latitude The latitude of the User's location in degrees, the number should be in the range of [-90, 90]
* @param longitude The longitude of the User's location in degrees, the number should be in the range of [-180, 180]
* @param horizontalAccuracy The accuracy of the User's horizontal location in meters, the number should not be negative
*/
- (BOOL)setLastKnownLocationWithLatitude:(double)latitude longitude:(double)longitude horizontalAccuracy:(double)horizontalAccuracy;
/*!
* Sets the last known location for the user. Intended for use with ABKDisableLocationAutomaticTrackingOptionKey set to YES
* when starting Braze, so that the only locations being set are by the integrating app. Otherwise, calls to this
* method will be contending with automatic location update events.
*
* @param latitude The latitude of the User's location in degrees, the number should be in the range of [-90, 90]
* @param longitude The longitude of the User's location in degrees, the number should be in the range of [-180, 180]
* @param horizontalAccuracy The accuracy of the User's horizontal location in meters, the number should not be negative
* @param altitude The altitude of the User's location in meters
* @param verticalAccuracy The accuracy of the User's vertical location in meters, the number should not be negative
*/
- (BOOL)setLastKnownLocationWithLatitude:(double)latitude
longitude:(double)longitude
horizontalAccuracy:(double)horizontalAccuracy
altitude:(double)altitude
verticalAccuracy:(double)verticalAccuracy;
/*!
* Adds the location custom attribute for the user.
*
* @param key The custom attribute key
* @param latitude The latitude of the location in degrees, the number should be in the range of [-90, 90]
* @param longitude The longitude of the location in degrees, the number should be in the range of [-180, 180]
*/
- (BOOL)addLocationCustomAttributeWithKey:(NSString *)key
latitude:(double)latitude
longitude:(double)longitude;
/*!
* Removes the location custom attribute for the user.
*
* @param key The custom attribute key
*/
- (BOOL)removeLocationCustomAttributeWithKey:(NSString *)key;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/Appboy.h
================================================
//
// Appboy.h
// AppboySDK
/*!
\mainpage
This site contains technical documentation for the %Braze iOS SDK. Click on the "Classes" link above to
view the %Braze public interface classes and start integrating the SDK into your app!
*/
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <UserNotifications/UserNotifications.h>
#import "ABKSdkMetadata.h"
#ifndef APPBOY_SDK_VERSION
#define APPBOY_SDK_VERSION @"4.7.0"
#endif
#if !TARGET_OS_TV
@class ABKInAppMessageController;
@class ABKInAppMessage;
@class ABKInAppMessageViewController;
#endif
@class ABKUser;
@class ABKFeedController;
@class ABKContentCardsController;
@class ABKLocationManager;
@protocol ABKInAppMessageControllerDelegate;
@protocol ABKIDFADelegate;
@protocol ABKURLDelegate;
@protocol ABKImageDelegate;
@protocol ABKSdkAuthenticationDelegate;
NS_ASSUME_NONNULL_BEGIN
/* ------------------------------------------------------------------------------------------------------
* Keys for Braze startup options
*/
/*!
* If you want to set the request policy at app startup time (useful for avoiding any automatic data requests made by
* Braze at startup if you're looking to have full manual control). You can include one of the
* ABKRequestProcessingPolicy enum values as the value for the ABKRequestProcessingPolicyOptionKey in the appboyOptions
* dictionary.
*/
extern NSString *const ABKRequestProcessingPolicyOptionKey;
/*!
* Sets the data flush interval (in seconds). This only has an effect when the request processing mode is set to
* ABKAutomaticRequestProcessing (which is the default). Values are converted into NSTimeIntervals and must be greater
* than 1.0.
*/
extern NSString *const ABKFlushIntervalOptionKey;
/*!
* This key can be set to YES or NO and will configure whether Braze will automatically collect location (if the user permits).
* If set to YES, Braze will collect location if authorized.
* If it is set to NO or omitted, location will not be recorded for the user unless you manually
* call setUserLastKnownLocation on ABKUser.
*/
extern NSString *const ABKEnableAutomaticLocationCollectionKey;
/*!
* This key can be set to YES or NO and will configure whether geofences are enabled.
* If set to YES, geofences will be enabled.
* If set to NO, geofences will be disabled.
* If the field is omitted, we will use the value of ABKEnableAutomaticLocationCollectionKey.
*/
extern NSString *const ABKEnableGeofencesKey;
/*!
* This key can be set to YES or NO and will configure whether geofence requests are made automatically.
* If set to YES, geofence requests will not be made automatically.
* If set to NO, geofence requests will be made automatically. This is the default value when you have geofences enabled.
*/
extern NSString *const ABKDisableAutomaticGeofenceRequestsKey;
/*!
* This key can be set to an instance of a class that extends ABKIDFADelegate, which can be used to pass advertiser tracking information to to Braze.
*/
extern NSString *const ABKIDFADelegateKey;
/*!
* This key can be set to a custom API endpoint. This gets sent in the format sdk.api.braze.eu.
*/
extern NSString *const ABKEndpointKey;
/*!
* This key can be set to an instance of a class that conforms to the ABKURLDelegate protocol, allowing it to handle URLs in a custom way.
*/
extern NSString *const ABKURLDelegateKey;
/*!
* This can can be set to an instance of a class that conforms to the ABKImageDelegate protocol, allowing flexibility for using custom image libraries.
*/
extern NSString *const ABKImageDelegateKey;
/*!
* This key can be set to an instance of a class that conforms to the ABKInAppMessageControllerDelegate protocol, allowing it to handle in-app messages in a custom way.
*/
extern NSString *const ABKInAppMessageControllerDelegateKey;
/*!
* This key can be set YES or NO and will configure whether a modal in-app message will be dismissed when the user clicks
* outside of the in-app message.
* If set to YES, the in-app message will be dismissed.
* If set to NO, the in-app message will not be dismissed. This is the default value.
*/
extern NSString *const ABKEnableDismissModalOnOutsideTapKey;
/*!
* This key can be set YES or NO and will configure whether the SDK Authentication feature is enabled.
*/
extern NSString *const ABKEnableSDKAuthenticationKey;
/*!
* This key can can be set to an instance of a class that conforms to the ABKSdkAuthenticationDelegate protocol, allowing it to handle
* SDK Authentication errors. Setting this delegate will cause the delegate method `handleSdkAuthenticationError:` to get called in
* the event of an SDK Authentication error.
*/
extern NSString *const ABKSdkAuthenticationDelegateKey;
/*!
* Set the time interval for session time out (in seconds). This will affect the case when user has a session shorter than
* the set time interval. In that case, the session won't be close even though the user closed the app, but will continue until
* it times out. The value should be an integer bigger than 0.
*/
extern NSString *const ABKSessionTimeoutKey;
/*!
* Set the minimum time interval in seconds between triggers. After a trigger happens, we will ignore any triggers until
* the minimum time interval elapses. The default value is 30s. The minimum valid value is 0s.
*/
extern NSString *const ABKMinimumTriggerTimeIntervalKey;
/*!
* Key to report the SDK flavor currently being used. For internal use only.
*/
extern NSString *const ABKSDKFlavorKey;
/*!
* Key to specify an allowlist for device fields that are collected by the Braze SDK.
*
* To specify allowlisted device fields, assign the bitwise `OR` of desired fields to this key. Fields are defined
* in `ABKDeviceOptions`. To turn off all fields, set the value of this key to `ABKDeviceOptionNone`. By default,
* all fields are collected.
*/
extern NSString *const ABKDeviceAllowlistKey;
/*!
* This key is deprecated in favor of ABKDeviceAllowlistKey. See ABKDeviceAllowlistKey for more details.
*/
extern NSString *const ABKDeviceWhitelistKey __deprecated_msg("ABKDeviceWhitelistKey is deprecated. Please use ABKDeviceAllowlistKey instead.");
extern NSString *const ABKEphemeralEventsKey;
/*!
* This key can be set to a string value representing the app group name for the Push Story Notification
* Content extension. This is required for the SDK to fetch data from and handle user interactions
* with the Push Story app extension.
*/
extern NSString *const ABKPushStoryAppGroupKey;
/*!
* This key can be set to an integer value to specify the level of the log statements output by the Braze SDK.
*
* The default log level is 8 and will minimally log info. To enable verbose logging for debugging, use log level 0.
*
* This selection will override any LogLevel value set in the Info.plist.
*/
extern NSString *const ABKLogLevelKey;
/* ------------------------------------------------------------------------------------------------------
* Enums
*/
/*!
* Possible values for the SDK's request processing policies:
* ABKAutomaticRequestProcessing (default) - All server communication is handled automatically. This includes flushing
* analytics data to the server, updating the feed, and requesting new in-app messages. Braze's
* communication policy is to perform immediate server requests when user facing data is required (new in-app messages,
* feed refreshes, etc.), and to otherwise perform periodic flushes of new analytics data every few seconds.
* The interval between periodic flushes can be set explicitly using the ABKFlushInterval startup option.
* ABKAutomaticRequestProcessingExceptForDataFlush - Deprecated. Use ABKManualRequestProcessing.
* ABKManualRequestProcessing - The same as ABKAutomaticRequestProcessing, except that updates to
* custom attributes and triggering of custom events will not automatically flush to the server. Instead, you
* must call requestImmediateDataFlush when you want to synchronize newly updated user data with Braze. Note that
* the configuration does not turn off all networking, i.e. requests important to the proper functionality of the Braze
* SDK will still occur.
*
* Regardless of policy, Braze will intelligently combine requests on the request queue to minimize the total number of
* requests and their combined payload.
*/
typedef NS_ENUM(NSInteger, ABKRequestProcessingPolicy) {
ABKAutomaticRequestProcessing,
ABKManualRequestProcessing,
ABKAutomaticRequestProcessingExceptForDataFlush __deprecated_enum_msg("ABKAutomaticRequestProcessingExceptForDataFlush is deprecated. Use ManualRequestProcessing.") = ABKManualRequestProcessing
};
/*!
* Internal enum used to report the SDK flavor being used.
*/
typedef NS_ENUM(NSInteger , ABKSDKFlavor) {
UNITY = 1,
REACT,
CORDOVA,
XAMARIN,
FLUTTER,
SEGMENT,
MPARTICLE,
TEALIUM
};
typedef NS_OPTIONS(NSUInteger, ABKDeviceOptions) {
ABKDeviceOptionNone = 0,
ABKDeviceOptionResolution = (1 << 0),
ABKDeviceOptionCarrier = (1 << 1),
ABKDeviceOptionLocale = (1 << 2),
ABKDeviceOptionModel = (1 << 3),
ABKDeviceOptionOSVersion = (1 << 4),
// Note: The ABKDeviceOptionIDFV allowlist key currently has no effect.
// IDFV is read regardless of allowlist settings due to its
// role as the primary device identifier within the Braze system.
ABKDeviceOptionIDFV = (1 << 5),
ABKDeviceOptionIDFA = (1 << 6),
ABKDeviceOptionPushEnabled = (1 << 7),
ABKDeviceOptionTimezone = (1 << 8),
ABKDeviceOptionPushAuthStatus = (1 << 9),
ABKDeviceOptionAdTrackingEnabled = (1 << 10),
ABKDeviceOptionPushDisplayOptions = (1 << 11),
ABKDeviceOptionAll = ~ABKDeviceOptionNone
};
/*!
* Possible channels supported by the SDK.
*/
typedef NS_ENUM(NSInteger, ABKChannel) {
ABKPushNotificationChannel,
ABKInAppMessageChannel,
ABKNewsFeedChannel,
ABKContentCardChannel,
ABKUnknownChannel __deprecated_enum_msg("ABKUnknownChannel will be removed in a future update.")
};
/*
* Braze Public API: Appboy
*/
@interface Appboy : NSObject
/* ------------------------------------------------------------------------------------------------------
* Initialization
*/
/*!
* Get the Appboy singleton. Returns nil if accessed before startWithApiKey: called.
*/
+ (nullable Appboy *)sharedInstance;
/*!
* Get the Appboy singleton. Throws an exception if accessed before startWithApiKey: is called.
*/
+ (nonnull Appboy *)unsafeInstance;
/*!
* @param apiKey The app's API key
* @param application the current app
* @param launchOptions The options NSDictionary that you get from application:didFinishLaunchingWithOptions
*
* @discussion Starts up Braze and tells it that your app is done launching. You should call this
* method in your App Delegate application:didFinishLaunchingWithOptions method before calling makeKeyAndVisible,
* accessing [Appboy sharedInstance] or otherwise rendering Braze view controllers. Your apiKey comes from
* the Braze dashboard where you registered your app.
*/
+ (void)startWithApiKey:(NSString *)apiKey
inApplication:(UIApplication *)application
withLaunchOptions:(nullable NSDictionary *)launchOptions;
/*!
* @param apiKey The app's API key
* @param application The current app
* @param launchOptions The options NSDictionary that you get from application:didFinishLaunchingWithOptions
* @param appboyOptions An optional NSDictionary with startup configuration values for Braze. See below
* for more information.
*
* @discussion Starts up Braze and tells it that your app is done launching. You should call this
* method in your App Delegate application:didFinishLaunchingWithOptions method before calling makeKeyAndVisible,
* accessing [Appboy sharedInstance] or otherwise rendering Braze view controllers. Your apiKey comes from
* the Braze dashboard where you registered your app.
*/
+ (void)startWithApiKey:(NSString *)apiKey
inApplication:(UIApplication *)application
withLaunchOptions:(nullable NSDictionary *)launchOptions
withAppboyOptions:(nullable NSDictionary *)appboyOptions;
/* ------------------------------------------------------------------------------------------------------
* Properties
*/
/*!
* The current app user.
* See ABKUser.h and changeUser:userId below.
*/
@property (readonly) ABKUser *user;
@property (readonly) ABKFeedController *feedController;
@property (readonly) ABKContentCardsController *contentCardsController;
/*!
* The policy regarding processing of network requests by the SDK. See the enumeration values for more information on
* possible options. This value can be set at runtime, or can be injected in at startup via the appboyOptions dictionary.
*
* Any time the request processing policy is set to manual, any scheduled flush of the queue is canceled, but if the
* request queue was already processing, the current queue will finish processing. If you need to cancel in flight
* requests, you need to call <pre>[[Appboy sharedInstance] shutdownServerCommunication]</pre>.
*
* Setting the request policy does not automatically cause a flush to occur, it just allows for a flush to be scheduled
* the next time an eligible request is enqueued. To force an immediate flush after changing the request processing
* policy, invoke <pre>[[Appboy sharedInstance] requestImmediateDataFlush]</pre>.
*/
@property ABKRequestProcessingPolicy requestProcessingPolicy;
/*!
* A class extending ABKIDFADelegate can be set to provide the IDFA to Braze.
*/
@property (nonatomic, strong, nullable) id<ABKIDFADelegate> idfaDelegate;
/*!
* A class conforming to ABKSdkAuthenticationDelegate can be set to handle SDK Authentication errors.
*/
@property (nonatomic, strong, nullable) id<ABKSdkAuthenticationDelegate> sdkAuthenticationDelegate;
/*!
* A custom `NSURLSessionConfiguration` for configuring network session parameters.
*/
@property (nonatomic, readonly) NSURLSessionConfiguration *urlSessionConfiguration;
#if !TARGET_OS_TV
/*!
* The current in-app message manager.
* See ABKInAppMessageController.h.
*/
@property (readonly) ABKInAppMessageController *inAppMessageController;
/*!
* The Braze location manager provides access to location related functionality in the Braze SDK.
* See ABKLocationManager.h.
*/
@property (nonatomic, readonly) ABKLocationManager *locationManager;
/*!
* A class conforming to the ABKURLDelegate protocol can be set to handle URLs in a custom way.
*/
@property (nonatomic, weak, nullable) id<ABKURLDelegate> appboyUrlDelegate;
/*!
* A class conforming to ABKImageDelegate can be set to use a custom image library.
*/
@property (nonatomic, strong, nullable) id<ABKImageDelegate> imageDelegate;
/*!
* Property for internal reporting of SDK flavor.
*/
@property (nonatomic) ABKSDKFlavor sdkFlavor;
#endif
/* ------------------------------------------------------------------------------------------------------
* Methods
*/
/*!
* Enqueues a data flush request for the current user and immediately starts processing the network queue. Note that if
* the queue already contains another request for the current user, that the new data flush request
* will be merged into the already existing request and only one will execute for that user.
*
* If you're using ABKManualRequestProcessing, you only need to call this when you want to force
* an immediate flush of updated user data.
*/
- (void)requestImmediateDataFlush;
- (void)flushDataAndProcessRequestQueue __deprecated_msg("Please use `requestImmediateDataFlush` instead.");
/*!
* Stops all in flight server communication and enables manual request processing control to ensure that no automatic
* network activity occurs. You should usually only call shutdownServerCommunication if the OS is forcing you to stop
* background tasks upon exit of your application. To continue normal operation after calling this, you will need to
* explicitly set the request processing mode back to your desired state.
*/
- (void)shutdownServerCommunication;
/*!
* @param userId The new user's ID (from the host application).
*
* @discussion
* This method changes the user's ID. These user IDs should be private and not easily obtained (e.g. not a plain
* email address or username).
*
* When you first start using Braze on a device, the user is considered "anonymous". You can use this method to
* optionally identify a user with a unique ID, which enables the following:
*
* - If the same user is identified on another device, their user profile, usage history and event history will
* be shared across devices.
*
* - If your app is used by multiple people, you can assign each of them a unique identifier to track them
* separately. Only the most recent user on a particular device will receive push notifications and in-app
* messages.
*
* - If you identify a user which has never been identified on another device, the entire history of that user as
* an "anonymous" user on this device will be preserved and associated with the newly identified user.
*
* - However, if you identify a user which *has* been identified on another device, the previous anonymous
* history of the user on this device will not be added to the already existing profile for that user.
*
* - Note that switching from one an anonymous user to an identified user or from one identified user to another is
* a relatively costly operation. When you request the
* user switch, the current session for the previous user is automatically closed and a new session is started.
* Braze will also automatically make a data refresh request to get the news feed, in-app message and other information
* for the new user.
*
* Note: Once you identify a user, you cannot go back to the "anonymous" profile. The transition from anonymous
* to identified tracking only happens once because the initial anonymous user receives special treatment
* to allow for preservation of their history. We recommend against changing the user id just because your app
* has entered a "logged out" state because it separates this device from the user profile and thus you will be
* unable to target the previously logged out user with re-engagement campaigns. If you anticipate multiple
* users on the same device, but only want to target one of them when your app is in a logged out state, we recommend
* separately keeping track of the user ID you want to target while logged out and switching back to
* that user ID as part of your app's logout process.
*/
- (void)changeUser:(NSString *)userId;
/*!
* @param userId The new user's ID (from the host application)
* @param signature The SDK Authentication signature for the user being identified.
*
* @discussion See documantation for `changeUser:` above
*/
- (void)changeUser:(NSString *)userId sdkAuthSignature:(nullable NSString *)signature;
/*!
* @param signature The SDK Authentication signature for the current user
*
* @discussion Sets the signature used for SDK authentication for the current user.
*/
- (void)setSdkAuthenticationSignature:(NSString *)signature;
/*!
* @discussion Unsubscribe from SDK Authentication errors. After this method is called,
* the ABKSdkAuthenticationDelegate method `handleSdkAuthenticationError:` will not be called in the event of
* an SDK Authentication error.
*/
- (void)unsubscribeFromSdkAuthenticationErrors;
/*!
* @param eventName The name of the event to log.
*
* @discussion Adds an app specific event to event tracking log that's lazily pushed up to the server. Think of
* events like counters. That is, each time you log an event, we'll update a counter for that user. Events should be
* fairly broad like "beat level 1" or "watched video" instead of something more specific like "watched Katy
* Perry's Last Friday Night" so you can create more broad user segments for targeting.
*
* <pre>
* [[Appboy sharedInstance] logCustomEvent:@"clicked_button"];
* </pre>
*/
- (void)logCustomEvent:(NSString *)eventName;
/*!
* @param eventName The name of the event to log.
* @param properties An <code>NSDictionary</code> of properties to associate with this purchase. Property keys are non-empty <code>NSString</code> objects with
* <= 255 characters and no leading dollar signs. Property values can be <code>NSNumber</code> booleans, integers, floats < 62 bits, <code>NSDate</code> objects,
* <code>NSString</code> objects with <= 255 characters, or any JSON Encodable object including NSArray and NSDictionary of the previous data types (nested properties). Total length of encoded properties must be under 50 KB.
*
* @discussion Adds an app specific event to event tracking log that's lazily pushed up to the server. Think of
* events like counters. That is, each time you log an event, we'll update a counter for that user. Events should be
* fairly broad like "beat level 1" or "watched video" instead of something more specific like "watched Katy
* Perry's Last Friday Night" so you can create more broad user segments for targeting.
*
* <pre>
* [[Appboy sharedInstance] logCustomEvent:@"clicked_button" properties:@{@"key1":@"val"}];
* </pre>
*/
- (void)logCustomEvent:(NSString *)eventName withProperties:(nullable NSDictionary *)properties;
/*!
* This method is equivalent to calling logPurchase:inCurrency:atPrice:withQuantity:andProperties: with a quantity of 1 and nil properties.
* Please see logPurchase:inCurrency:atPrice:withQuantity:andProperties: for more information.
*/
- (void)logPurchase:(NSString *)productIdentifier inCurrency:(NSString *)currencyCode atPrice:(NSDecimalNumber *)price;
/*!
* This method is equivalent to calling logPurchase:inCurrency:atPrice:withQuantity:andProperties with a quantity of 1.
* Please see logPurchase:inCurrency:atPrice:withQuantity:andProperties: for more information.
*/
- (void)logPurchase:(NSString *)productIdentifier inCurrency:(NSString *)currencyCode atPrice:(NSDecimalNumber *)price withProperties:(nullable NSDictionary *)properties;
/*!
* This method is equivalent to calling logPurchase:inCurrency:atPrice:withQuantity:andProperties with nil properties.
* Please see logPurchase:inCurrency:atPrice:withQuantity:andProperties: for more information.
*/
- (void)logPurchase:(NSString *)productIdentifier inCurrency:(NSString *)currencyCode atPrice:(NSDecimalNumber *)price withQuantity:(NSUInteger)quantity;
/*!
* @param productIdentifier A String indicating the product that was purchased. Usually the product identifier in the
* iTunes store.
* @param currencyCode Currencies should be represented as an ISO 4217 currency code. Prices should
* be sent in decimal format, with the same base units as are provided by the SKProduct class. Callers of this method
* who have access to the NSLocale object for the purchase in question (which can be obtained from SKProduct listings
* provided by StoreKit) can obtain the currency code by invoking:
* <pre>[locale objectForKey:NSLocaleCurrencyCode]</pre>
* Supported currency symbols include: AED, AFN, ALL, AMD, ANG, AOA, ARS, AUD, AWG, AZN, BAM, BBD, BDT, BGN, BHD, BIF,
* BMD, BND, BOB, BRL, BSD, BTC, BTN, BWP, BYR, BZD, CAD, CDF, CHF, CLF, CLP, CNY, COP, CRC, CUC, CUP, CVE, CZK, DJF,
* DKK, DOP, DZD, EEK, EGP, ERN, ETB, EUR, FJD, FKP, GBP, GEL, GGP, GHS, GIP, GMD, GNF, GTQ, GYD, HKD, HNL, HRK, HTG, HUF,
* IDR, ILS, IMP, INR, IQD, IRR, ISK, JEP, JMD, JOD, JPY, KES, KGS, KHR, KMF, KPW, KRW, KWD, KYD, KZT, LAK, LBP, LKR, LRD,
* LSL, LTL, LVL, LYD, MAD, MDL, MGA, MKD, MMK, MNT, MOP, MRO, MTL, MUR, MVR, MWK, MXN, MYR, MZN, NAD, NGN, NIO, NOK, NPR,
* NZD, OMR, PAB, PEN, PGK, PHP, PKR, PLN, PYG, QAR, RON, RSD, RUB, RWF, SAR, SBD, SCR, SDG, SEK, SGD, SHP, SLL, SOS, SRD,
* STD, SVC, SYP, SZL, THB, TJS, TMT, TND, TOP, TRY, TTD, TWD, TZS, UAH, UGX, USD, UYU, UZS, VEF, VND, VUV, WST, XAF, XAG,
* XAU, XCD, XDR, XOF, XPD, XPF, XPT, YER, ZAR, ZMK, ZMW and ZWL. Any other provided currency symbol will result in a logged
* warning and no other action taken by the SDK.
* @param price Prices should be reported as NSDecimalNumber objects. Base units are treated the same as with SKProduct
* from StoreKit and depend on the currency. As an example, USD should be reported as Dollars.Cents, whereas JPY should
* be reported as a whole number of Yen. All provided NSDecimalNumber values will have NSRoundPlain rounding applied
* such that a maximum of two digits exist after their decimal point.
* @param quantity An unsigned number to indicate the purchase quantity. This number must be greater than 0 but no larger than 100.
* @param properties An <code>NSDictionary</code> of properties to associate with this purchase. Property keys are non-empty <code>NSString</code> objects with
* <= 255 characters and no leading dollar signs. Property values can be <code>NSNumber</code> integers, floats, booleans < 62 bits in length, <code>NSDate</code> objects or
* <code>NSString</code> objects with <= 255 characters.
*
* @discussion Logs a purchase made in the application.
*
* Note: Braze supports purchases in multiple currencies. Purchases that you report in a currency other than USD will
* be shown in the dashboard in USD based on the exchange rate at the date they were reported.
*/
- (void)logPurchase:(NSString *)productIdentifier inCurrency:(NSString *)currencyCode atPrice:(NSDecimalNumber *)price withQuantity:(NSUInteger)quantity andProperties:(nullable NSDictionary *)properties;
/*!
* If you're displaying cards on your own instead of using ABKFeedViewController, you should still report impressions of
* the news feed back to Braze with this method so that your campaign reporting features still work in the dashboard.
*/
- (void)logFeedDisplayed;
/*!
* If you're displaying content cards on your own instead of using ABKContentCardsViewController, you should still report
* impressions of the content cards back to Braze with this method so that your campaign reporting features still work
* in the dashboard.
*/
- (void)logContentCardsDisplayed;
/*!
* Enqueues a news feed request for the current user. Note that if the queue already contains another request for the
* current user, that the new feed request will be merged into the already existing request and only one will execute
* for that user.
*
* When the new cards for news feed return from Braze server, the SDK will post an ABKFeedUpdatedNotification with an
* ABKFeedUpdatedIsSuccessfulKey in the notification's userInfo dictionary to indicate if the news feed request is successful
* or not. For more detail about the ABKFeedUpdatedNotification and the ABKFeedUpdatedIsSuccessfulKey, please check ABKFeedController.
*/
- (void)requestFeedRefresh;
/*!
* Enqueues a content cards request for the current user.
*/
- (void)requestContentCardsRefresh;
/*!
* Manually request geofences with a specific location.
*/
- (void)requestGeofencesWithLongitude:(double)longitude latitude:(double)latitude;
/*!
* Get the device ID - the IDFV - which will reset if all apps for a given vendor are removed from the device.
*
* @return The device ID.
*/
- (NSString *)getDeviceId;
#if !TARGET_OS_TV
/*!
* @param deviceToken The device's push token.
*
* @discussion This method posts a token to Braze servers to associate the token with the current device.
*/
- (void)registerDeviceToken:(NSData *)deviceToken;
/*!
* @param application The app's UIApplication object
* @param notification An NSDictionary passed in from the didReceiveRemoteNotification call
*
* @discussion This method forwards remote notifications to Braze. Call it from the application:didReceiveRemoteNotification
* method of your App Delegate.
*/
- (void)registerApplication:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification NS_DEPRECATED_IOS(3_0, 10_0, "`registerApplication:didReceiveRemoteNotification:` is deprecated in iOS 10, please use `registerApplication:didReceiveRemoteNotification:fetchCompletionHandler:` instead.");
/*!
* @param application The app's UIApplication object
* @param notification An NSDictionary passed in from the didReceiveRemoteNotification:fetchCompletionHandler: call
* @param completionHandler A block passed in from the didReceiveRemoteNotification:fetchCompletionHandler: call
*
* @discussion This method forwards remote notifications to Braze. If the completionHandler is passed in when
* the method is called, Braze will call the completionHandler. However, if the completionHandler is not passed in,
* it is the host app's responsibility to call the completionHandler.
* Call it from the application:didReceiveRemoteNotification:fetchCompletionHandler: method of your App Delegate.
*/
- (void)registerApplication:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)notification
fetchCompletionHandler:(nullable void (^)(UIBackgroundFetchResult))completionHandler;
/*!
* @param identifier The action identifier passed in from the handleActionWithIdentifier:forRemoteNotification:.
* @param userInfo An NSDictionary passed in from the handleActionWithIdentifier:forRemoteNotification: call.
* @param completionHandler A block passed in from the didReceiveRemoteNotification:fetchCompletionHandler: call
*
* @discussion This method forwards remote notifications and the custom action chosen by user to Braze. Call it from
* the application:handleActionWithIdentifier:forRemoteNotification: method of your App Delegate.
*/
- (void)getActionWithIdentifier:(NSString *)identifier
forRemoteNotification:(NSDictionary *)userInfo
completionHandler:(nullable void (^)(void))completionHandler NS_DEPRECATED_IOS(8_0, 10_0,"`getActionWithIdentifier:forRemoteNotification:completionHandler:` is deprecated in iOS 10, please use `userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:` instead.");
/*!
* @param center The app's current UNUserNotificationCenter object
* @param response The UNNotificationResponse object passed in from the didReceiveNotificationResponse:withCompletionHandler: call
* @param completionHandler A block passed in from the didReceiveNotificationResponse:withCompletionHandler: call. Braze will call
* it at the end of the method if one is passed in. If you prefer to handle the completionHandler youself, please pass nil to Braze.
*
* @discussion This method forwards the response of the notification to Braze after user interacted with the notification.
* Call it from the userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler: method of your App Delegate.
*/
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
withCompletionHandler:(nullable void (^)(void))completionHandler NS_AVAILABLE_IOS(10_0);
/*!
* @param pushAuthGranted The boolean value passed in from completionHandler in UNUserNotificationCenter's
* requestAuthorizationWithOptions:completionHandler: method, which indicates if the push authorization
* was granted or not.
*
* @discussion This method forwards the push authorization result to Braze after the user interacts with
* the notification prompt.
* Call it from the UNUserNotificationCenter's requestAuthorizationWithOptions:completionHandler: method
* when you prompt users to enable push.
*/
- (void)pushAuthorizationFromUserNotificationCenter:(BOOL)pushAuthGranted;
#endif
/*!
* Adds SDK Metadata values to those automatically collected by the SDK.
*
* Metadata tell Braze how the SDK is integrated (e.g. wrapper, package manager, etc.)
*
* @param metadata The metadata values reflecting the current SDK integration.
*/
- (void)addSdkMetadata:(NSArray<ABKSdkMetadata> *)metadata;
/* ------------------------------------------------------------------------------------------------------
* Data processing configuration methods.
*/
/*!
* @discussion This method immediately wipes all data from the Braze iOS SDK. After this method is
* called, the sharedInstance singleton will be nulled out and Braze functionality will be disabled
* until the next call to startWithApiKey: in a subsequent app run. All references to the previous
* singleton should be released.
*
* Note that the next call to startWithApiKey: must take place in a subsequent app run. Initializing the SDK
* within the same app run after calling this method is not supported.
*
* The SDK will automatically re-enable itself when startWithApiKey: is called. There is
* no need to call requestEnableSDKOnNextAppRun: to re-enable the SDK. wipeDataAndDisableForAppRun:
* may be used at any time, including while the SDK is otherwise disabled.
*
* Note that if you are using unsafeInstance:, further calls to unsafeInstance: after using this
* method will cause an uncaught exception to be thrown. We do not recommend using this method in
* concert with unsafeInstance:.
*/
+ (void)wipeDataAndDisableForAppRun;
/*!
* @discussion This method immediately disables the Braze iOS SDK. After this method is called, the
* sharedInstance singleton will be nulled out and Braze functionality will be disabled until the
* SDK is re-enabled via a call to requestEnableSDKOnNextAppRun: and re-initialized in a subsequent
* app run via a call to startWithApiKey:. All references to the previous singleton should be released.
*
* Note that the next call to startWithApiKey: must take place in a subsequent app run. Initializing the SDK
* within the same app run after calling this method is not supported.
*
* Unlike with wipeDataAndDisableForAppRun:, calling requestEnableSDKOnNextAppRun: is required to
* re-enable the SDK after the method is called.
*
* Note that if you are using unsafeInstance:, further calls to unsafeInstance: after using this
* method will cause an exception to be thrown. We do not recommend using this method in concert
* with unsafeInstance:.
*/
+ (void)disableSDK;
/*!
* @discussion This method requests the Braze iOS SDK to be re-enabled on the next app run.
* After this method is called, the following call to startWithApiKey: will successfully
* re-enable the SDK. Braze functionality will remain disabled until that point.
*
* Note that this method does not re-initialize the Appboy singleton on its own nor re-enable
* Braze functionality immediately.
*/
+ (void)requestEnableSDKOnNextAppRun;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/AppboyKit.h
================================================
#import "Appboy.h"
#import "ABKUser.h"
#import "ABKFacebookUser.h"
#import "ABKTwitterUser.h"
#import "ABKAttributionData.h"
// Cards
#import "ABKCard.h"
#import "ABKBannerCard.h"
#import "ABKCaptionedImageCard.h"
#import "ABKClassicCard.h"
#import "ABKTextAnnouncementCard.h"
// Content Card
#import "ABKContentCard.h"
#import "ABKBannerContentCard.h"
#import "ABKCaptionedImageContentCard.h"
#import "ABKClassicContentCard.h"
// SDK Authentication
#import "ABKSdkAuthenticationError.h"
#import "ABKSdkAuthenticationDelegate.h"
#if !TARGET_OS_TV
// In-app Message
#import "ABKInAppMessage.h"
#import "ABKInAppMessageSlideup.h"
#import "ABKInAppMessageImmersive.h"
#import "ABKInAppMessageModal.h"
#import "ABKInAppMessageFull.h"
#import "ABKInAppMessageHTML.h"
#import "ABKInAppMessageHTMLFull.h"
#import "ABKInAppMessageHTMLBase.h"
#import "ABKInAppMessageControl.h"
#import "ABKInAppMessageControllerDelegate.h"
#import "ABKInAppMessageController.h"
#import "ABKInAppMessageButton.h"
#import "ABKInAppMessageWebViewBridge.h"
#import "ABKInAppMessageUIControlling.h"
#import "ABKInAppMessageDarkTheme.h"
#import "ABKInAppMessageDarkButtonTheme.h"
// News Feed
#import "ABKFeedController.h"
// Content Cards Feed
#import "ABKContentCardsController.h"
// IDFA
#import "ABKIDFADelegate.h"
// SDWebImage
#import "ABKSDWebImageProxy.h"
// ABKImageDelegate
#import "ABKImageDelegate.h"
// Location
#import "ABKLocationManager.h"
#import "ABKLocationManagerProvider.h"
#import "ABKURLDelegate.h"
#import "ABKPushUtils.h"
#import "ABKModalWebViewController.h"
#import "ABKNoConnectionLocalization.h"
#endif
================================================
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Modules/module.modulemap
================================================
framework module AppboyTVOSKit {
umbrella header "AppboyKit.h"
export *
module * { export * }
}
================================================
FILE: Appboy-tvOS-SDK.podspec
================================================
Pod::Spec.new do |s|
s.name = "Appboy-tvOS-SDK"
s.version = "4.7.0"
s.summary = "This is the Braze tvOS SDK for Mobile Marketing Automation"
s.homepage = "http://www.braze.com"
s.license = { :type => 'Commercial', :text => 'Please refer to https://github.com/Appboy/appboy-ios-sdk/blob/master/LICENSE'}
s.author = { "Appboy" => "http://www.braze.com" }
s.source = { :git => 'https://github.com/Appboy/appboy-ios-sdk.git', :tag => s.version.to_s}
s.platform = :tvos
s.tvos.deployment_target = 11.0
s.requires_arc = true
s.documentation_url = 'https://www.braze.com/docs'
s.tvos.frameworks = 'SystemConfiguration'
s.preserve_paths = 'Appboy-tvOS-SDK/AppboyTVOSKit.framework'
s.vendored_frameworks = 'Appboy-tvOS-SDK/AppboyTVOSKit.framework'
# Skip this architecture to pass Pod validation since we removed the `arm64` simulator ARCH in order to use lipo later
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=appletvsimulator*]' => 'arm64' }
end
================================================
FILE: AppboyKit/ABKLocationManagerProvider.m
================================================
#import "ABKLocationManagerProvider.h"
#if !TARGET_OS_TV
#import <CoreLocation/CoreLocation.h>
#endif
@implementation ABKLocationManagerProvider
+ (BOOL)locationServicesEnabled {
#if !TARGET_OS_TV
return YES;
#endif
return NO;
}
@end
================================================
FILE: AppboyKit/ABKModalWebViewController.m
================================================
#import "ABKModalWebViewController.h"
#import "ABKNoConnectionLocalization.h"
static NSString *const titleKeyPath = @"title";
static NSString *const estimatedProgressKeyPath = @"estimatedProgress";
static NSString *const localizedNoConnectionKey = @"Appboy.no-connection.message";
@implementation ABKModalWebViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIViewController *webViewController = [[UIViewController alloc] init];
self.webView = [self getWebView];
webViewController.view = self.webView;
#if !TARGET_OS_TV
if (@available(iOS 15.0, *)) {
self.view.backgroundColor = UIColor.systemGroupedBackgroundColor;
}
#endif
[self setupProgressBarWithViewController:webViewController];
UIBarButtonItem *closeBarButton = [self getDoneBarButtonItem];
[webViewController.navigationItem setRightBarButtonItem:closeBarButton];
[self.webView addObserver:self forKeyPath:titleKeyPath options:NSKeyValueObservingOptionNew context:nil];
[self.webView addObserver:self forKeyPath:estimatedProgressKeyPath options:NSKeyValueObservingOptionNew context:nil];
[self setViewControllers:@[webViewController]];
[self.webView loadRequest:[NSURLRequest requestWithURL:self.url]];
}
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary<NSKeyValueChangeKey,id> *)change
context:(void *)context {
if ([titleKeyPath isEqualToString:keyPath]) {
self.title = self.webView.title;
} else if ([estimatedProgressKeyPath isEqualToString:keyPath]) {
if (self.webView.estimatedProgress == 1.0) {
[UIView animateWithDuration:1 animations:^{
self.progressBar.alpha = 0.0;
}];
} else if (self.webView.estimatedProgress < 1.0) {
self.progressBar.alpha = 1.0;
[self.progressBar setProgress:self.webView.estimatedProgress animated:YES];
}
}
}
- (void)dealloc {
[self.webView removeObserver:self forKeyPath:titleKeyPath];
[self.webView removeObserver:self forKeyPath:estimatedProgressKeyPath];
}
#pragma mark - Customization Methods
/*!
* @discussion Returns a WKWebView object, whose navigationDelegate is this ABKModalWebViewController instance.
*
* If you want to do any customization to the WKWebView, please override this method in an ABKModalWebViewController
* category and return the customized WKWebView. All instances of ABKModalWebViewController will then
* call the category's `getWebView` implementation instead of this method.
*
*/
- (WKWebView *)getWebView {
WKWebViewConfiguration *webViewConfiguration = [[WKWebViewConfiguration alloc] init];
webViewConfiguration.allowsInlineMediaPlayback = YES;
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:webViewConfiguration];
webView.navigationDelegate = self;
return webView;
}
/*!
*
* @param viewController The view controller to which the progress bar will be added as a subview.
*
* @discussion Creates a UIProgressView and puts it on top of the param viewController.
*
* If you want to do any customization to the progress bar, please override this method in an ABKModalWebViewController
* category and set up the progress bar. All instances of ABKModalWebViewController will then
* call the category's `setupProgressBarWithViewController:` implementation instead of this method.
*
*/
- (void)setupProgressBarWithViewController:(UIViewController *)viewController {
UIProgressView *progressBar = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar];
progressBar.alpha = 0;
self.progressBar = progressBar;
[viewController.view addSubview:self.progressBar];
self.progressBar.translatesAutoresizingMaskIntoConstraints = NO;
[viewController.view addConstraint:[NSLayoutConstraint constraintWithItem:self.progressBar
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:viewController.topLayoutGuide
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:0.0]];
[viewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[progressBar]|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:@{@"progressBar" : self.progressBar}]];
}
/*!
* @discussion Returns the Done UIBarButtonItem, which allows the user to dismiss the modal web view.
*
* If you want to do any customization to the Done button, please override this method in an ABKModalWebViewController
* category and return the customized UIBarButtonItem. All instances of ABKModalWebViewController will then
* call the category's `getDoneBarButtonItem` implementation instead of this method.
*
*/
- (UIBarButtonItem *)getDoneBarButtonItem {
return [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self
action:@selector(closeButtonPressed:)];
}
- (void)closeButtonPressed:(id)sender {
[self dismissViewControllerAnimated:YES completion:nil];
}
#pragma mark - WKNavigationDelegate methods
- (void)webView:(WKWebView *)webView
decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSString *urlString = [[navigationAction.request.mainDocumentURL absoluteString] lowercaseString];
NSArray *stringComponents = [urlString componentsSeparatedByString:@":"];
if ([stringComponents[1] hasPrefix:@"//itunes.apple.com"] ||
(![stringComponents[0] isEqual:@"http"] &&
![stringComponents[0] isEqual:@"https"])) {
// Dismiss the modal web view and let the system handle the deep links
if ([[UIApplication sharedApplication] openURL:navigationAction.request.URL]) {
decisionHandler(WKNavigationActionPolicyCancel);
[self dismissViewControllerAnimated:YES completion:nil];
return;
}
}
decisionHandler(WKNavigationActionPolicyAllow);
}
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
self.progressBar.alpha = 0.0;
}
- (void)webView:(WKWebView *)webView
didFailProvisionalNavigation:(WKNavigation *)navigation
withError:(NSError *)error {
self.progressBar.alpha = 0.0;
// Display localized "No Connection" message
UILabel *label = [[UILabel alloc] init];
label.textAlignment = NSTextAlignmentCenter;
label.numberOfLines = 0;
NSString *localizedNoConectionMessage = NSLocalizedString(@"Appboy.no-connection.message", @"No connection error message for URL loading failure");
if (localizedNoConectionMessage.length == 0 || [localizedNoConnectionKey isEqualToString:localizedNoConectionMessage]) {
localizedNoConectionMessage = [ABKNoConnectionLocalization getNoConnectionLocalizedString];
}
label.text = localizedNoConectionMessage;
[self.webView addSubview:label];
label.translatesAutoresizingMaskIntoConstraints = NO;
[self.webView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-10-[noConnectionLabel]-10-|"
options:NSLayoutFormatDirectionLeadingToTrailing
metrics:nil
views:@{@"noConnectionLabel" : label}]];
[self.webView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[noConnectionLabel]|"
options:NSLayoutFormatAlignAllCenterY
metrics:nil
views:@{@"noConnectionLabel" : label}]];
}
@end
================================================
FILE: AppboyKit/ABKNoConnectionLocalization.m
================================================
#import "ABKNoConnectionLocalization.h"
@implementation ABKNoConnectionLocalization
+ (NSDictionary *)localizedNoConnectionStringDictionary {
return @{@"ar":@"لا يمكن إجراء الاتصال بالشبكة. يرجى تكرار المحاولة لاحقا.",
@"da":@"Kan ikke etablere netværksforbindelse. Prøv venligst senere.",
@"de":@"Netzwerkverbindung kann nicht aufgebaut werden. Bitte später noch einmal versuchen.",
@"en":@"Cannot establish network connection. Please try again later.",
@"es-419":@"No se puede establecer conexión con la red. Por favor, vuelva a intentarlo más tarde.",
@"es-MX":@"No se puede establecer conexión con la red. Por favor, vuelva a intentarlo más tarde.",
@"es":@"No se puede establecer conexión de red. Por favor inténtelo más tarde.",
@"et":@"Võrguühenduse loomine ebaõnnestus. Palun proovige hiljem uuesti.",
@"fi":@"Verkkoyhteyttä ei voida luoda. Yritä myöhemmin uudelleen.",
@"fil":@"Hindi makapagtatag ng koneksyon sa network. angyaring subukan muli mamaya.",
@"fr":@"Impossible d'établir la connexion réseau. Veuillez réessayer ultérieurement.",
@"he":@".לא ניתן לקבוע חיבור רשת.בבקשה נסה שוב בקרוב",
@"hi":@"नेटवर्क कनेक्शन स्थापित नहीं हो रहा है।. कृपया बाद में दोबारा प्रयास करें।.",
@"id":@"Tidak bisa melakukan koneksi jaringan. Coba lagi nanti.",
@"it":@"Impossibile stabilire una connessione di rete. Riprovare più tardi.",
@"ja":@"ネットワークに接続できません。後でもう一度試してください。",
@"km":@"មិនអាចបង្កើតបណ្តាញតភ្ជាប់បានទេ. សូមព្យាយាមម្តងទៀតនៅពេលក្រោយ.",
@"ko":@"네트워크 연결을 할 수 없습니다. 나중에 다시 시도해 주십시오.",
@"lo":@"ບໍ່ສາມາດຕັ້ງການເຊື່ອມຕໍ່ເຄືອຂ່າຍໄດ້. ກະລຸນາລອງໃໝ່ພາຍຫຼັງ.",
@"ms":@"Tidak boleh membuat sambungan rangkaian. Sila cuba kemudian.",
@"my":@"ကြန္ယက္ဆက္သြယ္ျခင္း မျပဳလုပ္ႏိုင္ပါ။. ေက်းဇူးျပဳ၍ ထပ္မံၾကိဳးစားၾကည္႕ပါ။.",
@"nb":@"Kan ikke etablere nettverkstilkobling. Vennligst prøv igjen senere.",
@"nl":@"Kan geen netwerkverbinding maken. Probeer het later opnieuw.",
@"pl":@"Nie można ustanowić połączenia z siecią. Proszę spróbować ponownie później.",
@"pt-PT":@"Não é possível estabelecer a ligação à rede. Por favor, tente mais tarde.",
@"pt":@"Não é possível estabelecer uma conexão de rede. Tente novamente mais tarde.",
@"ru":@"Невозможно установить сетевое подключение. Пожалуйста, повторите попытку позже.",
@"sv":@"Det gick inte att skapa en nätverksanslutning. Försök igen senare.",
@"th":@"ไม่สามารถสร้างการเชื่อมต่อเครือข่าย. กรุณาลองใหม่ภายหลัง.",
@"vi":@"Không thể thiết lập kết nối mạng. Vui lòng thử lại sau.",
@"zh-Hans":@"无法建立网络连接。请稍候再试。",
@"zh-Hant":@"無法建立網路連線。請稍候再試。",
@"zh-HK":@"無法建立網路連線。請稍候再試。",
@"zh-TW":@"無法建立網路連線。請稍候再試。",
@"zh":@"无法建立网络连接。请稍候再试。"};
}
+ (NSString *)getNoConnectionLocalizedString {
NSString *language = [[NSLocale preferredLanguages] count]? [NSLocale preferredLanguages][0]: @"en";
NSDictionary *localizedStringDict = [self localizedNoConnectionStringDictionary];
while (localizedStringDict[language] == nil && [language rangeOfString:@"-"].location != NSNotFound) {
NSArray *languageComponent = [language componentsSeparatedByString:@"-"];
language = [[languageComponent subarrayWithRange:NSMakeRange(0, languageComponent.count - 1)] componentsJoinedByString:@"-"];
}
NSString *localizedString = localizedStringDict[language] ? localizedStringDict[language] : localizedStringDict[@"en"];
return localizedString;
}
@end
================================================
FILE: AppboyKit/ABKSDWebImageProxy.m
================================================
#import "ABKSDWebImageProxy.h"
#import <SDWebImage/UIImageView+WebCache.h>
#import <SDWebImage/UIView+WebCache.h>
#import <SDWebImage/SDWebImageManager.h>
#import <SDWebImage/SDImageCache.h>
@implementation ABKSDWebImageProxy
+ (void)setImageForView:(UIImageView *)imageView
showActivityIndicator:(BOOL)showActivityIndicator
withURL:(nullable NSURL *)imageURL
imagePlaceHolder:(nullable UIImage *)placeHolder
completed:(nullable void (^)(UIImage * _Nullable image, NSError * _Nullable error, NSInteger cacheType, NSURL * _Nullable imageURL))completion {
if (showActivityIndicator) {
imageView.sd_imageIndicator = SDWebImageActivityIndicator.grayIndicator;
}
[imageView sd_setImageWithURL:imageURL
placeholderImage:placeHolder
options: (SDWebImageQueryMemoryData | SDWebImageQueryDiskDataSync)
completed:completion];
}
+ (void)loadImageWithURL:(nullable NSURL *)url
options:(NSInteger)options
completed:(nullable void (^)(UIImage *image, NSData *data, NSError *error, NSInteger cacheType, BOOL finished, NSURL *imageURL))completion {
[[SDWebImageManager sharedManager] loadImageWithURL:url
options:options
progress:nil
completed:completion];
}
+ (void)diskImageExistsForURL:(nullable NSURL *)url
completed:(nullable void (^)(BOOL isInCache))completion{
if (url != nil) {
[[SDImageCache sharedImageCache] diskImageExistsWithKey:url.absoluteString completion:completion];
}
}
+ (nullable NSString *)cacheKeyForURL:(nullable NSURL *)url {
return [[SDWebImageManager sharedManager] cacheKeyForURL:url];
}
+ (void)removeSDWebImageForKey:(nullable NSString *)key {
[[SDImageCache sharedImageCache] removeImageForKey:key withCompletion:nil];
}
+ (nullable UIImage *)imageFromCacheForKey:(nullable NSString *)key {
return [[SDImageCache sharedImageCache] imageFromCacheForKey:key];
}
+ (void)clearSDWebImageCache {
[[SDImageCache sharedImageCache] clearMemory];
[[SDImageCache sharedImageCache] clearDiskOnCompletion:nil];
}
+ (BOOL)isSupportedSDWebImageVersion {
BOOL imageViewMethodsExist = [UIImageView instancesRespondToSelector:@selector(setSd_imageIndicator:)] &&
[UIImageView instancesRespondToSelector:@selector(sd_setImageWithURL:placeholderImage:completed:)];
SDWebImageManager *imageManager = [SDWebImageManager sharedManager];
BOOL managerMethodsExist = [imageManager respondsToSelector:@selector(loadImageWithURL:options:progress:completed:)] &&
[imageManager respondsToSelector:@selector(cacheKeyForURL:)];
SDImageCache *imageCache = [SDImageCache sharedImageCache];
BOOL imageCacheMethodsExist = [imageCache respondsToSelector:@selector(removeImageForKey:withCompletion:)] &&
[imageCache respondsToSelector:@selector(clearDiskOnCompletion:)] &&
[imageCache respondsToSelector:@selector(diskImageExistsWithKey:completion:)] &&
[imageCache respondsToSelector:@selector(clearMemory)] &&
[imageCache respondsToSelector:@selector(imageFromCacheForKey:)];
return imageViewMethodsExist && managerMethodsExist && imageCacheMethodsExist;
}
@end
================================================
FILE: AppboyKit/Appboy.bundle/PrivacyInfo.xcprivacy
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
<key>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeUserID</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeProductPersonalization</string>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeDeviceID</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeProductPersonalization</string>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeProductInteraction</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeProductPersonalization</string>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypePreciseLocation</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeProductPersonalization</string>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
</array>
</dict>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeCoarseLocation</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeProductPersonalization</string>
<string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
</array>
</dict>
</array>
</dict>
</plist>
================================================
FILE: AppboyKit/Appboy.bundle/ZipArchive_LICENSE.txt
================================================
Copyright (c) 2010-2015, ZipArchive, https://github.com/ZipArchive
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
================================================
FILE: AppboyKit/Appboy.bundle/_CodeSignature/CodeResources
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>PrivacyInfo.xcprivacy</key>
<data>
35537WDlOfHuEOldTrUa7OmzNwQ=
</data>
<key>ZipArchive_LICENSE.txt</key>
<data>
JbmSdiuxe/Zs/esUY7pUvV4byF4=
</data>
<key>appboy-spm-cleanup.sh</key>
<data>
O3UfCL3lKKMB/+splkNXf6zYbbU=
</data>
<key>ar.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
ikkSl37t+7dVXcdDSsplItVo5v4=
</data>
<key>optional</key>
<true/>
</dict>
<key>cs.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
HpBIYzzQP2b/gz2ASERTvoi95m4=
</data>
<key>optional</key>
<true/>
</dict>
<key>da.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
sg0g9Tgrlg3sJjwTl+G3PC8FAJg=
</data>
<key>optional</key>
<true/>
</dict>
<key>de.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
IoqO+svUlTLorH1d321C+DaCvLU=
</data>
<key>optional</key>
<true/>
</dict>
<key>en.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
CcyvcSMMNgJPpJScduQ1DvYCPqc=
</data>
<key>optional</key>
<true/>
</dict>
<key>es-419.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
LmBpUiGVEU/srcwSdgMN2xHVnsc=
</data>
<key>optional</key>
<true/>
</dict>
<key>es-MX.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
LmBpUiGVEU/srcwSdgMN2xHVnsc=
</data>
<key>optional</key>
<true/>
</dict>
<key>es.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
iAm4QTEmMOfm3uJbSU2CjYASqg4=
</data>
<key>optional</key>
<true/>
</dict>
<key>et.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
YRS0Fh60D+5z7QyzbRifH6lS5m0=
</data>
<key>optional</key>
<true/>
</dict>
<key>fi.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
ElciMeWd7+DdrGsUYIV1BCc9zts=
</data>
<key>optional</key>
<true/>
</dict>
<key>fil.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
AwAsH+O3Oum5GBbG9U/UzAHs+Uo=
</data>
<key>optional</key>
<true/>
</dict>
<key>fr.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
4MoSFYmXS1rkntVmD8Bdc7Hn5pw=
</data>
<key>optional</key>
<true/>
</dict>
<key>he.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
Rp7mkbk7PXmWefbaSE8FDXGXles=
</data>
<key>optional</key>
<true/>
</dict>
<key>hi.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
O8MWNHc3Um4NcsIrID5Vk4dd54s=
</data>
<key>optional</key>
<true/>
</dict>
<key>id.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
49qpfq7iRtfxxUbVInBDeKNjz7E=
</data>
<key>optional</key>
<true/>
</dict>
<key>it.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
laa/58WCKhmdGMlVjsTlBYUopG4=
</data>
<key>optional</key>
<true/>
</dict>
<key>ja.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
3wDAz31yuk5UdZyTMdeUKUbgbeU=
</data>
<key>optional</key>
<true/>
</dict>
<key>km.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
PAlPrqyz9/Dr9FoyARSmLUUSNlY=
</data>
<key>optional</key>
<true/>
</dict>
<key>ko.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
itXcFANBAU96clWcX1rA7p30JnE=
</data>
<key>optional</key>
<true/>
</dict>
<key>lo.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
9ummy0p0yIJpe1mMX7Xl03P0H/w=
</data>
<key>optional</key>
<true/>
</dict>
<key>ms.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
Gv7vjcrr6syw+oqHQ43wPMXrgNk=
</data>
<key>optional</key>
<true/>
</dict>
<key>my.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
9yuPTyT4nWP0qa0okY7pGmudiV0=
</data>
<key>optional</key>
<true/>
</dict>
<key>nb.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
l80bnfoSc9rlRA4bXKJ0rwRC0OM=
</data>
<key>optional</key>
<true/>
</dict>
<key>nl.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
/h2VZ4vvhTv86/q3pb2e1Egu/Sw=
</data>
<key>optional</key>
<true/>
</dict>
<key>pl.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
BsEGyLvt3DQkwFvz66oYe7ua/Po=
</data>
<key>optional</key>
<true/>
</dict>
<key>pt-PT.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
4TjlnSbVdiRFyVbE2qBiMd+CyOQ=
</data>
<key>optional</key>
<true/>
</dict>
<key>pt.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
zqP4s5SMAvHJJIetNS1R6ZE4O54=
</data>
<key>optional</key>
<true/>
</dict>
<key>ru.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
STrDNbH4mbH8IiQ0hn8Vek5WgLQ=
</data>
<key>optional</key>
<true/>
</dict>
<key>sv.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
mAlAT4rTioVuM3DYq5gih2kfI9o=
</data>
<key>optional</key>
<true/>
</dict>
<key>th.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
DeAcN0mnPKHFwDbYuGg+sr5xk+0=
</data>
<key>optional</key>
<true/>
</dict>
<key>uk.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
Tc4MJlZRNrNeCkLxxfRMq9EFW68=
</data>
<key>optional</key>
<true/>
</dict>
<key>vi.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
WnpBLIVxIeYHM1hAYdI5jgR/Y3o=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-HK.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
A4gTpmd3RAdTOb5x7jO211+TLu8=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-Hans.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
6FRvJc2sxWJf+sECiTmCMl2VFOQ=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-Hant.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
A4gTpmd3RAdTOb5x7jO211+TLu8=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-TW.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
A4gTpmd3RAdTOb5x7jO211+TLu8=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
6FRvJc2sxWJf+sECiTmCMl2VFOQ=
</data>
<key>optional</key>
<true/>
</dict>
</dict>
<key>files2</key>
<dict>
<key>PrivacyInfo.xcprivacy</key>
<dict>
<key>hash</key>
<data>
35537WDlOfHuEOldTrUa7OmzNwQ=
</data>
<key>hash2</key>
<data>
vz81m6KH2HKZHoLSODBrzGNp/+lfzoLblqWy7rtuvpI=
</data>
</dict>
<key>ZipArchive_LICENSE.txt</key>
<dict>
<key>hash</key>
<data>
JbmSdiuxe/Zs/esUY7pUvV4byF4=
</data>
<key>hash2</key>
<data>
j7CoF6NtgM8sSqLkZ/syPjE4TgZL0oOqy+1tPp5ip/M=
</data>
</dict>
<key>appboy-spm-cleanup.sh</key>
<dict>
<key>hash</key>
<data>
O3UfCL3lKKMB/+splkNXf6zYbbU=
</data>
<key>hash2</key>
<data>
/l959MIHRRf5Hali4ZYnnwYbGGrbAruO2CSKS1WrggE=
</data>
</dict>
<key>ar.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
ikkSl37t+7dVXcdDSsplItVo5v4=
</data>
<key>hash2</key>
<data>
Tasxj0n6Fu6eabJu/tAeixHF2EN9H9R3yEZ/dauIt7I=
</data>
<key>optional</key>
<true/>
</dict>
<key>cs.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
HpBIYzzQP2b/gz2ASERTvoi95m4=
</data>
<key>hash2</key>
<data>
tnoN1JgdcOm+Gbs0kMTM0b1IS3cP+cWhB2WHpe7oOI8=
</data>
<key>optional</key>
<true/>
</dict>
<key>da.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
sg0g9Tgrlg3sJjwTl+G3PC8FAJg=
</data>
<key>hash2</key>
<data>
xhUG+25LUOipRTwGtAmWNwyKMtXS6fUJRBZJ4Pc2oH8=
</data>
<key>optional</key>
<true/>
</dict>
<key>de.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
IoqO+svUlTLorH1d321C+DaCvLU=
</data>
<key>hash2</key>
<data>
6y6k6zh0MxVioySbYA2ZWdiStPv22ikISkc9DDegkk8=
</data>
<key>optional</key>
<true/>
</dict>
<key>en.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
CcyvcSMMNgJPpJScduQ1DvYCPqc=
</data>
<key>hash2</key>
<data>
NN+BQMMtBdLA+Yax5OiWpOamEQo1EhH/RAcqjMe7h+s=
</data>
<key>optional</key>
<true/>
</dict>
<key>es-419.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
LmBpUiGVEU/srcwSdgMN2xHVnsc=
</data>
<key>hash2</key>
<data>
Fvh73dDedMMiSObM13PBR9iNZmE+izl7CXQ33O8edLc=
</data>
<key>optional</key>
<true/>
</dict>
<key>es-MX.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
LmBpUiGVEU/srcwSdgMN2xHVnsc=
</data>
<key>hash2</key>
<data>
Fvh73dDedMMiSObM13PBR9iNZmE+izl7CXQ33O8edLc=
</data>
<key>optional</key>
<true/>
</dict>
<key>es.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
iAm4QTEmMOfm3uJbSU2CjYASqg4=
</data>
<key>hash2</key>
<data>
oRsLMkaRaSzmu9MrHtp1Kj/fmQNsokuRc3b7gU+RIUw=
</data>
<key>optional</key>
<true/>
</dict>
<key>et.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
YRS0Fh60D+5z7QyzbRifH6lS5m0=
</data>
<key>hash2</key>
<data>
IFkIJG3633h4s8vuCb/cNLLBoRTLm5TMYbriDREkRCY=
</data>
<key>optional</key>
<true/>
</dict>
<key>fi.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
ElciMeWd7+DdrGsUYIV1BCc9zts=
</data>
<key>hash2</key>
<data>
sTMTM41FNd3QOc6PRgzFqpzKdHVf0Yav+heyxVGXozM=
</data>
<key>optional</key>
<true/>
</dict>
<key>fil.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
AwAsH+O3Oum5GBbG9U/UzAHs+Uo=
</data>
<key>hash2</key>
<data>
4WSrZSSXSF0VkX/hZI9Jc3AeYK3oKs5m/K6mO1PyURE=
</data>
<key>optional</key>
<true/>
</dict>
<key>fr.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
4MoSFYmXS1rkntVmD8Bdc7Hn5pw=
</data>
<key>hash2</key>
<data>
sZwtzjFxqC4U1eGSwpPMtdSLxaT4TNCzMysev2RNW0k=
</data>
<key>optional</key>
<true/>
</dict>
<key>he.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
Rp7mkbk7PXmWefbaSE8FDXGXles=
</data>
<key>hash2</key>
<data>
v2uh+X/qP+u6S9ZoY9ppeoXnfZmoTpBJPKSqzk7at5g=
</data>
<key>optional</key>
<true/>
</dict>
<key>hi.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
O8MWNHc3Um4NcsIrID5Vk4dd54s=
</data>
<key>hash2</key>
<data>
OnU/X/MkvxSlf+OGy3RDF4vcdVyTtSog2KWRtC5oPYU=
</data>
<key>optional</key>
<true/>
</dict>
<key>id.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
49qpfq7iRtfxxUbVInBDeKNjz7E=
</data>
<key>hash2</key>
<data>
deYxzwkoBzdMrkWGd+f+VgSnx/s33CkitB+HZ0NZGO4=
</data>
<key>optional</key>
<true/>
</dict>
<key>it.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
laa/58WCKhmdGMlVjsTlBYUopG4=
</data>
<key>hash2</key>
<data>
H69+kWo9xhAO7omzXIUzwgZh//sDyr0Gx0XXSs6FNoE=
</data>
<key>optional</key>
<true/>
</dict>
<key>ja.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
3wDAz31yuk5UdZyTMdeUKUbgbeU=
</data>
<key>hash2</key>
<data>
TFsM9+s7alWiWgpE6OyR2ZQteKpirSJ2ZEvwj/hnGxA=
</data>
<key>optional</key>
<true/>
</dict>
<key>km.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
PAlPrqyz9/Dr9FoyARSmLUUSNlY=
</data>
<key>hash2</key>
<data>
azehywKf6sG34ERf6Wh5jwCJGs3zWQc+Qb9s/ML6Wtk=
</data>
<key>optional</key>
<true/>
</dict>
<key>ko.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
itXcFANBAU96clWcX1rA7p30JnE=
</data>
<key>hash2</key>
<data>
Wkkbb8+TIExBHBF6tuLXThb3sR4dwrC3+4YlR2q2PAg=
</data>
<key>optional</key>
<true/>
</dict>
<key>lo.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
9ummy0p0yIJpe1mMX7Xl03P0H/w=
</data>
<key>hash2</key>
<data>
kZi+9bet5HA/jbyjGxu64lcw8hH0ZWv55g3SuTmuB8I=
</data>
<key>optional</key>
<true/>
</dict>
<key>ms.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
Gv7vjcrr6syw+oqHQ43wPMXrgNk=
</data>
<key>hash2</key>
<data>
5Hr2LuS7C9LAEL/5/p+YDpe6+TwEwk63WMYaHUY8OI4=
</data>
<key>optional</key>
<true/>
</dict>
<key>my.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
9yuPTyT4nWP0qa0okY7pGmudiV0=
</data>
<key>hash2</key>
<data>
OGLTjMs+TI9BMp02BEY7Y9L/EwjJz+4xSIGnPnJfHBI=
</data>
<key>optional</key>
<true/>
</dict>
<key>nb.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
l80bnfoSc9rlRA4bXKJ0rwRC0OM=
</data>
<key>hash2</key>
<data>
EeJLYfG14UVjDjg44lseegKl97KcnPX7h9SPGzeC7b0=
</data>
<key>optional</key>
<true/>
</dict>
<key>nl.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
/h2VZ4vvhTv86/q3pb2e1Egu/Sw=
</data>
<key>hash2</key>
<data>
IbQbBgC+JoU+yAky0EtrojOVeeoczWsKXZbbqwcAsOo=
</data>
<key>optional</key>
<true/>
</dict>
<key>pl.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
BsEGyLvt3DQkwFvz66oYe7ua/Po=
</data>
<key>hash2</key>
<data>
2OY0P3AYZpW/A6i3kAY3G1yJa7IV6Rt03pfWUza76Gs=
</data>
<key>optional</key>
<true/>
</dict>
<key>pt-PT.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
4TjlnSbVdiRFyVbE2qBiMd+CyOQ=
</data>
<key>hash2</key>
<data>
Z4Z/vNNS2oK6+pU5Fw2SlIto4qnFc4BNSysbg+4dKtg=
</data>
<key>optional</key>
<true/>
</dict>
<key>pt.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
zqP4s5SMAvHJJIetNS1R6ZE4O54=
</data>
<key>hash2</key>
<data>
vRJuR2MouqsYKCHj7G/CcW37NOzKw/Z3SFVG/WQEZeY=
</data>
<key>optional</key>
<true/>
</dict>
<key>ru.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
STrDNbH4mbH8IiQ0hn8Vek5WgLQ=
</data>
<key>hash2</key>
<data>
gHPNWQd/dis0H7ZLB4Pv8Buf+Asa/NmYiWVTyFRAtNk=
</data>
<key>optional</key>
<true/>
</dict>
<key>sv.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
mAlAT4rTioVuM3DYq5gih2kfI9o=
</data>
<key>hash2</key>
<data>
lHcFD3AK/emy+aL3h6W3x8N0ToKNJroct782JbXL9UE=
</data>
<key>optional</key>
<true/>
</dict>
<key>th.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
DeAcN0mnPKHFwDbYuGg+sr5xk+0=
</data>
<key>hash2</key>
<data>
i0DEOQlExvgorEkQ5lbY9KFETyTSfX0H+b05K0K0HY4=
</data>
<key>optional</key>
<true/>
</dict>
<key>uk.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
Tc4MJlZRNrNeCkLxxfRMq9EFW68=
</data>
<key>hash2</key>
<data>
nl9a70ZKrLi8yHFhksJgNIMv8lHI/cEE09LQf9+IaAc=
</data>
<key>optional</key>
<true/>
</dict>
<key>vi.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
WnpBLIVxIeYHM1hAYdI5jgR/Y3o=
</data>
<key>hash2</key>
<data>
PeGoDxEZIq6z/SuI09D8igvTMnJOPTkuSwgXG4mgxxM=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-HK.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
A4gTpmd3RAdTOb5x7jO211+TLu8=
</data>
<key>hash2</key>
<data>
SFa2j6R9YoRZJ5/2EOUw3d2Xr7vh8iAHrNCjamSip3g=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-Hans.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
6FRvJc2sxWJf+sECiTmCMl2VFOQ=
</data>
<key>hash2</key>
<data>
fn83ZQteQmX1XgcF3J5cCPycXHscx1EIqBhU8RGqs5M=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-Hant.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
A4gTpmd3RAdTOb5x7jO211+TLu8=
</data>
<key>hash2</key>
<data>
SFa2j6R9YoRZJ5/2EOUw3d2Xr7vh8iAHrNCjamSip3g=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh-TW.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
A4gTpmd3RAdTOb5x7jO211+TLu8=
</data>
<key>hash2</key>
<data>
SFa2j6R9YoRZJ5/2EOUw3d2Xr7vh8iAHrNCjamSip3g=
</data>
<key>optional</key>
<true/>
</dict>
<key>zh.lproj/LocalizedAppboyUIString.strings</key>
<dict>
<key>hash</key>
<data>
6FRvJc2sxWJf+sECiTmCMl2VFOQ=
</data>
<key>hash2</key>
<data>
fn83ZQteQmX1XgcF3J5cCPycXHscx1EIqBhU8RGqs5M=
</data>
<key>optional</key>
<true/>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^.*</key>
<true/>
<key>^.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^Base\.lproj/</key>
<dict>
<key>weight</key>
<real>1010</real>
</dict>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>
================================================
FILE: AppboyKit/Appboy.bundle/appboy-spm-cleanup.sh
================================================
#! /bin/sh
# AppboyKitLibrary
find "${TARGET_BUILD_DIR}/${FULL_PRODUCT_NAME}" -name libAppboyKitLibrary.a -follow -exec rm {} \;
# AppboyPushStory
find "${TARGET_BUILD_DIR}/${FULL_PRODUCT_NAME}" -name "AppboyPushStory.framework" -follow -exec rm -r {} \;
================================================
FILE: AppboyKit/include/ABKAttributionData.h
================================================
#import <Foundation/Foundation.h>
/*
* Braze Public API: ABKAttributionData
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKAttributionData : NSObject
/*!
* @param network The attribution network
* @param campaign The attribution campaign
* @param adGroup The attribution adGroup
* @param creative The attribution creative
*
* @discussion: Creates an ABKAttributionData object to send to Braze servers.
*/
- (instancetype)initWithNetwork:(nullable NSString *)network
campaign:(nullable NSString *)campaign
adGroup:(nullable NSString *)adGroup
creative:(nullable NSString *)creative;
@property (nonatomic, readonly, nullable) NSString *network;
@property (nonatomic, readonly, nullable) NSString *campaign;
@property (nonatomic, readonly, nullable) NSString *adGroup;
@property (nonatomic, readonly, nullable) NSString *creative;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKBannerCard.h
================================================
#import "ABKCard.h"
/*
* Braze Public API: ABKBannerCard
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKBannerCard : ABKCard <NSCoding>
/*
* This property is the URL of the card's image.
*/
@property (copy) NSString *image;
/*
* The link text for the property url, like @"blog.appboy.com". It can be displayed on the card's
* UI to indicate the action/direction of clicking on the card.
*/
@property (copy, nullable) NSString *domain;
/*
* This property is the aspect ratio of the card's image. It is meant to serve as a hint before
* image loading completes. Note that the property may not be supplied in certain circumstances.
*/
@property float imageAspectRatio;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKBannerContentCard.h
================================================
#import "ABKContentCard.h"
@interface ABKBannerContentCard : ABKContentCard <NSCoding>
/*
* The URL of the card's image.
*/
@property (copy) NSString *image;
/*
* This property is the aspect ratio of the card's image. It is meant to serve as a hint before
* image loading completes. Note that the property may not be supplied in certain circumstances.
*/
@property float imageAspectRatio;
@end
================================================
FILE: AppboyKit/include/ABKCaptionedImageCard.h
================================================
#import "ABKCard.h"
/*
* Braze Public API: ABKCaptionedImageCard
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKCaptionedImageCard : ABKCard <NSCoding>
/*
* This property is the URL of the card's image.
*/
@property (copy) NSString *image;
/*
* This property is the aspect ratio of the card's image. It is meant to serve as a hint before
* image loading completes. Note that the property may not be supplied in certain circumstances.
*/
@property float imageAspectRatio;
/*
* The title text for the card.
*/
@property (copy) NSString *title;
/*
* The description text for the card.
*/
@property (copy) NSString *cardDescription;
/*
* The link text for the property url, like @"blog.appboy.com". It can be displayed on the card's
* UI to indicate the action/direction of clicking on the card.
*/
@property (copy, nullable) NSString *domain;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKCaptionedImageContentCard.h
================================================
#import "ABKContentCard.h"
NS_ASSUME_NONNULL_BEGIN
@interface ABKCaptionedImageContentCard : ABKContentCard <NSCoding>
/*
* The URL of the card's image.
*/
@property (copy) NSString *image;
/*
* This property is the aspect ratio of the card's image. It is meant to serve as a hint before
* image loading completes. Note that the property may not be supplied in certain circumstances.
*/
@property float imageAspectRatio;
/*
* The title text for the card.
*/
@property (copy) NSString *title;
/*
* The description text for the card.
*/
@property (copy) NSString *cardDescription;
/*
* The link text for the property url, like @"blog.appboy.com". It can be displayed on the card's
* UI to indicate the action/direction of clicking on the card.
*/
@property (copy, nullable) NSString *domain;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKCard.h
================================================
#import <Foundation/Foundation.h>
#import "ABKFeedController.h"
/*
* Braze Public API: ABKCard
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKCard : NSObject <NSCopying, NSCoding>
/*
* Card's ID.
*/
@property (readonly) NSString *idString;
/*
* This property reflects if the card is read or unread by the user.
*/
@property (nonatomic) BOOL viewed;
/*
* The property is the unix timestamp of the card's creation time from Braze dashboard.
*/
@property (nonatomic, readonly) double created;
/*
* The property is the unix timestamp of the card's latest update time from Braze dashboard.
*/
@property (nonatomic, readonly) double updated;
/*
* The categories assigned to the card.
*/
@property ABKCardCategory categories;
/*
* The property is the unix timestamp of the card's expiration time. When the value is less than 0, it means the card
* doesn't an expire date.
*/
@property (readonly) double expiresAt;
/*!
* This property carries extra data in the form of an NSDictionary which can be sent down via the Braze Dashboard.
* You may want to design and implement a custom handler to access this data depending on your use case.
*/
@property (strong, nullable) NSDictionary *extras;
//Optional:
/*
* The URL string that will be opened after the card is clicked on.
*/
@property (copy, nullable) NSString *urlString;
/*!
* When the card's urlString is not nil, if the property is set to YES, the URL will be opened in a modal WKWebView
* inside the app. If this property is set to NO, the URL will be opened by the OS and web URLs will be opened in
* an external web browser app.
*
* This property defaults to NO.
*/
@property BOOL openUrlInWebView;
/*
* @param cardDictionary The dictionary for card deserialization.
*
* Deserializes the dictionary to a card for use by wrappers such as Braze's Unity SDK for iOS.
* When the deserialization isn't successful, this method returns nil; otherwise, it returns the deserialized card.
*/
+ (nullable ABKCard *)deserializeCardFromDictionary:(nullable NSDictionary *)cardDictionary;
/*
* Serializes the card to binary data for use by wrappers such as Braze's Unity SDK for iOS.
*/
- (nullable NSData *)serializeToData;
/*
* Manually log an impression to Braze for the card.
* This should only be used for custom news feed view controller. ABKFeedViewController already has card impression logging.
*/
- (void)logCardImpression;
/*
* Manually log a click to Braze for the card.
* This should only be used for custom news feed view controller. ABKFeedViewController already has card click logging.
* The SDK will only log a card click when the card has the url property with a valid url.
*/
- (void)logCardClicked;
- (BOOL)hasSameId:(ABKCard *)card;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKClassicCard.h
================================================
#import "ABKCard.h"
/*
* Braze Public API: ABKClassicCard
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKClassicCard : ABKCard <NSCoding>
/*
* This property is the URL of the card's image.
*/
@property (copy, nullable) NSString *image;
/*
* The description text for the card.
*/
@property (copy) NSString *cardDescription;
/*
* The news title text for the card.
*/
@property (copy, nullable) NSString *title;
/*
* The link text for the property url, like @"blog.appboy.com". It can be displayed on the card's
* UI to indicate the action/direction of clicking on the card.
*/
@property (copy, nullable) NSString *domain;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKClassicContentCard.h
================================================
#import "ABKContentCard.h"
NS_ASSUME_NONNULL_BEGIN
@interface ABKClassicContentCard : ABKContentCard <NSCoding>
/*
* The URL of the card's image.
*/
@property (copy, nullable) NSString *image;
/*
* The news title text for the card.
*/
@property (copy) NSString *title;
/*
* The description text for the card.
*/
@property (copy) NSString *cardDescription;
/*
* The link text for the property url, like @"blog.appboy.com". It can be displayed on the card's
* UI to indicate the action/direction of clicking on the card.
*/
@property (copy, nullable) NSString *domain;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKContentCard.h
================================================
#import <Foundation/Foundation.h>
/*
* Braze Public API: ABKContentCard
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKContentCard : NSObject <NSCopying, NSCoding>
/*!
* Card's ID.
*/
@property (readonly) NSString *idString;
/*!
* This property reflects if the card is read or unread by the user.
*/
@property (nonatomic) BOOL viewed;
/*!
* The property is the unix timestamp of the card's creation time from Braze dashboard.
*/
@property (nonatomic, readonly) double created;
/*!
* The property is the unix timestamp of the card's expiration time. When the value is less than 0, it means the card
* doesn't an expire date.
*/
@property (readonly) double expiresAt;
/*!
* This property reflects if the card can be dismissed by the user.
*/
@property (nonatomic) BOOL dismissible;
/*!
* This property reflects if the card has been pinned by the user.
*/
@property (nonatomic) BOOL pinned;
/*!
* This property reflects if the card has been dimissed.
*/
@property (nonatomic) BOOL dismissed;
/*!
* This property reflects if the card has been clicked.
*/
@property (nonatomic) BOOL clicked;
/*!
* This property carries extra data in the form of an NSDictionary which can be sent down via the Braze Dashboard.
* You may want to design and implement a custom handler to access this data depending on your use case.
*/
@property (strong, nullable) NSDictionary *extras;
/*!
* This property is set to YES if the instance represents a test content card
*/
@property (nonatomic, readonly) BOOL isTest;
/*!
* The URL string that will be opened after the card is clicked on.
*/
@property (copy, nullable) NSString *urlString;
/*!
* When the card's urlString is not nil, if the property is set to YES, the URL will be opened in a modal WKWebView
* inside the app. If this property is set to NO, the URL will be opened by the OS and web URLs will be opened in
* an external web browser app.
*
* This property defaults to NO.
*/
@property BOOL openUrlInWebView;
/*!
* @param cardDictionary The dictionary for card deserialization.
*
* Deserializes the dictionary to a card for use by wrappers such as Braze's Unity SDK for iOS.
* When the deserialization isn't successful, this method returns nil; otherwise, it returns the deserialized card.
*/
+ (nullable ABKContentCard *)deserializeCardFromDictionary:(nullable NSDictionary *)cardDictionary;
/*!
* Serializes the card to binary data for use by wrappers such as Braze's Unity SDK for iOS.
*/
- (nullable NSData *)serializeToData;
/*!
* Manually log an impression to Braze for the card.
* This should only be used for custom content card view controllers.
*/
- (void)logContentCardImpression;
/*!
* Manually log a click to Braze for the card.
* This should only be used for custom contentcard view controllers.
*/
- (void)logContentCardClicked;
/*!
* Manually dismiss a card.
* Sets the card's `dismissed` property to YES and logs the dismissal to Braze.
* Only has effect if the card is dismissible and if the `dismissed` property is currently set to NO.
*/
- (void)logContentCardDismissed;
- (BOOL)isControlCard;
- (BOOL)hasSameId:(ABKContentCard *)card;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKContentCardsController.h
================================================
#import <Foundation/Foundation.h>
/* ------------------------------------------------------------------------------------------------------
* Notifications
*/
/*!
* When Content Cards are updated, Braze will post a notification through the NSNotificationCenter.
* The name of the notification is the string constant referred to by ABKContentCardsProcessedNotification. The
* userInfo dictionary associated with the notification will has one object, with key the same string
* as ABKContentCardsProcessedIsSuccessfulKey, to indicate whether the update is successful or not.
*
* To listen for this notification, you would register an object as an observer of the notification
* using something like:
*
* <pre>
* [[NSNotificationCenter defaultCenter] addObserver:self
* selector:@selector(contentCardsUpdatedNotificationReceived:)
* name:ABKContentCardsProcessedNotification
* object:nil];
* </pre>
*
* where "contentCardsUpdatedNotificationReceived:" is your callback method for handling the notification:
*
* <pre>
* - (void)contentCardsUpdatedNotificationReceived:(NSNotification *)notification {
* BOOL updateIsSuccessful = [notification.userInfo[ABKContentCardsProcessedIsSuccessfulKey] boolValue];
* < Check if update was successful and do something in response to the notification >
* }
* </pre>
*/
NS_ASSUME_NONNULL_BEGIN
extern NSString *const ABKContentCardsProcessedNotification;
extern NSString *const ABKContentCardsProcessedIsSuccessfulKey;
/*
* Braze Public API: ABKContentCardsController
*/
@interface ABKContentCardsController : NSObject
/*!
* The latest content cards that are saved in memory and disk.
*/
@property (readonly, getter=getContentCards) NSArray *contentCards;
/*!
* The NSDate object that indicates the last time the contentCards property was updated from Braze server.
*/
@property (readonly, nullable) NSDate *lastUpdate;
/*!
* Returns the count of unviewed cards, excluding control cards.
* A "view" happens when a card becomes visible in the Content Cards view. This differentiates
* between cards which are off-screen in the scrolling view, and those which
* are on-screen; when a card scrolls onto the screen, it's counted as viewed.
*
* Cards are counted as viewed only once -- if a card scrolls off the screen and
* back on, it's not re-counted.
*
* Cards are counted only once even if they appear in multiple Content Cards views or across multiple devices.
*/
- (NSInteger)unviewedContentCardCount;
/*!
* Returns the count of available cards, including control cards.
* Cards are counted only once even if they appear in multiple Content Cards views.
*/
- (NSInteger)contentCardCount;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKFacebookUser.h
================================================
#import <Foundation/Foundation.h>
#import "ABKUser.h"
NS_ASSUME_NONNULL_BEGIN
extern NSInteger const DefaultNumberOfFriends;
/*
* Braze Public API: ABKFacebookUser
*/
@interface ABKFacebookUser : NSObject
/*!
* @param facebookUserDictionary The dictionary returned from facebook with facebook graph api endpoint "/me". Please
* refer to https://developers.facebook.com/docs/graph-api/reference/v4.0/user for more information.
* @param numberOfFriends The length of the friends array from facebook. You can get the array from the dictionary returned
* from facebook with facebook graph api endpoint "/me/friends", under the key "data". Please refer to
* https://developers.facebook.com/docs/graph-api/reference/v4.0/user/friends for more information.
* @param likes The array of user's facebook likes from facebook. You can get the array from the dictionary returned
* from facebook with facebook graph api endpoint "/me/likes", under the key "data"; Please refer to
* https://developers.facebook.com/docs/graph-api/reference/v4.0/user/likes for more information.
*
* @discussion: This method is to generate a ABKFacebookUser so you can pass the user's facebook account data to Braze.
* After a ABKFacebookUser object is generated, you can check the value of properties but you cannot change it.
* If you want to update the user's facebook data, you need to generate a new ABKFacebookUser instance and set it as
* [Appboy sharedInstance].user.facebookUser.
*/
- (instancetype)initWithFacebookUserDictionary:(nullable NSDictionary *)facebookUserDictionary
numberOfFriends:(NSInteger)numberOfFriends
likes:(nullable NSArray *)likes;
@property (readonly, nullable) NSDictionary *facebookUserDictionary;
@property (readonly) NSInteger numberOfFriends;
@property (readonly, nullable) NSArray *likes;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKFeedController.h
================================================
#import <Foundation/Foundation.h>
/* ------------------------------------------------------------------------------------------------------
* Notifications
*/
/*!
* When the news feed is updated, Braze will post a notification through the NSNotificationCenter.
* The name of the notification is the string constant referred to by ABKFeedUpdatedNotification. The
* userInfo dictionary associated with the notification will has one object, with key the same string
* as ABKFeedUpdatedIsSuccessfulKey, to indicate whether the update is successful or not.
*
* To listen for this notification, you would register an object as an observer of the notification
* using something like:
*
* <pre>
* [[NSNotificationCenter defaultCenter] addObserver:self
* selector:@selector(feedUpdatedNotificationReceived:)
* name:ABKFeedUpdatedNotification
* object:nil];
* </pre>
*
* where "feedUpdatedNotificationReceived:" is your callback method for handling the notification:
*
* <pre>
* - (void)feedUpdatedNotificationReceived:(NSNotification *)notification {
* BOOL updateIsSuccessful = [notification.userInfo[ABKFeedUpdatedIsSuccessfulKey] boolValue];
* < Do something in response to the notification >
* }
* </pre>
*/
NS_ASSUME_NONNULL_BEGIN
extern NSString *const ABKFeedUpdatedNotification;
extern NSString *const ABKFeedUpdatedIsSuccessfulKey;
/* ------------------------------------------------------------------------------------------------------
* Enums
*/
/*!
* Values representing the news feed cards' categories recognized by the SDK.
*/
typedef NS_OPTIONS(NSUInteger, ABKCardCategory) {
ABKCardCategoryNoCategory = 1 << 0,
ABKCardCategoryNews = 1 << 1,
ABKCardCategoryAdvertising = 1 << 2,
ABKCardCategoryAnnouncements = 1 << 3,
ABKCardCategorySocial = 1 << 4,
ABKCardCategoryAll = 1 << 0 | 1 << 1 | 1 << 2 | 1 << 3 | 1 << 4
};
/*
* Braze Public API: ABKFeedController
*/
@interface ABKFeedController : NSObject
/*!
* The latest cards of the Braze News Feed saved in memory and disk. Right now the available card types are ABKBannerCard,
* ABKCaptionedImageCard, ABKClassicCard and ABKTextAnnouncementCard. They are all subclasses
* of ABKCard.
*/
@property (readonly, getter=getNewsFeedCards) NSArray *newsFeedCards;
/*!
* The NSDate object that indicates the last time the newsFeedCards property was updated from the Braze server.
*/
@property (readonly, nullable) NSDate *lastUpdate;
/*!
* This method returns the number of currently active cards which have not been viewed in the given categories.
* A "view" happens when a card becomes visible in the feed view. This differentiates
* between cards which are off-screen in the scrolling view, and those which
* are on-screen; when a card scrolls onto the screen, it's counted as viewed.
*
* Cards are counted as viewed only once -- if a card scrolls off the screen and
* back on, it's not re-counted.
*
* Cards are counted only once even if they appear in multiple feed views or across multiple devices.
*/
- (NSInteger)unreadCardCountForCategories:(ABKCardCategory)categories;
/*!
* This method returns the total number of currently active cards belongs to given categories. Cards are
* counted only once even if they appear in multiple feed views.
*/
- (NSInteger)cardCountForCategories:(ABKCardCategory)categories;
/*!
* @param categories An ABKCardCategory indicating the categories that you want to get. You can pass more than one category
* at one time by using "|" to separate categories like: ABKCardCategoryNews | ABKCardCategoryAnnouncements | ABKCardCategorySocial
* @return An array of cards of the given categories.
*
* @discussion This method will find the cards of given categories and return them.
* When the given categories don't exist in any card, this method will return an empty array.
*/
- (NSArray *)getCardsInCategories:(ABKCardCategory)categories;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKIDFADelegate.h
================================================
#import <Foundation/Foundation.h>
/*
* Braze Public API: ABKAppboyIDFADelegate
*/
NS_ASSUME_NONNULL_BEGIN
@protocol ABKIDFADelegate <NSObject>
/*!
* Asks the delegate to return a valid IDFA for the current user.
*
* Use this delegate to pass the IDFA to Braze. Braze does not collect IDFA automatically.
*
* @return The current users's IDFA UUID.
*/
- (NSString *)advertisingIdentifierString;
/*!
* Asks the delegate to return whether advertising tracking is enabled for the current user.
*
* Your delegate implementation should use ATTrackingManager on iOS 14+ and ASIdentifierManager on earlier iOS versions.
*
* An example implementation is available here:
* https://github.com/Appboy/appboy-ios-sdk/blob/master/Example/Stopwatch/Sources/Utils/IDFADelegate.m
*
* @return YES if advertising tracking is enabled for iOS 14 and earlier or if AppTrackingTransparency (ATT) is authorized with iOS 14+, NO otherwise
*/
- (BOOL)isAdvertisingTrackingEnabledOrATTAuthorized;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKImageDelegate.h
================================================
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
/*
* This delegate protocol gives the Braze iOS SDK access to the image framework.
*/
typedef NS_OPTIONS(NSUInteger, ABKImageOptions ) {
ABKImageOptionsRetryFailed = 1 << 0,
ABKImageOptionsLowPriority = 1 << 1,
ABKImageOptionsCacheMemoryOnly = 1 << 2,
ABKImageOptionsProgressiveDownload = 1 << 3,
ABKImageOptionsRefreshCached = 1 << 4,
ABKImageOptionsContinueInBackground = 1 << 5,
ABKImageOptionsHandleCookies = 1 << 6,
};
@protocol ABKImageDelegate
- (void)setImageForView:(UIImageView *)imageView
showActivityIndicator:(BOOL)showActivityIndicator
withURL:(nullable NSURL *)imageURL
imagePlaceHolder:(nullable UIImage *)placeHolder
completed:(nullable void (^)(UIImage * _Nullable image, NSError * _Nullable error, NSInteger cacheType, NSURL * _Nullable imageURL))completion;
- (void)loadImageWithURL:(nullable NSURL *)url
options:(ABKImageOptions)options
completed:(nullable void(^)(UIImage *image, NSData *data, NSError *error, NSInteger cacheType, BOOL finished, NSURL *imageURL))completion;
- (void)diskImageExistsForURL:(nullable NSURL *)url
completed:(nullable void (^)(BOOL isInCache))completion;
- (nullable UIImage *)imageFromCacheForURL:(nullable NSURL *)url;
/*!
* @discussion Returns a class that is UIImageView or a subclass of UIImageView to allow the implementor to bring their own
* implementation of animated image support.
*/
- (Class)imageViewClass;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKInAppMessage.h
================================================
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@class ABKInAppMessageDarkTheme;
/*!
* The ABKInAppMessageClickActionType defines the action that will be performed when the in-app message is clicked.
*
* ABKInAppMessageDisplayNewsFeed - This is the default behavior. It will open a modal view of Braze news feed.
*
* ABKInAppMessageRedirectToURI - The in-app message will try to redirect to the uri defined by the uri property. Only when the uri
* is an HTTP URL, a modal web view will be displayed. If the uri is a protocol uri, the in-app message will redirect to the
* protocol uri.
*
* ABKInAppMessageNoneClickAction - The in-app message will do nothing but dismiss itself.
*/
typedef NS_ENUM(NSInteger, ABKInAppMessageClickActionType) {
ABKInAppMessageDisplayNewsFeed,
ABKInAppMessageRedirectToURI,
ABKInAppMessageNoneClickAction
};
/*!
* The ABKInAppMessageDismissType defines how the in-app message can be dismissed.
*
* ABKInAppMessageDismissAutomatically - This is the default behavior for ABKInAppMessageSlideup.
* It will dismiss after the length of time defined by the duration property.
* ABKInAppMessageSlideup of this type can also be dismissed by swiping.
*
* ABKInAppMessageDismissManually - This is the default behavior for ABKInAppMessageImmersive. The
* in-app message will stay on the screen indefinitely unless dismissed by swiping or a click on
* the close button.
*/
typedef NS_ENUM(NSInteger, ABKInAppMessageDismissType) {
ABKInAppMessageDismissAutomatically,
ABKInAppMessageDismissManually
};
/*!
* The ABKInAppMessageOrientation defines preferred screen orientation for the in-app message.
*
* ABKInAppMessageOrientationAny - This is the default value for an in-app message's orientation. This
* value allows the in-app message display in any orientation.
*
* ABKInAppMessageOrientationPortrait - This value will limit the in-app message to only display in
* protrait and portrait upside down orientation.
*
* ABKInAppMessageOrientationLandscape - This value will limit the in-app message to only display in
* landscape orientation, including landscape left and landscape right.
*/
typedef NS_ENUM(NSInteger, ABKInAppMessageOrientation) {
ABKInAppMessageOrientationAny,
ABKInAppMessageOrientationPortrait,
ABKInAppMessageOrientationLandscape
};
/*!
* Default icon and in-app message button background colors.
* These are used in the in-app message view controllers.
*/
static CGFloat const RedValueOfDefaultIconColorAndButtonBgColor = (CGFloat)0.0f;
static CGFloat const GreenValueOfDefaultIconColorAndButtonBgColor = (CGFloat)(115.0f / 255.0f);
static CGFloat const BlueValueOfDefaultIconColorAndButtonBgColor = (CGFloat)(213.0f / 255.0f);
static CGFloat const AlphaValueOfDefaultIconColorAndButtonBgColor = (CGFloat)1.0f;
/*
* Braze Public API: ABKInAppMessage
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKInAppMessage : NSObject
/*!
* This property defines the message displayed within the in-app message.
*/
@property (copy) NSString *message;
/*!
* This property carries extra data in the form of an NSDictionary which can be sent down via the Braze Dashboard.
* You may want to design and implement a custom handler to access this data depending on your use-case.
*/
@property (strong, nullable) NSDictionary *extras;
/*!
* This property defines the number of seconds before the in-app message is automatically dismissed.
*/
@property (nonatomic) NSTimeInterval duration;
/*!
* This property defines the action that will be performed when the in-app message is clicked.
* See the ABKInAppMessageClickActionType enum documentation above offers additional details.
*/
@property (readonly) ABKInAppMessageClickActionType inAppMessageClickActionType;
/*!
* When the in-app message's inAppMessageClickActionType is ABKInAppMessageRedirectToURI, clicking on the in-app message will redirect to the uri defined
* in this property.
*
* This property can be a HTTP URI or a protocol URI.
*/
@property (readonly, copy, nullable) NSURL *uri;
/*!
* When the in-app message's inAppMessageClickActionType is ABKInAppMessageRedirectToURI, if the property is set to YES,
* the URI will be opened in a modal WKWebView inside the app. If this property is set to NO, the URI will be opened by
* the OS and web URIs will be opened in an external web browser app.
*
* This property defaults to YES on ABKInAppMessageHTML subclasses and NO on all other ABKInAppMessage subclasses.
*/
@property BOOL openUrlInWebView;
/*!
* inAppMessageDismissType defines the dismissal behavior of the in-app message.
* See the above documentation for ABKInAppMessageDismissType for additional details.
*/
@property ABKInAppMessageDismissType inAppMessageDismissType;
/*!
* backgroundColor defines the background color of the in-app message. The default background color is black with 0.9 alpha for
* ABKInAppMessageSlideup, and white with 1.0 alpha for ABKInAppMessageModal and ABKInAppMessageFull.
*/
@property (nonatomic, strong, nullable) UIColor *backgroundColor;
/*!
* textColor defines the message text color of the in-app message. The default text color is black.
*/
@property (nonatomic, strong, nullable) UIColor *textColor;
/*!
* icon the unicode string of the Font Awesome icon for this in-app message.
*
* You may add Font Awesome icons to in-app messages from the Braze dashboard.
*/
@property (nonatomic, copy, nullable) NSString *icon;
/*!
* iconColor defines the font color of icon property.
* The default font color is white.
*/
@property (nonatomic, strong, nullable) UIColor *iconColor;
/*!
* iconBackgroundColor defines the background color of icon property.
* * The default background color's RGB values are R:0 G:115 B:213.
*/
@property (nonatomic, strong, nullable) UIColor *iconBackgroundColor;
/*!
* This boolean determines if the in-app message will attempt to use dark theme colors, granted the device
* is in dark mode and the fields are present in the response.
*
* @discussion The default of this value is YES but can be overriden in `beforeInAppMessageDisplayed:`
* to ensure that the dark theme is disabled for any given in-app message.
*/
@property (nonatomic, assign) BOOL enableDarkTheme;
/*!
* Data model that contains all the dark theme color info for any visible views, including any buttons
* that may be present.
*/
@property (nonatomic, strong, nullable) ABKInAppMessageDarkTheme *darkTheme;
/*!
* An optional UIUserInterfaceStyle that can be used to force dark or light mode.
*
* @discussion The default value will not override OS settings but can
* be overriden in `beforeInAppMessageDisplayed:`
* to ensure that the dark or light theme is used for any given in-app message.
* This property is of type NSInteger to avoid any iOS version dependencies.
*/
@property (nonatomic) NSInteger overrideUserInterfaceStyle;
/*!
* imageURI defines the URI of the image icon on in-app message.
* When there is a iconImage defined, the iconImage will be used and the value of property icon will
* be ignored.
*/
@property (copy, nullable) NSURL *imageURI;
/*!
* imageContentMode defines the content mode of the image on in-app message.
* For immersive in-app messages, the imageContentMode defines both the image icon and the graphic
* image's content mode.
*
* The imageContentMode default values are:
* Slideup: UIViewContentModeScaleAspectFit
* Modal: UIViewContentModeScaleAspectFit
* Full: UIViewContentModeScaleAspectFill
*/
@property UIViewContentMode imageContentMode;
/*!
* orientation defines the preferred screen orientation for the in-app message.
* In-app messages will only display if the preferred orientation matches the current status bar
* orientation. However, there is an important exception for iPads. For in-app messages that
* have a preferred orientation and are being displayed on an iPad, the in-app message will appear
* in the style of the preferred orientation regardless of actual screen orientation.
*/
@property ABKInAppMessageOrientation orientation;
/*!
* messageTextAlignment defines the preferred text alignment of the message label.
* The default values are:
* Slideup: NSTextAlignmentNatural
* Modal: NSTextAlignmentCenter
* Full: NSTextAlignmentCenter
*/
@property NSTextAlignment messageTextAlignment;
/*
* animateIn/animateOut define if the in-app message should be animated in/out on the screen when
* displaying/dismissing. The default value is YES.
*/
@property BOOL animateIn;
@property BOOL animateOut;
/*!
* isControl defines whether this in-app message is a control. Control in-app messages should not be displayed to users.
*/
@property BOOL isControl;
/*!
* If you're handling in-app messages completely on your own, you should still report
* impressions and clicks on the in-app message back to Braze with these methods so that your campaign reporting features
* still work in the dashboard.
*
* Note: Each in-app message can log at most one impression and at most one click.
*/
- (void)logInAppMessageImpression;
- (void)logInAppMessageClicked;
/*!
* This method will set the inAppMessageClickActionType property.
*
* When clickActionType is ABKInAppMessageRedirectToURI, the parameter uri cannot be nil. When clickActionType is
* ABKInAppMessageDisplayNewsFeed or ABKInAppMessageNoneClickAction, the parameter uri will be ignored, and property uri
* will be set to nil.
*/
- (void)setInAppMessageClickAction:(ABKInAppMessageClickActionType)clickActionType withURI:(nullable NSURL *)uri;
/*!
* Serializes the in-app message to binary data for use by wrappers such as Braze's Unity SDK for iOS.
*/
- (nullable NSData *)serializeToData;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKInAppMessageButton.h
================================================
#import "ABKInAppMessage.h"
/*
* Braze Public API: ABKInAppMessageButton
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKInAppMessageButton : NSObject
/*!
* This property defines the button title text in UIControlStateNormal. Setting this property will also change the button
* title text.
*/
@property (copy, nullable) NSString *buttonText;
/*!
* This property defines the button's background color.
*/
@property (strong, nullable) UIColor *buttonBackgroundColor;
/*!
* This property defines the button's border color.
* If this property is not sent from the server, the background color is used.
*/
@property (strong, nullable) UIColor *buttonBorderColor;
/*!
* This property defines the button's title color in UIControlStateNormal. Setting this property will also change the
* button title color.
*/
@property (strong, nullable) UIColor *buttonTextColor;
/*!
* This property defines the button title font in UIControlStateNormal. Please set this property before the in-app message
* is displayed, or the displayed in-app message will not apply the font.
*/
@property (copy, nullable) UIFont *buttonTextFont;
/*!
* This property defines the action that will be performed when the button is clicked.
* See the ABKInAppMessageClickActionType enum documentation in ABKInAppMessage.h offers additional details.
*/
@property (readonly) ABKInAppMessageClickActionType buttonClickActionType;
/*!
* When the button's buttonClickActionType is ABKInAppMessageRedirectToURI, clicking on the button will redirect to the uri
* defined in this property.
*
* This property can be a HTTP URI or a protocol URI.
*/
@property (readonly, copy, nullable) NSURL *buttonClickedURI;
/*!
* When the button's buttonClickActionType is ABKInAppMessageRedirectToURI, if the property is set to YES,
* the URI will be opened in a modal WKWebView inside the app. If this property is set to NO, the URI will be opened by
* the OS and web URIs will be opened in an external web browser app.
*
* This property defaults to NO.
*/
@property BOOL buttonOpenUrlInWebView;
/*!
* This property defines the button's ID. Button's ID is used to track user's clicking action and used for corresponding
* data analytics.
*/
@property (readonly) NSInteger buttonID;
/*!
* This method will set the buttonClickActionType property.
*
* When clickActionType is ABKInAppMessageRedirectToURI, the parameter uri cannot be nil, and the value will be passed to
* buttonClickedURI. When clickActionType is ABKInAppMessageDisplayNewsFeed or ABKInAppMessageNoneClickAction, the
* parameter uri will be ignored, and property uri will be set to nil.
*/
- (void)setButtonClickAction:(ABKInAppMessageClickActionType)clickActionType withURI:(nullable NSURL *)uri;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKInAppMessageControl.h
================================================
#import "ABKInAppMessage.h"
/*
* Braze Public API: ABKInAppMessageControl
*/
@interface ABKInAppMessageControl : ABKInAppMessage
@end
================================================
FILE: AppboyKit/include/ABKInAppMessageController.h
================================================
#import <Foundation/Foundation.h>
#import "ABKInAppMessage.h"
#import "ABKInAppMessageControllerDelegate.h"
#import "ABKInAppMessageUIControlling.h"
/*! Note: This class is not thread safe and all class methods should be called from the main thread.*/
/*
* Braze Public API: ABKInAppMessageController
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKInAppMessageController : NSObject
/*!
* Setting the delegate allows your app to control how, when, and if in-app messages are displayed.
* Your app can set the delegate to override the default behavior of the ABKInAppMessageController. See
* ABKInAppMessageControllerDelegate.h for more information.
*/
@property (weak, nonatomic, nullable) id <ABKInAppMessageControllerDelegate> delegate;
/*!
* If you have implemented the In-App Message subspec, you can use the ABKInAppMessageUIController to control
* in-app message behavior. See ABKInAppMessageUIController for more information.
*/
@property (strong, nonatomic, nullable) id<ABKInAppMessageUIControlling> inAppMessageUIController;
/*!
* This boolean determines if modal in-app messages will be dismissed when the user taps outside of the
* in-app message.
*
* @discussion The default of this value is NO but can be overriden by setting the value of ABKEnableDismissModalOnOutsideTapKey in
* appboyOptions or in the Braze dictionary in your Info.plist file.
*/
@property BOOL enableDismissModalOnOutsideTap;
/*!
* @param delegate The in-app message delegate that implements the ABKInAppMessageControllerDelegate methods. If the delegate is
* nil, it acts as one which always returns ABKDisplayInAppMessageNow and doesn't implement all other delegate methods.
*
* @discussion This method grabs the next in-app message from the in-app message stack, if there is one, and displays it with
* the provided delegate. The delegate must return a ABKInAppMessageDisplayChoice that defines how the in-app message will be
* handled. Please refer to the ABKInAppMessageDisplayChoice enum documentation for more detailed information.
*
* If there are no in-app messages available this returns immediately having taken no action.
*/
- (void)displayNextInAppMessageWithDelegate:(nullable id<ABKInAppMessageControllerDelegate>)delegate __deprecated_msg("Please use 'displayNextInAppMessage' instead.");
/*!
* Displays the next in-app message from the in-app message stack.
*
* This method pops the next in-app message from the in-app message stack and tries to displays it.
* When defined, the current delegate methods are executed to respect any custom behavior.
*/
- (void)displayNextInAppMessage;
/*!
* @return The number of in-app messages that are locally waiting to be displayed.
*
* @discussion Use this method to check how many in-app messages are waiting to be displayed and call
* displayNextInAppMessageWithDelegate: at to display it. If an in-app message is currently being displayed, it will not be included
* in the count.
*
* Note: Returning ABKDisplayInAppMessageLater in the beforeInAppMessageDisplayed: delegate method will put the in-app message back onto
* the stack and this will be reflected in inAppMessagesRemainingOnStack.
*/
- (NSInteger)inAppMessagesRemainingOnStack;
/*!
* @discussion This method allows you to request display of an in-app message. It adds the in-app message object to the top of the in-app message stack
* and tries to display it immediately.
*
* If you add an ABKInAppMessage instance that you received through a Braze delegate method - i.e. one that is associated with a campaign or Canvas,
* then impression and click analytics will work automatically. If you add an ABKInAppMessage instance that you instantiated yourself programmatically
* (uncommon), then analytics will not be available.
*
* @param newInAppMessage the in-app message to add.
*/
- (void)addInAppMessage:(ABKInAppMessage *)newInAppMessage;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKInAppMessageControllerDelegate.h
================================================
#import <Foundation/Foundation.h>
#import "ABKInAppMessage.h"
NS_ASSUME_NONNULL_BEGIN
/*!
* Possible values for in-app message handling after a in-app message is offered to an ABKInAppMessageControllerDelegate
* ABKDisplayInAppMessageNow - The in-app message will be displayed immediately.
* ABKDisplayInAppMessageLater - The in-app message will be not be displayed and will be placed back onto the top of the stack.
* ABKDiscardInAppMessage - The in-app message will be discarded and will not be displayed.
* ABKReenqueueInAppMessage - The in-app message will not be displayed and all trigger times and re-eligibility will rollback as if the trigger never occurred.
*
* The following conditions can cause a in-app message to be offered to the delegate defined by the delegate property on
* [Appboy sharedInstance].inAppMessageController:
* - A in-app message is received from the Braze server.
* - A in-app message is waiting to display when an UIApplicationDidBecomeActiveNotification event occurs.
* - A in-app message is added by ABKInAppMessageController method addInAppMessage:.
*
* You can choose to manually display any in-app messages that are waiting locally to be displayed by calling:
* [[Appboy sharedInstance].inAppMessageController displayNextInAppMessage].
*/
typedef NS_ENUM(NSInteger, ABKInAppMessageDisplayChoice) {
ABKDisplayInAppMessageNow,
ABKDisplayInAppMessageLater,
ABKDiscardInAppMessage,
ABKReenqueueInAppMessage,
};
typedef NS_ENUM(NSInteger, ABKTriggerEventType) {
ABKTriggerEventTypeSessionStart,
ABKTriggerEventTypeCustomEvent,
ABKTriggerEventTypePurchase,
ABKTriggerEventTypeOther
};
/*!
* The in-app message delegate allows you to control the display of the Braze in-app message. For more detailed
* information on in-app message behavior, including when and how the delegate is used, see the documentation for the
* ABKInAppMessageDisplayChoice enum above for more detailed information.
*
* This delegate is for those who are using the Core subspec and not integrating the In-App Message subspec. If
* you are using the In-App Message subspec, please use ABKInAppMessageUIDelegate.
*/
/*!
* Braze Public API: ABKInAppMessageControllerDelegate
*/
@protocol ABKInAppMessageControllerDelegate <NSObject>
@optional
/*!
* @param inAppMessage The in-app message object being offered to the delegate method.
* @return ABKInAppMessageDisplayChoice The in-app message display choice. For details refer to the documentation regarding the ENUM ABKInAppMessageDisplayChoice
* above.
*
* This delegate method defines whether the in-app message will be displayed now, displayed later, or discarded.
*
* If there are situations where you would not want the in-app message to appear (such as during a full screen
* game or on a loading screen), you can use this delegate to delay or discard pending in-app message messages.
*/
- (ABKInAppMessageDisplayChoice)beforeInAppMessageDisplayed:(ABKInAppMessage *)inAppMessage;
/*!
* @param inAppMessage The control in-app message object being offered to the delegate method.
* @return ABKInAppMessageDisplayChoice The control in-app message impression logging choice.
* For details refer to the documentation regarding the ENUM ABKInAppMessageDisplayChoice above.
* Logging a control message impression is an equivalent of displaying the message, except that no actual display occurs.
*
* This delegate method defines the timing of when the control in-app message impression event should be logged: now, later, discarded, or re-enqueued.
* Logging a control message impression is an equivalent of displaying the message, except that no actual display occurs.
*
* If there are situations where you would not want the control in-app message impression to be logged, you can use this delegate to delay
* or discard it.
*/
- (ABKInAppMessageDisplayChoice)beforeControlMessageImpressionLogged:(ABKInAppMessage *)inAppMessage;
/*!
* Executed when no trigger matches the Braze event.
*
* @param eventType The type of event that failed to match the user's triggers.
* @param name The event name of a custom event, the product identifier for a purchase
* event, or `nil` for a session start event.
*/
- (void)noMatchingTriggerForEvent:(ABKTriggerEventType)eventType
name:(nullable NSString *)name;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKInAppMessageDarkButtonTheme.h
================================================
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface ABKInAppMessageDarkButtonTheme : NSObject
/*!
* Dark theme of the button's background color.
*/
@property (strong) UIColor *buttonBackgroundColor;
/*!
* Dark theme of the button's border color.
*/
@property (strong) UIColor *buttonBorderColor;
/*!
* Dark theme of the button's text color.
*/
@property (strong) UIColor *buttonTextColor;
/*!
* Creates a model containing the dark theme colors for buttons by parsing the dictionary `darkButtonFields`
*/
- (instancetype)initWithFields:(NSDictionary *)darkButtonFields;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKInAppMessageDarkTheme.h
================================================
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@class ABKInAppMessageButton;
@class ABKInAppMessageDarkButtonTheme;
NS_ASSUME_NONNULL_BEGIN
@interface ABKInAppMessageDarkTheme : NSObject
/* Properties of all ABKInAppMessages */
@property (nonatomic, strong, nullable) UIColor *backgroundColor;
@property (nonatomic, strong, nullable) UIColor *textColor;
@property (nonatomic, strong, nullable) UIColor *iconColor;
@property (nonatomic, strong, nullable) UIColor *iconBackgroundColor;
/* ABKInAppMessageImmersive only */
@property (nonatomic, strong, nullable) UIColor *headerTextColor;
@property (nonatomic, strong, nullable) UIColor *closeButtonColor;
@property (nonatomic, strong, nullable) UIColor *frameColor;
/*!
* An array of all the button color properties, in the same order as the buttons object in ABKInAppImmersive
*/
@property (nonatomic, strong, nullable) NSArray<ABKInAppMessageDarkButtonTheme *> *buttons;
/*!
* Data model storing all the Dark Theme values passed down from the server for an in-app message.
* This only gets initalized if the campaign is set up to support Dark Theme and has the fields populated.
*/
- (instancetype)initWithFields:(NSDictionary<NSString *, NSString *> *)darkThemeFields;
/*!
* Returns the dark color variant given a valid key. If the key isn't found, returns nil.
*/
- (UIColor *)getColorForKey:(NSString *)key;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKInAppMessageFull.h
================================================
#import "ABKInAppMessageImmersive.h"
/*
* Braze Public API: ABKInAppMessageFull
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKInAppMessageFull : ABKInAppMessageImmersive
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKInAppMessageHTML.h
================================================
#import <Foundation/Foundation.h>
#import "ABKInAppMessageHTMLBase.h"
/*
* Braze Public API: ABKInAppMessageHTML
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKInAppMessageHTML : ABKInAppMessageHTMLBase
/*!
* This property indicates whether the content was built by our platform.
*/
@property (nonatomic) BOOL trusted;
/*!
* This property is an array of asset URLs that are used when generating the HTML.
*/
@property (strong, nonatomic, nullable) NSArray *assetUrls;
/*!
* This property is a dictionary of other structured data that can be included with the in-app message.
*/
@property (strong, nonatomic, nullable) NSDictionary *messageFields;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKInAppMessageHTMLBase.h
================================================
#import <Foundation/Foundation.h>
#import "ABKInAppMessage.h"
/*
* Braze Public API: ABKInAppMessageHTMLBase
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKInAppMessageHTMLBase : ABKInAppMessage
/*!
* This is the local URL of the assets directory for the HTML in-app message. Please note that the
* value of this property can be overridden by Braze at the time of displaying, so please don't set
* it as the value will be discarded.
*/
@property (strong, nonatomic) NSURL *assetsLocalDirectoryPath;
/*!
* Log a click on the in-app message with a buttonId. HTMLFull in-app messages have the limitation of only
* handling a single button click, but we allow HTML in-app messages to handle multiple button clicks.
*
* @param buttonId the id of the click
*/
- (void)logInAppMessageHTMLClickWithButtonID:(NSString *)buttonId;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKInAppMessageHTMLFull.h
================================================
#import <Foundation/Foundation.h>
#import "ABKInAppMessageHTMLBase.h"
/*
* Braze Public API: ABKInAppMessageHTMLFull
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKInAppMessageHTMLFull : ABKInAppMessageHTMLBase
/*!
* This property is the remote URL of the assets zip file.
*/
@property (strong, nonatomic, nullable) NSURL *assetsZipRemoteUrl;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKInAppMessageImmersive.h
================================================
#import "ABKInAppMessage.h"
@class ABKInAppMessageButton;
/*
* Braze Public API: ABKInAppMessageImmersive
*/
NS_ASSUME_NONNULL_BEGIN
/*!
* The ABKInAppMessageImmersiveImageStyle defines the image style of the in-app message
*
* ABKInAppMessageGraphic - The image will make up the entire in-app message, with buttons on the
* image(buttons are optional). No icons, headers or message will be displayed in this style.
*
*
* ABKInAppMessageTopImage - This is the default image style. The image will be on upper top of the
* in-app message if there is one, with all other in-app message elements.
*/
typedef NS_ENUM(NSInteger, ABKInAppMessageImmersiveImageStyle) {
ABKInAppMessageGraphic,
ABKInAppMessageTopImage
};
@interface ABKInAppMessageImmersive : ABKInAppMessage
/*!
* header defines the header text of the in-app message.
* The header will only be displayed in one line on the default Braze in-app messages. If the header is more than one
* line, it will be truncated at the end.
*/
@property (copy, nullable) NSString *header;
/*!
* headerTextColor defines the header text color, when there is a header string in the in-app message. The default text color
* is black.
*/
@property (nonatomic, strong, nullable) UIColor *headerTextColor;
/*!
* closeButtonColor defines the close button color of the in-app message.
* When this property is nil, the close button's default color is black.
*/
@property (nonatomic, strong, nullable) UIColor *closeButtonColor;
/*!
* buttons defines the buttons of the in-app message.
* Each button must be an instance of ABKInAppMessageButton.
* When there are more than two buttons in the array, only the first two buttons will be displayed in the in-app message.
* For more information and setting of ABKInAppMessageButton, please see the documentation in ABKInAppMessageButton.h for additional details.
*/
@property (readonly, copy, nullable) NSArray<ABKInAppMessageButton *> *buttons;
/*!
* frameColor defines the frame color of an immersive in-app message. This color will fill the
* screen outside of the in-app message. When the property is nil, the color will be
* set to the default color, which is black with 90% opacity.
*/
@property (nonatomic, strong, nullable) UIColor *frameColor;
/*!
* headerTextAlignment defines the preferred text alignment of the header label.
* The default value is NSTextAlignmentCenter.
*/
@property NSTextAlignment headerTextAlignment;
/*!
* imageStyle defines the image style of a immersive in-app message.
* For more information about the possible image styles, please check the documentation of
* ABKInAppMessageImmersiveImageStyle above.
*/
@property ABKInAppMessageImmersiveImageStyle imageStyle;
/*!
* @param buttonId The clicked button's button ID for the in-app message. This number can't be negative.
* If you're handling in-app messages completely on your own, you should still report
* clicks on the in-app message button back to Braze with this method so that your campaign reporting features
* still work in the dashboard.
*
* Note: Each in-app message can log at most one button click.
*/
- (void)logInAppMessageClickedWithButtonID:(NSInteger)buttonId;
/*!
* @param buttonArray The button array for the in-app message. This array should NOT be nil nor empty. Every object in the array
* must be an instance of ABKInAppMessageButton.
*
* This method will set the in-app message buttons.
*/
- (void)setInAppMessageButtons:(NSArray *)buttonArray;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKInAppMessageModal.h
================================================
#import "ABKInAppMessageImmersive.h"
/*
* Braze Public API: ABKInAppMessageModal
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKInAppMessageModal : ABKInAppMessageImmersive
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKInAppMessageSlideup.h
================================================
#import "ABKInAppMessage.h"
/*!
* There are two possible values which control where the in-app message will enter the view.
*
* ABKInAppMessageSlideupFromBottom - This is the default behavior.
* The in-app message will slide onto the screen from the bottom edge of the view and will hide by sliding back down off
* the bottom of the screen.
*
* ABKInAppMessageSlideupFromTop - The in-app message will slide onto the screen from the top edge of the view and will hide by sliding
* back up off the top of the screen.
*/
typedef NS_ENUM(NSInteger, ABKInAppMessageSlideupAnchor) {
ABKInAppMessageSlideupFromTop,
ABKInAppMessageSlideupFromBottom
};
/*
* Braze Public API: ABKInAppMessageSlideup
*/
NS_ASSUME_NONNULL_BEGIN
@interface ABKInAppMessageSlideup : ABKInAppMessage
/*!
* If hideChevron equals YES, the in-app message will not render the chevron on the right side of the in-app message.
* The chevron is a useful visual cue for the user that more content may be reached by tapping the in-app message.
*/
@property BOOL hideChevron;
/*!
* inAppMessageSlideupAnchor defines the position of the in-app message on screen.
* See the above documentation for ABKInAppMessageAnchor enum documentation above offers additional details.
*/
@property ABKInAppMessageSlideupAnchor inAppMessageSlideupAnchor;
/*!
* chevronColor defines the chevron arrow color of the in-app message.
* When this property is nil, the chevron's default color is white.
*/
@property (strong, nullable) UIColor *chevronColor;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKInAppMessageUIControlling.h
================================================
#import <Foundation/Foundation.h>
#import "ABKInAppMessage.h"
#import "ABKInAppMessageControllerDelegate.h"
@protocol ABKInAppMessageUIControlling <NSObject>
@optional
/*!
* @discussion This method sets the optional ABKInAppMessageUIDelegate.
*
* To set this delegate, call [[Appboy sharedInstance].inAppMessageController.inAppMessageUIController
* setInAppMessageUIDelegate: ] after initializing Braze.
*/
- (void)setInAppMessageUIDelegate:(id)uiDelegate;
/*!
* @discussion This method will hide the in-app message that is currently being displayed.
* The animated parameter controls whether or not the in-app message will be animated
* away. This method does nothing if no in-app
* message is currently being displayed.
*
* Note: This will not fire the onInAppMessageDismissed: delegate method.
*
* For customization, please use a subclass or category to override this method.
*/
- (void)hideCurrentInAppMessage:(BOOL)animated;
/*!
* @discussion This method will return the ABKInAppMessageDisplayChoice (see ABKInAppMessageControllerDelegate
* for more information) based on whether or not the keyboard is showing.
* If you have implemented the beforeInAppMessageDisplayed:withKeyboardIsUp: in
* ABKInAppMessageUIDelegate, the choice returned there will override the default choice.
*
* For customization, please use a subclass or category to override this method.
*/
- (ABKInAppMessageDisplayChoice)getCurrentDisplayChoiceForInAppMessage:(ABKInAppMessage *)inAppMessage;
/*!
* @discussion This method will return the ABKInAppMessageDisplayChoice (see ABKInAppMessageControllerDelegate
* for more information) based on whether or not the keyboard is showing.
*
* For customization, please use a subclass or category to override this method.
*/
- (ABKInAppMessageDisplayChoice)getCurrentDisplayChoiceForControlInAppMessage:(ABKInAppMessage *)controlInAppMessage;
/*!
* @discussion This method displays the in-app message. We call it when the in-app message has no
* image URL, or there is an image URL, and it has already been downloaded. If you call
* this method directly and the image hasn't been downloaded, there will be a spinner
* animating in the image view.
*
* For customization, please use a subclass or category to override this method.
*/
- (void)showInAppMessage:(ABKInAppMessage *)inAppMessage;
/*!
* @discussion This method returns whether or not an in-app message is currently being shown.
*
* For customization, please use a subclass or category to override this method.
*/
- (BOOL)inAppMessageCurrentlyVisible;
@end
================================================
FILE: AppboyKit/include/ABKInAppMessageWebViewBridge.h
================================================
#import <WebKit/WebKit.h>
#import "ABKInAppMessageHTML.h"
NS_ASSUME_NONNULL_BEGIN
@class Appboy;
@class ABKInAppMessageHTML;
@protocol ABKInAppMessageWebViewBridgeDelegate;
#pragma mark - ABKInAppMessageWebViewBridge
/*!
* The webview bridge
* @discussion The bridge is automatically setup on initialization and destroyed on dealloc. The bridge
* needs to be retained to stay enabled. Keep a strong instance of the bridge in a property to do so
*/
@interface ABKInAppMessageWebViewBridge : NSObject <WKScriptMessageHandler>
/*!
* The delegate instance
*/
@property (nonatomic, weak) id<ABKInAppMessageWebViewBridgeDelegate> delegate;
/*!
* Initialize an instance of ABKInAppMessageWebViewBridge
* @param webView The WKWebView in which the bridge needs to be setup
* @param inAppMessage The InAppMessage being displayed
* @param appboy The Appboy instance
*/
- (instancetype)initWithWebView:(WKWebView *)webView
inAppMessage:(ABKInAppMessageHTML *)inAppMessage
appboyInstance:(Appboy *)appboy;
@end
#pragma mark - ABKInAppMessageWebViewBridgeDelegate
/*!
* Methods for managing bridge related actions
*/
@protocol ABKInAppMessageWebViewBridgeDelegate <NSObject>
/*!
* Tells the delegate that the bridge has received a click action to execute
* @param webViewBridge The bridge informing the delegate
* @param clickAction The clickAction performed
*/
- (void)webViewBridge:(ABKInAppMessageWebViewBridge *)webViewBridge
receivedClickAction:(ABKInAppMessageClickActionType)clickAction;
/*!
* Tells the delegate that a close message action was received
* @param webViewBridge The bridge informing the delegate
*/
- (void)closeMessageWithWebViewBridge:(ABKInAppMessageWebViewBridge *)webViewBridge;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKLocationManager.h
================================================
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
@class ABKServerConfig;
NS_ASSUME_NONNULL_BEGIN
@interface ABKLocationManager : NSObject <CLLocationManagerDelegate>
/*!
* Use ABKEnableAutomaticLocationCollectionKey to enable automatic location tracking.
* For more information, please refer to Appboy.h.
*/
@property (readonly) BOOL enableLocationTracking;
/*!
* Use ABKEnableGeofencesKey to enable geofences.
* For more information, please refer to Appboy.h.
*/
@property (readonly) BOOL enableGeofences;
/*!
* Use ABKDisableAutomaticGeofenceRequestsKey to disable automatic geofence requests.
* For more information, please refer to requestGeofencesWithLongitude:latitude: in Appboy.h
*/
@property (readonly) BOOL disableAutomaticGeofenceRequests;
/*!
* Calling this method will log a location using the regular location provider if a location is reported in under
* 60 seconds. After 60 seconds expires the regular location provider will stop collecting location.
*/
- (void)logSingleLocation;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKLocationManagerProvider.h
================================================
#import <Foundation/Foundation.h>
/*!
* Do not call these methods within your code. They are meant for Braze internal use only.
*/
/*!
* ABKLocationManagerProvider.h and ABKLocationManagerProvider.m must be added to your project
* regardless of whether or not you enable location services. This occurs automatically if you integrate/update via the CocoaPod.
*/
/*
* Braze Public API: ABKLocationManagerProvider
*/
@class CLLocationManager;
NS_ASSUME_NONNULL_BEGIN
@interface ABKLocationManagerProvider : NSObject
+ (BOOL)locationServicesEnabled;
@end
NS_ASSUME_NONNULL_END
================================================
FILE: AppboyKit/include/ABKModalWebViewController.h
================================================
#import <UIKit/UIKit.h>
#import <WebKit/WebKit.h>
@interface ABKModalWebViewController : UINavigationController <WKNavigationDelegate>
/*!
* The url the modal web view controller should open. Please note that this is the initial url and
* won't be updated if the initial url re-directs to another url.
*/
@property NSURL *url;
/*!
* The WKWebView which displays the web view.
*/
@property (nonatomic) IBOutlet WKWebView *webView;
/*!
* The UIProgressView which shows the web view loading process. It will be on top of the web view and
* will disappear as soon as the page is loaded.
*/
@property (nonatomic) IBOutlet UIProgressView *progressBar;
@end
================================================
FILE: AppboyKit/include/ABKNoConnectionLocalization.h
================================================
#import <Foundation/Foundation.h>
@interface ABKNoConnectionLocalization : NSObject
+ (NSString *)getNoConnectionLocalizedString;
@end
================================================
FILE: AppboyKit/include/ABKPushUtils.h
================================================
#if !TARGET_OS_TV
#import <Foundation/Foundation.h>
#import <UserNotifications/UserNotifications.h>
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
/*
* Braze Public API: ABKPushUtils
*/
@interface ABKPushUtils : NSObject
/*!
* @param response The UNNotificationResponse passed to userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:.
*
* @return YES if the user notification was sent from Braze servers.
*/
+ (BOOL)isAppboyUserNotification:(UNNotificationResponse *)response API_AVAILABLE(ios(10.0), macCatalyst(14.0));
/*!
* @param userInfo The userInfo dictionary passed to application:didReceiveRemoteNotification:fetchCompletionHandler:
* or application:didReceiveRemoteNotification:.
*
* @return YES if the push notification was sent from Braze servers.
*/
+ (BOOL)isAppboyRemoteNotification:(NSDictionary *)userInfo;
/*!
* @param userInfo The userInfo dictionary passed to application:didReceiveRemoteNotification:fetchCompletionHandler:
* or application:didReceiveRemoteNotification:.
*
* @return YES if the push notification was sent by Braze for an internal feature.
*
* @discussion Braze uses content-available silent notifications for internal features. You can use this method to ensure
* your app doesn't take any undesired or unnecessary actions upon receiving Braze's internal content-available notifications
* (e.g., pinging your server for content).
*/
+ (BOOL)isAppboyInternalRemoteNotification:(NSDictionary *)userInfo;
/*!
* @param response The UNNotificationResponse passed to userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:.
*
* @return YES if the user notification was sent by Braze for uninstall tracking.
*
* @discussion Uninstall tracking notifications are content-available silent notifications. You can use this method to ensure
* your app doesn't take any undesired or unnecessary actions upon receiving Braze's uninstall tracking notifications
* (e.g., pinging your server for content).
*/
+ (BOOL)isUninstallTrackingUserNotification:(UNNotificationResponse *)response API_AVAILABLE(ios(10.0), macCatalyst(14.0));
/*!
* @param userInfo The userInfo dictionary passed to application:didReceiveRemoteNotification:fetchCompletionHandler:
* or application:didReceiveRemoteNotification:.
*
* @return YES if the push notification was sent by Braze for uninstall tracking.
*
* @discussion Uninstall tracking notifications are content-available silent notifications. You can use this method to ensure
* your app doesn't take any undesired or unnecessary actions upon receiving Braze's uninstall tracking notifications
* (e.g., pinging your server for content).
*/
+ (BOOL)isUninstallTrackingRemoteNotification:(NSDictionary *)userInfo;
/*!
* @param response The UNNotificationResponse passed to userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler:.
*
* @return YES if the user notification was sent by Braze for syncing geofences.
*
* @discussion Geofence sync notifications are content-available silent notifications. You can use this method to ensure
* your app doesn't take any undesired or unnecessary actions upon receiving Braze's geofence sync notifications
* (e.g., pinging your server for content).
*/
+ (BOOL)isGeofencesSyncUserNotification:(UNNotificationResponse *)response API_AVAILABLE(ios(10.0), macCatalyst(14.0));
/*!
* @param userInfo The userInfo dictionary passed to application:didReceiveRemoteNotification:fetchCompletionHandler:
* or application:didReceiveRemoteNotification:.
*
* @return YES if the push notification was sent by Braze for syncing geofences.
*
* @discussion Geofence sync notifications are content-available silent notifications. You can use this method to ensure
* your app doesn't take any undesired or unnecessary actions upon receiving Braze's geofence sync notifications
* (e.g., pinging your server for content).
*/
+ (BOOL)isGeofencesSyncRemoteNotification:(NSDictionary *)userInfo;
/*!
* @param userInfo The userInfo dictionary passed to application:didReceiveRemoteNotification:fetchCompletionHandler:
*
* @return YES if the push notification was sent by Braze and is silent.
*/
+ (BOOL)isAppboySilentRemoteNotification:(NSDictionary *)userInfo;
/*!
* @param userInfo The userInfo dictionary passed to application:didReceiveRemoteNotification:fetchCompletionHandler:
* or application:didReceiveRemoteNotification:.
*
* @return YES if the push notification was sent by Braze for push stories.
*/
+ (BOOL)isPushStoryRemoteNotification:(NSDictionary *)userInfo;
+ (BOOL)notificationContainsContentCard:(NSDictionary *)userInfo;
/*!
* @param userInfo The userInfo dictionary payload.
*
* @return YES if the notification contains an a flag that inticates the device should fetch test triggers from the server.
*
*/
+ (BOOL)shouldFetchTestTriggersFlagContainedInPayload:(NSDictionary *)userInfo __deprecated;
/*!
* @return A set of the default UNNotificationCategories used by Braze.
*/
+ (NSSet<UNNotificationCategory *> *)getAppboyUNNotificationCategorySet API_AVAILABLE(ios(10.0), macCatalyst(14.0));
+ (NSSet<UIUserNotificationCategory *> *)getAppboyUIUserNotificationCategorySet __deprecated_msg("Please use `getAppboyUNNotificationCategorySet` instead.");
@end
NS_ASSUME_NONNULL_END
#endif
================================================
FILE: AppboyKit/include/ABKSDWebImageProxy.h
================================================
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
static NSString *const CORE_VERSION_WARNING = @"Attempting to download image but Braze image utilities not found. Make sure you chose the UI Subspec if you want to use Braze's UI.";
/*
* This proxy class gives the Braze iOS SDK access to the SDWebImage framework.
*
* NOTE:
* This class requires SDWebImage version 4.0*.
*/
@interface ABKSDWebImageProxy : NSObject
+ (void)setImageForView:(UIImageView *)imageView
showActivityIndicator:(BOOL)showActivityIndicator
withURL:(nullable NSURL *)imageURL
imagePlaceHolder:(nullable UIImage *)placeHolder
completed:(nullable void (^)(UIImage * _Nullable image, NSError * _Nullable error, NSInteger cacheType, NSURL * _Nullable imageURL))completion;
+ (void)loadImageWithURL:(nullable NSURL *)url
options:(NSInteger)options
completed:(nullable void(^)(UIImage *image, NSData *data, NSError *erro
gitextract_0k488zaf/ ├── .github/ │ └── ISSUE_TEMPLATE/ │ ├── bug.yml │ ├── config.yml │ └── feature.yml ├── .gitignore ├── Appboy-Push-Story.podspec ├── Appboy-iOS-SDK.podspec ├── Appboy-tvOS-SDK/ │ └── AppboyTVOSKit.framework/ │ ├── AppboyTVOSKit │ ├── Headers/ │ │ ├── ABKAttributionData.h │ │ ├── ABKBannerCard.h │ │ ├── ABKBannerContentCard.h │ │ ├── ABKCaptionedImageCard.h │ │ ├── ABKCaptionedImageContentCard.h │ │ ├── ABKCard.h │ │ ├── ABKClassicCard.h │ │ ├── ABKClassicContentCard.h │ │ ├── ABKContentCard.h │ │ ├── ABKFacebookUser.h │ │ ├── ABKFeedController.h │ │ ├── ABKSdkAuthenticationDelegate.h │ │ ├── ABKSdkAuthenticationError.h │ │ ├── ABKSdkMetadata.h │ │ ├── ABKTextAnnouncementCard.h │ │ ├── ABKTwitterUser.h │ │ ├── ABKUser.h │ │ ├── Appboy.h │ │ └── AppboyKit.h │ ├── Info.plist │ └── Modules/ │ └── module.modulemap ├── Appboy-tvOS-SDK.podspec ├── AppboyKit/ │ ├── ABKLocationManagerProvider.m │ ├── ABKModalWebViewController.m │ ├── ABKNoConnectionLocalization.m │ ├── ABKSDWebImageProxy.m │ ├── Appboy.bundle/ │ │ ├── Info.plist │ │ ├── PrivacyInfo.xcprivacy │ │ ├── ZipArchive_LICENSE.txt │ │ ├── _CodeSignature/ │ │ │ ├── CodeDirectory │ │ │ ├── CodeRequirements │ │ │ ├── CodeRequirements-1 │ │ │ ├── CodeResources │ │ │ └── CodeSignature │ │ ├── appboy-spm-cleanup.sh │ │ ├── ar.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── cs.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── da.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── de.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── en.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── es-419.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── es-MX.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── es.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── et.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── fi.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── fil.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── fr.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── he.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── hi.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── id.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── it.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── ja.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── km.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── ko.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── lo.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── ms.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── my.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── nb.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── nl.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── pl.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── pt-PT.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── pt.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── ru.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── sv.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── th.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── uk.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── vi.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── zh-HK.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── zh-Hans.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── zh-Hant.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ ├── zh-TW.lproj/ │ │ │ └── LocalizedAppboyUIString.strings │ │ └── zh.lproj/ │ │ └── LocalizedAppboyUIString.strings │ └── include/ │ ├── ABKAttributionData.h │ ├── ABKBannerCard.h │ ├── ABKBannerContentCard.h │ ├── ABKCaptionedImageCard.h │ ├── ABKCaptionedImageContentCard.h │ ├── ABKCard.h │ ├── ABKClassicCard.h │ ├── ABKClassicContentCard.h │ ├── ABKContentCard.h │ ├── ABKContentCardsController.h │ ├── ABKFacebookUser.h │ ├── ABKFeedController.h │ ├── ABKIDFADelegate.h │ ├── ABKImageDelegate.h │ ├── ABKInAppMessage.h │ ├── ABKInAppMessageButton.h │ ├── ABKInAppMessageControl.h │ ├── ABKInAppMessageController.h │ ├── ABKInAppMessageControllerDelegate.h │ ├── ABKInAppMessageDarkButtonTheme.h │ ├── ABKInAppMessageDarkTheme.h │ ├── ABKInAppMessageFull.h │ ├── ABKInAppMessageHTML.h │ ├── ABKInAppMessageHTMLBase.h │ ├── ABKInAppMessageHTMLFull.h │ ├── ABKInAppMessageImmersive.h │ ├── ABKInAppMessageModal.h │ ├── ABKInAppMessageSlideup.h │ ├── ABKInAppMessageUIControlling.h │ ├── ABKInAppMessageWebViewBridge.h │ ├── ABKLocationManager.h │ ├── ABKLocationManagerProvider.h │ ├── ABKModalWebViewController.h │ ├── ABKNoConnectionLocalization.h │ ├── ABKPushUtils.h │ ├── ABKSDWebImageProxy.h │ ├── ABKSdkAuthenticationDelegate.h │ ├── ABKSdkAuthenticationError.h │ ├── ABKSdkMetadata.h │ ├── ABKTextAnnouncementCard.h │ ├── ABKTwitterUser.h │ ├── ABKURLDelegate.h │ ├── ABKUser.h │ ├── Appboy.h │ └── AppboyKit.h ├── AppboyPushStory/ │ ├── Dummy.m │ ├── Resources/ │ │ └── ABKPageView.nib │ └── include/ │ └── AppboyPushStory/ │ ├── ABKStoriesView.h │ ├── ABKStoriesViewDataSource.h │ └── AppboyPushStory.h ├── AppboyUI/ │ ├── ABKContentCards/ │ │ ├── AppboyContentCards.h │ │ ├── Resources/ │ │ │ ├── Base.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── ar.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── cs.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── da.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── de.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── en.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── es-419.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── es-MX.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── es.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── et.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── fi.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── fil.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── fr.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── he.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── hi.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── id.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── it.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── ja.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── km.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── ko.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── lo.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── ms.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── my.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── nb.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── nl.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── pl.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── pt-PT.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── pt.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── ru.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── sv.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── th.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── uk.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── vi.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── zh-HK.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── zh-Hans.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── zh-Hant.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ ├── zh-TW.lproj/ │ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ │ └── zh.lproj/ │ │ │ └── AppboyContentCardsLocalizable.strings │ │ └── ViewControllers/ │ │ ├── ABKContentCardsTableViewController.h │ │ ├── ABKContentCardsTableViewController.m │ │ ├── ABKContentCardsViewController.h │ │ ├── ABKContentCardsViewController.m │ │ ├── ABKContentCardsWebViewController.h │ │ ├── ABKContentCardsWebViewController.m │ │ └── Cells/ │ │ ├── ABKBannerContentCardCell.h │ │ ├── ABKBannerContentCardCell.m │ │ ├── ABKBaseContentCardCell.h │ │ ├── ABKBaseContentCardCell.m │ │ ├── ABKCaptionedImageContentCardCell.h │ │ ├── ABKCaptionedImageContentCardCell.m │ │ ├── ABKClassicContentCardCell.h │ │ ├── ABKClassicContentCardCell.m │ │ ├── ABKClassicImageContentCardCell.h │ │ ├── ABKClassicImageContentCardCell.m │ │ ├── ABKControlTableViewCell.h │ │ └── ABKControlTableViewCell.m │ ├── ABKInAppMessage/ │ │ ├── ABKInAppMessageUIButton.h │ │ ├── ABKInAppMessageUIButton.m │ │ ├── ABKInAppMessageUIController.h │ │ ├── ABKInAppMessageUIController.m │ │ ├── ABKInAppMessageUIDelegate.h │ │ ├── ABKInAppMessageView.h │ │ ├── ABKInAppMessageView.m │ │ ├── ABKInAppMessageWindow.h │ │ ├── ABKInAppMessageWindow.m │ │ ├── AppboyInAppMessage.h │ │ ├── Resources/ │ │ │ ├── ABKInAppMessageFullViewController.xib │ │ │ ├── ABKInAppMessageModalViewController.xib │ │ │ ├── ABKInAppMessageSlideupViewController.xib │ │ │ ├── Base.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── FontAwesome.otf │ │ │ ├── ar.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── cs.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── da.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── de.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── en.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── es-419.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── es-MX.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── es.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── et.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── fi.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── fil.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── fr.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── he.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── hi.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── id.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── it.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── ja.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── km.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── ko.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── lo.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── ms.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── my.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── nb.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── nl.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── pl.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── pt-PT.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── pt.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── ru.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── sv.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── th.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── uk.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── vi.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── zh-HK.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── zh-Hans.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── zh-Hant.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ ├── zh-TW.lproj/ │ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ │ └── zh.lproj/ │ │ │ └── AppboyInAppMessageLocalizable.strings │ │ └── ViewControllers/ │ │ ├── ABKInAppMessageFullViewController.h │ │ ├── ABKInAppMessageFullViewController.m │ │ ├── ABKInAppMessageHTMLBaseViewController.h │ │ ├── ABKInAppMessageHTMLBaseViewController.m │ │ ├── ABKInAppMessageHTMLFullViewController.h │ │ ├── ABKInAppMessageHTMLFullViewController.m │ │ ├── ABKInAppMessageHTMLViewController.h │ │ ├── ABKInAppMessageHTMLViewController.m │ │ ├── ABKInAppMessageImmersiveViewController.h │ │ ├── ABKInAppMessageImmersiveViewController.m │ │ ├── ABKInAppMessageModalViewController.h │ │ ├── ABKInAppMessageModalViewController.m │ │ ├── ABKInAppMessageSlideupViewController.h │ │ ├── ABKInAppMessageSlideupViewController.m │ │ ├── ABKInAppMessageViewController.h │ │ ├── ABKInAppMessageViewController.m │ │ ├── ABKInAppMessageWindowController.h │ │ └── ABKInAppMessageWindowController.m │ ├── ABKNewsFeed/ │ │ ├── AppboyNewsFeed.h │ │ ├── Resources/ │ │ │ ├── Base.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── ar.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── cs.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── da.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── de.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── en.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── es-419.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── es-MX.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── es.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── et.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── fi.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── fil.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── fr.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── he.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── hi.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── id.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── it.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── ja.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── km.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── ko.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── lo.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── ms.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── my.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── nb.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── nl.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── pl.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── pt-PT.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── pt.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── ru.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── sv.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── th.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── uk.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── vi.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── zh-HK.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── zh-Hans.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── zh-Hant.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ ├── zh-TW.lproj/ │ │ │ │ └── AppboyFeedLocalizable.strings │ │ │ └── zh.lproj/ │ │ │ └── AppboyFeedLocalizable.strings │ │ └── ViewControllers/ │ │ ├── ABKFeedWebViewController.h │ │ ├── ABKFeedWebViewController.m │ │ ├── ABKNewsFeedTableViewController.h │ │ ├── ABKNewsFeedTableViewController.m │ │ ├── ABKNewsFeedViewController.h │ │ ├── ABKNewsFeedViewController.m │ │ └── Cells/ │ │ ├── ABKNFBannerCardCell.h │ │ ├── ABKNFBannerCardCell.m │ │ ├── ABKNFBaseCardCell.h │ │ ├── ABKNFBaseCardCell.m │ │ ├── ABKNFCaptionedMessageCardCell.h │ │ ├── ABKNFCaptionedMessageCardCell.m │ │ ├── ABKNFClassicCardCell.h │ │ └── ABKNFClassicCardCell.m │ └── ABKUIUtils/ │ ├── ABKSDWebImageImageDelegate.h │ ├── ABKSDWebImageImageDelegate.m │ ├── ABKUIURLUtils.h │ ├── ABKUIURLUtils.m │ ├── ABKUIUtils.h │ └── ABKUIUtils.m ├── CHANGELOG.md ├── Example/ │ ├── Podfile │ ├── README.md │ ├── Stopwatch/ │ │ ├── Resources/ │ │ │ ├── ABKContentCardsCustomStoryboard.storyboard │ │ │ ├── ABKContentCardsStoryboard.storyboard │ │ │ ├── ABKNewsFeedCardStoryboard.storyboard │ │ │ ├── Assets.xcassets/ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Contents.json │ │ │ │ ├── IAM.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Icons_Read.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── Icons_Unread.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── appboy_cc_noimage_lrg.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── bolt.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── newsfeed.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ ├── stopwatch_cc_icon_pinned.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── user.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── LaunchScreen.storyboard │ │ │ ├── en.lproj/ │ │ │ │ ├── Localizable.strings │ │ │ │ └── MainStoryboard.storyboard │ │ │ ├── he.lproj/ │ │ │ │ └── Localizable.strings │ │ │ ├── zh-Hans.lproj/ │ │ │ │ └── Localizable.strings │ │ │ └── zh-Hant.lproj/ │ │ │ └── Localizable.strings │ │ ├── Sources/ │ │ │ ├── AppDelegate.h │ │ │ ├── AppDelegate.m │ │ │ ├── Categories/ │ │ │ │ ├── UIViewController+Keyboard.h │ │ │ │ └── UIViewController+Keyboard.m │ │ │ ├── Utils/ │ │ │ │ ├── AlertControllerUtils.h │ │ │ │ ├── AlertControllerUtils.m │ │ │ │ ├── ColorUtils.h │ │ │ │ ├── ColorUtils.m │ │ │ │ ├── IDFADelegate.h │ │ │ │ ├── IDFADelegate.m │ │ │ │ ├── LoggerUtils.h │ │ │ │ ├── SdkAuthDelegate.h │ │ │ │ └── SdkAuthDelegate.m │ │ │ ├── ViewControllers/ │ │ │ │ ├── Advanced/ │ │ │ │ │ ├── About/ │ │ │ │ │ │ ├── AboutViewController.h │ │ │ │ │ │ └── AboutViewController.m │ │ │ │ │ ├── Data/ │ │ │ │ │ │ ├── DataViewController.h │ │ │ │ │ │ └── DataViewController.m │ │ │ │ │ └── Misc/ │ │ │ │ │ ├── CustomThemesDataSource.h │ │ │ │ │ ├── CustomThemesDataSource.m │ │ │ │ │ ├── GeofencesViewController.h │ │ │ │ │ ├── GeofencesViewController.m │ │ │ │ │ ├── MiscViewController.h │ │ │ │ │ └── MiscViewController.m │ │ │ │ ├── Braze UI/ │ │ │ │ │ ├── FeedUIViewController.h │ │ │ │ │ └── FeedUIViewController.m │ │ │ │ ├── ContainerViewController.h │ │ │ │ ├── ContainerViewController.m │ │ │ │ ├── CustomTabBarController.h │ │ │ │ ├── CustomTabBarController.m │ │ │ │ ├── IAM/ │ │ │ │ │ ├── Controls/ │ │ │ │ │ │ ├── InAppMessageTestViewController.h │ │ │ │ │ │ └── InAppMessageTestViewController.m │ │ │ │ │ └── UI/ │ │ │ │ │ ├── HTML/ │ │ │ │ │ │ ├── InAppMessageWithJS.html │ │ │ │ │ │ └── InAppMessageWithoutAssetZip.html │ │ │ │ │ ├── InAppMessageHTMLComposerViewController.h │ │ │ │ │ ├── InAppMessageHTMLComposerViewController.m │ │ │ │ │ ├── InAppMessageUICells.h │ │ │ │ │ ├── InAppMessageUICells.m │ │ │ │ │ ├── InAppMessageUIViewController.h │ │ │ │ │ └── InAppMessageUIViewController.m │ │ │ │ └── User/ │ │ │ │ ├── Alias/ │ │ │ │ │ ├── AliasViewController.h │ │ │ │ │ └── AliasViewController.m │ │ │ │ ├── Array/ │ │ │ │ │ ├── UserAttributesArrayViewController.h │ │ │ │ │ └── UserAttributesArrayViewController.m │ │ │ │ ├── Attributes/ │ │ │ │ │ ├── Location Custom Attribute/ │ │ │ │ │ │ ├── LocationAnnotation.h │ │ │ │ │ │ ├── LocationAnnotation.m │ │ │ │ │ │ ├── LocationCustomAttributeViewController.h │ │ │ │ │ │ └── LocationCustomAttributeViewController.m │ │ │ │ │ ├── UserAttributesViewController.h │ │ │ │ │ ├── UserAttributesViewController.m │ │ │ │ │ └── Views/ │ │ │ │ │ ├── UserCells.h │ │ │ │ │ ├── UserCells.m │ │ │ │ │ ├── UserCustomAttribute.h │ │ │ │ │ ├── UserCustomAttribute.m │ │ │ │ │ ├── UserCustomAttributeCell.h │ │ │ │ │ ├── UserCustomAttributeCell.m │ │ │ │ │ ├── UserSubscriptionGroup.h │ │ │ │ │ ├── UserSubscriptionGroup.m │ │ │ │ │ ├── UserSubscriptionGroupCell.h │ │ │ │ │ └── UserSubscriptionGroupCell.m │ │ │ │ └── Events/ │ │ │ │ ├── EventsViewController.h │ │ │ │ └── EventsViewController.m │ │ │ ├── Views/ │ │ │ │ ├── ScrollContentView.h │ │ │ │ ├── ScrollContentView.m │ │ │ │ ├── StopwatchButton.h │ │ │ │ ├── StopwatchButton.m │ │ │ │ ├── StopwatchSegmentedControl.h │ │ │ │ └── StopwatchSegmentedControl.m │ │ │ └── main.m │ │ └── Supporting Files/ │ │ ├── Info.plist │ │ ├── Stopwatch-Prefix.pch │ │ └── Stopwatch.entitlements │ ├── Stopwatch.xcodeproj/ │ │ ├── project.pbxproj │ │ └── project.xcworkspace/ │ │ └── contents.xcworkspacedata │ ├── Stopwatch.xcworkspace/ │ │ └── contents.xcworkspacedata │ ├── StopwatchNotificationContentExtension/ │ │ ├── Base.lproj/ │ │ │ └── MainInterface.storyboard │ │ ├── Info.plist │ │ ├── NotificationViewController.h │ │ ├── NotificationViewController.m │ │ └── StopwatchNotificationContentExtension.entitlements │ ├── StopwatchNotificationService/ │ │ ├── Info.plist │ │ ├── NotificationService.h │ │ └── NotificationService.m │ ├── tvOS_Stopwatch/ │ │ ├── AppDelegate.h │ │ ├── AppDelegate.m │ │ ├── Assets.xcassets/ │ │ │ ├── App Icon & Top Shelf Image.brandassets/ │ │ │ │ ├── App Icon - Large.imagestack/ │ │ │ │ │ ├── Back.imagestacklayer/ │ │ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── Front.imagestacklayer/ │ │ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── Middle.imagestacklayer/ │ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── Contents.json │ │ │ │ ├── App Icon - Small.imagestack/ │ │ │ │ │ ├── Back.imagestacklayer/ │ │ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ └── Contents.json │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── Front.imagestacklayer/ │ │ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── Middle.imagestacklayer/ │ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── Contents.json │ │ │ │ ├── Contents.json │ │ │ │ ├── Top Shelf Image Wide.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── Top Shelf Image.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ └── LaunchImage.launchimage/ │ │ │ └── Contents.json │ │ ├── Base.lproj/ │ │ │ └── Main.storyboard │ │ ├── Info.plist │ │ ├── ViewController.h │ │ ├── ViewController.m │ │ └── main.m │ └── tvOS_TVML_Stopwatch/ │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── AppboyBridge.h │ ├── AppboyBridge.m │ ├── Assets.xcassets/ │ │ ├── App Icon & Top Shelf Image.brandassets/ │ │ │ ├── App Icon - Large.imagestack/ │ │ │ │ ├── Back.imagestacklayer/ │ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── Contents.json │ │ │ │ ├── Contents.json │ │ │ │ ├── Front.imagestacklayer/ │ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── Contents.json │ │ │ │ └── Middle.imagestacklayer/ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ ├── App Icon - Small.imagestack/ │ │ │ │ ├── Back.imagestacklayer/ │ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── Contents.json │ │ │ │ ├── Contents.json │ │ │ │ ├── Front.imagestacklayer/ │ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── Contents.json │ │ │ │ └── Middle.imagestacklayer/ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ └── Top Shelf Image.imageset/ │ │ │ └── Contents.json │ │ ├── Contents.json │ │ └── LaunchImage.launchimage/ │ │ └── Contents.json │ ├── Info.plist │ ├── application.js │ └── main.m ├── HelloSwift/ │ ├── HelloSwift/ │ │ ├── AppDelegate.swift │ │ ├── Base.lproj/ │ │ │ ├── LaunchScreen.xib │ │ │ └── Main.storyboard │ │ ├── HelloSwift-Bridging-Header.h │ │ ├── HelloSwift.entitlements │ │ ├── Images.xcassets/ │ │ │ └── AppIcon.appiconset/ │ │ │ └── Contents.json │ │ ├── Info.plist │ │ └── ViewController.swift │ ├── HelloSwift.xcodeproj/ │ │ └── project.pbxproj │ ├── HelloSwift.xcworkspace/ │ │ └── contents.xcworkspacedata │ ├── HelloSwiftNotificationContentExtension/ │ │ ├── Base.lproj/ │ │ │ └── MainInterface.storyboard │ │ ├── HelloSwiftNotificationContentExtension.entitlements │ │ ├── Info.plist │ │ └── NotificationViewController.swift │ ├── HelloSwiftNotificationExtension/ │ │ ├── HelloSwiftNotificationExtension.entitlements │ │ ├── Info.plist │ │ └── NotificationService.swift │ ├── HelloSwiftTests/ │ │ └── AppboyPushUnitTests.m │ ├── Podfile │ └── tvOS_HelloSwift/ │ ├── AppDelegate.swift │ ├── Assets.xcassets/ │ │ ├── App Icon & Top Shelf Image.brandassets/ │ │ │ ├── App Icon - App Store.imagestack/ │ │ │ │ ├── Back.imagestacklayer/ │ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── Contents.json │ │ │ │ ├── Contents.json │ │ │ │ ├── Front.imagestacklayer/ │ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── Contents.json │ │ │ │ └── Middle.imagestacklayer/ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ ├── App Icon.imagestack/ │ │ │ │ ├── Back.imagestacklayer/ │ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── Contents.json │ │ │ │ ├── Contents.json │ │ │ │ ├── Front.imagestacklayer/ │ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ │ └── Contents.json │ │ │ │ │ └── Contents.json │ │ │ │ └── Middle.imagestacklayer/ │ │ │ │ ├── Content.imageset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ ├── Top Shelf Image Wide.imageset/ │ │ │ │ └── Contents.json │ │ │ └── Top Shelf Image.imageset/ │ │ │ └── Contents.json │ │ └── Contents.json │ ├── Base.lproj/ │ │ └── LaunchScreen.storyboard │ ├── ContentView.swift │ ├── Info.plist │ └── Preview Content/ │ └── Preview Assets.xcassets/ │ └── Contents.json ├── LICENSE ├── Package.swift ├── README.md ├── Samples/ │ ├── ContentCards/ │ │ └── BrazeContentCardsSampleApp/ │ │ ├── BrazeContentCardsSampleApp/ │ │ │ ├── AppDelegate.h │ │ │ ├── AppDelegate.m │ │ │ ├── Assets.xcassets/ │ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ │ └── Contents.json │ │ │ │ └── Contents.json │ │ │ ├── Base.lproj/ │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ └── Main.storyboard │ │ │ ├── CustomCaptionedImageContentCardCell.h │ │ │ ├── CustomCaptionedImageContentCardCell.m │ │ │ ├── CustomClassicContentCardCell.h │ │ │ ├── CustomClassicContentCardCell.m │ │ │ ├── CustomContentCardsTableViewController.h │ │ │ ├── CustomContentCardsTableViewController.m │ │ │ ├── Info.plist │ │ │ ├── ViewController.h │ │ │ ├── ViewController.m │ │ │ └── main.m │ │ ├── BrazeContentCardsSampleApp.xcodeproj/ │ │ │ └── project.pbxproj │ │ ├── BrazeContentCardsSampleApp.xcworkspace/ │ │ │ └── contents.xcworkspacedata │ │ ├── Podfile │ │ └── Podfile.lock │ ├── Core/ │ │ └── ObjCSample/ │ │ ├── ObjCSample/ │ │ │ ├── AppDelegate.h │ │ │ ├── AppDelegate.m │ │ │ ├── Assets.xcassets/ │ │ │ │ └── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Base.lproj/ │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ └── Main.storyboard │ │ │ ├── Info.plist │ │ │ ├── ObjCSample.entitlements │ │ │ ├── ViewController.h │ │ │ ├── ViewController.m │ │ │ └── main.m │ │ ├── ObjCSample.xcodeproj/ │ │ │ └── project.pbxproj │ │ ├── ObjCSample.xcworkspace/ │ │ │ └── contents.xcworkspacedata │ │ ├── Podfile │ │ └── Podfile.lock │ ├── InAppMessage/ │ │ └── BrazeInAppMessageSample/ │ │ ├── BrazeInAppMessageSample/ │ │ │ ├── AppDelegate.h │ │ │ ├── AppDelegate.m │ │ │ ├── Assets.xcassets/ │ │ │ │ └── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Base.lproj/ │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ └── Main.storyboard │ │ │ ├── CustomInAppMessageViewController.h │ │ │ ├── CustomInAppMessageViewController.m │ │ │ ├── CustomInAppMessageViewController.xib │ │ │ ├── Info.plist │ │ │ ├── ViewController.h │ │ │ ├── ViewController.m │ │ │ └── main.m │ │ ├── BrazeInAppMessageSample.xcodeproj/ │ │ │ └── project.pbxproj │ │ ├── BrazeInAppMessageSample.xcworkspace/ │ │ │ └── contents.xcworkspacedata │ │ ├── Podfile │ │ └── Podfile.lock │ └── NewsFeed/ │ └── BrazeNewsFeedSample/ │ ├── BrazeNewsFeedSample/ │ │ ├── AppDelegate.h │ │ ├── AppDelegate.m │ │ ├── Assets.xcassets/ │ │ │ └── AppIcon.appiconset/ │ │ │ └── Contents.json │ │ ├── Base.lproj/ │ │ │ ├── LaunchScreen.storyboard │ │ │ └── Main.storyboard │ │ ├── CustomFeedTableViewController.h │ │ ├── Info.plist │ │ ├── ViewController.h │ │ ├── ViewController.m │ │ └── main.m │ ├── BrazeNewsFeedSample.xcodeproj/ │ │ └── project.pbxproj │ ├── BrazeNewsFeedSample.xcworkspace/ │ │ └── contents.xcworkspacedata │ ├── Podfile │ └── Podfile.lock ├── appboy_ios_sdk.json ├── appboy_ios_sdk_core.json └── appboy_ios_sdk_full.json
SYMBOL INDEX (14 symbols across 10 files)
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKSdkMetadata.h
type NSString (line 5) | typedef NSString *ABKSdkMetadata
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKUser.h
type ABKOptedIn (line 35) | typedef NS_ENUM(NSInteger, ABKNotificationSubscriptionType) {
FILE: Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/Appboy.h
type ABKAutomaticRequestProcessing (line 196) | typedef NS_ENUM(NSInteger, ABKRequestProcessingPolicy) {
type ABKPushNotificationChannel (line 239) | typedef NS_ENUM(NSInteger, ABKChannel) {
FILE: AppboyKit/include/ABKInAppMessage.h
type ABKInAppMessageDisplayNewsFeed (line 17) | typedef NS_ENUM(NSInteger, ABKInAppMessageClickActionType) {
type ABKInAppMessageDismissAutomatically (line 34) | typedef NS_ENUM(NSInteger, ABKInAppMessageDismissType) {
type ABKInAppMessageOrientationAny (line 51) | typedef NS_ENUM(NSInteger, ABKInAppMessageOrientation) {
FILE: AppboyKit/include/ABKInAppMessageControllerDelegate.h
type ABKTriggerEventTypeSessionStart (line 28) | typedef NS_ENUM(NSInteger, ABKTriggerEventType) {
FILE: AppboyKit/include/ABKInAppMessageSlideup.h
type ABKInAppMessageSlideupFromTop (line 13) | typedef NS_ENUM(NSInteger, ABKInAppMessageSlideupAnchor) {
FILE: AppboyKit/include/ABKSdkMetadata.h
type NSString (line 5) | typedef NSString *ABKSdkMetadata
FILE: AppboyKit/include/ABKUser.h
type ABKOptedIn (line 35) | typedef NS_ENUM(NSInteger, ABKNotificationSubscriptionType) {
FILE: AppboyKit/include/Appboy.h
type ABKAutomaticRequestProcessing (line 196) | typedef NS_ENUM(NSInteger, ABKRequestProcessingPolicy) {
type ABKPushNotificationChannel (line 239) | typedef NS_ENUM(NSInteger, ABKChannel) {
FILE: Example/Stopwatch/Sources/Utils/ColorUtils.h
type StopwatchInAppThemeDefault (line 7) | typedef NS_ENUM(NSInteger, StopwatchInAppThemes) {
Condensed preview — 582 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,059K chars).
[
{
"path": ".github/ISSUE_TEMPLATE/bug.yml",
"chars": 3198,
"preview": "name: 🐞 Bug report\ndescription: File a Bug Report for unexpected or incorrect SDK Behavior\ntitle: '[Bug]: '\nlabels: [\"bu"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 533,
"preview": "blank_issues_enabled: false\ncontact_links:\n - name: Braze Swift SDK\n url: https://github.com/braze-inc/braze-swift-s"
},
{
"path": ".github/ISSUE_TEMPLATE/feature.yml",
"chars": 1243,
"preview": "name: ✅ Feature Request\ndescription: Request New SDK Features\ntitle: '[Feature]: '\nlabels: [\"feature-request\"]\nbody:\n -"
},
{
"path": ".gitignore",
"chars": 181,
"preview": ".DS_Store\n\nExample/build/\nExample/builds/\nPods/\nPodfile.lock\n!Samples/**/Podfile.lock\n\nxcuserdata/\n.idea/\n**xcshareddata"
},
{
"path": "Appboy-Push-Story.podspec",
"chars": 880,
"preview": "Pod::Spec.new do |s|\n s.name = \"Appboy-Push-Story\"\n s.version = \"4.7.0\"\n s.summary = \"This is the B"
},
{
"path": "Appboy-iOS-SDK.podspec",
"chars": 2774,
"preview": "Pod::Spec.new do |s|\n s.name = \"Appboy-iOS-SDK\"\n s.version = \"4.7.0\"\n s.summary = \"This is the Braz"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKAttributionData.h",
"chars": 933,
"preview": "#import <Foundation/Foundation.h>\n\n\n/*\n * Braze Public API: ABKAttributionData\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface AB"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKBannerCard.h",
"chars": 703,
"preview": "#import \"ABKCard.h\"\n\n/*\n * Braze Public API: ABKBannerCard\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKBannerCard : ABKCar"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKBannerContentCard.h",
"chars": 403,
"preview": "#import \"ABKContentCard.h\"\n\n@interface ABKBannerContentCard : ABKContentCard <NSCoding>\n\n/*\n * The URL of the card's ima"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKCaptionedImageCard.h",
"chars": 882,
"preview": "#import \"ABKCard.h\"\n\n/*\n * Braze Public API: ABKCaptionedImageCard\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKCaptionedIm"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKCaptionedImageContentCard.h",
"chars": 836,
"preview": "#import \"ABKContentCard.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKCaptionedImageContentCard : ABKContentCard <NSCoding>\n"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKCard.h",
"chars": 2767,
"preview": "#import <Foundation/Foundation.h>\n#import \"ABKFeedController.h\"\n\n/*\n * Braze Public API: ABKCard\n */\nNS_ASSUME_NONNULL_B"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKClassicCard.h",
"chars": 659,
"preview": "#import \"ABKCard.h\"\n\n/*\n * Braze Public API: ABKClassicCard\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKClassicCard : ABKC"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKClassicContentCard.h",
"chars": 609,
"preview": "#import \"ABKContentCard.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKClassicContentCard : ABKContentCard <NSCoding>\n\n/*\n * "
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKContentCard.h",
"chars": 3186,
"preview": "#import <Foundation/Foundation.h>\n\n/*\n * Braze Public API: ABKContentCard\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKCont"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKFacebookUser.h",
"chars": 1894,
"preview": "#import <Foundation/Foundation.h>\n#import \"ABKUser.h\"\n\nNS_ASSUME_NONNULL_BEGIN\nextern NSInteger const DefaultNumberOfFri"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKFeedController.h",
"chars": 4079,
"preview": "#import <Foundation/Foundation.h>\n\n/* ----------------------------------------------------------------------------------"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKSdkAuthenticationDelegate.h",
"chars": 819,
"preview": "#import <Foundation/Foundation.h>\n#import \"ABKSdkAuthenticationError.h\"\n\n/*\n * Braze Public API: ABKSdkAuthenticationDel"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKSdkAuthenticationError.h",
"chars": 885,
"preview": "#import <Foundation/Foundation.h>\n\n/*\n * Braze Public API: ABKSdkAuthenticationError\n */\nNS_ASSUME_NONNULL_BEGIN\n@interf"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKSdkMetadata.h",
"chars": 1899,
"preview": "/*!\n * Enum representing the accepted SDK Metatadata.\n * See addSdkMetadata for more details.\n */\ntypedef NSString *ABKS"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKTextAnnouncementCard.h",
"chars": 560,
"preview": "#import \"ABKCard.h\"\n\n/*\n * Braze Public API: ABKTextAnnouncementCard\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKTextAnnou"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKTwitterUser.h",
"chars": 1821,
"preview": "#import <Foundation/Foundation.h>\n\n/*\n * Braze Public API: ABKTwitterUser\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKTwit"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/ABKUser.h",
"chars": 13753,
"preview": "//\n// ABKUser.h\n// AppboySDK\n\n#import <Foundation/Foundation.h>\n\n@class ABKFacebookUser;\n@class ABKTwitterUser;\n@class"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/Appboy.h",
"chars": 34460,
"preview": "//\n// Appboy.h\n// AppboySDK\n\n/*!\n \\mainpage\n This site contains technical documentation for the %Braze iOS SDK. Clic"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Headers/AppboyKit.h",
"chars": 1613,
"preview": "#import \"Appboy.h\"\n#import \"ABKUser.h\"\n#import \"ABKFacebookUser.h\"\n#import \"ABKTwitterUser.h\"\n#import \"ABKAttributionDat"
},
{
"path": "Appboy-tvOS-SDK/AppboyTVOSKit.framework/Modules/module.modulemap",
"chars": 103,
"preview": "framework module AppboyTVOSKit {\n umbrella header \"AppboyKit.h\"\n\n export *\n module * { export * }\n}\n"
},
{
"path": "Appboy-tvOS-SDK.podspec",
"chars": 1014,
"preview": "Pod::Spec.new do |s|\n s.name = \"Appboy-tvOS-SDK\"\n s.version = \"4.7.0\"\n s.summary = \"This is the Bra"
},
{
"path": "AppboyKit/ABKLocationManagerProvider.m",
"chars": 242,
"preview": "#import \"ABKLocationManagerProvider.h\"\n\n#if !TARGET_OS_TV\n#import <CoreLocation/CoreLocation.h>\n#endif\n\n@implementation "
},
{
"path": "AppboyKit/ABKModalWebViewController.m",
"chars": 8445,
"preview": "#import \"ABKModalWebViewController.h\"\n#import \"ABKNoConnectionLocalization.h\"\n\nstatic NSString *const titleKeyPath = @\"t"
},
{
"path": "AppboyKit/ABKNoConnectionLocalization.m",
"chars": 3677,
"preview": "#import \"ABKNoConnectionLocalization.h\"\n\n@implementation ABKNoConnectionLocalization\n\n+ (NSDictionary *)localizedNoConne"
},
{
"path": "AppboyKit/ABKSDWebImageProxy.m",
"chars": 3480,
"preview": "#import \"ABKSDWebImageProxy.h\"\n#import <SDWebImage/UIImageView+WebCache.h>\n#import <SDWebImage/UIView+WebCache.h>\n#impor"
},
{
"path": "AppboyKit/Appboy.bundle/PrivacyInfo.xcprivacy",
"chars": 3556,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "AppboyKit/Appboy.bundle/ZipArchive_LICENSE.txt",
"chars": 1091,
"preview": "Copyright (c) 2010-2015, ZipArchive, https://github.com/ZipArchive\n\nPermission is hereby granted, free of charge, to any"
},
{
"path": "AppboyKit/Appboy.bundle/_CodeSignature/CodeResources",
"chars": 19227,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "AppboyKit/Appboy.bundle/appboy-spm-cleanup.sh",
"chars": 258,
"preview": "#! /bin/sh\n\n# AppboyKitLibrary\nfind \"${TARGET_BUILD_DIR}/${FULL_PRODUCT_NAME}\" -name libAppboyKitLibrary.a -follow -exec"
},
{
"path": "AppboyKit/include/ABKAttributionData.h",
"chars": 933,
"preview": "#import <Foundation/Foundation.h>\n\n\n/*\n * Braze Public API: ABKAttributionData\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface AB"
},
{
"path": "AppboyKit/include/ABKBannerCard.h",
"chars": 703,
"preview": "#import \"ABKCard.h\"\n\n/*\n * Braze Public API: ABKBannerCard\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKBannerCard : ABKCar"
},
{
"path": "AppboyKit/include/ABKBannerContentCard.h",
"chars": 403,
"preview": "#import \"ABKContentCard.h\"\n\n@interface ABKBannerContentCard : ABKContentCard <NSCoding>\n\n/*\n * The URL of the card's ima"
},
{
"path": "AppboyKit/include/ABKCaptionedImageCard.h",
"chars": 882,
"preview": "#import \"ABKCard.h\"\n\n/*\n * Braze Public API: ABKCaptionedImageCard\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKCaptionedIm"
},
{
"path": "AppboyKit/include/ABKCaptionedImageContentCard.h",
"chars": 836,
"preview": "#import \"ABKContentCard.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKCaptionedImageContentCard : ABKContentCard <NSCoding>\n"
},
{
"path": "AppboyKit/include/ABKCard.h",
"chars": 2767,
"preview": "#import <Foundation/Foundation.h>\n#import \"ABKFeedController.h\"\n\n/*\n * Braze Public API: ABKCard\n */\nNS_ASSUME_NONNULL_B"
},
{
"path": "AppboyKit/include/ABKClassicCard.h",
"chars": 659,
"preview": "#import \"ABKCard.h\"\n\n/*\n * Braze Public API: ABKClassicCard\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKClassicCard : ABKC"
},
{
"path": "AppboyKit/include/ABKClassicContentCard.h",
"chars": 609,
"preview": "#import \"ABKContentCard.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKClassicContentCard : ABKContentCard <NSCoding>\n\n/*\n * "
},
{
"path": "AppboyKit/include/ABKContentCard.h",
"chars": 3186,
"preview": "#import <Foundation/Foundation.h>\n\n/*\n * Braze Public API: ABKContentCard\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKCont"
},
{
"path": "AppboyKit/include/ABKContentCardsController.h",
"chars": 2855,
"preview": "#import <Foundation/Foundation.h>\n\n/* ----------------------------------------------------------------------------------"
},
{
"path": "AppboyKit/include/ABKFacebookUser.h",
"chars": 1894,
"preview": "#import <Foundation/Foundation.h>\n#import \"ABKUser.h\"\n\nNS_ASSUME_NONNULL_BEGIN\nextern NSInteger const DefaultNumberOfFri"
},
{
"path": "AppboyKit/include/ABKFeedController.h",
"chars": 4079,
"preview": "#import <Foundation/Foundation.h>\n\n/* ----------------------------------------------------------------------------------"
},
{
"path": "AppboyKit/include/ABKIDFADelegate.h",
"chars": 1016,
"preview": "#import <Foundation/Foundation.h>\n\n/*\n * Braze Public API: ABKAppboyIDFADelegate\n */\nNS_ASSUME_NONNULL_BEGIN\n@protocol A"
},
{
"path": "AppboyKit/include/ABKImageDelegate.h",
"chars": 1571,
"preview": "#import <UIKit/UIKit.h>\n\nNS_ASSUME_NONNULL_BEGIN\n/*\n * This delegate protocol gives the Braze iOS SDK access to the imag"
},
{
"path": "AppboyKit/include/ABKInAppMessage.h",
"chars": 9863,
"preview": "#import <Foundation/Foundation.h>\n#import <UIKit/UIKit.h>\n\n@class ABKInAppMessageDarkTheme;\n\n/*!\n * The ABKInAppMessageC"
},
{
"path": "AppboyKit/include/ABKInAppMessageButton.h",
"chars": 2777,
"preview": "#import \"ABKInAppMessage.h\"\n\n/*\n * Braze Public API: ABKInAppMessageButton\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKInA"
},
{
"path": "AppboyKit/include/ABKInAppMessageControl.h",
"chars": 138,
"preview": "#import \"ABKInAppMessage.h\"\n\n/*\n * Braze Public API: ABKInAppMessageControl\n */\n@interface ABKInAppMessageControl : ABKI"
},
{
"path": "AppboyKit/include/ABKInAppMessageController.h",
"chars": 3934,
"preview": "#import <Foundation/Foundation.h>\n#import \"ABKInAppMessage.h\"\n#import \"ABKInAppMessageControllerDelegate.h\"\n#import \"ABK"
},
{
"path": "AppboyKit/include/ABKInAppMessageControllerDelegate.h",
"chars": 4401,
"preview": "#import <Foundation/Foundation.h>\n#import \"ABKInAppMessage.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n/*!\n * Possible values for in-app"
},
{
"path": "AppboyKit/include/ABKInAppMessageDarkButtonTheme.h",
"chars": 653,
"preview": "#import <Foundation/Foundation.h>\n#import <UIKit/UIKit.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface ABKInAppMessageDarkButton"
},
{
"path": "AppboyKit/include/ABKInAppMessageDarkTheme.h",
"chars": 1421,
"preview": "#import <Foundation/Foundation.h>\n#import <UIKit/UIKit.h>\n\n@class ABKInAppMessageButton;\n@class ABKInAppMessageDarkButto"
},
{
"path": "AppboyKit/include/ABKInAppMessageFull.h",
"chars": 196,
"preview": "#import \"ABKInAppMessageImmersive.h\"\n\n/*\n * Braze Public API: ABKInAppMessageFull\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface"
},
{
"path": "AppboyKit/include/ABKInAppMessageHTML.h",
"chars": 681,
"preview": "#import <Foundation/Foundation.h>\n#import \"ABKInAppMessageHTMLBase.h\"\n\n/*\n * Braze Public API: ABKInAppMessageHTML\n */\nN"
},
{
"path": "AppboyKit/include/ABKInAppMessageHTMLBase.h",
"chars": 857,
"preview": "#import <Foundation/Foundation.h>\n#import \"ABKInAppMessage.h\"\n\n/*\n * Braze Public API: ABKInAppMessageHTMLBase\n */\nNS_AS"
},
{
"path": "AppboyKit/include/ABKInAppMessageHTMLFull.h",
"chars": 371,
"preview": "#import <Foundation/Foundation.h>\n#import \"ABKInAppMessageHTMLBase.h\"\n\n/*\n * Braze Public API: ABKInAppMessageHTMLFull\n "
},
{
"path": "AppboyKit/include/ABKInAppMessageImmersive.h",
"chars": 3539,
"preview": "#import \"ABKInAppMessage.h\"\n\n@class ABKInAppMessageButton;\n\n/*\n * Braze Public API: ABKInAppMessageImmersive\n */\nNS_ASSU"
},
{
"path": "AppboyKit/include/ABKInAppMessageModal.h",
"chars": 198,
"preview": "#import \"ABKInAppMessageImmersive.h\"\n\n/*\n * Braze Public API: ABKInAppMessageModal\n */\nNS_ASSUME_NONNULL_BEGIN\n@interfac"
},
{
"path": "AppboyKit/include/ABKInAppMessageSlideup.h",
"chars": 1572,
"preview": "#import \"ABKInAppMessage.h\"\n\n/*!\n * There are two possible values which control where the in-app message will enter the "
},
{
"path": "AppboyKit/include/ABKInAppMessageUIControlling.h",
"chars": 2702,
"preview": "#import <Foundation/Foundation.h>\n#import \"ABKInAppMessage.h\"\n#import \"ABKInAppMessageControllerDelegate.h\"\n\n@protocol A"
},
{
"path": "AppboyKit/include/ABKInAppMessageWebViewBridge.h",
"chars": 1790,
"preview": "#import <WebKit/WebKit.h>\n#import \"ABKInAppMessageHTML.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@class Appboy;\n@class ABKInAppMessag"
},
{
"path": "AppboyKit/include/ABKLocationManager.h",
"chars": 1068,
"preview": "#import <Foundation/Foundation.h>\n#import <CoreLocation/CoreLocation.h>\n\n@class ABKServerConfig;\n\nNS_ASSUME_NONNULL_BEGI"
},
{
"path": "AppboyKit/include/ABKLocationManagerProvider.h",
"chars": 587,
"preview": "#import <Foundation/Foundation.h>\n\n/*!\n * Do not call these methods within your code. They are meant for Braze internal "
},
{
"path": "AppboyKit/include/ABKModalWebViewController.h",
"chars": 664,
"preview": "#import <UIKit/UIKit.h>\n#import <WebKit/WebKit.h>\n\n@interface ABKModalWebViewController : UINavigationController <WKNavi"
},
{
"path": "AppboyKit/include/ABKNoConnectionLocalization.h",
"chars": 138,
"preview": "#import <Foundation/Foundation.h>\n\n@interface ABKNoConnectionLocalization : NSObject\n\n+ (NSString *)getNoConnectionLocal"
},
{
"path": "AppboyKit/include/ABKPushUtils.h",
"chars": 5530,
"preview": "#if !TARGET_OS_TV\n#import <Foundation/Foundation.h>\n#import <UserNotifications/UserNotifications.h>\n#import <UIKit/UIKit"
},
{
"path": "AppboyKit/include/ABKSDWebImageProxy.h",
"chars": 1445,
"preview": "#import <UIKit/UIKit.h>\n\nNS_ASSUME_NONNULL_BEGIN\n\nstatic NSString *const CORE_VERSION_WARNING = @\"Attempting to download"
},
{
"path": "AppboyKit/include/ABKSdkAuthenticationDelegate.h",
"chars": 819,
"preview": "#import <Foundation/Foundation.h>\n#import \"ABKSdkAuthenticationError.h\"\n\n/*\n * Braze Public API: ABKSdkAuthenticationDel"
},
{
"path": "AppboyKit/include/ABKSdkAuthenticationError.h",
"chars": 885,
"preview": "#import <Foundation/Foundation.h>\n\n/*\n * Braze Public API: ABKSdkAuthenticationError\n */\nNS_ASSUME_NONNULL_BEGIN\n@interf"
},
{
"path": "AppboyKit/include/ABKSdkMetadata.h",
"chars": 1899,
"preview": "/*!\n * Enum representing the accepted SDK Metatadata.\n * See addSdkMetadata for more details.\n */\ntypedef NSString *ABKS"
},
{
"path": "AppboyKit/include/ABKTextAnnouncementCard.h",
"chars": 560,
"preview": "#import \"ABKCard.h\"\n\n/*\n * Braze Public API: ABKTextAnnouncementCard\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKTextAnnou"
},
{
"path": "AppboyKit/include/ABKTwitterUser.h",
"chars": 1821,
"preview": "#import <Foundation/Foundation.h>\n\n/*\n * Braze Public API: ABKTwitterUser\n */\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKTwit"
},
{
"path": "AppboyKit/include/ABKURLDelegate.h",
"chars": 1071,
"preview": "#import <Foundation/Foundation.h>\n#import \"Appboy.h\"\n\n/*\n * Braze Public API: ABKURLDelegate\n */\nNS_ASSUME_NONNULL_BEGIN"
},
{
"path": "AppboyKit/include/ABKUser.h",
"chars": 13753,
"preview": "//\n// ABKUser.h\n// AppboySDK\n\n#import <Foundation/Foundation.h>\n\n@class ABKFacebookUser;\n@class ABKTwitterUser;\n@class"
},
{
"path": "AppboyKit/include/Appboy.h",
"chars": 34460,
"preview": "//\n// Appboy.h\n// AppboySDK\n\n/*!\n \\mainpage\n This site contains technical documentation for the %Braze iOS SDK. Clic"
},
{
"path": "AppboyKit/include/AppboyKit.h",
"chars": 1613,
"preview": "#import \"Appboy.h\"\n#import \"ABKUser.h\"\n#import \"ABKFacebookUser.h\"\n#import \"ABKTwitterUser.h\"\n#import \"ABKAttributionDat"
},
{
"path": "AppboyPushStory/Dummy.m",
"chars": 0,
"preview": ""
},
{
"path": "AppboyPushStory/include/AppboyPushStory/ABKStoriesView.h",
"chars": 1324,
"preview": "// This class is an alternative version of iCarousel(https://github.com/nicklockwood/iCarousel).\n\n#pragma clang diagnost"
},
{
"path": "AppboyPushStory/include/AppboyPushStory/ABKStoriesViewDataSource.h",
"chars": 863,
"preview": "#import <Foundation/Foundation.h>\n#import <UserNotifications/UserNotifications.h>\n#import <UserNotificationsUI/UserNotif"
},
{
"path": "AppboyPushStory/include/AppboyPushStory/AppboyPushStory.h",
"chars": 233,
"preview": "#import <UIKit/UIKit.h>\n\nFOUNDATION_EXPORT double AppboyPushStoryFrameworkVersionNumber;\nFOUNDATION_EXPORT const unsigne"
},
{
"path": "AppboyUI/ABKContentCards/AppboyContentCards.h",
"chars": 314,
"preview": "// Braze Content Cards View Controllers\n#import \"ABKContentCardsViewController.h\"\n#import \"ABKContentCardsTableViewContr"
},
{
"path": "AppboyUI/ABKContentCards/Resources/Base.lproj/AppboyContentCardsLocalizable.strings",
"chars": 351,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Done\";\n\"Appboy.content-cards.no-card.text"
},
{
"path": "AppboyUI/ABKContentCards/Resources/ar.lproj/AppboyContentCardsLocalizable.strings",
"chars": 346,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"تم\";\n\"Appboy.content-cards.no-card.text\" "
},
{
"path": "AppboyUI/ABKContentCards/Resources/cs.lproj/AppboyContentCardsLocalizable.strings",
"chars": 370,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Hotovo\";\n\"Appboy.content-cards.no-card.te"
},
{
"path": "AppboyUI/ABKContentCards/Resources/da.lproj/AppboyContentCardsLocalizable.strings",
"chars": 349,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Afsluttet\";\n\"Appboy.content-cards.no-card"
},
{
"path": "AppboyUI/ABKContentCards/Resources/de.lproj/AppboyContentCardsLocalizable.strings",
"chars": 405,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Fertig\";\n\"Appboy.content-cards.no-card.te"
},
{
"path": "AppboyUI/ABKContentCards/Resources/en.lproj/AppboyContentCardsLocalizable.strings",
"chars": 351,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Done\";\n\"Appboy.content-cards.no-card.text"
},
{
"path": "AppboyUI/ABKContentCards/Resources/es-419.lproj/AppboyContentCardsLocalizable.strings",
"chars": 396,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Listo\";\n\"Appboy.content-cards.no-card.tex"
},
{
"path": "AppboyUI/ABKContentCards/Resources/es-MX.lproj/AppboyContentCardsLocalizable.strings",
"chars": 396,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Listo\";\n\"Appboy.content-cards.no-card.tex"
},
{
"path": "AppboyUI/ABKContentCards/Resources/es.lproj/AppboyContentCardsLocalizable.strings",
"chars": 383,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Finalizado\";\n\"Appboy.content-cards.no-car"
},
{
"path": "AppboyUI/ABKContentCards/Resources/et.lproj/AppboyContentCardsLocalizable.strings",
"chars": 356,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Valmis\";\n\"Appboy.content-cards.no-card.te"
},
{
"path": "AppboyUI/ABKContentCards/Resources/fi.lproj/AppboyContentCardsLocalizable.strings",
"chars": 360,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Valmis\";\n\"Appboy.content-cards.no-card.te"
},
{
"path": "AppboyUI/ABKContentCards/Resources/fil.lproj/AppboyContentCardsLocalizable.strings",
"chars": 398,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Gawa na\";\n\"Appboy.content-cards.no-card.t"
},
{
"path": "AppboyUI/ABKContentCards/Resources/fr.lproj/AppboyContentCardsLocalizable.strings",
"chars": 390,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Fini\";\n\"Appboy.content-cards.no-card.text"
},
{
"path": "AppboyUI/ABKContentCards/Resources/he.lproj/AppboyContentCardsLocalizable.strings",
"chars": 324,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"סיום\";\n\"Appboy.content-cards.no-card.text"
},
{
"path": "AppboyUI/ABKContentCards/Resources/hi.lproj/AppboyContentCardsLocalizable.strings",
"chars": 388,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"कर दिया गया\";\n\"Appboy.content-cards.no-ca"
},
{
"path": "AppboyUI/ABKContentCards/Resources/id.lproj/AppboyContentCardsLocalizable.strings",
"chars": 352,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Selesai\";\n\"Appboy.content-cards.no-card.t"
},
{
"path": "AppboyUI/ABKContentCards/Resources/it.lproj/AppboyContentCardsLocalizable.strings",
"chars": 370,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Fatto\";\n\"Appboy.content-cards.no-card.tex"
},
{
"path": "AppboyUI/ABKContentCards/Resources/ja.lproj/AppboyContentCardsLocalizable.strings",
"chars": 292,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"完了\";\n\"Appboy.content-cards.no-card.text\" "
},
{
"path": "AppboyUI/ABKContentCards/Resources/km.lproj/AppboyContentCardsLocalizable.strings",
"chars": 382,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"បានសម្រេច\";\n\"Appboy.content-cards.no-card"
},
{
"path": "AppboyUI/ABKContentCards/Resources/ko.lproj/AppboyContentCardsLocalizable.strings",
"chars": 297,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"완료 \";\n\"Appboy.content-cards.no-card.text\""
},
{
"path": "AppboyUI/ABKContentCards/Resources/lo.lproj/AppboyContentCardsLocalizable.strings",
"chars": 382,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"ສຳເລັດ\";\n\"Appboy.content-cards.no-card.t"
},
{
"path": "AppboyUI/ABKContentCards/Resources/ms.lproj/AppboyContentCardsLocalizable.strings",
"chars": 348,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Selesai\";\n\"Appboy.content-cards.no-card.t"
},
{
"path": "AppboyUI/ABKContentCards/Resources/my.lproj/AppboyContentCardsLocalizable.strings",
"chars": 389,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"ျပီးျပီ\";\n\"Appboy.content-cards.no-card.t"
},
{
"path": "AppboyUI/ABKContentCards/Resources/nb.lproj/AppboyContentCardsLocalizable.strings",
"chars": 371,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Ferdig\";\n\"Appboy.content-cards.no-card.te"
},
{
"path": "AppboyUI/ABKContentCards/Resources/nl.lproj/AppboyContentCardsLocalizable.strings",
"chars": 355,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Gereed\";\n\"Appboy.content-cards.no-card.te"
},
{
"path": "AppboyUI/ABKContentCards/Resources/pl.lproj/AppboyContentCardsLocalizable.strings",
"chars": 375,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Gotowe\";\n\"Appboy.content-cards.no-card.te"
},
{
"path": "AppboyUI/ABKContentCards/Resources/pt-PT.lproj/AppboyContentCardsLocalizable.strings",
"chars": 379,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Concluído\";\n\"Appboy.content-cards.no-card"
},
{
"path": "AppboyUI/ABKContentCards/Resources/pt.lproj/AppboyContentCardsLocalizable.strings",
"chars": 387,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Concluído\";\n\"Appboy.content-cards.no-card"
},
{
"path": "AppboyUI/ABKContentCards/Resources/ru.lproj/AppboyContentCardsLocalizable.strings",
"chars": 386,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Готово\";\n\"Appboy.content-cards.no-card.te"
},
{
"path": "AppboyUI/ABKContentCards/Resources/sv.lproj/AppboyContentCardsLocalizable.strings",
"chars": 359,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Klar\";\n\"Appboy.content-cards.no-card.text"
},
{
"path": "AppboyUI/ABKContentCards/Resources/th.lproj/AppboyContentCardsLocalizable.strings",
"chars": 346,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"เสร็จสิ้น\";\n\"Appboy.content-cards.no-card"
},
{
"path": "AppboyUI/ABKContentCards/Resources/uk.lproj/AppboyContentCardsLocalizable.strings",
"chars": 388,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Готово\";\n\"Appboy.content-cards.no-card.te"
},
{
"path": "AppboyUI/ABKContentCards/Resources/vi.lproj/AppboyContentCardsLocalizable.strings",
"chars": 359,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"Hoàn tất\";\n\"Appboy.content-cards.no-card."
},
{
"path": "AppboyUI/ABKContentCards/Resources/zh-HK.lproj/AppboyContentCardsLocalizable.strings",
"chars": 262,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"完成\";\n\"Appboy.content-cards.no-card.text\" "
},
{
"path": "AppboyUI/ABKContentCards/Resources/zh-Hans.lproj/AppboyContentCardsLocalizable.strings",
"chars": 262,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"完成\";\n\"Appboy.content-cards.no-card.text\" "
},
{
"path": "AppboyUI/ABKContentCards/Resources/zh-Hant.lproj/AppboyContentCardsLocalizable.strings",
"chars": 262,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"完成\";\n\"Appboy.content-cards.no-card.text\" "
},
{
"path": "AppboyUI/ABKContentCards/Resources/zh-TW.lproj/AppboyContentCardsLocalizable.strings",
"chars": 262,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"完成\";\n\"Appboy.content-cards.no-card.text\" "
},
{
"path": "AppboyUI/ABKContentCards/Resources/zh.lproj/AppboyContentCardsLocalizable.strings",
"chars": 262,
"preview": "/* Content Cards Context Labels */\n\"Appboy.content-cards.done-button.title\" = \"完成\";\n\"Appboy.content-cards.no-card.text\" "
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/ABKContentCardsTableViewController.h",
"chars": 6418,
"preview": "#import <UIKit/UIKit.h>\n#import \"AppboyKit.h\"\n#import \"ABKBaseContentCardCell.h\"\n\n@protocol ABKContentCardsTableViewCont"
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/ABKContentCardsTableViewController.m",
"chars": 17077,
"preview": "#import \"ABKContentCardsTableViewController.h\"\n#import \"ABKContentCardsWebViewController.h\"\n#import \"ABKContentCardsCont"
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/ABKContentCardsViewController.h",
"chars": 370,
"preview": "#import <UIKit/UIKit.h>\n#import \"ABKContentCardsTableViewController.h\"\n\n@interface ABKContentCardsViewController : UINav"
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/ABKContentCardsViewController.m",
"chars": 1091,
"preview": "#import \"ABKContentCardsViewController.h\"\n#import \"ABKUIUtils.h\"\n\n@implementation ABKContentCardsViewController\n\n- (inst"
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/ABKContentCardsWebViewController.h",
"chars": 888,
"preview": "#import <UIKit/UIKit.h>\n#import <WebKit/WebKit.h>\n\n@interface ABKContentCardsWebViewController : UIViewController <WKNav"
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/ABKContentCardsWebViewController.m",
"chars": 7720,
"preview": "#import \"ABKContentCardsWebViewController.h\"\n#import \"ABKNoConnectionLocalization.h\"\n#import \"ABKUIUtils.h\"\n\nstatic NSSt"
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/Cells/ABKBannerContentCardCell.h",
"chars": 342,
"preview": "#import \"ABKBaseContentCardCell.h\"\n#import \"ABKBannerContentCard.h\"\n\n@interface ABKBannerContentCardCell : ABKBaseConten"
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/Cells/ABKBannerContentCardCell.m",
"chars": 3812,
"preview": "#import \"ABKBannerContentCardCell.h\"\n#import \"ABKBannerCard.h\"\n#import \"Appboy.h\"\n#import \"ABKImageDelegate.h\"\n#import \""
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/Cells/ABKBaseContentCardCell.h",
"chars": 2637,
"preview": "#import <UIKit/UIKit.h>\n#import \"ABKContentCard.h\"\n\n@protocol ABKBaseContentCardCellDelegate <NSObject>\n\n- (void)cellReq"
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/Cells/ABKBaseContentCardCell.m",
"chars": 8567,
"preview": "#import \"ABKBaseContentCardCell.h\"\n#import \"ABKUIUtils.h\"\n#import \"Appboy.h\"\n#import \"ABKImageDelegate.h\"\n\nstatic CGFloa"
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/Cells/ABKCaptionedImageContentCardCell.h",
"chars": 781,
"preview": "#import \"ABKBaseContentCardCell.h\"\n#import \"ABKCaptionedImageContentCard.h\"\n\n@interface ABKCaptionedImageContentCardCell"
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/Cells/ABKCaptionedImageContentCardCell.m",
"chars": 9678,
"preview": "#import \"ABKCaptionedImageContentCardCell.h\"\n#import \"Appboy.h\"\n#import \"ABKImageDelegate.h\"\n#import \"ABKUIUtils.h\"\n\n@in"
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/Cells/ABKClassicContentCardCell.h",
"chars": 720,
"preview": "#import \"ABKBaseContentCardCell.h\"\n#import \"ABKClassicContentCard.h\"\n\n@interface ABKClassicContentCardCell : ABKBaseCont"
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/Cells/ABKClassicContentCardCell.m",
"chars": 6201,
"preview": "#import \"ABKClassicContentCardCell.h\"\n#import \"ABKUIUtils.h\"\n\n@implementation ABKClassicContentCardCell\n\nstatic UIColor "
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/Cells/ABKClassicImageContentCardCell.h",
"chars": 443,
"preview": "#import \"ABKClassicContentCardCell.h\"\n\n/*!\n * The ABKClassicContentCard has an optional image property.\n * Use this view"
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/Cells/ABKClassicImageContentCardCell.m",
"chars": 4187,
"preview": "#import \"ABKClassicImageContentCardCell.h\"\n#import \"Appboy.h\"\n#import \"ABKImageDelegate.h\"\n#import \"ABKUIUtils.h\"\n\n@impl"
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/Cells/ABKControlTableViewCell.h",
"chars": 174,
"preview": "#import <UIKit/UIKit.h>\n#import \"ABKBaseContentCardCell.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface ABKControlTableViewCell "
},
{
"path": "AppboyUI/ABKContentCards/ViewControllers/Cells/ABKControlTableViewCell.m",
"chars": 83,
"preview": "#import \"ABKControlTableViewCell.h\"\n\n@implementation ABKControlTableViewCell\n\n@end\n"
},
{
"path": "AppboyUI/ABKInAppMessage/ABKInAppMessageUIButton.h",
"chars": 255,
"preview": "#import <UIKit/UIKit.h>\n#import \"ABKInAppMessageButton.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKInAppMessageUIButton : "
},
{
"path": "AppboyUI/ABKInAppMessage/ABKInAppMessageUIButton.m",
"chars": 2832,
"preview": "#import \"ABKInAppMessageUIButton.h\"\n#import \"ABKUIUtils.h\"\n\n#define DefaultTitleSize UIFontTextStyleSubheadline\nstatic C"
},
{
"path": "AppboyUI/ABKInAppMessage/ABKInAppMessageUIController.h",
"chars": 1890,
"preview": "#import <UIKit/UIKit.h>\n#import \"ABKInAppMessageUIControlling.h\"\n#import \"ABKInAppMessageUIDelegate.h\"\n#import \"ABKInApp"
},
{
"path": "AppboyUI/ABKInAppMessage/ABKInAppMessageUIController.m",
"chars": 9057,
"preview": "#import \"ABKInAppMessageUIController.h\"\n#import \"AppboyKit.h\"\n#import \"ABKInAppMessageWindowController.h\"\n#import \"ABKUI"
},
{
"path": "AppboyUI/ABKInAppMessage/ABKInAppMessageUIDelegate.h",
"chars": 6726,
"preview": "#import <Foundation/Foundation.h>\n#import <WebKit/WebKit.h>\n#import \"ABKInAppMessageViewController.h\"\n#import \"AppboyKit"
},
{
"path": "AppboyUI/ABKInAppMessage/ABKInAppMessageView.h",
"chars": 116,
"preview": "#import <UIKit/UIKit.h>\n\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKInAppMessageView : UIView\n@end\nNS_ASSUME_NONNULL_END\n"
},
{
"path": "AppboyUI/ABKInAppMessage/ABKInAppMessageView.m",
"chars": 75,
"preview": "#import \"ABKInAppMessageView.h\"\n\n@implementation ABKInAppMessageView\n\n@end\n"
},
{
"path": "AppboyUI/ABKInAppMessage/ABKInAppMessageWindow.h",
"chars": 457,
"preview": "#import <UIKit/UIKit.h>\n\n/*!\n * ABKInAppMessageWindow handles a subset of all touches.\n *\n * By default, touches not han"
},
{
"path": "AppboyUI/ABKInAppMessage/ABKInAppMessageWindow.m",
"chars": 1173,
"preview": "#import \"ABKInAppMessageWindow.h\"\n#import \"ABKInAppMessageView.h\"\n#import \"ABKInAppMessageWindowController.h\"\n#import \"A"
},
{
"path": "AppboyUI/ABKInAppMessage/AppboyInAppMessage.h",
"chars": 655,
"preview": "#import \"ABKInAppMessageUIButton.h\"\n#import \"ABKInAppMessageUIController.h\"\n#import \"ABKInAppMessageUIDelegate.h\"\n#impor"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/ABKInAppMessageFullViewController.xib",
"chars": 17486,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/ABKInAppMessageModalViewController.xib",
"chars": 21210,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/ABKInAppMessageSlideupViewController.xib",
"chars": 8886,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.XIB\" version=\"3.0\" toolsVe"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/Base.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 54,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"Close\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/ar.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 55,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"لإغلاق\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/cs.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 55,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"zavřít\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/da.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 57,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"at lukke\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/de.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 58,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"schließen\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/en.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 54,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"Close\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/es-419.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 55,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"cerrar\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/es-MX.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 55,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"cerrar\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/es.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 55,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"cerrar\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/et.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 56,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"sulgema\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/fi.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 55,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"sulkea\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/fil.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 54,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"Isara\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/fr.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 55,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"fermer\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/he.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 57,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"לִסְגוֹר\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/hi.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 57,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"बंद करना\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/id.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 62,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"untuk menutup\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/it.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 57,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"chiudere\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/ja.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 52,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"閉じる\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/km.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 52,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"បិទ\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/ko.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 51,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"닫다\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/lo.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 52,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"ປິດ\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/ms.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 62,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"untuk menutup\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/my.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 56,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"ပိတ်ရန်\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/nb.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 56,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"å lukke\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/nl.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 56,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"sluiten\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/pl.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 56,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"zamknąć\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/pt-PT.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 55,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"fechar\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/pt.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 55,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"fechar\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/ru.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 58,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"закрывать\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/sv.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 55,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"stänga\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/th.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 52,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"ปิด\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/uk.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 56,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"закрити\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/vi.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 53,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"đóng\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/zh-HK.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 51,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"關閉\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/zh-Hans.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 51,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"关闭\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/zh-Hant.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 51,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"關閉\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/zh-TW.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 51,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"關閉\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/Resources/zh.lproj/AppboyInAppMessageLocalizable.strings",
"chars": 51,
"preview": "\"Appboy.in-app-message.close-button.title\" = \"关闭\";\n"
},
{
"path": "AppboyUI/ABKInAppMessage/ViewControllers/ABKInAppMessageFullViewController.h",
"chars": 275,
"preview": "#import \"ABKInAppMessageImmersiveViewController.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n@interface ABKInAppMessageFullViewController"
},
{
"path": "AppboyUI/ABKInAppMessage/ViewControllers/ABKInAppMessageFullViewController.m",
"chars": 7865,
"preview": "#import \"ABKInAppMessageFullViewController.h\"\n#import \"ABKInAppMessageViewController.h\"\n#import \"ABKInAppMessageImmersiv"
},
{
"path": "AppboyUI/ABKInAppMessage/ViewControllers/ABKInAppMessageHTMLBaseViewController.h",
"chars": 837,
"preview": "#import <UIKit/UIKit.h>\n#import <WebKit/WebKit.h>\n#import \"ABKInAppMessageViewController.h\"\n\nNS_ASSUME_NONNULL_BEGIN\nsta"
},
{
"path": "AppboyUI/ABKInAppMessage/ViewControllers/ABKInAppMessageHTMLBaseViewController.m",
"chars": 18952,
"preview": "#import \"ABKInAppMessageHTMLBaseViewController.h\"\n#import \"ABKInAppMessageView.h\"\n#import \"ABKUIUtils.h\"\n#import \"ABKInA"
},
{
"path": "AppboyUI/ABKInAppMessage/ViewControllers/ABKInAppMessageHTMLFullViewController.h",
"chars": 217,
"preview": "#import <UIKit/UIKit.h>\n#import \"ABKInAppMessageHTMLBaseViewController.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface ABKInAppM"
},
{
"path": "AppboyUI/ABKInAppMessage/ViewControllers/ABKInAppMessageHTMLFullViewController.m",
"chars": 230,
"preview": "#import \"ABKInAppMessageHTMLFullViewController.h\"\n\n/*!\n * Custom implementation for the zip-based HTML IAM type\n */\n@imp"
},
{
"path": "AppboyUI/ABKInAppMessage/ViewControllers/ABKInAppMessageHTMLViewController.h",
"chars": 214,
"preview": "#import <UIKit/UIKit.h>\n#import \"ABKInAppMessageHTMLBaseViewController.h\"\n\nNS_ASSUME_NONNULL_BEGIN\n\n@interface ABKInAppM"
},
{
"path": "AppboyUI/ABKInAppMessage/ViewControllers/ABKInAppMessageHTMLViewController.m",
"chars": 169,
"preview": "#import \"ABKInAppMessageHTMLViewController.h\"\n\n/*!\n * Custom implementation for the file-based HTML IAM type\n */\n@implem"
}
]
// ... and 382 more files (download for full content)
About this extraction
This page contains the full source code of the Appboy/appboy-ios-sdk GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 582 files (1.8 MB), approximately 492.8k tokens, and a symbol index with 14 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.