A future improvement could be to store the usage data in the encrypted
database than in the NSUserDefaults that are more vulnerable to
forensics.
pull/1/head
Frederic Jacobs 9 years ago
parent 0c1a97a743
commit a7ec383a7b

@ -0,0 +1,172 @@
//
// iRate.h
//
// Version 1.11.4
//
// Created by Nick Lockwood on 26/01/2011.
// Copyright 2011 Charcoal Design
//
// Distributed under the permissive zlib license
// Get the latest version from here:
//
// https://github.com/nicklockwood/iRate
//
// This software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source distribution.
//
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-missing-property-synthesis"
#import <Availability.h>
#undef weak_delegate
#if __has_feature(objc_arc_weak) && (TARGET_OS_IPHONE || __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_8)
#define weak_delegate weak
#else
#define weak_delegate unsafe_unretained
#endif
#import <TargetConditionals.h>
#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
#define IRATE_EXTERN UIKIT_EXTERN
#else
#import <Cocoa/Cocoa.h>
#define IRATE_EXTERN APPKIT_EXTERN
#endif
//! Project version number for iRate.
FOUNDATION_EXPORT double iRateVersionNumber;
//! Project version string for iRate.
FOUNDATION_EXPORT const unsigned char iRateVersionString[];
IRATE_EXTERN NSUInteger const iRateAppStoreGameGenreID;
IRATE_EXTERN NSString *const iRateErrorDomain;
// localisation string keys
IRATE_EXTERN NSString *const iRateMessageTitleKey; // iRateMessageTitle
IRATE_EXTERN NSString *const iRateAppMessageKey; // iRateAppMessage
IRATE_EXTERN NSString *const iRateGameMessageKey; // iRateGameMessage
IRATE_EXTERN NSString *const iRateUpdateMessageKey; // iRateUpdateMessage
IRATE_EXTERN NSString *const iRateCancelButtonKey; // iRateCancelButton
IRATE_EXTERN NSString *const iRateRemindButtonKey; // iRateRemindButton
IRATE_EXTERN NSString *const iRateRateButtonKey; // iRateRateButton
// notification keys
IRATE_EXTERN NSString *const iRateCouldNotConnectToAppStore;
IRATE_EXTERN NSString *const iRateDidDetectAppUpdate;
IRATE_EXTERN NSString *const iRateDidPromptForRating;
IRATE_EXTERN NSString *const iRateUserDidAttemptToRateApp;
IRATE_EXTERN NSString *const iRateUserDidDeclineToRateApp;
IRATE_EXTERN NSString *const iRateUserDidRequestReminderToRateApp;
IRATE_EXTERN NSString *const iRateDidOpenAppStore;
typedef NS_ENUM(NSUInteger, iRateErrorCode) {
iRateErrorBundleIdDoesNotMatchAppStore = 1,
iRateErrorApplicationNotFoundOnAppStore,
iRateErrorApplicationIsNotLatestVersion,
iRateErrorCouldNotOpenRatingPageURL
};
@protocol iRateDelegate <NSObject>
@optional
- (void)iRateCouldNotConnectToAppStore:(NSError *)error;
- (void)iRateDidDetectAppUpdate;
- (BOOL)iRateShouldPromptForRating;
- (void)iRateDidPromptForRating;
- (void)iRateUserDidAttemptToRateApp;
- (void)iRateUserDidDeclineToRateApp;
- (void)iRateUserDidRequestReminderToRateApp;
- (BOOL)iRateShouldOpenAppStore;
- (void)iRateDidOpenAppStore;
@end
@interface iRate : NSObject
+ (instancetype)sharedInstance;
// app store ID - this is only needed if your
// bundle ID is not unique between iOS and Mac app stores
@property (nonatomic, assign) NSUInteger appStoreID;
// application details - these are set automatically
@property (nonatomic, assign) NSUInteger appStoreGenreID;
@property (nonatomic, copy) NSString *appStoreCountry;
@property (nonatomic, copy) NSString *applicationName;
@property (nonatomic, copy) NSString *applicationVersion;
@property (nonatomic, copy) NSString *applicationBundleID;
// usage settings - these have sensible defaults
@property (nonatomic, assign) NSUInteger usesUntilPrompt;
@property (nonatomic, assign) NSUInteger eventsUntilPrompt;
@property (nonatomic, assign) float daysUntilPrompt;
@property (nonatomic, assign) float usesPerWeekForPrompt;
@property (nonatomic, assign) float remindPeriod;
// message text, you may wish to customise these
@property (nonatomic, copy) NSString *messageTitle;
@property (nonatomic, copy) NSString *message;
@property (nonatomic, copy) NSString *updateMessage;
@property (nonatomic, copy) NSString *cancelButtonLabel;
@property (nonatomic, copy) NSString *remindButtonLabel;
@property (nonatomic, copy) NSString *rateButtonLabel;
// debugging and prompt overrides
@property (nonatomic, assign) BOOL useUIAlertControllerIfAvailable;
@property (nonatomic, assign) BOOL useAllAvailableLanguages;
@property (nonatomic, assign) BOOL promptForNewVersionIfUserRated;
@property (nonatomic, assign) BOOL onlyPromptIfLatestVersion;
@property (nonatomic, assign) BOOL onlyPromptIfMainWindowIsAvailable;
@property (nonatomic, assign) BOOL promptAtLaunch;
@property (nonatomic, assign) BOOL verboseLogging;
@property (nonatomic, assign) BOOL previewMode;
// advanced properties for implementing custom behaviour
@property (nonatomic, strong) NSURL *ratingsURL;
@property (nonatomic, strong) NSDate *firstUsed;
@property (nonatomic, strong) NSDate *lastReminded;
@property (nonatomic, assign) NSUInteger usesCount;
@property (nonatomic, assign) NSUInteger eventCount;
@property (nonatomic, readonly) float usesPerWeek;
@property (nonatomic, assign) BOOL declinedThisVersion;
@property (nonatomic, readonly) BOOL declinedAnyVersion;
@property (nonatomic, assign) BOOL ratedThisVersion;
@property (nonatomic, readonly) BOOL ratedAnyVersion;
@property (nonatomic, weak_delegate) id<iRateDelegate> delegate;
// manually control behaviour
- (BOOL)shouldPromptForRating;
- (void)promptForRating;
- (void)promptIfNetworkAvailable;
- (void)promptIfAllCriteriaMet;
- (void)openRatingsPageInAppStore;
- (void)logEvent:(BOOL)deferPrompt;
@end
#pragma clang diagnostic pop

