diff --git a/.DS_Store b/.DS_Store index d13b90c6a..5008ddfcf 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/Appboy-iOS-SDK.podspec b/Appboy-iOS-SDK.podspec index 2163c6175..14acae79b 100644 --- a/Appboy-iOS-SDK.podspec +++ b/Appboy-iOS-SDK.podspec @@ -1,36 +1,47 @@ Pod::Spec.new do |s| s.name = "Appboy-iOS-SDK" - s.version = "2.11.2" + s.version = "2.9.6" s.summary = "This is the Appboy iOS SDK for Mobile Marketing Automation" + s.description = <<-DESC + This pod has two subspecs, please ensure you only choose one of them when you are adding Appboy-iOS-SDK pod to your podfile by: + + pod 'Appboy-iOS-SDK/AppboyKit' + * This requires Facebook-iOS-SDK in the workspace. Installing this pod will automatically install Facebook-iOS-SDK is it's not incluced in the workspace. + + + pod 'Appboy-iOS-SDK/AppboyKitWithoutFacebookSupport' + + + Warning: Integrating both pods will cause the SDK to be integrated twice which will cause errors! + DESC s.homepage = "http://www.appboy.com" s.license = { :type => 'Commercial', :text => 'Please refer to https://github.com/Appboy/appboy-ios-sdk/blob/master/LICENSE'} s.author = { "Appboy" => "http://www.appboy.com" } s.source = { :git => 'https://github.com/Appboy/appboy-ios-sdk.git', :tag => s.version.to_s} s.platform = :ios - s.ios.deployment_target = '6.0' + s.ios.deployment_target = '5.1.1' s.requires_arc = false s.documentation_url = 'http://documentation.appboy.com/' - s.frameworks = 'SystemConfiguration', 'QuartzCore', 'CoreImage', 'CoreText' - s.weak_framework = 'CoreTelephony', 'Social', 'Accounts', 'AdSupport', 'StoreKit' - s.source_files = 'AppboyKit/headers/AppboyKitLibrary/*.h', 'AppboyKit/*.m' - s.exclude_files = 'AppboyKit/**/*.txt' - s.resource = 'AppboyKit/Appboy.bundle' - s.preserve_paths = 'AppboyKit/**/*.*' - s.vendored_libraries = 'AppboyKit/libAppboyKitLibrary.a' - s.dependency 'SDWebImage', '~>3.7.0' - s.default_subspecs = 'AppboyKit' - - s.subspec 'AppboyKit' do |appboyKit| - appboyKit.source_files = 'AppboyKit/headers/AppboyKitLibrary/*.h', 'AppboyKit/*.m' - appboyKit.resource = 'AppboyKit/Appboy.bundle' - appboyKit.preserve_paths = 'AppboyKit/**/*.*' - appboyKit.vendored_libraries = 'AppboyKit/libAppboyKitLibrary.a' + s.frameworks = 'SystemConfiguration', 'QuartzCore', 'CoreImage' + s.weak_framework = 'CoreTelephony', 'Social', 'Twitter', 'Accounts', 'AdSupport', 'StoreKit' + + s.subspec 'AppboyKit' do |aks| + aks.source_files = 'AppboyKit/headers/AppboyKitLibrary/*.h', 'AppboyKit/*.m' + aks.exclude_files = 'AppboyKit/**/*.txt' + aks.resource = 'AppboyKit/Appboy.bundle' + aks.preserve_paths = 'AppboyKit/**/*.*' + aks.vendored_libraries = 'AppboyKit/libAppboyKitLibrary.a' + aks.dependency 'Facebook-iOS-SDK', '~> 3.16.2' + aks.dependency 'SDWebImage', '>= 3.7.0' end - s.subspec 'AppboyKitWithoutFacebookSupport' do |appboyKitWithoutFacebookSupport| - appboyKitWithoutFacebookSupport.source_files = 'AppboyKit/headers/AppboyKitLibrary/*.h', 'AppboyKit/*.m' - appboyKitWithoutFacebookSupport.resource = 'AppboyKit/Appboy.bundle' - appboyKitWithoutFacebookSupport.preserve_paths = 'AppboyKit/**/*.*' - appboyKitWithoutFacebookSupport.vendored_libraries = 'AppboyKit/libAppboyKitLibrary.a' + s.subspec 'AppboyKitWithoutFacebookSupport' do |akwfss| + akwfss.source_files = 'AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/*.h', 'AppboyKitWithoutFacebookSupport/*.m' + akwfss.exclude_files = 'AppboyKitWithoutFacebookSupport/**/*.txt' + akwfss.resource = 'AppboyKitWithoutFacebookSupport/Appboy.bundle' + akwfss.preserve_paths = 'AppboyKitWithoutFacebookSupport/**/*.*' + akwfss.vendored_libraries = 'AppboyKitWithoutFacebookSupport/libAppboyKitLibrary.a' + akwfss.dependency 'SDWebImage', '>= 3.7.0' end + end diff --git a/AppboyKit/ABKIdentifierForAdvertisingProvider.m b/AppboyKit/ABKIdentifierForAdvertisingProvider.m index e0f0814d2..fc5d65162 100644 --- a/AppboyKit/ABKIdentifierForAdvertisingProvider.m +++ b/AppboyKit/ABKIdentifierForAdvertisingProvider.m @@ -34,6 +34,7 @@ + (NSString *) getIdentifierForAdvertiser { } } #endif + NSLog(@"[APPBOY] %@", @"ASI code block disabled."); return nil; } @@ -50,6 +51,7 @@ + (NSNumber *) getIsAdvertisingTrackingEnabledAsNSNumber { return [NSNumber numberWithBool:[sharedManager isAdvertisingTrackingEnabled]]; } #endif + NSLog(@"[APPBOY] %@", @"ASI code block disabled."); return nil; } diff --git a/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects-8.0+.nib index cb6008be9..94d231744 100644 Binary files a/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects.nib index 812334759..94d231744 100644 Binary files a/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/runtime.nib index 1e80ebaaa..e3ec39e4a 100644 Binary files a/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects.nib index c244421f3..ec63dadfb 100644 Binary files a/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/runtime.nib index 9296d359a..db96f0516 100644 Binary files a/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects-8.0+.nib index 496121924..c0992ad2d 100644 Binary files a/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects.nib index 75b48cacd..c0992ad2d 100644 Binary files a/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/runtime.nib index 87ebcd466..1a1f6da45 100644 Binary files a/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKDefaultSlideupViewController.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKDefaultSlideupViewController.nib/objects-8.0+.nib new file mode 100644 index 000000000..2925cf36f Binary files /dev/null and b/AppboyKit/Appboy.bundle/ABKDefaultSlideupViewController.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKDefaultSlideupViewController.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKDefaultSlideupViewController.nib/objects.nib new file mode 100644 index 000000000..2925cf36f Binary files /dev/null and b/AppboyKit/Appboy.bundle/ABKDefaultSlideupViewController.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKDefaultSlideupViewController.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKDefaultSlideupViewController.nib/runtime.nib new file mode 100644 index 000000000..2925cf36f Binary files /dev/null and b/AppboyKit/Appboy.bundle/ABKDefaultSlideupViewController.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects-8.0+.nib index e4d5fb7ea..4bb161ac2 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects.nib index 1a80cb227..4bb161ac2 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/runtime.nib index 51cac1ca3..8cfd858fd 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects-8.0+.nib index c4bd04153..e9b8b486f 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects.nib index 086dcab99..e9b8b486f 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/runtime.nib index c56d6a52a..e9b8b486f 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects-8.0+.nib index 0d6c57140..483ec8202 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects.nib index 794e4371c..e6bfb0909 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/runtime.nib index d6a35e69d..e6bfb0909 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects-8.0+.nib index 36adaec5d..e5a3d6fb8 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects.nib index 760706d69..e5a3d6fb8 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/runtime.nib index 67cd69d96..c51954c5c 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects-8.0+.nib deleted file mode 100644 index 28a44779c..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects-8.0+.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects.nib deleted file mode 100644 index bd709787e..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/runtime.nib deleted file mode 100644 index 06d6a243a..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/runtime.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/objects-8.0+.nib deleted file mode 100644 index 989afcfab..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/objects-8.0+.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/objects.nib deleted file mode 100644 index 4206949e8..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/objects.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/runtime.nib deleted file mode 100644 index 5c54067e4..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/runtime.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects-8.0+.nib deleted file mode 100644 index 10f4cfdf6..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects-8.0+.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects.nib deleted file mode 100644 index 5e663be57..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/runtime.nib deleted file mode 100644 index 8fcf4c849..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/runtime.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/objects-8.0+.nib deleted file mode 100644 index ab52c1e26..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/objects-8.0+.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/objects.nib deleted file mode 100644 index 3df609c26..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/objects.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/runtime.nib deleted file mode 100644 index 0e942af32..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/runtime.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects-8.0+.nib deleted file mode 100644 index 47cec9227..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects-8.0+.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects.nib deleted file mode 100644 index efd004371..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/runtime.nib deleted file mode 100644 index f56422509..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/runtime.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/objects-8.0+.nib deleted file mode 100644 index 2fcadc696..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/objects-8.0+.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/objects.nib deleted file mode 100644 index 27f472a8e..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/objects.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/runtime.nib deleted file mode 100644 index daf201181..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/runtime.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects-8.0+.nib index 331f91cef..725f4a074 100644 Binary files a/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects.nib index e141d18cd..725f4a074 100644 Binary files a/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/runtime.nib index c28490575..725f4a074 100644 Binary files a/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects-8.0+.nib index 18285aa6d..fc02d131b 100644 Binary files a/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects.nib index 06cb4cee3..fc02d131b 100644 Binary files a/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/runtime.nib index 261af97d0..9d98cc1ec 100644 Binary files a/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/FontAwesome.otf b/AppboyKit/Appboy.bundle/FontAwesome.otf deleted file mode 100644 index f7936cc1e..000000000 Binary files a/AppboyKit/Appboy.bundle/FontAwesome.otf and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/Info.plist b/AppboyKit/Appboy.bundle/Info.plist index c7938b309..69761657b 100644 Binary files a/AppboyKit/Appboy.bundle/Info.plist and b/AppboyKit/Appboy.bundle/Info.plist differ diff --git a/AppboyKit/Appboy.bundle/ar.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/ar.lproj/LocalizedAppboyUIString.strings index cda4f6e70..6c5d555bd 100644 Binary files a/AppboyKit/Appboy.bundle/ar.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/ar.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/com_appboy_inapp_close_icon.png b/AppboyKit/Appboy.bundle/com_appboy_inapp_close_icon.png deleted file mode 100644 index 8ee5189cc..000000000 Binary files a/AppboyKit/Appboy.bundle/com_appboy_inapp_close_icon.png and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/com_appboy_inapp_close_icon@2x.png b/AppboyKit/Appboy.bundle/com_appboy_inapp_close_icon@2x.png deleted file mode 100644 index 7f6a73b6a..000000000 Binary files a/AppboyKit/Appboy.bundle/com_appboy_inapp_close_icon@2x.png and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/com_appboy_inapp_close_icon@3x.png b/AppboyKit/Appboy.bundle/com_appboy_inapp_close_icon@3x.png deleted file mode 100644 index b035f4dcb..000000000 Binary files a/AppboyKit/Appboy.bundle/com_appboy_inapp_close_icon@3x.png and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/da.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/da.lproj/LocalizedAppboyUIString.strings index ac14b1a45..1a6ee0b50 100644 Binary files a/AppboyKit/Appboy.bundle/da.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/da.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/de.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/de.lproj/LocalizedAppboyUIString.strings index 446128ca4..5500ce877 100644 Binary files a/AppboyKit/Appboy.bundle/de.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/de.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/en.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/en.lproj/LocalizedAppboyUIString.strings index 22a099afa..c481cb7b7 100644 Binary files a/AppboyKit/Appboy.bundle/en.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/en.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/es-419.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/es-419.lproj/LocalizedAppboyUIString.strings index 2bbf74dc2..7e9cb6447 100644 Binary files a/AppboyKit/Appboy.bundle/es-419.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/es-419.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/es-MX.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/es-MX.lproj/LocalizedAppboyUIString.strings index 2bbf74dc2..7e9cb6447 100644 Binary files a/AppboyKit/Appboy.bundle/es-MX.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/es-MX.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/es.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/es.lproj/LocalizedAppboyUIString.strings index 3a9e5bdcc..074294775 100644 Binary files a/AppboyKit/Appboy.bundle/es.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/es.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/et.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/et.lproj/LocalizedAppboyUIString.strings index a0ce39dd5..e88886244 100644 Binary files a/AppboyKit/Appboy.bundle/et.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/et.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/fi.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/fi.lproj/LocalizedAppboyUIString.strings index c673e8f83..feccb8d98 100644 Binary files a/AppboyKit/Appboy.bundle/fi.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/fi.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/fil.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/fil.lproj/LocalizedAppboyUIString.strings index 34781c6c9..767b85a16 100644 Binary files a/AppboyKit/Appboy.bundle/fil.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/fil.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/hi.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/hi.lproj/LocalizedAppboyUIString.strings index 8d7a1239d..be4673fa0 100644 Binary files a/AppboyKit/Appboy.bundle/hi.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/hi.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/id.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/id.lproj/LocalizedAppboyUIString.strings index 06fe1eb93..c6233fdcf 100644 Binary files a/AppboyKit/Appboy.bundle/id.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/id.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/it.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/it.lproj/LocalizedAppboyUIString.strings index 9fd227511..52c697f3e 100644 Binary files a/AppboyKit/Appboy.bundle/it.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/it.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/ja.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/ja.lproj/LocalizedAppboyUIString.strings index b75165539..15b6d0027 100644 Binary files a/AppboyKit/Appboy.bundle/ja.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/ja.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/km.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/km.lproj/LocalizedAppboyUIString.strings index a726c325e..25a2b1ba3 100644 Binary files a/AppboyKit/Appboy.bundle/km.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/km.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/ko.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/ko.lproj/LocalizedAppboyUIString.strings index 7224e9dae..82814a8ba 100644 Binary files a/AppboyKit/Appboy.bundle/ko.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/ko.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/lo.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/lo.lproj/LocalizedAppboyUIString.strings index eb6de54cd..ba46b87a1 100644 Binary files a/AppboyKit/Appboy.bundle/lo.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/lo.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/ms.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/ms.lproj/LocalizedAppboyUIString.strings index 11e2d7d94..caa90e9ad 100644 Binary files a/AppboyKit/Appboy.bundle/ms.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/ms.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/my.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/my.lproj/LocalizedAppboyUIString.strings index 1b1bb8176..b62c93687 100644 Binary files a/AppboyKit/Appboy.bundle/my.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/my.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/nb.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/nb.lproj/LocalizedAppboyUIString.strings index 05adc89e3..419dd391a 100644 Binary files a/AppboyKit/Appboy.bundle/nb.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/nb.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/nl.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/nl.lproj/LocalizedAppboyUIString.strings index f08036645..960389d0c 100644 Binary files a/AppboyKit/Appboy.bundle/nl.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/nl.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/pl.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/pl.lproj/LocalizedAppboyUIString.strings index b3a8562ab..01d8d1726 100644 Binary files a/AppboyKit/Appboy.bundle/pl.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/pl.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/pt-PT.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/pt-PT.lproj/LocalizedAppboyUIString.strings index 60e569880..f690e9c55 100644 Binary files a/AppboyKit/Appboy.bundle/pt-PT.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/pt-PT.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/pt.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/pt.lproj/LocalizedAppboyUIString.strings index adcdfed63..447047be2 100644 Binary files a/AppboyKit/Appboy.bundle/pt.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/pt.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/ru.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/ru.lproj/LocalizedAppboyUIString.strings index 65ffae152..7cf84f371 100644 Binary files a/AppboyKit/Appboy.bundle/ru.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/ru.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/sv.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/sv.lproj/LocalizedAppboyUIString.strings index 7906b283c..758f746ec 100644 Binary files a/AppboyKit/Appboy.bundle/sv.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/sv.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/th.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/th.lproj/LocalizedAppboyUIString.strings index 55cf2f913..f7f830521 100644 Binary files a/AppboyKit/Appboy.bundle/th.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/th.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/vi.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/vi.lproj/LocalizedAppboyUIString.strings index e530c1997..1c1ca4371 100644 Binary files a/AppboyKit/Appboy.bundle/vi.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/vi.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/zh-Hans.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/zh-Hans.lproj/LocalizedAppboyUIString.strings index 92a53b4d0..1782ffc19 100644 Binary files a/AppboyKit/Appboy.bundle/zh-Hans.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/zh-Hans.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/zh-Hant.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/zh-Hant.lproj/LocalizedAppboyUIString.strings index 33e6c4366..23fd71206 100644 Binary files a/AppboyKit/Appboy.bundle/zh-Hant.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/zh-Hant.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKSlideup.h b/AppboyKit/headers/AppboyKitLibrary/ABKSlideup.h new file mode 100644 index 000000000..a72400dba --- /dev/null +++ b/AppboyKit/headers/AppboyKitLibrary/ABKSlideup.h @@ -0,0 +1,131 @@ +#import + +/* + * There are two possible values which control where the slideup will enter the view. + * + * ABKSlideupFromBottom - This is the default behavior. + * The slideup 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. + * + * ABKSlideupFromTop - The slideup 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, ABKSlideupAnchor) { + ABKSlideupFromTop, + ABKSlideupFromBottom +}; + +/* + * The ABKSlideupDismissType defines how the slideup can be dismissed. + * + * ABKSlideupDismissAutomatically - This is the default behavior. It will dismiss after the length of time defined by + * the duration property. Slideups of this type can also be dismissed by swiping. + * + * ABKSlideupDismissBySwipe - The slideup will stay on the screen indefinitely unless dismissed by swiping. + */ +typedef NS_ENUM(NSInteger, ABKSlideupDismissType) { + ABKSlideupDismissAutomatically, + ABKSlideupDismissBySwipe +}; + +/* + * The ABKSlideupClickActionType defines the action that will be performed when the Slideup is clicked. + * + * ABKSlideupDisplayNewsFeed - This is the default behavior. It will open a modal view of Appboy news feed. + * + * ABKSlideupRedirectToURI - The slideup 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 slideup will redirect to the + * protocol uri. + * + * ABKSlideupNoneClickAction - The slideup will do nothing but dismiss itself. + */ +typedef NS_ENUM(NSInteger, ABKSlideupClickActionType) { + ABKSlideupDisplayNewsFeed, + ABKSlideupRedirectToURI, + ABKSlideupNoneClickAction +}; + +@interface ABKSlideup : NSObject + +/* + * This property defines the message displayed within the slideup. + */ +@property (nonatomic, copy) NSString *message; + +/* + * If hideChevron equals YES, the slideup will not render the chevron on the right side of the slideup. + * The chevron is a useful visual cue for the user that more content may be reached by tapping the slideup. + */ +@property (nonatomic, assign) BOOL hideChevron; + +/* + * This property carries extra data in the form of an NSDictionary which can be sent down via the Appboy Dashboard. + * You may want to design and implement a custom handler to access this data depending on your use-case. + */ +@property (nonatomic, retain) NSDictionary *extras; + +/* + * slideupAnchor defines the position of the slideup on screen. + * The ABKSlideupAnchor enum documentation above offers additional details. + */ +@property (nonatomic, assign) ABKSlideupAnchor slideupAnchor; + +/* + * This property defines the number of seconds before the slideup is automatically dismissed. + */ +@property (nonatomic, assign) NSTimeInterval duration; + +/* + * slideupDismissType defines the dismissal behavior of the slideup. + * See the above documentation for ABKSlideupDismissType for additional details. + */ +@property (nonatomic, assign) ABKSlideupDismissType slideupDismissType; + +/* + * This property defines the action that will be performed when the Slideup is clicked. + * See the ABKSlideupClickActionType enum documentation above offers additional details. + */ +@property (nonatomic, assign, readonly) ABKSlideupClickActionType slideupClickActionType; + +/* + * When the slideup's slideupClickActionType is ABKSlideupRedirectToURI, clicking on the slideup will redirect to the uri defined + * in this property. + * + * This property can be a HTTP URI or a protocol URI. + */ +@property (nonatomic, copy, readonly) NSURL *uri; + +/* + * If you're handling slideups completely on your own (returning YES from onSlideupReceived), you should still report + * impressions and clicks on the slideup back to Appboy with these methods so that your campaign reporting features + * still work in the dashboard. + * + * Note: Each slideup can log at most one impression and at most one click. + */ +- (void) logSlideupImpression; +- (void) logSlideupClicked; + +/* + * This method will set the slideupClickActionType to ABKSlideupRedirectToURI. The parameter uri must not be nil. + * The method will set the uri property as well. + */ +- (void) setSlideupClickActionToUri:(NSURL *)uri; + +/* + * This method will set the slideupClickActionType to ABKSlideupDisplayNewsFeed. + * The method will set the uri property to nil. + */ +- (void) setSlideupClickActionToNewsFeed; + +/* + * This method will set the slideupClickActionType to ABKSlideupNoneClickAction. + * The method will set the uri property to nil. + */ +- (void) setSlideupClickActionToNone; + +/* + * Serializes the slideup to binary data for use by wrappers such as Appboy's Unity SDK for iOS. + */ +- (NSData *) serializeToData; + +@end diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKSlideupController.h b/AppboyKit/headers/AppboyKitLibrary/ABKSlideupController.h new file mode 100644 index 000000000..a880e1f1b --- /dev/null +++ b/AppboyKit/headers/AppboyKitLibrary/ABKSlideupController.h @@ -0,0 +1,84 @@ +#import +#import "ABKSlideup.h" +#import "ABKSlideupControllerDelegate.h" + +/* Note: This class is not thread safe and all class methods should be called from the main thread.*/ +@interface ABKSlideupController : NSObject + +/*! + * Setting the delegate allows your app to control how, when, and if slideups are displayed. + * Your app can set the delegate to override the default behavior of the ABKSlideupController. See + * ABKSlideupControllerDelegate.h for more information. + */ +@property (nonatomic, retain) id delegate; + +/*! + * supportedOrientationMasks allows you to change which orientation masks the slideup (in-app message) supports. + * Slideups (in-app messages) will normally support the orientations specified in the app settings, but the method + * supportedInterfaceOrientations may optionally override that. The value of supportedOrientationMasks will be returned + * in supportedInterfaceOrientations in the slideup view controller. + * + * The default value of supportedOrientationMasks is UIInterfaceOrientationMaskAll. This property only works in iOS 6 and later. + * + */ +@property (nonatomic, assign) UIInterfaceOrientationMask supportedOrientationMasks; + +/*! + * supportedOrientations allows you to change which orientation the slideup (in-app message) supports. + * Slideups (in-app messages) will normally support the orientations specified in the app settings, but method + * preferredInterfaceOrientationForPresentation may optionally override that. The value of supportedOrientations will be + * returned in preferredInterfaceOrientationForPresentation in slideup view controller. + * + * The default value of supportedOrientations includes all orientations: UIInterfaceOrientationPortrait, + * UIInterfaceOrientationLandscapeRight, UIInterfaceOrientationLandscapeLeft and UIInterfaceOrientationPortraitUpsideDown. + * This property only works in iOS 6 and later. + */ +@property (nonatomic, assign) UIInterfaceOrientation supportedOrientations; + +/*! + * @param delegate The slideup delegate that implements the ABKSlideupControllerDelegate methods. If the delegate is + * nil, it acts as one which always returns ABKDisplaySlideupNow and doesn't implement all other delegate methods. + * + * @discussion This method grabs the next slideup from the slideup stack, if there is one, and displays it with + * the provided delegate. The delegate must return a ABKSlideupDisplayChoice that defines how the slideup will be + * handled. Please refer to the ABKSlideupDisplayChoice enum documentation for more detailed information. + * + * If there are no slideups available this returns immediately having taken no action. + */ +- (void) displayNextSlideupWithDelegate:(id)delegate; + +/*! + * @return The number of slideups that are locally waiting to be displayed. + * + * @discussion Use this method to check how many slideups are waiting to be displayed and call + * displayNextSlideupWithDelegate: at to display it. If a slideup is currently being displayed, it will not be included + * in the count. + * + * Note: Returning ABKDisplaySlideupLater in the beforeSlideupDisplayed: delegate method will put the slideup back onto + * the stack and this will be reflected in slideupsRemainingOnStack. + */ +- (NSInteger) slideupsRemainingOnStack; + +/*! + * @param newSlideup A new slideup that will be added into the top of the stack of slideups that haven't been displayed yet. + * + * @discussion This method allows you to display a custom slideup. It adds the slideup object to the top of the slideup stack + * and tries to display immediately. + * + * Note: Clicks and impressions of slideups added by this method will not be collected by Appboy and will not be + * reflected on the dashboard. + */ +- (void) addSlideup:(ABKSlideup *)newSlideup; + +/*! + * @param animated If YES, the slideup will slide off the screen. If NO, the slideup will disappear immediately without + * an animation. + * + * @discussion If there is a slideup currently being displayed, calling this method will hide it. The animated parameter + * controls whether or not the slideup will be animated away. This method does nothing if no slideup is currently being + * displayed. + * + * Note: This will not fire the onSlideupDismissed: delegate method. + */ +- (void) hideCurrentSlideup:(BOOL)animated; +@end diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKSlideupControllerDelegate.h b/AppboyKit/headers/AppboyKitLibrary/ABKSlideupControllerDelegate.h new file mode 100644 index 000000000..8c1dd7e84 --- /dev/null +++ b/AppboyKit/headers/AppboyKitLibrary/ABKSlideupControllerDelegate.h @@ -0,0 +1,107 @@ +#import +#import "ABKSlideup.h" +#import "ABKSlideupViewController.h" + +/*! + * Possible values for slideup handling after a slideup is offered to an ABKSlideupControllerDelegate + * ABKDisplaySlideupNow - The slideup will be displayed immediately. + * ABKDisplaySlideupLater - The slideup will be not be displayed and will be placed back onto the top of the stack. + * ABKDiscardSlideup - The slideup will be discarded and will not be displayed. + * + * The following conditions can cause a slideup to be offered to the delegate defined by the delegate property on + * [Appboy sharedInstance].slideupController: + * - A slideup is received from the Appboy server. + * - A slideup is waiting to display when an UIApplicationDidBecomeActiveNotification event occurs. + * - A slideup is added by ABKSlideupController method addSlideup:. + * + * You can choose to manually display any slideups that are waiting locally to be displayed by calling: + * [[Appboy sharedInstance].slideupController displayNextSlideupWithDelegate:]. + */ +typedef NS_ENUM(NSInteger, ABKSlideupDisplayChoice) { + ABKDisplaySlideupNow, + ABKDisplaySlideupLater, + ABKDiscardSlideup +}; + +/*! + * The slideup delegate allows you to control the display and behavior of the Appboy slideup. For more detailed + * information on slideup behavior, including when and how the delegate is used, see the documentation for the + * ABKSlideupDisplayChoice enum above for more detailed information. + */ +@protocol ABKSlideupControllerDelegate +@optional + +/*! + * @param slideup The slideup object being offered to the delegate method. + * + * This delegate gets called when a new slideup is received from the Appboy server and controls whether or not you're + * going to use custom handling for the slideup. + * + * If the delegate method returns YES, Appboy will not take any more actions on the provided slideup and it becomes the + * responsibility of the host app to deliver the slideup to the user and report any impressions or slideup clicks. + * See ABKSlideup.h for more information. + * + * Conversely, if the delegate method returns NO, Appboy will handle the slideup normally: the slideup will be put on + * top of the slideup stack and be offered to the beforeSlideupDisplayed: delegate method if no other slideup is + * currently on the screen. + */ +- (BOOL) onSlideupReceived:(ABKSlideup *)slideup; + +/*! + * @param slideup The slideup object being offered to the delegate method. + * @param keyboardIsUp This boolean indicates whether or not the keyboard is currently being displayed when this + * delegate fires. + * @return ABKSlideupDisplayChoice for details refer to the documentation regarding the ENUM ABKSlideupDisplayChoice + * above. + * + * This delegate method defines whether the slideup will be displayed now, displayed later, or discarded. + * + * The default behavior is that the slideup will be displayed unless the keyboard is currently active on the screen. + * However, if there are other situations where you would not want the slideup to appear (such as during a full screen + * game or on a loading screen), you can use this delegate to delay or discard pending slideup messages. + */ +- (ABKSlideupDisplayChoice) beforeSlideupDisplayed:(ABKSlideup *)slideup withKeyboardIsUp:(BOOL)keyboardIsUp; + +/*! + * @param slideup The slideup object being offered to the delegate. + * + * This delegate method allows host applications to customize the look of a slideup while maintaining the same user + * experience and impression/click tracking as the default Appboy slideup. It allows developers to pass incoming slideups + * to custom view controllers which they have created. + * + * The custom view controller is responsible for handling any responsive UI layout use-cases. e.g. device orientations, + * or varied message lengths. + * + * By default, Appboy will stretch/shrink the slideup view's width to fix the screen's width, and slide it up onto the + * screen. If you wish to have margins between the slideup and the edge of the screen, those must be incorporated into + * the custom view controller itself. + * + * Even with a custom view, by inheriting from ABKSlideupViewController, the slideup will automatically animate and + * dismiss according to the parameters of the provided ABKSlideup object. See ABKSlideup.h for more information. + * + * NOTE: The returned view controller should be a ABKSlideupViewController or preferably, a subclass of + * ABKSlideupViewController. The view of the returned view controller should be an instance of ABKSlideupView or its + * subclass. + */ +- (ABKSlideupViewController *) slideupViewControllerWithSlideup:(ABKSlideup *)slideup; + +/*! + * @param slideup The slideup object being offered to the delegate. + * + * This delegate method is fired whenever the user manually dismisses the slideup (via a swipe), or if the slideup + * times out and expires. Use this method to perform any custom logic that should execute after the slideup has been + * dismissed. + */ +- (void) onSlideupDismissed:(ABKSlideup *)slideup; + +/*! + * @param slideup The slideup object being offered to the delegate. + * @return Boolean Value which controls whether or not Appboy will execute the click action. Returning YES will prevent + * Appboy from performing the click action. Returning NO will cause Appboy to execute the action defined in the + * slideup's slideupClickActionType property after this delegate method is called. + * + * This delegate method is fired whenever the user clicks on the slideup. See ABKSlideup.h for more information. + */ +- (BOOL) onSlideupClicked:(ABKSlideup *)slideup; + +@end diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKSlideupView.h b/AppboyKit/headers/AppboyKitLibrary/ABKSlideupView.h new file mode 100644 index 000000000..e7272cde5 --- /dev/null +++ b/AppboyKit/headers/AppboyKitLibrary/ABKSlideupView.h @@ -0,0 +1,4 @@ +#import + +@interface ABKSlideupView : UIView +@end diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKSlideupViewController.h b/AppboyKit/headers/AppboyKitLibrary/ABKSlideupViewController.h new file mode 100644 index 000000000..dbcf88fd9 --- /dev/null +++ b/AppboyKit/headers/AppboyKitLibrary/ABKSlideupViewController.h @@ -0,0 +1,39 @@ + +/* + * ABKSlideupViewController is the class for the slideup view controller. + * * In order to create a custom view controller you must: + * * * Create a subclass of ABKSlideupViewController + * * * The view of the subclass instance must be an instance of ABKSlideupView or optionally a subclass thereof. + * + * * The custom slideup view controller must handle and account for: + * * * Slideup messages of varying lengths. + * * * Different possible layouts and orientations for possible devices + * * * * e.g. iPhone [Portrait & Landscape] as well as iPad [Portrait & Landscape]. + * + * * Note: Adding buttons which do anything other than dismiss the slideup within a custom slideup view controller will + * * disable Appboy's ability to capture analytics regarding clicks on the slideup. + * + */ + +#import + +@class ABKSlideup; + +@interface ABKSlideupViewController : UIViewController +@property (nonatomic, retain) ABKSlideup *slideup; + +/* + * The initWithSlideup method may be used to pass the slideup property to any custom view controller that you create. + */ +- (id) initWithSlideup:(ABKSlideup *)slideup; + +/*! + * @param animated If YES, the slideup will slide off the screen. If NO, the slideup will disappear immediately without an animation. + * + * @discussion The void method hideSlideup may be called in order to dismiss the slideup. Animation of the dismissal is controlled with the animated parameter. + */ +- (void) hideSlideup:(BOOL)animated; + +@end + + diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKUser.h b/AppboyKit/headers/AppboyKitLibrary/ABKUser.h index a48ecb23b..7be569d52 100644 --- a/AppboyKit/headers/AppboyKitLibrary/ABKUser.h +++ b/AppboyKit/headers/AppboyKitLibrary/ABKUser.h @@ -6,8 +6,6 @@ #import -@class ABKFacebookUser; - /*! * When setting the custom attributes with custom keys: * @@ -110,11 +108,6 @@ */ @property (nonatomic, assign) BOOL clearTwitterDataWhenNoDataOfTwitterIdentifier; -/*! - * The User's Facebook account information. For more detail, please refer to ABKFacebookUser.h. - */ -@property (nonatomic, retain) ABKFacebookUser *facebookUser; - /* ------------------------------------------------------------------------------------------------------ * Enums */ diff --git a/AppboyKit/headers/AppboyKitLibrary/Appboy.h b/AppboyKit/headers/AppboyKitLibrary/Appboy.h index 13b3c3d12..4d24acaec 100644 --- a/AppboyKit/headers/AppboyKitLibrary/Appboy.h +++ b/AppboyKit/headers/AppboyKitLibrary/Appboy.h @@ -14,15 +14,15 @@ #import #ifndef APPBOY_SDK_VERSION -#define APPBOY_SDK_VERSION @"2.11.2" +#define APPBOY_SDK_VERSION @"2.9.6" #endif -@class ABKInAppMessageController; +@class ABKSlideupController; @class ABKFeedController; @class ABKUser; -@class ABKInAppMessage; -@class ABKInAppMessageViewController; -@protocol ABKInAppMessageControllerDelegate; +@class ABKSlideup; +@class ABKSlideupViewController; +@protocol ABKSlideupControllerDelegate; @protocol ABKAppboyEndpointDelegate; @interface Appboy : NSObject @@ -115,8 +115,8 @@ extern NSString *const ABKAppboyEndpointDelegateKey; /*! * 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, requesting new in-app messages and posting feedback. Appboy's -* communication policy is to perform immediate server requests when user facing data is required (new in-app messages, +* analytics data to the server, updating the feed, requesting new slideups and posting feedback. Appboy's +* communication policy is to perform immediate server requests when user facing data is required (new slideups, * 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 - The same as ABKAutomaticRequestProcessing, except that updates to @@ -145,16 +145,22 @@ typedef NS_ENUM(NSInteger, ABKRequestProcessingPolicy) { /*! * Possible values for the SDK's social account acquisition policies: * ABKAutomaticSocialAccountAcquisition (default) - At app startup and after you've set a social account identifier -* on the user object, Appboy will automatically attempt to fetch Twitter account data +* on the user object, Appboy will automatically attempt to fetch Twitter and Facebook social account data * for the user and flush it to the server. In all cases, Appboy's automatic data acquisition will ensure that the * user is not prompted or that the UI of your application is otherwise affected. For this reason, when Appboy * tries to perform the data acquisition, your app must have already been granted the relevant permissions to * obtain social account data. If you've specified the twitterAccountIdentifier, Appboy will only attempt to grab * data for that twitter account. If you haven't specified it, Appboy will grab data for the first Twitter account -* returned by the system. +* returned by the system. An upcoming release will enable identifier targeting for Facebook as well. +* +* Note: If you have not integrated the Facebook SDK into your app, there is no way to grab Facebook data without +* prompting the user, so you must call
[[Appboy sharedInstance] promptUserForAccessToSocialNetwork:ABKSocialNetworkFacebook];
+* and allow the user to be prompted. If you have integrated the Facebook SDK, you must ensure that the user has +* allowed read permissions. If permission is granted, Appboy will collect the user's basic public profile info +* "user_about_me" "email" "user_hometown" "user_birthday" and, if permission is granted, "user_likes". * ABKAutomaticSocialAccountAcquisitionWithIdentifierOnly - Appboy will only attempt to obtain social account information when * an identifier is set on the user for the corresponding social network. Note: This currently only works for -* Twitter accounts. +* Twitter accounts. An upcoming release will enable identifier targeting for Facebook as well. * ABKManualSocialAccountAcquisition - Appboy will NOT try to acquire social account data. You must call *
[[Appboy sharedInstance] promptUserForAccessToSocialNetwork:(ABKSocialNetwork)];
*/ @@ -179,10 +185,10 @@ typedef NS_OPTIONS(NSUInteger, ABKSocialNetwork) { @property (nonatomic, retain, readonly) ABKFeedController *feedController; /*! - * The current in-app message manager. - * See ABKInAppMessageController.h. + * The current slideup manager. + * See ABKSlideupController.h. */ -@property (nonatomic, retain, readonly) ABKInAppMessageController *inAppMessageController; +@property (nonatomic, retain, readonly) ABKSlideupController *slideupController; /*! * The current app user. @@ -216,8 +222,7 @@ typedef NS_OPTIONS(NSUInteger, ABKSocialNetwork) { * @deprecated This property is now deprecated and will be removed in the future. Please use * [[Appboy sharedInstance].feedController cardCountForCategories:ABKCardCategoryAll] instead. */ -@property (readonly, nonatomic, assign) NSInteger cardCount __deprecated_msg("Please use \n" -"[[Appboy sharedInstance].feedController cardCountForCategories:ABKCardCategoryAll] instead"); +@property (readonly, nonatomic, assign) NSInteger cardCount __deprecated; /*! * unreadCardCount is the number of currently active cards which have not been viewed. @@ -233,8 +238,7 @@ typedef NS_OPTIONS(NSUInteger, ABKSocialNetwork) { * @deprecated This property is now deprecated and will be removed in the future. Please use * [[Appboy sharedInstance].feedController unreadCardCountForCategories:ABKCardCategoryAll] instead. */ -@property (readonly, nonatomic, assign) NSInteger unreadCardCount __deprecated_msg("Please use \n" -"[[Appboy sharedInstance].feedController unreadCardCountForCategories:ABKCardCategoryAll] instead"); +@property (readonly, nonatomic, assign) NSInteger unreadCardCount __deprecated; /*! * The policy regarding processing of network requests by the SDK. See the enumeration values for more information on @@ -268,7 +272,7 @@ typedef NS_OPTIONS(NSUInteger, ABKSocialNetwork) { * * If you're using ABKManualRequestProcessing, you need to call this after each network related activity in your app. * This includes: - * * Retrieving an updated feed and in-app message after a new session is opened or the user is changed. Appboy will + * * Retrieving an updated feed and slideup after a new session is opened or the user is changed. Appboy will * automatically add the request for new data to the network queue, you just need to give it permission to execute * that request. * * Flushing updated user data (custom events, custom attributes, as well as automatically collected data). @@ -336,7 +340,7 @@ didReceiveRemoteNotification:(NSDictionary *)notification */ - (void) getActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo - completionHandler:(void (^)())completionHandler; + completionHandler:(void (^)(UIBackgroundFetchResult))completionHandler; /*! * @param userID The new user's ID (from the host application). @@ -363,7 +367,7 @@ didReceiveRemoteNotification:(NSDictionary *)notification * - 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. -* Appboy will also automatically make a data refresh request to get the news feed, in-app message and other information +* Appboy will also automatically make a data refresh request to get the news feed, slideup 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 @@ -443,10 +447,19 @@ didReceiveRemoteNotification:(NSDictionary *)notification * We generally advise that you don't call this method on startup, as it will immediately prompt your users for * Twitter access. * -* Please note that In versions 2.10 and above, Appboy will no longer prompt users to connect their Facebook accounts. -* Please refer to the method "promptUserToConnectFacebookAccountOnDeviceAndFetchAccountData" in SocialNetworkViewController.m -* (https://github.com/Appboy/appboy-ios-sdk/blob/master/Example/Stopwatch/SocialNetworkViewController.m) to continue -* prompting users to connect their Facebook account. +* Notes: +* For ABKSocialNetworkTwitter: +* This only works for iOS5 and higher. In older versions, this method is a no-op. +* +* For ABKSocialNetworkFacebook: +* This requires your Facebook App ID, which you enter in your app's plist under the key "FacebookAppID". +* Also, you must have configured a Facebook app with your bundle ID. For more help, see "Create a Facebook App" at +* https://developers.facebook.com/docs/getting-started/facebook-sdk-for-ios/ +* Calls to this method without a defined FacebookAppID will NSLog an error and do nothing. +* +* It is highly recommended that you also install the Facebook iOS SDK in your app. If you include the Facebook SDK +* in your app, this method will work for all iOS versions and provide a high-quality integration experience for the +* end user. If you do not include the Facebook SDK, this method call will only work on iOS6 or higher. */ - (void) promptUserForAccessToSocialNetwork:(ABKSocialNetwork)socialNetwork; @@ -488,16 +501,9 @@ didReceiveRemoteNotification:(NSDictionary *)notification - (void) requestFeedRefresh; /*! - * Enqueues an in-app message request for the current user. Note that if the queue already contains another request for the - * current user, that the in-app message request will be merged into the already existing request and only one will execute + * Enqueues a slideup request for the current user. Note that if the queue already contains another request for the + * current user, that the slideup request will be merged into the already existing request and only one will execute * for that user. */ -- (void) requestInAppMessageRefresh; - -/*! - * Enqueues an in-app message request for the current user. Note that this is deprecated from version 2.11.0. Please use - * requestInAppMessageRefresh instead. - */ -- (void) requestSlideupRefresh __deprecated_msg("This method is deprecated in version 2.11. Please use " -"requestInAppMessageRefresh instead."); +- (void) requestSlideupRefresh; @end diff --git a/AppboyKit/headers/AppboyKitLibrary/AppboyKit.h b/AppboyKit/headers/AppboyKitLibrary/AppboyKit.h index 2ae8db340..2a473e4bb 100644 --- a/AppboyKit/headers/AppboyKitLibrary/AppboyKit.h +++ b/AppboyKit/headers/AppboyKitLibrary/AppboyKit.h @@ -1,45 +1,25 @@ #import "Appboy.h" #import "ABKUser.h" -#import "ABKAppboyEndpointDelegate.h" -#import "ABKFacebookUser.h" - -// Feedback #import "ABKFeedbackViewController.h" #import "ABKFeedbackViewControllerPopoverContext.h" #import "ABKFeedbackViewControllerModalContext.h" #import "ABKFeedbackViewControllerNavigationContext.h" - -// News Feed #import "ABKFeedViewController.h" #import "ABKFeedViewControllerGenericContext.h" #import "ABKFeedViewControllerModalContext.h" #import "ABKFeedViewControllerNavigationContext.h" #import "ABKFeedViewControllerPopoverContext.h" +#import "ABKSlideup.h" +#import "ABKSlideupView.h" +#import "ABKSlideupViewController.h" +#import "ABKSlideupControllerDelegate.h" +#import "ABKIdentifierForAdvertisingProvider.h" +#import "ABKSlideupController.h" #import "ABKFeedController.h" - -// Cards #import "ABKCard.h" #import "ABKBannerCard.h" #import "ABKCaptionedImageCard.h" #import "ABKCrossPromotionCard.h" #import "ABKClassicCard.h" #import "ABKTextAnnouncementCard.h" - -// In-app Message -#import "ABKInAppMessage.h" -#import "ABKInAppMessageSlideup.h" -#import "ABKInAppMessageImmersive.h" -#import "ABKInAppMessageModal.h" -#import "ABKInAppMessageFull.h" -#import "ABKInAppMessageView.h" -#import "ABKInAppMessageViewController.h" -#import "ABKInAppMessageSlideupViewController.h" -#import "ABKInAppMessageImmersiveViewController.h" -#import "ABKInAppMessageModalViewController.h" -#import "ABKInAppMessageFullViewController.h" -#import "ABKInAppMessageControllerDelegate.h" -#import "ABKInAppMessageController.h" -#import "ABKInAppMessageButton.h" - -// IDFA -#import "ABKIdentifierForAdvertisingProvider.h" +#import "ABKAppboyEndpointDelegate.h" diff --git a/AppboyKit/libAppboyKitLibrary.a b/AppboyKit/libAppboyKitLibrary.a index 0069a590e..ce242a1b7 100644 Binary files a/AppboyKit/libAppboyKitLibrary.a and b/AppboyKit/libAppboyKitLibrary.a differ diff --git a/AppboyKitWithoutFacebookSupport/ABKIdentifierForAdvertisingProvider.m b/AppboyKitWithoutFacebookSupport/ABKIdentifierForAdvertisingProvider.m new file mode 100644 index 000000000..fc5d65162 --- /dev/null +++ b/AppboyKitWithoutFacebookSupport/ABKIdentifierForAdvertisingProvider.m @@ -0,0 +1,75 @@ +#import +#import "ABKIdentifierForAdvertisingProvider.h" + +/*! + * Do not call these methods within your code. They are meant for Appboy internal use only. + */ + +/*! + * ABKIdentifierForAdvertisingProvider.m and ABKIdentifierForAdvertisingProvider.h must be added to your project + * regardless of whether or not you enable collection. This occurs automatically if you integrate/update via the CocoaPod. + */ + +@implementation ABKIdentifierForAdvertisingProvider + +/*! + * @discussion Returns the identifier for advertising if AdSupport framework is available (i.e., iOS >= 6.0) and + * the identifier for advertising is enabled. + * + * If you’re using advertising elsewhere in the app or through our in-app News Feed, we recommend continuing to collect + * the IDFA through Appboy. You should be able to do so safely without fear of rejection from the iOS App Store. + * The future availability of IDFAs will enable functionality like integrating with other third-party systems, + * including your own servers, and enabling re-targeting of existing users outside of Appboy. + * If you continue to record them we will store IDFAs free of charge so you can take advantage of these options + * immediately when they are released without additional development work. + * + * To enable IDFA collection add a PreProcessor Macro to your build settings called ABK_ENABLE_IDFA_COLLECTION=1 + */ ++ (NSString *) getIdentifierForAdvertiser { +#ifdef ABK_ENABLE_IDFA_COLLECTION + ASIdentifierManager *sharedManager = [self getASIdentifierManager]; + if (sharedManager) { + if ([sharedManager isAdvertisingTrackingEnabled]) { + return [[sharedManager advertisingIdentifier] UUIDString]; + } + } +#endif + NSLog(@"[APPBOY] %@", @"ASI code block disabled."); + return nil; +} + +/*! + * @discussion Returns the NSNumber object with IsAdvertisingTrackingEnabled if AdSupport framework is available + * (i.e., iOS >= 6.0) and the user has not disallowed advertising tracking. Note that you can still retrieve the IFA + * in the case that the user has not enabled advertising tracking, but rather the rules surrounding its use become + * more strict. + */ ++ (NSNumber *) getIsAdvertisingTrackingEnabledAsNSNumber { +#ifdef ABK_ENABLE_IDFA_COLLECTION + ASIdentifierManager *sharedManager = [self getASIdentifierManager]; + if (sharedManager) { + return [NSNumber numberWithBool:[sharedManager isAdvertisingTrackingEnabled]]; + } +#endif + NSLog(@"[APPBOY] %@", @"ASI code block disabled."); + return nil; +} + +#ifdef ABK_ENABLE_IDFA_COLLECTION +/*! + * @discussion Returns the [ASIdentifierManager sharedManager] if it is available (i.e., iOS >= 6.0 and app is linked + * against AdSupport framework). + */ ++ (ASIdentifierManager *) getASIdentifierManager { + NSLog(@"[APPBOY] %@", @"ASI code block enabled."); + Class ASIdentifierManagerClass = NSClassFromString(@"ASIdentifierManager"); + if (ASIdentifierManagerClass) { + // Don't use [ASIdentifierManager sharedManager] here so this method doesn't require that the host app link against + // the AdSupport framework. + return [ASIdentifierManagerClass sharedManager]; + } + return nil; +} +#endif + +@end diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKBannerCardCell.nib/objects-8.0+.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKBannerCardCell.nib/objects-8.0+.nib new file mode 100644 index 000000000..94d231744 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKBannerCardCell.nib/objects-8.0+.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKBannerCardCell.nib/objects.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKBannerCardCell.nib/objects.nib new file mode 100644 index 000000000..94d231744 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKBannerCardCell.nib/objects.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKBannerCardCell.nib/runtime.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKBannerCardCell.nib/runtime.nib new file mode 100644 index 000000000..e3ec39e4a Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKBannerCardCell.nib/runtime.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects-8.0+.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects-8.0+.nib new file mode 100644 index 000000000..ec63dadfb Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects-8.0+.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects.nib new file mode 100644 index 000000000..ec63dadfb Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCaptionedMessageCardCell.nib/runtime.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCaptionedMessageCardCell.nib/runtime.nib new file mode 100644 index 000000000..db96f0516 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCaptionedMessageCardCell.nib/runtime.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects-8.0+.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects-8.0+.nib new file mode 100644 index 000000000..c0992ad2d Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects-8.0+.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects.nib new file mode 100644 index 000000000..c0992ad2d Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCrossPromotionCardCell.nib/runtime.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCrossPromotionCardCell.nib/runtime.nib new file mode 100644 index 000000000..1a1f6da45 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKCrossPromotionCardCell.nib/runtime.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKDefaultSlideupViewController.nib/objects-8.0+.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKDefaultSlideupViewController.nib/objects-8.0+.nib new file mode 100644 index 000000000..2925cf36f Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKDefaultSlideupViewController.nib/objects-8.0+.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKDefaultSlideupViewController.nib/objects.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKDefaultSlideupViewController.nib/objects.nib new file mode 100644 index 000000000..2925cf36f Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKDefaultSlideupViewController.nib/objects.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKDefaultSlideupViewController.nib/runtime.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKDefaultSlideupViewController.nib/runtime.nib new file mode 100644 index 000000000..2925cf36f Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKDefaultSlideupViewController.nib/runtime.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedNoConnectionView.nib/objects-8.0+.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedNoConnectionView.nib/objects-8.0+.nib new file mode 100644 index 000000000..4bb161ac2 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedNoConnectionView.nib/objects-8.0+.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedNoConnectionView.nib/objects.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedNoConnectionView.nib/objects.nib new file mode 100644 index 000000000..4bb161ac2 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedNoConnectionView.nib/objects.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedNoConnectionView.nib/runtime.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedNoConnectionView.nib/runtime.nib new file mode 100644 index 000000000..8cfd858fd Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedNoConnectionView.nib/runtime.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedViewController.nib/objects-8.0+.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedViewController.nib/objects-8.0+.nib new file mode 100644 index 000000000..f0745b915 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedViewController.nib/objects-8.0+.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedViewController.nib/objects.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedViewController.nib/objects.nib new file mode 100644 index 000000000..f0745b915 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedViewController.nib/objects.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedViewController.nib/runtime.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedViewController.nib/runtime.nib new file mode 100644 index 000000000..f0745b915 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedViewController.nib/runtime.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackContentView.nib/objects-8.0+.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackContentView.nib/objects-8.0+.nib new file mode 100644 index 000000000..e9b8b486f Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackContentView.nib/objects-8.0+.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackContentView.nib/objects.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackContentView.nib/objects.nib new file mode 100644 index 000000000..e9b8b486f Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackContentView.nib/objects.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackContentView.nib/runtime.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackContentView.nib/runtime.nib new file mode 100644 index 000000000..e9b8b486f Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackContentView.nib/runtime.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects-8.0+.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects-8.0+.nib new file mode 100644 index 000000000..483ec8202 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects-8.0+.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects.nib new file mode 100644 index 000000000..483ec8202 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/runtime.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/runtime.nib new file mode 100644 index 000000000..483ec8202 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/runtime.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackNavBar.nib/objects-8.0+.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackNavBar.nib/objects-8.0+.nib new file mode 100644 index 000000000..e5a3d6fb8 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackNavBar.nib/objects-8.0+.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackNavBar.nib/objects.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackNavBar.nib/objects.nib new file mode 100644 index 000000000..e5a3d6fb8 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackNavBar.nib/objects.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackNavBar.nib/runtime.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackNavBar.nib/runtime.nib new file mode 100644 index 000000000..c51954c5c Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKFeedbackNavBar.nib/runtime.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKNewsCardCell.nib/objects-8.0+.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKNewsCardCell.nib/objects-8.0+.nib new file mode 100644 index 000000000..8a3cede9d Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKNewsCardCell.nib/objects-8.0+.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKNewsCardCell.nib/objects.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKNewsCardCell.nib/objects.nib new file mode 100644 index 000000000..8a3cede9d Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKNewsCardCell.nib/objects.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKNewsCardCell.nib/runtime.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKNewsCardCell.nib/runtime.nib new file mode 100644 index 000000000..baddac3eb Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKNewsCardCell.nib/runtime.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKSpinnerView.nib/objects-8.0+.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKSpinnerView.nib/objects-8.0+.nib new file mode 100644 index 000000000..725f4a074 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKSpinnerView.nib/objects-8.0+.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKSpinnerView.nib/objects.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKSpinnerView.nib/objects.nib new file mode 100644 index 000000000..725f4a074 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKSpinnerView.nib/objects.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKSpinnerView.nib/runtime.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKSpinnerView.nib/runtime.nib new file mode 100644 index 000000000..725f4a074 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKSpinnerView.nib/runtime.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects-8.0+.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects-8.0+.nib new file mode 100644 index 000000000..2ff661a05 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects-8.0+.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects.nib new file mode 100644 index 000000000..2ff661a05 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKTextAnnouncementCardCell.nib/runtime.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKTextAnnouncementCardCell.nib/runtime.nib new file mode 100644 index 000000000..293480eac Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKTextAnnouncementCardCell.nib/runtime.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKWebViewController.nib/objects-8.0+.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKWebViewController.nib/objects-8.0+.nib new file mode 100644 index 000000000..fdcf62721 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKWebViewController.nib/objects-8.0+.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKWebViewController.nib/objects.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKWebViewController.nib/objects.nib new file mode 100644 index 000000000..fdcf62721 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKWebViewController.nib/objects.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKWebViewController.nib/runtime.nib b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKWebViewController.nib/runtime.nib new file mode 100644 index 000000000..fdcf62721 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ABKWebViewController.nib/runtime.nib differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/Icons_Read.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/Icons_Read.png new file mode 100644 index 000000000..e794a74f9 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/Icons_Read.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/Icons_Read@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/Icons_Read@2x.png new file mode 100644 index 000000000..8520dd5d8 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/Icons_Read@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/Icons_Unread.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/Icons_Unread.png new file mode 100644 index 000000000..9bb2232b3 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/Icons_Unread.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/Icons_Unread@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/Icons_Unread@2x.png new file mode 100644 index 000000000..208f64f98 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/Icons_Unread@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/Info.plist b/AppboyKitWithoutFacebookSupport/Appboy.bundle/Info.plist new file mode 100644 index 000000000..69761657b Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/Info.plist differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/SlideupArrow.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/SlideupArrow.png new file mode 100644 index 000000000..d576dfef5 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/SlideupArrow.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ar.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ar.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..6c5d555bd Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ar.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/arrow.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/arrow.png new file mode 100644 index 000000000..a16524c3d Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/arrow.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/arrow@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/arrow@2x.png new file mode 100644 index 000000000..ee6b21d01 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/arrow@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-disabled.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-disabled.png new file mode 100644 index 000000000..07fe53992 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-disabled.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-disabled@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-disabled@2x.png new file mode 100644 index 000000000..1e73432c9 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-disabled@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-highlighted.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-highlighted.png new file mode 100644 index 000000000..db9508997 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-highlighted.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-highlighted@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-highlighted@2x.png new file mode 100644 index 000000000..a7066d46e Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-highlighted@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-normal.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-normal.png new file mode 100644 index 000000000..ee0ee1940 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-normal.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-normal@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-normal@2x.png new file mode 100644 index 000000000..2e738a941 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-normal@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-disabled.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-disabled.png new file mode 100644 index 000000000..e17bdc875 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-disabled.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-disabled@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-disabled@2x.png new file mode 100644 index 000000000..d59313271 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-disabled@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-highlighted.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-highlighted.png new file mode 100644 index 000000000..8b1f255a1 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-highlighted.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-highlighted@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-highlighted@2x.png new file mode 100644 index 000000000..e698aef29 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-highlighted@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-normal.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-normal.png new file mode 100644 index 000000000..188edb576 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-normal.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-normal@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-normal@2x.png new file mode 100644 index 000000000..9fb8e0bcd Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-app-purchase-plus-normal@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-email-highlighted.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-email-highlighted.png new file mode 100644 index 000000000..f2ece10cb Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-email-highlighted.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-email-highlighted@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-email-highlighted@2x.png new file mode 100644 index 000000000..e8d94cbe4 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-email-highlighted@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-email-normal.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-email-normal.png new file mode 100644 index 000000000..fb5a55ec2 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-email-normal.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-email-normal@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-email-normal@2x.png new file mode 100644 index 000000000..743cc4a7d Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-email-normal@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-facebook-highlighted.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-facebook-highlighted.png new file mode 100644 index 000000000..3bd3fbd91 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-facebook-highlighted.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-facebook-highlighted@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-facebook-highlighted@2x.png new file mode 100644 index 000000000..f57b437d5 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-facebook-highlighted@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-facebook-normal.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-facebook-normal.png new file mode 100644 index 000000000..7414fdd4a Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-facebook-normal.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-facebook-normal@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-facebook-normal@2x.png new file mode 100644 index 000000000..c8ca36179 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/btn-facebook-normal@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/checkmark-bg.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/checkmark-bg.png new file mode 100644 index 000000000..441854847 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/checkmark-bg.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/checkmark-bg@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/checkmark-bg@2x.png new file mode 100644 index 000000000..2aa84f611 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/checkmark-bg@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/checkmark.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/checkmark.png new file mode 100644 index 000000000..9ba354ec1 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/checkmark.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/checkmark@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/checkmark@2x.png new file mode 100644 index 000000000..7ef29dd68 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/checkmark@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/da.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/da.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..1a6ee0b50 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/da.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/de.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/de.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..5500ce877 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/de.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/en.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/en.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..c481cb7b7 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/en.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/es-419.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/es-419.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..7e9cb6447 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/es-419.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/es-MX.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/es-MX.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..7e9cb6447 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/es-MX.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/es.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/es.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..074294775 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/es.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/et.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/et.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..e88886244 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/et.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/fi.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/fi.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..feccb8d98 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/fi.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/fil.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/fil.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..767b85a16 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/fil.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/fr.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/fr.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..9caff54b5 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/fr.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/hi.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/hi.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..be4673fa0 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/hi.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/icon-facebook.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/icon-facebook.png new file mode 100644 index 000000000..c8c990c18 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/icon-facebook.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/id.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/id.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..c6233fdcf Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/id.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-background.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-background.png new file mode 100644 index 000000000..5679e4f12 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-background.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-background@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-background@2x.png new file mode 100644 index 000000000..2d09dfed1 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-background@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-disclosure-arrow.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-disclosure-arrow.png new file mode 100644 index 000000000..b68305edf Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-disclosure-arrow.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-disclosure-arrow@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-disclosure-arrow@2x.png new file mode 100644 index 000000000..5654d83af Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-disclosure-arrow@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-noimage-lrg.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-noimage-lrg.png new file mode 100644 index 000000000..d12381c71 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-noimage-lrg.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-noimage-lrg@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-noimage-lrg@2x.png new file mode 100644 index 000000000..74d0e97d9 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-noimage-lrg@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-noimage-sm.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-noimage-sm.png new file mode 100644 index 000000000..4ea0e8ff9 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-noimage-sm.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-noimage-sm@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-noimage-sm@2x.png new file mode 100644 index 000000000..35a0a5672 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-noimage-sm@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-recommended-tab.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-recommended-tab.png new file mode 100644 index 000000000..30e8b3e44 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-recommended-tab.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-recommended-tab@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-recommended-tab@2x.png new file mode 100644 index 000000000..0e02e171b Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-recommended-tab@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-empty.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-empty.png new file mode 100644 index 000000000..f362afec0 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-empty.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-empty@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-empty@2x.png new file mode 100644 index 000000000..e48bd8601 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-empty@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-filled.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-filled.png new file mode 100644 index 000000000..bd84dcd7e Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-filled.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-filled@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-filled@2x.png new file mode 100644 index 000000000..6db540611 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-filled@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-half.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-half.png new file mode 100644 index 000000000..648a93df3 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-half.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-half@2x.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-half@2x.png new file mode 100644 index 000000000..c6bf814c9 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/img-star-half@2x.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/it.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/it.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..52c697f3e Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/it.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ja.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ja.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..15b6d0027 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ja.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/km.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/km.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..25a2b1ba3 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/km.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ko.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ko.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..82814a8ba Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ko.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/lo.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/lo.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..ba46b87a1 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/lo.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ms.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ms.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..caa90e9ad Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ms.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/my.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/my.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..b62c93687 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/my.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/nb.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/nb.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..419dd391a Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/nb.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/nl.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/nl.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..960389d0c Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/nl.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/pl.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/pl.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..01d8d1726 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/pl.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/pt-PT.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/pt-PT.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..f690e9c55 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/pt-PT.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/pt.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/pt.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..447047be2 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/pt.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/radio-tower.png b/AppboyKitWithoutFacebookSupport/Appboy.bundle/radio-tower.png new file mode 100644 index 000000000..f2e8204c2 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/radio-tower.png differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/ru.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ru.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..7cf84f371 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/ru.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/sv.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/sv.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..758f746ec Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/sv.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/th.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/th.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..f7f830521 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/th.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/vi.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/vi.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..1c1ca4371 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/vi.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/zh-Hans.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/zh-Hans.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..1782ffc19 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/zh-Hans.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/Appboy.bundle/zh-Hant.lproj/LocalizedAppboyUIString.strings b/AppboyKitWithoutFacebookSupport/Appboy.bundle/zh-Hant.lproj/LocalizedAppboyUIString.strings new file mode 100644 index 000000000..23fd71206 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/Appboy.bundle/zh-Hant.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKAppboyEndpointDelegate.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKAppboyEndpointDelegate.h new file mode 100644 index 000000000..7aa0998b3 --- /dev/null +++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKAppboyEndpointDelegate.h @@ -0,0 +1,22 @@ +#import + + +@protocol ABKAppboyEndpointDelegate + +/*! + * Given a valid Appboy API endpoint URI string, this method returns a valid endpoint URI string. + * + * @param appboyEndpoint A URI string for an Appboy API endpoint + * @return A valid Appboy API endpoint URI + */ +- (NSString *) getApiEndpoint:(NSString *)appboyApiEndpoint; + +/*! + * Given a valid Appboy Resource endpoint URI string, this method returns a valid resource endpoint URI string. + * Currently resource endpoints are image URIs, but may be extended to include video and other external content. + * + * @param appboyResourceEndpoint A URI string for an Appboy API resource endpoint + * @return A valid Appboy API resource endpoint URI + */ +- (NSString *) getResourceEndpoint:(NSString *)appboyResourceEndpoint; +@end diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKBannerCard.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKBannerCard.h new file mode 100644 index 000000000..c3c26e094 --- /dev/null +++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKBannerCard.h @@ -0,0 +1,27 @@ +#import "ABKCard.h" + +@interface ABKBannerCard : ABKCard + +/* + * This property is the URL of the card's image. + */ +@property (nonatomic, copy) NSString *image; + +//Optional: +/* + * The URL that will be opened after the card is clicked on. It can be a http(s) URL or a protocol URL. + */ +@property (nonatomic, copy) NSString *url; + +/* + * 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 (nonatomic, copy) NSString *domain; + +/* + * This property is the aspect ratio of the card's image. + */ +@property (nonatomic, assign) float imageAspectRatio; + +@end diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKCaptionedImageCard.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKCaptionedImageCard.h new file mode 100644 index 000000000..3d8a4ed61 --- /dev/null +++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKCaptionedImageCard.h @@ -0,0 +1,34 @@ +#import "ABKCard.h" + +@interface ABKCaptionedImageCard : ABKCard + +/* + * This property is the URL of the card's image. + */ +@property (nonatomic, copy) NSString *image; +/* + * This property is the aspect ratio of the card's image. + */ +@property (nonatomic, assign) float imageAspectRatio; +/* + * The title text for the card. + */ +@property (nonatomic, copy) NSString *title; +/* + * The description text for the card. + */ +@property (nonatomic, copy) NSString *cardDescription; + +//Optional: +/* + * The URL that will be opened after the card is clicked on. It can be a http(s) URL or a protocol URL. + */ +@property (nonatomic, copy) NSString *url; + +/* + * 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 (nonatomic, copy) NSString *domain; + +@end diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKCard.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKCard.h new file mode 100644 index 000000000..5eeec0b7b --- /dev/null +++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKCard.h @@ -0,0 +1,56 @@ +#import +#import "ABKFeedController.h" + +@interface ABKCard : NSObject +/* + * Card's ID. + */ +@property (nonatomic, readonly) NSString *idString; + +/* + * This property reflects if the card is read or unread by the user. + */ +@property (nonatomic, assign) BOOL viewed; + +/* + * The property is the unix timestamp of the card's creation time from Appboy dashboard. + */ +@property (nonatomic, assign, readonly) double created; + +/* + * The property is the unix timestamp of the card's latest update time from Appboy dashboard. + */ +@property (nonatomic, assign, readonly) double updated; + +/* + * The categories assigned to the card. + */ +@property (nonatomic, assign) ABKCardCategory categories; + +/* + * @param cardDictionary The dictionary for card deserialization. + * + * Deserializes the dictionary to a card for use by wrappers such as Appboy's Unity SDK for iOS. + * When the deserialization isn't successful, this method returns nil; otherwise, it returns the deserialized card. + */ ++ (ABKCard *) deserializeCardFromDictionary:(NSDictionary *)cardDictionary; + +/* + * Serializes the card to binary data for use by wrappers such as Appboy's Unity SDK for iOS. + */ +- (NSData *) serializeToData; + +/* + * Manually log an impression to Appboy 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 Appboy for the card. + * * This should only be used for custom news feed view controller. ABKFeedViewController already has card click logging. + */ +- (void) logCardClicked; + +- (BOOL) hasSameId:(ABKCard *)card; +@end diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKClassicCard.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKClassicCard.h new file mode 100644 index 000000000..a51ad4b0d --- /dev/null +++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKClassicCard.h @@ -0,0 +1,29 @@ +#import "ABKCard.h" + +@interface ABKClassicCard : ABKCard + +/* + * This property is the URL of the card's image. + */ +@property (nonatomic, copy) NSString *image; +/* + * The description text for the card. + */ +@property (nonatomic, copy) NSString *cardDescription; + +//Optional: +/* + * The URL that will be opened after the card is clicked on. It can be a http(s) URL or a protocol URL. + */ +@property (nonatomic, copy) NSString *url; +/* + * The news title text for the card. + */ +@property (nonatomic, copy) 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 (nonatomic, copy) NSString *domain; + +@end diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKCrossPromotionCard.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKCrossPromotionCard.h new file mode 100644 index 000000000..27e32da34 --- /dev/null +++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKCrossPromotionCard.h @@ -0,0 +1,70 @@ +#import "ABKCard.h" + +@interface ABKCrossPromotionCard : ABKCard + +/* + * This is the type of iTunes media. The possible values are: + * ItunesAlbum + * ItunesAudiobook + * ItunesCompilation + * ItunesEbook + * ItunesFeatureMovie + * ItunesPodcast + * ItunesSoftware + * ItunesSong + * ItunesTvEpisode + * ItunesTvSeason + */ +@property (nonatomic, copy) NSString *mediaType; +/* + * The title text for the card. This will be the promoted item's name. + */ +@property (nonatomic, copy) NSString *title; +/* + * The text of the category of the promoted item. + */ +@property (nonatomic, copy) NSString *subtitle; +/* + * This property is the URL of the card's image. + */ +@property (nonatomic, copy) NSString *image; +/* + * A localized display price string. + */ +@property (nonatomic, copy) NSString *displayPrice; +/* + * The iTunes ID number of the promoted item. + */ + +@property (nonatomic, assign) long long iTunesId; +/* + * The rating of the promoted app. + * This property will be 0.0 unless the promoted item is an app, and the rating will be in the range + * of [0.0, 5.0]; + */ +@property (nonatomic, assign) float rating; +/* + * The price of the promoted item in Apple App Store. + */ +@property (nonatomic, assign) float price; +/* + * The number of reviews of the promoted app. + * This property will be 0 unless the promoted item is an app. + */ +@property (nonatomic, assign) int reviews; +/* + * This property is the text that will be displayed in the tag on the top of the small cross promotion + * card. + */ +@property (nonatomic, copy) NSString *caption; +/* + * The itunes url of the promoted item which leads to the item's App Store page. + */ +@property (nonatomic, copy) NSString *url; + +//Optional: +/* + * This property indicates if the promoted item is universal or not. + */ +@property (nonatomic, assign) BOOL universal; +@end diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedController.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedController.h new file mode 100644 index 000000000..63d69c749 --- /dev/null +++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedController.h @@ -0,0 +1,93 @@ +#import + +/* ------------------------------------------------------------------------------------------------------ + * Notifications + */ + +/*! + * When the news feed is updated, Appboy 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: + * + *
+ *   [[NSNotificationCenter defaultCenter] addObserver:self
+ *                                            selector:@selector(feedUpdatedNotificationReceived:)
+ *                                                name:ABKFeedUpdatedNotification
+ *                                              object:nil];
+ * 
+ * + * where "feedUpdatedNotificationReceived:" is your callback method for handling the notification: + * + *
+ *   - (void) feedUpdatedNotificationReceived:(NSNotification *)notification {
+ *     BOOL updateIsSuccessful = [[notification.userInfo objectForKey:ABKFeedUpdatedIsSuccessfulKey] boolValue];
+ *     < Do something in response to the notification >
+ *   }
+ * 
+ */
+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
+};
+
+@interface ABKFeedController : NSObject
+
+/*!
+ * The latest cards of Appboy news feed that is saved in memory and disk. Right now the available card types are ABKBannerCard,
+ * ABKCaptionedImageCard, ABKCrossPromotionCard, ABKClassicCard and ABKTextAnnouncementCard. They are all subclasses
+ * of ABKCard.
+ */
+@property (readonly) NSArray *newsFeedCards;
+
+/*!
+ * The NSDate object that indicates the last time the newsFeedCards property was updated from Appboy server.
+ */
+@property (readonly) 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
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewController.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewController.h
new file mode 100644
index 000000000..4c2c7d859
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewController.h
@@ -0,0 +1,63 @@
+//
+//  ABKFeedViewController.h
+//  AppboySDK
+//
+//  Copyright (c) 2013 Appboy. All rights reserved.
+
+/*!
+ * This class is used internally; you don't need to include it.
+ */
+
+#import 
+#import 
+#import "ABKFeedViewControllerDelegate.h"
+#import "ABKFeedController.h"
+
+@interface ABKFeedViewController : UIViewController 
+
+/*! 
+ * This property defines the width for each feed card on an iPhone. The default width is 300.0f. This value will only be
+ * utilized when each margin between the card and the left and right edges of the view is greater than or equal to
+ * minimumCardMarginForiPhone. This property is not utilized on iPad, iPad mini or iPad air.
+ */
+@property (nonatomic, assign) CGFloat cardWidthForiPhone;
+
+/*!
+ * This property defines the width for each feed card on an iPad, iPad mini or iPad air. The default width is 600.0f.
+ * This property will only utilized when each margin between the card and the left and right edges of the view is greater
+ * than or equal to minimumCardMarginForiPad. This property is not utilized on iPhones.
+ */
+@property (nonatomic, assign) CGFloat cardWidthForiPad;
+
+/*!
+ * This property defines the minimum acceptable left and right margins between the card and and the edge of the view on an iPhone.
+ * The default value is 10.0f. If the defined cardWidthForiPhone would create margins less than the value of this property
+ * a new card width will be calculated automatically to provide the defined minimumCardMarginForiPhone
+ */
+@property (nonatomic, assign) CGFloat minimumCardMarginForiPhone;
+
+/*!
+ * This property defines the minimum acceptable left and right margins between the card and and the edge of the view on an iPad.
+ * The default value is 20.0f. If the defined cardWidthForiPad would create margins less than the value of this property
+ * a new card width will be calculated automatically to provide the defined minimumCardMarginForiPad.
+ */
+@property (nonatomic, assign) CGFloat minimumCardMarginForiPad;
+
+/*! Delegate */
+@property (assign, nonatomic) id appboyDelegate;
+
+/*!
+ * This property is to indicate what categories of cards the news feed is displaying. 
+ * Setting this property will automatically update the news feed page and only display cards in the given categories.
+ * This method won't request refresh of cards from Appboy server, but only look into cards that are cached in the SDK.
+ */
+@property (nonatomic, assign) ABKCardCategory categories;
+
+/*!
+ *  This property allows you to enable or disable the unread indicator on the news feed. The default value is NO, which
+ *  will enable the displaying of the unread indicator on cards.
+ */
+@property (nonatomic, assign) BOOL disableUnreadIndicator;
+
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewControllerDelegate.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewControllerDelegate.h
new file mode 100644
index 000000000..26e4c1b54
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewControllerDelegate.h
@@ -0,0 +1,16 @@
+#import 
+
+@class ABKCard;
+
+@protocol ABKFeedViewControllerDelegate 
+/*!
+ @param newsFeed The calling news feed context
+ @param clickedCard The card that's clicked by user.
+ @return A boolean value indicates if Appboy should still try to display the url of the clicked card. If it's YES, Appboy
+ will still display the content of the url as default. Otherwise, Appboy won't do anything but stay on the news feed.
+ 
+ Called when a card on the news feed is clicked.
+ */
+- (BOOL) onCardClicked:(ABKCard *)clickedCard feedViewController:(UIViewController *)newsFeed;
+
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewControllerGenericContext.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewControllerGenericContext.h
new file mode 100644
index 000000000..b65379309
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewControllerGenericContext.h
@@ -0,0 +1,82 @@
+//
+//  ABKFeedViewControllerGenericContext.h
+//  AppboySDK
+//
+//  Copyright (c) 2013 Appboy. All rights reserved.
+
+#import 
+#import "ABKFeedViewControllerDelegate.h"
+#import "ABKFeedController.h"
+/* ------------------------------------------------------------------------------------------------------
+ * ABKFeedViewController
+ */
+
+/*!
+ * The FeedViewController classes implement the scrolling view of cards you display for users of your app.
+ * To integrate, simply create a FeedViewController -- either programmatically or in a storyboard -- like
+ * you'd create any view controller, and present it.
+ *
+ * There are four different versions of the FeedViewController: Generic, Modal, Popover, and Navigation.
+ * Pick the one which matches the context in which you're using the FeedViewController; for example,
+ * if you present the FeedViewController in a modal view, use FeedViewControllerModalContext. If you
+ * present it in a popover, use FeedViewControllerPopoverContext.
+ */
+
+/* ------------------------------------------------------------------------------------------------------
+ * ABKFeedViewControllerGenericContext
+ */
+
+/*!
+ * Use the FeedViewControllerGenericContext class to present a feed view with no navigation
+ * controls or close buttons.  You could use this class, for example, when the feed view is in a
+ * tab bar controller, or when it's in a split view controller.
+ */
+
+@interface ABKFeedViewControllerGenericContext : UINavigationController 
+
+/*!
+ * This property defines the width for each feed card on an iPhone. The default width is 300.0f. This value will only be
+ * utilized when each margin between the card and the left and right edges of the view is greater than or equal to
+ * minimumCardMarginForiPhone. This property is not utilized on iPad, iPad mini or iPad air.
+ */
+@property (nonatomic, assign) CGFloat cardWidthForiPhone;
+
+/*!
+ * This property defines the width for each feed card on an iPad, iPad mini or iPad air. The default width is 600.0f.
+ * This property will only utilized when each margin between the card and the left and right edges of the view is greater
+ * than or equal to minimumCardMarginForiPad. This property is not utilized on iPhones.
+ */
+@property (nonatomic, assign) CGFloat cardWidthForiPad;
+
+/*!
+ * This property defines the minimum acceptable left and right margins between the card and and the edge of the view on an iPhone.
+ * The default value is 10.0f. If the defined cardWidthForiPhone would create margins less than the value of this property
+ * a new card width will be calculated automatically to provide the defined minimumCardMarginForiPhone
+ */
+@property (nonatomic, assign) CGFloat minimumCardMarginForiPhone;
+
+/*!
+ * This property defines the minimum acceptable left and right margins between the card and and the edge of the view on an iPad.
+ * The default value is 20.0f. If the defined cardWidthForiPad would create margins less than the value of this property
+ * a new card width will be calculated automatically to provide the defined minimumCardMarginForiPad.
+ */
+@property (nonatomic, assign) CGFloat minimumCardMarginForiPad;
+
+/*! Delegate */
+@property (assign, nonatomic) id appboyDelegate;
+
+- (void)closeButtonPressed:(id)sender;
+
+/*!
+ * This property is to indicate what categories of cards the news feed is displaying.
+ * Setting this proerty will automatically update the news feed page and only display cards in the given categories.
+ */
+@property (nonatomic, assign) ABKCardCategory categories;
+
+/*!
+ *  This property allows you to enable or disable the unread indicator on the news feed. The default value is NO, which
+ *  will enable the displaying of the unread indicator on cards.
+ */
+@property (nonatomic, assign) BOOL disableUnreadIndicator;
+
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewControllerModalContext.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewControllerModalContext.h
new file mode 100644
index 000000000..e0677d4df
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewControllerModalContext.h
@@ -0,0 +1,59 @@
+//
+//  ABKFeedViewControllerModalContext.h
+//  AppboySDK
+//
+//  Copyright (c) 2013 Appboy. All rights reserved.
+
+#import 
+#import "ABKFeedViewControllerGenericContext.h"
+/* ------------------------------------------------------------------------------------------------------
+ * ABKFeedViewController
+ */
+
+@protocol ABKFeedViewControllerModalContextDelegate;
+
+/*!
+ * The FeedViewController classes implement the scrolling view of cards you display for users of your app.
+ * To integrate, simply create a FeedViewController -- either programmatically or in a storyboard -- like
+ * you'd create any view controller, and present it.
+ *
+ * There are four different versions of the FeedViewController: Generic, Modal, Popover, and Navigation.
+ * Pick the one which matches the context in which you're using the FeedViewController; for example,
+ * if you present the FeedViewController in a modal view, use FeedViewControllerModalContext. If you
+ * present it in a popover, use FeedViewControllerPopoverContext.
+ */
+
+/* ------------------------------------------------------------------------------------------------------
+ * ABKFeedViewControllerModalContext
+ */
+
+/*!
+ * Use this class to present a feed view controller as a modal view.
+ *
+ * This controller provides a "close" button on the right side of its navigation bar which,
+ * when tapped, sends the ABKFeedViewControllerModalContextCloseTapped:sender message to the closeButtonDelegate.
+ * If the delegate is *not* set, the controller dismisses itself;  if it is set, it's the responsibility of
+ * the delegate to dismiss the controller.  The delegate should adopt the
+ * ABKFeedViewControllerModalContextDelegate protocol.
+ */
+@interface ABKFeedViewControllerModalContext : ABKFeedViewControllerGenericContext
+
+/*! Title displayed in the top bar */
+@property (retain, nonatomic) NSString *navigationBarTitle;
+
+/*! Delegate */
+@property (assign, nonatomic) id closeButtonDelegate;
+
+@end
+
+
+@protocol ABKFeedViewControllerModalContextDelegate 
+
+/*!
+  @param sender The calling context
+
+  Called when the feed modal is closed.
+*/
+- (void) feedViewControllerModalContextCloseTapped:(ABKFeedViewControllerModalContext *)sender;
+
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewControllerNavigationContext.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewControllerNavigationContext.h
new file mode 100644
index 000000000..36c07e464
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewControllerNavigationContext.h
@@ -0,0 +1,34 @@
+//
+//  ABKFeedViewControllerNavigationContext.h
+//  AppboySDK
+//
+//  Copyright (c) 2013 Appboy. All rights reserved.
+
+#import "ABKFeedViewController.h"
+/* ------------------------------------------------------------------------------------------------------
+ * ABKFeedViewController
+ */
+
+/*!
+ * The FeedViewController classes implement the scrolling view of cards you display for users of your app.
+ * To integrate, simply create a FeedViewController -- either programmatically or in a storyboard -- like
+ * you'd create any view controller, and present it.
+ *
+ * There are four different versions of the FeedViewController: Generic, Modal, Popover, and Navigation.
+ * Pick the one which matches the context in which you're using the FeedViewController; for example,
+ * if you present the FeedViewController in a modal view, use FeedViewControllerModalContext. If you
+ * present it in a popover, use FeedViewControllerPopoverContext.
+ */
+
+/* ------------------------------------------------------------------------------------------------------
+ * ABKFeedViewControllerModalContext
+ */
+
+/*!
+ * Use the FeedViewControllerNavigationContext class if you're presenting the feed view controller as a child of
+ * a UINavigationController.
+ */
+
+@interface ABKFeedViewControllerNavigationContext : ABKFeedViewController ;
+
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewControllerPopoverContext.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewControllerPopoverContext.h
new file mode 100644
index 000000000..a1af89aa1
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedViewControllerPopoverContext.h
@@ -0,0 +1,57 @@
+//
+//  ABKFeedViewControllerPopoverContext.h
+//  AppboySDK
+//
+//  Copyright (c) 2013 Appboy. All rights reserved.
+
+#import 
+#import "ABKFeedViewControllerGenericContext.h"
+/* ------------------------------------------------------------------------------------------------------
+ * ABKFeedViewController
+ */
+
+@protocol ABKFeedViewControllerPopoverContextDelegate;
+
+/*!
+ * The FeedViewController classes implement the scrolling view of cards you display for users of your app.
+ * To integrate, simply create a FeedViewController -- either programmatically or in a storyboard -- like
+ * you'd create any view controller, and present it.
+ *
+ * There are four different versions of the FeedViewController: Generic, Modal, Popover, and Navigation.
+ * Pick the one which matches the context in which you're using the FeedViewController; for example,
+ * if you present the FeedViewController in a modal view, use FeedViewControllerModalContext. If you
+ * present it in a popover, use FeedViewControllerPopoverContext.
+ */
+
+/* ------------------------------------------------------------------------------------------------------
+ * ABKFeedViewControllerModalContext
+ */
+
+/*!
+ * Use the FeedViewControllerPopoverContext to present a feed view controller in a popover.
+ *
+ * This controller provides a "close" button on the popover's navigation bar. When the button
+ * is tapped, the controller sends the ABKFeedViewControllerPopoverContextCloseTapped:sender message to
+ * closeButtonDelegate.  You can use this message to trigger closing the popover.
+ * The delegate should adopt the ABKFeedViewControllerPopoverContextDelegate protocol.
+ */
+@interface ABKFeedViewControllerPopoverContext : ABKFeedViewControllerGenericContext
+
+/*! Title displayed in the top bar */
+@property (retain, nonatomic) NSString *navigationBarTitle;
+
+/*! Delegate */
+@property (assign, nonatomic) id closeButtonDelegate;
+
+@end
+
+@protocol ABKFeedViewControllerPopoverContextDelegate 
+
+/*!
+  @param sender The calling context
+
+  Called when the Popover context's close button is tapped
+*/
+- (void) feedViewControllerPopoverContextCloseTapped:(ABKFeedViewControllerPopoverContext *)sender;
+
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedbackViewController.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedbackViewController.h
new file mode 100644
index 000000000..62327897d
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedbackViewController.h
@@ -0,0 +1,19 @@
+//
+//  ABKFeedbackViewController.h
+//  AppboySDK
+//
+//  Copyright (c) 2013 Appboy. All rights reserved.
+
+/*!
+ * This class is used internally; you don't need to include it.
+ */
+
+
+#import 
+#import 
+
+@interface ABKFeedbackViewController : UIViewController
+
+@property (assign, nonatomic) id delegate;
+
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedbackViewControllerModalContext.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedbackViewControllerModalContext.h
new file mode 100644
index 000000000..cd2ff8c20
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedbackViewControllerModalContext.h
@@ -0,0 +1,60 @@
+//
+//  ABKFeedbackViewControllerModalContext.h
+//  AppboySDK
+//
+//  Copyright (c) 2013 Appboy. All rights reserved.
+
+#import "ABKFeedbackViewController.h"
+/* ------------------------------------------------------------------------------------------------------
+ * ABKFeedbackViewController
+ */
+
+@class ABKFeedbackViewControllerModalContext;
+
+@protocol ABKFeedbackViewControllerModalContextDelegate 
+@optional
+/*!
+  @param sender The calling context
+
+  Called when the feedback modal is cancelled.
+*/
+- (void) feedbackViewControllerModalContextCancelTapped:(ABKFeedbackViewControllerModalContext *)sender;
+
+/*!
+  @param sender The calling context
+
+  Called when feedback is sent from the modal.
+*/
+- (void) feedbackViewControllerModalContextFeedbackSent:(ABKFeedbackViewControllerModalContext *)sender;
+
+@end
+
+/*!
+ * The FeedbackViewController classes implement the form you present to your users to collect feedback.
+ * To integrate, simply create a FeedbackViewController -- either programmatically or in a storyboard -- like
+ * you'd create any view controller, and present it.
+ *
+ * There are three different versions of the FeedbackViewController: Modal, Popover, and Navigation.
+ * Pick the one which matches the context in which you're using the FeedbackViewController; for example,
+ * if you present the FeedbackViewController in a modal view, use FeedbackViewControllerModalContext. If you
+ * present it in a popover, use FeedbackViewControllerPopoverContext.
+ */
+
+/* ------------------------------------------------------------------------------------------------------
+ * ABKFeedbackViewControllerModalContext
+ */
+
+/*!
+ * Use the ABKFeedbackViewControllerModalContext class to present a feedback view controller as a modal view.
+ *
+ * This controller has "send" and "cancel" buttons on its navigation bar. If the delegate is set, it sends
+ * feedbackViewControllerModalContextCancelTapped:sender when the cancel button is tapped, or
+ * feedbackViewControllerModalContextFeedbackSent:sender after feedback has been sent successfully.
+ *
+ * If the delegate is *not* set, the controller dismisses itself after cancel or send completes.
+ */
+@interface ABKFeedbackViewControllerModalContext : UINavigationController
+
+@property (assign, nonatomic) id  feedbackDelegate;
+
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedbackViewControllerNavigationContext.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedbackViewControllerNavigationContext.h
new file mode 100644
index 000000000..8467e8e16
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedbackViewControllerNavigationContext.h
@@ -0,0 +1,50 @@
+//
+//  ABKFeedbackViewControllerNavigationContext.h
+//  AppboySDK
+//
+//  Copyright (c) 2013 Appboy. All rights reserved..
+
+#import "ABKFeedbackViewController.h"
+/* ------------------------------------------------------------------------------------------------------
+ * ABKFeedbackViewController
+ */
+
+@class ABKFeedbackViewControllerNavigationContext;
+
+@protocol ABKFeedbackViewControllerNavigationContextDelegate 
+
+/*!
+  @param sender The calling context
+
+  Called when feedback is sent.
+*/
+- (void) feedbackViewControllerNavigationContextFeedbackSent:(ABKFeedbackViewControllerNavigationContext *)sender;
+
+@end
+
+/*!
+ * The FeedbackViewController classes implement the form you present to your users to collect feedback.
+ * To integrate, simply create a FeedbackViewController -- either programmatically or in a storyboard -- like
+ * you'd create any view controller, and present it.
+ *
+ * There are three different versions of the FeedbackViewController: Modal, Popover, and Navigation.
+ * Pick the one which matches the context in which you're using the FeedbackViewController; for example,
+ * if you present the FeedbackViewController in a modal view, use FeedbackViewControllerModalContext. If you
+ * present it in a popover, use FeedbackViewControllerPopoverContext.
+ */
+
+/* ------------------------------------------------------------------------------------------------------
+ * ABKFeedbackViewControllerNavigationContext
+ */
+
+/*!
+ * Use the ABKFeedbackViewControllerNavigationContext to present the feedback view controller as a child of a UINavigationController.
+ *
+ * If a delegate is set, the controller will send feedbackViewControllerNavigationContextFeedbackSent:sender after
+ * feedback has been sent successfully.
+ */
+@interface ABKFeedbackViewControllerNavigationContext : ABKFeedbackViewController
+
+@property (assign, nonatomic) id  delegate;
+
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedbackViewControllerPopoverContext.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedbackViewControllerPopoverContext.h
new file mode 100644
index 000000000..fd04b5bbc
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKFeedbackViewControllerPopoverContext.h
@@ -0,0 +1,61 @@
+//
+//  ABKFeedbackViewControllerPopoverContext.h
+//  AppboySDK
+//
+//  Copyright (c) 2013 Appboy. All rights reserved.
+
+#import "ABKFeedbackViewController.h"
+/* ------------------------------------------------------------------------------------------------------
+ * ABKFeedbackViewController
+ */
+
+@class ABKFeedbackViewControllerPopoverContext;
+
+@protocol ABKFeedbackViewControllerPopoverContextDelegate 
+
+@required
+
+/*!
+  @param sender The calling context
+
+  Called when the popover is cancelled.
+*/
+- (void) feedbackViewControllerPopoverContextCancelTapped:(ABKFeedbackViewControllerPopoverContext *)sender;
+
+/*!
+  @param sender The calling context
+
+  Called when feedback is sent by the popover.
+*/
+- (void) feedbackViewControllerPopoverContextFeedbackSent:(ABKFeedbackViewControllerPopoverContext *)sender;
+
+@end
+
+/*!
+ * The FeedbackViewController classes implement the form you present to your users to collect feedback.
+ * To integrate, simply create a FeedbackViewController -- either programmatically or in a storyboard -- like
+ * you'd create any view controller, and present it.
+ *
+ * There are three different versions of the FeedbackViewController: Modal, Popover, and Navigation.
+ * Pick the one which matches the context in which you're using the FeedbackViewController; for example,
+ * if you present the FeedbackViewController in a modal view, use FeedbackViewControllerModalContext. If you
+ * present it in a popover, use FeedbackViewControllerPopoverContext.
+ */
+
+/* ------------------------------------------------------------------------------------------------------
+ * ABKFeedbackViewControllerPopoverContext
+ */
+
+/*!
+ * Use the FeedbackViewControllerPopoverContext to present a feedback view controller in a popover.
+ *
+ * This controller has "send" and "cancel" buttons on its navigation bar.  When the cancel button is
+ * tapped, the controller sends the feedbackViewControllerPopoverContextCancelTapped:sender to the delegate.
+ * When feedback has been sent successfully, the controller sends feedbackViewControllerPopoverContextFeedbackSent:sender.
+ * Use these messages to trigger dismissing the popover.
+ */
+@interface ABKFeedbackViewControllerPopoverContext : ABKFeedbackViewController
+
+@property (assign, nonatomic) id  delegate;
+
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKIdentifierForAdvertisingProvider.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKIdentifierForAdvertisingProvider.h
new file mode 100644
index 000000000..175709183
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKIdentifierForAdvertisingProvider.h
@@ -0,0 +1,15 @@
+#import 
+
+/*! 
+ * Do not call these methods within your code. They are meant for Appboy internal use only. 
+ */
+
+/*!
+ * ABKIdentifierForAdvertisingProvider.m and ABKIdentifierForAdvertisingProvider.h must be added to your project
+ * regardless of whether or not you enable collection. This occurs automatically if you integrate/update via the CocoaPod.
+ */
+
+@interface ABKIdentifierForAdvertisingProvider : NSObject
++ (NSString *) getIdentifierForAdvertiser;
++ (NSNumber *) getIsAdvertisingTrackingEnabledAsNSNumber;
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKSlideup.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKSlideup.h
new file mode 100644
index 000000000..a72400dba
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKSlideup.h
@@ -0,0 +1,131 @@
+#import 
+
+/*
+ * There are two possible values which control where the slideup will enter the view.
+ *
+ *    ABKSlideupFromBottom - This is the default behavior.
+ *      The slideup 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.
+ *
+ *    ABKSlideupFromTop - The slideup 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, ABKSlideupAnchor) {
+  ABKSlideupFromTop,
+  ABKSlideupFromBottom
+};
+
+/*
+ * The ABKSlideupDismissType defines how the slideup can be dismissed.
+ *
+ *   ABKSlideupDismissAutomatically - This is the default behavior. It will dismiss after the length of time defined by
+ *     the duration property. Slideups of this type can also be dismissed by swiping.
+ *
+ *   ABKSlideupDismissBySwipe - The slideup will stay on the screen indefinitely unless dismissed by swiping.
+ */
+typedef NS_ENUM(NSInteger, ABKSlideupDismissType) {
+  ABKSlideupDismissAutomatically,
+  ABKSlideupDismissBySwipe
+};
+
+/*
+ * The ABKSlideupClickActionType defines the action that will be performed when the Slideup is clicked.
+ *
+ *   ABKSlideupDisplayNewsFeed - This is the default behavior. It will open a modal view of Appboy news feed.
+ *
+ *   ABKSlideupRedirectToURI - The slideup 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 slideup will redirect to the
+ *    protocol uri.
+ *
+ *   ABKSlideupNoneClickAction - The slideup will do nothing but dismiss itself.
+ */
+typedef NS_ENUM(NSInteger, ABKSlideupClickActionType) {
+  ABKSlideupDisplayNewsFeed,
+  ABKSlideupRedirectToURI,
+  ABKSlideupNoneClickAction
+};
+
+@interface ABKSlideup : NSObject
+
+/*
+ * This property defines the message displayed within the slideup.
+ */
+@property (nonatomic, copy) NSString *message;
+
+/*
+ * If hideChevron equals YES, the slideup will not render the chevron on the right side of the slideup.
+ * The chevron is a useful visual cue for the user that more content may be reached by tapping the slideup.
+ */
+@property (nonatomic, assign) BOOL hideChevron;
+
+/*
+ * This property carries extra data in the form of an NSDictionary which can be sent down via the Appboy Dashboard.
+ * You may want to design and implement a custom handler to access this data depending on your use-case.
+ */
+@property (nonatomic, retain) NSDictionary *extras;
+
+/*
+ * slideupAnchor defines the position of the slideup on screen.
+ * The ABKSlideupAnchor enum documentation above offers additional details.
+ */
+@property (nonatomic, assign) ABKSlideupAnchor slideupAnchor;
+
+/*
+ * This property defines the number of seconds before the slideup is automatically dismissed.
+ */
+@property (nonatomic, assign) NSTimeInterval duration;
+
+/*
+ * slideupDismissType defines the dismissal behavior of the slideup.
+ * See the above documentation for ABKSlideupDismissType for additional details.
+ */
+@property (nonatomic, assign) ABKSlideupDismissType slideupDismissType;
+
+/*
+ * This property defines the action that will be performed when the Slideup is clicked.
+ * See the ABKSlideupClickActionType enum documentation above offers additional details.
+ */
+@property (nonatomic, assign, readonly) ABKSlideupClickActionType slideupClickActionType;
+
+/*
+ * When the slideup's slideupClickActionType is ABKSlideupRedirectToURI, clicking on the slideup will redirect to the uri defined
+ * in this property.
+ *
+ * This property can be a HTTP URI or a protocol URI.
+ */
+@property (nonatomic, copy, readonly) NSURL *uri;
+
+/*
+ * If you're handling slideups completely on your own (returning YES from onSlideupReceived), you should still report
+ * impressions and clicks on the slideup back to Appboy with these methods so that your campaign reporting features
+ * still work in the dashboard.
+ *
+ * Note: Each slideup can log at most one impression and at most one click.
+ */
+- (void) logSlideupImpression;
+- (void) logSlideupClicked;
+
+/*
+ * This method will set the slideupClickActionType to ABKSlideupRedirectToURI. The parameter uri must not be nil.
+ * The method will set the uri property as well.
+ */
+- (void) setSlideupClickActionToUri:(NSURL *)uri;
+
+/*
+ * This method will set the slideupClickActionType to ABKSlideupDisplayNewsFeed.
+ * The method will set the uri property to nil.
+ */
+- (void) setSlideupClickActionToNewsFeed;
+
+/*
+ * This method will set the slideupClickActionType to ABKSlideupNoneClickAction.
+ * The method will set the uri property to nil.
+ */
+- (void) setSlideupClickActionToNone;
+
+/*
+ * Serializes the slideup to binary data for use by wrappers such as Appboy's Unity SDK for iOS.
+ */
+- (NSData *) serializeToData;
+
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKSlideupController.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKSlideupController.h
new file mode 100644
index 000000000..a880e1f1b
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKSlideupController.h
@@ -0,0 +1,84 @@
+#import 
+#import "ABKSlideup.h"
+#import "ABKSlideupControllerDelegate.h"
+
+/* Note: This class is not thread safe and all class methods should be called from the main thread.*/
+@interface ABKSlideupController : NSObject
+
+/*!
+ * Setting the delegate allows your app to control how, when, and if slideups are displayed.
+ * Your app can set the delegate to override the default behavior of the ABKSlideupController. See
+ * ABKSlideupControllerDelegate.h for more information.
+ */
+@property (nonatomic, retain) id  delegate;
+
+/*!
+ * supportedOrientationMasks allows you to change which orientation masks the slideup (in-app message) supports.
+ * Slideups (in-app messages) will normally support the orientations specified in the app settings, but the method
+ * supportedInterfaceOrientations may optionally override that. The value of supportedOrientationMasks will be returned
+ * in supportedInterfaceOrientations in the slideup view controller.
+ *
+ * The default value of supportedOrientationMasks is UIInterfaceOrientationMaskAll. This property only works in iOS 6 and later.
+ *
+ */
+@property (nonatomic, assign) UIInterfaceOrientationMask supportedOrientationMasks;
+
+/*!
+ * supportedOrientations allows you to change which orientation the slideup (in-app message) supports.
+ * Slideups (in-app messages) will normally support the orientations specified in the app settings, but method
+ * preferredInterfaceOrientationForPresentation may optionally override that. The value of supportedOrientations will be
+ * returned in preferredInterfaceOrientationForPresentation in slideup view controller.
+ *
+ * The default value of supportedOrientations includes all orientations: UIInterfaceOrientationPortrait,
+ * UIInterfaceOrientationLandscapeRight, UIInterfaceOrientationLandscapeLeft and UIInterfaceOrientationPortraitUpsideDown.
+ * This property only works in iOS 6 and later.
+ */
+@property (nonatomic, assign) UIInterfaceOrientation supportedOrientations;
+
+/*!
+ * @param delegate The slideup delegate that implements the ABKSlideupControllerDelegate methods. If the delegate is
+ * nil, it acts as one which always returns ABKDisplaySlideupNow and doesn't implement all other delegate methods.
+ *
+ * @discussion This method grabs the next slideup from the slideup stack, if there is one, and displays it with
+ * the provided delegate. The delegate must return a ABKSlideupDisplayChoice that defines how the slideup will be
+ * handled. Please refer to the ABKSlideupDisplayChoice enum documentation for more detailed information.
+ *
+ * If there are no slideups available this returns immediately having taken no action.
+ */
+- (void) displayNextSlideupWithDelegate:(id)delegate;
+
+/*!
+ * @return The number of slideups that are locally waiting to be displayed.
+ *
+ * @discussion Use this method to check how many slideups are waiting to be displayed and call
+ * displayNextSlideupWithDelegate: at to display it. If a slideup is currently being displayed, it will not be included
+ * in the count.
+ *
+ * Note: Returning ABKDisplaySlideupLater in the beforeSlideupDisplayed: delegate method will put the slideup back onto
+ * the stack and this will be reflected in slideupsRemainingOnStack.
+ */
+- (NSInteger) slideupsRemainingOnStack;
+
+/*!
+ * @param newSlideup A new slideup that will be added into the top of the stack of slideups that haven't been displayed yet.
+ *
+ * @discussion This method allows you to display a custom slideup. It adds the slideup object to the top of the slideup stack
+ * and tries to display immediately.
+ *
+ * Note: Clicks and impressions of slideups added by this method will not be collected by Appboy and will not be
+ * reflected on the dashboard.
+ */
+- (void) addSlideup:(ABKSlideup *)newSlideup;
+
+/*!
+ * @param animated If YES, the slideup will slide off the screen. If NO, the slideup will disappear immediately without
+ * an animation.
+ *
+ * @discussion If there is a slideup currently being displayed, calling this method will hide it. The animated parameter
+ * controls whether or not the slideup will be animated away. This method does nothing if no slideup is currently being
+ * displayed.
+ *
+ * Note: This will not fire the onSlideupDismissed: delegate method.
+ */
+- (void) hideCurrentSlideup:(BOOL)animated;
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKSlideupControllerDelegate.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKSlideupControllerDelegate.h
new file mode 100644
index 000000000..8c1dd7e84
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKSlideupControllerDelegate.h
@@ -0,0 +1,107 @@
+#import 
+#import "ABKSlideup.h"
+#import "ABKSlideupViewController.h"
+
+/*!
+ * Possible values for slideup handling after a slideup is offered to an ABKSlideupControllerDelegate
+ *   ABKDisplaySlideupNow - The slideup will be displayed immediately.
+ *   ABKDisplaySlideupLater - The slideup will be not be displayed and will be placed back onto the top of the stack.
+ *   ABKDiscardSlideup - The slideup will be discarded and will not be displayed.
+ *
+ * The following conditions can cause a slideup to be offered to the delegate defined by the delegate property on
+ * [Appboy sharedInstance].slideupController:
+ * - A slideup is received from the Appboy server.
+ * - A slideup is waiting to display when an UIApplicationDidBecomeActiveNotification event occurs.
+ * - A slideup is added by ABKSlideupController method addSlideup:.
+ *
+ * You can choose to manually display any slideups that are waiting locally to be displayed by calling:
+ * [[Appboy sharedInstance].slideupController displayNextSlideupWithDelegate:].
+ */
+typedef NS_ENUM(NSInteger, ABKSlideupDisplayChoice) {
+  ABKDisplaySlideupNow,
+  ABKDisplaySlideupLater,
+  ABKDiscardSlideup
+};
+
+/*!
+ * The slideup delegate allows you to control the display and behavior of the Appboy slideup. For more detailed
+ * information on slideup behavior, including when and how the delegate is used, see the documentation for the
+ * ABKSlideupDisplayChoice enum above for more detailed information.
+ */
+@protocol ABKSlideupControllerDelegate 
+@optional
+
+/*!
+ * @param slideup The slideup object being offered to the delegate method.
+ *
+ * This delegate gets called when a new slideup is received from the Appboy server and controls whether or not you're
+ * going to use custom handling for the slideup.
+ *
+ * If the delegate method returns YES, Appboy will not take any more actions on the provided slideup and it becomes the
+ * responsibility of the host app to deliver the slideup to the user and report any impressions or slideup clicks.
+ * See ABKSlideup.h for more information.
+ *
+ * Conversely, if the delegate method returns NO, Appboy will handle the slideup normally: the slideup will be put on
+ * top of the slideup stack and be offered to the beforeSlideupDisplayed: delegate method if no other slideup is
+ * currently on the screen.
+ */
+- (BOOL) onSlideupReceived:(ABKSlideup *)slideup;
+
+/*!
+ * @param slideup The slideup object being offered to the delegate method.
+ * @param keyboardIsUp This boolean indicates whether or not the keyboard is currently being displayed when this
+ * delegate fires.
+ * @return ABKSlideupDisplayChoice for details refer to the documentation regarding the ENUM ABKSlideupDisplayChoice
+ * above.
+ *
+ * This delegate method defines whether the slideup will be displayed now, displayed later, or discarded.
+ *
+ * The default behavior is that the slideup will be displayed unless the keyboard is currently active on the screen.
+ * However, if there are other situations where you would not want the slideup to appear (such as during a full screen
+ * game or on a loading screen), you can use this delegate to delay or discard pending slideup messages.
+ */
+- (ABKSlideupDisplayChoice) beforeSlideupDisplayed:(ABKSlideup *)slideup withKeyboardIsUp:(BOOL)keyboardIsUp;
+
+/*!
+ * @param slideup The slideup object being offered to the delegate.
+ *
+ * This delegate method allows host applications to customize the look of a slideup while maintaining the same user
+ * experience and impression/click tracking as the default Appboy slideup. It allows developers to pass incoming slideups
+ * to custom view controllers which they have created.
+ *
+ * The custom view controller is responsible for handling any responsive UI layout use-cases. e.g. device orientations,
+ * or varied message lengths.
+ *
+ * By default, Appboy will stretch/shrink the slideup view's width to fix the screen's width, and slide it up onto the
+ * screen. If you wish to have margins between the slideup and the edge of the screen, those must be incorporated into
+ * the custom view controller itself.
+ *
+ * Even with a custom view, by inheriting from ABKSlideupViewController, the slideup will automatically animate and
+ * dismiss according to the parameters of the provided ABKSlideup object. See ABKSlideup.h for more information.
+ *
+ * NOTE: The returned view controller should be a ABKSlideupViewController or preferably, a subclass of
+ * ABKSlideupViewController. The view of the returned view controller should be an instance of ABKSlideupView or its
+ * subclass.
+ */
+- (ABKSlideupViewController *) slideupViewControllerWithSlideup:(ABKSlideup *)slideup;
+
+/*!
+ * @param slideup The slideup object being offered to the delegate.
+ *
+ * This delegate method is fired whenever the user manually dismisses the slideup (via a swipe), or if the slideup
+ * times out and expires. Use this method to perform any custom logic that should execute after the slideup has been
+ * dismissed.
+ */
+- (void) onSlideupDismissed:(ABKSlideup *)slideup;
+
+/*!
+ * @param slideup The slideup object being offered to the delegate.
+ * @return Boolean Value which controls whether or not Appboy will execute the click action. Returning YES will prevent
+ *         Appboy from performing the click action. Returning NO will cause Appboy to execute the action defined in the
+ *         slideup's slideupClickActionType property after this delegate method is called.
+ *
+ * This delegate method is fired whenever the user clicks on the slideup. See ABKSlideup.h for more information.
+ */
+- (BOOL) onSlideupClicked:(ABKSlideup *)slideup;
+
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKSlideupView.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKSlideupView.h
new file mode 100644
index 000000000..e7272cde5
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKSlideupView.h
@@ -0,0 +1,4 @@
+#import 
+
+@interface ABKSlideupView : UIView
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKSlideupViewController.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKSlideupViewController.h
new file mode 100644
index 000000000..dbcf88fd9
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKSlideupViewController.h
@@ -0,0 +1,39 @@
+
+/*
+ * ABKSlideupViewController is the class for the slideup view controller.
+ *  * In order to create a custom view controller you must:
+ *  *  * Create a subclass of ABKSlideupViewController
+ *  *  * The view of the subclass instance must be an instance of ABKSlideupView or optionally a subclass thereof.
+ *
+ *  * The custom slideup view controller must handle and account for:
+ *  *  * Slideup messages of varying lengths.
+ *  *  * Different possible layouts and orientations for possible devices
+ *  *  *  * e.g. iPhone [Portrait & Landscape] as well as iPad [Portrait & Landscape].
+ *
+ *  * Note: Adding buttons which do anything other than dismiss the slideup within a custom slideup view controller will
+ *  * disable Appboy's ability to capture analytics regarding clicks on the slideup.
+ *
+ */
+
+#import 
+
+@class ABKSlideup;
+
+@interface ABKSlideupViewController : UIViewController
+@property (nonatomic, retain) ABKSlideup *slideup;
+
+/*
+ * The initWithSlideup method may be used to pass the slideup property to any custom view controller that you create.
+ */
+- (id) initWithSlideup:(ABKSlideup *)slideup;
+
+/*!
+ * @param animated If YES, the slideup will slide off the screen. If NO, the slideup will disappear immediately without an animation.
+ *
+ * @discussion The void method hideSlideup may be called in order to dismiss the slideup. Animation of the dismissal is controlled with the animated parameter.  
+ */
+- (void) hideSlideup:(BOOL)animated;
+
+@end
+
+
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKTextAnnouncementCard.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKTextAnnouncementCard.h
new file mode 100644
index 000000000..9b7cd03e1
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKTextAnnouncementCard.h
@@ -0,0 +1,25 @@
+#import "ABKCard.h"
+
+@interface ABKTextAnnouncementCard : ABKCard 
+
+/*
+ * The title text for the card.
+ */
+@property (nonatomic, copy) NSString *title;
+/*
+ * The description text for the card.
+ */
+@property (nonatomic, copy) NSString *cardDescription;
+
+//Optional:
+/*
+ * The URL that will be opened after the card is clicked on. It can be a http(s) URL or a protocol URL.
+ */
+@property (nonatomic, copy) NSString *url;
+/*
+ * 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 (nonatomic, copy) NSString *domain;
+
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKUser.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKUser.h
new file mode 100644
index 000000000..7be569d52
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/ABKUser.h
@@ -0,0 +1,299 @@
+//
+//  ABKUser.h
+//  AppboySDK
+//
+//  Copyright (c) 2013 Appboy. All rights reserved.
+
+#import 
+
+/*!
+ * When setting the custom attributes with custom keys:
+ *
+ * 1. Attempting to set a custom attribute with the same key as one of our reserved keys is prohibited. To set values
+ *    for reserved keys, please find and set the corresponding property in this class. The reserved key list is::
+ *      email
+ *      facebook
+ *      twitter
+ *      first_name
+ *      last_name
+ *      dob
+ *      external_id
+ *      country
+ *      home_city
+ *      bio
+ *      gender
+ *      phone
+ *      email_subscribe
+ *      foursquare_access_token
+ *      image_url
+ *      push_subscribe
+ *
+ * 2. The maximum key length is 255 characters; longer keys are truncated.
+ *
+ * 3. The maximum length for a string value in a custom attribute is 255 characters; longer values are truncated.
+ */
+
+@interface ABKUser : NSObject
+
+/*!
+ * The User's first name (String)
+ */
+@property (nonatomic, copy) NSString *firstName;
+
+/*!
+ * The User's last name (String)
+ */
+@property (nonatomic, copy) NSString *lastName;
+
+/*!
+ * The User's email (String)
+ */
+@property (nonatomic, copy) NSString *email;
+
+/*!
+ * The User's date of birth (NSDate)
+ */
+@property (nonatomic, copy) NSDate *dateOfBirth;
+
+/*!
+ * The User's country (String)
+ */
+@property (nonatomic, copy) NSString *country;
+
+/*!
+ * The User's home city (String)
+ */
+@property (nonatomic, copy) NSString *homeCity;
+
+/*!
+ * The User's bio (String)
+ */
+@property (nonatomic, copy) NSString *bio;
+
+/*!
+ * The User's phone number (String)
+ */
+@property (nonatomic, copy) NSString *phone;
+
+/*!
+ * The User's foursquare access token (String)
+ */
+@property (nonatomic, copy) NSString *foursquareAccessToken;
+
+@property (nonatomic, copy, 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) NSString *avatarImageURL;
+
+/*!
+ * The Twitter account identifier for this user. If set, Appboy will only attempt to obtain Twitter data from the
+ * Accounts framework if the account with the specified identifier is available. See the
+ * ABKSocialAccountAcquisitionPolicy documentation in Appboy.h for more information.
+ */
+@property (nonatomic, copy) NSString *twitterAccountIdentifier;
+
+/*!
+ * This property is for when a user's twitter account with the given identifier isn't available, should Appboy also
+ * delete the saved twitter account in the server of that user.
+ *
+ * The default value of this property is NO. If the property is set to YES, when the twitter account data with the given
+ * twitter identifier(defined in the ABKUser's twitterAccountIdentifier property) isn't available, Appboy will also delete
+ * Appboy will delete the saved twitter account data of that user in Appboy's database.
+ *
+ * This property is only used when in appboyOptions, ABKSocialAccountAcquisitionPolicyOptionKey is set to be
+ * ABKAutomaticSocialAccountAcquisitionWithIdentifierOnly, and twitterAccountIdentifier property has a valid value.
+ */
+@property (nonatomic, assign) BOOL clearTwitterDataWhenNoDataOfTwitterIdentifier;
+
+/* ------------------------------------------------------------------------------------------------------
+ * Enums
+ */
+
+/*!
+ * Values representing the gender recognized by the SDK.
+ */
+typedef NS_ENUM(NSInteger , ABKUserGenderType) {
+  ABKUserGenderMale,
+  ABKUserGenderFemale
+};
+
+/*!
+* 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
+};
+
+/*!
+ * @param gender ABKUserGender enum representing the user's gender.
+ * @return YES if the user gender is set properly
+ */
+- (BOOL) setGender:(ABKUserGenderType)gender;
+
+
+/*!
+ * Deprecated: Use setEmailNotificationSubscriptionType instead.
+ *
+ * @param subscribed Whether or not this user should be subscribed to emails
+ * @return YES if isSubscribedToEmail is set the same as parameter subscribed
+ */
+- (BOOL) setIsSubscribedToEmails:(BOOL)subscribed __deprecated;
+
+/*!
+ * 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 Appboy 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;
+
+/*!
+ * @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 Appboy 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:(NSArray *)valueArray;
+
+/*!
+* Sets the last known location for the user. Intended for use with ABKDisableLocationAutomaticTrackingOptionKey set to YES
+* when starting Appboy, 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 Appboy, 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;
+
+@end
diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/Appboy.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/Appboy.h
new file mode 100644
index 000000000..4d24acaec
--- /dev/null
+++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/Appboy.h
@@ -0,0 +1,509 @@
+//
+//  Appboy.h
+//  AppboySDK
+//
+//  Copyright (c) 2013 Appboy. All rights reserved.
+
+/*!
+  \mainpage
+  This site contains technical documentation for the %Appboy iOS SDK. Click on the "Classes" link above to
+  view the %Appboy public interface classes and start integrating the SDK into your app!
+*/
+
+#import 
+#import 
+
+#ifndef APPBOY_SDK_VERSION
+#define APPBOY_SDK_VERSION @"2.9.6"
+#endif
+
+@class ABKSlideupController;
+@class ABKFeedController;
+@class ABKUser;
+@class ABKSlideup;
+@class ABKSlideupViewController;
+@protocol ABKSlideupControllerDelegate;
+@protocol ABKAppboyEndpointDelegate;
+
+@interface Appboy : NSObject
+
+/* ------------------------------------------------------------------------------------------------------
+ * Initialization
+ */
+
+/*!
+ * Get the Appboy singleton.
+ */
++ (Appboy *) sharedInstance;
+
+/*!
+ * @param apiKey The app's API key
+ * @param inApplication The current app
+ * @param withLaunchOptions The options NSDictionary that you get from application:didFinishLaunchingWithOptions
+ *
+ * @discussion Starts up Appboy 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 Appboy view controllers. Your apiKey comes from
+ * the appboy.com dashboard where you registered your app.
+ */
++ (void) startWithApiKey:(NSString *)apiKey
+           inApplication:(UIApplication *)application
+       withLaunchOptions:(NSDictionary *)launchOptions;
+
+/*!
+ * @param apiKey The app's API key
+ * @param inApplication The current app
+ * @param withLaunchOptions The options NSDictionary that you get from application:didFinishLaunchingWithOptions
+ * @param appboyOptions An optional NSDictionary with startup configuration values for Appboy. This currently supports
+ * ABKRequestProcessingPolicyOptionKey, ABKSocialAccountAcquisitionPolicyOptionKey and ABKFlushIntervalOptionKey. See below
+ * for more information.
+ *
+ * @discussion Starts up Appboy 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 Appboy view controllers. Your apiKey comes from
+ * the appboy.com dashboard where you registered your app.
+ */
++ (void) startWithApiKey:(NSString *)apiKey
+           inApplication:(UIApplication *)application
+       withLaunchOptions:(NSDictionary *)launchOptions
+       withAppboyOptions:(NSDictionary *)appboyOptions;
+
+/* ------------------------------------------------------------------------------------------------------
+ * Keys for Appboy startup options
+ */
+
+/*!
+* If you want to set the request policy at app startup time (useful for avoiding any automatic data requests made by
+* Appboy 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;
+
+/*!
+* If you want to set the social account acquisition policy at app startup time (useful for avoiding automatic
+* social account data requests made by Appboy at startup). You can include one of the ABKSocialAccountAcquisitionPolicy
+* enum values as the value for the ABKSocialAccountAcquisitionPolicyOptionKey in the appboyOptions dictionary.
+*/
+extern NSString *const ABKSocialAccountAcquisitionPolicyOptionKey;
+
+/*!
+ * 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 Appboy will automatically collect location (if the user permits).
+ * If set to YES,location will not be recorded for the user unless integrating apps manually call setUserLastKnownLocation on
+ * ABKUser (i.e. you must manually set the location, Appboy will not).  If it is set to NO or omitted, Appboy will collect
+ * location if authorized.
+ */
+extern NSString *const ABKDisableAutomaticLocationCollectionKey;
+
+/*!
+ * This key can be set to a class that extends ABKAppboyEndpointDelegate which can be used to modifying or substitute the API and Resource
+ * (e.g. image) URIs used by the Appboy SDK.
+ */
+extern NSString *const ABKAppboyEndpointDelegateKey;
+
+/* ------------------------------------------------------------------------------------------------------
+ * 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, requesting new slideups and posting feedback. Appboy's
+*        communication policy is to perform immediate server requests when user facing data is required (new slideups,
+*        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 - 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 flushDataAndProcessRequestQueue when you want to synchronize newly updated user data with Appboy.
+*   ABKManualRequestProcessing - Appboy will automatically add appropriate network requests (feed updates, user
+*        attribute flushes, feedback posts, etc.) to its network queue, but doesn't process
+*        network requests except when feedback requests are made via a FeedbackViewController, or a feed request is made
+*        via a FeedViewController. The latter typically occurs when a ABKFeedViewController is loaded and displayed on
+*        the screen, for example, in response to a user click.
+*        You can direct Appboy to perform an immediate data flush as well as process any other
+*        requests on its queue by calling 
[[Appboy sharedInstance] flushDataAndProcessRequestQueue];
+* This mode is only recommended for advanced use cases. If you're merely trying to +* control the background flush behavior, consider using ABKAutomaticRequestProcessing +* with a custom flush interval or ABKAutomaticRequestProcessingExceptForDataFlush. +* +* Regardless of policy, Appboy will intelligently combine requests on the queue to minimize the total number of +* requests and their combined payload. +*/ +typedef NS_ENUM(NSInteger, ABKRequestProcessingPolicy) { + ABKAutomaticRequestProcessing, + ABKAutomaticRequestProcessingExceptForDataFlush, + ABKManualRequestProcessing +}; + +/*! +* Possible values for the SDK's social account acquisition policies: +* ABKAutomaticSocialAccountAcquisition (default) - At app startup and after you've set a social account identifier +* on the user object, Appboy will automatically attempt to fetch Twitter and Facebook social account data +* for the user and flush it to the server. In all cases, Appboy's automatic data acquisition will ensure that the +* user is not prompted or that the UI of your application is otherwise affected. For this reason, when Appboy +* tries to perform the data acquisition, your app must have already been granted the relevant permissions to +* obtain social account data. If you've specified the twitterAccountIdentifier, Appboy will only attempt to grab +* data for that twitter account. If you haven't specified it, Appboy will grab data for the first Twitter account +* returned by the system. An upcoming release will enable identifier targeting for Facebook as well. +* +* Note: If you have not integrated the Facebook SDK into your app, there is no way to grab Facebook data without +* prompting the user, so you must call
[[Appboy sharedInstance] promptUserForAccessToSocialNetwork:ABKSocialNetworkFacebook];
+* and allow the user to be prompted. If you have integrated the Facebook SDK, you must ensure that the user has +* allowed read permissions. If permission is granted, Appboy will collect the user's basic public profile info +* "user_about_me" "email" "user_hometown" "user_birthday" and, if permission is granted, "user_likes". +* ABKAutomaticSocialAccountAcquisitionWithIdentifierOnly - Appboy will only attempt to obtain social account information when +* an identifier is set on the user for the corresponding social network. Note: This currently only works for +* Twitter accounts. An upcoming release will enable identifier targeting for Facebook as well. +* ABKManualSocialAccountAcquisition - Appboy will NOT try to acquire social account data. You must call +*
[[Appboy sharedInstance] promptUserForAccessToSocialNetwork:(ABKSocialNetwork)];
+*/ +typedef NS_ENUM(NSInteger, ABKSocialAccountAcquisitionPolicy) { + ABKAutomaticSocialAccountAcquisition, + ABKAutomaticSocialAccountAcquisitionWithIdentifierOnly, + ABKManualSocialAccountAcquisition +}; + +/*! +* Values representing the Social Networks recognized by the SDK. +*/ +typedef NS_OPTIONS(NSUInteger, ABKSocialNetwork) { + ABKSocialNetworkFacebook = 1 << 0, + ABKSocialNetworkTwitter = 1 << 1 +}; + +/* ------------------------------------------------------------------------------------------------------ + * Properties + */ + +@property (nonatomic, retain, readonly) ABKFeedController *feedController; + +/*! + * The current slideup manager. + * See ABKSlideupController.h. + */ +@property (nonatomic, retain, readonly) ABKSlideupController *slideupController; + +/*! + * The current app user. + * See ABKUser.h and changeUser:userId below. + */ +@property (nonatomic, retain, readonly) ABKUser *user; + +/*! + * Appboy UI elements can be themed using the NUI framework. See https://github.com/tombenner/nui and the Appboy docs. + * To enable NUI, take the following steps: + * + * - If your app uses ARC: Get NUI from https://github.com/tombenner/nui + * + * - If your app does not use ARC: Get NUI from https://github.com/Appboy/nui which is our fork of NUI that manages its + * own memory + * + * - Follow the instructions in either repo above to integrate NUI + * + * - Create a style sheet called NUIStyle.nss + * + * - Set the property below to YES + * + * If useNUITheming is NO, NUI is ignored completely whether or not it's integrated into your app. Note that + * you can theme your app and Appboy differently -- Appboy uses NUI independently of your app's use of NUI. + */ +@property (nonatomic, assign) BOOL useNUITheming; + +/*! + * The total number of currently active cards displayed in any feed view. Cards are + * counted only once even if they appear in multiple feed views. + * @deprecated This property is now deprecated and will be removed in the future. Please use + * [[Appboy sharedInstance].feedController cardCountForCategories:ABKCardCategoryAll] instead. + */ +@property (readonly, nonatomic, assign) NSInteger cardCount __deprecated; + +/*! + * unreadCardCount is the number of currently active cards which have not been viewed. + * 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. + * + * @deprecated This property is now deprecated and will be removed in the future. Please use + * [[Appboy sharedInstance].feedController unreadCardCountForCategories:ABKCardCategoryAll] instead. + */ +@property (readonly, nonatomic, assign) NSInteger unreadCardCount __deprecated; + +/*! +* 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
[[Appboy sharedInstance] shutdownServerCommunication]
. +* +* 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
[[Appboy sharedInstance] flushDataAndProcessRequestQueue]
. +*/ +@property (nonatomic, assign) ABKRequestProcessingPolicy requestProcessingPolicy; + + +/*! + * An class extending ABKAppboyEndpointDelegate can be set to route Appboy API and Resource traffic in a custom way. + * For example, one might proxy Appboy image downloads by having the getResourceEndpoint method return a proxy URI. + */ +@property (nonatomic, retain) id appboyEndpointDelegate; + +/* ------------------------------------------------------------------------------------------------------ + * 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 need to call this after each network related activity in your app. + * This includes: + * * Retrieving an updated feed and slideup after a new session is opened or the user is changed. Appboy will + * automatically add the request for new data to the network queue, you just need to give it permission to execute + * that request. + * * Flushing updated user data (custom events, custom attributes, as well as automatically collected data). + * * Flushing automatic analytics events such as starting and ending sessions. + * + * If you're using ABKAutomaticRequestProcessingExceptForDataFlush, you only need to call this when you want to force + * an immediate flush of updated user data. + */ +- (void) flushDataAndProcessRequestQueue; + +/*! + * 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 options The NSDictionary you get from application:didFinishLaunchingWithOptions or + * application:didReceiveRemoteNotification in your App Delegate. + * + * @discussion + * Test a push notification to see if it came Appboy's servers. + */ +- (BOOL) pushNotificationWasSentFromAppboy:(NSDictionary *)options; + +/*! + * @param token The device's push token. + * + * @discussion This method posts a token to Appboy's servers to associate the token with the current device. + */ +- (void) registerPushToken:(NSString *)token; + +/*! + * @param application The app's UIApplication object + * @param notification An NSDictionary passed in from the didReceiveRemoteNotification call + * + * @discussion This method forwards remote notifications to Appboy. Call it from the application:didReceiveRemoteNotification + * method of your App Delegate. + */ +- (void) registerApplication:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification; + +/*! + * @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 Appboy. When it's called in the background, Appboy will request + * a refresh of the news feed and call the completionHandler when the request is finished; If it's called while the app + * is in the foreground, Appboy won't fetch the news feed, and won't call the completionHandler. + * Call it from the application:didReceiveRemoteNotification:fetchCompletionHandler: method of your App Delegate. + */ +- (void) registerApplication:(UIApplication *)application +didReceiveRemoteNotification:(NSDictionary *)notification + fetchCompletionHandler:(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 Appboy. Call it from + * the application:handleActionWithIdentifier:forRemoteNotification: method of your App Delegate. + */ +- (void) getActionWithIdentifier:(NSString *)identifier + forRemoteNotification:(NSDictionary *)userInfo + completionHandler:(void (^)(UIBackgroundFetchResult))completionHandler; + +/*! +* @param userID The new user's ID (from the host application). +* +* @discussion +* This method changes the user's ID. +* +* When you first start using Appboy 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. +* Appboy will also automatically make a data refresh request to get the news feed, slideup 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 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. + * + *
+ * [[Appboy sharedInstance] logCustomEvent:@"clicked_button"];
+ * 
+ */ +- (void) logCustomEvent:(NSString *)eventName; + +/*! + * This method is equivalent to calling logPurchase:inCurrency:atPrice:withQuantity: with a quantity of 1. + * Please see logPurchase:inCurrency:atPrice:withQuantity: for more information. + * + */ +- (void) logPurchase:(NSString *)productIdentifier inCurrency:(NSString *)currencyCode atPrice:(NSDecimalNumber *)price; + +/*! + * @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: + *
[locale objectForKey:NSLocaleCurrencyCode]
+ * Supported currency symbols include: USD, CAD, EUR, GBP, JPY, AUD, CHF, NOK, MXN, NZD, CNY, RUB, TRY, INR, IDR, ILS, + * SAR, ZAR, AED, SEK, HKD, SPD, DKK, and TWD. 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. + * + * @discussion Logs a purchase made in the application. + * + * Note: Appboy 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; + +/*! +* @param socialNetwork An ABKSocialNetwork indicating the network that you wish to access. +* +* @discussion Records that the current user shared something to social network. This is added to the event tracking log +* that's lazily pushed up to the server. +*/ +- (void) logSocialShare:(ABKSocialNetwork)socialNetwork; + +/*! +* @param socialNetworks An ABKSocialNetwork indicating the network that you wish to access. +* +* @discussion Use this method to prompt the user for permission to use social network data (you don't need to use it +* if permission has has been given at another point in your app -- Appboy is already collecting data). +* +* After permission is given, Appboy starts collecting any social network data available on the device (e.g. name, e-mail, etc.) +* and reporting it to the server. +* +* We generally advise that you don't call this method on startup, as it will immediately prompt your users for +* Twitter access. +* +* Notes: +* For ABKSocialNetworkTwitter: +* This only works for iOS5 and higher. In older versions, this method is a no-op. +* +* For ABKSocialNetworkFacebook: +* This requires your Facebook App ID, which you enter in your app's plist under the key "FacebookAppID". +* Also, you must have configured a Facebook app with your bundle ID. For more help, see "Create a Facebook App" at +* https://developers.facebook.com/docs/getting-started/facebook-sdk-for-ios/ +* Calls to this method without a defined FacebookAppID will NSLog an error and do nothing. +* +* It is highly recommended that you also install the Facebook iOS SDK in your app. If you include the Facebook SDK +* in your app, this method will work for all iOS versions and provide a high-quality integration experience for the +* end user. If you do not include the Facebook SDK, this method call will only work on iOS6 or higher. +*/ +- (void) promptUserForAccessToSocialNetwork:(ABKSocialNetwork)socialNetwork; + +/*! + * @param replyToEmail The email address to send feedback replies to. + * @param message The message input by the user. Must be non-null and non-empty. + * @param isReportingABug Flag indicating whether or not the feedback describes a bug, or is merely a suggestion/question. + * @return a boolean indicating whether or not the feedback item was successfully queued for delivery. + * + * @discussion Submits a piece of feedback to the Appboy feedback center so that it can be handled in the Appboy dashboard. + * The request to submit feedback is made immediately, however, this method does not block and will return as soon as the + * feedback request is placed on the network queue. + * + */ +- (BOOL) submitFeedback:(NSString *)replyToEmail message:(NSString *)message isReportingABug:(BOOL)isReportingABug; + +/*! + * If you're displaying cards on your own instead of using ABKFeedViewController, you should still report impressions of + * the news feed back to Appboy with this method so that your campaign reporting features still work in the dashboard. + */ +- (void) logFeedDisplayed; + +/*! + * If you're displaying feedback page on your own instead of using ABKFeedbackViewController, you should still report + * impressions of the feedback page back to Appboy with this method so that your campaign reporting features still work + * in the dashboard. + */ +- (void) logFeedbackDisplayed; + +/*! + * 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 Appboy 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 slideup request for the current user. Note that if the queue already contains another request for the + * current user, that the slideup request will be merged into the already existing request and only one will execute + * for that user. + */ +- (void) requestSlideupRefresh; +@end diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/AppboyKit.h b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/AppboyKit.h new file mode 100644 index 000000000..2a473e4bb --- /dev/null +++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/AppboyKit.h @@ -0,0 +1,25 @@ +#import "Appboy.h" +#import "ABKUser.h" +#import "ABKFeedbackViewController.h" +#import "ABKFeedbackViewControllerPopoverContext.h" +#import "ABKFeedbackViewControllerModalContext.h" +#import "ABKFeedbackViewControllerNavigationContext.h" +#import "ABKFeedViewController.h" +#import "ABKFeedViewControllerGenericContext.h" +#import "ABKFeedViewControllerModalContext.h" +#import "ABKFeedViewControllerNavigationContext.h" +#import "ABKFeedViewControllerPopoverContext.h" +#import "ABKSlideup.h" +#import "ABKSlideupView.h" +#import "ABKSlideupViewController.h" +#import "ABKSlideupControllerDelegate.h" +#import "ABKIdentifierForAdvertisingProvider.h" +#import "ABKSlideupController.h" +#import "ABKFeedController.h" +#import "ABKCard.h" +#import "ABKBannerCard.h" +#import "ABKCaptionedImageCard.h" +#import "ABKCrossPromotionCard.h" +#import "ABKClassicCard.h" +#import "ABKTextAnnouncementCard.h" +#import "ABKAppboyEndpointDelegate.h" diff --git a/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/NUI_LICENSE.txt b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/NUI_LICENSE.txt new file mode 100755 index 000000000..918015937 --- /dev/null +++ b/AppboyKitWithoutFacebookSupport/headers/AppboyKitLibrary/NUI_LICENSE.txt @@ -0,0 +1,22 @@ +-Portions of Appboy contain "NUI," a user interface customization framework +-subject to the license below. +----------------------------------------------------------------------------- +-NUI -- Copyright (C) 2012 by Tom Benner + +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. \ No newline at end of file diff --git a/AppboyKitWithoutFacebookSupport/libAppboyKitLibrary.a b/AppboyKitWithoutFacebookSupport/libAppboyKitLibrary.a new file mode 100644 index 000000000..c26f54231 Binary files /dev/null and b/AppboyKitWithoutFacebookSupport/libAppboyKitLibrary.a differ diff --git a/CHANGELOG.md b/CHANGELOG.md index f89e1fe33..11185d2e0 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,22 +1,10 @@ -## 2.11.1 -- Fixes a UI issue in modal in-app messages displayed on iPads running iOS 6/7. - -## 2.11 -- Adds support for modal and full screen style in-app messages. Also adds support for including fontawesome icons and images with in-app messages, changing colors on in-app message UI elements, expanded customization options, and message resizing for tablets. Please visit our documentation for more information. -- Updates the completionHandler signature in getActionWithIdentifier:forRemoteNotification:completionHandler: to match the comletionHandler passed by the system in method `- (void) application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler`. - -## 2.10.1 -- Corrected a bug which would cause the host app to crash when a deep link was launched from a push notification. In versions 2.10.0 and 2.9.4, if the host app used `[[Appboy sharedInstance] registerApplication: didReceiveRemoteNotification:];` instead of `[[Appboy sharedInstance] registerApplication: didReceiveRemoteNotification: fetchCompletionHandler:];`, opening a push with a deep link would crash the host app in some circumstances. - -## 2.10.0 -- Updated the minimum deployment targets of Appboy iOS SDK to iOS 6.0. For apps supporting lower iOS versions, please continue to use 2.9.+ versions of the Appboy SDK. -- Stop collecting user's Facebook data automatically. You can pass a user's Facebook information to Appboy by initialzing a ABKFacebookUser object with the facebook data, and set it to [Appboy sharedInstance].user.facebookUser. For more information, please refer to ABKUser.h and ABKFacebookUser.h. -- Removed the feature of prompting a user to connect his/her Facebook account. You can refer to the method `promptUserToConnectFacebookAccountOnDeviceAndFetchAccountData` in [SocialNetworkViewController.m](https://github.com/Appboy/appboy-ios-sdk/blob/master/Example/Stopwatch/SocialNetworkViewController.m) to continue prompting the user to connect the Facebook account. -- Removed Facebook SDK dependent builds. Now there is a single library - AppboyKit - and a single Pod without functional subspecs - Appboy-iOS-SDK (note we now have both the subspecs pointing at the same library). Please update your Podfile to `pod 'Appboy-iOS-SDK` if you are integrating Appboy with Cocoapods. +## 2.9.6 +- Added the fix for an edge case when there are extra UIWindows at the time in-app message is going to display, the in-app message would have issue during dismissing. ## 2.9.5 - Corrected a bug which would cause the host app to crash when a deep link was launched from a push notification. In versions 2.9.4, if the host app used `[[Appboy sharedInstance] registerApplication: didReceiveRemoteNotification:];` instead of `[[Appboy sharedInstance] registerApplication: didReceiveRemoteNotification: fetchCompletionHandler:];`, opening a push with a deep link would crash the host app in some circumstances. + ## 2.9.4 - Added a major performance upgrade that reduces CPU usage, memory footprint, and network traffic. - Added 26 additional languages to localization support for Appboy UI elements. diff --git a/Example/Podfile b/Example/Podfile index 88999f2ba..76e265cd5 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -1,7 +1,6 @@ -source 'https://github.com/CocoaPods/Specs.git' +platform :ios, '5.1.1' -platform :ios, '7.0' +source 'https://github.com/CocoaPods/Specs.git' -pod 'Appboy-iOS-SDK' -pod 'NUI',:git => 'https://github.com/tombenner/nui.git' -pod 'KKColorListPicker', :git => 'git@github.com:leoru/KKColorListPicker.git' +pod 'Appboy-iOS-SDK/AppboyKitWithoutFacebookSupport' +pod 'NUI' \ No newline at end of file diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 378f4148c..65d477fdf 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,10 +1,6 @@ PODS: - - Appboy-iOS-SDK (2.11.2): - - Appboy-iOS-SDK/AppboyKit (= 2.11.2) - - SDWebImage (~> 3.7.0) - - Appboy-iOS-SDK/AppboyKit (2.11.2): - - SDWebImage (~> 3.7.0) - - KKColorListPicker (0.2.4) + - Appboy-iOS-SDK/AppboyKitWithoutFacebookSupport (2.9.6): + - SDWebImage (>= 3.7.0) - NUI (0.5.5): - NUIParse - NUIParse (1.2.1) @@ -13,31 +9,17 @@ PODS: - SDWebImage/Core (3.7.2) DEPENDENCIES: - - Appboy-iOS-SDK (from `./../../Appboy-iOS-SDK/`) - - KKColorListPicker (from `git@github.com:leoru/KKColorListPicker.git`) - - NUI (from `https://github.com/tombenner/nui.git`) + - Appboy-iOS-SDK/AppboyKitWithoutFacebookSupport (from `./../../Appboy-iOS-SDK/`) + - NUI EXTERNAL SOURCES: Appboy-iOS-SDK: - :path: "./../../Appboy-iOS-SDK/" - KKColorListPicker: - :git: git@github.com:leoru/KKColorListPicker.git - NUI: - :git: https://github.com/tombenner/nui.git - -CHECKOUT OPTIONS: - KKColorListPicker: - :commit: 2e796e48efd572fc1d6834f766d3f7d55f9da27c - :git: git@github.com:leoru/KKColorListPicker.git - NUI: - :commit: f4ae07451c34e5f88404b5cc8cc0d27a78a3d6a0 - :git: https://github.com/tombenner/nui.git + :path: ./../../Appboy-iOS-SDK/ SPEC CHECKSUMS: - Appboy-iOS-SDK: 54b33c3437895aee38af7d950c9da7d3a09878a8 - KKColorListPicker: de772db47659dea2a8c77bf9bac97648929ce10a + Appboy-iOS-SDK: 0b4989178061fb83cb2d86e5fe8bf822c09f6794 NUI: 53de7278003235deb2a375fe6f04c7a3aa3e49eb NUIParse: 9b6d5a6b782dc654ac6c846d623885080306f07f SDWebImage: 71b7cdc1d1721d6a82ed62889030225f2c249e29 -COCOAPODS: 0.36.1 +COCOAPODS: 0.35.0 diff --git a/Example/README.md b/Example/README.md index 7222717f8..64e687108 100644 --- a/Example/README.md +++ b/Example/README.md @@ -3,7 +3,7 @@ Stopwatch is a simple timer application that shows Appboy in action. Below are some screenshots that will reference how to: * Display an Appboy feedback form and news feed -* Activate an in-app message +* Activate an in-app slideup message * Log custom event data and in-app purchases to Appboy * Set user attributes for the existing user on the device * Theme Appboy programmatically @@ -30,10 +30,10 @@ shows how to open the feed and feedback in popovers * `InfoViewController.m` has a feedback view controller which opens in a modal view -## In-app messages -You'll notice when you first open Stopwatch that a small, unobtrusive message appears on the bottom of the screen. This message is there to alert your users to new content. When you use a Production API Key, this in-app message only appears when you push out new content from the Appboy dashboard, but for this sample app it will appear every time the app is foregrounded. There are three different in-app message types. +## In-app slideup messages +You'll notice when you first open Stopwatch that a small, unobtrusive message appears on the bottom of the screen. This message is there to alert your users to new content. When you use a Production API Key, this slideup message only appears when you push out new content from the Appboy dashboard, but for this sample app it will appear every time the app is foregrounded. -You can control the timing of the in-app message so that it does not appear or appears only when you want it to. The `InAppMessageTestViewController` has code samples for how to handle displaying and queuing of incoming in-app message. +You can control the timing of the slidesup so that it does not appear or appears only when you want it to. The `SlideupControlsViewController` has code samples for how to handle displaying and queuing of incoming slideup message. ## Custom events and in-app purchases When you start the timer on Stopwatch, Appboy logs a custom event in `InitialViewController.m`. Purchases are also logged when you click on the "Upgrade" button on the home screen of the app. diff --git a/Example/Stopwatch.xcodeproj/project.pbxproj b/Example/Stopwatch.xcodeproj/project.pbxproj index 680c64ca0..31cee53dc 100644 --- a/Example/Stopwatch.xcodeproj/project.pbxproj +++ b/Example/Stopwatch.xcodeproj/project.pbxproj @@ -23,19 +23,16 @@ 4E6D661619DCC18F009983AD /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E6D661519DCC18F009983AD /* Images.xcassets */; }; 4E76BAA2183546CF001872E3 /* libCrittercism_v4_1_2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E76BAA1183546CF001872E3 /* libCrittercism_v4_1_2.a */; }; 4E76BAA5183546E3001872E3 /* dsym_upload.sh in Resources */ = {isa = PBXBuildFile; fileRef = 4E76BAA4183546E3001872E3 /* dsym_upload.sh */; }; - 4E7D1C7E1A9FE1990087DB64 /* SocialNetworkViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E7D1C7D1A9FE1990087DB64 /* SocialNetworkViewController.m */; }; 4E94D76E1743EE7100604EA0 /* Clock.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E94D76D1743EE7100604EA0 /* Clock.m */; }; 4E94D7711743EE8900604EA0 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E94D7701743EE8900604EA0 /* AppDelegate.m */; }; - 4EA0515D18998472007217BD /* CustomInAppMessageViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4EA0515B18998472007217BD /* CustomInAppMessageViewController.xib */; }; + 4EA0515C18998472007217BD /* CustomSlideupViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EA0515A18998472007217BD /* CustomSlideupViewController.m */; }; + 4EA0515D18998472007217BD /* CustomSlideupViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4EA0515B18998472007217BD /* CustomSlideupViewController.xib */; }; 4EA3EE241745B9A2000E403C /* UserAttributeCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EA3EE231745B9A2000E403C /* UserAttributeCell.m */; }; 4EA7AA8E185626EC00D2B651 /* FlushModeTestViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EA7AA8D185626EC00D2B651 /* FlushModeTestViewController.m */; }; - 4EABC19A1A606D00007259BD /* InAppMessageUIViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EABC1991A606D00007259BD /* InAppMessageUIViewController.m */; }; - 4EABC19D1A621B7F007259BD /* InAppMessageUICells.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EABC19C1A621B7F007259BD /* InAppMessageUICells.m */; }; - 4EB014FD1A79D31D00E11E41 /* InAppMessageTestViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 955DE8941741A70700C07A57 /* InAppMessageTestViewController.m */; }; - 4EB014FE1A79D4C900E11E41 /* CustomInAppMessageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EA0515A18998472007217BD /* CustomInAppMessageViewController.m */; }; 797795232AE54425A15B3018 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 01F620394EDC4EF6A11D6429 /* libPods.a */; }; 953574AB1743F862003A64B3 /* UserAttributesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 953574A81743F862003A64B3 /* UserAttributesViewController.m */; }; 955DE89017419DB000C07A57 /* TestingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 955DE88F17419DB000C07A57 /* TestingViewController.m */; }; + 955DE8961741A70700C07A57 /* SlideupTestViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 955DE8941741A70700C07A57 /* SlideupTestViewController.m */; }; 9580719E173D723400129B89 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95EF514D173D6A6100C0D780 /* SystemConfiguration.framework */; }; 9580719F173D723400129B89 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95EF514F173D6A6800C0D780 /* AssetsLibrary.framework */; }; 958071A0173D723400129B89 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95EF5153173D6A7700C0D780 /* CoreTelephony.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; @@ -90,23 +87,17 @@ 4E76BAA1183546CF001872E3 /* libCrittercism_v4_1_2.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libCrittercism_v4_1_2.a; sourceTree = ""; }; 4E76BAA3183546E3001872E3 /* CRFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRFilter.h; sourceTree = ""; }; 4E76BAA4183546E3001872E3 /* dsym_upload.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = dsym_upload.sh; sourceTree = ""; }; - 4E7D1C7C1A9FE1990087DB64 /* SocialNetworkViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SocialNetworkViewController.h; sourceTree = ""; }; - 4E7D1C7D1A9FE1990087DB64 /* SocialNetworkViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SocialNetworkViewController.m; sourceTree = ""; }; 4E94D76C1743EE7100604EA0 /* Clock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Clock.h; sourceTree = ""; }; 4E94D76D1743EE7100604EA0 /* Clock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Clock.m; sourceTree = ""; }; 4E94D76F1743EE8900604EA0 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 4E94D7701743EE8900604EA0 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 4EA0515918998472007217BD /* CustomInAppMessageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomInAppMessageViewController.h; sourceTree = ""; }; - 4EA0515A18998472007217BD /* CustomInAppMessageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomInAppMessageViewController.m; sourceTree = ""; }; - 4EA0515B18998472007217BD /* CustomInAppMessageViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CustomInAppMessageViewController.xib; sourceTree = ""; }; + 4EA0515918998472007217BD /* CustomSlideupViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomSlideupViewController.h; sourceTree = ""; }; + 4EA0515A18998472007217BD /* CustomSlideupViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomSlideupViewController.m; sourceTree = ""; }; + 4EA0515B18998472007217BD /* CustomSlideupViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = CustomSlideupViewController.xib; sourceTree = ""; }; 4EA3EE221745B9A2000E403C /* UserAttributeCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserAttributeCell.h; sourceTree = ""; }; 4EA3EE231745B9A2000E403C /* UserAttributeCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UserAttributeCell.m; sourceTree = ""; }; 4EA7AA8C185626EC00D2B651 /* FlushModeTestViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlushModeTestViewController.h; sourceTree = ""; }; 4EA7AA8D185626EC00D2B651 /* FlushModeTestViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlushModeTestViewController.m; sourceTree = ""; }; - 4EABC1981A606D00007259BD /* InAppMessageUIViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InAppMessageUIViewController.h; sourceTree = ""; }; - 4EABC1991A606D00007259BD /* InAppMessageUIViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InAppMessageUIViewController.m; sourceTree = ""; }; - 4EABC19B1A621AF4007259BD /* InAppMessageUICells.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InAppMessageUICells.h; sourceTree = ""; }; - 4EABC19C1A621B7F007259BD /* InAppMessageUICells.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InAppMessageUICells.m; sourceTree = ""; }; 56A3C142EBEA4F6FEF1BAF49 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; 7FFB110B1A70275200A6DAFB /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; 7FFB11201A703BAE00A6DAFB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; @@ -141,10 +132,10 @@ 953574A91743F862003A64B3 /* UserAttributesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserAttributesViewController.h; sourceTree = ""; }; 955DE88E17419DB000C07A57 /* TestingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestingViewController.h; sourceTree = ""; }; 955DE88F17419DB000C07A57 /* TestingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestingViewController.m; sourceTree = ""; }; - 955DE8931741A70700C07A57 /* InAppMessageTestViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InAppMessageTestViewController.h; sourceTree = ""; }; - 955DE8941741A70700C07A57 /* InAppMessageTestViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InAppMessageTestViewController.m; sourceTree = ""; }; + 955DE8931741A70700C07A57 /* SlideupTestViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SlideupTestViewController.h; sourceTree = ""; }; + 955DE8941741A70700C07A57 /* SlideupTestViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SlideupTestViewController.m; sourceTree = ""; }; 958071A7173D727000129B89 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; - 95EF510A173D5FD600C0D780 /* StopwatchDevelop.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StopwatchDevelop.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 95EF510A173D5FD600C0D780 /* Stopwatch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Stopwatch.app; sourceTree = BUILT_PRODUCTS_DIR; }; 95EF510D173D5FD600C0D780 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 95EF510F173D5FD600C0D780 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 95EF5111173D5FD600C0D780 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; @@ -201,18 +192,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 4E3178751AC49363006C88B4 /* CustomInAppMessageClasses */ = { - isa = PBXGroup; - children = ( - 4EA0515918998472007217BD /* CustomInAppMessageViewController.h */, - 4EA0515A18998472007217BD /* CustomInAppMessageViewController.m */, - 4EA0515B18998472007217BD /* CustomInAppMessageViewController.xib */, - 955DE8931741A70700C07A57 /* InAppMessageTestViewController.h */, - 955DE8941741A70700C07A57 /* InAppMessageTestViewController.m */, - ); - name = CustomInAppMessageClasses; - sourceTree = ""; - }; 4E49ECEA19DDE84F00ADC43F /* Images */ = { isa = PBXGroup; children = ( @@ -257,7 +236,7 @@ 95EF510B173D5FD600C0D780 /* Products */ = { isa = PBXGroup; children = ( - 95EF510A173D5FD600C0D780 /* StopwatchDevelop.app */, + 95EF510A173D5FD600C0D780 /* Stopwatch.app */, ); name = Products; sourceTree = ""; @@ -287,7 +266,6 @@ 95EF5113173D5FD600C0D780 /* Stopwatch */ = { isa = PBXGroup; children = ( - 4E3178751AC49363006C88B4 /* CustomInAppMessageClasses */, 4E94D76F1743EE8900604EA0 /* AppDelegate.h */, 4E94D7701743EE8900604EA0 /* AppDelegate.m */, 95EF5125173D5FD600C0D780 /* MainStoryboard_iPhone.storyboard */, @@ -298,8 +276,8 @@ 4E94D76D1743EE7100604EA0 /* Clock.m */, 955DE88E17419DB000C07A57 /* TestingViewController.h */, 955DE88F17419DB000C07A57 /* TestingViewController.m */, - 4E7D1C7C1A9FE1990087DB64 /* SocialNetworkViewController.h */, - 4E7D1C7D1A9FE1990087DB64 /* SocialNetworkViewController.m */, + 955DE8931741A70700C07A57 /* SlideupTestViewController.h */, + 955DE8941741A70700C07A57 /* SlideupTestViewController.m */, 953574A81743F862003A64B3 /* UserAttributesViewController.m */, 953574A91743F862003A64B3 /* UserAttributesViewController.h */, 95EF5114173D5FD600C0D780 /* Supporting Files */, @@ -307,11 +285,10 @@ 4EA3EE231745B9A2000E403C /* UserAttributeCell.m */, 4EA7AA8C185626EC00D2B651 /* FlushModeTestViewController.h */, 4EA7AA8D185626EC00D2B651 /* FlushModeTestViewController.m */, + 4EA0515918998472007217BD /* CustomSlideupViewController.h */, + 4EA0515A18998472007217BD /* CustomSlideupViewController.m */, + 4EA0515B18998472007217BD /* CustomSlideupViewController.xib */, 4E6D661519DCC18F009983AD /* Images.xcassets */, - 4EABC1981A606D00007259BD /* InAppMessageUIViewController.h */, - 4EABC1991A606D00007259BD /* InAppMessageUIViewController.m */, - 4EABC19B1A621AF4007259BD /* InAppMessageUICells.h */, - 4EABC19C1A621B7F007259BD /* InAppMessageUICells.m */, ); path = Stopwatch; sourceTree = ""; @@ -363,7 +340,7 @@ ); name = Stopwatch; productName = Stopwatch; - productReference = 95EF510A173D5FD600C0D780 /* StopwatchDevelop.app */; + productReference = 95EF510A173D5FD600C0D780 /* Stopwatch.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -457,7 +434,7 @@ 95EF512A173D5FD600C0D780 /* MainStoryboard_iPad.storyboard in Resources */, 4E49ED0919DDE84F00ADC43F /* facebook-icon.png in Resources */, 4E49ED1819DDE84F00ADC43F /* stopwatch.png in Resources */, - 4EA0515D18998472007217BD /* CustomInAppMessageViewController.xib in Resources */, + 4EA0515D18998472007217BD /* CustomSlideupViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -520,14 +497,11 @@ 95EF512D173D5FD600C0D780 /* InitialViewController.m in Sources */, 4EA7AA8E185626EC00D2B651 /* FlushModeTestViewController.m in Sources */, 955DE89017419DB000C07A57 /* TestingViewController.m in Sources */, - 4EB014FE1A79D4C900E11E41 /* CustomInAppMessageViewController.m in Sources */, - 4EB014FD1A79D31D00E11E41 /* InAppMessageTestViewController.m in Sources */, - 4EABC19A1A606D00007259BD /* InAppMessageUIViewController.m in Sources */, - 4EABC19D1A621B7F007259BD /* InAppMessageUICells.m in Sources */, + 955DE8961741A70700C07A57 /* SlideupTestViewController.m in Sources */, 4E94D76E1743EE7100604EA0 /* Clock.m in Sources */, 4E94D7711743EE8900604EA0 /* AppDelegate.m in Sources */, - 4E7D1C7E1A9FE1990087DB64 /* SocialNetworkViewController.m in Sources */, 953574AB1743F862003A64B3 /* UserAttributesViewController.m in Sources */, + 4EA0515C18998472007217BD /* CustomSlideupViewController.m in Sources */, 4EA3EE241745B9A2000E403C /* UserAttributeCell.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -602,68 +576,6 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 4E1C78971AAFA82000663F4B /* Develop */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD)"; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - COPY_PHASE_STRIP = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; - LIBRARY_SEARCH_PATHS = "${BUILT_PRODUCTS_DIR}"; - ONLY_ACTIVE_ARCH = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALID_ARCHS = "arm64 armv7 armv7s armv6 x86_64 i386"; - }; - name = Develop; - }; - 4E1C78981AAFA82000663F4B /* Develop */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 56A3C142EBEA4F6FEF1BAF49 /* Pods.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "${SRCROOT}/../Appboy-iOS-SDK/AppboyKitWithoutFacebookSupport", - ); - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "Stopwatch/Stopwatch-Prefix.pch"; - INFOPLIST_FILE = "Stopwatch/Stopwatch-Info.plist"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/CrittercismSDK", - ); - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "2e477cb9-d568-478e-9da5-35b2f5ab57c0"; - WRAPPER_EXTENSION = app; - }; - name = Develop; - }; 95EF512E173D5FD600C0D780 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -690,10 +602,9 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 5.1.1; LIBRARY_SEARCH_PATHS = "${BUILT_PRODUCTS_DIR}"; ONLY_ACTIVE_ARCH = NO; - PROVISIONING_PROFILE = "5204a378-9212-4432-9be5-439a04c1ad82"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; VALID_ARCHS = "arm64 armv7 armv7s armv6 x86_64 i386"; @@ -719,7 +630,7 @@ GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 5.1.1; LIBRARY_SEARCH_PATHS = "${BUILT_PRODUCTS_DIR}"; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; @@ -744,13 +655,14 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Stopwatch/Stopwatch-Prefix.pch"; INFOPLIST_FILE = "Stopwatch/Stopwatch-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 5.1.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/CrittercismSDK", ); ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = StopwatchDevelop; + PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = "4f241a95-5869-45d3-8e06-44a36398982b"; WRAPPER_EXTENSION = app; }; @@ -771,13 +683,14 @@ GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Stopwatch/Stopwatch-Prefix.pch"; INFOPLIST_FILE = "Stopwatch/Stopwatch-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 5.1.1; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(SRCROOT)/CrittercismSDK", ); ONLY_ACTIVE_ARCH = NO; - PRODUCT_NAME = Stopwatch; + PRODUCT_NAME = "Appboy Sample"; PROVISIONING_PROFILE = "1672246d-f5a3-415a-8bd5-5ceb5ad9fa1f"; WRAPPER_EXTENSION = app; }; @@ -790,7 +703,6 @@ isa = XCConfigurationList; buildConfigurations = ( 95EF512E173D5FD600C0D780 /* Debug */, - 4E1C78971AAFA82000663F4B /* Develop */, 95EF512F173D5FD600C0D780 /* Release */, ); defaultConfigurationIsVisible = 0; @@ -800,7 +712,6 @@ isa = XCConfigurationList; buildConfigurations = ( 95EF5131173D5FD600C0D780 /* Debug */, - 4E1C78981AAFA82000663F4B /* Develop */, 95EF5132173D5FD600C0D780 /* Release */, ); defaultConfigurationIsVisible = 0; diff --git a/Example/Stopwatch.xcodeproj/xcuserdata/Wenzhi.xcuserdatad/xcschemes/Stopwatch.xcscheme b/Example/Stopwatch.xcodeproj/xcuserdata/Wenzhi.xcuserdatad/xcschemes/Stopwatch.xcscheme index 2166c787f..d53f3b6c9 100644 --- a/Example/Stopwatch.xcodeproj/xcuserdata/Wenzhi.xcuserdatad/xcschemes/Stopwatch.xcscheme +++ b/Example/Stopwatch.xcodeproj/xcuserdata/Wenzhi.xcuserdatad/xcschemes/Stopwatch.xcscheme @@ -15,7 +15,7 @@ @@ -33,7 +33,7 @@ @@ -44,7 +44,7 @@ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" launchStyle = "0" useCustomWorkingDirectory = "NO" - buildConfiguration = "Debug" + buildConfiguration = "Develop" ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" allowLocationSimulation = "YES"> @@ -53,7 +53,7 @@ @@ -77,7 +77,7 @@ diff --git a/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/UserInterfaceState.xcuserstate b/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/UserInterfaceState.xcuserstate index 478675098..1134a6dda 100644 Binary files a/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/UserInterfaceState.xcuserstate and b/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Example/Stopwatch/AppDelegate.m b/Example/Stopwatch/AppDelegate.m index 861e2ba99..8356670d4 100644 --- a/Example/Stopwatch/AppDelegate.m +++ b/Example/Stopwatch/AppDelegate.m @@ -14,17 +14,21 @@ - (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions: [Crittercism enableWithAppID:CrittercismAppId]; [Crittercism leaveBreadcrumb:[NSString stringWithFormat:@"startWithApiKey: %@", AppboyApiKey]]; - // Starts up Appboy, opening a new session and causing an updated in-app message/feed to be requested. + // Starts up Appboy, opening a new session and causing an updated slideup/feed to be requested. [Appboy startWithApiKey:AppboyApiKey inApplication:application withLaunchOptions:launchOptions - withAppboyOptions:@{ABKRequestProcessingPolicyOptionKey: @(ABKAutomaticRequestProcessing), - ABKSocialAccountAcquisitionPolicyOptionKey:@(ABKAutomaticSocialAccountAcquisition)}]; + withAppboyOptions:@{ABKRequestProcessingPolicyOptionKey: [NSNumber numberWithInteger:ABKAutomaticRequestProcessing], + ABKSocialAccountAcquisitionPolicyOptionKey:[NSNumber numberWithInteger:ABKAutomaticSocialAccountAcquisition]}]; if ([Appboy sharedInstance].user.email) { [Crittercism setUsername:[Appboy sharedInstance].user.email]; } + // This lets us use NUI, the theming/customization package. There is also some initialization code in main.m + // Look at NUI/NUIStyle.nss to see what's being customized. + [NUISettings initWithStylesheet:@"StopwatchNUIStyle"]; + // Enable/disable Appboy to use NUI theming. Try turning it on and off to see the results! (Look at the Appboy // feedback form and news feed). [Appboy sharedInstance].useNUITheming = YES; @@ -50,7 +54,7 @@ - (void) application:(UIApplication *)application didReceiveRemoteNotification:( // Pass the deviceToken to Appboy as well - (void) application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { [Crittercism leaveBreadcrumb:[NSString stringWithFormat:@"didRegisterForRemoteNotificationsWithDeviceToken: %@",deviceToken]]; - NSLog(@"In application:didRegisterForRemoteNotificationsWithDeviceToken, token is %@", [NSString stringWithFormat:@"%@", deviceToken]); + NSLog(@"In application:didRegisterForRemoteNotificationWithDeviceToken, token is %@", [NSString stringWithFormat:@"%@", deviceToken]); [[Appboy sharedInstance] registerPushToken:[NSString stringWithFormat:@"%@", deviceToken]]; } @@ -106,13 +110,4 @@ - (void)setupPushCategories { [[UIApplication sharedApplication] registerForRemoteNotifications]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; } - -// Here we are trying to handle deep linking with scheme beginning with "stopwatch". -- (BOOL) application:(UIApplication *)application handleOpenURL:(NSURL *)url { - NSLog(@"Stopwatch get a deep link request: %@", url.absoluteString); - UIAlertView *deepLinkAlert = [[UIAlertView alloc] initWithTitle:@"Deep Linking" message:url.absoluteString delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; - [deepLinkAlert show]; - [deepLinkAlert release]; - return YES; -} @end diff --git a/Example/Stopwatch/CustomInAppMessageViewController.h b/Example/Stopwatch/CustomInAppMessageViewController.h deleted file mode 100644 index b8c9ca7b3..000000000 --- a/Example/Stopwatch/CustomInAppMessageViewController.h +++ /dev/null @@ -1,8 +0,0 @@ -#import -@interface CustomInAppMessageViewController : ABKInAppMessageViewController -@property (retain, nonatomic) IBOutlet UILabel *inAppMessageBodyTextLabel; - -// dismiss the in-app message -- (IBAction)closeButtonTapped:(id)sender; - -@end diff --git a/Example/Stopwatch/CustomInAppMessageViewController.m b/Example/Stopwatch/CustomInAppMessageViewController.m deleted file mode 100644 index 2c9561f28..000000000 --- a/Example/Stopwatch/CustomInAppMessageViewController.m +++ /dev/null @@ -1,51 +0,0 @@ -#import "CustomInAppMessageViewController.h" - -static CGFloat const inAppMessageBottomPadding = 10.0f; - -@implementation CustomInAppMessageViewController - -- (void) viewDidLoad { - [super viewDidLoad]; - - self.inAppMessageBodyTextLabel.text = self.inAppMessage.message; - - // Displays the key/value pair if sent by the server. - if (self.inAppMessage.extras != nil && self.inAppMessage.extras.count > 0) { - for (NSString *key in [self.inAppMessage.extras allKeys]) { - NSString *value = self.inAppMessage.extras[key]; - self.inAppMessageBodyTextLabel.text = [self.inAppMessageBodyTextLabel.text stringByAppendingFormat:@"\n%@ : %@", key, value]; - } - } -} - -- (IBAction) closeButtonTapped:(id)sender { - // This is a method of ABKInAppMessageViewController, custom in-app message view controller can call it to dismiss the in-app message - [self hideInAppMessage:YES]; -} - -// Create cutom animation for in-app message. -// You have to override moveInAppMessageViewOffScreen: and moveInAppMessageViewOnScreen: to create -// animation for in-app message's display and dismissal. -- (void) moveInAppMessageViewOffScreen:(CGRect)inAppMessageWindowFrame { - self.view.frame = CGRectMake(0.0, 0.0, 1.0, 1.0); - self.view.center = CGPointMake(inAppMessageWindowFrame.size.width / 2, inAppMessageWindowFrame.size.height / 2); -} - -- (void) moveInAppMessageViewOnScreen:(CGRect)inAppMessageWindowFrame { - CGRect onScreenViewFrame = inAppMessageWindowFrame; - onScreenViewFrame.size.width = inAppMessageWindowFrame.size.width / 1.3f; - self.view.frame = onScreenViewFrame; - - // Updates the frames of custom in-app message views based on the length of the message and the values within the extras. - [self.inAppMessageBodyTextLabel sizeToFit]; - self.inAppMessageBodyTextLabel.center = CGPointMake(onScreenViewFrame.size.width / 2, self.inAppMessageBodyTextLabel.center.y); - onScreenViewFrame.size.height = self.inAppMessageBodyTextLabel.frame.origin.y + self.inAppMessageBodyTextLabel.frame.size.height + inAppMessageBottomPadding; - self.view.frame = onScreenViewFrame; - self.view.center = CGPointMake(inAppMessageWindowFrame.size.width / 2, inAppMessageWindowFrame.size.height / 2); -} - -- (void) dealloc { - [_inAppMessageBodyTextLabel release]; - [super dealloc]; -} -@end diff --git a/Example/Stopwatch/CustomSlideupViewController.h b/Example/Stopwatch/CustomSlideupViewController.h new file mode 100644 index 000000000..a5303a13b --- /dev/null +++ b/Example/Stopwatch/CustomSlideupViewController.h @@ -0,0 +1,9 @@ +#import +@interface CustomSlideupViewController : ABKSlideupViewController + +@property (retain, nonatomic) IBOutlet UILabel *slideupMessageLabel; + +// dismiss the slideup +- (IBAction)closeButtonTapped:(id)sender; + +@end diff --git a/Example/Stopwatch/CustomSlideupViewController.m b/Example/Stopwatch/CustomSlideupViewController.m new file mode 100644 index 000000000..88f344f79 --- /dev/null +++ b/Example/Stopwatch/CustomSlideupViewController.m @@ -0,0 +1,42 @@ +#import "CustomSlideupViewController.h" +#import + +static CGFloat const slideupBottomPadding = 10.0f; + +@implementation CustomSlideupViewController + +- (void) viewDidLoad { + [super viewDidLoad]; + + self.slideupMessageLabel.text = self.slideup.message; + + // Displays the key/value pair if sent by the server. + if (self.slideup.extras != nil && self.slideup.extras.count > 0) { + for (NSString *key in [self.slideup.extras allKeys]) { + NSString *value = [self.slideup.extras objectForKey:key]; + self.slideupMessageLabel.text = [self.slideupMessageLabel.text stringByAppendingFormat:@"\n%@ : %@", key, value]; + } + } + + // Updates the frames of custom slideup views based on the length of the message and the values within the extras. + [self.slideupMessageLabel sizeToFit]; + self.slideupMessageLabel.center = CGPointMake(self.view.frame.size.width / 2, self.slideupMessageLabel.center.y); + CGRect frame = self.view.frame; + frame.size.height = self.slideupMessageLabel.frame.origin.y + self.slideupMessageLabel.frame.size.height + slideupBottomPadding; + self.view.frame = frame; +} + +- (IBAction)closeButtonTapped:(id)sender { + // This is a method of ABKSlideupViewController, custom slideup can call it to dismiss the slideup + [self hideSlideup:YES]; +} + +- (void)dealloc { + [_slideupMessageLabel release]; + [super dealloc]; +} +- (void)viewDidUnload { + [self setSlideupMessageLabel:nil]; + [super viewDidUnload]; +} +@end diff --git a/Example/Stopwatch/CustomInAppMessageViewController.xib b/Example/Stopwatch/CustomSlideupViewController.xib similarity index 82% rename from Example/Stopwatch/CustomInAppMessageViewController.xib rename to Example/Stopwatch/CustomSlideupViewController.xib index 543b9ae22..d174839e3 100644 --- a/Example/Stopwatch/CustomInAppMessageViewController.xib +++ b/Example/Stopwatch/CustomSlideupViewController.xib @@ -1,18 +1,18 @@ - + - - + + - + - + - + @@ -44,7 +44,6 @@ - @@ -52,9 +51,4 @@ - - - - - - + \ No newline at end of file diff --git a/Example/Stopwatch/InAppMessageTestViewController.h b/Example/Stopwatch/InAppMessageTestViewController.h deleted file mode 100644 index fd2488733..000000000 --- a/Example/Stopwatch/InAppMessageTestViewController.h +++ /dev/null @@ -1,12 +0,0 @@ -#import -#import - -@interface InAppMessageTestViewController : UIViewController - -@property (nonatomic, retain) IBOutlet UISegmentedControl *segmentedControlForInAppMode; -@property (nonatomic, assign) BOOL shouldDisplayInAppMessage; -@property (retain, nonatomic) IBOutlet UISegmentedControl *inAppMessageTypeSegmentedControl; - -- (IBAction) displayNextAvailableInAppPressed:(id)sender; -- (IBAction)requestAnInApp:(id)sender; -@end diff --git a/Example/Stopwatch/InAppMessageTestViewController.m b/Example/Stopwatch/InAppMessageTestViewController.m deleted file mode 100755 index e56c0f57d..000000000 --- a/Example/Stopwatch/InAppMessageTestViewController.m +++ /dev/null @@ -1,204 +0,0 @@ -#import "InAppMessageTestViewController.h" -#import "CustomInAppMessageViewController.h" - -@implementation InAppMessageTestViewController - -/* - * For further details regarding in-app message delegate methods and stacking mechanisms, please see - * ABKInAppMessageControllerDelegate.h and ABKInAppMessageController.h - */ - -#pragma mark Appboy In-App Message Delegate methods - -// This delegate method is called every time a new in-app message is received from the Appboy server. -// Implementing this method is OPTIONAL. The default behavior is equivalent to a return of NO from this method. In other -// words, Appboy will handle the in-app message display automatically if this delegate method is not implemented. -- (BOOL) onInAppMessageReceived:(ABKInAppMessage *)inAppMessage { - //Return NO when you want Appboy to handle the in-app message display. - return NO; -} - -/*! - * This callback method allows you to specify if each in-app message should be displayed. It is called just before each in-app - * message is displayed. Please check ABKInAppMessageControllerDelegate.h for more about the return value ABKInAppMessageDisplayChoice - * - * In-app message queuing: - * - * Arriving in-app messages are stacked when they can't be displayed for one of these reasons: - * - Another in-app message is visible - * - If the beforeInAppMessageDisplayed:withKeyboardIsUp: delegate method HAS NOT been implemented and keyboard is being - * displayed currently. - * - If the beforeInAppMessageDisplayed:withKeyboardIsUp: delegate method returned ABKDisplayInAppMessageLater - * - * In-app messages are potentially removed from the in-app message stack and displayed when: - * - Another in-app messages arrives and onInAppMessageReceived: DOES NOT return YES. - * - The application comes to the foreground after being backgrounded - * - displayNextInAppMessageWithDelegate is called - * - * If one of these events occurs and the in-app message can't be displayed, it remains in the stack. - * - * Note that if you unset the delegate after some in-app messages have been stacked, the accumulated stacked in-app messages - * will be displayed according to the above scheme. - */ -- (ABKInAppMessageDisplayChoice) beforeInAppMessageDisplayed:(ABKInAppMessage *)inAppMessage - withKeyboardIsUp:(BOOL)keyboardIsUp { - NSLog(@"Received in-app message with message: %@", inAppMessage.message); - - - // We want to display the in-app message from the top if there is a keyboard being displayed on the screen. - if (keyboardIsUp && [inAppMessage isKindOfClass:[ABKInAppMessageSlideup class]]) { - ((ABKInAppMessageSlideup *)inAppMessage).inAppMessageSlideupAnchor = ABKInAppMessageSlideupFromTop; - } - - // /Check if the delegate is called by a click on the "Display Next Available In-App Message" button. - if (self.shouldDisplayInAppMessage && self.segmentedControlForInAppMode.selectedSegmentIndex == 1) { - // If the in-app message mode is ABKDisplayInAppMessageLater and the user has clicked the "Display Next Available In-App Message" - // button, this will display the next available in-app message. - return ABKDisplayInAppMessageNow; - } else { - switch (self.segmentedControlForInAppMode.selectedSegmentIndex) { - case 0: - return ABKDisplayInAppMessageNow; - - case 1: - return ABKDisplayInAppMessageLater; - - case 2: - return ABKDiscardInAppMessage; - - default: - return ABKDisplayInAppMessageNow; - } - } -} - -// This delegate method asks if there is any custom in-app message view controller that developers want to pass in. The returned -// view controller should be a subclass of ABKInAppMessageViewController. -// Also, the view of the returned view controller should be an instance of ABKInAppMessageView or its subclass. -- (ABKInAppMessageViewController *) inAppMessageViewControllerWithInAppMessage:(ABKInAppMessage *)inAppMessage { - if ([inAppMessage isKindOfClass:[ABKInAppMessageSlideup class]]) { - return [[[ABKInAppMessageSlideupViewController alloc] initWithInAppMessage:inAppMessage] autorelease]; - } else if ([inAppMessage isKindOfClass:[ABKInAppMessageModal class]]) { - return [[[ABKInAppMessageModalViewController alloc] initWithInAppMessage:inAppMessage] autorelease]; - } else if ([inAppMessage isKindOfClass:[ABKInAppMessageFull class]]) { - return [[[ABKInAppMessageFullViewController alloc] initWithInAppMessage:inAppMessage] autorelease]; - } else { - CustomInAppMessageViewController *customInAppMessage = [[[CustomInAppMessageViewController alloc] initWithInAppMessage:inAppMessage] autorelease]; - return customInAppMessage; - } - return nil; -} - -// This delegate method is notified if the in-app message is tapped. You can use this to initiate an action -// in response to the tap. Note that when the delegate returns NO, Appboy SDK will perform the action sent down from -// the Appboy Server after the delegate method is executed. If it returns YES, the response to the tap is up to you. -- (BOOL) onInAppMessageClicked:(ABKInAppMessage *)inAppMessage { - NSLog(@"In-app message tapped!"); - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Appboy.Stopwatch", nil) - message:NSLocalizedString(@"Appboy.Stowpatch.slideup-test.slideup-is-tap", nil) - delegate:nil - cancelButtonTitle:NSLocalizedString(@"Appboy.Stopwatch.alert.cancel-button.title", nil) - otherButtonTitles:nil]; - [alertView show]; - [alertView release]; - - [inAppMessage setInAppMessageClickAction:ABKInAppMessageNoneClickAction withURI:nil]; - // Returning YES here to prevent Appboy from performing the click action. - return YES; -} - -#pragma mark Stopwatch view controller methods - -- (void) viewDidLoad { - [super viewDidLoad]; - - if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) { - // In iOS 7, views are automatically extended to fit the size of the screen. Therefore, views may end up under - // the navigation bar, which makes some buttons invisible or unclickable. In order to prevent this behaviour, we set - // the Extended Layout mode to UIRectEdgeNone. - self.edgesForExtendedLayout = UIRectEdgeNone; - } -} - -- (void) viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - // Here we set self as the in-app message controller delegate to enable in-app message customization on this page. - [Appboy sharedInstance].inAppMessageController.delegate = self; -} - -- (void) viewDidDisappear:(BOOL)animated { - [super viewDidDisappear:animated]; - [Appboy sharedInstance].inAppMessageController.delegate = nil; -} -// If we've been returning ABKDisplayInAppMessageLater and in-app message have arrived, they'll be put in the stack. Here, take -// one off the stack and display it. -- (IBAction) displayNextAvailableInAppPressed:(id)sender { - self.shouldDisplayInAppMessage = YES; - [[Appboy sharedInstance].inAppMessageController displayNextInAppMessageWithDelegate:self]; - self.shouldDisplayInAppMessage = NO; -} - -- (IBAction)requestAnInApp:(id)sender { - [[Appboy sharedInstance] requestInAppMessageRefresh]; -} - -- (void) dealloc { - [_segmentedControlForInAppMode release]; - [_inAppMessageTypeSegmentedControl release]; - [super dealloc]; -} - -- (IBAction)createAndDisplayACustomSlideup:(id)sender { - ABKInAppMessage *inAppMessage = nil; - switch (self.inAppMessageTypeSegmentedControl.selectedSegmentIndex) { - case 3: { - ABKInAppMessage *customInApp = [[ABKInAppMessage alloc] init]; - customInApp.message = NSLocalizedString(@"Appboy.Stowpatch.slideup-test.custom-slideup-message", nil); - customInApp.inAppMessageDismissType = ABKInAppMessageDismissManually; - inAppMessage = [customInApp retain]; - [customInApp release]; - break; - } - case 2: { - ABKInAppMessageFull *customFull = [[ABKInAppMessageFull alloc] init]; - customFull.imageURI = [NSURL URLWithString:@"http://www.agartworks.com/wp-content/uploads/2014/05/Appboy-Robot-770.png"]; - customFull.message = NSLocalizedString(@"Appboy.Stowpatch.slideup-test.custom-slideup-message", nil); - ABKInAppMessageButton *button = [[ABKInAppMessageButton alloc] init]; - button.buttonText = @"OK"; - [button setButtonClickAction:ABKInAppMessageNoneClickAction withURI:nil]; - [customFull setInAppMessageButtons:@[button]]; - [button release]; - inAppMessage = [customFull retain]; - [customFull release]; - break; - } - case 1: { - ABKInAppMessageModal *customModal = [[ABKInAppMessageModal alloc] init]; - customModal.imageURI = [NSURL URLWithString:@"http://www.adweek.com/socialtimes/wp-content/uploads/sites/2/2013/11/appboy-6501.png"]; - customModal.message = NSLocalizedString(@"Appboy.Stowpatch.slideup-test.custom-slideup-message", nil); - inAppMessage = [customModal retain]; - [customModal release]; - break; - } - case 0: - default: { - ABKInAppMessageSlideup *customSlideup = [[ABKInAppMessageSlideup alloc] init]; - customSlideup.icon = @"\uf197"; - customSlideup.message = NSLocalizedString(@"Appboy.Stowpatch.slideup-test.custom-slideup-message", nil); - customSlideup.duration = 4.0; - inAppMessage = [customSlideup retain]; - [customSlideup release]; - break; - } - } - self.shouldDisplayInAppMessage = YES; - [[Appboy sharedInstance].inAppMessageController addInAppMessage:inAppMessage]; - self.shouldDisplayInAppMessage = NO; - [inAppMessage release]; -} - -- (IBAction)dismissCurrentSlideup:(id)sender { - [[Appboy sharedInstance].inAppMessageController hideCurrentInAppMessage:YES]; -} - -@end diff --git a/Example/Stopwatch/InAppMessageUICells.h b/Example/Stopwatch/InAppMessageUICells.h deleted file mode 100644 index 2e73ac021..000000000 --- a/Example/Stopwatch/InAppMessageUICells.h +++ /dev/null @@ -1,63 +0,0 @@ -#import "AppboyKit.h" -#import "KKColorListPicker.h" - -static NSString *const ItemIcon = @"Icon Badge"; -static NSString *const ItemImageURL = @"Image URL"; -static NSString *const ItemIconColor = @"Icon Color"; -static NSString *const ItemIconBackgroundColor = @"Icon Background"; -static NSString *const ItemMessage = @"Message"; -static NSString *const ItemBodyColor = @"Body Text Color"; -static NSString *const ItemHeader = @"Title"; -static NSString *const ItemHeaderColor = @"Title Color"; -static NSString *const ItemBackgroundColor = @"Background"; -static NSString *const ItemHideChevron = @"Hide Chevron"; -static NSString *const ItemChevronColor = @"Chevron Color"; -static NSString *const ItemCloseButtonColor = @"Close Button Color"; -static NSString *const ItemClickAction = @"Action"; -static NSString *const ItemClickActionURL = @"Action URL"; -static NSString *const ItemDismissType = @"Dismiss"; -static NSString *const ItemDuration = @"Duration(s)"; -static NSString *const ItemAnimatedFrom = @"Aminated From"; -static NSString *const ItemButtonNumber = @"Buttons:"; -static NSString *const ItemButtonOne = @"Button One"; -static NSString *const ItemButtonTwo = @"Button Two"; - -static NSString *const CellIdentifierSegment = @"SegmentCellIdentifier"; -static NSString *const CellIdentifierText = @"TextCellIdentifier"; -static NSString *const CellIdentifierChevron = @"ChevronCellIdentifier"; -static NSString *const CellIdentifierColor = @"ColorCellIdentifier"; -static NSString *const CellIdentifierButton = @"ButtonCellIdentifer"; - -@interface SegmentCell : UITableViewCell -@property (retain, nonatomic) IBOutlet UILabel *titleLabel; -@property (retain, nonatomic) IBOutlet UISegmentedControl *segmentControl; -- (void) setUpWithItem:(NSString *)item; -@end - -@interface TextFieldCell : UITableViewCell -@property (retain, nonatomic) IBOutlet UILabel *titleLabel; -@property (retain, nonatomic) IBOutlet UITextField *textField; - -@end - -@interface ColorCell : UITableViewCell -@property (retain, nonatomic) IBOutlet UILabel *titleLabel; -@property (retain, nonatomic) IBOutlet UIButton *colorButton; -- (void) setColor:(UIColor *)color; -- (UIColor *)color; -@end - -@interface HideChevronCell : UITableViewCell -@property (retain, nonatomic) IBOutlet UISwitch *hideChevronSwitch; - -@end - -@interface InAppMessageButtonCell : UITableViewCell -@property (retain, nonatomic) IBOutlet UITextField *titleTextField; -@property (retain, nonatomic) IBOutlet UIButton *textColorButton; -@property (retain, nonatomic) IBOutlet UIButton *backgroundColorButton; -@property (retain, nonatomic) IBOutlet UISegmentedControl *actionSegmentControl; -@property (retain, nonatomic) IBOutlet UITextField *URITextField; -@property (retain, nonatomic) ABKInAppMessageButton *button; -@property (retain, nonatomic) NSURL *buttonURL; -@end diff --git a/Example/Stopwatch/InAppMessageUICells.m b/Example/Stopwatch/InAppMessageUICells.m deleted file mode 100644 index 83afc6cd9..000000000 --- a/Example/Stopwatch/InAppMessageUICells.m +++ /dev/null @@ -1,141 +0,0 @@ -#import -#import "InAppMessageUICells.h" - -@implementation SegmentCell : UITableViewCell -- (void) setUpWithItem:(NSString *)item { - self.titleLabel.text = item; - NSDictionary *segmentDictionary = @{ItemIcon : @[@"None", @"Badge", @"URL"], - ItemClickAction : @[@"Feed", @"None", @"URL"], - ItemDismissType : @[@"Auto", @"Swipe"], - ItemAnimatedFrom : @[@"Bottom", @"Top"], - ItemButtonNumber : @[@"None", @"One", @"Two"]}; - NSArray *segmentList = segmentDictionary[item]; - [self.segmentControl removeAllSegments]; - for (int i = 0; i < segmentList.count; i ++) { - [self.segmentControl insertSegmentWithTitle:segmentList[i] atIndex:i animated:NO]; - } -} - -- (void) dealloc { - [_titleLabel release]; - [_segmentControl release]; - [super dealloc]; -} -@end - -@implementation TextFieldCell : UITableViewCell - -- (void) dealloc { - [_titleLabel release]; - [_textField release]; - [super dealloc]; -} -@end - -@implementation ColorCell : UITableViewCell -- (void) setColor:(UIColor *)color { - if (color != nil) { - self.colorButton.backgroundColor = color; - } else { - self.colorButton.backgroundColor = [UIColor lightGrayColor]; - } -} - -- (UIColor *)color { - return self.colorButton.backgroundColor; -} - -- (void) dealloc { - [_titleLabel release]; - [_colorButton release]; - [super dealloc]; -} -@end - -@implementation HideChevronCell : UITableViewCell - -- (void) dealloc { - [_hideChevronSwitch release]; - [super dealloc]; -} -@end - -@implementation InAppMessageButtonCell : UITableViewCell -- (void) setButton:(ABKInAppMessageButton *)button { - [_button release]; - _button = [button retain]; - self.titleTextField.text = button.buttonText; - if (button.buttonTextColor) { - self.textColorButton.backgroundColor = button.buttonTextColor; - } - if (button.buttonBackgroundColor) { - self.backgroundColorButton.backgroundColor = button.buttonBackgroundColor; - } - self.actionSegmentControl.selectedSegmentIndex = button.buttonClickActionType; - self.URITextField.text = [button.buttonClickedURI absoluteString]; -} - -- (BOOL) textFieldShouldReturn:(UITextField *)textField { - [textField resignFirstResponder]; - if (textField == self.titleTextField) { - self.button.buttonText = textField.text; - } else if (textField == self.URITextField) { - self.buttonURL = [NSURL URLWithString:textField.text]; - if (self.actionSegmentControl.selectedSegmentIndex == 2) { - [self.button setButtonClickAction:ABKInAppMessageRedirectToURI - withURI:self.buttonURL]; - } - } - return YES; -} - -- (IBAction) changeColor:(UIButton *)sender { - KKColorListViewController *colorListViewController = [[KKColorListViewController alloc] initWithSchemeType:KKColorsSchemeTypeCrayola]; - colorListViewController.delegate = self; - sender.selected = YES; - [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:colorListViewController animated:YES completion:nil]; - [colorListViewController release]; -} - -- (void) colorListController:(KKColorListViewController *)controller didSelectColor:(KKColor *)color { - if (self.textColorButton.selected) { - self.textColorButton.backgroundColor = [color uiColor]; - self.button.buttonTextColor = self.textColorButton.backgroundColor; - self.textColorButton.selected = NO; - } else if (self.backgroundColorButton.selected) { - self.backgroundColorButton.backgroundColor = [color uiColor]; - self.button.buttonBackgroundColor = self.backgroundColorButton.backgroundColor; - self.backgroundColorButton.selected = NO; - } -} - -- (void)colorListPickerDidComplete:(KKColorListViewController *)controller { - [controller dismissViewControllerAnimated:YES completion:nil]; -} - -- (IBAction)actionChanged:(UISegmentedControl *)sender { - switch (sender.selectedSegmentIndex) { - case 0: - [self.button setButtonClickAction:ABKInAppMessageDisplayNewsFeed withURI:nil]; - break; - case 1: - [self.button setButtonClickAction:ABKInAppMessageNoneClickAction withURI:nil]; - break; - case 2: - [self.button setButtonClickAction:ABKInAppMessageRedirectToURI withURI:self.buttonURL]; - break; - default: - break; - } -} - -- (void) dealloc { - [_textColorButton release]; - [_backgroundColorButton release]; - [_actionSegmentControl release]; - [_URITextField release]; - [_button release]; - [_buttonURL release]; - [super dealloc]; -} -@end diff --git a/Example/Stopwatch/InAppMessageUIViewController.h b/Example/Stopwatch/InAppMessageUIViewController.h deleted file mode 100644 index cbd936efb..000000000 --- a/Example/Stopwatch/InAppMessageUIViewController.h +++ /dev/null @@ -1,17 +0,0 @@ -#import -#import "KKColorListPicker.h" - -@class ABKSlideup; - -@interface InAppMessageUIViewController : UIViewController -@property (retain, nonatomic) NSMutableArray *inAppSlideupList; -@property (retain, nonatomic) NSMutableArray *inAppModalList; -@property (retain, nonatomic) NSMutableArray *inAppFullList; -@property (retain, nonatomic) NSMutableDictionary *inAppMessageDictionary; -@property (retain, nonatomic) IBOutlet UISegmentedControl *inAppMessageTypeSegment; -@property (retain, nonatomic) IBOutlet UITableView *tableView; - -- (IBAction) inAppMessageTypeChanged:(id)sender; - -@end diff --git a/Example/Stopwatch/InAppMessageUIViewController.m b/Example/Stopwatch/InAppMessageUIViewController.m deleted file mode 100644 index 6eb3ea74d..000000000 --- a/Example/Stopwatch/InAppMessageUIViewController.m +++ /dev/null @@ -1,329 +0,0 @@ -#import "InAppMessageUIViewController.h" -#import "InAppMessageUICells.h" -#import "AppboyKit.h" - -static const int TableViewTopY = 94; -static const NSInteger textFieldTagNumber = 50; -static const CGFloat ButtonTableViewCellHeight = 176.0f; -static const CGFloat NormalTableViewCellHeight = 44.0f; - -static const int CustomInAppMessageDuration = 5; - -@implementation InAppMessageUIViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - self.inAppMessageDictionary = [NSMutableDictionary dictionaryWithCapacity:3]; - self.inAppSlideupList = [NSMutableArray arrayWithArray: - @[ItemIcon, ItemIconBackgroundColor, ItemImageURL, ItemMessage, ItemBodyColor, ItemBackgroundColor, ItemHideChevron, ItemChevronColor, - ItemClickAction, ItemClickActionURL, ItemDismissType, ItemDuration, ItemAnimatedFrom]]; - self.inAppModalList = [NSMutableArray arrayWithArray: - @[ItemIcon, ItemIconBackgroundColor, ItemImageURL, ItemIconColor, ItemHeader, ItemHeaderColor, ItemMessage, ItemBodyColor, ItemBackgroundColor, ItemCloseButtonColor, - ItemClickAction, ItemClickActionURL, ItemDismissType, ItemDuration, ItemButtonNumber]]; - self.inAppFullList = [NSMutableArray arrayWithArray: - @[ItemImageURL, ItemHeader, ItemHeaderColor, ItemMessage, ItemBodyColor, ItemBackgroundColor, ItemCloseButtonColor, - ItemClickAction, ItemClickActionURL, ItemDismissType, ItemDuration, ItemButtonNumber]]; - self.inAppMessageDictionary[ItemImageURL] = @"http://i49.vbox7.com/o/9f9/9f9fba82c00.jpg"; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; -} - -- (IBAction) inAppMessageTypeChanged:(id)sender { - [self.tableView reloadData]; -} - -- (void) dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; - [_inAppSlideupList release]; - [_inAppModalList release]; - [_inAppFullList release]; - [_inAppMessageTypeSegment release]; - [_tableView release]; - [_inAppMessageDictionary release]; - [super dealloc]; -} - -- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [self currentArrayList].count; -} - -- (NSMutableArray *)currentArrayList { - switch (self.inAppMessageTypeSegment.selectedSegmentIndex) { - case 0: - return self.inAppSlideupList; - case 1: - return self.inAppModalList; - case 2: - return self.inAppFullList; - default: - return self.inAppSlideupList; - } - return nil; -} - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - NSString *item = [self currentArrayList][indexPath.row]; - if ([item isEqualToString:ItemButtonOne] || [item isEqualToString:ItemButtonTwo]) { - return ButtonTableViewCellHeight; - } else { - return NormalTableViewCellHeight; - } -} - -- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - NSString *item = [self currentArrayList][indexPath.row]; - UITableViewCell *cell = nil; - if ([item isEqualToString:ItemClickAction] || - [item isEqualToString:ItemDismissType] || - [item isEqualToString:ItemAnimatedFrom] || - [item isEqualToString:ItemButtonNumber]) { - cell = [self createCellWithCellIdentifier:CellIdentifierSegment withClass:[SegmentCell class] tableView:tableView]; - [(SegmentCell *) cell setUpWithItem:item]; - if (self.inAppMessageDictionary[item]) { - ((SegmentCell *) cell).segmentControl.selectedSegmentIndex = [self.inAppMessageDictionary[item] integerValue]; - } else { - self.inAppMessageDictionary[((SegmentCell *)cell).titleLabel.text] = [NSNumber numberWithInteger:0]; - } - } else if ([item isEqualToString:ItemMessage] || - [item isEqualToString:ItemIcon] || - [item isEqualToString:ItemImageURL] || - [item isEqualToString:ItemHeader] || - [item isEqualToString:ItemClickActionURL] || - [item isEqualToString:ItemDuration]) { - cell = [self createCellWithCellIdentifier:CellIdentifierText withClass:[TextFieldCell class] tableView:tableView]; - ((TextFieldCell *) cell).titleLabel.text = item; - ((TextFieldCell *) cell).textField.text = self.inAppMessageDictionary[item]; - ((TextFieldCell *) cell).textField.delegate = self; - ((TextFieldCell *) cell).textField.tag = [item isEqualToString:ItemIcon] ? textFieldTagNumber : 0; - } else if ([item isEqualToString:ItemHeaderColor] || - [item isEqualToString:ItemBodyColor] || - [item isEqualToString:ItemBackgroundColor] || - [item isEqualToString:ItemIconColor] || - [item isEqualToString:ItemIconBackgroundColor] || - [item isEqualToString:ItemChevronColor] || - [item isEqualToString:ItemCloseButtonColor]) { - cell = [self createCellWithCellIdentifier:CellIdentifierColor withClass:[ColorCell class] tableView:tableView]; - ((ColorCell *)cell).titleLabel.text = item; - [(ColorCell *) cell setColor:self.inAppMessageDictionary[item]]; - } else if ([item isEqualToString:ItemHideChevron]) { - cell = [self createCellWithCellIdentifier:CellIdentifierChevron withClass:[HideChevronCell class] tableView:tableView]; - ((HideChevronCell *) cell).hideChevronSwitch.on = [self.inAppMessageDictionary[item] boolValue]; - } else if ([item isEqualToString:ItemButtonOne] || - [item isEqualToString:ItemButtonTwo]) { - cell = [self createCellWithCellIdentifier:CellIdentifierButton withClass:[InAppMessageButtonCell class] tableView:tableView]; - ((InAppMessageButtonCell *)cell).button = self.inAppMessageDictionary[item]; - } - return cell; -} - -- (UITableViewCell *) createCellWithCellIdentifier:(NSString *)identifier withClass:(Class)cellClass tableView:(UITableView *)tableView { - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; - if (cell == nil && [cellClass isKindOfClass:[UITableViewCell class]]) { - cell = [(UITableViewCell *)[[cellClass alloc] init] autorelease]; - } - return cell; -} - -- (IBAction)changeColor:(UIButton *)sender { - UIView *cell = sender.superview; - while (![cell isKindOfClass:[ColorCell class]] && cell.superview != nil) { - cell = cell.superview; - } - KKColorListViewController *colorListViewController = [[KKColorListViewController alloc] initWithSchemeType:KKColorsSchemeTypePantone]; - colorListViewController.delegate = self; - colorListViewController.headerTitle = [cell isKindOfClass:[ColorCell class]] ? ((ColorCell *)cell).titleLabel.text : nil; - [self presentViewController:colorListViewController animated:YES completion:nil]; - [colorListViewController release]; -} - -- (void)colorListPickerDidComplete:(KKColorListViewController *)controller { - [controller dismissViewControllerAnimated:YES completion:nil]; -} - -- (void)colorListController:(KKColorListViewController *)controller didSelectColor:(KKColor *)color { - NSString *item = controller.headerTitle; - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:[[self currentArrayList] indexOfObject:item] inSection:0]; - ColorCell *cell = (ColorCell *)[self.tableView cellForRowAtIndexPath:indexPath]; - [cell setColor:[color uiColor]]; - self.inAppMessageDictionary[item] = [color uiColor]; -} - -- (IBAction)hideChevronChanged:(UISwitch *)sender { - self.inAppMessageDictionary[ItemHideChevron] = [NSNumber numberWithBool:sender.on]; -} - -- (IBAction)buttonSegmentChanged:(UISegmentedControl *)sender { - UIView *cell = sender.superview; - while (![cell isKindOfClass:[SegmentCell class]] && cell.superview != nil) { - cell = cell.superview; - } - if ([cell isKindOfClass:[SegmentCell class]]) { - self.inAppMessageDictionary[((SegmentCell *)cell).titleLabel.text] = [NSNumber numberWithInteger:sender.selectedSegmentIndex]; - if ([((SegmentCell *)cell).titleLabel.text isEqualToString:ItemButtonNumber]) { - switch (sender.selectedSegmentIndex) { - case 0: - [[self currentArrayList] removeObject:ItemButtonOne]; - [[self currentArrayList] removeObject:ItemButtonTwo]; - [self.inAppMessageDictionary removeObjectsForKeys:@[ItemButtonTwo, ItemButtonOne]]; - break; - case 1: - [[self currentArrayList] removeObject:ItemButtonTwo]; - [self.inAppMessageDictionary removeObjectForKey:ItemButtonTwo]; - if ([[self currentArrayList] indexOfObject:ItemButtonOne] == NSNotFound) { - [[self currentArrayList] addObject:ItemButtonOne]; - self.inAppMessageDictionary[ItemButtonOne] = [[[ABKInAppMessageButton alloc] init] autorelease]; - } - break; - case 2: - if ([[self currentArrayList] indexOfObject:ItemButtonOne] == NSNotFound) { - [[self currentArrayList] addObject:ItemButtonOne]; - self.inAppMessageDictionary[ItemButtonOne] = [[[ABKInAppMessageButton alloc] init] autorelease]; - } - if ([[self currentArrayList] indexOfObject:ItemButtonTwo] == NSNotFound) { - [[self currentArrayList] addObject:ItemButtonTwo]; - self.inAppMessageDictionary[ItemButtonTwo] = [[[ABKInAppMessageButton alloc] init] autorelease]; - } - break; - default: - break; - } - [self.tableView reloadData]; - } - } -} - -- (BOOL) textFieldShouldReturn:(UITextField *)textField { - [textField resignFirstResponder]; - return YES; -} - -- (void) textFieldDidEndEditing:(UITextField *)textField { - UIView *cell = textField.superview; - while (![cell isKindOfClass:[TextFieldCell class]] && cell.superview != nil) { - cell = cell.superview; - } - if ([cell isKindOfClass:[TextFieldCell class]]) { - self.inAppMessageDictionary[((TextFieldCell *)cell).titleLabel.text] = textField.text; - } -} - -- (IBAction) displayInAppMessage:(id)sender { - ABKInAppMessage *inAppMessage = nil; - switch (self.inAppMessageTypeSegment.selectedSegmentIndex) { - case 2: - inAppMessage = [[ABKInAppMessageFull alloc] init]; - break; - case 1: - inAppMessage = [[ABKInAppMessageModal alloc] init]; - break; - case 0: - default: - inAppMessage = [[ABKInAppMessageSlideup alloc] init]; - break; - } - for (NSString *key in [self.inAppMessageDictionary allKeys]) { - if ([key isEqualToString:ItemIcon]) { - NSString *icon = [self.inAppMessageDictionary[key] lowercaseString]; - inAppMessage.icon = icon; - } else if ([key isEqualToString:ItemImageURL]) { - if ([(NSString *)self.inAppMessageDictionary[key] length] > 0) { - inAppMessage.imageURI = [NSURL URLWithString:self.inAppMessageDictionary[key]]; - } - } else if ([key isEqualToString:ItemIconColor]) { - inAppMessage.iconColor = self.inAppMessageDictionary[key]; - } else if ([key isEqualToString:ItemIconBackgroundColor]) { - inAppMessage.iconBackgroundColor = self.inAppMessageDictionary[key]; - } else if ([key isEqualToString:ItemMessage]) { - inAppMessage.message = self.inAppMessageDictionary[key]; - } else if ([key isEqualToString:ItemBodyColor]) { - inAppMessage.textColor = self.inAppMessageDictionary[key]; - } else if ([key isEqualToString:ItemBackgroundColor]) { - inAppMessage.backgroundColor = self.inAppMessageDictionary[key]; - } else if ([key isEqualToString:ItemDismissType]) { - switch ([self.inAppMessageDictionary[key] integerValue]) { - case 0: - inAppMessage.inAppMessageDismissType = ABKInAppMessageDismissAutomatically; - break; - case 1: - inAppMessage.inAppMessageDismissType = ABKInAppMessageDismissManually; - break; - default: - break; - } - } else if ([key isEqualToString:ItemClickAction]) { - ABKInAppMessageClickActionType clickAction; - switch ([self.inAppMessageDictionary[key] integerValue]) { - case 0: - default: - clickAction = ABKInAppMessageDisplayNewsFeed; - break; - case 1: - clickAction = ABKInAppMessageNoneClickAction; - break; - case 2: - clickAction = ABKInAppMessageRedirectToURI; - break; - } - [inAppMessage setInAppMessageClickAction:clickAction withURI:[NSURL URLWithString:self.inAppMessageDictionary[ItemClickActionURL]]]; - } else if ([key isEqualToString:ItemDuration]) { - if ([self.inAppMessageDictionary[key] doubleValue] != 0.0) { - inAppMessage.duration = [self.inAppMessageDictionary[key] doubleValue]; - } else { - inAppMessage.duration = CustomInAppMessageDuration; - } - } - - if ([inAppMessage isKindOfClass:[ABKInAppMessageSlideup class]]) { - ABKInAppMessageSlideup *inAppSlideup = (ABKInAppMessageSlideup *) inAppMessage; - if ([key isEqualToString:ItemHideChevron]) { - inAppSlideup.hideChevron = [self.inAppMessageDictionary[key] boolValue]; - } else if ([key isEqualToString:ItemChevronColor]) { - inAppSlideup.chevronColor = self.inAppMessageDictionary[key]; - } else if ([key isEqualToString:ItemAnimatedFrom]) { - switch ([self.inAppMessageDictionary[key] integerValue]) { - case 0: - inAppSlideup.inAppMessageSlideupAnchor = ABKInAppMessageSlideupFromBottom; - break; - case 1: - inAppSlideup.inAppMessageSlideupAnchor = ABKInAppMessageSlideupFromTop; - break; - default: - break; - } - } - } else if ([inAppMessage isKindOfClass:[ABKInAppMessageImmersive class]]) { - ABKInAppMessageImmersive *inAppImmersive = (ABKInAppMessageImmersive *) inAppMessage; - if ([key isEqualToString:ItemHeader]) { - inAppImmersive.header = self.inAppMessageDictionary[key]; - } else if ([key isEqualToString:ItemHeaderColor]) { - inAppImmersive.headerTextColor = self.inAppMessageDictionary[key]; - } else if ([key isEqualToString:ItemCloseButtonColor]) { - inAppImmersive.closeButtonColor = self.inAppMessageDictionary[key]; - } else if ([key isEqualToString:ItemButtonOne]) { - if (self.inAppMessageDictionary[ItemButtonTwo] != nil) { - [inAppImmersive setInAppMessageButtons: @[self.inAppMessageDictionary[ItemButtonOne], self.inAppMessageDictionary[ItemButtonTwo]]]; - } else { - [inAppImmersive setInAppMessageButtons:@[self.inAppMessageDictionary[ItemButtonOne]]]; - } - } - } - } - [[Appboy sharedInstance].inAppMessageController addInAppMessage:inAppMessage]; - [inAppMessage release]; -} - -- (void) keyboardDidShow:(NSNotification *)notification { - NSDictionary* info = [notification userInfo]; - CGSize keyboardSize = [info[UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; - CGFloat keyboardHeight = keyboardSize.height < keyboardSize.width ? keyboardSize.height : keyboardSize.width; - CGRect aRect = self.tableView.frame; - aRect.size.height = self.view.bounds.size.height - keyboardHeight - TableViewTopY; - self.tableView.frame = aRect; -} - -- (void) keyboardWillHide:(NSNotification *)notification { - CGRect aRect = self.tableView.frame; - aRect.size.height = self.view.bounds.size.height - TableViewTopY; - self.tableView.frame = aRect; -} -@end diff --git a/Example/Stopwatch/SlideupTestViewController.h b/Example/Stopwatch/SlideupTestViewController.h new file mode 100644 index 000000000..7bb0f9beb --- /dev/null +++ b/Example/Stopwatch/SlideupTestViewController.h @@ -0,0 +1,13 @@ +#import +#import + +@interface SlideupTestViewController : UIViewController + +@property (nonatomic, retain) IBOutlet UISegmentedControl *segmentedControlForSlideupMode; +@property (nonatomic, retain) IBOutlet UIButton *displayNextAvailableSlideupButton; +@property (nonatomic, assign) BOOL shouldDisplaySlideup; +@property (retain, nonatomic) IBOutlet UISegmentedControl *slideupAnchorSegmentedControl; +@property (retain, nonatomic) IBOutlet UISegmentedControl *slideupDismissTypeSegmentedControl; + +- (IBAction) displayNextAvailableSlideupPressed:(id)sender; +@end diff --git a/Example/Stopwatch/SlideupTestViewController.m b/Example/Stopwatch/SlideupTestViewController.m new file mode 100755 index 000000000..ad6c4b6e7 --- /dev/null +++ b/Example/Stopwatch/SlideupTestViewController.m @@ -0,0 +1,192 @@ +#import "SlideupTestViewController.h" +#import "Crittercism.h" +#import "CustomSlideupViewController.h" + +@implementation SlideupTestViewController + +/* + * For further details regarding slideup delegate methods and stacking mechanisms, please see + * ABKSlideupContollerDelegate.h and ABKSlideupController.h + */ + +#pragma mark Appboy Slideup Delegate methods + +// This delegate method is called every time a new slideup is received from the Appboy server. +// Implementing this method is OPTIONAL. The default behavior is equivalent to a return of NO from this method. In other +// words, Appboy will handle the slideup display automatically if this delegate method is not implemented. +- (BOOL) onSlideupReceived:(ABKSlideup *)slideup { + //Return NO when you want Appboy to handle the slideup display. + return NO; +} + +/*! + * This callback method allows you to specify if each slideup should be displayed. It is called just before each slideup + * is displayed. + * + * Return values for beforeSlideupDisplayed:withKeyboardIsUp: + *  ABKDisplaySlideupNow - The slideup gets displayed immediately. + *  ABKDisplaySlideupLater - Put this slideup back to stack for later display. + *  ABKDiscardSlideup - Completely discard the slideup. + * + * Slideup queuing: + * + * Arriving slideups are stacked when they can't be displayed for one of these reasons: + * - Another slideup is visible + * - If the beforeSlideupDisplayed:withKeyboardIsUp: delegate method HAS NOT been implemented and keyboard is being + * displayed currently. + * - If the beforeSlideupDisplayed:withKeyboardIsUp: delegate method returned ABKDisplaySlideupLater + * + * Slideups are potentially removed from the slideup stack and displayed when: + * - Another slideup arrives and onSlideupReceived: DOES NOT return YES. + * - The application comes to the foreground after being backgrounded + * - displayNextSlideupWithDelegate is called + * + * If one of these events occurs and the slideup can't be displayed, it remains in the stack. + * + * Note that if you unset the slideupDelegate after some slideups have been stacked, the accumulated stacked slideups + * will be displayed according to the above scheme. + */ +- (ABKSlideupDisplayChoice) beforeSlideupDisplayed:(ABKSlideup *)slideup + withKeyboardIsUp:(BOOL)keyboardIsUp { + NSLog(@"Received slideup with message: %@", slideup.message); + slideup.hideChevron = YES; + + // Set up the slideup's anchor and dismiss type based on slideupAnchorButton and slideupDismissTypeButton's content. + if (self.slideupAnchorSegmentedControl.selectedSegmentIndex == 0) { + slideup.slideupAnchor = ABKSlideupFromBottom; + } else { + slideup.slideupAnchor = ABKSlideupFromTop; + } + // We want to display the slideup from the top if there is a keyboard being displayed on the screen. + if (keyboardIsUp) { + slideup.slideupAnchor = ABKSlideupFromTop; + } + + if (self.slideupDismissTypeSegmentedControl.selectedSegmentIndex == 0) { + slideup.slideupDismissType = ABKSlideupDismissAutomatically; + } else { + slideup.slideupDismissType = ABKSlideupDismissBySwipe; + } + + // /Check if the delegate is called by a click on the "Display Next Available slideup" button. + if (self.shouldDisplaySlideup && self.segmentedControlForSlideupMode.selectedSegmentIndex == 1) { + // If the slideup mode is ABKDisplaySlideupLater and the user has clicked the "Display Next Available Slideup" + // button, this will display the next available slideup. + return ABKDisplaySlideupNow; + } else { + switch (self.segmentedControlForSlideupMode.selectedSegmentIndex) { + case 0: + return ABKDisplaySlideupNow; + + case 1: + return ABKDisplaySlideupLater; + + case 2: + return ABKDiscardSlideup; + + default: + return ABKDisplaySlideupNow; + } + } +} + +// This delegate method asks if there is any custom slideup view controller that developers want to pass in. The returned +// view controller should be a subclass of ABKSlideupViewController. Alternatively, it can also be an instance of +// ABKSlideupViewController. Also, the view of the returned view controller should be an instance of ABKSlideupView or +// its subclass. +- (ABKSlideupViewController *) slideupViewControllerWithSlideup:(ABKSlideup *)slideup { + CustomSlideupViewController *customSlideup = [[[CustomSlideupViewController alloc] initWithSlideup:slideup] autorelease]; + return customSlideup; +} + +// This delegate method is notified if the slideup is tapped. You can use this to initiate an action +// in response to the tap. Note that when the delegate returns NO, Appboy SDK will perform the action sent down from +// the Appboy Server after the delegate method is executed. If it returns YES, the response to the tap is up to you. +- (BOOL) onSlideupClicked:(ABKSlideup *)slideup { + NSLog(@"Slideup tapped!"); + UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Appboy.Stopwatch", nil) + message:NSLocalizedString(@"Appboy.Stowpatch.slideup-test.slideup-is-tap", nil) + delegate:nil + cancelButtonTitle:NSLocalizedString(@"Appboy.Stopwatch.alert.cancel-button.title", nil) + otherButtonTitles:nil]; + [alertView show]; + [alertView release]; + [slideup setSlideupClickActionToNone]; + // Returning YES here to prevent Appboy from performing the click action. + return YES; +} + +#pragma mark Stopwatch view controller methods + +- (void) viewDidLoad { + [super viewDidLoad]; + + if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) { + // In iOS 7, views are automatically extended to fit the size of the screen. Therefore, views may end up under + // the navigation bar, which makes some buttons invisible or unclickable. In order to prevent this behaviour, we set + // the Extended Layout mode to UIRectEdgeNone. + self.edgesForExtendedLayout = UIRectEdgeNone; + } +} + +- (void) viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + // Here we set self as the slideup controller delegate to enable slideup customization on this page. + [Appboy sharedInstance].slideupController.delegate = self; +} + +- (void) viewDidDisappear:(BOOL)animated { + [super viewDidDisappear:animated]; + [Appboy sharedInstance].slideupController.delegate = nil; +} +// If we've been returning ABKDisplaySlideupLater and slideups have arrived, they'll be put in the stack. Here, take +// one off the stack and display it. +- (IBAction) displayNextAvailableSlideupPressed:(id)sender { + [Crittercism leaveBreadcrumb:@"display next available slideup"]; + + self.shouldDisplaySlideup = YES; + [[Appboy sharedInstance].slideupController displayNextSlideupWithDelegate:self]; + self.shouldDisplaySlideup = NO; +} + +- (void) dealloc { + [_segmentedControlForSlideupMode release]; + [_displayNextAvailableSlideupButton release]; + [_slideupAnchorSegmentedControl release]; + [_slideupDismissTypeSegmentedControl release]; + [super dealloc]; +} + +- (void) viewDidUnload { + [Crittercism leaveBreadcrumb:@"slideup delegate is nil now"]; + [self setSegmentedControlForSlideupMode:nil]; + [self setDisplayNextAvailableSlideupButton:nil]; + [self setSlideupAnchorSegmentedControl:nil]; + [self setSlideupDismissTypeSegmentedControl:nil]; + [super viewDidUnload]; +} + +- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { + return (toInterfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); + } + return toInterfaceOrientation == UIInterfaceOrientationPortrait; +} + +- (IBAction)createAndDisplayACustomSlideup:(id)sender { + [Crittercism leaveBreadcrumb:@"create and display a custom slideup"]; + + ABKSlideup *customSlideup = [[ABKSlideup alloc] init]; + customSlideup.message = NSLocalizedString(@"Appboy.Stowpatch.slideup-test.custom-slideup-message", nil); + customSlideup.duration = 2.5; + self.shouldDisplaySlideup = YES; + [[Appboy sharedInstance].slideupController addSlideup:customSlideup]; + self.shouldDisplaySlideup = NO; + [customSlideup release]; +} + +- (IBAction)dismissCurrentSlideup:(id)sender { + [[Appboy sharedInstance].slideupController hideCurrentSlideup:YES]; +} + +@end diff --git a/Example/Stopwatch/SocialNetworkViewController.h b/Example/Stopwatch/SocialNetworkViewController.h deleted file mode 100644 index 6080b7376..000000000 --- a/Example/Stopwatch/SocialNetworkViewController.h +++ /dev/null @@ -1,13 +0,0 @@ -#import - -@interface SocialNetworkViewController : UIViewController - -@property (retain, nonatomic) IBOutlet UITextView *facebookDataTextView; -@property (retain, nonatomic) NSDictionary *facebookUserProfile; -@property (retain, nonatomic) NSArray *facebookLikes; -@property (assign, nonatomic) NSInteger numberOfFacebookFriends; - -// This method will prompt the user for permission to use facebook account data from iOS system. -- (IBAction)fetchFacebookAccountData:(id)sender; -- (IBAction)passFacebookDataToAppboy:(id)sender; -@end diff --git a/Example/Stopwatch/SocialNetworkViewController.m b/Example/Stopwatch/SocialNetworkViewController.m deleted file mode 100644 index e38c0ef3b..000000000 --- a/Example/Stopwatch/SocialNetworkViewController.m +++ /dev/null @@ -1,113 +0,0 @@ -#import "SocialNetworkViewController.h" -#import -#import -#import "AppboyKit.h" - -static NSString *const FacebookIDPlistKey = @"FacebookAppID"; -static NSString *const FacebookUserProfileEndpointUrl = @"https://graph.facebook.com/me"; -static NSString *const FacebookLikesEndpointUrl = @"https://graph.facebook.com/me/likes"; -static NSString *const FacebookFriendsEndpointUrl = @"https://graph.facebook.com/me/friends"; - -@implementation SocialNetworkViewController - -- (void)dealloc { - [_facebookDataTextView release]; - [super dealloc]; -} - -/* - * This method prompts user to connect the Facebook acount on the device, and fetch account data. - * It can only fetch the Facebook data when: - * The plist has Facebook ID set up. - * There is at least one Facebook account signed in on the device. - * - * If the user has grants permissions, the method will send three requests to fetch user's profile data, - * friends, and likes, and store them in the properties. - * You can use this method as a replacement of - * [[Appboy sharedInstance] promptUserForAccessToSocialNetwork:ABKSocialNetworkFacebook]. - * - * After getting all the user's Facebook data, you can pass the information to Appboy using - * method "- (IBAction)passFacebookDataToAppboy:(id)sender"; - */ -- (void) promptUserToConnectFacebookAccountOnDeviceAndFetchAccountData { - ACAccountStore *store = [[ACAccountStore alloc] init]; - // Please put your Facebook ID in the app's plist file with key "FacebookAppID" - NSString *facebookID = [[NSBundle mainBundle] infoDictionary][FacebookIDPlistKey]; - // Here you can change Facebook read permission. - NSArray *facebookPermission = @[@"user_about_me", @"email", @"user_hometown", @"user_likes", @"user_birthday"]; - ACAccountType *facebookAccountType = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook]; - NSDictionary *options = @{ACFacebookAppIdKey : facebookID, ACFacebookPermissionsKey : facebookPermission}; - - void (^requestAccessCompletionBlock)(ACAccount *, NSString *) = ^(ACAccount *account, NSString *endPointUrl) { - // Now make an authenticated request to our endpoint - NSURL *url = [NSURL URLWithString:endPointUrl]; - // Build the request with our parameter - SLRequest *request = [SLRequest requestForServiceType:SLServiceTypeFacebook requestMethod:SLRequestMethodGET URL:url parameters:nil]; - [request setAccount:account]; - - [request performRequestWithHandler: - ^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { - if (!responseData) { - NSLog(@"Error from Facebook response: %@", error); - } else { - NSError *jsonError; - NSDictionary *result = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&jsonError]; - if ([endPointUrl isEqualToString:FacebookUserProfileEndpointUrl]) { - self.facebookUserProfile = result; - } else if ([endPointUrl isEqualToString:FacebookLikesEndpointUrl]) { - self.facebookLikes = result[@"data"]; - } else if ([endPointUrl isEqualToString:FacebookFriendsEndpointUrl]) { - self.numberOfFacebookFriends = ((NSArray *)result[@"data"]).count; - } - dispatch_async(dispatch_get_main_queue(), ^{ - // The block is called in the background thread, so here we need to make sure to update the UI in the main thread. - self.facebookDataTextView.text =[[result description] stringByAppendingString:self.facebookDataTextView.text]; - }); - } - }]; - }; - - // Request permission from the user to access the available Facebook accounts - [store requestAccessToAccountsWithType:facebookAccountType - options:options - completion:^(BOOL granted, NSError *error) { - if (error) { - NSLog(@"Error returned from OS Facebook access request: %@", error); - return; - } - if (!granted) { - NSLog(@"No Facebook account connected to the device, or user rejected request."); - } else { - // Grab the available accounts - NSArray *facebookAccounts = [store accountsWithAccountType:facebookAccountType]; - - if ([facebookAccounts count] > 0) { - // Use the first account for simplicity - ACAccount *account = facebookAccounts[0]; - - [store renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *renewError) { - if (renewError) { - NSLog(@"Error encountered while renewing Facebook account: %@", error); - } else { - NSLog(@"Renewed Facebook access token with status %d", renewResult); - requestAccessCompletionBlock(account, FacebookUserProfileEndpointUrl); - requestAccessCompletionBlock(account, FacebookLikesEndpointUrl); - requestAccessCompletionBlock(account, FacebookFriendsEndpointUrl); - } - [store release]; - }]; - } - } - }]; -} - -- (IBAction)fetchFacebookAccountData:(id)sender { - [self promptUserToConnectFacebookAccountOnDeviceAndFetchAccountData]; -} - -// Pass the user's Facebook data to Appboy -- (IBAction)passFacebookDataToAppboy:(id)sender { - ABKFacebookUser *facebookUser = [[[ABKFacebookUser alloc] initWithFacebookUserDictionary:self.facebookUserProfile numberOfFriends:self.numberOfFacebookFriends likes:self.facebookLikes] autorelease]; - [Appboy sharedInstance].user.facebookUser = facebookUser; -} -@end diff --git a/Example/Stopwatch/Stopwatch-Info.plist b/Example/Stopwatch/Stopwatch-Info.plist index e98a63c17..0ef33552b 100644 --- a/Example/Stopwatch/Stopwatch-Info.plist +++ b/Example/Stopwatch/Stopwatch-Info.plist @@ -1,80 +1,66 @@ + - - - AppboyAPIKeys - - AU - 784e4c1e-3f7f-4d77-a1df-7806a049f05a - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIcons - - CFBundleIcons~ipad - - CFBundleIdentifier - com.appboy.stopwatch.production - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 2.11.2 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLName - com.appboy.stopwatch - CFBundleURLSchemes - - stopwatch - - - - CFBundleVersion - 1 - FacebookAppID - 631617900200059 - LSRequiresIPhoneOS - - NSLocationWhenInUseUsageDescription - Please share your location. - UIBackgroundModes - - remote-notification - - UIMainStoryboardFile - MainStoryboard_iPhone - UIMainStoryboardFile~ipad - MainStoryboard_iPad - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - + + + AppboyAPIKeys + + AU + 784e4c1e-3f7f-4d77-a1df-7806a049f05a + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIcons + + CFBundleIcons~ipad + + CFBundleIdentifier + com.appboy.stopwatch.production + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 2.9.6 + CFBundleSignature + ???? + CFBundleVersion + 2.9.6 + FacebookAppID + 631617900200059 + LSRequiresIPhoneOS + + NSLocationWhenInUseUsageDescription + Please share your location. + UIBackgroundModes + + remote-notification + + UIMainStoryboardFile + MainStoryboard_iPhone + UIMainStoryboardFile~ipad + MainStoryboard_iPad + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + diff --git a/Example/Stopwatch/TestingViewController.m b/Example/Stopwatch/TestingViewController.m index 679f12591..493370f4b 100755 --- a/Example/Stopwatch/TestingViewController.m +++ b/Example/Stopwatch/TestingViewController.m @@ -1,5 +1,5 @@ #import "TestingViewController.h" -#import "InAppMessageTestViewController.h" +#import "SlideupTestViewController.h" #import @implementation TestingViewController diff --git a/Example/Stopwatch/UserAttributesViewController.m b/Example/Stopwatch/UserAttributesViewController.m index 4d968e5c5..281c75503 100755 --- a/Example/Stopwatch/UserAttributesViewController.m +++ b/Example/Stopwatch/UserAttributesViewController.m @@ -15,17 +15,17 @@ @implementation UserAttributesViewController - (void) viewDidLoad { [super viewDidLoad]; - self.attributesLabelsArray = @[NSLocalizedString(@"Appboy.Stopwatch.user-attributes.user-ID", nil), - NSLocalizedString(@"Appboy.Stopwatch.user-attributes.first-name", nil), - NSLocalizedString(@"Appboy.Stopwatch.user-attributes.last-name", nil), - NSLocalizedString(@"Appboy.Stopwatch.user-attributes.email", nil), - NSLocalizedString(@"Appboy.Stopwatch.user-attributes.country", nil), - NSLocalizedString(@"Appboy.Stopwatch.user-attributes.home-city", nil), - NSLocalizedString(@"Appboy.Stopwatch.user-attributes.bio", nil), - NSLocalizedString(@"Appboy.Stopwatch.user-attributes.gender", nil), - NSLocalizedString(@"Appboy.Stopwatch.user-attributes.phone", nil), - NSLocalizedString(@"Appboy.Stopwatch.user-attributes.date-of-birth", nil), - NSLocalizedString(@"Appboy.Stopwatch.user-attributes.favorite-color", nil)]; + self.attributesLabelsArray = [NSArray arrayWithObjects:NSLocalizedString(@"Appboy.Stopwatch.user-attributes.user-ID", nil), + NSLocalizedString(@"Appboy.Stopwatch.user-attributes.first-name", nil), + NSLocalizedString(@"Appboy.Stopwatch.user-attributes.last-name", nil), + NSLocalizedString(@"Appboy.Stopwatch.user-attributes.email", nil), + NSLocalizedString(@"Appboy.Stopwatch.user-attributes.country", nil), + NSLocalizedString(@"Appboy.Stopwatch.user-attributes.home-city", nil), + NSLocalizedString(@"Appboy.Stopwatch.user-attributes.bio", nil), + NSLocalizedString(@"Appboy.Stopwatch.user-attributes.gender", nil), + NSLocalizedString(@"Appboy.Stopwatch.user-attributes.phone", nil), + NSLocalizedString(@"Appboy.Stopwatch.user-attributes.date-of-birth", nil), + NSLocalizedString(@"Appboy.Stopwatch.user-attributes.favorite-color", nil), nil]; if (attributesValuesArray == nil || [attributesValuesArray count] <= 0) { attributesValuesArray = [[NSMutableArray arrayWithCapacity:TotalNumberOfAttributes] retain]; @@ -56,7 +56,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N cell = [[[UserAttributeCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } - id object = attributesValuesArray[(NSUInteger)indexPath.row]; + id object = [attributesValuesArray objectAtIndex:(NSUInteger)indexPath.row]; if ([object isKindOfClass:[NSString class]] && ((NSString *)object).length == 1) { if ([(NSString *)object isEqualToString:@"m"]) { cell.attributeSegmentedControl.selectedSegmentIndex = 0; @@ -75,10 +75,10 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N if (cell == nil) { cell = [[[UserAttributeCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } - cell.attributeNameLabel.text = self.attributesLabelsArray[(NSUInteger)indexPath.row]; + cell.attributeNameLabel.text = [self.attributesLabelsArray objectAtIndex:(NSUInteger)indexPath.row]; cell.attributeTextField.tag = TextFieldTagNumber + indexPath.row; // The text field's tag is 1000 plus the row number - id object = attributesValuesArray[(NSUInteger)indexPath.row]; + id object = [attributesValuesArray objectAtIndex:(NSUInteger)indexPath.row]; if ([object isKindOfClass:[NSString class]]) { cell.attributeTextField.text = (NSString *)object; } @@ -159,17 +159,17 @@ - (BOOL)textFieldShouldEndEditing:(UITextField *)textField { } // Save the input of text field, including the cases of valid text and empty input if (textField.text.length > 0) { - attributesValuesArray[(NSUInteger)textField.tag - TextFieldTagNumber] = textField.text; + [attributesValuesArray replaceObjectAtIndex:(NSUInteger)textField.tag - TextFieldTagNumber withObject:textField.text]; } else { - attributesValuesArray[(NSUInteger)textField.tag - TextFieldTagNumber] = [NSNull null]; + [attributesValuesArray replaceObjectAtIndex:(NSUInteger)textField.tag - TextFieldTagNumber withObject:[NSNull null]]; } return YES; } - (void) datePickerValueChanged:(UIDatePicker *)sender { // Save the date value - attributesValuesArray[IndexOfBirthday] = sender.date; + [attributesValuesArray replaceObjectAtIndex:IndexOfBirthday withObject:sender.date]; // Display the date value in the text field while user changing the date picker ((UITextField *)[self.view viewWithTag:IndexOfBirthday + TextFieldTagNumber]).text = [self getBirthdayStringFromDate:sender.date]; @@ -177,17 +177,19 @@ - (void) datePickerValueChanged:(UIDatePicker *)sender { - (IBAction) setGender:(UISegmentedControl *)sender { NSString *gender = sender.selectedSegmentIndex == 0 ? @"m" : @"f"; - attributesValuesArray[IndexOfGender] = gender; + [attributesValuesArray replaceObjectAtIndex:IndexOfGender withObject:gender]; } // Set user attributes and/or change the current userID. See Appboy.h for a discussion about changing the userID. - (IBAction) doneButtonTapped:(id)sender { if (self.currentEditingTextField && self.currentEditingTextField.tag != IndexOfBirthday + TextFieldTagNumber) { if (self.currentEditingTextField.text.length > 0) { - attributesValuesArray[(NSUInteger)self.currentEditingTextField.tag - TextFieldTagNumber] = self.currentEditingTextField.text; + [attributesValuesArray replaceObjectAtIndex:(NSUInteger)self.currentEditingTextField.tag - TextFieldTagNumber + withObject:self.currentEditingTextField.text]; } else { - attributesValuesArray[(NSUInteger)self.currentEditingTextField.tag - TextFieldTagNumber] = [NSNull null]; + [attributesValuesArray replaceObjectAtIndex:(NSUInteger)self.currentEditingTextField.tag - TextFieldTagNumber + withObject:[NSNull null]]; } } @@ -200,10 +202,10 @@ - (IBAction) doneButtonTapped:(id)sender { otherButtonTitles:nil] autorelease]; [alertView show]; - [self dismissViewControllerAnimated:YES completion:nil]; + [self dismissModalViewControllerAnimated:YES]; for (NSUInteger i = 0; i < TotalNumberOfAttributes; i ++) { - id object = attributesValuesArray[i]; + id object = [attributesValuesArray objectAtIndex:i]; if (object && object != [NSNull null]) { switch (i) { case 0: @@ -264,7 +266,7 @@ - (IBAction) doneButtonTapped:(id)sender { - (void) keyboardDidShow:(NSNotification *)notification { NSDictionary* info = [notification userInfo]; - CGSize keyboardSize = [info[UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; + CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; CGFloat keyboardHeight = keyboardSize.height < keyboardSize.width ? keyboardSize.height : keyboardSize.width; CGRect aRect = self.attributesTableView.frame; aRect.size.height = self.view.bounds.size.height - keyboardHeight - 44; // 44 is the height of the navigation bar diff --git a/Example/Stopwatch/en.lproj/MainStoryboard_iPad.storyboard b/Example/Stopwatch/en.lproj/MainStoryboard_iPad.storyboard index 031a9b06e..a2ac6ce41 100644 --- a/Example/Stopwatch/en.lproj/MainStoryboard_iPad.storyboard +++ b/Example/Stopwatch/en.lproj/MainStoryboard_iPad.storyboard @@ -1,8 +1,8 @@ - + - - + + @@ -11,6 +11,7 @@ + @@ -22,7 +23,7 @@ - + @@ -156,7 +157,7 @@ - + @@ -183,7 +184,7 @@ - + @@ -227,16 +228,6 @@ - @@ -251,16 +242,16 @@ - + - + - - + + @@ -268,84 +259,97 @@ - - - - + + + + + + + + + + + + - - - - + + - - - + - + - - - + + + + - + @@ -442,6 +446,7 @@ + @@ -457,7 +462,7 @@ - + @@ -480,274 +485,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/Stopwatch/en.lproj/MainStoryboard_iPhone.storyboard b/Example/Stopwatch/en.lproj/MainStoryboard_iPhone.storyboard old mode 100755 new mode 100644 index 26d9afe41..4ceb9e874 --- a/Example/Stopwatch/en.lproj/MainStoryboard_iPhone.storyboard +++ b/Example/Stopwatch/en.lproj/MainStoryboard_iPhone.storyboard @@ -1,11 +1,11 @@ - + - - + + - + @@ -139,7 +139,7 @@ - + @@ -166,7 +166,7 @@ - + @@ -211,14 +211,14 @@ - + @@ -234,12 +234,12 @@ - + - + - @@ -387,54 +358,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -543,16 +466,16 @@ - + - + - + @@ -560,23 +483,60 @@ + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + + - + - - + + + + @@ -652,7 +587,7 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Example/Stopwatch/main.m b/Example/Stopwatch/main.m index 73f80207c..da054ff65 100644 --- a/Example/Stopwatch/main.m +++ b/Example/Stopwatch/main.m @@ -1,12 +1,7 @@ #import "AppDelegate.h" -#import "NUISettings.h" int main(int argc, char *argv[]) { @autoreleasepool { - // This lets us use NUI, the theming/customization package. There is also some initialization code in main.m - // Look at NUI/NUIStyle.nss to see what's being customized. - [NUISettings initWithStylesheet:@"StopwatchNUIStyle"]; - [NUISettings setGlobalExclusions:@[@"ColorCell", @"InAppMessageButtonCell"]]; return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } diff --git a/Example/Stopwatch/zh-Hans.lproj/MainStoryboard_iPad.storyboard b/Example/Stopwatch/zh-Hans.lproj/MainStoryboard_iPad.storyboard index 6960997df..b9107a7d4 100755 --- a/Example/Stopwatch/zh-Hans.lproj/MainStoryboard_iPad.storyboard +++ b/Example/Stopwatch/zh-Hans.lproj/MainStoryboard_iPad.storyboard @@ -1,8 +1,8 @@ - + - - + + @@ -10,7 +10,7 @@ - + @@ -25,6 +25,7 @@ + @@ -36,7 +37,7 @@ - + @@ -170,7 +171,7 @@ - + @@ -255,23 +256,16 @@ - + - + - - - + + @@ -279,72 +273,92 @@ - - - - - - - - - - - - - - + - - - + + + + @@ -446,6 +460,7 @@ + diff --git a/Example/Stopwatch/zh-Hans.lproj/MainStoryboard_iPhone.storyboard b/Example/Stopwatch/zh-Hans.lproj/MainStoryboard_iPhone.storyboard index 2f61c4b84..0ff7560e5 100755 --- a/Example/Stopwatch/zh-Hans.lproj/MainStoryboard_iPhone.storyboard +++ b/Example/Stopwatch/zh-Hans.lproj/MainStoryboard_iPhone.storyboard @@ -1,11 +1,11 @@ - + - - + + - + @@ -139,7 +139,7 @@ - + @@ -234,7 +234,7 @@ - + @@ -442,16 +442,16 @@ - + - + - + @@ -467,7 +467,7 @@ + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + - - + + + + @@ -586,6 +598,8 @@ + + diff --git a/Example/zh-Hans.lproj/Localizable.strings b/Example/zh-Hans.lproj/Localizable.strings index 18c0cfd0c..581586db2 100755 --- a/Example/zh-Hans.lproj/Localizable.strings +++ b/Example/zh-Hans.lproj/Localizable.strings @@ -14,11 +14,11 @@ "Appboy.Stopwatch.test-view.appboy-version.message" = "Appboy版本: %@"; "Appboy.Stopwatch.test-view.categories.button.title" = "类别"; "Appboy.Stopwatch.test-view.categories.All" = "All"; -"Appboy.Stopwatch.test-view.categories.Announcement" = "郑重宣布"; -"Appboy.Stopwatch.test-view.categories.Advertising" = "广而告之"; -"Appboy.Stopwatch.test-view.categories.Social" = "交朋结友"; -"Appboy.Stopwatch.test-view.categories.News" = "新闻消息"; -"Appboy.Stopwatch.test-view.categories.No-Category" = "无类别"; +"Appboy.Stopwatch.test-view.categories.Announcement" = "Announcement"; +"Appboy.Stopwatch.test-view.categories.Advertising" = "Advertising"; +"Appboy.Stopwatch.test-view.categories.Social" = "Social"; +"Appboy.Stopwatch.test-view.categories.News" = "News"; +"Appboy.Stopwatch.test-view.categories.No-Category" = "No Category"; "Appboy.Stopwatch" = "秒表应用"; "Appboy.Stopwatch.alert.cancel-button.title" = "好的"; diff --git a/HelloAppboy/Podfile b/HelloAppboy/Podfile index a14264738..5d33a6d40 100644 --- a/HelloAppboy/Podfile +++ b/HelloAppboy/Podfile @@ -1,5 +1,3 @@ -platform :ios, '6.0' +platform :ios, '5.1.1' -source 'https://github.com/CocoaPods/Specs.git' - -pod 'Appboy-iOS-SDK' \ No newline at end of file +pod 'Appboy-iOS-SDK/AppboyKitWithoutFacebookSupport' \ No newline at end of file diff --git a/HelloSwift/HelloSwift/AppDelegate.swift b/HelloSwift/HelloSwift/AppDelegate.swift index 835029f6e..8fc034caa 100644 --- a/HelloSwift/HelloSwift/AppDelegate.swift +++ b/HelloSwift/HelloSwift/AppDelegate.swift @@ -30,9 +30,5 @@ class AppDelegate: UIResponder, UIApplicationDelegate { func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) { Appboy.sharedInstance().registerApplication(application, didReceiveRemoteNotification: userInfo) } - - func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { - Appboy.sharedInstance().registerApplication(application, didReceiveRemoteNotification: userInfo, fetchCompletionHandler: completionHandler) - } } diff --git a/HelloSwift/Podfile b/HelloSwift/Podfile index a14264738..fc421e225 100644 --- a/HelloSwift/Podfile +++ b/HelloSwift/Podfile @@ -1,5 +1,3 @@ -platform :ios, '6.0' - source 'https://github.com/CocoaPods/Specs.git' -pod 'Appboy-iOS-SDK' \ No newline at end of file +pod 'Appboy-iOS-SDK/AppboyKitWithoutFacebookSupport' \ No newline at end of file diff --git a/README.md b/README.md index ccce2359d..1a8da4c3d 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,8 @@ Successful marketing automation is essential to the future of your mobile app. A ## Components -- `AppboyKit` - Contains the variant of our SDK. +- `AppboyKit` - Contains the variant of our SDK which assumes you have the FacebookSDK integrated into your app. +- `AppboyKitWithoutFacebookSupport` - Contains the variant of our SDK which assumes you have the FacebookSDK integrated into your app. - `Example` - Contains the Stopwatch Sample App which contains integration examples for the iOS SDK. - The Stopwatch Sample App uses [CocoaPods](http://guides.cocoapods.org/), so you must : 1. [Install CocoaPods](http://guides.cocoapods.org/using/getting-started.html) @@ -19,7 +20,7 @@ Successful marketing automation is essential to the future of your mobile app. A ## Version Support -The iOS SDK supports iOS 6.0+ +The iOS SDK supports iOS 5.1.1+ ## Questions?