diff --git a/.gitignore b/.gitignore index 8159cad9e..e94c51e9d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,9 +3,10 @@ Example/build Pods/ Podfile.lock +!Samples/**/Podfile.lock xcuserdata/ .idea/ # Emacs temporary files -*~ \ No newline at end of file +*~ diff --git a/Appboy-iOS-SDK.podspec b/Appboy-iOS-SDK.podspec index c44336c8f..cea44a0f5 100644 --- a/Appboy-iOS-SDK.podspec +++ b/Appboy-iOS-SDK.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = "Appboy-iOS-SDK" - s.version = "2.30.0" + s.version = "2.31.0" s.summary = "This is the Appboy iOS SDK for Mobile Marketing Automation" s.homepage = "http://www.appboy.com" s.license = { :type => 'Commercial', :text => 'Please refer to https://github.com/Appboy/appboy-ios-sdk/blob/master/LICENSE'} @@ -20,13 +20,19 @@ Pod::Spec.new do |s| sc.frameworks = 'SystemConfiguration', 'QuartzCore', 'CoreText', 'WebKit' sc.source_files = 'AppboyKit/headers/AppboyKitLibrary/*.h', 'AppboyKit/ABKIdentifierForAdvertisingProvider.m', 'AppboyKit/ABKModalWebViewController.m', 'AppboyKit/ABKNoConnectionLocalization.m' sc.vendored_libraries = 'AppboyKit/libAppboyKitLibrary.a' - sc.weak_framework = 'CoreTelephony', 'Social', 'Accounts', 'AdSupport', 'StoreKit','UserNotifications' + sc.weak_framework = 'CoreTelephony', 'Social', 'Accounts', 'AdSupport', 'StoreKit', 'UserNotifications' end s.subspec 'UI' do |sui| - sui.source_files = 'AppboyKit/headers/AppboyKitLibrary/*.h', 'AppboyKit/*.m' - sui.resource = 'AppboyKit/Appboy.bundle' + sui.source_files = 'AppboyKit/headers/AppboyKitLibrary/*.h', 'AppboyKit/*.m', 'AppboyUI/ABKFeedbackViewController/FeedbackViewController/*.*', 'AppboyUI/ABKUIUtils/**/*.*' + sui.resource = 'AppboyKit/Appboy.bundle', 'AppboyUI/ABKFeedbackViewController/Feedback_Resources/**/*.*' sui.dependency 'SDWebImage/GIF', '~>4.0' sui.dependency 'Appboy-iOS-SDK/Core' end + + s.subspec 'Feedback' do |sfb| + sfb.source_files = 'AppboyKit/headers/AppboyKitLibrary/*.h', 'AppboyKit/ABKIdentifierForAdvertisingProvider.m', 'AppboyKit/ABKModalWebViewController.m', 'AppboyKit/ABKNoConnectionLocalization.m', 'AppboyUI/ABKFeedbackViewController/FeedbackViewController/*.*', 'AppboyUI/ABKUIUtils/**/*.*' + sfb.resource = 'AppboyUI/ABKFeedbackViewController/Feedback_Resources/**/*.*' + sfb.dependency 'Appboy-iOS-SDK/Core' + end end diff --git a/AppboyKit/ABKModalWebViewController.m b/AppboyKit/ABKModalWebViewController.m index ec503abf5..b7fe2c865 100644 --- a/AppboyKit/ABKModalWebViewController.m +++ b/AppboyKit/ABKModalWebViewController.m @@ -122,8 +122,8 @@ - (void)closeButtonPressed:(id)sender { - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { - NSString *URLString = [[navigationAction.request.mainDocumentURL absoluteString] lowercaseString]; - NSArray *stringComponents = [URLString componentsSeparatedByString:@":"]; + NSString *urlString = [[navigationAction.request.mainDocumentURL absoluteString] lowercaseString]; + NSArray *stringComponents = [urlString componentsSeparatedByString:@":"]; if ([stringComponents[1] hasPrefix:@"//itunes.apple.com"] || (![stringComponents[0] isEqual:@"http"] && ![stringComponents[0] isEqual:@"https"])) { diff --git a/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib b/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib index 8cfd8fcf8..6de01fa73 100644 Binary files a/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib and b/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib b/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib index c18d3f434..c88ed7705 100644 Binary files a/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib and b/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib b/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib index 5de654e7e..1859cdb75 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib and b/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib b/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib deleted file mode 100644 index 4744e5b73..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackEmailViewPortrait.nib b/AppboyKit/Appboy.bundle/ABKFeedbackEmailViewPortrait.nib deleted file mode 100644 index 659507141..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackEmailViewPortrait.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib b/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib deleted file mode 100644 index 54a8bfe5a..000000000 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects.nib index 9a9902f5c..d691bd74c 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/runtime.nib index 42fab13cc..0ee68d877 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageHTMLFullViewController.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageHTMLFullViewController.nib index ed87596b0..7470ba68d 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageHTMLFullViewController.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageHTMLFullViewController.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects.nib index 8f63a3557..66be019d0 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/runtime.nib index 071bf4a01..9c599460c 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects.nib index 70e92188b..899043521 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/runtime.nib index 0e44a6016..de4595518 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKSpinnerView.nib b/AppboyKit/Appboy.bundle/ABKSpinnerView.nib index 85838ef3e..9d18e77b7 100644 Binary files a/AppboyKit/Appboy.bundle/ABKSpinnerView.nib and b/AppboyKit/Appboy.bundle/ABKSpinnerView.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib b/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib index 91b2925b3..6895aef5b 100644 Binary files a/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib and b/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib differ diff --git a/AppboyKit/Appboy.bundle/Info.plist b/AppboyKit/Appboy.bundle/Info.plist index 21f14341c..779447205 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 b9d950625..fb621eda8 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/checkmark-bg@2x.png b/AppboyKit/Appboy.bundle/checkmark-bg@2x.png deleted file mode 100644 index 2aa84f611..000000000 Binary files a/AppboyKit/Appboy.bundle/checkmark-bg@2x.png and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/checkmark.png b/AppboyKit/Appboy.bundle/checkmark.png deleted file mode 100644 index 9ba354ec1..000000000 Binary files a/AppboyKit/Appboy.bundle/checkmark.png and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/checkmark@2x.png b/AppboyKit/Appboy.bundle/checkmark@2x.png deleted file mode 100644 index 7ef29dd68..000000000 Binary files a/AppboyKit/Appboy.bundle/checkmark@2x.png and /dev/null differ diff --git a/AppboyKit/Appboy.bundle/da.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/da.lproj/LocalizedAppboyUIString.strings index 30b233636..663b3d593 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 d8abaaa2b..654d0ab7e 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 8f2de47bd..4acac5456 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 41a97ec26..7d9f03a59 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 41a97ec26..7d9f03a59 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 ad50bd7d3..75a005ddf 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 015443935..f2ece0e27 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 b325b7aa5..b2fae013e 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 f78b34f0c..e1d2831e5 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/fr.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/fr.lproj/LocalizedAppboyUIString.strings index 298922499..d90bfd387 100644 Binary files a/AppboyKit/Appboy.bundle/fr.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/fr.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/he.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/he.lproj/LocalizedAppboyUIString.strings index 16a4e46ab..10d7a66a6 100644 Binary files a/AppboyKit/Appboy.bundle/he.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/he.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/hi.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/hi.lproj/LocalizedAppboyUIString.strings index ce2c8fbd5..16cb81b7f 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 3ea8bb8c6..c7327a2ac 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 af10503f1..66430ad70 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 40ecb84aa..b7268735e 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 af4fcb95d..060657e86 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 aa5e931a0..d65a43002 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 029f8182b..02b58c034 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 b7ca5c63c..e730929a1 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 f4047bbd8..4ee1fb468 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 937acb2d0..e9cb97b48 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 5081e35a2..759f68472 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 f88db45a2..182e71f21 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 c56ccef8e..793c44fb0 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 b80c3ec83..e791b1c93 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 eeca31804..66bd61194 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 1072df10b..1576e322b 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 dd398dd5f..e19d1d11c 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 eb21ca092..81ebc6223 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-HK.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/zh-HK.lproj/LocalizedAppboyUIString.strings index ab5e3a794..6d180ece8 100644 Binary files a/AppboyKit/Appboy.bundle/zh-HK.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/zh-HK.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 869e40e55..9956f9741 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 ab5e3a794..6d180ece8 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/Appboy.bundle/zh-TW.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/zh-TW.lproj/LocalizedAppboyUIString.strings index ab5e3a794..6d180ece8 100644 Binary files a/AppboyKit/Appboy.bundle/zh-TW.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/zh-TW.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/Appboy.bundle/zh.lproj/LocalizedAppboyUIString.strings b/AppboyKit/Appboy.bundle/zh.lproj/LocalizedAppboyUIString.strings index 869e40e55..9956f9741 100644 Binary files a/AppboyKit/Appboy.bundle/zh.lproj/LocalizedAppboyUIString.strings and b/AppboyKit/Appboy.bundle/zh.lproj/LocalizedAppboyUIString.strings differ diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKFeedbackViewController.h b/AppboyKit/headers/AppboyKitLibrary/ABKFeedbackViewController.h deleted file mode 100644 index 7a0b32c04..000000000 --- a/AppboyKit/headers/AppboyKitLibrary/ABKFeedbackViewController.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// ABKFeedbackViewController.h -// AppboySDK - -/*! - * This class is used internally; you don't need to include it. - */ - - -#import -#import - -/* - * Appboy Public API: ABKFeedbackViewController - */ -NS_ASSUME_NONNULL_BEGIN -@interface ABKFeedbackViewController : UIViewController - -@property (nonatomic, weak, nullable) id delegate; - -@end -NS_ASSUME_NONNULL_END diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKFeedbackViewControllerModalContext.h b/AppboyKit/headers/AppboyKitLibrary/ABKFeedbackViewControllerModalContext.h deleted file mode 100644 index 934f560ce..000000000 --- a/AppboyKit/headers/AppboyKitLibrary/ABKFeedbackViewControllerModalContext.h +++ /dev/null @@ -1,71 +0,0 @@ -// -// ABKFeedbackViewControllerModalContext.h -// AppboySDK - -#import "ABKFeedbackViewController.h" -/* ------------------------------------------------------------------------------------------------------ - * ABKFeedbackViewController - */ - -@class ABKFeedbackViewControllerModalContext; - -NS_ASSUME_NONNULL_BEGIN -@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; - -/*! - @param message The feedback message - - Called before feedback is submitted. Return a message to be submitted. -*/ -- (NSString *)feedbackViewControllerBeforeFeedbackSent:(NSString *)message; - -@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. - */ - -/* - * Appboy Public API: ABKFeedbackViewControllerModalContext - */ -@interface ABKFeedbackViewControllerModalContext : UINavigationController - -@property (weak, nullable) id feedbackDelegate; - -@end -NS_ASSUME_NONNULL_END diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKFeedbackViewControllerNavigationContext.h b/AppboyKit/headers/AppboyKitLibrary/ABKFeedbackViewControllerNavigationContext.h deleted file mode 100644 index 7d660fc17..000000000 --- a/AppboyKit/headers/AppboyKitLibrary/ABKFeedbackViewControllerNavigationContext.h +++ /dev/null @@ -1,62 +0,0 @@ -// -// ABKFeedbackViewControllerNavigationContext.h -// AppboySDK - -#import "ABKFeedbackViewController.h" -/* ------------------------------------------------------------------------------------------------------ - * ABKFeedbackViewController - */ - -@class ABKFeedbackViewControllerNavigationContext; - -NS_ASSUME_NONNULL_BEGIN -@protocol ABKFeedbackViewControllerNavigationContextDelegate - -/*! - @param sender The calling context - - Called when feedback is sent. -*/ -- (void)feedbackViewControllerNavigationContextFeedbackSent:(ABKFeedbackViewControllerNavigationContext *)sender; - -@optional -/*! - @param message The feedback message - - Called before feedback is submitted. Return a message to be submitted. -*/ -- (NSString *)feedbackViewControllerBeforeFeedbackSent:(NSString *)message; - -@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. - */ - -/* - * Appboy Public API: ABKFeedbackViewControllerNavigationContext - */ -@interface ABKFeedbackViewControllerNavigationContext : ABKFeedbackViewController - -@property (nonatomic, weak, nullable) id delegate; - -@end -NS_ASSUME_NONNULL_END diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKFeedbackViewControllerPopoverContext.h b/AppboyKit/headers/AppboyKitLibrary/ABKFeedbackViewControllerPopoverContext.h deleted file mode 100644 index 05ff27890..000000000 --- a/AppboyKit/headers/AppboyKitLibrary/ABKFeedbackViewControllerPopoverContext.h +++ /dev/null @@ -1,72 +0,0 @@ -// -// ABKFeedbackViewControllerPopoverContext.h -// AppboySDK - -#import "ABKFeedbackViewController.h" -/* ------------------------------------------------------------------------------------------------------ - * ABKFeedbackViewController - */ - -@class ABKFeedbackViewControllerPopoverContext; - -NS_ASSUME_NONNULL_BEGIN -@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; - -@optional -/*! - @param message The feedback message - - Called before feedback is submitted. Return a message to be submitted. - */ -- (NSString *)feedbackViewControllerBeforeFeedbackSent:(NSString *)message; - -@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. - */ - -/* - * Appboy Public API: ABKFeedbackViewControllerPopoverContext - */ -@interface ABKFeedbackViewControllerPopoverContext : ABKFeedbackViewController - -@property (nonatomic, weak, nullable) id delegate; - -@end -NS_ASSUME_NONNULL_END diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKPushUtils.h b/AppboyKit/headers/AppboyKitLibrary/ABKPushUtils.h index c2af27431..bc189b3b1 100644 --- a/AppboyKit/headers/AppboyKitLibrary/ABKPushUtils.h +++ b/AppboyKit/headers/AppboyKitLibrary/ABKPushUtils.h @@ -104,7 +104,7 @@ NS_ASSUME_NONNULL_BEGIN + (NSSet *)getAppboyUNNotificationCategorySet; -#if __IPHONE_OS_VERSION_MIN_REQUIRED < 10 +#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_10_0 + (NSSet *)getAppboyUIUserNotificationCategorySet; #endif diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKUser.h b/AppboyKit/headers/AppboyKitLibrary/ABKUser.h index 8ede5d9f6..8315d7a7c 100644 --- a/AppboyKit/headers/AppboyKitLibrary/ABKUser.h +++ b/AppboyKit/headers/AppboyKitLibrary/ABKUser.h @@ -131,6 +131,18 @@ typedef NS_ENUM(NSInteger, ABKNotificationSubscriptionType) { */ @property (strong, nullable) ABKAttributionData *attributionData; +/*! + * Adds an an alias for the current user. Individual (alias, label) pairs can exist on one and only one user. + * If a different user already has this alias or external user id, the alias attempt will be rejected + * on the server. + * + * @param alias The alias of the current user. + * @param label The label of the alias; used to differentiate it from other aliases for the user. + * @return Whether or not the alias and label are valid. Does not guarantee they won't collide with + * an existing pair. + */ +- (BOOL)addAlias:(NSString *)alias withLabel:(NSString *)label; + /*! * @param gender ABKUserGender enum representing the user's gender. * @return YES if the user gender is set properly diff --git a/AppboyKit/headers/AppboyKitLibrary/Appboy.h b/AppboyKit/headers/AppboyKitLibrary/Appboy.h index fcd41205f..d7cdadb5d 100644 --- a/AppboyKit/headers/AppboyKitLibrary/Appboy.h +++ b/AppboyKit/headers/AppboyKitLibrary/Appboy.h @@ -13,7 +13,7 @@ #import #ifndef APPBOY_SDK_VERSION -#define APPBOY_SDK_VERSION @"2.30.0" +#define APPBOY_SDK_VERSION @"2.31.0" #endif #if !TARGET_OS_TV @@ -527,6 +527,14 @@ typedef NS_ENUM(NSInteger, ABKFeedbackSentResult) { */ - (void)requestFeedRefresh; +/*! + * Get the device ID - the IDFV - which will reset if all apps for a given vendor are removed from the device. + * + * @return The device ID. + */ +- (NSString *)getDeviceId; + + #if !TARGET_OS_TV /*! * Enqueues an in-app message request for the current user. Note that if the queue already contains another request for the diff --git a/AppboyKit/headers/AppboyKitLibrary/AppboyKit.h b/AppboyKit/headers/AppboyKitLibrary/AppboyKit.h index 60ec8b38f..6ab12b528 100644 --- a/AppboyKit/headers/AppboyKitLibrary/AppboyKit.h +++ b/AppboyKit/headers/AppboyKitLibrary/AppboyKit.h @@ -1,10 +1,12 @@ #import "Appboy.h" #import "ABKUser.h" -#import "ABKIDFADelegate.h" #import "ABKAppboyEndpointDelegate.h" #import "ABKFacebookUser.h" #import "ABKTwitterUser.h" #import "ABKURLDelegate.h" +#import "ABKAttributionData.h" +#import "ABKPushURIDelegate.h" +#import "ABKPushUtils.h" // Cards #import "ABKCard.h" @@ -14,6 +16,9 @@ #import "ABKClassicCard.h" #import "ABKTextAnnouncementCard.h" +// Feedback +#import "ABKFeedback.h" + #if !TARGET_OS_TV // In-app Message #import "ABKInAppMessage.h" @@ -25,22 +30,6 @@ #import "ABKInAppMessageHTMLFull.h" #import "ABKInAppMessageControllerDelegate.h" #import "ABKInAppMessageController.h" -#import "ABKPushURIDelegate.h" - -// Feedback -#import "ABKFeedback.h" -#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 "ABKFeedController.h" #import "ABKInAppMessageView.h" #import "ABKInAppMessageViewController.h" @@ -53,9 +42,21 @@ #import "ABKInAppMessageButton.h" #import "ABKInAppMessageWindowController.h" +// News Feed +#import "ABKFeedViewController.h" +#import "ABKFeedViewControllerGenericContext.h" +#import "ABKFeedViewControllerModalContext.h" +#import "ABKFeedViewControllerNavigationContext.h" +#import "ABKFeedViewControllerPopoverContext.h" +#import "ABKFeedController.h" + // IDFA #import "ABKIdentifierForAdvertisingProvider.h" +#import "ABKIDFADelegate.h" // SDWebImage #import "ABKSDWebImageProxy.h" + +// Location +#import "ABKLocationManager.h" #endif diff --git a/AppboyKit/libAppboyKitLibrary.a b/AppboyKit/libAppboyKitLibrary.a index 88e9c517b..60f8ea012 100644 Binary files a/AppboyKit/libAppboyKitLibrary.a and b/AppboyKit/libAppboyKitLibrary.a differ diff --git a/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKFeedbackViewController.h b/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKFeedbackViewController.h new file mode 100644 index 000000000..e7ee62608 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKFeedbackViewController.h @@ -0,0 +1,88 @@ +#import +#import "AppboyKit.h" + +@interface ABKFeedbackViewController : UIViewController + +/*! + * The UITextView for feedback input. + */ +@property (weak, nonatomic) IBOutlet UITextView *feedbackTextView; + +/*! + * The UIButton for the user to specify if they are providing general feedback or reporting an issue. + */ +@property (weak, nonatomic) IBOutlet UIButton *issueButton; + +/*! + * The UILabel which indicates the feedback area. + */ +@property (weak, nonatomic) IBOutlet UILabel *messageLabel; + +/*! + * The UILabel for issue report. + */ +@property (weak, nonatomic) IBOutlet UILabel *reportIssueLabel; + +/*! + * The UITextField for email input. + */ +@property (weak, nonatomic) IBOutlet UITextField *emailTextField; + +/*! + * A full size view with a spinner. After the user submits the feedback, the view will show up and block + * user interaction with the feedback view to avoid modification. The view will disappear after the + * attempt to send feedback completes. + */ +@property (weak, nonatomic) IBOutlet UIView *spinnerView; + +/*! + * @discussion The touch up inside action for the issue button. The default behavior is to change the + * select state of the button. + * + * For customization, please use a subclass or category to override this method. + */ +- (IBAction)issueButtonTapped:(UIButton *)sender; + +/*! + * @discussion The touch up inside action for the send button. The default behavior is to check the + * validation of the feedback object, show the spinner view, and send the feedback through the Appboy SDK. + * + * For customization, please use a subclass or category to override this method. + */ +- (IBAction)sendButtonTapped:(UIBarButtonItem *)sender; + +/*! + * @discussion This method is for customizing the feedback object from user inputs. It replaces the + * old feedbackViewControllerBeforeFeedbackSent delegate method. + * + * To do customization on the feedback object, you can override this method in a subclass. + */ +- (ABKFeedback *)appboyFeedbackFromMessage:(NSString *)message + email:(NSString *)email + isBug:(BOOL)isBug; + +/*! + * @discussion This method is for custom handling after feedback is sent. It replaces the old + * feedbackViewControllerFeedbackSent delegate method. + * + * To do custom handling after feedback is sent, you can override this method in a subclass. + */ +- (void)feedbackSent:(ABKFeedbackSentResult)feedbackSentResult; + +/*! + * @discussion This method returns the localized string from AppboyFeedbackLocalizable.strings file. + * You can easily override the localized string by adding the keys and the translations to your own + * Localizable.strings file. + * + * To do custom handling with the Appboy localized string, you can override this method in a + * subclass. + */ +- (NSString *)localizedAppboyFeedbackString:(NSString *)key; + +/*! + * @discussion This method displays an alert view with the given title and message. The button title + * is localized within the AppboyFeedbackLocalizable.strings file. + */ +- (void)displayAlertViewWithTitle:(NSString *)title message:(NSString *)message; + +@end diff --git a/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKFeedbackViewController.m b/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKFeedbackViewController.m new file mode 100644 index 000000000..9aa41fd4d --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKFeedbackViewController.m @@ -0,0 +1,201 @@ +#import "ABKNavigationFeedbackViewController.h" +#import "ABKUIUtils.h" + +// This constraint is for re-sizing the page with keyboard display. +static NSString *const FeedbackBottomConstraintID = @"FeedbackBottomConstraint"; + +@implementation ABKFeedbackViewController + +#pragma mark - Feedback View UI Initialization + +- (void)viewDidLoad { + [super viewDidLoad]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) + name:UIKeyboardWillShowNotification object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) + name:UIKeyboardWillHideNotification object:nil]; + [self setupViews]; + + // Set the buttons and email text field's placeholder text with localized string. + self.messageLabel.text = [self localizedAppboyFeedbackString:@"Appboy.feedback.label.message"]; + self.reportIssueLabel.text = [self localizedAppboyFeedbackString:@"Appboy.feedback.label.report-issue"]; + self.emailTextField.placeholder = [self localizedAppboyFeedbackString:@"Appboy.feedback.email-text-field-place-hold"]; +} + +- (void)setupViews { + NSLog(@"Subclasses should override this method."); +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + [self.feedbackTextView becomeFirstResponder]; +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + [[Appboy sharedInstance] logFeedbackDisplayed]; +} + +#pragma mark - Button Actions + +- (IBAction)issueButtonTapped:(UIButton *)sender { + self.issueButton.selected = !self.issueButton.selected; +} + +- (IBAction)sendButtonTapped:(UIBarButtonItem *)sender { + ABKFeedback *feedback = [self appboyFeedbackFromMessage:self.feedbackTextView.text + email:self.emailTextField.text + isBug:self.issueButton.selected]; + switch ([feedback feedbackValidation]) { + case ABKInvalidEmailAddressFeedback: { + [self displayAlertViewWithTitle:[self localizedAppboyFeedbackString:@"Appboy.feedback.alert.invalid-email.title"] + message:[self localizedAppboyFeedbackString:@"Appboy.feedback.alert.invalid-email.message"]]; + } + break; + case ABKEmptyFeedbackMessageFeedback: { + [self displayAlertViewWithTitle:[self localizedAppboyFeedbackString:@"Appboy.feedback.alert.empty-feedback.title"] + message:[self localizedAppboyFeedbackString:@"Appboy.feedback.alert.empty-feedback.message"]]; + } + break; + + case ABKValidFeedback: + // Dismiss keyboard + if ([self.feedbackTextView isFirstResponder]) { + [self.feedbackTextView resignFirstResponder]; + } else if ([self.emailTextField isFirstResponder]) { + [self.emailTextField resignFirstResponder]; + } + // Show spinner view + [self shouldHideSpinner:NO]; + // Submit feedback + [[Appboy sharedInstance] submitFeedback:feedback withCompletionHandler:^(ABKFeedbackSentResult feedbackSentResult) { + dispatch_async(dispatch_get_main_queue(), ^{ + [self shouldHideSpinner:YES]; + [self feedbackSent:feedbackSentResult]; + }); + }]; + break; + } +} + +- (ABKFeedback *)appboyFeedbackFromMessage:(NSString *)message + email:(NSString *)email + isBug:(BOOL)isBug { + __autoreleasing ABKFeedback *feedback = [[ABKFeedback alloc] init]; + feedback.email = email; + feedback.isBug = isBug; + feedback.message = message; + return feedback; +} + +- (void)feedbackSent:(ABKFeedbackSentResult)feedbackSentResult {} + +#pragma mark - Rotation + +- (BOOL)shouldAutorotate { + return YES; +} + +#pragma mark - Keyboard Notification Listener + +- (void)keyboardWillShow:(NSNotification *)notification { + NSDictionary *userInfo = notification.userInfo; + NSTimeInterval duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; + UIViewAnimationCurve curve = (UIViewAnimationCurve)[userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]; + + __block CGRect keyboardRect = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; + keyboardRect = [self.view convertRect:keyboardRect toView:nil]; + __block CGPoint bottomPoint = CGPointMake(0, self.view.frame.size.height); + bottomPoint = [self.view convertPoint:bottomPoint toView:nil]; + + [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve << 16 animations:^{ + for (NSLayoutConstraint *constraint in self.view.constraints) { + if ([constraint.identifier isEqualToString:FeedbackBottomConstraintID]) { + // Here we are caculating the distance between the bottom of the feedback view and the bottom + // of the screen. In some cases, e.g. within a tab bar, the bottom of the feedback view and + // the screen do not align. + double bottomDistance = [UIScreen mainScreen].bounds.size.height - bottomPoint.y; + constraint.constant = keyboardRect.size.height - bottomDistance; + [self.view layoutIfNeeded]; + break; + } + } + } completion:nil]; +} + +- (void)keyboardWillHide:(NSNotification *)notification { + NSDictionary *userInfo = notification.userInfo; + NSTimeInterval duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]; + UIViewAnimationCurve curve = (UIViewAnimationCurve)[userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]; + + [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{ + for (NSLayoutConstraint *constraint in self.view.constraints) { + if ([constraint.identifier isEqualToString:FeedbackBottomConstraintID]) { + constraint.constant = 0.0; + break; + } + } + } completion:nil]; +} + +#pragma mark - Spinner View Control + +// After a user clicks "Send" to send feedback, add a full screen spinner view to avoid further change +// during the process. +- (void)shouldHideSpinner:(BOOL)hideSpinner { + self.spinnerView.hidden = hideSpinner; + for (UIBarButtonItem *barButtonItem in self.navigationItem.leftBarButtonItems) { + barButtonItem.enabled = hideSpinner; + } + for (UIBarButtonItem *barButtonItem in self.navigationItem.rightBarButtonItems) { + barButtonItem.enabled = hideSpinner; + } +} + +#pragma mark - Localization + +- (NSString *)localizedAppboyFeedbackString:(NSString *)key { + return [ABKUIUtils getLocalizedString:key + inAppboyBundle:[NSBundle bundleForClass:[ABKNavigationFeedbackViewController class]] + table:@"AppboyFeedbackLocalizable"]; +} + +- (void)displayAlertViewWithTitle:(NSString *)title message:(NSString *)message { + UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title + message:message + delegate:nil + cancelButtonTitle:[self localizedAppboyFeedbackString:@"Appboy.alert.ok-button.title"] + otherButtonTitles:nil, nil]; + [alert show]; + alert = nil; +} + +#pragma mark - UITextFieldDelegate + +- (BOOL)textFieldShouldReturn:(UITextField *)textField { + // This delegate method will get called when the user clicks the send button on the keyboard. When the email text field + // isn't empty, we should call the send feedback action, which is also the send button action; otherwise we should + // return no. + if (!textField.text || textField.text.length == 0) { + return NO; + } else { + [self sendButtonTapped:nil]; + return YES; + } +} + +#pragma mark - UITextViewDelegate + +- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { + // When the spinner view is displaying, the user shouldn't be able to change the feedback content. + return self.spinnerView.hidden; +} + +#pragma mark - dealloc + +- (void)dealloc { + [[NSNotificationCenter defaultCenter] removeObserver:self]; +} + +@end diff --git a/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKModalFeedbackViewController.h b/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKModalFeedbackViewController.h new file mode 100644 index 000000000..87cf4f6c5 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKModalFeedbackViewController.h @@ -0,0 +1,29 @@ +#import "ABKFeedbackViewController.h" + +@interface ABKModalFeedbackViewController : ABKFeedbackViewController + +/*! + * The navigation bar with the cancel and the send buttons. + */ +@property (weak, nonatomic) IBOutlet UINavigationBar *navigationBar; + +/*! + * The cancel button on the navigation bar. + */ +@property (weak, nonatomic) IBOutlet UIBarButtonItem *cancelBarButton; + +/*! + * The send button on the navigation bar. + */ +@property (weak, nonatomic) IBOutlet UIBarButtonItem *sendBarButton; + +/*! + * @discussion The touch up inside action for the cancel button. The default behavior is to dismiss + * the modal feedback view controller. + * + * For customization, please use a subclass or category to override this method. + * + */ +- (IBAction)cancelButtonTapped:(UIBarButtonItem *)sender; + +@end diff --git a/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKModalFeedbackViewController.m b/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKModalFeedbackViewController.m new file mode 100644 index 000000000..f724ada60 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKModalFeedbackViewController.m @@ -0,0 +1,37 @@ +#import "ABKModalFeedbackViewController.h" +#import "AppboyKit.h" + +@implementation ABKModalFeedbackViewController + +- (void)setupViews { + // Set the localized title for buttons and title on the navigation bar. + self.navigationBar.topItem.title =[super localizedAppboyFeedbackString:@"Appboy.feedback.modal-context.title"]; + self.cancelBarButton.title = [super localizedAppboyFeedbackString:@"Appboy.feedback.cancel-button.title"]; + self.sendBarButton.title = [super localizedAppboyFeedbackString:@"Appboy.feedback.send-button.title"]; +} + +- (BOOL)prefersStatusBarHidden { + return YES; +} + +- (void)loadView { + [[NSBundle bundleForClass:[ABKModalFeedbackViewController class]] loadNibNamed:@"ABKModalFeedbackViewController" + owner:self + options:nil]; +} + +- (IBAction)cancelButtonTapped:(UIBarButtonItem *)sender { + [self dismissViewControllerAnimated:YES completion:nil]; +} + +- (void)feedbackSent:(ABKFeedbackSentResult)feedbackSentResult { + if (feedbackSentResult == ABKFeedbackSentSuccessfully) { + [self dismissViewControllerAnimated:YES completion:nil]; + } else { + // Display an alert view for no connection + [self displayAlertViewWithTitle:[self localizedAppboyFeedbackString:@"Appboy.feedback.no-connection.title"] + message:[self localizedAppboyFeedbackString:@"Appboy.feedback.no-connection.message"]]; + } +} + +@end diff --git a/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKNavigationFeedbackViewController.h b/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKNavigationFeedbackViewController.h new file mode 100644 index 000000000..552a15437 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKNavigationFeedbackViewController.h @@ -0,0 +1,5 @@ +#import "ABKFeedbackViewController.h" + +@interface ABKNavigationFeedbackViewController : ABKFeedbackViewController + +@end diff --git a/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKNavigationFeedbackViewController.m b/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKNavigationFeedbackViewController.m new file mode 100644 index 000000000..b88b81fa7 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKNavigationFeedbackViewController.m @@ -0,0 +1,42 @@ +#import "ABKNavigationFeedbackViewController.h" +#import "AppboyKit.h" +#import "ABKUIUtils.h" + +// This constraint is for re-sizing the page with keyboard display. +static NSString *const FeedbackBottomConstraintID = @"FeedbackBottomConstraint"; + +@implementation ABKNavigationFeedbackViewController + +- (void)setupViews { + self.title = [self localizedAppboyFeedbackString:@"Appboy.feedback.modal-context.title"]; + UIBarButtonItem *sendButton = [[UIBarButtonItem alloc] initWithTitle:[self localizedAppboyFeedbackString:@"Appboy.feedback.send-button.title"] + style:UIBarButtonItemStylePlain + target:self + action:@selector(sendButtonTapped:)]; + + if ([sendButton respondsToSelector:@selector(nuiClass)]){ + [sendButton performSelector:@selector(setNuiClass:) withObject:@"ABKFeedbackSendBarButtonItem"]; + } + [self.navigationItem setRightBarButtonItem:sendButton]; + + // Don't display the feedback view underneath the navigation bar. + self.edgesForExtendedLayout = UIRectEdgeNone; +} + +- (void)loadView { + [[NSBundle bundleForClass:[ABKNavigationFeedbackViewController class]] loadNibNamed:@"ABKNavigationFeedbackViewController" + owner:self + options:nil]; +} + +- (void)feedbackSent:(ABKFeedbackSentResult)feedbackSentResult { + if (feedbackSentResult == ABKFeedbackSentSuccessfully) { + [self.navigationController popViewControllerAnimated:YES]; + } else { + // Display an alert view for no connection + [self displayAlertViewWithTitle:[self localizedAppboyFeedbackString:@"Appboy.feedback.no-connection.title"] + message:[self localizedAppboyFeedbackString:@"Appboy.feedback.no-connection.message"]]; + } +} + +@end diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ABKModalFeedbackViewController.xib b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ABKModalFeedbackViewController.xib new file mode 100644 index 000000000..efe092ab4 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ABKModalFeedbackViewController.xib @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ABKNavigationFeedbackViewController.xib b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ABKNavigationFeedbackViewController.xib new file mode 100644 index 000000000..a574dea66 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ABKNavigationFeedbackViewController.xib @@ -0,0 +1,198 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/Base.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/Base.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..d1e55b5dc --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/Base.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Cannot establish network connection."; +"Appboy.feedback.no-connection.message" = "Please try again later."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Invalid Email Address"; +"Appboy.feedback.alert.invalid-email.message" = "Please enter a valid email address and try again."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Empty Feedback Message"; +"Appboy.feedback.alert.empty-feedback.message" = "Please enter a feedback message."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Feedback"; +"Appboy.feedback.cancel-button.title" = "Cancel"; +"Appboy.feedback.send-button.title" = "Send"; +"Appboy.feedback.label.message" = "Message"; +"Appboy.feedback.label.report-issue" = "Reporting an Issue?"; +"Appboy.feedback.email-text-field-place-hold" = "Email"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ar.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ar.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..3369fc449 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ar.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "موافق"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "لا يمكن إجراء الاتصال بالشبكة. "; +"Appboy.feedback.no-connection.message" = "يرجى تكرار المحاولة لاحقا. "; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "بريد إلكتروني غير صحيح"; +"Appboy.feedback.alert.invalid-email.message" = "يرجى إدخال بريد إلكتروني صحيح وتكرار المحاولة. "; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "رسالة ملاحظات فارغة"; +"Appboy.feedback.alert.empty-feedback.message" = "يرجى إدخال رسالة ملاحظات. "; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "الملاحظات"; +"Appboy.feedback.cancel-button.title" = "إلغاء"; +"Appboy.feedback.send-button.title" = "أرسل"; +"Appboy.feedback.label.message" = "رسالة"; +"Appboy.feedback.label.report-issue" = "الإبلاغ عن مشكلة؟"; +"Appboy.feedback.email-text-field-place-hold" = "بريد إلكتروني"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/da.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/da.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..a00c58842 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/da.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Kan ikke etablere netværksforbindelse."; +"Appboy.feedback.no-connection.message" = "Prøv venligst senere."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Ugyldig email adresse"; +"Appboy.feedback.alert.invalid-email.message" = "Indtast venligst gyldig email adresse "; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Slet feedback besked"; +"Appboy.feedback.alert.empty-feedback.message" = "Indtast feedback besked."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Feedback"; +"Appboy.feedback.cancel-button.title" = "Fortryd"; +"Appboy.feedback.send-button.title" = "Send"; +"Appboy.feedback.label.message" = "Besked"; +"Appboy.feedback.label.report-issue" = "Rapporter en fejl"; +"Appboy.feedback.email-text-field-place-hold" = "Email"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/de.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/de.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..52bd4cd86 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/de.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Netzwerkverbindung kann nicht aufgebaut werden."; +"Appboy.feedback.no-connection.message" = "Bitte später noch einmal versuchen."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Ungültige E-Mail Adresse"; +"Appboy.feedback.alert.invalid-email.message" = "Bitte gültige E-Mail Adresse eingeben und erneut versuchen."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Leere Feedback-Nachricht"; +"Appboy.feedback.alert.empty-feedback.message" = "Bitte Feedback-Nachricht eingeben."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Feedback"; +"Appboy.feedback.cancel-button.title" = "Abbrechen"; +"Appboy.feedback.send-button.title" = "Senden"; +"Appboy.feedback.label.message" = "Nachricht"; +"Appboy.feedback.label.report-issue" = "Problem melden?"; +"Appboy.feedback.email-text-field-place-hold" = "E-Mail"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/en.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/en.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..d1e55b5dc --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/en.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Cannot establish network connection."; +"Appboy.feedback.no-connection.message" = "Please try again later."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Invalid Email Address"; +"Appboy.feedback.alert.invalid-email.message" = "Please enter a valid email address and try again."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Empty Feedback Message"; +"Appboy.feedback.alert.empty-feedback.message" = "Please enter a feedback message."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Feedback"; +"Appboy.feedback.cancel-button.title" = "Cancel"; +"Appboy.feedback.send-button.title" = "Send"; +"Appboy.feedback.label.message" = "Message"; +"Appboy.feedback.label.report-issue" = "Reporting an Issue?"; +"Appboy.feedback.email-text-field-place-hold" = "Email"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/es-419.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/es-419.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..a50c967b5 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/es-419.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "Ok"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "No se puede establecer conexión con la red."; +"Appboy.feedback.no-connection.message" = "Por favor, vuelva a intentarlo más tarde."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Dirección de correo electrónico inválida"; +"Appboy.feedback.alert.invalid-email.message" = "Por favor, ingrese una dirección de correo electrónica válida e inténtelo de nuevo."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Mensaje con comentarios vacío"; +"Appboy.feedback.alert.empty-feedback.message" = "Por favor, ingrese un mensaje con comentarios."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Comentarios"; +"Appboy.feedback.cancel-button.title" = "Cancelar"; +"Appboy.feedback.send-button.title" = "Enviar"; +"Appboy.feedback.label.message" = "Mensaje"; +"Appboy.feedback.label.report-issue" = "¿Desea informar un problema?"; +"Appboy.feedback.email-text-field-place-hold" = "Correo electrónico"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/es-MX.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/es-MX.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..a50c967b5 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/es-MX.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "Ok"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "No se puede establecer conexión con la red."; +"Appboy.feedback.no-connection.message" = "Por favor, vuelva a intentarlo más tarde."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Dirección de correo electrónico inválida"; +"Appboy.feedback.alert.invalid-email.message" = "Por favor, ingrese una dirección de correo electrónica válida e inténtelo de nuevo."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Mensaje con comentarios vacío"; +"Appboy.feedback.alert.empty-feedback.message" = "Por favor, ingrese un mensaje con comentarios."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Comentarios"; +"Appboy.feedback.cancel-button.title" = "Cancelar"; +"Appboy.feedback.send-button.title" = "Enviar"; +"Appboy.feedback.label.message" = "Mensaje"; +"Appboy.feedback.label.report-issue" = "¿Desea informar un problema?"; +"Appboy.feedback.email-text-field-place-hold" = "Correo electrónico"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/es.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/es.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..769abd54f --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/es.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "Correcto"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "No se puede establecer conexión de red. "; +"Appboy.feedback.no-connection.message" = "Por favor inténtelo más tarde."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Dirección de email incorrecta"; +"Appboy.feedback.alert.invalid-email.message" = "Por favor introduzca una dirección de email correcta e inténtelo de nuevo."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Mensaje de comentario vacío"; +"Appboy.feedback.alert.empty-feedback.message" = "Por favor introduzca un comentario."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Comentario"; +"Appboy.feedback.cancel-button.title" = "Cancelar"; +"Appboy.feedback.send-button.title" = "Enviar"; +"Appboy.feedback.label.message" = "Mensaje"; +"Appboy.feedback.label.report-issue" = "¿Quiere reportar una incidencia?"; +"Appboy.feedback.email-text-field-place-hold" = "Email"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/et.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/et.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..589eceb42 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/et.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Võrguühenduse loomine ebaõnnestus."; +"Appboy.feedback.no-connection.message" = "Palun proovige hiljem uuesti."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Vigane e-maili aadress"; +"Appboy.feedback.alert.invalid-email.message" = "Palun sisestage korrektne e-maili aadress ja proovige uuesti."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Tühi tagasiside sõnum"; +"Appboy.feedback.alert.empty-feedback.message" = "Palun sisestage tagasiside."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Tagasiside"; +"Appboy.feedback.cancel-button.title" = "Tühista"; +"Appboy.feedback.send-button.title" = "Saada"; +"Appboy.feedback.label.message" = "Sõnum"; +"Appboy.feedback.label.report-issue" = "Leidsid vea?"; +"Appboy.feedback.email-text-field-place-hold" = "E-mail"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/fi.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/fi.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..cbc82ddf6 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/fi.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Verkkoyhteyttä ei voida luoda."; +"Appboy.feedback.no-connection.message" = "Yritä myöhemmin uudelleen."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Virheellinen sähköpostiosoite"; +"Appboy.feedback.alert.invalid-email.message" = "Kirjoita voimassa oleva sähköpostiosoite ja yritä uudelleen."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Tyhjä palauteviesti"; +"Appboy.feedback.alert.empty-feedback.message" = "Kirjoita palauteviesti."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Palaute"; +"Appboy.feedback.cancel-button.title" = "Peruuta"; +"Appboy.feedback.send-button.title" = "Lähetä"; +"Appboy.feedback.label.message" = "Viesti"; +"Appboy.feedback.label.report-issue" = "Ilmoitatko ongelmasta?"; +"Appboy.feedback.email-text-field-place-hold" = "Sähköposti"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/fil.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/fil.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..4375e6954 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/fil.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Hindi makapagtatag ng koneksyon sa network."; +"Appboy.feedback.no-connection.message" = "angyaring subukan muli mamaya."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Hindi Wastong Address sa Email"; +"Appboy.feedback.alert.invalid-email.message" = "Mangyaring maglagay ng isang wastong address sa email at subukan muli."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Tanggalin Ang Lahat ng Mensahe ng Pagpuna"; +"Appboy.feedback.alert.empty-feedback.message" = "Mangyaring maglagay ng isang mensahe na pagpuna."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Puna"; +"Appboy.feedback.cancel-button.title" = "Kanselahin"; +"Appboy.feedback.send-button.title" = "Ipadala"; +"Appboy.feedback.label.message" = "Mensahe"; +"Appboy.feedback.label.report-issue" = "Nag-uulat ng isyu?"; +"Appboy.feedback.email-text-field-place-hold" = "Email"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/fr.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/fr.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..b21cab730 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/fr.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Impossible d'établir la connexion réseau."; +"Appboy.feedback.no-connection.message" = "Veuillez réessayer ultérieurement."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Adresse e-mail non valide"; +"Appboy.feedback.alert.invalid-email.message" = "Veuillez entrer une adresse e-mail valide et réessayer."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Message de commentaire vide"; +"Appboy.feedback.alert.empty-feedback.message" = "Veuillez entrer un message de commentaire."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Commentaire"; +"Appboy.feedback.cancel-button.title" = "Annuler"; +"Appboy.feedback.send-button.title" = "Envoyer"; +"Appboy.feedback.label.message" = "Message"; +"Appboy.feedback.label.report-issue" = "Signaler un problème ?"; +"Appboy.feedback.email-text-field-place-hold" = "E-mail"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/he.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/he.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..e4485309b --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/he.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "אשר"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = ".לא ניתן לקבוע חיבור רשת"; +"Appboy.feedback.no-connection.message" = ".בבקשה נסה שוב בקרוב"; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "כתובת מייל שגוי"; +"Appboy.feedback.alert.invalid-email.message" = "אנא הזן כתובת מייל חוקית ונסה שוב"; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "הודעת משוב ריקה"; +"Appboy.feedback.alert.empty-feedback.message" = "אנא הכנס הודעת משוב"; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "משוב"; +"Appboy.feedback.cancel-button.title" = "בטל"; +"Appboy.feedback.send-button.title" = "שלח"; +"Appboy.feedback.label.message" = "הודעה"; +"Appboy.feedback.label.report-issue" = "?דיווח על בעיה"; +"Appboy.feedback.email-text-field-place-hold" = "תובת מייל"; diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/hi.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/hi.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..f90011003 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/hi.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "ओके"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "नेटवर्क कनेक्शन स्थापित नहीं हो रहा है। ."; +"Appboy.feedback.no-connection.message" = "कृपया बाद में दोबारा प्रयास करें।."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "अमान्य ईमेल पता"; +"Appboy.feedback.alert.invalid-email.message" = "कुपया मान्य ईमेल पता दर्ज करें और दोबारा प्रयास करें।."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "रिक्त फीडबैक संदेश"; +"Appboy.feedback.alert.empty-feedback.message" = "कृपया फीडबैक संदेश प्रविष्ट करें."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "फीडबैक"; +"Appboy.feedback.cancel-button.title" = "रद्द करें"; +"Appboy.feedback.send-button.title" = "भेजें"; +"Appboy.feedback.label.message" = "संदेश"; +"Appboy.feedback.label.report-issue" = "क्या कोई समस्या रिपोर्ट कर रहे हैं?"; +"Appboy.feedback.email-text-field-place-hold" = "ईमेल"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/id.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/id.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..f60e72776 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/id.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OKE"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Tidak bisa melakukan koneksi jaringan."; +"Appboy.feedback.no-connection.message" = "Coba lagi nanti."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Alamat Email Tidak Valid"; +"Appboy.feedback.alert.invalid-email.message" = "Cantumkan alamat email yang valid dan coba lagi."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Pesan Masukan Kosong"; +"Appboy.feedback.alert.empty-feedback.message" = "Berikan pesan masukan."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Masukan"; +"Appboy.feedback.cancel-button.title" = "Batal"; +"Appboy.feedback.send-button.title" = "Kirim"; +"Appboy.feedback.label.message" = "Pesan"; +"Appboy.feedback.label.report-issue" = "Melaporkan Masalah?"; +"Appboy.feedback.email-text-field-place-hold" = "Email"; \ No newline at end of file diff --git a/AppboyKit/Appboy.bundle/checkmark-bg.png b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/images/checkmark-bg.png similarity index 55% rename from AppboyKit/Appboy.bundle/checkmark-bg.png rename to AppboyUI/ABKFeedbackViewController/Feedback_Resources/images/checkmark-bg.png index 441854847..62413607c 100644 Binary files a/AppboyKit/Appboy.bundle/checkmark-bg.png and b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/images/checkmark-bg.png differ diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/images/checkmark-bg@2x.png b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/images/checkmark-bg@2x.png new file mode 100644 index 000000000..7d92c47a7 Binary files /dev/null and b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/images/checkmark-bg@2x.png differ diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/images/checkmark.png b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/images/checkmark.png new file mode 100644 index 000000000..8c0eaf02f Binary files /dev/null and b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/images/checkmark.png differ diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/images/checkmark@2x.png b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/images/checkmark@2x.png new file mode 100644 index 000000000..190b7794f Binary files /dev/null and b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/images/checkmark@2x.png differ diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/it.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/it.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..6b6358939 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/it.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Impossibile stabilire una connessione di rete."; +"Appboy.feedback.no-connection.message" = "Riprovare più tardi."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Indirizzo e-mail non valido"; +"Appboy.feedback.alert.invalid-email.message" = "Inserire un indirizzo e-mail valido e riprovare."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Feedback vuoto"; +"Appboy.feedback.alert.empty-feedback.message" = "Inserire un feedback."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Feedback"; +"Appboy.feedback.cancel-button.title" = "Annulla"; +"Appboy.feedback.send-button.title" = "Invia"; +"Appboy.feedback.label.message" = "Messaggio"; +"Appboy.feedback.label.report-issue" = "Vuoi segnalare un problema?"; +"Appboy.feedback.email-text-field-place-hold" = "E-mail"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ja.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ja.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..e1bb822a2 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ja.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "ネットワークに接続できません。"; +"Appboy.feedback.no-connection.message" = "後でもう一度試してください。"; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "無効なEメールアドレス"; +"Appboy.feedback.alert.invalid-email.message" = "有効なEメールアドレスを入力してもう一度試してください。"; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "空白のフィードバックメッセージ"; +"Appboy.feedback.alert.empty-feedback.message" = "フィードバックの内容を入力してください。"; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "フィードバック"; +"Appboy.feedback.cancel-button.title" = "キャンセル"; +"Appboy.feedback.send-button.title" = "送信"; +"Appboy.feedback.label.message" = "メッセージ"; +"Appboy.feedback.label.report-issue" = "問題を報告しますか?"; +"Appboy.feedback.email-text-field-place-hold" = "Eメール"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/km.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/km.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..d5c319d3c --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/km.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "យល់ព្រម"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "មិនអាចបង្កើតបណ្តាញតភ្ជាប់បានទេ."; +"Appboy.feedback.no-connection.message" = "សូមព្យាយាមម្តងទៀតនៅពេលក្រោយ."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "អាស័យដ្ធានអ៊ីម៉ែលមិនត្រឹមត្រូវ"; +"Appboy.feedback.alert.invalid-email.message" = "សូមបញ្ចូលអាស័យដ្ធានអ៊ីម៉ែលដែលត្រឹមត្រូវ​ និងព្យាយាមម្តងទៀត."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "គ្មានសារមតិអ្នកប្រើទេ"; +"Appboy.feedback.alert.empty-feedback.message" = "សូមបញ្ចូលសារមតិអ្នកប្រើ."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "មតិអ្នកប្រើ"; +"Appboy.feedback.cancel-button.title" = "ទុកជាមោឃៈ"; +"Appboy.feedback.send-button.title" = "បញ្ជូន"; +"Appboy.feedback.label.message" = "សារ"; +"Appboy.feedback.label.report-issue" = "រាយការណ៍បញ្ហា?"; +"Appboy.feedback.email-text-field-place-hold" = "អ៊ីម៉ែល"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ko.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ko.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..0ddda4b7a --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ko.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "확인"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "네트워크 연결을 할 수 없습니다."; +"Appboy.feedback.no-connection.message" = "나중에 다시 시도해 주십시오."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "잘못된 이메일 주소"; +"Appboy.feedback.alert.invalid-email.message" = "정확한 이메일 주소를 입력하고 다시 시도해 주십시오."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "피드백이 없습니다."; +"Appboy.feedback.alert.empty-feedback.message" = "피드백을 입력해 주십시오."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "피드백"; +"Appboy.feedback.cancel-button.title" = "취소"; +"Appboy.feedback.send-button.title" = "전송"; +"Appboy.feedback.label.message" = "메시지"; +"Appboy.feedback.label.report-issue" = "문제를 보고하시겠습니까?"; +"Appboy.feedback.email-text-field-place-hold" = "이메일"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/lo.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/lo.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..84b4abe07 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/lo.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "ຕົກ​ລົງ"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "ບໍ່​ສາ​ມາດ​ຕັ້ງ​ການ​ເຊື່ອມ​ຕໍ່​ເຄືອ​ຂ່າຍ​ໄດ້."; +"Appboy.feedback.no-connection.message" = "ກະ​ລຸ​ນາ​ລອງ​ໃໝ່​ພາຍ​ຫຼັງ."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "ທີ່​ຢູ່​ອີ​ເມວ​ໃຊ້​ບໍ່​ໄດ້"; +"Appboy.feedback.alert.invalid-email.message" = "ກະ​ລຸ​ນາ​ປ້ອນທີ່​ຢູ່​ອີ​ເມວ​ທີ່​ໃຊ້​ໄດ້​ເຂົ້າ​ໄປ ແລະ​ລອງ​ໃໝ່​ອີກ."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "ຂໍ້​ຄວາມ​ຄຳ​ຕິ​ຊົມ​ຫວ່າງ​ເປົ່າ"; +"Appboy.feedback.alert.empty-feedback.message" = "ກະ​ລຸ​ນາ​ປ້ອນ​ຂໍ້​ຄວາມ​ຄຳ​ຕິ​ຊົມ."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "ຄຳ​ຕິ​ຊົມ"; +"Appboy.feedback.cancel-button.title" = "ຍົກ​ເລີກ"; +"Appboy.feedback.send-button.title" = "ສົ່ງ"; +"Appboy.feedback.label.message" = "ຂໍ້​ຄວາມ"; +"Appboy.feedback.label.report-issue" = "ລາຍ​ງານ​ບັນ​ຫາ​ບໍ?"; +"Appboy.feedback.email-text-field-place-hold" = "ອີ​ເມວ"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ms.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ms.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..06de44384 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ms.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Tidak boleh membuat sambungan rangkaian."; +"Appboy.feedback.no-connection.message" = "Sila cuba kemudian."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Alamat E-mel Tidak Sah"; +"Appboy.feedback.alert.invalid-email.message" = "Sila masukkan alamat e-mel yang sah dan cuba sekali lagi."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Tiada Mesej Maklum Balas"; +"Appboy.feedback.alert.empty-feedback.message" = "Sila masukkan mesej maklum balas."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Maklum Balas"; +"Appboy.feedback.cancel-button.title" = "Batal"; +"Appboy.feedback.send-button.title" = "Hantar"; +"Appboy.feedback.label.message" = "Mesej"; +"Appboy.feedback.label.report-issue" = "Laporkan Masalah?"; +"Appboy.feedback.email-text-field-place-hold" = "E-mel"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/my.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/my.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..b702582ce --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/my.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "ေကာင္းပါျပီ"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "ကြန္ယက္ဆက္သြယ္ျခင္း မျပဳလုပ္ႏိုင္ပါ။ ."; +"Appboy.feedback.no-connection.message" = "ေက်းဇူးျပဳ၍ ထပ္မံၾကိဳးစားၾကည္႕ပါ။."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "အီးေမးလ္ လိပ္စာ မမွန္ကန္ပါ။"; +"Appboy.feedback.alert.invalid-email.message" = "ေက်းဇူးျပဳ၍ အီးေမးလ္လိပ္စာ အမွန္ကို ထဲ့၍ ထပ္ၾကိဳးစားပါ။."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "တုန္႕ျပန္သတင္းစကားကို ပယ္ဖ်က္ပါ။"; +"Appboy.feedback.alert.empty-feedback.message" = "ေက်းဇူးျပဳ၍ တုန္႕ျပန္ သတင္းစကား ေပးပါ။."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "တုန္ျပန္ခ်က္"; +"Appboy.feedback.cancel-button.title" = "ဖ်က္သိမ္း"; +"Appboy.feedback.send-button.title" = "ပို႕"; +"Appboy.feedback.label.message" = "သတင္းစကား"; +"Appboy.feedback.label.report-issue" = "ျပႆနာတစ္ခုတင္ျပျခင္းပါလား။"; +"Appboy.feedback.email-text-field-place-hold" = "အီးေမးလ္"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/nb.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/nb.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..56607e143 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/nb.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Kan ikke etablere nettverkstilkobling."; +"Appboy.feedback.no-connection.message" = "Vennligst prøv igjen senere."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Ugyldig e-postadresse"; +"Appboy.feedback.alert.invalid-email.message" = "Vennligst skriv inn en gyldig e-postadresse og prøv igjen."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Fjern tilbakemelding"; +"Appboy.feedback.alert.empty-feedback.message" = "Vennligst skriv inn tilbakemelding."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Tilbakemelding"; +"Appboy.feedback.cancel-button.title" = "Avbryt"; +"Appboy.feedback.send-button.title" = "Send"; +"Appboy.feedback.label.message" = "Melding"; +"Appboy.feedback.label.report-issue" = "Rapporter et problem?"; +"Appboy.feedback.email-text-field-place-hold" = "E-post"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/nl.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/nl.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..86ae7032f --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/nl.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "Oké"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Kan geen netwerkverbinding maken."; +"Appboy.feedback.no-connection.message" = "Probeer het later opnieuw."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Ongeldig e-mailadres"; +"Appboy.feedback.alert.invalid-email.message" = "Voer een geldig e-mailadres in en probeer het opnieuw."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Feedbackbericht wissen"; +"Appboy.feedback.alert.empty-feedback.message" = "Voer een feedbackbericht in."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Feedback"; +"Appboy.feedback.cancel-button.title" = "Annuleren"; +"Appboy.feedback.send-button.title" = "Versturen"; +"Appboy.feedback.label.message" = "Bericht"; +"Appboy.feedback.label.report-issue" = "Een probleem melden?"; +"Appboy.feedback.email-text-field-place-hold" = "E-mail"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/pl.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/pl.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..19faaad3a --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/pl.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Nie można ustanowić połączenia z siecią. "; +"Appboy.feedback.no-connection.message" = "Proszę spróbować ponownie później."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Nieprawidłowy adres e-mail"; +"Appboy.feedback.alert.invalid-email.message" = "Proszę wpisać prawidłowy adres e-mail i spróbować ponownie."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Wyczyść komentarz."; +"Appboy.feedback.alert.empty-feedback.message" = "Proszę wpisać komentarz."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Komentarz"; +"Appboy.feedback.cancel-button.title" = "Anuluj"; +"Appboy.feedback.send-button.title" = "Wyślij"; +"Appboy.feedback.label.message" = "Wiadomość"; +"Appboy.feedback.label.report-issue" = "Zgłaszanie Problemu?"; +"Appboy.feedback.email-text-field-place-hold" = "E-mail"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/pt-PT.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/pt-PT.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..e0f291e32 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/pt-PT.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Não é possível estabelecer a ligação à rede."; +"Appboy.feedback.no-connection.message" = "Por favor, tente mais tarde."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Endereço de Email Inválido"; +"Appboy.feedback.alert.invalid-email.message" = "Por favor, introduza um endereço de email válido e tente novamente."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Comentário Inexistente"; +"Appboy.feedback.alert.empty-feedback.message" = "Por favor escreva o seu comentário."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Comentário"; +"Appboy.feedback.cancel-button.title" = "Cancelar"; +"Appboy.feedback.send-button.title" = "Enviar"; +"Appboy.feedback.label.message" = "Mensagem"; +"Appboy.feedback.label.report-issue" = "Comunicar um Problema?"; +"Appboy.feedback.email-text-field-place-hold" = "Email"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/pt.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/pt.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..aee54213f --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/pt.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Não é possível estabelecer uma conexão de rede."; +"Appboy.feedback.no-connection.message" = "Tente novamente mais tarde."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Endereço de e-mail inválido"; +"Appboy.feedback.alert.invalid-email.message" = "Insira um endereço de e-mail válido e tente novamente."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Não há mensagem de feedback."; +"Appboy.feedback.alert.empty-feedback.message" = "Insira uma mensagem de feedback."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Feedback"; +"Appboy.feedback.cancel-button.title" = "Cancelar"; +"Appboy.feedback.send-button.title" = "Enviar"; +"Appboy.feedback.label.message" = "Mensagem"; +"Appboy.feedback.label.report-issue" = "Relatar problema?"; +"Appboy.feedback.email-text-field-place-hold" = "E-mail"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ru.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ru.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..6bd3047a8 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/ru.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "Ok"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Невозможно установить сетевое подключение."; +"Appboy.feedback.no-connection.message" = "Пожалуйста, повторите попытку позже."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Недопустимый адрес электронной почты"; +"Appboy.feedback.alert.invalid-email.message" = "Пожалуйста, введите допустимый адрес электронной почты и попробуйте снова."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Поле отзыва пусто"; +"Appboy.feedback.alert.empty-feedback.message" = "Пожалуйста, Напишите свой отзыв."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Отзыв"; +"Appboy.feedback.cancel-button.title" = "Отменить"; +"Appboy.feedback.send-button.title" = "Отправить"; +"Appboy.feedback.label.message" = "Сообщение"; +"Appboy.feedback.label.report-issue" = "Сообщить о проблеме?"; +"Appboy.feedback.email-text-field-place-hold" = "Электронная почта"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/sv.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/sv.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..de4e3f811 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/sv.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Det gick inte att skapa en nätverksanslutning."; +"Appboy.feedback.no-connection.message" = "Försök igen senare."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Ogiltig e-postadress"; +"Appboy.feedback.alert.invalid-email.message" = "Ange en giltig e-postadress och försök igen."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Radera omdömet du har skrivit"; +"Appboy.feedback.alert.empty-feedback.message" = "Skriv in ett omdöme."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Omdöme"; +"Appboy.feedback.cancel-button.title" = "Avbryt"; +"Appboy.feedback.send-button.title" = "Skicka"; +"Appboy.feedback.label.message" = "Meddelande"; +"Appboy.feedback.label.report-issue" = "Vill du rapportera ett problem?"; +"Appboy.feedback.email-text-field-place-hold" = "E-post"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/th.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/th.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..3bc53ddac --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/th.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "ตกลง"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "ไม่สามารถสร้างการเชื่อมต่อเครือข่าย ."; +"Appboy.feedback.no-connection.message" = "กรุณาลองใหม่ภายหลัง."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "ที่อยู่อีเมลใช้ไม่ได้"; +"Appboy.feedback.alert.invalid-email.message" = "กรุณาใส่ที่อยู่อีเมลที่ถูกต้องและลองใหม่อีกครั้ง."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "ข้อความข้อคิดเห็นว่างเปล่า"; +"Appboy.feedback.alert.empty-feedback.message" = "กรุณาใส่ข้อความข้อคิดเห็น."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "ข้อคิดเห็น"; +"Appboy.feedback.cancel-button.title" = "ยกเลิก"; +"Appboy.feedback.send-button.title" = "ส่ง"; +"Appboy.feedback.label.message" = "ข้อความ"; +"Appboy.feedback.label.report-issue" = "รายงานปัญหา?"; +"Appboy.feedback.email-text-field-place-hold" = "อีเมล"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/vi.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/vi.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..9c7b543bc --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/vi.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "OK"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "Không thể thiết lập kết nối mạng."; +"Appboy.feedback.no-connection.message" = "Vui lòng thử lại sau."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "Ðịa Chỉ Email Không Hợp Lệ"; +"Appboy.feedback.alert.invalid-email.message" = "Vui lòng nhập một địa chỉ email hợp lệ và thử lại."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "Tin Nhắn Phản Hồi Còn Trống"; +"Appboy.feedback.alert.empty-feedback.message" = "Vui lòng nhập một tin nhắn phản hồi."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "Ý kiến phản hồi"; +"Appboy.feedback.cancel-button.title" = "Hủy"; +"Appboy.feedback.send-button.title" = "Gửi"; +"Appboy.feedback.label.message" = "Tin nhắn"; +"Appboy.feedback.label.report-issue" = "Báo Cáo Vấn Ðề?"; +"Appboy.feedback.email-text-field-place-hold" = "Email"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/zh-HK.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/zh-HK.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..6dc362b6d --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/zh-HK.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "好"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "無法建立網路連線"; +"Appboy.feedback.no-connection.message" = "請稍候再試."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "無效的電子郵箱"; +"Appboy.feedback.alert.invalid-email.message" = "請輸入有效的電子郵箱,再試一次."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "空白的反饋消息"; +"Appboy.feedback.alert.empty-feedback.message" = "請輸入您的反饋."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "反饋"; +"Appboy.feedback.cancel-button.title" = "取消"; +"Appboy.feedback.send-button.title" = "發送"; +"Appboy.feedback.label.message" = "反饋消息"; +"Appboy.feedback.label.report-issue" = "出錯了?"; +"Appboy.feedback.email-text-field-place-hold" = "電子郵箱"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/zh-Hans.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/zh-Hans.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..339aac349 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/zh-Hans.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "好"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "无法建立网络连接"; +"Appboy.feedback.no-connection.message" = "请稍候再试."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "无效的电子邮箱"; +"Appboy.feedback.alert.invalid-email.message" = "请输入有效的电子邮箱,再试一次."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "空白的反馈消息"; +"Appboy.feedback.alert.empty-feedback.message" = "请输入您的反馈."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "反馈"; +"Appboy.feedback.cancel-button.title" = "取消"; +"Appboy.feedback.send-button.title" = "发送"; +"Appboy.feedback.label.message" = "反馈消息"; +"Appboy.feedback.label.report-issue" = "出错了?"; +"Appboy.feedback.email-text-field-place-hold" = "电子邮箱"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/zh-Hant.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/zh-Hant.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..6dc362b6d --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/zh-Hant.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "好"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "無法建立網路連線"; +"Appboy.feedback.no-connection.message" = "請稍候再試."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "無效的電子郵箱"; +"Appboy.feedback.alert.invalid-email.message" = "請輸入有效的電子郵箱,再試一次."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "空白的反饋消息"; +"Appboy.feedback.alert.empty-feedback.message" = "請輸入您的反饋."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "反饋"; +"Appboy.feedback.cancel-button.title" = "取消"; +"Appboy.feedback.send-button.title" = "發送"; +"Appboy.feedback.label.message" = "反饋消息"; +"Appboy.feedback.label.report-issue" = "出錯了?"; +"Appboy.feedback.email-text-field-place-hold" = "電子郵箱"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/zh-TW.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/zh-TW.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..7d7972b62 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/zh-TW.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "好"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "無法建立網路連線"; +"Appboy.feedback.no-connection.message" = "請稍候再試."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "無效的電子郵箱"; +"Appboy.feedback.alert.invalid-email.message" = "請輸入有效的電子郵箱,再試一次."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "空白的反饋消息"; +"Appboy.feedback.alert.empty-feedback.message" = "請輸入您的反饋."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "反饋"; +"Appboy.feedback.cancel-button.title" = "取消"; +"Appboy.feedback.send-button.title" = "發送"; +"Appboy.feedback.label.message" = "反饋消息"; +"Appboy.feedback.label.report-issue" = "出錯了?"; +"Appboy.feedback.email-text-field-place-hold" = "電子郵件"; \ No newline at end of file diff --git a/AppboyUI/ABKFeedbackViewController/Feedback_Resources/zh.lproj/AppboyFeedbackLocalizable.strings b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/zh.lproj/AppboyFeedbackLocalizable.strings new file mode 100644 index 000000000..339aac349 --- /dev/null +++ b/AppboyUI/ABKFeedbackViewController/Feedback_Resources/zh.lproj/AppboyFeedbackLocalizable.strings @@ -0,0 +1,18 @@ +/* General Appboy Alarm Messages */ +"Appboy.alert.ok-button.title" = "好"; +/* Feedback No Connection Messages */ +"Appboy.feedback.no-connection.title" = "无法建立网络连接"; +"Appboy.feedback.no-connection.message" = "请稍候再试."; +/* Feedback Alert Invalid Email Messages */ +"Appboy.feedback.alert.invalid-email.title" = "无效的电子邮箱"; +"Appboy.feedback.alert.invalid-email.message" = "请输入有效的电子邮箱,再试一次."; +/* Feedback Alert Empty Feedback Labels */ +"Appboy.feedback.alert.empty-feedback.title" = "空白的反馈消息"; +"Appboy.feedback.alert.empty-feedback.message" = "请输入您的反馈."; +/* Feedback Context Labels */ +"Appboy.feedback.modal-context.title" = "反馈"; +"Appboy.feedback.cancel-button.title" = "取消"; +"Appboy.feedback.send-button.title" = "发送"; +"Appboy.feedback.label.message" = "反馈消息"; +"Appboy.feedback.label.report-issue" = "出错了?"; +"Appboy.feedback.email-text-field-place-hold" = "电子邮箱"; \ No newline at end of file diff --git a/AppboyUI/ABKUIUtils/ABKUIUtils.h b/AppboyUI/ABKUIUtils/ABKUIUtils.h new file mode 100644 index 000000000..326945740 --- /dev/null +++ b/AppboyUI/ABKUIUtils/ABKUIUtils.h @@ -0,0 +1,7 @@ +#import + +@interface ABKUIUtils : NSObject + ++ (NSString *)getLocalizedString:(NSString *)key inAppboyBundle:(NSBundle *)appboyBundle table:(NSString *)table; + +@end diff --git a/AppboyUI/ABKUIUtils/ABKUIUtils.m b/AppboyUI/ABKUIUtils/ABKUIUtils.m new file mode 100644 index 000000000..9524fecc3 --- /dev/null +++ b/AppboyUI/ABKUIUtils/ABKUIUtils.m @@ -0,0 +1,35 @@ +#import "ABKUIUtils.h" + +static NSString *const LocalizedAppboyStringNotFound = @"not found"; + +@implementation ABKUIUtils + ++ (NSString *)getLocalizedString:(NSString *)key inAppboyBundle:(NSBundle *)appboyBundle table:(NSString *)table { + // Check if the app has a customized localization for the given key + NSString *localizedString = [[NSBundle mainBundle] localizedStringForKey:key + value:LocalizedAppboyStringNotFound + table:nil]; + if ([localizedString isEqualToString:LocalizedAppboyStringNotFound]) { + // Check Appboy's localization in the given bundle + for (NSString *language in [[NSBundle mainBundle] preferredLocalizations]) { + if ([[appboyBundle localizations] containsObject:language]) { + NSBundle *languageBundle = [NSBundle bundleWithPath:[appboyBundle pathForResource:language ofType:@"lproj"]]; + localizedString = [languageBundle localizedStringForKey:key + value:LocalizedAppboyStringNotFound + table:table]; + break; + } + } + if ([localizedString isEqualToString:LocalizedAppboyStringNotFound]) { + // Couldn't find Appboy's localization for the given key, fetch the default value for the key + // from Base.lproj. + NSBundle *appboyBaseBundle = [NSBundle bundleWithPath:[appboyBundle pathForResource:@"Base" ofType:@"lproj"]]; + localizedString = [appboyBaseBundle localizedStringForKey:key + value:LocalizedAppboyStringNotFound + table:table]; + } + } + return localizedString; +} + +@end diff --git a/CHANGELOG.md b/CHANGELOG.md index cdb13b867..3a5d93465 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,22 @@ - Removal 1 - Removal 2 --> + +## 2.31.0 +##### Breaking: + - Open sources the Feedback view controllers and moves them into a new subspec "Feedback". + - The "Feedback" subspec has the Appboy Feedback UI and the Core SDK. It will not include in-app messages or News Feed UI. + - Removes the popover context for Feedback due to the deprecation of UIPopoverViewController in iOS. + - Renames the `ABKFeedbackViewControllerModalContext` and `ABKFeedbackViewControllerNavigationContext` class to `ABKModalFeedbackViewController` and `ABKNavigationFeedbackViewController`. + - The open-sourced Feedback view controllers offer backward compatible NUI support, although we recommend using categories or subclassing the Feedback view controllers for customization as NUI library isn't actively maintained any more. See [here](https://github.com/Appboy/appboy-ios-sdk/tree/master/AppboyUI/ABKFeedbackViewController/FeedbackViewController/ABKFeedbackViewController.h) for customization details. + - See our [Feedback Sample app](https://github.com/Appboy/appboy-ios-sdk/tree/master/Samples/Feedback/AppboyFeedbackSample) for sample implementations and customizations. + +##### Added: +- Adds user aliasing capability. Aliases can be used in the API and dashboard to identify users in addition to their ID. See the `addAlias:withLabel:` method on `ABKUser` for more information. + +##### Changed: + - Updates the `AppboyKit.h` to include all the public header files in the SDK. + ## 2.30.0 ##### Breaking: - Open sources the `ABKModalWebViewController` class, which is used to display the web URLs from push or in-app message clicks. diff --git a/Example/Podfile b/Example/Podfile index adbab7d85..afe2852c4 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -7,7 +7,6 @@ target :Stopwatch do pod 'Appboy-iOS-SDK' pod 'NUI',:git => 'https://github.com/tombenner/nui.git' pod 'KKColorListPicker', :git => 'https://github.com/leoru/KKColorListPicker.git' - pod 'CrittercismSDK' pod 'Firebase/DynamicLinks' pod 'Branch' end diff --git a/Example/Stopwatch.xcodeproj/project.pbxproj b/Example/Stopwatch.xcodeproj/project.pbxproj index b28e8a50e..24831eccd 100644 --- a/Example/Stopwatch.xcodeproj/project.pbxproj +++ b/Example/Stopwatch.xcodeproj/project.pbxproj @@ -89,6 +89,7 @@ E397F41A1CC5BA550095A3ED /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E397F4181CC5BA540095A3ED /* Main.storyboard */; }; E397F41C1CC5BA550095A3ED /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E397F41B1CC5BA550095A3ED /* Assets.xcassets */; }; E3A8A3641E5E6C07002E8821 /* IDFADelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E3A8A3631E5E6C07002E8821 /* IDFADelegate.m */; }; + E3C754A41E70DE7D004E1CCE /* AliasViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E3C754A31E70DE7D004E1CCE /* AliasViewController.m */; }; E3C754AA1E7AE9B3004E1CCE /* InAppMessageWithJS.html in Resources */ = {isa = PBXBuildFile; fileRef = E3C754A91E7AE9B3004E1CCE /* InAppMessageWithJS.html */; }; E3C754AC1E7B4F20004E1CCE /* InAppMessageWithoutAssetZip.html in Resources */ = {isa = PBXBuildFile; fileRef = E3C754AB1E7B4F20004E1CCE /* InAppMessageWithoutAssetZip.html */; }; /* End PBXBuildFile section */ @@ -261,6 +262,8 @@ E397F41D1CC5BA550095A3ED /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; E3A8A3621E5E6C07002E8821 /* IDFADelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDFADelegate.h; sourceTree = ""; }; E3A8A3631E5E6C07002E8821 /* IDFADelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IDFADelegate.m; sourceTree = ""; }; + E3C754A21E70DE7D004E1CCE /* AliasViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AliasViewController.h; sourceTree = ""; }; + E3C754A31E70DE7D004E1CCE /* AliasViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AliasViewController.m; sourceTree = ""; }; E3C754A91E7AE9B3004E1CCE /* InAppMessageWithJS.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = InAppMessageWithJS.html; sourceTree = ""; }; E3C754AB1E7B4F20004E1CCE /* InAppMessageWithoutAssetZip.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = InAppMessageWithoutAssetZip.html; sourceTree = ""; }; E3ED8D401CE54C0300C23B99 /* AppboyTVOSKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppboyTVOSKit.framework; path = ../Public/AppboyTVOSKit.framework; sourceTree = ""; }; @@ -474,6 +477,8 @@ E325DF451E29A93300B3E168 /* GeofencesViewController.m */, E3A8A3621E5E6C07002E8821 /* IDFADelegate.h */, E3A8A3631E5E6C07002E8821 /* IDFADelegate.m */, + E3C754A21E70DE7D004E1CCE /* AliasViewController.h */, + E3C754A31E70DE7D004E1CCE /* AliasViewController.m */, ); path = Stopwatch; sourceTree = ""; @@ -938,6 +943,7 @@ D4C6940D1CA5E2E2006B69B1 /* UserAttributesArrayViewController.m in Sources */, D41D8F741CB70A4600D622EF /* ContainerViewController.m in Sources */, 4EA7AA8E185626EC00D2B651 /* MiscViewController.m in Sources */, + E3C754A41E70DE7D004E1CCE /* AliasViewController.m in Sources */, 4EB014FE1A79D4C900E11E41 /* CustomInAppMessageViewController.m in Sources */, E325DF461E29A93300B3E168 /* GeofencesViewController.m in Sources */, 4EB014FD1A79D31D00E11E41 /* InAppMessageTestViewController.m in Sources */, @@ -1091,7 +1097,7 @@ ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.appboy.stopwatch; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "fbc30420-4ac5-400b-a7e4-7260267c79eb"; + PROVISIONING_PROFILE = "43df0e9f-30b8-4642-89ab-833d3610a246"; PROVISIONING_PROFILE_SPECIFIER = "match Development com.appboy.stopwatch"; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; @@ -1187,7 +1193,7 @@ ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.appboy.stopwatch; PRODUCT_NAME = StopwatchDevelop; - PROVISIONING_PROFILE = "79170da0-b2a3-4b68-a1ca-c6d039ac3bed"; + PROVISIONING_PROFILE = "c4748d93-9f90-434e-88c7-e5ee76698361"; PROVISIONING_PROFILE_SPECIFIER = "match AdHoc com.appboy.stopwatch"; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; @@ -1216,7 +1222,7 @@ ONLY_ACTIVE_ARCH = NO; PRODUCT_BUNDLE_IDENTIFIER = com.appboy.stopwatch; PRODUCT_NAME = Stopwatch; - PROVISIONING_PROFILE = "710cc9d2-a3db-4e57-85bf-cb1302fdac6a"; + PROVISIONING_PROFILE = "e8925011-22fa-4bfe-a3e1-82cf6d9ab66f"; PROVISIONING_PROFILE_SPECIFIER = "match AppStore com.appboy.stopwatch"; TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; diff --git a/Example/Stopwatch/AliasViewController.h b/Example/Stopwatch/AliasViewController.h new file mode 100644 index 000000000..0ed888b42 --- /dev/null +++ b/Example/Stopwatch/AliasViewController.h @@ -0,0 +1,8 @@ +@interface AliasViewController : UIViewController + +@property (weak, nonatomic) IBOutlet UITextField *aliasLabelTextField; +@property (weak, nonatomic) IBOutlet UITextField *aliasTextField; + +- (IBAction)addUserAliasButtonClick:(id)sender; + +@end diff --git a/Example/Stopwatch/AliasViewController.m b/Example/Stopwatch/AliasViewController.m new file mode 100644 index 000000000..2a2bb91fb --- /dev/null +++ b/Example/Stopwatch/AliasViewController.m @@ -0,0 +1,18 @@ +#import "AliasViewController.h" +#import "AppboyKit.h" + +@implementation AliasViewController + +- (void)viewDidLoad { + [super viewDidLoad]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; +} + +- (IBAction)addUserAliasButtonClick:(id)sender { + [[Appboy sharedInstance].user addAlias:self.aliasTextField.text withLabel:self.aliasLabelTextField.text]; +} + +@end diff --git a/Example/Stopwatch/AppDelegate.m b/Example/Stopwatch/AppDelegate.m index f810f458f..7e8f61ee5 100644 --- a/Example/Stopwatch/AppDelegate.m +++ b/Example/Stopwatch/AppDelegate.m @@ -2,7 +2,6 @@ #import #import "NUISettings.h" #import "ABKPushUtils.h" -#import #import "OverrideEndpointDelegate.h" #import "IDFADelegate.h" #import "ABKThemableFeedNavigationBar.h" @@ -14,8 +13,6 @@ #else static NSString *const AppboyApiKey = @"appboy-sample-ios"; #endif -static NSString *const CrittercismAppId = @"51b67d141386207417000002"; -static NSString *const CrittercismObserverName = @"CRCrashNotification"; @implementation AppDelegate @@ -70,20 +67,6 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( withLaunchOptions:launchOptions withAppboyOptions:appboyOptions]; - // Sets up Crittercism for crash and error tracking. - // Need to initialize Appboy before initializing Crittercism so custom events will be logged in crashDidOccur. - // Need to subscribe to crash notifications before initializing Crittercism. - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(crashDidOccur:) - name:CrittercismObserverName object:nil]; - - [Crittercism enableWithAppID:CrittercismAppId]; - [Crittercism leaveBreadcrumb:[NSString stringWithFormat:@"startWithApiKey: %@", AppboyApiKey]]; - - if ([Appboy sharedInstance].user.email) { - [Crittercism setUsername:[Appboy sharedInstance].user.email]; - } - // 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; @@ -106,6 +89,8 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( }]; [self setUpRemoteNotification]; + + NSLog(@"Appboy device identifier is %@", [[Appboy sharedInstance] getDeviceId]); return YES; } @@ -128,7 +113,6 @@ - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserAct // 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]); [[Appboy sharedInstance] registerPushToken:[NSString stringWithFormat:@"%@", deviceToken]]; } @@ -294,19 +278,6 @@ - (BOOL)handleAppboyURL:(NSURL *)url fromChannel:(ABKChannel)channel withExtras: return NO; } -#pragma mark - Apteligent/Crittercism - -/* Send crash event to Appboy upon notification */ -- (void) crashDidOccur:(NSNotification*)notification { - NSDictionary *crashInfo = notification.userInfo; - - [[Appboy sharedInstance] logCustomEvent:@"ApteligentCrashEvent" - withProperties:crashInfo]; - [[Appboy sharedInstance].user setCustomAttributeWithKey:@"lastCrashName" andStringValue:crashInfo[@"crashName"]]; - [[Appboy sharedInstance].user setCustomAttributeWithKey:@"lastCrashReason" andStringValue:crashInfo[@"crashReason"]]; - [[Appboy sharedInstance].user setCustomAttributeWithKey:@"lastCrashDate" andDateValue:crashInfo[@"crashDate"]]; -} - # pragma mark - Helper methods - (void)showAlertWithTitle:(NSString *)title andMessage:(NSString *)message { diff --git a/Example/Stopwatch/Base.lproj/MainStoryboard.storyboard b/Example/Stopwatch/Base.lproj/MainStoryboard.storyboard new file mode 100755 index 000000000..d75bc85d1 --- /dev/null +++ b/Example/Stopwatch/Base.lproj/MainStoryboard.storyboard @@ -0,0 +1,1927 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Stopwatch/CustomTabBarController.h b/Example/Stopwatch/CustomTabBarController.h index b58a432cd..814643957 100644 --- a/Example/Stopwatch/CustomTabBarController.h +++ b/Example/Stopwatch/CustomTabBarController.h @@ -1,6 +1,5 @@ #import -#import -@interface CustomTabBarController : UITabBarController +@interface CustomTabBarController : UITabBarController -@end \ No newline at end of file +@end diff --git a/Example/Stopwatch/CustomTabBarController.m b/Example/Stopwatch/CustomTabBarController.m index 90fb004a6..a0f196537 100644 --- a/Example/Stopwatch/CustomTabBarController.m +++ b/Example/Stopwatch/CustomTabBarController.m @@ -9,7 +9,7 @@ - (void)viewDidLoad { // Add tab bar items to UITabBarController NSMutableArray *viewControllers = [[NSMutableArray alloc] initWithObjects: - [self addNavigationControllerWithChildren:@[@"Attributes", @"Arrays", @"Events"] andTitle:@"User" andImageName:@"user" withFeedAndFlushButtons:YES], // User tab + [self addNavigationControllerWithChildren:@[@"Attributes", @"Arrays", @"Events", @"Alias"] andTitle:@"User" andImageName:@"user" withFeedAndFlushButtons:YES], // User tab [self addNavigationControllerWithChildren:@[@"UI", @"Controls"] andTitle:@"IAM" andImageName:@"IAM" withFeedAndFlushButtons:NO], // IAM tab [self addNavigationControllerWithIdentifier:@"FeedAndFeedbackViewController" withTitle:@"Feed/Feedback" andImageName:@"newsfeed"], // Feed/Feedback tab [self addNavigationControllerWithChildren:@[@"Misc", @"Social"] andTitle:@"Advanced" andImageName:@"bolt" withFeedAndFlushButtons:NO], // Advanced tab diff --git a/Example/Stopwatch/FeedAndFeedbackUIViewController.h b/Example/Stopwatch/FeedAndFeedbackUIViewController.h index acc7f2d7a..e0ac5a627 100644 --- a/Example/Stopwatch/FeedAndFeedbackUIViewController.h +++ b/Example/Stopwatch/FeedAndFeedbackUIViewController.h @@ -1,7 +1,7 @@ #import #import -@interface FeedAndFeedbackViewController : UIViewController +@interface FeedAndFeedbackViewController : UIViewController @property IBOutlet UINavigationController *newsAndFeedbackNavigationController; @property IBOutlet UILabel *unreadCardLabel; diff --git a/Example/Stopwatch/FeedAndFeedbackUIViewController.m b/Example/Stopwatch/FeedAndFeedbackUIViewController.m index f95afab2a..2d9e3684d 100644 --- a/Example/Stopwatch/FeedAndFeedbackUIViewController.m +++ b/Example/Stopwatch/FeedAndFeedbackUIViewController.m @@ -1,5 +1,7 @@ #import #import "FeedAndFeedbackUIViewController.h" +#import "ABKNavigationFeedbackViewController.h" +#import "ABKModalFeedbackViewController.h" @implementation FeedAndFeedbackViewController @@ -46,7 +48,7 @@ - (void)feedUpdated:(NSNotification *)notification { - (void)openFeedbackFromNavigationFeed:(id)sender { // Navigation context - ABKFeedbackViewControllerNavigationContext *navFeedback = [[ABKFeedbackViewControllerNavigationContext alloc] init]; + ABKNavigationFeedbackViewController *navFeedback = [[ABKNavigationFeedbackViewController alloc] init]; [self.newsAndFeedbackNavigationController pushViewController:navFeedback animated:YES]; } @@ -138,18 +140,10 @@ - (void)feedViewControllerModalContextCloseTapped:(ABKFeedViewControllerModalCon // An example modal feedback view controller - (IBAction)modalFeedbackButtonTapped:(id)sender { - ABKFeedbackViewControllerModalContext *modalFeedback = [[ABKFeedbackViewControllerModalContext alloc] init]; - - // Setting the delegate will notify us when either the "Cancel" or "Send" buttons are tapped - modalFeedback.feedbackDelegate = self; + ABKModalFeedbackViewController *modalFeedback = [[ABKModalFeedbackViewController alloc] init]; [self presentViewController:modalFeedback animated:YES completion:nil]; } -// This `ABKFeedbackViewControllerModalContextDelegate` delegate method is called when "Cancel" is tapped -- (void)feedbackViewControllerModalContextCancelTapped:(ABKFeedbackViewControllerModalContext *)sender { - [self dismissViewControllerAnimated:YES completion:nil]; -} - # pragma mark Feedback - (IBAction)submitInstantFeedback:(id)sender { diff --git a/Example/Stopwatch/Stopwatch-Info.plist b/Example/Stopwatch/Stopwatch-Info.plist index 674e4b89f..9d1ecd9da 100644 --- a/Example/Stopwatch/Stopwatch-Info.plist +++ b/Example/Stopwatch/Stopwatch-Info.plist @@ -24,7 +24,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.30.0 + 2.31.0 CFBundleSignature ???? CFBundleURLTypes diff --git a/Example/Stopwatch/UserAttributesViewController.m b/Example/Stopwatch/UserAttributesViewController.m index a78c09e15..5f2c07fe8 100755 --- a/Example/Stopwatch/UserAttributesViewController.m +++ b/Example/Stopwatch/UserAttributesViewController.m @@ -1,7 +1,6 @@ #import "UserAttributesViewController.h" #import #import "UserCells.h" -#import static NSInteger const TextFieldTagNumber = 1000; static NSInteger const TotalNumberOfAttributes = 12; @@ -243,8 +242,6 @@ - (IBAction)doneButtonTapped:(id)sender { } } - [Crittercism leaveBreadcrumb:@"update appboy user's attributes"]; - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:NSLocalizedString(@"Appboy.Stopwatch.user-attributes.updated-message", nil) delegate:nil @@ -260,7 +257,6 @@ - (IBAction)doneButtonTapped:(id)sender { if (object && object != [NSNull null]) { switch (i) { case 0: - [Crittercism leaveBreadcrumb:[NSString stringWithFormat:@"change appboy user to %@", object]]; [[Appboy sharedInstance] changeUser:(NSString *)object]; continue; @@ -273,7 +269,6 @@ - (IBAction)doneButtonTapped:(id)sender { continue; case 3: - [Crittercism setUsername:[Appboy sharedInstance].user.email]; [Appboy sharedInstance].user.email = (NSString *)object; continue; diff --git a/Example/Stopwatch/en.lproj/MainStoryboard.storyboard b/Example/Stopwatch/en.lproj/MainStoryboard.storyboard index d75bc85d1..f00f3b407 100755 --- a/Example/Stopwatch/en.lproj/MainStoryboard.storyboard +++ b/Example/Stopwatch/en.lproj/MainStoryboard.storyboard @@ -1,11 +1,11 @@ - - + + - + @@ -864,7 +864,7 @@ - + @@ -1203,7 +1203,64 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1836,10 +1893,10 @@ - + - + diff --git a/Example/StopwatchNotificationContentExtension/StopwatchNotificationContentExtension.entitlements b/Example/StopwatchNotificationContentExtension/StopwatchNotificationContentExtension.entitlements deleted file mode 100644 index 75ed96828..000000000 --- a/Example/StopwatchNotificationContentExtension/StopwatchNotificationContentExtension.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.security.application-groups - - group.com.appboy.stopwatch - - - diff --git a/Example/StopwatchNotificationService/NotificationService.m b/Example/StopwatchNotificationService/NotificationService.m index 3b23fb163..d8f93123d 100644 --- a/Example/StopwatchNotificationService/NotificationService.m +++ b/Example/StopwatchNotificationService/NotificationService.m @@ -12,6 +12,7 @@ @interface NotificationService () @property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent; @property (nonatomic, strong) UNMutableNotificationContent *originalContent; @property BOOL abortOnAttachmentFailure; +@property NSURLSession *session; @end @@ -71,8 +72,8 @@ - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withConte // Download, store, and attach the content to the notification if (attachmentURLString) { NSURL *attachmentURL = [NSURL URLWithString:attachmentURLString]; - NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; - [[session downloadTaskWithURL:attachmentURL + self.session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; + [[self.session downloadTaskWithURL:attachmentURL completionHandler:^(NSURL *temporaryFileLocation, NSURLResponse *response, NSError *error) { if (error != nil) { [self.class logMessage:@"Error fetching attachment, displaying content unaltered: %@", [error localizedDescription]]; @@ -96,6 +97,7 @@ - (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withConte attachments[0] = attachment; self.bestAttemptContent.attachments = attachments; self.contentHandler(self.bestAttemptContent); + [self.session finishTasksAndInvalidate]; } }] resume]; } @@ -116,6 +118,7 @@ - (void)displayOriginalContent { } - (void)serviceExtensionTimeWillExpire { + [self.session invalidateAndCancel]; [self.class logMessage:@"Service extension called, displaying original content"]; // Called just before the extension will be terminated by the system. // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. diff --git a/Example/fastlane/Fastfile b/Example/fastlane/Fastfile index a7e48de4d..f011c9b82 100644 --- a/Example/fastlane/Fastfile +++ b/Example/fastlane/Fastfile @@ -19,6 +19,8 @@ lane :matchFullAccess do match(type: "appstore", app_identifier: "com.appboy.stopwatch", force_for_new_devices: true) match(type: "development", app_identifier: "com.appboy.stopwatch.StopwatchNotificationService", force_for_new_devices: true) match(type: "adhoc", app_identifier: "com.appboy.stopwatch.StopwatchNotificationService", force_for_new_devices: true) + match(type: "development", app_identifier: "com.appboy.stopwatch.StopwatchNotificationContentExtension", force_for_new_devices: true) + match(type: "adhoc", app_identifier: "com.appboy.stopwatch.StopwatchNotificationContentExtension", force_for_new_devices: true) end lane :matchReadOnly do @@ -27,6 +29,8 @@ lane :matchReadOnly do match(type: "appstore", app_identifier: "com.appboy.stopwatch", readonly: true, force_for_new_devices: true) match(type: "development", app_identifier: "com.appboy.stopwatch.StopwatchNotificationService", readonly: true, force_for_new_devices: true) match(type: "adhoc", app_identifier: "com.appboy.stopwatch.StopwatchNotificationService", readonly: true, force_for_new_devices: true) + match(type: "development", app_identifier: "com.appboy.stopwatch.StopwatchNotificationContentExtension", readonly: true, force_for_new_devices: true) + match(type: "adhoc", app_identifier: "com.appboy.stopwatch.StopwatchNotificationContentExtension", readonly: true, force_for_new_devices: true) end # More information about multiple platforms in fastlane: https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Platforms.md diff --git a/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample.xcodeproj/project.pbxproj b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample.xcodeproj/project.pbxproj new file mode 100644 index 000000000..385cb561e --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample.xcodeproj/project.pbxproj @@ -0,0 +1,514 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 30235ABF349C953E99762E9D /* libPods-AppboyFeedbackSample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 42A7A811DDAE4C79EEB82AC8 /* libPods-AppboyFeedbackSample.a */; }; + C1B92E281F02C24F0034AD28 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C1B92E271F02C24F0034AD28 /* main.m */; }; + C1B92E2B1F02C24F0034AD28 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C1B92E2A1F02C24F0034AD28 /* AppDelegate.m */; }; + C1B92E311F02C24F0034AD28 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C1B92E2F1F02C24F0034AD28 /* Main.storyboard */; }; + C1B92E331F02C24F0034AD28 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C1B92E321F02C24F0034AD28 /* Assets.xcassets */; }; + C1B92E361F02C24F0034AD28 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C1B92E341F02C24F0034AD28 /* LaunchScreen.storyboard */; }; + C1B92E411F02C2500034AD28 /* AppboyFeedbackSampleUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = C1B92E401F02C2500034AD28 /* AppboyFeedbackSampleUITests.m */; }; + C1B92E4D1F02CCD90034AD28 /* CustomAppboyFeedbackViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C1B92E4C1F02CCD90034AD28 /* CustomAppboyFeedbackViewController.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + C1B92E3D1F02C2500034AD28 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C1B92E1B1F02C24F0034AD28 /* Project object */; + proxyType = 1; + remoteGlobalIDString = C1B92E221F02C24F0034AD28; + remoteInfo = AppboyFeedbackSample; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 42A7A811DDAE4C79EEB82AC8 /* libPods-AppboyFeedbackSample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-AppboyFeedbackSample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 477E7AC93E31BC7ECD27308E /* Pods-AppboyFeedbackSample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AppboyFeedbackSample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AppboyFeedbackSample/Pods-AppboyFeedbackSample.debug.xcconfig"; sourceTree = ""; }; + 8F2765BD08F414A280B86973 /* Pods-AppboyFeedbackSample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AppboyFeedbackSample.release.xcconfig"; path = "Pods/Target Support Files/Pods-AppboyFeedbackSample/Pods-AppboyFeedbackSample.release.xcconfig"; sourceTree = ""; }; + C1B92E231F02C24F0034AD28 /* AppboyFeedbackSample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AppboyFeedbackSample.app; sourceTree = BUILT_PRODUCTS_DIR; }; + C1B92E271F02C24F0034AD28 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + C1B92E291F02C24F0034AD28 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + C1B92E2A1F02C24F0034AD28 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + C1B92E301F02C24F0034AD28 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + C1B92E321F02C24F0034AD28 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + C1B92E351F02C24F0034AD28 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + C1B92E371F02C24F0034AD28 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C1B92E3C1F02C2500034AD28 /* AppboyFeedbackSampleUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AppboyFeedbackSampleUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + C1B92E401F02C2500034AD28 /* AppboyFeedbackSampleUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppboyFeedbackSampleUITests.m; sourceTree = ""; }; + C1B92E421F02C2500034AD28 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C1B92E4B1F02CCD90034AD28 /* CustomAppboyFeedbackViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomAppboyFeedbackViewController.h; sourceTree = ""; }; + C1B92E4C1F02CCD90034AD28 /* CustomAppboyFeedbackViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomAppboyFeedbackViewController.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + C1B92E201F02C24F0034AD28 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 30235ABF349C953E99762E9D /* libPods-AppboyFeedbackSample.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C1B92E391F02C2500034AD28 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9462742AA5916C8459CB0E83 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 42A7A811DDAE4C79EEB82AC8 /* libPods-AppboyFeedbackSample.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + C1B92E1A1F02C24F0034AD28 = { + isa = PBXGroup; + children = ( + C1B92E251F02C24F0034AD28 /* AppboyFeedbackSample */, + C1B92E3F1F02C2500034AD28 /* AppboyFeedbackSampleUITests */, + C1B92E241F02C24F0034AD28 /* Products */, + E96C1EC9C2D06BFE51CC51E6 /* Pods */, + 9462742AA5916C8459CB0E83 /* Frameworks */, + ); + sourceTree = ""; + }; + C1B92E241F02C24F0034AD28 /* Products */ = { + isa = PBXGroup; + children = ( + C1B92E231F02C24F0034AD28 /* AppboyFeedbackSample.app */, + C1B92E3C1F02C2500034AD28 /* AppboyFeedbackSampleUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + C1B92E251F02C24F0034AD28 /* AppboyFeedbackSample */ = { + isa = PBXGroup; + children = ( + C1B92E291F02C24F0034AD28 /* AppDelegate.h */, + C1B92E2A1F02C24F0034AD28 /* AppDelegate.m */, + C1B92E4B1F02CCD90034AD28 /* CustomAppboyFeedbackViewController.h */, + C1B92E4C1F02CCD90034AD28 /* CustomAppboyFeedbackViewController.m */, + C1B92E2F1F02C24F0034AD28 /* Main.storyboard */, + C1B92E321F02C24F0034AD28 /* Assets.xcassets */, + C1B92E341F02C24F0034AD28 /* LaunchScreen.storyboard */, + C1B92E371F02C24F0034AD28 /* Info.plist */, + C1B92E261F02C24F0034AD28 /* Supporting Files */, + ); + path = AppboyFeedbackSample; + sourceTree = ""; + }; + C1B92E261F02C24F0034AD28 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + C1B92E271F02C24F0034AD28 /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + C1B92E3F1F02C2500034AD28 /* AppboyFeedbackSampleUITests */ = { + isa = PBXGroup; + children = ( + C1B92E401F02C2500034AD28 /* AppboyFeedbackSampleUITests.m */, + C1B92E421F02C2500034AD28 /* Info.plist */, + ); + path = AppboyFeedbackSampleUITests; + sourceTree = ""; + }; + E96C1EC9C2D06BFE51CC51E6 /* Pods */ = { + isa = PBXGroup; + children = ( + 477E7AC93E31BC7ECD27308E /* Pods-AppboyFeedbackSample.debug.xcconfig */, + 8F2765BD08F414A280B86973 /* Pods-AppboyFeedbackSample.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + C1B92E221F02C24F0034AD28 /* AppboyFeedbackSample */ = { + isa = PBXNativeTarget; + buildConfigurationList = C1B92E451F02C2500034AD28 /* Build configuration list for PBXNativeTarget "AppboyFeedbackSample" */; + buildPhases = ( + B97581E435794EF64C4A8C96 /* [CP] Check Pods Manifest.lock */, + C1B92E1F1F02C24F0034AD28 /* Sources */, + C1B92E201F02C24F0034AD28 /* Frameworks */, + C1B92E211F02C24F0034AD28 /* Resources */, + F1C4C4FA55AE63B3A5714DCF /* [CP] Embed Pods Frameworks */, + B99AE614D575E03FE829FCFC /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = AppboyFeedbackSample; + productName = AppboyFeedbackSample; + productReference = C1B92E231F02C24F0034AD28 /* AppboyFeedbackSample.app */; + productType = "com.apple.product-type.application"; + }; + C1B92E3B1F02C2500034AD28 /* AppboyFeedbackSampleUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = C1B92E481F02C2500034AD28 /* Build configuration list for PBXNativeTarget "AppboyFeedbackSampleUITests" */; + buildPhases = ( + C1B92E381F02C2500034AD28 /* Sources */, + C1B92E391F02C2500034AD28 /* Frameworks */, + C1B92E3A1F02C2500034AD28 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + C1B92E3E1F02C2500034AD28 /* PBXTargetDependency */, + ); + name = AppboyFeedbackSampleUITests; + productName = AppboyFeedbackSampleUITests; + productReference = C1B92E3C1F02C2500034AD28 /* AppboyFeedbackSampleUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + C1B92E1B1F02C24F0034AD28 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = Appboy; + TargetAttributes = { + C1B92E221F02C24F0034AD28 = { + CreatedOnToolsVersion = 8.3.3; + DevelopmentTeam = 5GLZKGNWQ3; + ProvisioningStyle = Automatic; + }; + C1B92E3B1F02C2500034AD28 = { + CreatedOnToolsVersion = 8.3.3; + DevelopmentTeam = 5GLZKGNWQ3; + ProvisioningStyle = Automatic; + TestTargetID = C1B92E221F02C24F0034AD28; + }; + }; + }; + buildConfigurationList = C1B92E1E1F02C24F0034AD28 /* Build configuration list for PBXProject "AppboyFeedbackSample" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = C1B92E1A1F02C24F0034AD28; + productRefGroup = C1B92E241F02C24F0034AD28 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + C1B92E221F02C24F0034AD28 /* AppboyFeedbackSample */, + C1B92E3B1F02C2500034AD28 /* AppboyFeedbackSampleUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + C1B92E211F02C24F0034AD28 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C1B92E361F02C24F0034AD28 /* LaunchScreen.storyboard in Resources */, + C1B92E331F02C24F0034AD28 /* Assets.xcassets in Resources */, + C1B92E311F02C24F0034AD28 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C1B92E3A1F02C2500034AD28 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + B97581E435794EF64C4A8C96 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + B99AE614D575E03FE829FCFC /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AppboyFeedbackSample/Pods-AppboyFeedbackSample-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + F1C4C4FA55AE63B3A5714DCF /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-AppboyFeedbackSample/Pods-AppboyFeedbackSample-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + C1B92E1F1F02C24F0034AD28 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C1B92E4D1F02CCD90034AD28 /* CustomAppboyFeedbackViewController.m in Sources */, + C1B92E2B1F02C24F0034AD28 /* AppDelegate.m in Sources */, + C1B92E281F02C24F0034AD28 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C1B92E381F02C2500034AD28 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C1B92E411F02C2500034AD28 /* AppboyFeedbackSampleUITests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + C1B92E3E1F02C2500034AD28 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = C1B92E221F02C24F0034AD28 /* AppboyFeedbackSample */; + targetProxy = C1B92E3D1F02C2500034AD28 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + C1B92E2F1F02C24F0034AD28 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + C1B92E301F02C24F0034AD28 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + C1B92E341F02C24F0034AD28 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + C1B92E351F02C24F0034AD28 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + C1B92E431F02C2500034AD28 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + C1B92E441F02C2500034AD28 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + C1B92E461F02C2500034AD28 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 477E7AC93E31BC7ECD27308E /* Pods-AppboyFeedbackSample.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = 5GLZKGNWQ3; + INFOPLIST_FILE = AppboyFeedbackSample/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.appboy.AppboyFeedbackSample; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + C1B92E471F02C2500034AD28 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8F2765BD08F414A280B86973 /* Pods-AppboyFeedbackSample.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = 5GLZKGNWQ3; + INFOPLIST_FILE = AppboyFeedbackSample/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.appboy.AppboyFeedbackSample; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + C1B92E491F02C2500034AD28 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = 5GLZKGNWQ3; + INFOPLIST_FILE = AppboyFeedbackSampleUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.appboy.AppboyFeedbackSampleUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = AppboyFeedbackSample; + }; + name = Debug; + }; + C1B92E4A1F02C2500034AD28 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEVELOPMENT_TEAM = 5GLZKGNWQ3; + INFOPLIST_FILE = AppboyFeedbackSampleUITests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.appboy.AppboyFeedbackSampleUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = AppboyFeedbackSample; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + C1B92E1E1F02C24F0034AD28 /* Build configuration list for PBXProject "AppboyFeedbackSample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C1B92E431F02C2500034AD28 /* Debug */, + C1B92E441F02C2500034AD28 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C1B92E451F02C2500034AD28 /* Build configuration list for PBXNativeTarget "AppboyFeedbackSample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C1B92E461F02C2500034AD28 /* Debug */, + C1B92E471F02C2500034AD28 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C1B92E481F02C2500034AD28 /* Build configuration list for PBXNativeTarget "AppboyFeedbackSampleUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C1B92E491F02C2500034AD28 /* Debug */, + C1B92E4A1F02C2500034AD28 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = C1B92E1B1F02C24F0034AD28 /* Project object */; +} diff --git a/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..0e4d10480 --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample.xcworkspace/contents.xcworkspacedata b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..dfbd5000b --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/AppDelegate.h b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/AppDelegate.h new file mode 100644 index 000000000..2a9bac67c --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/AppDelegate.h @@ -0,0 +1,8 @@ +#import + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@end + diff --git a/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/AppDelegate.m b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/AppDelegate.m new file mode 100644 index 000000000..f2b612b36 --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/AppDelegate.m @@ -0,0 +1,43 @@ +#import "AppDelegate.h" +#import "AppboyKit.h" + +@implementation AppDelegate + + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // Override point for customization after application launch. + [Appboy startWithApiKey:@"9e77f9b6-ed48-44aa-86a3-cce29a5f9eff" + inApplication:application + withLaunchOptions:launchOptions]; + return YES; +} + + +- (void)applicationWillResignActive:(UIApplication *)application { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. +} + + +- (void)applicationDidEnterBackground:(UIApplication *)application { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + + +- (void)applicationWillEnterForeground:(UIApplication *)application { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. +} + + +- (void)applicationDidBecomeActive:(UIApplication *)application { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. +} + + +- (void)applicationWillTerminate:(UIApplication *)application { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + + +@end diff --git a/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/Assets.xcassets/AppIcon.appiconset/Contents.json b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..1d060ed28 --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,93 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/Base.lproj/LaunchScreen.storyboard b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..fdf3f97d1 --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/Base.lproj/Main.storyboard b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/Base.lproj/Main.storyboard new file mode 100644 index 000000000..6b2580fdb --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/Base.lproj/Main.storyboard @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/CustomAppboyFeedbackViewController.h b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/CustomAppboyFeedbackViewController.h new file mode 100644 index 000000000..3b599b1ab --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/CustomAppboyFeedbackViewController.h @@ -0,0 +1,6 @@ +#import +#import "ABKModalFeedbackViewController.h" + +@interface CustomAppboyFeedbackViewController : ABKModalFeedbackViewController + +@end diff --git a/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/CustomAppboyFeedbackViewController.m b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/CustomAppboyFeedbackViewController.m new file mode 100644 index 000000000..765e1744f --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/CustomAppboyFeedbackViewController.m @@ -0,0 +1,25 @@ +#import "CustomAppboyFeedbackViewController.h" + +@implementation CustomAppboyFeedbackViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + self.navigationBar.topItem.title = @"Custom Feedback"; +} + +- (ABKFeedback *)appboyFeedbackFromMessage:(NSString *)message + email:(NSString *)email + isBug:(BOOL)isBug { + NSString *updatedMessage = [message stringByAppendingString:@" from Appboy"]; + return [super appboyFeedbackFromMessage:updatedMessage email:email isBug:isBug]; + +} + +- (void)feedbackSent:(ABKFeedbackSentResult)feedbackSentResult { + [super feedbackSent:feedbackSentResult]; + if (feedbackSentResult == ABKFeedbackSentSuccessfully) { + [self displayAlertViewWithTitle:@"Thank you!" message:@"We value your feedback!"]; + } +} + +@end diff --git a/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/Info.plist b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/Info.plist new file mode 100644 index 000000000..d05247386 --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/main.m b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/main.m new file mode 100644 index 000000000..0edc47d7e --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSample/main.m @@ -0,0 +1,8 @@ +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSampleUITests/AppboyFeedbackSampleUITests.m b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSampleUITests/AppboyFeedbackSampleUITests.m new file mode 100644 index 000000000..b902218ef --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSampleUITests/AppboyFeedbackSampleUITests.m @@ -0,0 +1,171 @@ +#import + +@interface AppboyFeedbackSampleUITests : XCTestCase + +@property XCUIApplication *app; + +@end + +@implementation AppboyFeedbackSampleUITests + +- (void)setUp { + [super setUp]; + self.continueAfterFailure = NO; + self.app = [[XCUIApplication alloc] init]; + [self.app launch]; +} + +- (void)testDefaultModalFeedback_UICheck_CancelButton { + [self.app.buttons[@"Modal Feedback"] tap]; + XCTAssert(self.app.buttons[@"Cancel"].exists); + XCTAssert(self.app.buttons[@"Send"].exists); + XCTAssert(self.app.buttons[@"feedback issue button"].exists); + XCTAssert(self.app.staticTexts[@"Message"].exists); + XCTAssert(self.app.staticTexts[@"Reporting an Issue?"].exists); + XCTAssert(self.app.textViews.count == 1); + XCTAssert(self.app.textFields.count == 1); + [XCUIDevice sharedDevice].orientation = UIDeviceOrientationLandscapeLeft; + [XCUIDevice sharedDevice].orientation = UIDeviceOrientationLandscapeRight; + [XCUIDevice sharedDevice].orientation = UIDeviceOrientationPortrait; + [self.app.buttons[@"Cancel"] tap]; + XCTAssert(self.app.buttons[@"Modal Feedback"].exists); +} + +- (void)testDefaultModalFeedback_SendFeedback_EmptyFeedback { + [self.app.buttons[@"Modal Feedback"] tap]; + [self.app.buttons[@"Send"] tap]; + XCTAssert(self.app.staticTexts[@"Empty Feedback Message"].exists); + [self.app.buttons[@"OK"] tap]; + [self.app.textFields.element tap]; + [self.app.textFields.element typeText:@"testing@appboy.com"]; + [self.app.textViews.element tap]; + [self.app.buttons[@"Send"] tap]; + XCTAssert(self.app.staticTexts[@"Empty Feedback Message"].exists); + [self.app.buttons[@"OK"] tap]; +} + +- (void)testDefaultModalFeedback_SendFeedback_InvalidEmail { + [self.app.buttons[@"Modal Feedback"] tap]; + [self.app.textViews.element typeText:@"Default Modal Feedback Testing"]; + [self.app.buttons[@"Send"] tap]; + XCTAssert(self.app.staticTexts[@"Invalid Email Address"].exists); + [self.app.buttons[@"OK"] tap]; + + [self.app.textFields.element tap]; + [self.app.textFields.element typeText:@"testing@appboy@com"]; + [self.app.textViews.element tap]; + [self.app.buttons[@"Send"] tap]; + XCTAssert(self.app.staticTexts[@"Invalid Email Address"].exists); + [self.app.buttons[@"OK"] tap]; +} + +- (void)testDefaultModalFeedback_SendFeedback_SuccessCase { + [self.app.buttons[@"Modal Feedback"] tap]; + [self.app.textViews.element typeText:@"Default Modal Feedback Testing"]; + [self.app.textFields.element tap]; + [self.app.textFields.element typeText:@"testing@appboy.com"]; + [self.app.textViews.element tap]; + [self.app.buttons[@"Send"] tap]; + XCTAssert(self.app.buttons[@"Modal Feedback"].exists); +} + +- (void)testDefaultNavigationFeedback_UICheck_BackButton { + [self.app.buttons[@"Navigation Feedback"] tap]; + XCTAssert(self.app.buttons[@"Back"].exists); + XCTAssert(self.app.buttons[@"Send"].exists); + XCTAssert(self.app.buttons[@"feedback issue button"].exists); + XCTAssert(self.app.staticTexts[@"Message"].exists); + XCTAssert(self.app.staticTexts[@"Reporting an Issue?"].exists); + XCTAssert(self.app.textViews.count == 1); + XCTAssert(self.app.textFields.count == 1); + XCUIElementQuery *backButtonQuery = [self.app.buttons matchingIdentifier:@"Back"]; + [backButtonQuery.allElementsBoundByIndex[0] tap]; + XCTAssert(self.app.buttons[@"Navigation Feedback"].exists); +} + +- (void)testDefaultNavigationFeedback_SendFeedback_EmptyFeedback { + [self.app.buttons[@"Navigation Feedback"] tap]; + [self.app.buttons[@"Send"] tap]; + XCTAssert(self.app.staticTexts[@"Empty Feedback Message"].exists); + [self.app.buttons[@"OK"] tap]; + [self.app.textFields.element tap]; + [self.app.textFields.element typeText:@"testing@appboy.com"]; + [self.app.textViews.element tap]; + [self.app.buttons[@"Send"] tap]; + XCTAssert(self.app.staticTexts[@"Empty Feedback Message"].exists); + [self.app.buttons[@"OK"] tap]; +} + +- (void)testDefaultNavigationFeedback_SendFeedback_InvalidEmail { + [self.app.buttons[@"Navigation Feedback"] tap]; + [self.app.textViews.element typeText:@"Default Modal Feedback Testing"]; + [self.app.buttons[@"Send"] tap]; + XCTAssert(self.app.staticTexts[@"Invalid Email Address"].exists); + [self.app.buttons[@"OK"] tap]; + + [self.app.textFields.element tap]; + [self.app.textFields.element typeText:@"testing@appboy@com"]; + [self.app.textViews.element tap]; + [self.app.buttons[@"Send"] tap]; + XCTAssert(self.app.staticTexts[@"Invalid Email Address"].exists); + [self.app.buttons[@"OK"] tap]; +} + +- (void)testDefaultNavigationFeedback_SendFeedback_SuccessCase { + [self.app.buttons[@"Navigation Feedback"] tap]; + [self.app.textViews.element typeText:@"Default Modal Feedback Testing"]; + [self.app.textFields.element tap]; + [self.app.textFields.element typeText:@"testing@appboy.com"]; + [self.app.textViews.element tap]; + [self.app.buttons[@"Send"] tap]; + XCTAssert(self.app.buttons[@"Navigation Feedback"].exists); +} + +- (void)testCustomModalFeedback_UICheck_CancelButton { + [self.app.buttons[@"Custom Feedback"] tap]; + XCTAssert(self.app.buttons[@"Cancel"].exists); + XCTAssert(self.app.buttons[@"Send"].exists); + XCTAssert(self.app.buttons[@"feedback issue button"].exists); + XCTAssert(self.app.staticTexts[@"Message"].exists); + XCTAssert(self.app.staticTexts[@"Reporting an Issue?"].exists); + XCTAssert(self.app.staticTexts[@"Custom Feedback"].exists); + XCTAssert(self.app.textViews.count == 1); + XCTAssert(self.app.textFields.count == 1); + [self.app.buttons[@"Cancel"] tap]; + XCTAssert(self.app.buttons[@"Custom Feedback"].exists); +} + +- (void)testCustomModalFeedback_SendFeedback_EmptyFeedback { + [self.app.buttons[@"Custom Feedback"] tap]; + [self.app.buttons[@"Send"] tap]; + // The custom feedback appends " from Appboy" to the feedback message, so it shouldn't meet + // "Empty Feedback Message" error + XCTAssert(self.app.staticTexts[@"Invalid Email Address"].exists); + [self.app.buttons[@"OK"] tap]; +} + +- (void)testCustomModalFeedback_SendFeedback_InvalidEmail { + [self.app.buttons[@"Custom Feedback"] tap]; + [self.app.textViews.element typeText:@"Default Modal Feedback Testing"]; + [self.app.buttons[@"Send"] tap]; + XCTAssert(self.app.staticTexts[@"Invalid Email Address"].exists); + [self.app.buttons[@"OK"] tap]; + [self.app.textFields.element tap]; + [self.app.textFields.element typeText:@"testing@appboy@com"]; + [self.app.textViews.element tap]; + [self.app.buttons[@"Send"] tap]; + XCTAssert(self.app.staticTexts[@"Invalid Email Address"].exists); + [self.app.buttons[@"OK"] tap]; +} + +- (void)testCustomModalFeedback_SendFeedback_SuccessCase { + [self.app.buttons[@"Custom Feedback"] tap]; + [self.app.textViews.element typeText:@"Default Modal Feedback Testing"]; + [self.app.textFields.element tap]; + [self.app.textFields.element typeText:@"testing@appboy.com"]; + [self.app.textViews.element tap]; + [self.app.buttons[@"Send"] tap]; + XCTAssert(self.app.buttons[@"Custom Feedback"].exists); +} + +@end diff --git a/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSampleUITests/Info.plist b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSampleUITests/Info.plist new file mode 100644 index 000000000..6c6c23c43 --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/AppboyFeedbackSampleUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Samples/Feedback/AppboyFeedbackSample/Podfile b/Samples/Feedback/AppboyFeedbackSample/Podfile new file mode 100644 index 000000000..1d8a8fcdb --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/Podfile @@ -0,0 +1,7 @@ +platform :ios, '8.0' + +source 'https://github.com/CocoaPods/Specs.git' + +target 'AppboyFeedbackSample' do + pod 'Appboy-iOS-SDK/Feedback', :path => './../../../../Appboy-iOS-SDK/' +end diff --git a/Samples/Feedback/AppboyFeedbackSample/Podfile.lock b/Samples/Feedback/AppboyFeedbackSample/Podfile.lock new file mode 100644 index 000000000..f2643c77c --- /dev/null +++ b/Samples/Feedback/AppboyFeedbackSample/Podfile.lock @@ -0,0 +1,18 @@ +PODS: + - Appboy-iOS-SDK/Core (2.30.0) + - Appboy-iOS-SDK/Feedback (2.30.0): + - Appboy-iOS-SDK/Core + +DEPENDENCIES: + - Appboy-iOS-SDK/Feedback (from `./../../../../Appboy-iOS-SDK/`) + +EXTERNAL SOURCES: + Appboy-iOS-SDK: + :path: "./../../../../Appboy-iOS-SDK/" + +SPEC CHECKSUMS: + Appboy-iOS-SDK: 173faa418ab885ea860d80c6fce1251d479b0061 + +PODFILE CHECKSUM: 81297c623bef1e053e1b905c40515b4c420f2ebd + +COCOAPODS: 1.2.1