File diff suppressed because it is too large Load Diff

@ -7,7 +7,6 @@ pod 'OpenSSL', '~> 1.0.205'
pod 'PastelogKit', '~> 1.3'
pod 'FFCircularProgressView', '~> 0.5'
pod 'SCWaveformView', '~> 1.0'
pod 'iRate', '~> 1.11'
pod 'DJWActionSheet'
pod 'JSQMessagesViewController', :git => 'https://github.com/WhisperSystems/JSQMessagesViewController', :commit => 'e5582fef8a6b3e35f8070361ef37237222da712b'

@ -30,7 +30,6 @@ PODS:
- DJWActionSheet (1.0.4)
- FFCircularProgressView (0.5)
- HKDFKit (0.0.3)
- iRate (1.11.4)
- JSQMessagesViewController (7.1.0):
- JSQSystemSoundPlayer (~> 2.0.1)
- JSQSystemSoundPlayer (2.0.1)
@ -69,7 +68,6 @@ PODS:
DEPENDENCIES:
- DJWActionSheet
- FFCircularProgressView (~> 0.5)
- iRate (~> 1.11)
- JSQMessagesViewController (from `https://github.com/WhisperSystems/JSQMessagesViewController`,
commit `e5582fef8a6b3e35f8070361ef37237222da712b`)
- OpenSSL (~> 1.0.205)
@ -102,7 +100,6 @@ SPEC CHECKSUMS:
DJWActionSheet: 2fe54b1298a7f0fe44462233752c76a530e0cd80
FFCircularProgressView: 683a4ab1e1bd613246a3dffa61503ffdebcde8d8
HKDFKit: c058305d6f64b84f28c50bd7aa89574625bcb62a
iRate: 599ed07c854e0695f3c605d1b2a64c67d912acb7
JSQMessagesViewController: ca11f86fa68ca70835f05e169df9244147c1dc40
JSQSystemSoundPlayer: c5850e77a4363ffd374cd851154b9af93264ed8d
libPhoneNumber-iOS: 7bfd00f843fdcd82b5182b463e8eb3b27579f41d

