diff --git a/.DS_Store b/.DS_Store index e46fb20a0..313511e35 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/Appboy-WatchKit/ABWKUser.h b/Appboy-WatchKit/ABWKUser.h index 6f83ae362..3cf4578b1 100644 --- a/Appboy-WatchKit/ABWKUser.h +++ b/Appboy-WatchKit/ABWKUser.h @@ -2,8 +2,8 @@ /* * This ABWKUser class is parallel with the ABKUser in the Appboy iOS SDK. * - * NOTE: Make sure DO NOT pass a nil as a parameter, otherwise the watch SDK will throw an exception - * when trying to parse the data to a dictionary. + * NOTE: Make sure you DO NOT pass a nil as a parameter, otherwise the watch SDK will throw an exception + * when trying to parse the data into a dictionary. */ @interface ABWKUser : NSObject diff --git a/Appboy-iOS-SDK.podspec b/Appboy-iOS-SDK.podspec index 76926c134..15fcd3bf7 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.12.2" + s.version = "2.13.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'} diff --git a/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects-8.0+.nib index 37da3008a..dbdb2c2d2 100644 Binary files a/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects.nib index 8f5639596..71fe91efb 100644 Binary files a/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/runtime.nib index fe0e28b59..963b4c127 100644 Binary files a/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKBannerCardCell.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects-8.0+.nib index ec63dadfb..1b7ac1c68 100644 Binary files a/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects.nib index c244421f3..5a4973869 100644 Binary files a/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/runtime.nib index 9296d359a..801833916 100644 Binary files a/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKCaptionedMessageCardCell.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects-8.0+.nib index 8e2aec6fa..c4b99d977 100644 Binary files a/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects.nib index 92e1a70f9..cc1915ff3 100644 Binary files a/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/runtime.nib index 9498ceb2a..6e07656b7 100644 Binary files a/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKCrossPromotionCardCell.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects-8.0+.nib index ad89cdf0c..552ce111f 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects.nib index c1b68c1bd..8d7e787cf 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/runtime.nib index cf86da7eb..b096c3a25 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKFeedNoConnectionView.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects-8.0+.nib index 6006aa300..ee7e84cf0 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects.nib index 70e2f39e2..e88b050ad 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/runtime.nib index 21c2e2280..a81034c8f 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackContentView.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects-8.0+.nib index f057923e7..b7a29cb23 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects.nib index 6fa43331d..68ce51d00 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/runtime.nib index f802b479d..011b8ba08 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackEmailFacebookViewPortrait.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects-8.0+.nib index 100d3677b..367e2d983 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects.nib index 955703c9e..ae629675f 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/runtime.nib index 4947dc023..74ddbfbc5 100644 Binary files a/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKFeedbackNavBar.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects-8.0+.nib index cbe21a2f3..7f36fa98a 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController.nib/objects.nib index ce42a2d01..9d4cef8be 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 5ceb0aacf..39a530b25 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/ABKInAppMessageFullViewController_iPad.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/objects-8.0+.nib index f6648e5cd..6cbc8ae2b 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/objects.nib index 0a49d1a69..4a7da84fc 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/runtime.nib index 5ece296f3..1631e7433 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageFullViewController_iPad.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects-8.0+.nib index ea2b37cce..4acd6c9e1 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController.nib/objects.nib index c0baf88b8..056963eb7 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 e216e7a21..5059ffa4f 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/ABKInAppMessageModalViewController_iPad.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/objects-8.0+.nib index e2f0249e7..dc0a61763 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/objects.nib index 2b23efd2b..973a49279 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/runtime.nib index 6b8b5b26f..6e842db1b 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageModalViewController_iPad.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects-8.0+.nib index 98b4afb52..fa35d3798 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController.nib/objects.nib index 984fc310b..4e2b01494 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 76868de9e..3bfc887b3 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/ABKInAppMessageSlideupViewController_iPad.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/objects-8.0+.nib index 273450233..e07a6ddcc 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/objects.nib index 7c8cc0d02..dff70dcaa 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/runtime.nib index 3864e9efa..73939e7e1 100644 Binary files a/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKInAppMessageSlideupViewController_iPad.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects-8.0+.nib index e1ca9c0c8..4fa566e20 100644 Binary files a/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects.nib index 4464387b8..d2deded16 100644 Binary files a/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/runtime.nib index 03b2b0abf..755d363fa 100644 Binary files a/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKSpinnerView.nib/runtime.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects-8.0+.nib b/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects-8.0+.nib index 2d4e641f0..3ca568a59 100644 Binary files a/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects-8.0+.nib and b/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects-8.0+.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects.nib b/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects.nib index 900f8c01a..2ae99fa1f 100644 Binary files a/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects.nib and b/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/objects.nib differ diff --git a/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/runtime.nib b/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/runtime.nib index becfcfe4a..e8edfc1b5 100644 Binary files a/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/runtime.nib and b/AppboyKit/Appboy.bundle/ABKTextAnnouncementCardCell.nib/runtime.nib differ diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKCard.h b/AppboyKit/headers/AppboyKitLibrary/ABKCard.h index 775877042..1721ff0ba 100644 --- a/AppboyKit/headers/AppboyKitLibrary/ABKCard.h +++ b/AppboyKit/headers/AppboyKitLibrary/ABKCard.h @@ -31,7 +31,13 @@ @property (nonatomic, assign) ABKCardCategory categories; /* - * @param cardDictionary The dictionary for card deserialization. + * The property is the unix timestamp of the card's expiration time. When the value is less than 0, it means the card + * doesn't an expire date. + */ +@property (nonatomic, assign, readonly) double expiresAt; + +/* + * @param cardDictionary The dictionary for card deserialization.` * * Deserializes the dictionary to a card for use by wrappers such as Appboy's Unity SDK for iOS. * When the deserialization isn't successful, this method returns nil; otherwise, it returns the deserialized card. diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKLocationManager.h b/AppboyKit/headers/AppboyKitLibrary/ABKLocationManager.h new file mode 100644 index 000000000..5339e1c5a --- /dev/null +++ b/AppboyKit/headers/AppboyKitLibrary/ABKLocationManager.h @@ -0,0 +1,27 @@ +#import + +@class ABKServerConfig; + +@interface ABKLocationManager : NSObject + +@property (nonatomic, readonly, assign) BOOL disableLocationTracking; +- (id) initWithServerConfig:(ABKServerConfig *)serverConfig andAppboyOptions:(NSDictionary *)appboyOptions; + +/*! + * Calling this method gives Appboy permission to request WhenInUse authorization on your behalf the next time we attempt to collect + * location in the foreground. + */ +- (void) allowRequestWhenInUseLocationPermission; + +/*! + * Calling this method gives Appboy permission to request Always authorization on your behalf the next time we attempt to collect + * significant location changes. + */ +- (void) allowRequestAlwaysPermission; + +/*! + * Calling this method will log a location using the regular location provider if a location is reported in under + * 60 seconds. After 60 seconds expires the regular location provider will stop collecting location. + */ +- (void) logSingleLocation; +@end \ No newline at end of file diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKPushUtils.h b/AppboyKit/headers/AppboyKitLibrary/ABKPushUtils.h new file mode 100644 index 000000000..b95f4f4e0 --- /dev/null +++ b/AppboyKit/headers/AppboyKitLibrary/ABKPushUtils.h @@ -0,0 +1,12 @@ +#import + +static NSString *const ABKAppboyPushNotificationUninstallTrackingKey = @"appboy_uninstall_tracking"; + +/* + * Appboy Public API: ABKPushUtils + */ +@interface ABKPushUtils : NSObject + ++ (BOOL) isUninstallTrackingNotification:(NSDictionary *)userInfo; + +@end diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKTwitterUser.h b/AppboyKit/headers/AppboyKitLibrary/ABKTwitterUser.h new file mode 100644 index 000000000..0110e4c7c --- /dev/null +++ b/AppboyKit/headers/AppboyKitLibrary/ABKTwitterUser.h @@ -0,0 +1,56 @@ +#import + +/* + * Appboy Public API: ABKTwitterUser + */ +@interface ABKTwitterUser : NSObject + +/*! + * @param userDescription The value returned from twitter user API with key "description". Please + * refer to https://dev.twitter.com/overview/api/users for more information. + */ +@property (nonatomic, copy) NSString* userDescription; + +/* + * @param twitterName The value returned from twitter user API with key "name". Please + * refer to https://dev.twitter.com/overview/api/users for more information. + */ +@property (nonatomic, copy) NSString* twitterName; + +/* + * @param profileImageUrl The value returned from twitter user API with key "profile_image_url". Please + * refer to https://dev.twitter.com/overview/api/users for more information. + */ +@property (nonatomic, copy) NSString* profileImageUrl; + +/* + * @param screenName The value returned from twitter user API with key "screen_name". Please + * refer to https://dev.twitter.com/overview/api/users for more information. + */ +@property (nonatomic, copy) NSString* screenName; + +/* + * @param followersCount The value returned from twitter user API with key "followers_count". Please + * refer to https://dev.twitter.com/overview/api/users for more information. + */ +@property (nonatomic, assign) NSInteger followersCount; + +/* + * @param friendsCount The value returned from twitter user API with key "friends_count". Please + * refer to https://dev.twitter.com/overview/api/users for more information. + */ +@property (nonatomic, assign) NSInteger friendsCount; + +/* + * @param statusesCount The value returned from twitter user API with key "statuses_count". Please + * refer to https://dev.twitter.com/overview/api/users for more information. + */ +@property (nonatomic, assign) NSInteger statusesCount; + +/* + * @param twitterID The value returned from twitter user API with key "id". Please + * refer to https://dev.twitter.com/overview/api/users for more information. + */ +@property (nonatomic, assign) NSInteger twitterID; + +@end diff --git a/AppboyKit/headers/AppboyKitLibrary/ABKUser.h b/AppboyKit/headers/AppboyKitLibrary/ABKUser.h index f08f462ea..95650897f 100644 --- a/AppboyKit/headers/AppboyKitLibrary/ABKUser.h +++ b/AppboyKit/headers/AppboyKitLibrary/ABKUser.h @@ -7,6 +7,7 @@ #import @class ABKFacebookUser; +@class ABKTwitterUser; /*! * When setting the custom attributes with custom keys: @@ -94,29 +95,14 @@ @property (nonatomic, copy) NSString *avatarImageURL; /*! - * The Twitter account identifier for this user. If set, Appboy will only attempt to obtain Twitter data from the - * Accounts framework if the account with the specified identifier is available. See the - * ABKSocialAccountAcquisitionPolicy documentation in Appboy.h for more information. - */ -@property (nonatomic, copy) NSString *twitterAccountIdentifier; - -/*! - * This property is for when a user's twitter account with the given identifier isn't available, should Appboy also - * delete the saved twitter account in the server of that user. - * - * The default value of this property is NO. If the property is set to YES, when the twitter account data with the given - * twitter identifier(defined in the ABKUser's twitterAccountIdentifier property) isn't available, Appboy will also delete - * Appboy will delete the saved twitter account data of that user in Appboy's database. - * - * This property is only used when in appboyOptions, ABKSocialAccountAcquisitionPolicyOptionKey is set to be - * ABKAutomaticSocialAccountAcquisitionWithIdentifierOnly, and twitterAccountIdentifier property has a valid value. + * The User's Facebook account information. For more detail, please refer to ABKFacebookUser.h. */ -@property (nonatomic, assign) BOOL clearTwitterDataWhenNoDataOfTwitterIdentifier; +@property (nonatomic, retain) ABKFacebookUser *facebookUser; /*! - * The User's Facebook account information. For more detail, please refer to ABKFacebookUser.h. + * The User's Twitter account information. For more detail, please refer to ABKTwitterUser.h. */ -@property (nonatomic, retain) ABKFacebookUser *facebookUser; +@property (nonatomic, retain) ABKTwitterUser *twitterUser; /* ------------------------------------------------------------------------------------------------------ * Enums diff --git a/AppboyKit/headers/AppboyKitLibrary/Appboy.h b/AppboyKit/headers/AppboyKitLibrary/Appboy.h index 578c4e382..a7213ffe7 100644 --- a/AppboyKit/headers/AppboyKitLibrary/Appboy.h +++ b/AppboyKit/headers/AppboyKitLibrary/Appboy.h @@ -14,7 +14,7 @@ #import #ifndef APPBOY_SDK_VERSION -#define APPBOY_SDK_VERSION @"2.12.2" +#define APPBOY_SDK_VERSION @"2.13.0" #endif @class ABKInAppMessageController; @@ -24,6 +24,7 @@ @class ABKInAppMessageViewController; @protocol ABKInAppMessageControllerDelegate; @protocol ABKAppboyEndpointDelegate; +@class ABKLocationManager; /* * Appboy Public API: Appboy @@ -83,13 +84,6 @@ */ extern NSString *const ABKRequestProcessingPolicyOptionKey; -/*! -* If you want to set the social account acquisition policy at app startup time (useful for avoiding automatic -* social account data requests made by Appboy at startup). You can include one of the ABKSocialAccountAcquisitionPolicy -* enum values as the value for the ABKSocialAccountAcquisitionPolicyOptionKey in the appboyOptions dictionary. -*/ -extern NSString *const ABKSocialAccountAcquisitionPolicyOptionKey; - /*! * Sets the data flush interval (in seconds). This only has an effect when the request processing mode is set to * ABKAutomaticRequestProcessing (which is the default). Values are converted into NSTimeIntervals and must be greater @@ -105,6 +99,27 @@ extern NSString *const ABKFlushIntervalOptionKey; */ extern NSString *const ABKDisableAutomaticLocationCollectionKey; +/*! + * This key can be set to YES or NO and will configure whether Appboy will automatically collect significant change location events. If this key isn't set and the server doesn't provide a value, it will defaul to false. + */ +extern NSString *const ABKSignificantChangeCollectionEnabledOptionKey; + +/*! + * This key can be set to an integer value that represents the minimum distance in meters between location events logged to Appboy. + * If this value is set and significant change location is enabled, this value will be used to filter locations that are received from the significant + * change location provider. The default and minimum value is 50. Note that significant change location updates shouldn't occur if the user has + * gone 50 meters or less. + */ +extern NSString *const ABKSignificantChangeCollectionDistanceFilterOptionKey; + +/*! + * This key can be set to an integer value that represents the minimum time in seconds between location events logged to Appboy. + * If this value is set and significant change location is enabled, this value will be used to filter locations that are received from the significant + * change location provider. The default value is 3600 (1 hour); the minimum is 300 (5 minutes). + */ +extern NSString *const ABKSignificantChangeCollectionTimeFilterOptionKey; + + /*! * This key can be set to a class that extends ABKAppboyEndpointDelegate which can be used to modifying or substitute the API and Resource * (e.g. image) URIs used by the Appboy SDK. @@ -145,28 +160,6 @@ typedef NS_ENUM(NSInteger, ABKRequestProcessingPolicy) { ABKManualRequestProcessing }; -/*! -* Possible values for the SDK's social account acquisition policies: -* ABKAutomaticSocialAccountAcquisition (default) - At app startup and after you've set a social account identifier -* on the user object, Appboy will automatically attempt to fetch Twitter account data -* for the user and flush it to the server. In all cases, Appboy's automatic data acquisition will ensure that the -* user is not prompted or that the UI of your application is otherwise affected. For this reason, when Appboy -* tries to perform the data acquisition, your app must have already been granted the relevant permissions to -* obtain social account data. If you've specified the twitterAccountIdentifier, Appboy will only attempt to grab -* data for that twitter account. If you haven't specified it, Appboy will grab data for the first Twitter account -* returned by the system. -* ABKAutomaticSocialAccountAcquisitionWithIdentifierOnly - Appboy will only attempt to obtain social account information when -* an identifier is set on the user for the corresponding social network. Note: This currently only works for -* Twitter accounts. -* ABKManualSocialAccountAcquisition - Appboy will NOT try to acquire social account data. You must call -*
[[Appboy sharedInstance] promptUserForAccessToSocialNetwork:(ABKSocialNetwork)];
-*/ -typedef NS_ENUM(NSInteger, ABKSocialAccountAcquisitionPolicy) { - ABKAutomaticSocialAccountAcquisition, - ABKAutomaticSocialAccountAcquisitionWithIdentifierOnly, - ABKManualSocialAccountAcquisition -}; - /*! * Values representing the Social Networks recognized by the SDK. */ @@ -193,6 +186,12 @@ typedef NS_OPTIONS(NSUInteger, ABKSocialNetwork) { */ @property (nonatomic, retain, readonly) ABKUser *user; +/*! + * The Appboy location manager provides access to location related functionality in the Appboy SDK. + * See ABKLocationManager.h. + */ +@property (nonatomic, readonly) ABKLocationManager *locationManager; + /*! * Appboy UI elements can be themed using the NUI framework. See https://github.com/tombenner/nui and the Appboy docs. * To enable NUI, take the following steps: @@ -213,32 +212,6 @@ typedef NS_OPTIONS(NSUInteger, ABKSocialNetwork) { */ @property (nonatomic, assign) BOOL useNUITheming; -/*! - * The total number of currently active cards displayed in any feed view. Cards are - * counted only once even if they appear in multiple feed views. - * @deprecated This property is now deprecated and will be removed in the future. Please use - * [[Appboy sharedInstance].feedController cardCountForCategories:ABKCardCategoryAll] instead. - */ -@property (readonly, nonatomic, assign) NSInteger cardCount __deprecated_msg("Please use \n" -"[[Appboy sharedInstance].feedController cardCountForCategories:ABKCardCategoryAll] instead"); - -/*! - * unreadCardCount is the number of currently active cards which have not been viewed. - * A "view" happens when a card becomes visible in the feed view. This differentiates - * between cards which are off-screen in the scrolling view, and those which - * are on-screen; when a card scrolls onto the screen, it's counted as viewed. - * - * Cards are counted as viewed only once -- if a card scrolls off the screen and - * back on, it's not re-counted. - * - * Cards are counted only once even if they appear in multiple feed views or across multiple devices. - * - * @deprecated This property is now deprecated and will be removed in the future. Please use - * [[Appboy sharedInstance].feedController unreadCardCountForCategories:ABKCardCategoryAll] instead. - */ -@property (readonly, nonatomic, assign) NSInteger unreadCardCount __deprecated_msg("Please use \n" -"[[Appboy sharedInstance].feedController unreadCardCountForCategories:ABKCardCategoryAll] instead"); - /*! * The policy regarding processing of network requests by the SDK. See the enumeration values for more information on * possible options. This value can be set at runtime, or can be injected in at startup via the appboyOptions dictionary. @@ -469,25 +442,6 @@ didReceiveRemoteNotification:(NSDictionary *)notification */ - (void) logSocialShare:(ABKSocialNetwork)socialNetwork; -/*! -* @param socialNetworks An ABKSocialNetwork indicating the network that you wish to access. -* -* @discussion Use this method to prompt the user for permission to use social network data (you don't need to use it -* if permission has has been given at another point in your app -- Appboy is already collecting data). -* -* After permission is given, Appboy starts collecting any social network data available on the device (e.g. name, e-mail, etc.) -* and reporting it to the server. -* -* We generally advise that you don't call this method on startup, as it will immediately prompt your users for -* Twitter access. -* -* Please note that In versions 2.10 and above, Appboy will no longer prompt users to connect their Facebook accounts. -* Please refer to the method "promptUserToConnectFacebookAccountOnDeviceAndFetchAccountData" in SocialNetworkViewController.m -* (https://github.com/Appboy/appboy-ios-sdk/blob/master/Example/Stopwatch/SocialNetworkViewController.m) to continue -* prompting users to connect their Facebook account. -*/ -- (void) promptUserForAccessToSocialNetwork:(ABKSocialNetwork)socialNetwork; - /*! * @param replyToEmail The email address to send feedback replies to. * @param message The message input by the user. Must be non-null and non-empty. @@ -532,6 +486,8 @@ didReceiveRemoteNotification:(NSDictionary *)notification */ - (void) requestInAppMessageRefresh; +- (BOOL) handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *replyInfo))reply; + /*! * Enqueues an in-app message request for the current user. Note that this is deprecated from version 2.11.0. Please use * requestInAppMessageRefresh instead. diff --git a/AppboyKit/headers/AppboyKitLibrary/AppboyKit.h b/AppboyKit/headers/AppboyKitLibrary/AppboyKit.h index 2ae8db340..944f3f749 100644 --- a/AppboyKit/headers/AppboyKitLibrary/AppboyKit.h +++ b/AppboyKit/headers/AppboyKitLibrary/AppboyKit.h @@ -2,6 +2,7 @@ #import "ABKUser.h" #import "ABKAppboyEndpointDelegate.h" #import "ABKFacebookUser.h" +#import "ABKTwitterUser.h" // Feedback #import "ABKFeedbackViewController.h" diff --git a/AppboyKit/libAppboyKitLibrary.a b/AppboyKit/libAppboyKitLibrary.a index 79841afaf..d069e460b 100644 Binary files a/AppboyKit/libAppboyKitLibrary.a and b/AppboyKit/libAppboyKitLibrary.a differ diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b0c84863..35957f9f7 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## 2.13 +- Stops collecting user's Twitter data automatically. You can pass a user's Twitter information to Appboy by initialzing a ABKTwitterUser object with the twitter data, and setting it to [Appboy sharedInstance].user.twitterUser. For more information, please refer to ABKUser.h and ABKTwitterUser.h. +- Removes the feature of prompting a user to connect his/her social account. You can refer to the method `promptUserToConnectFacebookAccountOnDeviceAndFetchAccountData` in [TwitterViewController.m](https://github.com/Appboy/appboy-ios-sdk/blob/master/Example/Stopwatch/TwitterViewController.m) to continue prompting the user to connect the Twitter account. +- Adds an open-source Watch SDK to support data analytics on watchKit apps. You can use the Appboy-WatchKit SDK by downloading and adding the "Appboy-WatchKit" folder in your watchKit extension target. For more detail, please refer to [ABWKUser.h](https://github.com/Appboy/appboy-ios-sdk/blob/master/Appboy-WatchKit/ABWKUser.h) and [AppboyWatchKit.h](https://github.com/Appboy/appboy-ios-sdk/blob/master/Appboy-WatchKit/AppboyWatchKit.h). +- Adds an opt-in location service that logs background location events; adds ABKLocationManager with methods for allowing Appboy to request location permission on your behalf and logging the current location. More information on the background location capabilities will be made available when dashboard support is released. +- Adds client side blocking of blacklisted attributes and events. +- Adds ABKPushUtils with method `+ (BOOL) isUninstallTrackingNotification:(NSDictionary *)userInfo;` that can be used to detect if a content-available push is from Appboy uninstall tracking (and shouldn't be acted upon). +- Adds a new property `expiresAt` in class ABKCard. The property is the unix timestamp of the card's expiration time. For more detail, please refer to ABKCard.h. + ## 2.12.2 - Fixes the slideup in-app message display issue. When the host app sets the launch screen file, slideup in-app message from bottom sometimes didn't dock at the bottom of the screen on iPhone 6 and iPhone 6 Plus. @@ -14,9 +23,10 @@ ## 2.11.3 - Adds the ability to send and retrieve extra key-value pairs via a News Feed card. - Adds the ability to define custom key-value properties on a custom event or purchase. Property keys are strings and values may be NSString, NSDate, or NSNumber objects. +- Added the fix for an edge case when there are extra UIWindows at the time in-app message is going to display, the in-app message would have issue during dismissing. ## 2.11.2 -- Update the serialize and deserialize methods for in-app message classes. This is for use by wrappers such as Appboy's Unity SDK for iOS. +- Update the serialize and deserialize methods for in-app message classes. This is for use by wrappers such as Appboy's Unity SDK for iOS. ## 2.11.1 - Fixes a UI issue in modal in-app messages displayed on iPads running iOS 6/7. @@ -25,15 +35,21 @@ - Adds support for modal and full screen style in-app messages. Also adds support for including fontawesome icons and images with in-app messages, changing colors on in-app message UI elements, expanded customization options, and message resizing for tablets. Please visit our documentation for more information. - Updates the completionHandler signature in getActionWithIdentifier:forRemoteNotification:completionHandler: to match the comletionHandler passed by the system in method `- (void) application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo completionHandler:(void (^)())completionHandler`. +## 2.10.2 +- Added the fix for an edge case when there are extra UIWindows at the time in-app message is going to display, the in-app message would have issue during dismissing. + ## 2.10.1 - Corrected a bug which would cause the host app to crash when a deep link was launched from a push notification. In versions 2.10.0 and 2.9.4, if the host app used `[[Appboy sharedInstance] registerApplication: didReceiveRemoteNotification:];` instead of `[[Appboy sharedInstance] registerApplication: didReceiveRemoteNotification: fetchCompletionHandler:];`, opening a push with a deep link would crash the host app in some circumstances. ## 2.10.0 - Updated the minimum deployment targets of Appboy iOS SDK to iOS 6.0. For apps supporting lower iOS versions, please continue to use 2.9.+ versions of the Appboy SDK. - Stop collecting user's Facebook data automatically. You can pass a user's Facebook information to Appboy by initialzing a ABKFacebookUser object with the facebook data, and set it to [Appboy sharedInstance].user.facebookUser. For more information, please refer to ABKUser.h and ABKFacebookUser.h. -- Removed the feature of prompting a user to connect his/her Facebook account. You can refer to the method `promptUserToConnectFacebookAccountOnDeviceAndFetchAccountData` in [SocialNetworkViewController.m](https://github.com/Appboy/appboy-ios-sdk/blob/master/Example/Stopwatch/SocialNetworkViewController.m) to continue prompting the user to connect the Facebook account. +- Removed the feature of prompting a user to connect his/her Facebook account. You can refer to the method `promptUserToConnectFacebookAccountOnDeviceAndFetchAccountData` in [FacebookViewController.m](https://github.com/Appboy/appboy-ios-sdk/blob/master/Example/Stopwatch/FacebookViewController.m) to continue prompting the user to connect the Facebook account. - Removed Facebook SDK dependent builds. Now there is a single library - AppboyKit - and a single Pod without functional subspecs - Appboy-iOS-SDK (note we now have both the subspecs pointing at the same library). Please update your Podfile to `pod 'Appboy-iOS-SDK` if you are integrating Appboy with Cocoapods. +## 2.9.6 +- Added the fix for an edge case when there are extra UIWindows at the time in-app message is going to display, the in-app message would have issue during dismissing. + ## 2.9.5 - Corrected a bug which would cause the host app to crash when a deep link was launched from a push notification. In versions 2.9.4, if the host app used `[[Appboy sharedInstance] registerApplication: didReceiveRemoteNotification:];` instead of `[[Appboy sharedInstance] registerApplication: didReceiveRemoteNotification: fetchCompletionHandler:];`, opening a push with a deep link would crash the host app in some circumstances. diff --git a/Example/.DS_Store b/Example/.DS_Store index b06700562..0607e6c0b 100644 Binary files a/Example/.DS_Store and b/Example/.DS_Store differ diff --git a/Example/Podfile.lock b/Example/Podfile.lock index 2f2342806..d02cc623e 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,13 +1,13 @@ PODS: - - Appboy-iOS-SDK (2.12.2): + - Appboy-iOS-SDK (2.13.0): - SDWebImage (~> 3.7.0) - KKColorListPicker (0.2.4) - NUI (0.5.5): - NUIParse - NUIParse (1.2.1) - - SDWebImage (3.7.2): - - SDWebImage/Core (= 3.7.2) - - SDWebImage/Core (3.7.2) + - SDWebImage (3.7.3): + - SDWebImage/Core (= 3.7.3) + - SDWebImage/Core (3.7.3) DEPENDENCIES: - Appboy-iOS-SDK (from `./../../Appboy-iOS-SDK/`) @@ -31,10 +31,10 @@ CHECKOUT OPTIONS: :git: https://github.com/tombenner/nui.git SPEC CHECKSUMS: - Appboy-iOS-SDK: 5da3707ae8999e97dc066b8742ae09d8f1e7e403 + Appboy-iOS-SDK: 5a7e5145e648884a20c5e2caa17b26859f1001f2 KKColorListPicker: de772db47659dea2a8c77bf9bac97648929ce10a NUI: 53de7278003235deb2a375fe6f04c7a3aa3e49eb NUIParse: 9b6d5a6b782dc654ac6c846d623885080306f07f - SDWebImage: 71b7cdc1d1721d6a82ed62889030225f2c249e29 + SDWebImage: 1d2b1a1efda1ade1b00b6f8498865f8ddedc8a84 -COCOAPODS: 0.37.1 +COCOAPODS: 0.37.2 diff --git a/Example/Stopwatch.xcodeproj/project.pbxproj b/Example/Stopwatch.xcodeproj/project.pbxproj index f92f11401..54c516c56 100644 --- a/Example/Stopwatch.xcodeproj/project.pbxproj +++ b/Example/Stopwatch.xcodeproj/project.pbxproj @@ -20,10 +20,22 @@ 4E49ED1819DDE84F00ADC43F /* stopwatch.png in Resources */ = {isa = PBXBuildFile; fileRef = 4E49ED0019DDE84F00ADC43F /* stopwatch.png */; }; 4E49ED1919DDE84F00ADC43F /* stopwatch@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4E49ED0119DDE84F00ADC43F /* stopwatch@2x.png */; }; 4E49ED1A19DDE84F00ADC43F /* twitter-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 4E49ED0219DDE84F00ADC43F /* twitter-icon.png */; }; + 4E4E68411B56E590007C286C /* StopwatchDevelop WatchKit Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = 4E69E0681B0AA273003D87FF /* StopwatchDevelop WatchKit Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + 4E5212511B377B9A00CD4CE6 /* ABWKUser.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E52124D1B377B9A00CD4CE6 /* ABWKUser.m */; }; + 4E5212521B377B9A00CD4CE6 /* AppboyWatchKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E52124F1B377B9A00CD4CE6 /* AppboyWatchKit.m */; }; + 4E619A9C1B0E85BC002B396E /* NewsInterfaceController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E619A9B1B0E85BC002B396E /* NewsInterfaceController.m */; }; + 4E619A9F1B0E85CD002B396E /* AppboyInterfaceController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E619A9E1B0E85CD002B396E /* AppboyInterfaceController.m */; }; + 4E69E06F1B0AA273003D87FF /* InterfaceController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E69E06E1B0AA273003D87FF /* InterfaceController.m */; }; + 4E69E0721B0AA273003D87FF /* NotificationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E69E0711B0AA273003D87FF /* NotificationController.m */; }; + 4E69E0751B0AA273003D87FF /* GlanceController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E69E0741B0AA273003D87FF /* GlanceController.m */; }; + 4E69E0771B0AA273003D87FF /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E69E0761B0AA273003D87FF /* Images.xcassets */; }; + 4E69E07B1B0AA274003D87FF /* StopwatchDevelop WatchKit App.app in Resources */ = {isa = PBXBuildFile; fileRef = 4E69E07A1B0AA273003D87FF /* StopwatchDevelop WatchKit App.app */; }; + 4E69E0831B0AA274003D87FF /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4E69E0811B0AA274003D87FF /* Interface.storyboard */; }; + 4E69E0851B0AA274003D87FF /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E69E0841B0AA274003D87FF /* Images.xcassets */; }; 4E6D661619DCC18F009983AD /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4E6D661519DCC18F009983AD /* Images.xcassets */; }; 4E76BAA2183546CF001872E3 /* libCrittercism_v4_1_2.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E76BAA1183546CF001872E3 /* libCrittercism_v4_1_2.a */; }; 4E76BAA5183546E3001872E3 /* dsym_upload.sh in Resources */ = {isa = PBXBuildFile; fileRef = 4E76BAA4183546E3001872E3 /* dsym_upload.sh */; }; - 4E7D1C7E1A9FE1990087DB64 /* SocialNetworkViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E7D1C7D1A9FE1990087DB64 /* SocialNetworkViewController.m */; }; + 4E7D1C7E1A9FE1990087DB64 /* FacebookViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E7D1C7D1A9FE1990087DB64 /* FacebookViewController.m */; }; 4E94D76E1743EE7100604EA0 /* Clock.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E94D76D1743EE7100604EA0 /* Clock.m */; }; 4E94D7711743EE8900604EA0 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E94D7701743EE8900604EA0 /* AppDelegate.m */; }; 4EA0515D18998472007217BD /* CustomInAppMessageViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4EA0515B18998472007217BD /* CustomInAppMessageViewController.xib */; }; @@ -33,6 +45,7 @@ 4EABC19D1A621B7F007259BD /* InAppMessageUICells.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EABC19C1A621B7F007259BD /* InAppMessageUICells.m */; }; 4EB014FD1A79D31D00E11E41 /* InAppMessageTestViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 955DE8941741A70700C07A57 /* InAppMessageTestViewController.m */; }; 4EB014FE1A79D4C900E11E41 /* CustomInAppMessageViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EA0515A18998472007217BD /* CustomInAppMessageViewController.m */; }; + 4EDB97211B3B6226003BB81D /* TwitterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EDB97201B3B6226003BB81D /* TwitterViewController.m */; }; 797795232AE54425A15B3018 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 01F620394EDC4EF6A11D6429 /* libPods.a */; }; 953574AB1743F862003A64B3 /* UserAttributesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 953574A81743F862003A64B3 /* UserAttributesViewController.m */; }; 955DE89017419DB000C07A57 /* TestingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 955DE88F17419DB000C07A57 /* TestingViewController.m */; }; @@ -57,6 +70,30 @@ E3AF79251AEACAB30075681E /* EventsAndPropertiesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E3AF79241AEACAB30075681E /* EventsAndPropertiesViewController.m */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 4E4E68421B56E590007C286C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 95EF5102173D5FD600C0D780 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4E69E0671B0AA273003D87FF; + remoteInfo = "StopwatchDevelop WatchKit Extension"; + }; + 4E4E68461B56E599007C286C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 95EF5102173D5FD600C0D780 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4E69E0791B0AA273003D87FF; + remoteInfo = "StopwatchDevelop WatchKit App"; + }; + 4E69E07C1B0AA274003D87FF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 95EF5102173D5FD600C0D780 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 4E69E0791B0AA273003D87FF; + remoteInfo = "StopwatchDevelop WatchKit App"; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXCopyFilesBuildPhase section */ 4E321B9519C12246000EE12B /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; @@ -68,6 +105,17 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + 4E4E68441B56E590007C286C /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + 4E4E68411B56E590007C286C /* StopwatchDevelop WatchKit Extension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -87,12 +135,35 @@ 4E49ED0019DDE84F00ADC43F /* stopwatch.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = stopwatch.png; sourceTree = ""; }; 4E49ED0119DDE84F00ADC43F /* stopwatch@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "stopwatch@2x.png"; sourceTree = ""; }; 4E49ED0219DDE84F00ADC43F /* twitter-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "twitter-icon.png"; sourceTree = ""; }; + 4E52124C1B377B9A00CD4CE6 /* ABWKUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ABWKUser.h; path = "../Appboy-WatchKit/ABWKUser.h"; sourceTree = SOURCE_ROOT; }; + 4E52124D1B377B9A00CD4CE6 /* ABWKUser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ABWKUser.m; path = "../Appboy-WatchKit/ABWKUser.m"; sourceTree = SOURCE_ROOT; }; + 4E52124E1B377B9A00CD4CE6 /* AppboyWatchKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppboyWatchKit.h; path = "../Appboy-WatchKit/AppboyWatchKit.h"; sourceTree = SOURCE_ROOT; }; + 4E52124F1B377B9A00CD4CE6 /* AppboyWatchKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppboyWatchKit.m; path = "../Appboy-WatchKit/AppboyWatchKit.m"; sourceTree = SOURCE_ROOT; }; + 4E5212501B377B9A00CD4CE6 /* AppboyWatchKitKeys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppboyWatchKitKeys.h; path = "../Appboy-WatchKit/AppboyWatchKitKeys.h"; sourceTree = SOURCE_ROOT; }; + 4E619A9A1B0E85BC002B396E /* NewsInterfaceController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NewsInterfaceController.h; sourceTree = ""; }; + 4E619A9B1B0E85BC002B396E /* NewsInterfaceController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NewsInterfaceController.m; sourceTree = ""; }; + 4E619A9D1B0E85CD002B396E /* AppboyInterfaceController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppboyInterfaceController.h; sourceTree = ""; }; + 4E619A9E1B0E85CD002B396E /* AppboyInterfaceController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppboyInterfaceController.m; sourceTree = ""; }; + 4E69E0681B0AA273003D87FF /* StopwatchDevelop WatchKit Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "StopwatchDevelop WatchKit Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4E69E06B1B0AA273003D87FF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 4E69E06C1B0AA273003D87FF /* PushNotificationPayload.apns */ = {isa = PBXFileReference; lastKnownFileType = text; path = PushNotificationPayload.apns; sourceTree = ""; }; + 4E69E06D1B0AA273003D87FF /* InterfaceController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = InterfaceController.h; sourceTree = ""; }; + 4E69E06E1B0AA273003D87FF /* InterfaceController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = InterfaceController.m; sourceTree = ""; }; + 4E69E0701B0AA273003D87FF /* NotificationController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationController.h; sourceTree = ""; }; + 4E69E0711B0AA273003D87FF /* NotificationController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotificationController.m; sourceTree = ""; }; + 4E69E0731B0AA273003D87FF /* GlanceController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GlanceController.h; sourceTree = ""; }; + 4E69E0741B0AA273003D87FF /* GlanceController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GlanceController.m; sourceTree = ""; }; + 4E69E0761B0AA273003D87FF /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 4E69E07A1B0AA273003D87FF /* StopwatchDevelop WatchKit App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "StopwatchDevelop WatchKit App.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 4E69E0801B0AA274003D87FF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 4E69E0821B0AA274003D87FF /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = ""; }; + 4E69E0841B0AA274003D87FF /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 4E6D661519DCC18F009983AD /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 4E76BAA1183546CF001872E3 /* libCrittercism_v4_1_2.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libCrittercism_v4_1_2.a; sourceTree = ""; }; 4E76BAA3183546E3001872E3 /* CRFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CRFilter.h; sourceTree = ""; }; 4E76BAA4183546E3001872E3 /* dsym_upload.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = dsym_upload.sh; sourceTree = ""; }; - 4E7D1C7C1A9FE1990087DB64 /* SocialNetworkViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SocialNetworkViewController.h; sourceTree = ""; }; - 4E7D1C7D1A9FE1990087DB64 /* SocialNetworkViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SocialNetworkViewController.m; sourceTree = ""; }; + 4E7D1C7C1A9FE1990087DB64 /* FacebookViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FacebookViewController.h; sourceTree = ""; }; + 4E7D1C7D1A9FE1990087DB64 /* FacebookViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FacebookViewController.m; sourceTree = ""; }; 4E94D76C1743EE7100604EA0 /* Clock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Clock.h; sourceTree = ""; }; 4E94D76D1743EE7100604EA0 /* Clock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Clock.m; sourceTree = ""; }; 4E94D76F1743EE8900604EA0 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; @@ -108,6 +179,10 @@ 4EABC1991A606D00007259BD /* InAppMessageUIViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InAppMessageUIViewController.m; sourceTree = ""; }; 4EABC19B1A621AF4007259BD /* InAppMessageUICells.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InAppMessageUICells.h; sourceTree = ""; }; 4EABC19C1A621B7F007259BD /* InAppMessageUICells.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InAppMessageUICells.m; sourceTree = ""; }; + 4EDB971F1B3B6226003BB81D /* TwitterViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TwitterViewController.h; sourceTree = ""; }; + 4EDB97201B3B6226003BB81D /* TwitterViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TwitterViewController.m; sourceTree = ""; }; + 4EEAD0EE1B0FB00700883707 /* Stopwatch.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = Stopwatch.entitlements; sourceTree = ""; }; + 4EEAD0EF1B0FB0B700883707 /* StopwatchDevelop WatchKit Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = "StopwatchDevelop WatchKit Extension.entitlements"; sourceTree = ""; }; 56A3C142EBEA4F6FEF1BAF49 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; 7FFB110B1A70275200A6DAFB /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; 7FFB11201A703BAE00A6DAFB /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; @@ -178,6 +253,13 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 4E69E0651B0AA273003D87FF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 95EF5107173D5FD600C0D780 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -234,6 +316,66 @@ path = Stopwatch/Images; sourceTree = ""; }; + 4E52124B1B377B9A00CD4CE6 /* Appboy-WatchKit */ = { + isa = PBXGroup; + children = ( + 4E52124C1B377B9A00CD4CE6 /* ABWKUser.h */, + 4E52124D1B377B9A00CD4CE6 /* ABWKUser.m */, + 4E52124E1B377B9A00CD4CE6 /* AppboyWatchKit.h */, + 4E52124F1B377B9A00CD4CE6 /* AppboyWatchKit.m */, + 4E5212501B377B9A00CD4CE6 /* AppboyWatchKitKeys.h */, + ); + name = "Appboy-WatchKit"; + path = "../Appboy-WatchKit"; + sourceTree = ""; + }; + 4E69E0691B0AA273003D87FF /* StopwatchDevelop WatchKit Extension */ = { + isa = PBXGroup; + children = ( + 4EEAD0EF1B0FB0B700883707 /* StopwatchDevelop WatchKit Extension.entitlements */, + 4E69E06D1B0AA273003D87FF /* InterfaceController.h */, + 4E69E06E1B0AA273003D87FF /* InterfaceController.m */, + 4E619A9A1B0E85BC002B396E /* NewsInterfaceController.h */, + 4E619A9B1B0E85BC002B396E /* NewsInterfaceController.m */, + 4E619A9D1B0E85CD002B396E /* AppboyInterfaceController.h */, + 4E619A9E1B0E85CD002B396E /* AppboyInterfaceController.m */, + 4E69E0701B0AA273003D87FF /* NotificationController.h */, + 4E69E0711B0AA273003D87FF /* NotificationController.m */, + 4E69E0731B0AA273003D87FF /* GlanceController.h */, + 4E69E0741B0AA273003D87FF /* GlanceController.m */, + 4E69E0761B0AA273003D87FF /* Images.xcassets */, + 4E69E06A1B0AA273003D87FF /* Supporting Files */, + ); + path = "StopwatchDevelop WatchKit Extension"; + sourceTree = ""; + }; + 4E69E06A1B0AA273003D87FF /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 4E69E06B1B0AA273003D87FF /* Info.plist */, + 4E69E06C1B0AA273003D87FF /* PushNotificationPayload.apns */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 4E69E07E1B0AA274003D87FF /* StopwatchDevelop WatchKit App */ = { + isa = PBXGroup; + children = ( + 4E69E0811B0AA274003D87FF /* Interface.storyboard */, + 4E69E0841B0AA274003D87FF /* Images.xcassets */, + 4E69E07F1B0AA274003D87FF /* Supporting Files */, + ); + path = "StopwatchDevelop WatchKit App"; + sourceTree = ""; + }; + 4E69E07F1B0AA274003D87FF /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 4E69E0801B0AA274003D87FF /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; 4F0CF3B17114F763B7942B56 /* Pods */ = { isa = PBXGroup; children = ( @@ -246,11 +388,14 @@ 95EF5101173D5FD600C0D780 = { isa = PBXGroup; children = ( + 4E52124B1B377B9A00CD4CE6 /* Appboy-WatchKit */, 4E49ECEA19DDE84F00ADC43F /* Images */, 4E3E94F118BD5D530008C815 /* StopwatchNUIStyle.nss */, 4E3E94E118BD52C60008C815 /* Localizable.strings */, C5CC74A01766B955005DAD08 /* CrittercismSDK */, 95EF5113173D5FD600C0D780 /* Stopwatch */, + 4E69E0691B0AA273003D87FF /* StopwatchDevelop WatchKit Extension */, + 4E69E07E1B0AA274003D87FF /* StopwatchDevelop WatchKit App */, 95EF510C173D5FD600C0D780 /* Frameworks */, 95EF510B173D5FD600C0D780 /* Products */, 4F0CF3B17114F763B7942B56 /* Pods */, @@ -261,6 +406,8 @@ isa = PBXGroup; children = ( 95EF510A173D5FD600C0D780 /* StopwatchDevelop.app */, + 4E69E0681B0AA273003D87FF /* StopwatchDevelop WatchKit Extension.appex */, + 4E69E07A1B0AA273003D87FF /* StopwatchDevelop WatchKit App.app */, ); name = Products; sourceTree = ""; @@ -290,6 +437,9 @@ 95EF5113173D5FD600C0D780 /* Stopwatch */ = { isa = PBXGroup; children = ( + 4EEAD0EE1B0FB00700883707 /* Stopwatch.entitlements */, + 4EDB971F1B3B6226003BB81D /* TwitterViewController.h */, + 4EDB97201B3B6226003BB81D /* TwitterViewController.m */, 4E3178751AC49363006C88B4 /* CustomInAppMessageClasses */, 4E94D76F1743EE8900604EA0 /* AppDelegate.h */, 4E94D7701743EE8900604EA0 /* AppDelegate.m */, @@ -301,8 +451,8 @@ 4E94D76D1743EE7100604EA0 /* Clock.m */, 955DE88E17419DB000C07A57 /* TestingViewController.h */, 955DE88F17419DB000C07A57 /* TestingViewController.m */, - 4E7D1C7C1A9FE1990087DB64 /* SocialNetworkViewController.h */, - 4E7D1C7D1A9FE1990087DB64 /* SocialNetworkViewController.m */, + 4E7D1C7C1A9FE1990087DB64 /* FacebookViewController.h */, + 4E7D1C7D1A9FE1990087DB64 /* FacebookViewController.m */, 953574A81743F862003A64B3 /* UserAttributesViewController.m */, 953574A91743F862003A64B3 /* UserAttributesViewController.h */, 95EF5114173D5FD600C0D780 /* Supporting Files */, @@ -350,6 +500,39 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 4E69E0671B0AA273003D87FF /* StopwatchDevelop WatchKit Extension */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4E69E0901B0AA274003D87FF /* Build configuration list for PBXNativeTarget "StopwatchDevelop WatchKit Extension" */; + buildPhases = ( + 4E69E0641B0AA273003D87FF /* Sources */, + 4E69E0651B0AA273003D87FF /* Frameworks */, + 4E69E0661B0AA273003D87FF /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 4E69E07D1B0AA274003D87FF /* PBXTargetDependency */, + ); + name = "StopwatchDevelop WatchKit Extension"; + productName = "StopwatchDevelop WatchKit Extension"; + productReference = 4E69E0681B0AA273003D87FF /* StopwatchDevelop WatchKit Extension.appex */; + productType = "com.apple.product-type.watchkit-extension"; + }; + 4E69E0791B0AA273003D87FF /* StopwatchDevelop WatchKit App */ = { + isa = PBXNativeTarget; + buildConfigurationList = 4E69E08F1B0AA274003D87FF /* Build configuration list for PBXNativeTarget "StopwatchDevelop WatchKit App" */; + buildPhases = ( + 4E69E0781B0AA273003D87FF /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "StopwatchDevelop WatchKit App"; + productName = "StopwatchDevelop WatchKit App"; + productReference = 4E69E07A1B0AA273003D87FF /* StopwatchDevelop WatchKit App.app */; + productType = "com.apple.product-type.application.watchapp"; + }; 95EF5109173D5FD600C0D780 /* Stopwatch */ = { isa = PBXNativeTarget; buildConfigurationList = 95EF5130173D5FD600C0D780 /* Build configuration list for PBXNativeTarget "Stopwatch" */; @@ -361,10 +544,13 @@ C5CC74A51766BC6B005DAD08 /* Upload DYSM to Crittercism */, 3993FFFAF9154BEEBDD5FA87 /* Copy Pods Resources */, 4E321B9519C12246000EE12B /* Embed Frameworks */, + 4E4E68441B56E590007C286C /* Embed App Extensions */, ); buildRules = ( ); dependencies = ( + 4E4E68431B56E590007C286C /* PBXTargetDependency */, + 4E4E68471B56E599007C286C /* PBXTargetDependency */, ); name = Stopwatch; productName = Stopwatch; @@ -380,9 +566,25 @@ LastUpgradeCheck = 0460; ORGANIZATIONNAME = Appboy; TargetAttributes = { + 4E69E0671B0AA273003D87FF = { + CreatedOnToolsVersion = 6.4; + DevelopmentTeam = 5GLZKGNWQ3; + SystemCapabilities = { + com.apple.ApplicationGroups.iOS = { + enabled = 1; + }; + }; + }; + 4E69E0791B0AA273003D87FF = { + CreatedOnToolsVersion = 6.4; + DevelopmentTeam = 5GLZKGNWQ3; + }; 95EF5109173D5FD600C0D780 = { DevelopmentTeam = 5GLZKGNWQ3; SystemCapabilities = { + com.apple.ApplicationGroups.iOS = { + enabled = 1; + }; com.apple.BackgroundModes = { enabled = 1; }; @@ -429,6 +631,7 @@ hi, "es-MX", "es-419", + Base, ); mainGroup = 95EF5101173D5FD600C0D780; productRefGroup = 95EF510B173D5FD600C0D780 /* Products */; @@ -436,11 +639,31 @@ projectRoot = ""; targets = ( 95EF5109173D5FD600C0D780 /* Stopwatch */, + 4E69E0671B0AA273003D87FF /* StopwatchDevelop WatchKit Extension */, + 4E69E0791B0AA273003D87FF /* StopwatchDevelop WatchKit App */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 4E69E0661B0AA273003D87FF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4E69E07B1B0AA274003D87FF /* StopwatchDevelop WatchKit App.app in Resources */, + 4E69E0771B0AA273003D87FF /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4E69E0781B0AA273003D87FF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4E69E0831B0AA274003D87FF /* Interface.storyboard in Resources */, + 4E69E0851B0AA274003D87FF /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 95EF5108173D5FD600C0D780 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -517,6 +740,20 @@ /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 4E69E0641B0AA273003D87FF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 4E69E0721B0AA273003D87FF /* NotificationController.m in Sources */, + 4E69E06F1B0AA273003D87FF /* InterfaceController.m in Sources */, + 4E619A9C1B0E85BC002B396E /* NewsInterfaceController.m in Sources */, + 4E5212511B377B9A00CD4CE6 /* ABWKUser.m in Sources */, + 4E69E0751B0AA273003D87FF /* GlanceController.m in Sources */, + 4E5212521B377B9A00CD4CE6 /* AppboyWatchKit.m in Sources */, + 4E619A9F1B0E85CD002B396E /* AppboyInterfaceController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 95EF5106173D5FD600C0D780 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -532,14 +769,33 @@ 4E94D76E1743EE7100604EA0 /* Clock.m in Sources */, 4E94D7711743EE8900604EA0 /* AppDelegate.m in Sources */, E3AF79251AEACAB30075681E /* EventsAndPropertiesViewController.m in Sources */, - 4E7D1C7E1A9FE1990087DB64 /* SocialNetworkViewController.m in Sources */, + 4E7D1C7E1A9FE1990087DB64 /* FacebookViewController.m in Sources */, 953574AB1743F862003A64B3 /* UserAttributesViewController.m in Sources */, + 4EDB97211B3B6226003BB81D /* TwitterViewController.m in Sources */, 4EA3EE241745B9A2000E403C /* UserAttributeCell.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 4E4E68431B56E590007C286C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4E69E0671B0AA273003D87FF /* StopwatchDevelop WatchKit Extension */; + targetProxy = 4E4E68421B56E590007C286C /* PBXContainerItemProxy */; + }; + 4E4E68471B56E599007C286C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4E69E0791B0AA273003D87FF /* StopwatchDevelop WatchKit App */; + targetProxy = 4E4E68461B56E599007C286C /* PBXContainerItemProxy */; + }; + 4E69E07D1B0AA274003D87FF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 4E69E0791B0AA273003D87FF /* StopwatchDevelop WatchKit App */; + targetProxy = 4E69E07C1B0AA274003D87FF /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ 4E3E94E118BD52C60008C815 /* Localizable.strings */ = { isa = PBXVariantGroup; @@ -579,6 +835,14 @@ name = Localizable.strings; sourceTree = ""; }; + 4E69E0811B0AA274003D87FF /* Interface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 4E69E0821B0AA274003D87FF /* Base */, + ); + name = Interface.storyboard; + sourceTree = ""; + }; 95EF5116173D5FD600C0D780 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( @@ -620,8 +884,8 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; @@ -637,6 +901,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 6.0; LIBRARY_SEARCH_PATHS = "${BUILT_PRODUCTS_DIR}"; ONLY_ACTIVE_ARCH = NO; + PROVISIONING_PROFILE = "21e8bce6-aa38-46ea-aa2a-63782fd37da3"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; VALID_ARCHS = "arm64 armv7 armv7s armv6 x86_64 i386"; @@ -649,15 +914,13 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CODE_SIGN_ENTITLEMENTS = Stopwatch/Stopwatch.entitlements; CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "${SRCROOT}/../Appboy-iOS-SDK/AppboyKitWithoutFacebookSupport", - ); + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Stopwatch/Stopwatch-Prefix.pch"; INFOPLIST_FILE = "Stopwatch/Stopwatch-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -665,11 +928,224 @@ ); ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "40732de2-14e2-49ac-8a03-369f0adb4a66"; + PROVISIONING_PROFILE = "21e8bce6-aa38-46ea-aa2a-63782fd37da3"; WRAPPER_EXTENSION = app; }; name = Develop; }; + 4E69E0891B0AA274003D87FF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_ENTITLEMENTS = "StopwatchDevelop WatchKit Extension/StopwatchDevelop WatchKit Extension.entitlements"; + CODE_SIGN_IDENTITY = "iPhone Distribution: Appboy Inc. (5GLZKGNWQ3)"; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + 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; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "\"${PROJECT_DIR}/../AppboyKit-WatchKit\"", + ); + INFOPLIST_FILE = "StopwatchDevelop WatchKit Extension/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "${TARGET_NAME}"; + PROVISIONING_PROFILE = "1f60e1db-5436-43ef-b8bf-f340466977be"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 4E69E08A1B0AA274003D87FF /* Develop */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_ENTITLEMENTS = "StopwatchDevelop WatchKit Extension/StopwatchDevelop WatchKit Extension.entitlements"; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + 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; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "\"${PROJECT_DIR}/../AppboyKit-WatchKit\"", + ); + INFOPLIST_FILE = "StopwatchDevelop WatchKit Extension/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "${TARGET_NAME}"; + PROVISIONING_PROFILE = "f4dfc4dd-4f26-48e9-b7fa-62a3ffe24c6e"; + SKIP_INSTALL = YES; + }; + name = Develop; + }; + 4E69E08B1B0AA274003D87FF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_ENTITLEMENTS = "StopwatchDevelop WatchKit Extension/StopwatchDevelop WatchKit Extension.entitlements"; + CODE_SIGN_IDENTITY = "iPhone Distribution: Appboy Inc. (5GLZKGNWQ3)"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + 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; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "\"${PROJECT_DIR}/../AppboyKit-WatchKit\"", + ); + INFOPLIST_FILE = "StopwatchDevelop WatchKit Extension/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "${TARGET_NAME}"; + PROVISIONING_PROFILE = "e3a04a8c-4f91-4a39-bdc7-c92d30472e1f"; + SKIP_INSTALL = YES; + }; + name = Release; + }; + 4E69E08C1B0AA274003D87FF /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = WatchAppIcon; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution: Appboy Inc. (5GLZKGNWQ3)"; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + 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; + IBSC_MODULE = StopwatchDevelop_WatchKit_Extension; + INFOPLIST_FILE = "StopwatchDevelop WatchKit App/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = "f35bd3b3-52d4-49d0-b3e9-216e8e7b5dc1"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + "TARGETED_DEVICE_FAMILY[sdk=iphonesimulator*]" = "1,4"; + }; + name = Debug; + }; + 4E69E08D1B0AA274003D87FF /* Develop */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = WatchAppIcon; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + 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; + IBSC_MODULE = StopwatchDevelop_WatchKit_Extension; + INFOPLIST_FILE = "StopwatchDevelop WatchKit App/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = "f4dfc4dd-4f26-48e9-b7fa-62a3ffe24c6e"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + "TARGETED_DEVICE_FAMILY[sdk=iphonesimulator*]" = "1,4"; + }; + name = Develop; + }; + 4E69E08E1B0AA274003D87FF /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = WatchAppIcon; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_IDENTITY = "iPhone Distribution: Appboy Inc. (5GLZKGNWQ3)"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + 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; + IBSC_MODULE = StopwatchDevelop_WatchKit_Extension; + INFOPLIST_FILE = "StopwatchDevelop WatchKit App/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = "012636b9-53c0-43d9-94b8-6f390cb96065"; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 4; + "TARGETED_DEVICE_FAMILY[sdk=iphonesimulator*]" = "1,4"; + }; + name = Release; + }; 95EF512E173D5FD600C0D780 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -682,8 +1158,8 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COPY_PHASE_STRIP = NO; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; @@ -699,7 +1175,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 6.0; LIBRARY_SEARCH_PATHS = "${BUILT_PRODUCTS_DIR}"; ONLY_ACTIVE_ARCH = NO; - PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE = "21e8bce6-aa38-46ea-aa2a-63782fd37da3"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; VALID_ARCHS = "arm64 armv7 armv7s armv6 x86_64 i386"; @@ -718,8 +1194,8 @@ CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COPY_PHASE_STRIP = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_ABOUT_RETURN_TYPE = YES; @@ -728,6 +1204,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 6.0; LIBRARY_SEARCH_PATHS = "${BUILT_PRODUCTS_DIR}"; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; + PROVISIONING_PROFILE = "21e8bce6-aa38-46ea-aa2a-63782fd37da3"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -741,15 +1218,13 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CODE_SIGN_ENTITLEMENTS = Stopwatch/Stopwatch.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution: Appboy Inc. (5GLZKGNWQ3)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Appboy Inc. (5GLZKGNWQ3)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "${SRCROOT}/../Appboy-iOS-SDK/AppboyKitWithoutFacebookSupport", - ); + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Stopwatch/Stopwatch-Prefix.pch"; INFOPLIST_FILE = "Stopwatch/Stopwatch-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -757,7 +1232,7 @@ ); ONLY_ACTIVE_ARCH = YES; PRODUCT_NAME = StopwatchDevelop; - PROVISIONING_PROFILE = "ca111731-3a13-436d-80b4-770d40ce2a2e"; + PROVISIONING_PROFILE = "96addba3-911e-4172-a30c-4fa5f7399be2"; WRAPPER_EXTENSION = app; }; name = Debug; @@ -768,15 +1243,13 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; + CODE_SIGN_ENTITLEMENTS = Stopwatch/Stopwatch.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution: Appboy Inc. (5GLZKGNWQ3)"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Appboy Inc. (5GLZKGNWQ3)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "${SRCROOT}/../Appboy-iOS-SDK/AppboyKitWithoutFacebookSupport", - ); + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "Stopwatch/Stopwatch-Prefix.pch"; INFOPLIST_FILE = "Stopwatch/Stopwatch-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = ( "$(inherited)", @@ -784,7 +1257,7 @@ ); ONLY_ACTIVE_ARCH = NO; PRODUCT_NAME = Stopwatch; - PROVISIONING_PROFILE = "7d31dd8b-9551-4592-9ec6-60bc52741ec5"; + PROVISIONING_PROFILE = "38ca3614-b7e9-4a23-a02f-520282dbb3ab"; WRAPPER_EXTENSION = app; }; name = Release; @@ -792,6 +1265,26 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 4E69E08F1B0AA274003D87FF /* Build configuration list for PBXNativeTarget "StopwatchDevelop WatchKit App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4E69E08C1B0AA274003D87FF /* Debug */, + 4E69E08D1B0AA274003D87FF /* Develop */, + 4E69E08E1B0AA274003D87FF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; + 4E69E0901B0AA274003D87FF /* Build configuration list for PBXNativeTarget "StopwatchDevelop WatchKit Extension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4E69E0891B0AA274003D87FF /* Debug */, + 4E69E08A1B0AA274003D87FF /* Develop */, + 4E69E08B1B0AA274003D87FF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Debug; + }; 95EF5105173D5FD600C0D780 /* Build configuration list for PBXProject "Stopwatch" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Example/Stopwatch.xcodeproj/xcuserdata/Wenzhi.xcuserdatad/xcschemes/Stopwatch.xcscheme b/Example/Stopwatch.xcodeproj/xcuserdata/Wenzhi.xcuserdatad/xcschemes/Stopwatch.xcscheme index a1ed7bb1d..d4b21d96a 100644 --- a/Example/Stopwatch.xcodeproj/xcuserdata/Wenzhi.xcuserdatad/xcschemes/Stopwatch.xcscheme +++ b/Example/Stopwatch.xcodeproj/xcuserdata/Wenzhi.xcuserdatad/xcschemes/Stopwatch.xcscheme @@ -46,7 +46,7 @@ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" launchStyle = "0" useCustomWorkingDirectory = "NO" - buildConfiguration = "Debug" + buildConfiguration = "Develop" ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" @@ -68,12 +68,16 @@ isEnabled = "YES"> + + diff --git a/Example/Stopwatch.xcodeproj/xcuserdata/Wenzhi.xcuserdatad/xcschemes/StopwatchDevelop WatchKit App.xcscheme b/Example/Stopwatch.xcodeproj/xcuserdata/Wenzhi.xcuserdatad/xcschemes/StopwatchDevelop WatchKit App.xcscheme index bebc22e14..7d2e810ba 100644 --- a/Example/Stopwatch.xcodeproj/xcuserdata/Wenzhi.xcuserdatad/xcschemes/StopwatchDevelop WatchKit App.xcscheme +++ b/Example/Stopwatch.xcodeproj/xcuserdata/Wenzhi.xcuserdatad/xcschemes/StopwatchDevelop WatchKit App.xcscheme @@ -72,10 +72,11 @@ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" launchStyle = "0" useCustomWorkingDirectory = "NO" - buildConfiguration = "Debug" + buildConfiguration = "Develop" ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" - allowLocationSimulation = "YES"> + allowLocationSimulation = "YES" + notificationPayloadFile = "StopwatchDevelop WatchKit Extension/PushNotificationPayload.apns"> \ No newline at end of file + + + + + + + diff --git a/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/UserInterfaceState.xcuserstate b/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/UserInterfaceState.xcuserstate index 1212f4b2c..5ecf58493 100644 Binary files a/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/UserInterfaceState.xcuserstate and b/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 19c5ceb64..b8046274b 100644 --- a/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -10,11 +10,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "Stopwatch/AppDelegate.m" - timestampString = "456951505.797038" + timestampString = "459045919.046108" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "122" - endingLineNumber = "122"> + startingLineNumber = "171" + endingLineNumber = "171"> + startingLineNumber = "181" + endingLineNumber = "181"> - - - - + startingLineNumber = "187" + endingLineNumber = "187"> @@ -89,7 +73,7 @@ endingColumnNumber = "9223372036854775807" startingLineNumber = "323" endingLineNumber = "323" - landmarkName = "-pushNotificationWasSentFromAppboy:" + landmarkName = "-registerPushToken:" landmarkType = "5"> @@ -116,11 +100,11 @@ ignoreCount = "0" continueAfterRunningActions = "No" filePath = "Stopwatch/InitialViewController.m" - timestampString = "454432952.203282" + timestampString = "458862821.723726" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "435" - endingLineNumber = "435"> + startingLineNumber = "438" + endingLineNumber = "438"> + startingLineNumber = "411" + endingLineNumber = "411"> @@ -231,7 +213,7 @@ endingColumnNumber = "9223372036854775807" startingLineNumber = "322" endingLineNumber = "322" - landmarkName = "-connectionDidFinishLoading:" + landmarkName = "-connection:didFailWithError:" landmarkType = "5"> @@ -247,7 +229,7 @@ endingColumnNumber = "9223372036854775807" startingLineNumber = "319" endingLineNumber = "319" - landmarkName = "-connectionDidFinishLoading:" + landmarkName = "-connection:didFailWithError:" landmarkType = "5"> @@ -334,23 +316,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -693,22 +563,6 @@ landmarkType = "5"> - - - - + startingLineNumber = "168" + endingLineNumber = "168"> + startingLineNumber = "167" + endingLineNumber = "167"> @@ -1016,23 +866,7 @@ - - - - + endingLineNumber = "122" + landmarkName = "-moveInAppMessageViewOnScreen:" + landmarkType = "5"> + + + + + + + + + + + + + + + + + + + + @@ -1129,13 +1045,43 @@ shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" - filePath = "../AppboyKit/AppboyKit/UserInterface/InAppMessage/ABKInAppMessageWindowController.m" - timestampString = "457891440.384692" + filePath = "Stopwatch/AppDelegate.m" + timestampString = "459045919.046108" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "47" - endingLineNumber = "47" - landmarkName = "-viewDidLoad" + startingLineNumber = "158" + endingLineNumber = "158"> + + + + + + + + @@ -1145,13 +1091,109 @@ shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" - filePath = "../AppboyKit/AppboyKit/UserInterface/InAppMessage/ABKInAppMessageWindowController.m" - timestampString = "457900000.142478" + filePath = "Stopwatch/AppDelegate.m" + timestampString = "459045919.046108" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "69" - endingLineNumber = "69" - landmarkName = "-viewDidLoad" + startingLineNumber = "67" + endingLineNumber = "67" + landmarkName = "-application:handleActionWithIdentifier:forRemoteNotification:completionHandler:" + landmarkType = "5"> + + + + + + + + + + + + + + + + + + + + + + + + @@ -1161,13 +1203,29 @@ shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" - filePath = "../AppboyKit/AppboyKit/UserInterface/InAppMessage/ABKInAppMessageSlideupViewController.m" - timestampString = "457900031.181546" + filePath = "../AppboyKit/AppboyKit/Location/ABKSignificantChangeLocationProvider.m" + timestampString = "459049365.980552" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "107" - endingLineNumber = "107" - landmarkName = "-moveInAppMessageViewOffScreen:" + startingLineNumber = "70" + endingLineNumber = "70" + landmarkName = "-locationServerConfigUpdated:" + landmarkType = "5"> + + + + @@ -1177,13 +1235,157 @@ shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" - filePath = "../AppboyKit/AppboyKit/UserInterface/InAppMessage/ABKInAppMessageWindowController.m" - timestampString = "457901088.970271" + filePath = "../AppboyKit/AppboyKit/Location/ABKSignificantChangeLocationProvider.m" + timestampString = "459049472.146782" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "46" - endingLineNumber = "46" - landmarkName = "-viewDidLoad" + startingLineNumber = "110" + endingLineNumber = "110" + landmarkName = "-locationManager:didUpdateLocations:" + landmarkType = "5"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/xcdebugger/Expressions.xcexplist b/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/xcdebugger/Expressions.xcexplist index df392382d..d8b503c7b 100644 --- a/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/xcdebugger/Expressions.xcexplist +++ b/Example/Stopwatch.xcworkspace/xcuserdata/Wenzhi.xcuserdatad/xcdebugger/Expressions.xcexplist @@ -3,13 +3,16 @@ version = "1.0"> + contextName = "-[ABKInAppMessageBlockingViewController createOneButtonAndConstraintsWithHeight:sideMargin:bottom:onView:]:ABKInAppMessageBlockingViewController.m"> + value = "button = (ABKInAppMessageBlocking *)self.inAppMessage).buttons[0]"> + + @@ -19,7 +22,7 @@ + contextName = "-[ABKSignificantChangeLocationProvider locationServerConfigUpdated:]:ABKSignificantChangeLocationProvider.m"> @@ -30,18 +33,21 @@ + contextName = "-[ABKSignificantChangeLocationProvider tryPromptForAlwaysAuthorization]:ABKSignificantChangeLocationProvider.m"> + value = "[_locationManager requestAlwaysAuthorization]"> + contextName = "-[AppDelegate applicationDidBecomeActive:]:AppDelegate.m"> + value = "type"> + + @@ -53,8 +59,35 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Stopwatch/.DS_Store b/Example/Stopwatch/.DS_Store index 3b460567e..8d3cd82dc 100644 Binary files a/Example/Stopwatch/.DS_Store and b/Example/Stopwatch/.DS_Store differ diff --git a/Example/Stopwatch/AppDelegate.m b/Example/Stopwatch/AppDelegate.m index 6d4fc8c6f..098db5127 100644 --- a/Example/Stopwatch/AppDelegate.m +++ b/Example/Stopwatch/AppDelegate.m @@ -1,6 +1,7 @@ #import "AppDelegate.h" #import #import "NUISettings.h" +#import "ABKPushUtils.h" static NSString *const AppboyApiKey = @"appboy-sample-ios"; static NSString *const CrittercismAppId = @"51b67d141386207417000002"; @@ -18,8 +19,7 @@ - (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions: [Appboy startWithApiKey:AppboyApiKey inApplication:application withLaunchOptions:launchOptions - withAppboyOptions:@{ABKRequestProcessingPolicyOptionKey: @(ABKAutomaticRequestProcessing), - ABKSocialAccountAcquisitionPolicyOptionKey:@(ABKAutomaticSocialAccountAcquisition)}]; + withAppboyOptions:@{ABKRequestProcessingPolicyOptionKey: @(ABKAutomaticRequestProcessing)}]; if ([Appboy sharedInstance].user.email) { [Crittercism setUsername:[Appboy sharedInstance].user.email]; @@ -71,6 +71,9 @@ - (void) application:(UIApplication *)application handleActionWithIdentifier:(NS // is in the background, Appboy will try to fetch the news feed, and call completionHandler after // the request finished; otherwise, Appboy won't fetch the news feed, nor call the completionHandler. - (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { + if ([ABKPushUtils isUninstallTrackingNotification:userInfo]) { + NSLog(@"Got uninstall tracking push from Appboy"); + } [[Appboy sharedInstance] registerApplication:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler]; NSLog(@"Application delegate method didReceiveRemoteNotification:fetchCompletionHandler: is called with user info: %@", userInfo); } @@ -118,4 +121,10 @@ - (BOOL) application:(UIApplication *)application handleOpenURL:(NSURL *)url { [deepLinkAlert release]; return YES; } + +- (void) application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply { + NSLog(@"%@",userInfo); + [[Appboy sharedInstance] handleWatchKitExtensionRequest:userInfo reply:reply]; +} + @end diff --git a/Example/Stopwatch/SocialNetworkViewController.h b/Example/Stopwatch/FacebookViewController.h similarity index 89% rename from Example/Stopwatch/SocialNetworkViewController.h rename to Example/Stopwatch/FacebookViewController.h index 6080b7376..c10fe7ba1 100644 --- a/Example/Stopwatch/SocialNetworkViewController.h +++ b/Example/Stopwatch/FacebookViewController.h @@ -1,6 +1,6 @@ #import -@interface SocialNetworkViewController : UIViewController +@interface FacebookViewController : UIViewController @property (retain, nonatomic) IBOutlet UITextView *facebookDataTextView; @property (retain, nonatomic) NSDictionary *facebookUserProfile; diff --git a/Example/Stopwatch/SocialNetworkViewController.m b/Example/Stopwatch/FacebookViewController.m similarity index 98% rename from Example/Stopwatch/SocialNetworkViewController.m rename to Example/Stopwatch/FacebookViewController.m index e38c0ef3b..6b2a62c62 100644 --- a/Example/Stopwatch/SocialNetworkViewController.m +++ b/Example/Stopwatch/FacebookViewController.m @@ -1,4 +1,4 @@ -#import "SocialNetworkViewController.h" +#import "FacebookViewController.h" #import #import #import "AppboyKit.h" @@ -8,7 +8,7 @@ static NSString *const FacebookLikesEndpointUrl = @"https://graph.facebook.com/me/likes"; static NSString *const FacebookFriendsEndpointUrl = @"https://graph.facebook.com/me/friends"; -@implementation SocialNetworkViewController +@implementation FacebookViewController - (void)dealloc { [_facebookDataTextView release]; diff --git a/Example/Stopwatch/Images.xcassets/.DS_Store b/Example/Stopwatch/Images.xcassets/.DS_Store index efc3972bb..76d62da34 100644 Binary files a/Example/Stopwatch/Images.xcassets/.DS_Store and b/Example/Stopwatch/Images.xcassets/.DS_Store differ diff --git a/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Contents.json b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Contents.json index 48f2b3332..d8f01131c 100644 --- a/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Contents.json +++ b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -5,7 +5,7 @@ "idiom" : "iphone", "extent" : "full-screen", "minimum-system-version" : "7.0", - "filename" : "Default@2x.png", + "filename" : "Default@2x-1.png", "scale" : "2x" }, { @@ -22,6 +22,7 @@ "idiom" : "ipad", "extent" : "full-screen", "minimum-system-version" : "7.0", + "filename" : "Default@2x-1-1.png", "scale" : "1x" }, { @@ -29,6 +30,7 @@ "idiom" : "ipad", "extent" : "full-screen", "minimum-system-version" : "7.0", + "filename" : "Default@2x-1-1-1-1.png", "scale" : "1x" }, { @@ -36,6 +38,7 @@ "idiom" : "ipad", "extent" : "full-screen", "minimum-system-version" : "7.0", + "filename" : "Default@2x-1-1-1.png", "scale" : "2x" }, { @@ -43,13 +46,14 @@ "idiom" : "ipad", "extent" : "full-screen", "minimum-system-version" : "7.0", + "filename" : "Default@2x-1-1-1-1-1.png", "scale" : "2x" }, { "orientation" : "portrait", "idiom" : "iphone", "extent" : "full-screen", - "filename" : "Default.png", + "filename" : "Default-1.png", "scale" : "1x" }, { @@ -71,24 +75,28 @@ "orientation" : "portrait", "idiom" : "ipad", "extent" : "to-status-bar", + "filename" : "Default.png", "scale" : "1x" }, { "orientation" : "landscape", "idiom" : "ipad", "extent" : "to-status-bar", + "filename" : "Default-2-1.png", "scale" : "1x" }, { "orientation" : "portrait", "idiom" : "ipad", "extent" : "to-status-bar", + "filename" : "Default-2.png", "scale" : "2x" }, { "orientation" : "landscape", "idiom" : "ipad", "extent" : "to-status-bar", + "filename" : "Default-2-1-1.png", "scale" : "2x" } ], diff --git a/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default-1.png b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default-1.png new file mode 100644 index 000000000..fbb1ff795 Binary files /dev/null and b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default-1.png differ diff --git a/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default-2-1-1.png b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default-2-1-1.png new file mode 100644 index 000000000..fbb1ff795 Binary files /dev/null and b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default-2-1-1.png differ diff --git a/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default-2-1.png b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default-2-1.png new file mode 100644 index 000000000..fbb1ff795 Binary files /dev/null and b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default-2-1.png differ diff --git a/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default-2.png b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default-2.png new file mode 100644 index 000000000..fbb1ff795 Binary files /dev/null and b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default-2.png differ diff --git a/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default@2x-1-1-1-1-1.png b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default@2x-1-1-1-1-1.png new file mode 100644 index 000000000..a9c9b18d9 Binary files /dev/null and b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default@2x-1-1-1-1-1.png differ diff --git a/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default@2x-1-1-1-1.png b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default@2x-1-1-1-1.png new file mode 100644 index 000000000..a9c9b18d9 Binary files /dev/null and b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default@2x-1-1-1-1.png differ diff --git a/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default@2x-1-1-1.png b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default@2x-1-1-1.png new file mode 100644 index 000000000..a9c9b18d9 Binary files /dev/null and b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default@2x-1-1-1.png differ diff --git a/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default@2x-1-1.png b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default@2x-1-1.png new file mode 100644 index 000000000..a9c9b18d9 Binary files /dev/null and b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default@2x-1-1.png differ diff --git a/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default@2x-1.png b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default@2x-1.png new file mode 100644 index 000000000..a9c9b18d9 Binary files /dev/null and b/Example/Stopwatch/Images.xcassets/LaunchImage.launchimage/Default@2x-1.png differ diff --git a/Example/Stopwatch/InAppMessageUIViewController.m b/Example/Stopwatch/InAppMessageUIViewController.m index 6eb3ea74d..c84d95f52 100644 --- a/Example/Stopwatch/InAppMessageUIViewController.m +++ b/Example/Stopwatch/InAppMessageUIViewController.m @@ -81,7 +81,7 @@ - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:( [(SegmentCell *) cell setUpWithItem:item]; if (self.inAppMessageDictionary[item]) { ((SegmentCell *) cell).segmentControl.selectedSegmentIndex = [self.inAppMessageDictionary[item] integerValue]; - } else { + } else if (((SegmentCell *)cell).titleLabel != nil) { self.inAppMessageDictionary[((SegmentCell *)cell).titleLabel.text] = [NSNumber numberWithInteger:0]; } } else if ([item isEqualToString:ItemMessage] || diff --git a/Example/Stopwatch/InitialViewController.m b/Example/Stopwatch/InitialViewController.m index dab08cfd1..b535753fd 100755 --- a/Example/Stopwatch/InitialViewController.m +++ b/Example/Stopwatch/InitialViewController.m @@ -1,12 +1,11 @@ #import "InitialViewController.h" +#import "ABKLocationManager.h" @interface InitialViewController () - @property (retain, nonatomic) Clock *clock; @property (retain, nonatomic) UIPopoverController *contactUsPopoverController; @property (retain, nonatomic) UIPopoverController *latestNewsPopoverController; @property (retain, nonatomic) UIPopoverController *newsAndFeedbackPopoverController; - @property (retain, nonatomic) CLLocationManager *locationManager; @end @@ -15,6 +14,7 @@ @implementation InitialViewController - (void) viewDidLoad { [super viewDidLoad]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(timeUpdated:) name:TimeUpdatedNotification object:nil]; self.clock = [[[Clock alloc] init] autorelease]; [self.clock reset]; @@ -38,11 +38,40 @@ - (void) viewDidLoad { UIBarButtonItem *feedbackBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Appboy.Stopwatch.initial-view.feedback", nil) style:UIBarButtonItemStyleBordered target:self action:@selector(openFeedbackFromNavigationFeed:)] autorelease]; feedViewController.navigationItem.rightBarButtonItem = feedbackBarButtonItem; + [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(startLocationUpdates) + selector:@selector(requestLocationAuthorization) name:UIApplicationWillEnterForegroundNotification object:nil]; + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(saveFirstNewsFeedToWatch) + name:ABKFeedUpdatedNotification + object:nil]; +} + +// This method will find the first card with title and text body from Appboy SDK, and save the card's +// title and text body in the shared container so the Stopwatch watch app can pull out and display the +// data. +- (void) saveFirstNewsFeedToWatch { + if ([UIDevice currentDevice].systemVersion.intValue >= 7) { + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.appboy.stopwatch"]; + for (ABKCard *card in [[Appboy sharedInstance].feedController getCardsInCategories:ABKCardCategoryAll]) { + if ([card isKindOfClass:[ABKCaptionedImageCard class]] || [card isKindOfClass:[ABKTextAnnouncementCard class]] || + [card isKindOfClass:[ABKClassicCard class]]) { + [defaults setObject:@{@"news-title" : [card title], @"news-body" : [card cardDescription]} forKey:@"AppboyFirstNews"]; + [defaults synchronize]; + break; + } + } + + [defaults release]; + } +} + +- (void)requestLocationAuthorization { + [[Appboy sharedInstance].locationManager allowRequestAlwaysPermission]; } // newsAndFeedback Section @@ -354,6 +383,7 @@ - (void) dealloc { [_twitterButton release]; [_newsAndFeedbackButton release]; [_newsAndFeedbackNavigationController release]; + [_locationManager release]; [super dealloc]; } @@ -364,49 +394,4 @@ - (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterf return toInterfaceOrientation == UIInterfaceOrientationPortrait; } } - -// check user location - -- (void)startLocationUpdates { - // Create the location manager if this object does not - // already have one. - if (self.locationManager == nil) { - CLLocationManager *locationManager = [[CLLocationManager alloc] init]; - self.locationManager = locationManager; - [locationManager release]; - } - - self.locationManager.delegate = self; - self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer; - - // Set a movement threshold for new events. - self.locationManager.distanceFilter = 500; // meters - - if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { - [self.locationManager requestWhenInUseAuthorization]; - } - [self.locationManager startUpdatingLocation]; -} - -#pragma location manager delegate method -- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { - // test that the horizontal accuracy does not indicate an invalid measurement - if (newLocation.horizontalAccuracy < 0) return; - // test the age of the location measurement to determine if the measurement is cached - // in most cases you will not want to rely on cached measurements - NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow]; - if (locationAge > 5.0) return; -} - -- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { - // The location "unknown" error simply means the manager is currently unable to get the location. - if ([error code] != kCLErrorLocationUnknown) { - [self stopUpdatingLocation]; - } -} - -- (void)stopUpdatingLocation { - [self.locationManager stopUpdatingLocation]; - self.locationManager.delegate = nil; -} @end diff --git a/Example/Stopwatch/Stopwatch-Info.plist b/Example/Stopwatch/Stopwatch-Info.plist index 94fc88236..a1739bf9f 100644 --- a/Example/Stopwatch/Stopwatch-Info.plist +++ b/Example/Stopwatch/Stopwatch-Info.plist @@ -20,7 +20,7 @@ CFBundleIcons~ipad CFBundleIdentifier - com.appboy.stopwatch.production + com.appboy.stopwatch CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -28,7 +28,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 2.12.2 + 2.13.0 CFBundleSignature ???? CFBundleURLTypes @@ -45,12 +45,12 @@ CFBundleVersion - 1 + 2 FacebookAppID 631617900200059 LSRequiresIPhoneOS - NSLocationWhenInUseUsageDescription + NSLocationAlwaysUsageDescription Please share your location. UIBackgroundModes diff --git a/Example/Stopwatch/Stopwatch.entitlements b/Example/Stopwatch/Stopwatch.entitlements new file mode 100644 index 000000000..75ed96828 --- /dev/null +++ b/Example/Stopwatch/Stopwatch.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.com.appboy.stopwatch + + + diff --git a/Example/Stopwatch/TwitterViewController.h b/Example/Stopwatch/TwitterViewController.h new file mode 100644 index 000000000..996bc5ae4 --- /dev/null +++ b/Example/Stopwatch/TwitterViewController.h @@ -0,0 +1,18 @@ +#import + +@interface TwitterViewController : UIViewController + +@property (retain, nonatomic) IBOutlet UITextView *twitterDataTextView; +@property (nonatomic, copy) NSString* userDescription; +@property (nonatomic, copy) NSString* twitterName; +@property (nonatomic, copy) NSString* profileImageUrl; +@property (nonatomic, copy) NSString* screenName; +@property (nonatomic, assign) NSInteger followersCount; +@property (nonatomic, assign) NSInteger friendsCount; +@property (nonatomic, assign) NSInteger statusesCount; +@property (nonatomic, assign) NSInteger twitterID; + +// This method will prompt the user for permission to use twitter account data from iOS system. +- (IBAction)fetchTwitterAccountData:(id)sender; +- (IBAction)passTwitterDataToAppboy:(id)sender; +@end diff --git a/Example/Stopwatch/TwitterViewController.m b/Example/Stopwatch/TwitterViewController.m new file mode 100644 index 000000000..96416c819 --- /dev/null +++ b/Example/Stopwatch/TwitterViewController.m @@ -0,0 +1,121 @@ +#import "TwitterViewController.h" +#import +#import +#import "AppboyKit.h" + +static NSString *const TwitterAccountDescriptionKey = @"description"; +static NSString *const TwitterAccountFollowersKey = @"followers_count"; +static NSString *const TwitterAccountFollowingKey = @"friends_count"; +static NSString *const TwitterAccountNumTweetsKey = @"statuses_count"; +static NSString *const TwitterAccountUserIdKey = @"id"; +static NSString *const TwitterAccountNameKey = @"name"; +static NSString *const TwitterAccountImageUrlKey = @"profile_image_url"; +static NSString *const TwitterAccountTwitterHandleKey = @"screen_name"; +static NSString *const TwitterUserLookupEndpointUrl = @"https://api.twitter.com/1.1/users/lookup.json"; + +@implementation TwitterViewController + +- (void)dealloc { + [_twitterDataTextView release]; + [super dealloc]; +} + +/* + * This method prompts user to connect the Facebook acount on the device, and fetch account data. + * It can only fetch the Facebook data when: + * The plist has Facebook ID set up. + * There is at least one Facebook account signed in on the device. + * + * If the user has grants permissions, the method will send three requests to fetch user's profile data, + * friends, and likes, and store them in the properties. + * You can use this method as a replacement of + * [[Appboy sharedInstance] promptUserForAccessToSocialNetwork:ABKSocialNetworkFacebook]. + * + * After getting all the user's Facebook data, you can pass the information to Appboy using + * method "- (IBAction)passFacebookDataToAppboy:(id)sender"; + */ +- (void) promptUserToConnectTwitterAccountOnDeviceAndFetchAccountData { + // First, we need to obtain the account instance for the user's Twitter account + ACAccountStore *store = [[ACAccountStore alloc] init]; + ACAccountType *twitterAccountType = [store accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierTwitter]; + + // Request permission from the user to access the available Twitter accounts + [store requestAccessToAccountsWithType:twitterAccountType options:nil completion:^(BOOL granted, NSError *error) { + if (error) { + NSLog(@"Error returned from Twitter access request: %@", error); + } + if (!granted) { + NSLog(@"No Twitter account connected to the device, or user rejected the request."); + } else { + ACAccount *account = nil; + NSArray *twitterAccounts = [store accountsWithAccountType:twitterAccountType]; + if ([twitterAccounts count] > 0) { + // Use the first account for simplicity + // TODO (jon) Get other accounts if they're available. + account = [twitterAccounts objectAtIndex:0]; + } + + if (account != nil) { + NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:@"0", @"include_entities", account.username, @"screen_name", nil]; + // Build the request with our parameter + NSURL *url = [NSURL URLWithString:TwitterUserLookupEndpointUrl]; + id request = [SLRequest requestForServiceType:SLServiceTypeTwitter requestMethod:SLRequestMethodGET URL:url parameters:params]; + + if (request != nil) { + // Attach the account object to this request + [request setAccount:account]; + [request performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { + // If we don't have any data, see what the error was + if (!responseData) { + NSLog(@"No data came back from Twitter. Error is: %@", error); + } else { + NSError *jsonError; + id result = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&jsonError]; + // Log the response or error from Twitter + + if (result) { + dispatch_async(dispatch_get_main_queue(), ^{ + // The block is called in the background thread, so here we need to make sure to update the UI in the main thread. + self.twitterDataTextView.text = [result description]; + }); + if ([result isKindOfClass:[NSArray class]] && ![result isEmpty]) { + NSDictionary *twitter = result[0]; + self.userDescription = twitter[TwitterAccountDescriptionKey]; + self.twitterName = twitter[TwitterAccountNameKey]; + self.profileImageUrl = twitter[TwitterAccountImageUrlKey]; + self.friendsCount = [twitter[TwitterAccountFollowingKey] integerValue]; + self.followersCount = [twitter[TwitterAccountFollowersKey] integerValue]; + self.screenName = twitter[TwitterAccountTwitterHandleKey]; + self.statusesCount = [twitter[TwitterAccountNumTweetsKey] integerValue]; + self.twitterID = [twitter[TwitterAccountUserIdKey] integerValue]; + } + } else { + self.twitterDataTextView.text = [jsonError description]; + } + } + }]; + } + } + } + [store release]; + }]; +} + +- (IBAction)fetchTwitterAccountData:(id)sender { + [self promptUserToConnectTwitterAccountOnDeviceAndFetchAccountData]; +} + +// Pass the user's Twitter data to Appboy +- (IBAction)passTwitterDataToAppboy:(id)sender { + ABKTwitterUser *twitterUser = [[[ABKTwitterUser alloc] init] autorelease]; + twitterUser.userDescription = self.userDescription; + twitterUser.twitterID = self.twitterID; + twitterUser.twitterName = self.twitterName; + twitterUser.profileImageUrl = self.profileImageUrl; + twitterUser.friendsCount = self.friendsCount; + twitterUser.followersCount = self.followersCount; + twitterUser.screenName = self.screenName; + twitterUser.statusesCount = self.statusesCount; + [Appboy sharedInstance].user.twitterUser = twitterUser; +} +@end diff --git a/Example/Stopwatch/en.lproj/MainStoryboard_iPad.storyboard b/Example/Stopwatch/en.lproj/MainStoryboard_iPad.storyboard index 41dcc69c9..de9df36e8 100644 --- a/Example/Stopwatch/en.lproj/MainStoryboard_iPad.storyboard +++ b/Example/Stopwatch/en.lproj/MainStoryboard_iPad.storyboard @@ -1,8 +1,8 @@ - + - + @@ -251,7 +251,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Stopwatch/en.lproj/MainStoryboard_iPhone.storyboard b/Example/Stopwatch/en.lproj/MainStoryboard_iPhone.storyboard index 00a104db0..a05de31b6 100755 --- a/Example/Stopwatch/en.lproj/MainStoryboard_iPhone.storyboard +++ b/Example/Stopwatch/en.lproj/MainStoryboard_iPhone.storyboard @@ -1,8 +1,8 @@ - + - + @@ -154,6 +154,43 @@ + + + + + + + + + + + + + + + + + + + @@ -355,7 +392,7 @@ - + + + + + + + + + + + + + + + + + + + + + @@ -558,7 +643,7 @@ - + diff --git a/Example/StopwatchDevelop WatchKit App/.DS_Store b/Example/StopwatchDevelop WatchKit App/.DS_Store new file mode 100644 index 000000000..d7f529685 Binary files /dev/null and b/Example/StopwatchDevelop WatchKit App/.DS_Store differ diff --git a/Example/StopwatchDevelop WatchKit App/Base.lproj/Interface.storyboard b/Example/StopwatchDevelop WatchKit App/Base.lproj/Interface.storyboard new file mode 100644 index 000000000..5f3ad5d6f --- /dev/null +++ b/Example/StopwatchDevelop WatchKit App/Base.lproj/Interface.storyboard @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AppboyKit/.DS_Store b/Example/StopwatchDevelop WatchKit App/Images.xcassets/.DS_Store similarity index 91% rename from AppboyKit/.DS_Store rename to Example/StopwatchDevelop WatchKit App/Images.xcassets/.DS_Store index e25107e2f..782d4befb 100644 Binary files a/AppboyKit/.DS_Store and b/Example/StopwatchDevelop WatchKit App/Images.xcassets/.DS_Store differ diff --git a/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/Contents.json b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/Contents.json new file mode 100644 index 000000000..665db6739 --- /dev/null +++ b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/Contents.json @@ -0,0 +1,70 @@ +{ + "images" : [ + { + "size" : "24x24", + "idiom" : "watch", + "scale" : "2x", + "filename" : "stopwatch-icon-48.png", + "role" : "notificationCenter", + "subtype" : "38mm" + }, + { + "size" : "27.5x27.5", + "idiom" : "watch", + "scale" : "2x", + "filename" : "stopwatch-icon-55.png", + "role" : "notificationCenter", + "subtype" : "42mm" + }, + { + "size" : "29x29", + "idiom" : "watch", + "filename" : "stopwatch-icon-58.png", + "role" : "companionSettings", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "watch", + "filename" : "stopwatch-icon-87.png", + "role" : "companionSettings", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "watch", + "scale" : "2x", + "filename" : "stopwatch-icon-80.png", + "role" : "appLauncher", + "subtype" : "38mm" + }, + { + "size" : "44x44", + "idiom" : "watch", + "scale" : "2x", + "filename" : "stopwatch-icon-88.png", + "role" : "longLook", + "subtype" : "42mm" + }, + { + "size" : "86x86", + "idiom" : "watch", + "scale" : "2x", + "filename" : "stopwatch-icon-172.png", + "role" : "quickLook", + "subtype" : "38mm" + }, + { + "size" : "98x98", + "idiom" : "watch", + "scale" : "2x", + "filename" : "stopwatch-icon-196.png", + "role" : "quickLook", + "subtype" : "42mm" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-172.png b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-172.png new file mode 100644 index 000000000..864ef6731 Binary files /dev/null and b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-172.png differ diff --git a/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-196.png b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-196.png new file mode 100644 index 000000000..e2bf9eaf4 Binary files /dev/null and b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-196.png differ diff --git a/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-48.png b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-48.png new file mode 100644 index 000000000..e370b4694 Binary files /dev/null and b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-48.png differ diff --git a/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-55.png b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-55.png new file mode 100644 index 000000000..b727aaaaf Binary files /dev/null and b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-55.png differ diff --git a/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-58.png b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-58.png new file mode 100644 index 000000000..ea0bc1e6d Binary files /dev/null and b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-58.png differ diff --git a/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-80.png b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-80.png new file mode 100644 index 000000000..6103cf368 Binary files /dev/null and b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-80.png differ diff --git a/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-87.png b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-87.png new file mode 100644 index 000000000..a891c3e15 Binary files /dev/null and b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-87.png differ diff --git a/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-88.png b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-88.png new file mode 100644 index 000000000..7594ed768 Binary files /dev/null and b/Example/StopwatchDevelop WatchKit App/Images.xcassets/WatchAppIcon.appiconset/stopwatch-icon-88.png differ diff --git a/Example/StopwatchDevelop WatchKit App/Info.plist b/Example/StopwatchDevelop WatchKit App/Info.plist new file mode 100644 index 000000000..cd5351443 --- /dev/null +++ b/Example/StopwatchDevelop WatchKit App/Info.plist @@ -0,0 +1,39 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + StopwatchDevelop + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFiles + + WatchAppIcon + + CFBundleIdentifier + com.appboy.stopwatch.watchkitapp + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 2.13.0 + CFBundleSignature + ???? + CFBundleVersion + 2 + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + WKCompanionAppBundleIdentifier + com.appboy.stopwatch + WKWatchKitApp + + + diff --git a/Example/StopwatchDevelop WatchKit Extension/AppboyInterfaceController.h b/Example/StopwatchDevelop WatchKit Extension/AppboyInterfaceController.h new file mode 100644 index 000000000..e566e206d --- /dev/null +++ b/Example/StopwatchDevelop WatchKit Extension/AppboyInterfaceController.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppboyInterfaceController : WKInterfaceController + +@end diff --git a/Example/StopwatchDevelop WatchKit Extension/AppboyInterfaceController.m b/Example/StopwatchDevelop WatchKit Extension/AppboyInterfaceController.m new file mode 100644 index 000000000..cac87f141 --- /dev/null +++ b/Example/StopwatchDevelop WatchKit Extension/AppboyInterfaceController.m @@ -0,0 +1,61 @@ +#import "AppboyInterfaceController.h" +#import "AppboyWatchKit.h" +#import "ABWKUser.h" + +@implementation AppboyInterfaceController + +// Test all the Appboy WatchKit SDK feature in one click! +- (IBAction)testAll:(id)sender { + [ABWKUser setFirstName:@"First Name"]; + [ABWKUser setLastName:@"Last Name"]; + [ABWKUser setEmail:@"stopwatch@appboy.com"]; + [ABWKUser setDateOfBirth:[NSDate date]]; + [ABWKUser setCountry:@"USA"]; + [ABWKUser setHomeCity:@"New York City"]; + [ABWKUser setBio:@"Appboy"]; + [ABWKUser setPhone:@"1234567890"]; + [ABWKUser setAvatarImageURL:@"https://github.com/Appboy/appboy-ios-sdk/blob/master/Appboy_Logo_Smiley_Red-01.png?raw=true"]; + [ABWKUser setCustomAttributeWithKey:@"Bool Attribute" andBOOLValue:YES]; + [ABWKUser setCustomAttributeWithKey:@"Date Attribute" andDateValue:[NSDate date]]; + [ABWKUser setCustomAttributeWithKey:@"Double Attribute" andDoubleValue:3.14159]; + [ABWKUser setCustomAttributeWithKey:@"Integer Attribute" andIntegerValue:21]; + [ABWKUser setCustomAttributeWithKey:@"String Attribute" andStringValue:@"www.appboy.com"]; + [ABWKUser setCustomAttributeWithKey:@"Unset String Attribute" andStringValue:@"Unset Attribute"]; + [ABWKUser unsetCustomAttributeWithKey:@"Unset String Attribute"]; + [ABWKUser incrementCustomUserAttribute:@"Increment Attribute" by:7]; + [ABWKUser setCustomAttributeArrayWithKey:@"Candy" array:@[@"Cracker Jack", @"Haribo", @"Jelly Belly", @"Heinz"]]; + [ABWKUser addToCustomAttributeArrayWithKey:@"Candy" value:@"Mars"]; + [ABWKUser removeFromCustomAttributeArrayWithKey:@"Candy" value:@"Heinz"]; + [ABWKUser setLastKnownLocationWithLatitude:40.6892 longitude:-74.0444 horizontalAccuracy:0.0001 altitude:92.99 verticalAccuracy:0.01]; + [AppboyWatchKit logCustomEvent:@"Test All Custom Event" withProperties:@{@"custom key" : @"custom value"}]; + [AppboyWatchKit logPurchase:@"watch purchase" inCurrency:@"USD" + atPrice:[NSDecimalNumber decimalNumberWithString:@"1.99"] + withQuantity:2 + andProperties:@{@"purchase key" : @"purchase value"}]; + [AppboyWatchKit submitFeedback:@"watch@appboy.com" message:@"Feedback from watch." isReportingABug:NO]; +} + +- (IBAction)logCustomEvent { + [AppboyWatchKit logCustomEvent:@"watch custom event"]; +} + +- (IBAction)logPurchase { + [AppboyWatchKit logPurchase:@"watch purchase" inCurrency:@"USD" atPrice:[NSDecimalNumber decimalNumberWithString:@"0.99"]]; +} + +- (IBAction)logCustomAttribute { + [ABWKUser setCustomAttributeWithKey:@"watch bool custom attribute" andBOOLValue:YES]; +} + +- (IBAction)logCustomAttributeArray { + [ABWKUser setCustomAttributeArrayWithKey:@"watch custom array" array:@[@"string1", @"string2"]]; +} + +- (IBAction)logCustomIncrement { + [ABWKUser incrementCustomUserAttribute:@"watch increment attribute"]; +} + +@end + + + diff --git a/Example/StopwatchDevelop WatchKit Extension/GlanceController.h b/Example/StopwatchDevelop WatchKit Extension/GlanceController.h new file mode 100644 index 000000000..818490fb3 --- /dev/null +++ b/Example/StopwatchDevelop WatchKit Extension/GlanceController.h @@ -0,0 +1,6 @@ +#import +#import + +@interface GlanceController : WKInterfaceController + +@end diff --git a/Example/StopwatchDevelop WatchKit Extension/GlanceController.m b/Example/StopwatchDevelop WatchKit Extension/GlanceController.m new file mode 100644 index 000000000..39b0b7000 --- /dev/null +++ b/Example/StopwatchDevelop WatchKit Extension/GlanceController.m @@ -0,0 +1,27 @@ + #import "GlanceController.h" + + +@interface GlanceController() + +@end + + +@implementation GlanceController + +- (void)awakeWithContext:(id)context { + [super awakeWithContext:context]; + + // Configure interface objects here. +} + +- (void)willActivate { + // This method is called when watch view controller is about to be visible to user + [super willActivate]; +} + +- (void)didDeactivate { + // This method is called when watch view controller is no longer visible + [super didDeactivate]; +} + +@end diff --git a/Example/StopwatchDevelop WatchKit Extension/Images.xcassets/README__ignoredByTemplate__ b/Example/StopwatchDevelop WatchKit Extension/Images.xcassets/README__ignoredByTemplate__ new file mode 100644 index 000000000..b601d3834 --- /dev/null +++ b/Example/StopwatchDevelop WatchKit Extension/Images.xcassets/README__ignoredByTemplate__ @@ -0,0 +1 @@ +Did you know that git does not support storing empty directories? diff --git a/Example/StopwatchDevelop WatchKit Extension/Info.plist b/Example/StopwatchDevelop WatchKit Extension/Info.plist new file mode 100644 index 000000000..bf6f720d6 --- /dev/null +++ b/Example/StopwatchDevelop WatchKit Extension/Info.plist @@ -0,0 +1,40 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + StopwatchDevelop WatchKit Extension + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.appboy.stopwatch.watchkitextension + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + 2.13.0 + CFBundleSignature + ???? + CFBundleVersion + 2 + MinimunOSVersion + 8.2 + NSExtension + + NSExtensionAttributes + + WKAppBundleIdentifier + com.appboy.stopwatch.watchkitapp + + NSExtensionPointIdentifier + com.apple.watchkit + + RemoteInterfacePrincipalClass + InterfaceController + + diff --git a/Example/StopwatchDevelop WatchKit Extension/InterfaceController.h b/Example/StopwatchDevelop WatchKit Extension/InterfaceController.h new file mode 100644 index 000000000..44ba957eb --- /dev/null +++ b/Example/StopwatchDevelop WatchKit Extension/InterfaceController.h @@ -0,0 +1,5 @@ +#import +#import + +@interface InterfaceController : WKInterfaceController +@end diff --git a/Example/StopwatchDevelop WatchKit Extension/InterfaceController.m b/Example/StopwatchDevelop WatchKit Extension/InterfaceController.m new file mode 100644 index 000000000..8be4509ed --- /dev/null +++ b/Example/StopwatchDevelop WatchKit Extension/InterfaceController.m @@ -0,0 +1,40 @@ +#import "InterfaceController.h" +#import "AppboyWatchKit.h" + +@interface InterfaceController () +@property (weak, nonatomic) IBOutlet WKInterfaceTimer *timer; +@property (weak, nonatomic) IBOutlet WKInterfaceButton *startStopButton; +@property (nonatomic) BOOL timerIsRunning; +@end + +@implementation InterfaceController + +- (IBAction) resetButtonTapped { + if (self.timerIsRunning) { + self.timerIsRunning = NO; + [self.timer stop]; + } + [self.timer setDate:[NSDate date]]; +} + +- (IBAction) startButtonTapped { + if (self.timerIsRunning) { + [self.timer stop]; + [self.startStopButton setTitle:@"Start"]; + [AppboyWatchKit logCustomEvent:@"Watch_Timer_Stop"]; + } else { + // Here we need to set the timer again to make sure it starts from 0. + [self.timer setDate:[NSDate date]]; + [self.timer start]; + [self.startStopButton setTitle:@"Stop"]; + [AppboyWatchKit logCustomEvent:@"Watch_Timer_Begin"]; + } + self.timerIsRunning = !self.timerIsRunning; +} + +- (void)handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)remoteNotification { + // Log a remote notification push open on the watch to Appboy. + [AppboyWatchKit logActionWithIdentifier:identifier forRemoteNotification:remoteNotification]; +} + +@end diff --git a/Example/StopwatchDevelop WatchKit Extension/NewsInterfaceController.h b/Example/StopwatchDevelop WatchKit Extension/NewsInterfaceController.h new file mode 100644 index 000000000..bf9973735 --- /dev/null +++ b/Example/StopwatchDevelop WatchKit Extension/NewsInterfaceController.h @@ -0,0 +1,6 @@ +#import +#import + +@interface NewsInterfaceController : WKInterfaceController + +@end diff --git a/Example/StopwatchDevelop WatchKit Extension/NewsInterfaceController.m b/Example/StopwatchDevelop WatchKit Extension/NewsInterfaceController.m new file mode 100644 index 000000000..8875f3ee9 --- /dev/null +++ b/Example/StopwatchDevelop WatchKit Extension/NewsInterfaceController.m @@ -0,0 +1,23 @@ +#import "NewsInterfaceController.h" + +static NSString *const StopwatchSuiteName = @"group.com.appboy.stopwatch"; + +@interface NewsInterfaceController () +@property (weak, nonatomic) IBOutlet WKInterfaceLabel *newsBodyLabel; +@property (weak, nonatomic) IBOutlet WKInterfaceLabel *newsTitleLabel; + +@end + +@implementation NewsInterfaceController + +- (void)willActivate { + [super willActivate]; + NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:StopwatchSuiteName]; + id card = [defaults objectForKey:@"AppboyFirstNews"]; + if (card) { + self.newsTitleLabel.text = card[@"news-title"]; + self.newsBodyLabel.text = card[@"news-body"]; + } +} + +@end diff --git a/Example/StopwatchDevelop WatchKit Extension/NotificationController.h b/Example/StopwatchDevelop WatchKit Extension/NotificationController.h new file mode 100644 index 000000000..64950dab1 --- /dev/null +++ b/Example/StopwatchDevelop WatchKit Extension/NotificationController.h @@ -0,0 +1,6 @@ +#import +#import + +@interface NotificationController : WKUserNotificationInterfaceController + +@end diff --git a/Example/StopwatchDevelop WatchKit Extension/NotificationController.m b/Example/StopwatchDevelop WatchKit Extension/NotificationController.m new file mode 100644 index 000000000..9e7816aac --- /dev/null +++ b/Example/StopwatchDevelop WatchKit Extension/NotificationController.m @@ -0,0 +1,35 @@ + +#import "NotificationController.h" + + +@interface NotificationController() + +@end + + +@implementation NotificationController + +- (instancetype)init { + self = [super init]; + if (self){ + } + return self; +} + +- (void)willActivate { + [super willActivate]; +} + +- (void)didDeactivate { + [super didDeactivate]; +} + +- (void)didReceiveRemoteNotification:(NSDictionary *)remoteNotification withCompletion:(void (^)(WKUserNotificationInterfaceType))completionHandler { + NSLog(@"remote notification going to be presented on watch: %@", remoteNotification); + completionHandler(WKUserNotificationInterfaceTypeDefault); +} + +@end + + + diff --git a/Example/StopwatchDevelop WatchKit Extension/PushNotificationPayload.apns b/Example/StopwatchDevelop WatchKit Extension/PushNotificationPayload.apns new file mode 100644 index 000000000..e793a02b3 --- /dev/null +++ b/Example/StopwatchDevelop WatchKit Extension/PushNotificationPayload.apns @@ -0,0 +1,18 @@ +{ + "aps": { + "alert": { + "body": "Test message", + "title": "Optional title" + }, + "category": "myCategory" + }, + + "WatchKit Simulator Actions": [ + { + "title": "First Button", + "identifier": "firstButtonAction" + } + ], + + "customKey": "Use this file to define a testing payload for your notifications. The aps dictionary specifies the category, alert text and title. The WatchKit Simulator Actions array can provide info for one or more action buttons in addition to the standard Dismiss button. Any other top level keys are custom payload. If you have multiple such JSON files in your project, you'll be able to select them when choosing to debug the notification interface of your Watch App." +} diff --git a/Example/StopwatchDevelop WatchKit Extension/StopwatchDevelop WatchKit Extension.entitlements b/Example/StopwatchDevelop WatchKit Extension/StopwatchDevelop WatchKit Extension.entitlements new file mode 100644 index 000000000..75ed96828 --- /dev/null +++ b/Example/StopwatchDevelop WatchKit Extension/StopwatchDevelop WatchKit Extension.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.application-groups + + group.com.appboy.stopwatch + + +