mirror of
https://github.com/oxen-io/session-ios.git
synced 2023-12-13 21:30:14 +01:00
Use StoreKit for reviews
This commit is contained in:
parent
289e3f7a98
commit
e5b3cbd00c
10 changed files with 34 additions and 1397 deletions
|
@ -42,7 +42,6 @@
|
|||
340FC8CD20518C77007AEB0F /* OWSBackupJob.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FC8CC20518C76007AEB0F /* OWSBackupJob.m */; };
|
||||
340FC8D0205BF2FA007AEB0F /* OWSBackupIO.m in Sources */ = {isa = PBXBuildFile; fileRef = 340FC8CE205BF2FA007AEB0F /* OWSBackupIO.m */; };
|
||||
341F2C0F1F2B8AE700D07D6B /* DebugUIMisc.m in Sources */ = {isa = PBXBuildFile; fileRef = 341F2C0E1F2B8AE700D07D6B /* DebugUIMisc.m */; };
|
||||
34219801210612F600C57195 /* iRate.m in Sources */ = {isa = PBXBuildFile; fileRef = 342197FF210612F600C57195 /* iRate.m */; };
|
||||
3421980F21061A0700C57195 /* UIColor+JSQMessages.m in Sources */ = {isa = PBXBuildFile; fileRef = 3421980521061A0600C57195 /* UIColor+JSQMessages.m */; };
|
||||
3421981021061A0700C57195 /* JSQMessagesAvatarImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 3421980621061A0600C57195 /* JSQMessagesAvatarImage.m */; };
|
||||
3421981121061A0700C57195 /* JSQMessagesAvatarImageFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 3421980721061A0600C57195 /* JSQMessagesAvatarImageFactory.h */; };
|
||||
|
@ -440,6 +439,7 @@
|
|||
4CB5F26720F6E1E2004D1B42 /* MenuActionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CFF4C0920F55BBA005DA313 /* MenuActionsViewController.swift */; };
|
||||
4CB5F26920F7D060004D1B42 /* MessageActions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CB5F26820F7D060004D1B42 /* MessageActions.swift */; };
|
||||
4CC0B59C20EC5F2E00CF6EE0 /* ConversationConfigurationSyncOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CC0B59B20EC5F2E00CF6EE0 /* ConversationConfigurationSyncOperation.swift */; };
|
||||
4CC1ECF9211A47CE00CC13BE /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CC1ECF8211A47CD00CC13BE /* StoreKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
|
||||
70377AAB1918450100CAF501 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70377AAA1918450100CAF501 /* MobileCoreServices.framework */; };
|
||||
768A1A2B17FC9CD300E00ED8 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 768A1A2A17FC9CD300E00ED8 /* libz.dylib */; };
|
||||
76C87F19181EFCE600C4ACAB /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76C87F18181EFCE600C4ACAB /* MediaPlayer.framework */; };
|
||||
|
@ -484,13 +484,11 @@
|
|||
B660F6DB1C29868000687D6E /* FunctionalUtilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = B660F6AD1C29868000687D6E /* FunctionalUtilTest.m */; };
|
||||
B660F6E01C29868000687D6E /* UtilTest.m in Sources */ = {isa = PBXBuildFile; fileRef = B660F6B41C29868000687D6E /* UtilTest.m */; };
|
||||
B660F7561C29988E00687D6E /* PushManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B9ECFB198B31BA00C620D3 /* PushManager.m */; };
|
||||
B660F7721C29988E00687D6E /* AppStoreRating.m in Sources */ = {isa = PBXBuildFile; fileRef = B6DA6B061B8A2F9A00CA6F98 /* AppStoreRating.m */; };
|
||||
B66DBF4A19D5BBC8006EA940 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B66DBF4919D5BBC8006EA940 /* Images.xcassets */; };
|
||||
B67EBF5D19194AC60084CCFD /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = B67EBF5C19194AC60084CCFD /* Settings.bundle */; };
|
||||
B69CD25119773E79005CE69A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B69CD25019773E79005CE69A /* XCTest.framework */; };
|
||||
B6B226971BE4B7D200860F4D /* ContactsUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6B226961BE4B7D200860F4D /* ContactsUI.framework */; settings = {ATTRIBUTES = (Weak, ); }; };
|
||||
B6B9ECFC198B31BA00C620D3 /* PushManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B6B9ECFB198B31BA00C620D3 /* PushManager.m */; };
|
||||
B6DA6B071B8A2F9A00CA6F98 /* AppStoreRating.m in Sources */ = {isa = PBXBuildFile; fileRef = B6DA6B061B8A2F9A00CA6F98 /* AppStoreRating.m */; };
|
||||
B6F509971AA53F760068F56A /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B6F509951AA53F760068F56A /* Localizable.strings */; };
|
||||
B6FE7EB71ADD62FA00A6D22F /* PushKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B6FE7EB61ADD62FA00A6D22F /* PushKit.framework */; };
|
||||
B90418E6183E9DD40038554A /* DateUtil.m in Sources */ = {isa = PBXBuildFile; fileRef = B90418E5183E9DD40038554A /* DateUtil.m */; };
|
||||
|
@ -661,8 +659,6 @@
|
|||
341458471FBE11C4005ABCF9 /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = translations/fa.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
341F2C0D1F2B8AE700D07D6B /* DebugUIMisc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DebugUIMisc.h; sourceTree = "<group>"; };
|
||||
341F2C0E1F2B8AE700D07D6B /* DebugUIMisc.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DebugUIMisc.m; sourceTree = "<group>"; };
|
||||
342197FF210612F600C57195 /* iRate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iRate.m; sourceTree = "<group>"; };
|
||||
34219800210612F600C57195 /* iRate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iRate.h; sourceTree = "<group>"; };
|
||||
3421980521061A0600C57195 /* UIColor+JSQMessages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIColor+JSQMessages.m"; sourceTree = "<group>"; };
|
||||
3421980621061A0600C57195 /* JSQMessagesAvatarImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JSQMessagesAvatarImage.m; sourceTree = "<group>"; };
|
||||
3421980721061A0600C57195 /* JSQMessagesAvatarImageFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSQMessagesAvatarImageFactory.h; sourceTree = "<group>"; };
|
||||
|
@ -1121,6 +1117,7 @@
|
|||
4C6F527B20FFE8400097DEEE /* SignalUBSan.supp */ = {isa = PBXFileReference; lastKnownFileType = text; path = SignalUBSan.supp; sourceTree = "<group>"; };
|
||||
4CB5F26820F7D060004D1B42 /* MessageActions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageActions.swift; sourceTree = "<group>"; };
|
||||
4CC0B59B20EC5F2E00CF6EE0 /* ConversationConfigurationSyncOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConversationConfigurationSyncOperation.swift; sourceTree = "<group>"; };
|
||||
4CC1ECF8211A47CD00CC13BE /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; };
|
||||
4CFF4C0920F55BBA005DA313 /* MenuActionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuActionsViewController.swift; sourceTree = "<group>"; };
|
||||
69349DE607F5BA6036C9AC60 /* Pods-SignalShareExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-SignalShareExtension.debug.xcconfig"; path = "Pods/Target Support Files/Pods-SignalShareExtension/Pods-SignalShareExtension.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
70377AAA1918450100CAF501 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; };
|
||||
|
@ -1212,8 +1209,6 @@
|
|||
B6B9ECFA198B31BA00C620D3 /* PushManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = PushManager.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
|
||||
B6B9ECFB198B31BA00C620D3 /* PushManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = PushManager.m; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objc; };
|
||||
B6BC3D0C1AA544B100C2907F /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = translations/da.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B6DA6B051B8A2F9A00CA6F98 /* AppStoreRating.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppStoreRating.h; sourceTree = "<group>"; };
|
||||
B6DA6B061B8A2F9A00CA6F98 /* AppStoreRating.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppStoreRating.m; sourceTree = "<group>"; };
|
||||
B6F509961AA53F760068F56A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = translations/en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
B6FE7EB61ADD62FA00A6D22F /* PushKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PushKit.framework; path = System/Library/Frameworks/PushKit.framework; sourceTree = SDKROOT; };
|
||||
B90418E4183E9DD40038554A /* DateUtil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DateUtil.h; sourceTree = "<group>"; };
|
||||
|
@ -1272,6 +1267,7 @@
|
|||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
4CC1ECF9211A47CE00CC13BE /* StoreKit.framework in Frameworks */,
|
||||
455A16DD1F1FEA0000F86704 /* Metal.framework in Frameworks */,
|
||||
455A16DE1F1FEA0000F86704 /* MetalKit.framework in Frameworks */,
|
||||
45847E871E4283C30080EAB3 /* Intents.framework in Frameworks */,
|
||||
|
@ -1446,20 +1442,9 @@
|
|||
path = ThreadSettings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
342197FE210612F600C57195 /* iRate */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
342197FF210612F600C57195 /* iRate.m */,
|
||||
34219800210612F600C57195 /* iRate.h */,
|
||||
);
|
||||
name = iRate;
|
||||
path = Signal/Libraries/iRate;
|
||||
sourceTree = SOURCE_ROOT;
|
||||
};
|
||||
34219802210619C800C57195 /* Libraries */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
342197FE210612F600C57195 /* iRate */,
|
||||
);
|
||||
path = Libraries;
|
||||
sourceTree = "<group>";
|
||||
|
@ -2189,8 +2174,6 @@
|
|||
76EB04C818170B33006006FC /* util */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
B6DA6B051B8A2F9A00CA6F98 /* AppStoreRating.h */,
|
||||
B6DA6B061B8A2F9A00CA6F98 /* AppStoreRating.m */,
|
||||
34CCAF361F0C0599004084F4 /* AppUpdateNag.h */,
|
||||
34CCAF371F0C0599004084F4 /* AppUpdateNag.m */,
|
||||
B90418E4183E9DD40038554A /* DateUtil.h */,
|
||||
|
@ -2413,6 +2396,7 @@
|
|||
D221A08C169C9E5E00537ABF /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
4CC1ECF8211A47CD00CC13BE /* StoreKit.framework */,
|
||||
455A16DB1F1FEA0000F86704 /* Metal.framework */,
|
||||
455A16DC1F1FEA0000F86704 /* MetalKit.framework */,
|
||||
45847E861E4283C30080EAB3 /* Intents.framework */,
|
||||
|
@ -3295,7 +3279,6 @@
|
|||
454A84042059C787008B8C75 /* MediaTileViewController.swift in Sources */,
|
||||
340FC8B4204DAC8D007AEB0F /* OWSBackupSettingsViewController.m in Sources */,
|
||||
34D1F0871F8678AA0066283D /* ConversationViewItem.m in Sources */,
|
||||
B6DA6B071B8A2F9A00CA6F98 /* AppStoreRating.m in Sources */,
|
||||
451A13B11E13DED2000A50FD /* CallNotificationsAdapter.swift in Sources */,
|
||||
348570A820F67575004FF32B /* OWSMessageHeaderView.m in Sources */,
|
||||
450DF2091E0DD2C6003D14BE /* UserNotificationsAdaptee.swift in Sources */,
|
||||
|
@ -3380,7 +3363,6 @@
|
|||
3496744D2076768700080B5F /* OWSMessageBubbleView.m in Sources */,
|
||||
34B3F8751E8DF1700035BE1A /* CallViewController.swift in Sources */,
|
||||
34D8C0281ED3673300188D7C /* DebugUITableViewController.m in Sources */,
|
||||
34219801210612F600C57195 /* iRate.m in Sources */,
|
||||
45F32C222057297A00A300D5 /* MediaDetailViewController.m in Sources */,
|
||||
34B3F8851E8DF1700035BE1A /* NewGroupViewController.m in Sources */,
|
||||
34D8C0271ED3673300188D7C /* DebugUIMessages.m in Sources */,
|
||||
|
@ -3469,7 +3451,6 @@
|
|||
34DB0BED2011548B007B313F /* OWSDatabaseConverterTest.m in Sources */,
|
||||
45360B911F952AA900FA666C /* MarqueeLabel.swift in Sources */,
|
||||
454EBAB41F2BE14C00ACE0BB /* OWSAnalytics.swift in Sources */,
|
||||
B660F7721C29988E00687D6E /* AppStoreRating.m in Sources */,
|
||||
954AEE6A1DF33E01002E5410 /* ContactsPickerTest.swift in Sources */,
|
||||
45666F581D9B2880008FE134 /* OWSScrubbingLogFormatterTest.m in Sources */,
|
||||
B660F6E01C29868000687D6E /* UtilTest.m in Sources */,
|
||||
|
|
|
@ -1,173 +0,0 @@
|
|||
//
|
||||
// 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;
|
||||
- (BOOL)promptIfAllCriteriaMet;
|
||||
- (void)openRatingsPageInAppStore;
|
||||
- (void)logEvent:(BOOL)deferPrompt;
|
||||
- (void)preventPromptAtNextTest;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
#pragma clang diagnostic pop
|
File diff suppressed because it is too large
Load diff
|
@ -3,7 +3,6 @@
|
|||
//
|
||||
|
||||
#import "AppDelegate.h"
|
||||
#import "AppStoreRating.h"
|
||||
#import "AppUpdateNag.h"
|
||||
#import "CodeVerificationViewController.h"
|
||||
#import "DebugLogger.h"
|
||||
|
@ -605,7 +604,6 @@ static NSTimeInterval launchStartedAt;
|
|||
[[[OWSFailedAttachmentDownloadsJob alloc] initWithPrimaryStorage:[OWSPrimaryStorage sharedManager]]
|
||||
run];
|
||||
|
||||
[AppStoreRating setupRatingLibrary];
|
||||
});
|
||||
} else {
|
||||
DDLogInfo(@"%@ running post launch block for unregistered user.", self.logTag);
|
||||
|
@ -917,8 +915,6 @@ static NSTimeInterval launchStartedAt;
|
|||
}
|
||||
|
||||
DDLogInfo(@"%@ %s %@", self.logTag, __PRETTY_FUNCTION__, notification);
|
||||
|
||||
[AppStoreRating preventPromptAtNextTest];
|
||||
[AppReadiness runNowOrWhenAppIsReady:^{
|
||||
[[PushManager sharedManager] application:application didReceiveLocalNotification:notification];
|
||||
}];
|
||||
|
|
|
@ -2821,6 +2821,9 @@ typedef enum : NSUInteger {
|
|||
[self clearUnreadMessagesIndicator];
|
||||
self.inputToolbar.quotedReply = nil;
|
||||
|
||||
if (!Environment.preferences.getHasSentAMessage) {
|
||||
[Environment.preferences setHasSentAMessage:YES];
|
||||
}
|
||||
if ([Environment.preferences soundInForeground]) {
|
||||
SystemSoundID soundId = [OWSSounds systemSoundIDForSound:OWSSound_MessageSent quiet:YES];
|
||||
AudioServicesPlaySystemSound(soundId);
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#import <SignalServiceKit/TSAccountManager.h>
|
||||
#import <SignalServiceKit/TSOutgoingMessage.h>
|
||||
#import <SignalServiceKit/Threading.h>
|
||||
#import <StoreKit/StoreKit.h>
|
||||
#import <YapDatabase/YapDatabase.h>
|
||||
#import <YapDatabase/YapDatabaseViewChange.h>
|
||||
#import <YapDatabase/YapDatabaseViewConnection.h>
|
||||
|
@ -77,7 +78,7 @@ NSString *const kArchivedConversationsReuseIdentifier = @"kArchivedConversations
|
|||
@property (nonatomic, readonly) NSCache<NSString *, ThreadViewModel *> *threadViewModelCache;
|
||||
@property (nonatomic) BOOL isViewVisible;
|
||||
@property (nonatomic) BOOL shouldObserveDBModifications;
|
||||
@property (nonatomic) BOOL hasBeenPresented;
|
||||
@property (nonatomic) BOOL hasEverAppeared;
|
||||
|
||||
// Mark: Search
|
||||
|
||||
|
@ -463,7 +464,11 @@ NSString *const kArchivedConversationsReuseIdentifier = @"kArchivedConversations
|
|||
self.hasThemeChanged = NO;
|
||||
}
|
||||
|
||||
[self requestReviewIfAppropriate];
|
||||
|
||||
[self.searchResultsController viewDidAppear:animated];
|
||||
|
||||
self.hasEverAppeared = YES;
|
||||
}
|
||||
|
||||
- (void)viewDidDisappear:(BOOL)animated
|
||||
|
@ -739,13 +744,11 @@ NSString *const kArchivedConversationsReuseIdentifier = @"kArchivedConversations
|
|||
ExperienceUpgradesPageViewController *experienceUpgradeViewController =
|
||||
[[ExperienceUpgradesPageViewController alloc] initWithExperienceUpgrades:unseenUpgrades];
|
||||
[self presentViewController:experienceUpgradeViewController animated:YES completion:nil];
|
||||
} else if (!self.hasBeenPresented && [ProfileViewController shouldDisplayProfileViewOnLaunch]) {
|
||||
} else if (!self.hasEverAppeared && [ProfileViewController shouldDisplayProfileViewOnLaunch]) {
|
||||
[ProfileViewController presentForUpgradeOrNag:self];
|
||||
} else {
|
||||
[OWSAlerts showIOSUpgradeNagIfNecessary];
|
||||
}
|
||||
|
||||
self.hasBeenPresented = YES;
|
||||
}
|
||||
|
||||
- (void)tableViewSetUp
|
||||
|
@ -1501,7 +1504,6 @@ NSString *const kArchivedConversationsReuseIdentifier = @"kArchivedConversations
|
|||
|
||||
if (self.homeViewMode == HomeViewMode_Inbox) {
|
||||
if ([Environment.preferences getHasSentAMessage]) {
|
||||
// FIXME: This doesn't appear to ever show up as the defaults flag is never set (setHasSentAMessage: is never called).
|
||||
firstLine = NSLocalizedString(@"EMPTY_INBOX_FIRST_TITLE", @"");
|
||||
secondLine = NSLocalizedString(@"EMPTY_INBOX_FIRST_TEXT", @"");
|
||||
} else {
|
||||
|
@ -1538,6 +1540,25 @@ NSString *const kArchivedConversationsReuseIdentifier = @"kArchivedConversations
|
|||
_emptyBoxLabel.attributedText = fullLabelString;
|
||||
}
|
||||
|
||||
// We want to delay asking for a review until an opportune time.
|
||||
// If the user has *just* launched Signal they intend to do something, we don't want to interrupt them.
|
||||
// If the user hasn't sent a message, we don't want to ask them for a review yet.
|
||||
- (void)requestReviewIfAppropriate
|
||||
{
|
||||
if (self.hasEverAppeared && Environment.preferences.getHasSentAMessage) {
|
||||
DDLogDebug(@"%@ in %s requesting review", self.logTag, __PRETTY_FUNCTION__);
|
||||
if (@available(iOS 10, *)) {
|
||||
// In Debug this pops up *every* time, which is helpful, but annoying.
|
||||
// In Production this will pop up at most 3 times per 365 days.
|
||||
#ifndef DEBUG
|
||||
[SKStoreReviewController requestReview];
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
DDLogDebug(@"%@ in %s not requesting review", self.logTag, __PRETTY_FUNCTION__);
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
//
|
||||
// Copyright (c) 2017 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
|
||||
@interface AppStoreRating : NSObject
|
||||
|
||||
+ (void)setupRatingLibrary;
|
||||
+ (void)preventPromptAtNextTest;
|
||||
|
||||
@end
|
|
@ -1,32 +0,0 @@
|
|||
//
|
||||
// AppStoreRating.m
|
||||
// Signal
|
||||
//
|
||||
// Created by Frederic Jacobs on 23/08/15.
|
||||
// Copyright (c) 2015 Open Whisper Systems. All rights reserved.
|
||||
//
|
||||
|
||||
#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;
|
||||
rate.onlyPromptIfLatestVersion = YES;
|
||||
rate.promptForNewVersionIfUserRated = NO;
|
||||
rate.messageTitle = NSLocalizedString(@"RATING_TITLE", nil);
|
||||
rate.message = NSLocalizedString(@"RATING_MSG", nil);
|
||||
rate.rateButtonLabel = NSLocalizedString(@"RATING_RATE", nil);
|
||||
}
|
||||
|
||||
+ (void)preventPromptAtNextTest {
|
||||
iRate *rate = [iRate sharedInstance];
|
||||
[rate preventPromptAtNextTest];
|
||||
}
|
||||
@end
|
|
@ -1625,15 +1625,6 @@
|
|||
/* Indicates this message is a quoted reply to a video file. */
|
||||
"QUOTED_REPLY_TYPE_VIDEO" = "Video";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"RATING_MSG" = "If you enjoy using Signal to have private conversations, you can support our project by rating it. It won't take more than a minute, and will help others find some privacy.";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"RATING_RATE" = "Rate Signal";
|
||||
|
||||
/* No comment provided by engineer. */
|
||||
"RATING_TITLE" = "Support Signal!";
|
||||
|
||||
/* Label for 'I forgot my PIN' link in the 2FA registration view. */
|
||||
"REGISTER_2FA_FORGOT_PIN" = "I forgot my PIN.";
|
||||
|
||||
|
|
|
@ -53,4 +53,4 @@
|
|||
*/
|
||||
- (UIColor *)jsq_colorByDarkeningColorWithValue:(CGFloat)value;
|
||||
|
||||
@end
|
||||
@end
|
||||
|
|
Loading…
Reference in a new issue