@ -144,6 +144,7 @@
B10C9B601A7049EC00ECA2BF /* pause_icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = B10C9B5C1A7049EC00ECA2BF /* pause_icon@2x.png */; };
B10C9B611A7049EC00ECA2BF /* play_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = B10C9B5D1A7049EC00ECA2BF /* play_icon.png */; };
B10C9B621A7049EC00ECA2BF /* play_icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = B10C9B5E1A7049EC00ECA2BF /* play_icon@2x.png */; };
B609597C1C2C0FC6004E8797 /* iRate.m in Sources */ = {isa = PBXBuildFile; fileRef = B609597B1C2C0FC6004E8797 /* iRate.m */; };
B60C16651988999D00E97A6C /* VersionMigrations.m in Sources */ = {isa = PBXBuildFile; fileRef = B60C16641988999D00E97A6C /* VersionMigrations.m */; };
B60EDE041A05A01700D73516 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B60EDE031A05A01700D73516 /* AudioToolbox.framework */; };
B6258B331C29E2E60014138E /* NotificationsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B6258B321C29E2E60014138E /* NotificationsManager.m */; };
@ -207,7 +208,6 @@
B660F6DE1C29868000687D6E /* PriorityQueueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = B660F6B01C29868000687D6E /* PriorityQueueTest.m */; };
B660F6DF1C29868000687D6E /* QueueTest.m in Sources */ = {isa = PBXBuildFile; fileRef = B660F6B21C29868000687D6E /* QueueTest.m */; };
B660F6E01C29868000687D6E /* UtilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = B660F6B41C29868000687D6E /* UtilTest.m */; };
B660F6E91C29938A00687D6E /* libTwistedOakCollapsingFutures.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B660F6E81C29938A00687D6E /* libTwistedOakCollapsingFutures.a */; };
B660F7001C29988E00687D6E /* AppAudioManager.m in Sources */ = {isa = PBXBuildFile; fileRef = E197B62018BBF12700F073E5 /* AppAudioManager.m */; };
B660F7011C29988E00687D6E /* AudioRouter.m in Sources */ = {isa = PBXBuildFile; fileRef = E197B61D18BBEC6D00F073E5 /* AudioRouter.m */; };
B660F7021C29988E00687D6E /* AudioPacker.m in Sources */ = {isa = PBXBuildFile; fileRef = E197B5E918BBEC1A00F073E5 /* AudioPacker.m */; };
@ -738,6 +738,8 @@
B10C9B5D1A7049EC00ECA2BF /* play_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = play_icon.png; sourceTree = "<group>"; };
B10C9B5E1A7049EC00ECA2BF /* play_icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "play_icon@2x.png"; sourceTree = "<group>"; };
B60341CD1AA5469800A01E42 /* ja_JP */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja_JP; path = translations/ja_JP.lproj/Localizable.strings; sourceTree = "<group>"; };
B609597A1C2C0FC6004E8797 /* iRate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iRate.h; path = Libraries/iRate/iRate.h; sourceTree = SOURCE_ROOT; };
B609597B1C2C0FC6004E8797 /* iRate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = iRate.m; path = Libraries/iRate/iRate.m; sourceTree = SOURCE_ROOT; };
B60C16631988999D00E97A6C /* VersionMigrations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VersionMigrations.h; sourceTree = "<group>"; };
B60C16641988999D00E97A6C /* VersionMigrations.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VersionMigrations.m; sourceTree = "<group>"; };
B60EDE031A05A01700D73516 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
@ -830,8 +832,6 @@
B660F6B21C29868000687D6E /* QueueTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QueueTest.m; sourceTree = "<group>"; };
B660F6B31C29868000687D6E /* UtilTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UtilTest.h; sourceTree = "<group>"; };
B660F6B41C29868000687D6E /* UtilTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UtilTest.m; sourceTree = "<group>"; };
B660F6E11C29886700687D6E /* libTwistedOakCollapsingFutures.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libTwistedOakCollapsingFutures.a; path = "Pods/../build/Debug-iphoneos/libTwistedOakCollapsingFutures.a"; sourceTree = "<group>"; };
B660F6E81C29938A00687D6E /* libTwistedOakCollapsingFutures.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libTwistedOakCollapsingFutures.a; path = "Pods/../build/Debug-iphoneos/libTwistedOakCollapsingFutures.a"; sourceTree = "<group>"; };
B661C211198EE2EA00548CA1 /* iOSVersions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = iOSVersions.h; path = src/environment/iOSVersions.h; sourceTree = "<group>"; };
B66B9F701AEA6D1100E2E609 /* NotificationSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NotificationSettingsViewController.h; sourceTree = "<group>"; };
B66B9F711AEA6D1100E2E609 /* NotificationSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NotificationSettingsViewController.m; sourceTree = "<group>"; };
@ -1055,7 +1055,6 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
B660F6E91C29938A00687D6E /* libTwistedOakCollapsingFutures.a in Frameworks */,
B60EDE041A05A01700D73516 /* AudioToolbox.framework in Frameworks */,
B69CD25119773E79005CE69A /* XCTest.framework in Frameworks */,
E1368CBE18A1C36B00109378 /* MessageUI.framework in Frameworks */,
@ -1134,6 +1133,7 @@
70BAFD5C190584BE00FA5E0B /* NotificationTracker.m */,
76EB048818170B33006006FC /* phone */,
76EB04B118170B33006006FC /* profiling */,
B60959791C2C0FA9004E8797 /* rating */,
76EB04C818170B33006006FC /* util */,
76EB04FE18170B33006006FC /* view controllers */,
76EB052B18170B33006006FC /* views */,
@ -1648,6 +1648,15 @@
path = xibs;
sourceTree = "<group>";
};
B60959791C2C0FA9004E8797 /* rating */ = {
isa = PBXGroup;
children = (
B609597A1C2C0FC6004E8797 /* iRate.h */,
B609597B1C2C0FC6004E8797 /* iRate.m */,
);
name = rating;
sourceTree = "<group>";
};
B62D53F41A23CC8B009AAF82 /* TSMessageAdapters */ = {
isa = PBXGroup;
children = (
@ -1976,8 +1985,6 @@
D221A08C169C9E5E00537ABF /* Frameworks */ = {
isa = PBXGroup;
children = (
B660F6E81C29938A00687D6E /* libTwistedOakCollapsingFutures.a */,
B660F6E11C29886700687D6E /* libTwistedOakCollapsingFutures.a */,
B6B226961BE4B7D200860F4D /* ContactsUI.framework */,
B6FE7EB61ADD62FA00A6D22F /* PushKit.framework */,
FC3BD9871A30A790005B96BB /* Social.framework */,
@ -2654,6 +2661,7 @@
BFB074C919A5611000F2947C /* ObservableValue.m in Sources */,
B68EF9BA1C0B1EBD009C3DCD /* FLAnimatedImage.m in Sources */,
B68112EA1A4D9EC400BA82FF /* UIImage+normalizeImage.m in Sources */,
B609597C1C2C0FC6004E8797 /* iRate.m in Sources */,
FCB11D8A1A1284BB002F93FB /* SettingsTableViewCell.m in Sources */,
76EB05C818170B33006006FC /* HelloPacket.m in Sources */,
BFB074C719A5611000F2947C /* FutureUtil.m in Sources */,

@ -31,10 +31,6 @@ static NSString *const kURLHostVerifyPrefix = @"verify";
#pragma mark Detect updates - perform migrations
+ (void)initialize {
[AppStoreRating setupRatingLibrary];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
}
@ -112,6 +108,8 @@ static NSString *const kURLHostVerifyPrefix = @"verify";
[TSPreKeyManager refreshPreKeys];
}
[AppStoreRating setupRatingLibrary];
return YES;
}
@ -206,18 +204,24 @@ static NSString *const kURLHostVerifyPrefix = @"verify";
completionHandler:(void (^)(BOOL succeeded))completionHandler {
if ([TSAccountManager isRegistered]) {
[[Environment getCurrent].signalsViewController composeNew];
} else {
UIAlertController *controller = [UIAlertController
alertControllerWithTitle:NSLocalizedString(@"REGISTER_CONTACTS_WELCOME", nil)
message:
@"Someone's exited to send his first message! Register now to send your first message."
preferredStyle:UIAlertControllerStyleAlert];
completionHandler(YES);
[self.window.rootViewController presentViewController:controller
animated:YES
completion:^{
completionHandler(NO);
}];
} else {
UIAlertController *controller =
[UIAlertController alertControllerWithTitle:NSLocalizedString(@"REGISTER_CONTACTS_WELCOME", nil)
message:NSLocalizedString(@"REGISTRATION_RESTRICTED_MESSAGE", nil)
preferredStyle:UIAlertControllerStyleAlert];
[controller addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
style:UIAlertActionStyleDefault
handler:^(UIAlertAction *_Nonnull action){
}]];
[[Environment getCurrent]
.signalsViewController.presentedViewController presentViewController:controller
animated:YES
completion:^{
completionHandler(NO);
}];
}
}

@ -25,14 +25,6 @@
#pragma mark - View Controller Titles
#define SETTINGS_NAV_BAR_TITLE NSLocalizedString(@"SETTINGS_NAV_BAR_TITLE", @"Title for recent calls view controller")
#define FAVOURITES_NAV_BAR_TITLE NSLocalizedString(@"FAVOURITES_NAV_BAR_TITLE", @"Title for favourites view controller")
#pragma mark - Contact Detail Communication Types
#define CONTACT_DETAIL_COMM_TYPE_EMAIL NSLocalizedString(@"CONTACT_DETAIL_COMM_TYPE_EMAIL", @"")
#define CONTACT_DETAIL_COMM_TYPE_SECURE NSLocalizedString(@"CONTACT_DETAIL_COMM_TYPE_SECURE", @"")
#define CONTACT_DETAIL_COMM_TYPE_INSECURE NSLocalizedString(@"CONTACT_DETAIL_COMM_TYPE_INSECURE", @"")
#define CONTACT_DETAIL_COMM_TYPE_NOTES NSLocalizedString(@"CONTACT_DETAIL_COMM_TYPE_NOTES", @"")
#define DIALER_CALL_BUTTON_TITLE NSLocalizedString(@"DIALER_CALL_BUTTON_TITLE", @"")
@ -41,7 +33,6 @@
#define TXT_CANCEL_TITLE NSLocalizedString(@"TXT_CANCEL_TITLE", @"")
#define TXT_SEARCH_PLACEHOLDER_TEXT NSLocalizedString(@"TXT_SEARCH_PLACEHOLDER_TEXT", @"")
#define UNKNOWN_CONTACT_NAME NSLocalizedString(@"UNKNOWN_CONTACT_NAME", @"")
#define TXT_DATESTRING_TODAY NSLocalizedString(@"DATESTRING_TODAY", @"")
#pragma mark - Inbox View
@ -76,9 +67,6 @@
#define REGISTER_CC_ERR_ALERT_VIEW_TITLE NSLocalizedString(@"REGISTER_CC_ERR_ALERT_VIEW_TITLE", @"")
#define REGISTER_CC_ERR_ALERT_VIEW_MESSAGE NSLocalizedString(@"REGISTER_CC_ERR_ALERT_VIEW_MESSAGE", @"")
#define REGISTER_CC_ERR_ALERT_VIEW_DISMISS NSLocalizedString(@"OK", @"")
#define CONTINUE_TO_WHISPER_TITLE NSLocalizedString(@"CONTINUE_TO_WHISPER_TITLE", @"")
#define CHALLENGE_CODE_BUTTON_TITLE NSLocalizedString(@"CHALLENGE_CODE_BUTTON_TITLE", @"")
#define END_CALL_BUTTON_TITLE NSLocalizedString(@"END_CALL_BUTTON_TITLE", @"")
#define ANSWER_CALL_BUTTON_TITLE NSLocalizedString(@"ANSWER_CALL_BUTTON_TITLE", @"")

@ -6,14 +6,15 @@
// Copyright (c) 2015 Open Whisper Systems. All rights reserved.
//
#import <iRate/iRate.h>
#import "AppStoreRating.h"
#import "iRate.h"
@implementation AppStoreRating
+ (void)setupRatingLibrary {
iRate *rate = [iRate sharedInstance];
rate.appStoreID = 874139669;
rate.appStoreGenreID = 6005;
rate.daysUntilPrompt = 15;
rate.usesUntilPrompt = 10;
rate.remindPeriod = 20;

Loading…
Cancel
Save