iPad version
This commit is contained in:
2
appirater-master/.gitignore
vendored
Executable file
2
appirater-master/.gitignore
vendored
Executable file
@@ -0,0 +1,2 @@
|
||||
|
||||
.DS_Store
|
||||
240
appirater-master/Appirater.h
Executable file
240
appirater-master/Appirater.h
Executable file
@@ -0,0 +1,240 @@
|
||||
/*
|
||||
This file is part of Appirater.
|
||||
|
||||
Copyright (c) 2012, Arash Payan
|
||||
All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
/*
|
||||
* Appirater.h
|
||||
* appirater
|
||||
*
|
||||
* Created by Arash Payan on 9/5/09.
|
||||
* http://arashpayan.com
|
||||
* Copyright 2012 Arash Payan. All rights reserved.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
#import "AppiraterDelegate.h"
|
||||
#import <StoreKit/StoreKit.h>
|
||||
|
||||
extern NSString *const kAppiraterFirstUseDate;
|
||||
extern NSString *const kAppiraterUseCount;
|
||||
extern NSString *const kAppiraterSignificantEventCount;
|
||||
extern NSString *const kAppiraterCurrentVersion;
|
||||
extern NSString *const kAppiraterRatedCurrentVersion;
|
||||
extern NSString *const kAppiraterDeclinedToRate;
|
||||
extern NSString *const kAppiraterReminderRequestDate;
|
||||
|
||||
/*
|
||||
Your localized app's name.
|
||||
*/
|
||||
#define APPIRATER_LOCALIZED_APP_NAME [[[NSBundle mainBundle] localizedInfoDictionary] objectForKey:@"CFBundleDisplayName"]
|
||||
|
||||
/*
|
||||
Your app's name.
|
||||
*/
|
||||
#define APPIRATER_APP_NAME APPIRATER_LOCALIZED_APP_NAME ? APPIRATER_LOCALIZED_APP_NAME : [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey]
|
||||
|
||||
/*
|
||||
This is the message your users will see once they've passed the day+launches
|
||||
threshold.
|
||||
*/
|
||||
#define APPIRATER_LOCALIZED_MESSAGE NSLocalizedStringFromTable(@"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!", @"AppiraterLocalizable", nil)
|
||||
#define APPIRATER_MESSAGE [NSString stringWithFormat:APPIRATER_LOCALIZED_MESSAGE, APPIRATER_APP_NAME]
|
||||
|
||||
/*
|
||||
This is the title of the message alert that users will see.
|
||||
*/
|
||||
#define APPIRATER_LOCALIZED_MESSAGE_TITLE NSLocalizedStringFromTable(@"Rate %@", @"AppiraterLocalizable", nil)
|
||||
#define APPIRATER_MESSAGE_TITLE [NSString stringWithFormat:APPIRATER_LOCALIZED_MESSAGE_TITLE, APPIRATER_APP_NAME]
|
||||
|
||||
/*
|
||||
The text of the button that rejects reviewing the app.
|
||||
*/
|
||||
#define APPIRATER_CANCEL_BUTTON NSLocalizedStringFromTable(@"No, Thanks", @"AppiraterLocalizable", nil)
|
||||
|
||||
/*
|
||||
Text of button that will send user to app review page.
|
||||
*/
|
||||
#define APPIRATER_LOCALIZED_RATE_BUTTON NSLocalizedStringFromTable(@"Rate %@", @"AppiraterLocalizable", nil)
|
||||
#define APPIRATER_RATE_BUTTON [NSString stringWithFormat:APPIRATER_LOCALIZED_RATE_BUTTON, APPIRATER_APP_NAME]
|
||||
|
||||
/*
|
||||
Text for button to remind the user to review later.
|
||||
*/
|
||||
#define APPIRATER_RATE_LATER NSLocalizedStringFromTable(@"Remind me later", @"AppiraterLocalizable", nil)
|
||||
|
||||
@interface Appirater : NSObject <UIAlertViewDelegate, SKStoreProductViewControllerDelegate> {
|
||||
|
||||
UIAlertView *ratingAlert;
|
||||
}
|
||||
|
||||
@property(nonatomic, strong) UIAlertView *ratingAlert;
|
||||
#if __has_feature(objc_arc_weak)
|
||||
@property(nonatomic, weak) NSObject <AppiraterDelegate> *delegate;
|
||||
#else
|
||||
@property(nonatomic, unsafe_unretained) NSObject <AppiraterDelegate> *delegate;
|
||||
#endif
|
||||
|
||||
/*
|
||||
Tells Appirater that the app has launched, and on devices that do NOT
|
||||
support multitasking, the 'uses' count will be incremented. You should
|
||||
call this method at the end of your application delegate's
|
||||
application:didFinishLaunchingWithOptions: method.
|
||||
|
||||
If the app has been used enough to be rated (and enough significant events),
|
||||
you can suppress the rating alert
|
||||
by passing NO for canPromptForRating. The rating alert will simply be postponed
|
||||
until it is called again with YES for canPromptForRating. The rating alert
|
||||
can also be triggered by appEnteredForeground: and userDidSignificantEvent:
|
||||
(as long as you pass YES for canPromptForRating in those methods).
|
||||
*/
|
||||
+ (void)appLaunched:(BOOL)canPromptForRating;
|
||||
|
||||
/*
|
||||
Tells Appirater that the app was brought to the foreground on multitasking
|
||||
devices. You should call this method from the application delegate's
|
||||
applicationWillEnterForeground: method.
|
||||
|
||||
If the app has been used enough to be rated (and enough significant events),
|
||||
you can suppress the rating alert
|
||||
by passing NO for canPromptForRating. The rating alert will simply be postponed
|
||||
until it is called again with YES for canPromptForRating. The rating alert
|
||||
can also be triggered by appLaunched: and userDidSignificantEvent:
|
||||
(as long as you pass YES for canPromptForRating in those methods).
|
||||
*/
|
||||
+ (void)appEnteredForeground:(BOOL)canPromptForRating;
|
||||
|
||||
/*
|
||||
Tells Appirater that the user performed a significant event. A significant
|
||||
event is whatever you want it to be. If you're app is used to make VoIP
|
||||
calls, then you might want to call this method whenever the user places
|
||||
a call. If it's a game, you might want to call this whenever the user
|
||||
beats a level boss.
|
||||
|
||||
If the user has performed enough significant events and used the app enough,
|
||||
you can suppress the rating alert by passing NO for canPromptForRating. The
|
||||
rating alert will simply be postponed until it is called again with YES for
|
||||
canPromptForRating. The rating alert can also be triggered by appLaunched:
|
||||
and appEnteredForeground: (as long as you pass YES for canPromptForRating
|
||||
in those methods).
|
||||
*/
|
||||
+ (void)userDidSignificantEvent:(BOOL)canPromptForRating;
|
||||
|
||||
/*
|
||||
Tells Appirater to open the App Store page where the user can specify a
|
||||
rating for the app. Also records the fact that this has happened, so the
|
||||
user won't be prompted again to rate the app.
|
||||
|
||||
The only case where you should call this directly is if your app has an
|
||||
explicit "Rate this app" command somewhere. In all other cases, don't worry
|
||||
about calling this -- instead, just call the other functions listed above,
|
||||
and let Appirater handle the bookkeeping of deciding when to ask the user
|
||||
whether to rate the app.
|
||||
*/
|
||||
+ (void)rateApp;
|
||||
|
||||
/*
|
||||
Tells Appirater to immediately close any open rating modals (e.g. StoreKit rating VCs).
|
||||
*/
|
||||
+ (void)closeModal;
|
||||
|
||||
@end
|
||||
|
||||
@interface Appirater(Configuration)
|
||||
|
||||
/*
|
||||
Set your Apple generated software id here.
|
||||
*/
|
||||
+ (void) setAppId:(NSString*)appId;
|
||||
|
||||
/*
|
||||
Users will need to have the same version of your app installed for this many
|
||||
days before they will be prompted to rate it.
|
||||
*/
|
||||
+ (void) setDaysUntilPrompt:(double)value;
|
||||
|
||||
/*
|
||||
An example of a 'use' would be if the user launched the app. Bringing the app
|
||||
into the foreground (on devices that support it) would also be considered
|
||||
a 'use'. You tell Appirater about these events using the two methods:
|
||||
[Appirater appLaunched:]
|
||||
[Appirater appEnteredForeground:]
|
||||
|
||||
Users need to 'use' the same version of the app this many times before
|
||||
before they will be prompted to rate it.
|
||||
*/
|
||||
+ (void) setUsesUntilPrompt:(NSInteger)value;
|
||||
|
||||
/*
|
||||
A significant event can be anything you want to be in your app. In a
|
||||
telephone app, a significant event might be placing or receiving a call.
|
||||
In a game, it might be beating a level or a boss. This is just another
|
||||
layer of filtering that can be used to make sure that only the most
|
||||
loyal of your users are being prompted to rate you on the app store.
|
||||
If you leave this at a value of -1, then this won't be a criterion
|
||||
used for rating. To tell Appirater that the user has performed
|
||||
a significant event, call the method:
|
||||
[Appirater userDidSignificantEvent:];
|
||||
*/
|
||||
+ (void) setSignificantEventsUntilPrompt:(NSInteger)value;
|
||||
|
||||
|
||||
/*
|
||||
Once the rating alert is presented to the user, they might select
|
||||
'Remind me later'. This value specifies how long (in days) Appirater
|
||||
will wait before reminding them.
|
||||
*/
|
||||
+ (void) setTimeBeforeReminding:(double)value;
|
||||
|
||||
/*
|
||||
'YES' will show the Appirater alert everytime. Useful for testing how your message
|
||||
looks and making sure the link to your app's review page works.
|
||||
*/
|
||||
+ (void) setDebug:(BOOL)debug;
|
||||
|
||||
/*
|
||||
Set the delegate if you want to know when Appirater does something
|
||||
*/
|
||||
+ (void)setDelegate:(id<AppiraterDelegate>)delegate;
|
||||
|
||||
/*
|
||||
Set whether or not Appirater uses animation (currently respected when pushing modal StoreKit rating VCs).
|
||||
*/
|
||||
+ (void)setUsesAnimation:(BOOL)animation;
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@interface Appirater(Deprecated)
|
||||
|
||||
/*
|
||||
DEPRECATED: While still functional, it's better to use
|
||||
appLaunched:(BOOL)canPromptForRating instead.
|
||||
|
||||
Calls [Appirater appLaunched:YES]. See appLaunched: for details of functionality.
|
||||
*/
|
||||
+ (void)appLaunched __attribute__((deprecated));
|
||||
|
||||
@end
|
||||
492
appirater-master/Appirater.m
Executable file
492
appirater-master/Appirater.m
Executable file
@@ -0,0 +1,492 @@
|
||||
/*
|
||||
This file is part of Appirater.
|
||||
|
||||
Copyright (c) 2012, Arash Payan
|
||||
All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
/*
|
||||
* Appirater.m
|
||||
* appirater
|
||||
*
|
||||
* Created by Arash Payan on 9/5/09.
|
||||
* http://arashpayan.com
|
||||
* Copyright 2012 Arash Payan. All rights reserved.
|
||||
*/
|
||||
|
||||
#import "Appirater.h"
|
||||
#import <SystemConfiguration/SCNetworkReachability.h>
|
||||
#include <netinet/in.h>
|
||||
|
||||
#if ! __has_feature(objc_arc)
|
||||
#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC).
|
||||
#endif
|
||||
|
||||
NSString *const kAppiraterFirstUseDate = @"kAppiraterFirstUseDate";
|
||||
NSString *const kAppiraterUseCount = @"kAppiraterUseCount";
|
||||
NSString *const kAppiraterSignificantEventCount = @"kAppiraterSignificantEventCount";
|
||||
NSString *const kAppiraterCurrentVersion = @"kAppiraterCurrentVersion";
|
||||
NSString *const kAppiraterRatedCurrentVersion = @"kAppiraterRatedCurrentVersion";
|
||||
NSString *const kAppiraterDeclinedToRate = @"kAppiraterDeclinedToRate";
|
||||
NSString *const kAppiraterReminderRequestDate = @"kAppiraterReminderRequestDate";
|
||||
|
||||
NSString *templateReviewURL = @"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=APP_ID";
|
||||
|
||||
static NSString *_appId;
|
||||
static double _daysUntilPrompt = 30;
|
||||
static NSInteger _usesUntilPrompt = 20;
|
||||
static NSInteger _significantEventsUntilPrompt = -1;
|
||||
static double _timeBeforeReminding = 1;
|
||||
static BOOL _debug = NO;
|
||||
static id<AppiraterDelegate> _delegate;
|
||||
static BOOL _usesAnimation = TRUE;
|
||||
static UIStatusBarStyle _statusBarStyle;
|
||||
static BOOL _modalOpen = false;
|
||||
|
||||
@interface Appirater ()
|
||||
- (BOOL)connectedToNetwork;
|
||||
+ (Appirater*)sharedInstance;
|
||||
- (void)showRatingAlert;
|
||||
- (BOOL)ratingConditionsHaveBeenMet;
|
||||
- (void)incrementUseCount;
|
||||
- (void)hideRatingAlert;
|
||||
@end
|
||||
|
||||
@implementation Appirater
|
||||
|
||||
@synthesize ratingAlert;
|
||||
|
||||
+ (void) setAppId:(NSString *)appId {
|
||||
_appId = appId;
|
||||
}
|
||||
|
||||
+ (void) setDaysUntilPrompt:(double)value {
|
||||
_daysUntilPrompt = value;
|
||||
}
|
||||
|
||||
+ (void) setUsesUntilPrompt:(NSInteger)value {
|
||||
_usesUntilPrompt = value;
|
||||
}
|
||||
|
||||
+ (void) setSignificantEventsUntilPrompt:(NSInteger)value {
|
||||
_significantEventsUntilPrompt = value;
|
||||
}
|
||||
|
||||
+ (void) setTimeBeforeReminding:(double)value {
|
||||
_timeBeforeReminding = value;
|
||||
}
|
||||
|
||||
+ (void) setDebug:(BOOL)debug {
|
||||
_debug = debug;
|
||||
}
|
||||
+ (void)setDelegate:(id<AppiraterDelegate>)delegate{
|
||||
_delegate = delegate;
|
||||
}
|
||||
+ (void)setUsesAnimation:(BOOL)animation {
|
||||
_usesAnimation = animation;
|
||||
}
|
||||
+ (void)setStatusBarStyle:(UIStatusBarStyle)style {
|
||||
_statusBarStyle = style;
|
||||
}
|
||||
+ (void)setModalOpen:(BOOL)open {
|
||||
_modalOpen = open;
|
||||
}
|
||||
|
||||
- (BOOL)connectedToNetwork {
|
||||
// Create zero addy
|
||||
struct sockaddr_in zeroAddress;
|
||||
bzero(&zeroAddress, sizeof(zeroAddress));
|
||||
zeroAddress.sin_len = sizeof(zeroAddress);
|
||||
zeroAddress.sin_family = AF_INET;
|
||||
|
||||
// Recover reachability flags
|
||||
SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
|
||||
SCNetworkReachabilityFlags flags;
|
||||
|
||||
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
|
||||
CFRelease(defaultRouteReachability);
|
||||
|
||||
if (!didRetrieveFlags)
|
||||
{
|
||||
NSLog(@"Error. Could not recover network reachability flags");
|
||||
return NO;
|
||||
}
|
||||
|
||||
BOOL isReachable = flags & kSCNetworkFlagsReachable;
|
||||
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
|
||||
BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
|
||||
|
||||
NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"];
|
||||
NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20.0];
|
||||
NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:self];
|
||||
|
||||
return ((isReachable && !needsConnection) || nonWiFi) ? (testConnection ? YES : NO) : NO;
|
||||
}
|
||||
|
||||
+ (Appirater*)sharedInstance {
|
||||
static Appirater *appirater = nil;
|
||||
if (appirater == nil)
|
||||
{
|
||||
static dispatch_once_t onceToken;
|
||||
dispatch_once(&onceToken, ^{
|
||||
appirater = [[Appirater alloc] init];
|
||||
appirater.delegate = _delegate;
|
||||
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillResignActive) name:
|
||||
UIApplicationWillResignActiveNotification object:nil];
|
||||
});
|
||||
}
|
||||
|
||||
return appirater;
|
||||
}
|
||||
|
||||
- (void)showRatingAlert {
|
||||
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:APPIRATER_MESSAGE_TITLE
|
||||
message:APPIRATER_MESSAGE
|
||||
delegate:self
|
||||
cancelButtonTitle:APPIRATER_CANCEL_BUTTON
|
||||
otherButtonTitles:APPIRATER_RATE_BUTTON, APPIRATER_RATE_LATER, nil];
|
||||
self.ratingAlert = alertView;
|
||||
[alertView show];
|
||||
|
||||
if(self.delegate && [self.delegate respondsToSelector:@selector(appiraterDidDisplayAlert:)]){
|
||||
[self.delegate appiraterDidDisplayAlert:self];
|
||||
}
|
||||
}
|
||||
|
||||
- (BOOL)ratingConditionsHaveBeenMet {
|
||||
if (_debug)
|
||||
return YES;
|
||||
|
||||
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
|
||||
|
||||
NSDate *dateOfFirstLaunch = [NSDate dateWithTimeIntervalSince1970:[userDefaults doubleForKey:kAppiraterFirstUseDate]];
|
||||
NSTimeInterval timeSinceFirstLaunch = [[NSDate date] timeIntervalSinceDate:dateOfFirstLaunch];
|
||||
NSTimeInterval timeUntilRate = 60 * 60 * 24 * _daysUntilPrompt;
|
||||
if (timeSinceFirstLaunch < timeUntilRate)
|
||||
return NO;
|
||||
|
||||
// check if the app has been used enough
|
||||
int useCount = [userDefaults integerForKey:kAppiraterUseCount];
|
||||
if (useCount <= _usesUntilPrompt)
|
||||
return NO;
|
||||
|
||||
// check if the user has done enough significant events
|
||||
int sigEventCount = [userDefaults integerForKey:kAppiraterSignificantEventCount];
|
||||
if (sigEventCount <= _significantEventsUntilPrompt)
|
||||
return NO;
|
||||
|
||||
// has the user previously declined to rate this version of the app?
|
||||
if ([userDefaults boolForKey:kAppiraterDeclinedToRate])
|
||||
return NO;
|
||||
|
||||
// has the user already rated the app?
|
||||
if ([userDefaults boolForKey:kAppiraterRatedCurrentVersion])
|
||||
return NO;
|
||||
|
||||
// if the user wanted to be reminded later, has enough time passed?
|
||||
NSDate *reminderRequestDate = [NSDate dateWithTimeIntervalSince1970:[userDefaults doubleForKey:kAppiraterReminderRequestDate]];
|
||||
NSTimeInterval timeSinceReminderRequest = [[NSDate date] timeIntervalSinceDate:reminderRequestDate];
|
||||
NSTimeInterval timeUntilReminder = 60 * 60 * 24 * _timeBeforeReminding;
|
||||
if (timeSinceReminderRequest < timeUntilReminder)
|
||||
return NO;
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (void)incrementUseCount {
|
||||
// get the app's version
|
||||
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleVersionKey];
|
||||
|
||||
// get the version number that we've been tracking
|
||||
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
|
||||
NSString *trackingVersion = [userDefaults stringForKey:kAppiraterCurrentVersion];
|
||||
if (trackingVersion == nil)
|
||||
{
|
||||
trackingVersion = version;
|
||||
[userDefaults setObject:version forKey:kAppiraterCurrentVersion];
|
||||
}
|
||||
|
||||
if (_debug)
|
||||
NSLog(@"APPIRATER Tracking version: %@", trackingVersion);
|
||||
|
||||
if ([trackingVersion isEqualToString:version])
|
||||
{
|
||||
// check if the first use date has been set. if not, set it.
|
||||
NSTimeInterval timeInterval = [userDefaults doubleForKey:kAppiraterFirstUseDate];
|
||||
if (timeInterval == 0)
|
||||
{
|
||||
timeInterval = [[NSDate date] timeIntervalSince1970];
|
||||
[userDefaults setDouble:timeInterval forKey:kAppiraterFirstUseDate];
|
||||
}
|
||||
|
||||
// increment the use count
|
||||
int useCount = [userDefaults integerForKey:kAppiraterUseCount];
|
||||
useCount++;
|
||||
[userDefaults setInteger:useCount forKey:kAppiraterUseCount];
|
||||
if (_debug)
|
||||
NSLog(@"APPIRATER Use count: %d", useCount);
|
||||
}
|
||||
else
|
||||
{
|
||||
// it's a new version of the app, so restart tracking
|
||||
[userDefaults setObject:version forKey:kAppiraterCurrentVersion];
|
||||
[userDefaults setDouble:[[NSDate date] timeIntervalSince1970] forKey:kAppiraterFirstUseDate];
|
||||
[userDefaults setInteger:1 forKey:kAppiraterUseCount];
|
||||
[userDefaults setInteger:0 forKey:kAppiraterSignificantEventCount];
|
||||
[userDefaults setBool:NO forKey:kAppiraterRatedCurrentVersion];
|
||||
[userDefaults setBool:NO forKey:kAppiraterDeclinedToRate];
|
||||
[userDefaults setDouble:0 forKey:kAppiraterReminderRequestDate];
|
||||
}
|
||||
|
||||
[userDefaults synchronize];
|
||||
}
|
||||
|
||||
- (void)incrementSignificantEventCount {
|
||||
// get the app's version
|
||||
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleVersionKey];
|
||||
|
||||
// get the version number that we've been tracking
|
||||
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
|
||||
NSString *trackingVersion = [userDefaults stringForKey:kAppiraterCurrentVersion];
|
||||
if (trackingVersion == nil)
|
||||
{
|
||||
trackingVersion = version;
|
||||
[userDefaults setObject:version forKey:kAppiraterCurrentVersion];
|
||||
}
|
||||
|
||||
if (_debug)
|
||||
NSLog(@"APPIRATER Tracking version: %@", trackingVersion);
|
||||
|
||||
if ([trackingVersion isEqualToString:version])
|
||||
{
|
||||
// check if the first use date has been set. if not, set it.
|
||||
NSTimeInterval timeInterval = [userDefaults doubleForKey:kAppiraterFirstUseDate];
|
||||
if (timeInterval == 0)
|
||||
{
|
||||
timeInterval = [[NSDate date] timeIntervalSince1970];
|
||||
[userDefaults setDouble:timeInterval forKey:kAppiraterFirstUseDate];
|
||||
}
|
||||
|
||||
// increment the significant event count
|
||||
int sigEventCount = [userDefaults integerForKey:kAppiraterSignificantEventCount];
|
||||
sigEventCount++;
|
||||
[userDefaults setInteger:sigEventCount forKey:kAppiraterSignificantEventCount];
|
||||
if (_debug)
|
||||
NSLog(@"APPIRATER Significant event count: %d", sigEventCount);
|
||||
}
|
||||
else
|
||||
{
|
||||
// it's a new version of the app, so restart tracking
|
||||
[userDefaults setObject:version forKey:kAppiraterCurrentVersion];
|
||||
[userDefaults setDouble:0 forKey:kAppiraterFirstUseDate];
|
||||
[userDefaults setInteger:0 forKey:kAppiraterUseCount];
|
||||
[userDefaults setInteger:1 forKey:kAppiraterSignificantEventCount];
|
||||
[userDefaults setBool:NO forKey:kAppiraterRatedCurrentVersion];
|
||||
[userDefaults setBool:NO forKey:kAppiraterDeclinedToRate];
|
||||
[userDefaults setDouble:0 forKey:kAppiraterReminderRequestDate];
|
||||
}
|
||||
|
||||
[userDefaults synchronize];
|
||||
}
|
||||
|
||||
- (void)incrementAndRate:(BOOL)canPromptForRating {
|
||||
[self incrementUseCount];
|
||||
|
||||
if (canPromptForRating &&
|
||||
[self ratingConditionsHaveBeenMet] &&
|
||||
[self connectedToNetwork])
|
||||
{
|
||||
dispatch_async(dispatch_get_main_queue(),
|
||||
^{
|
||||
[self showRatingAlert];
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
- (void)incrementSignificantEventAndRate:(BOOL)canPromptForRating {
|
||||
[self incrementSignificantEventCount];
|
||||
|
||||
if (canPromptForRating &&
|
||||
[self ratingConditionsHaveBeenMet] &&
|
||||
[self connectedToNetwork])
|
||||
{
|
||||
dispatch_async(dispatch_get_main_queue(),
|
||||
^{
|
||||
[self showRatingAlert];
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
+ (void)appLaunched {
|
||||
[Appirater appLaunched:YES];
|
||||
}
|
||||
|
||||
+ (void)appLaunched:(BOOL)canPromptForRating {
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0),
|
||||
^{
|
||||
[[Appirater sharedInstance] incrementAndRate:canPromptForRating];
|
||||
});
|
||||
}
|
||||
|
||||
- (void)hideRatingAlert {
|
||||
if (self.ratingAlert.visible) {
|
||||
if (_debug)
|
||||
NSLog(@"APPIRATER Hiding Alert");
|
||||
[self.ratingAlert dismissWithClickedButtonIndex:-1 animated:NO];
|
||||
}
|
||||
}
|
||||
|
||||
+ (void)appWillResignActive {
|
||||
if (_debug)
|
||||
NSLog(@"APPIRATER appWillResignActive");
|
||||
[[Appirater sharedInstance] hideRatingAlert];
|
||||
}
|
||||
|
||||
+ (void)appEnteredForeground:(BOOL)canPromptForRating {
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0),
|
||||
^{
|
||||
[[Appirater sharedInstance] incrementAndRate:canPromptForRating];
|
||||
});
|
||||
}
|
||||
|
||||
+ (void)userDidSignificantEvent:(BOOL)canPromptForRating {
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0),
|
||||
^{
|
||||
[[Appirater sharedInstance] incrementSignificantEventAndRate:canPromptForRating];
|
||||
});
|
||||
}
|
||||
|
||||
+ (id)getRootViewController {
|
||||
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
|
||||
if (window.windowLevel != UIWindowLevelNormal) {
|
||||
NSArray *windows = [[UIApplication sharedApplication] windows];
|
||||
for(window in windows) {
|
||||
if (window.windowLevel == UIWindowLevelNormal) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (UIView *subView in [window subviews])
|
||||
{
|
||||
UIResponder *responder = [subView nextResponder];
|
||||
if([responder isKindOfClass:[UIViewController class]]) {
|
||||
return responder;
|
||||
}
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
+ (void)rateApp {
|
||||
|
||||
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
|
||||
[userDefaults setBool:YES forKey:kAppiraterRatedCurrentVersion];
|
||||
[userDefaults synchronize];
|
||||
|
||||
//Use the in-app StoreKit view if available (iOS 6) and imported. This works in the simulator.
|
||||
if (NSStringFromClass([SKStoreProductViewController class]) != nil) {
|
||||
|
||||
SKStoreProductViewController *storeViewController = [[SKStoreProductViewController alloc] init];
|
||||
NSNumber *appId = [NSNumber numberWithInteger:_appId.integerValue];
|
||||
[storeViewController loadProductWithParameters:@{SKStoreProductParameterITunesItemIdentifier:appId} completionBlock:nil];
|
||||
storeViewController.delegate = self.sharedInstance;
|
||||
if ([self.sharedInstance.delegate respondsToSelector:@selector(appiraterWillPresentModalView:animated:)]) {
|
||||
[self.sharedInstance.delegate appiraterWillPresentModalView:self.sharedInstance animated:_usesAnimation];
|
||||
}
|
||||
[[self getRootViewController] presentViewController:storeViewController animated:_usesAnimation completion:^{
|
||||
[self setModalOpen:YES];
|
||||
//Temporarily use a black status bar to match the StoreKit view.
|
||||
[self setStatusBarStyle:[UIApplication sharedApplication].statusBarStyle];
|
||||
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:_usesAnimation];
|
||||
}];
|
||||
|
||||
//Use the standard openUrl method if StoreKit is unavailable.
|
||||
} else {
|
||||
|
||||
#if TARGET_IPHONE_SIMULATOR
|
||||
NSLog(@"APPIRATER NOTE: iTunes App Store is not supported on the iOS simulator. Unable to open App Store page.");
|
||||
#else
|
||||
NSString *reviewURL = [templateReviewURL stringByReplacingOccurrencesOfString:@"APP_ID" withString:[NSString stringWithFormat:@"%@", _appId]];
|
||||
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:reviewURL]];
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
|
||||
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
|
||||
|
||||
switch (buttonIndex) {
|
||||
case 0:
|
||||
{
|
||||
// they don't want to rate it
|
||||
[userDefaults setBool:YES forKey:kAppiraterDeclinedToRate];
|
||||
[userDefaults synchronize];
|
||||
if(self.delegate && [self.delegate respondsToSelector:@selector(appiraterDidDeclineToRate:)]){
|
||||
[self.delegate appiraterDidDeclineToRate:self];
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
// they want to rate it
|
||||
[Appirater rateApp];
|
||||
if(self.delegate && [self.delegate respondsToSelector:@selector(appiraterDidOptToRate:)]){
|
||||
[self.delegate appiraterDidOptToRate:self];
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
// remind them later
|
||||
[userDefaults setDouble:[[NSDate date] timeIntervalSince1970] forKey:kAppiraterReminderRequestDate];
|
||||
[userDefaults synchronize];
|
||||
if(self.delegate && [self.delegate respondsToSelector:@selector(appiraterDidOptToRemindLater:)]){
|
||||
[self.delegate appiraterDidOptToRemindLater:self];
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//Delegate call from the StoreKit view.
|
||||
- (void)productViewControllerDidFinish:(SKStoreProductViewController *)viewController {
|
||||
[Appirater closeModal];
|
||||
}
|
||||
|
||||
//Close the in-app rating (StoreKit) view and restore the previous status bar style.
|
||||
+ (void)closeModal {
|
||||
if (_modalOpen) {
|
||||
[[UIApplication sharedApplication]setStatusBarStyle:_statusBarStyle animated:_usesAnimation];
|
||||
BOOL usedAnimation = _usesAnimation;
|
||||
[self setModalOpen:NO];
|
||||
[[UIApplication sharedApplication].keyWindow.rootViewController dismissViewControllerAnimated:_usesAnimation completion:^{
|
||||
if ([self.sharedInstance.delegate respondsToSelector:@selector(appiraterDidDismissModalView:animated:)]) {
|
||||
[self.sharedInstance.delegate appiraterDidDismissModalView:(Appirater *)self animated:usedAnimation];
|
||||
}
|
||||
}];
|
||||
[self.class setStatusBarStyle:(UIStatusBarStyle)nil];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
14
appirater-master/Appirater.podspec
Executable file
14
appirater-master/Appirater.podspec
Executable file
@@ -0,0 +1,14 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = 'Appirater'
|
||||
s.version = '1.0.0'
|
||||
s.platform = :ios
|
||||
s.summary = "A utility that reminds your iPhone app's users to review the app."
|
||||
s.homepage = 'http://arashpayan.com/blog/2009/09/07/presenting-appirater/'
|
||||
s.author = { 'Arash Payan' => 'arash.payan@gmail.com' }
|
||||
s.source = { :git => 'https://github.com/arashpayan/appirater.git', :commit => '1f6edfb85ec242be0321e5045331b475e0720043' }
|
||||
s.source_files = '*.{h,m}'
|
||||
s.resources = '*.lproj'
|
||||
s.frameworks = 'CFNetwork', 'SystemConfiguration'
|
||||
s.weak_framework = 'StoreKit'
|
||||
s.license = { :type => 'MIT', :text => 'Copyright 2012. Arash Payan. This library is distributed under the terms of the MIT/X11.' }
|
||||
end
|
||||
22
appirater-master/AppiraterDelegate.h
Executable file
22
appirater-master/AppiraterDelegate.h
Executable file
@@ -0,0 +1,22 @@
|
||||
//
|
||||
// AppiraterDelegate.h
|
||||
// Banana Stand
|
||||
//
|
||||
// Created by Robert Haining on 9/25/12.
|
||||
// Copyright (c) 2012 News.me. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@class Appirater;
|
||||
|
||||
@protocol AppiraterDelegate <NSObject>
|
||||
|
||||
@optional
|
||||
-(void)appiraterDidDisplayAlert:(Appirater *)appirater;
|
||||
-(void)appiraterDidDeclineToRate:(Appirater *)appirater;
|
||||
-(void)appiraterDidOptToRate:(Appirater *)appirater;
|
||||
-(void)appiraterDidOptToRemindLater:(Appirater *)appirater;
|
||||
-(void)appiraterWillPresentModalView:(Appirater *)appirater animated:(BOOL)animated;
|
||||
-(void)appiraterDidDismissModalView:(Appirater *)appirater animated:(BOOL)animated;
|
||||
@end
|
||||
59
appirater-master/README.md
Executable file
59
appirater-master/README.md
Executable file
@@ -0,0 +1,59 @@
|
||||
Introduction
|
||||
------------
|
||||
Appirater is a class that you can drop into any iPhone app (iOS 4.0 or later) that will help remind your users
|
||||
to review your app on the App Store. The code is released under the MIT/X11, so feel free to
|
||||
modify and share your changes with the world. Read on below for how to get started. If you need any help using,
|
||||
the library check out the [Appirater group] [appiratergroup].
|
||||
|
||||
|
||||
Getting Started
|
||||
---------------
|
||||
1. Add the Appirater code into your project.
|
||||
2. If your project doesn't use ARC, add the `-fobjc-arc` compiler flag to `Appirater.m` in your target's Build Phases » Compile Sources section.
|
||||
3. Add the `CFNetwork`, `SystemConfiguration`, and `StoreKit` frameworks to your project. Be sure to **change Required to Optional** for StoreKit in your target's Build Phases » Link Binary with Libraries section.
|
||||
4. Call `[Appirater setAppId:@"yourAppId"]` with the app id provided by Apple. A good place to do this is at the beginning of your app delegate's `application:didFinishLaunchingWithOptions:` method.
|
||||
5. Call `[Appirater appLaunched:YES]` at the end of your app delegate's `application:didFinishLaunchingWithOptions:` method.
|
||||
6. Call `[Appirater appEnteredForeground:YES]` in your app delegate's `applicationWillEnterForeground:` method.
|
||||
7. (OPTIONAL) Call `[Appirater userDidSignificantEvent:YES]` when the user does something 'significant' in the app.
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
Appirater provides class methods to configure its behavior. See [`Appirater.h`] [Appirater.h] for more information.
|
||||
|
||||
```objc
|
||||
[Appirater setAppId:@"552035781"];
|
||||
[Appirater setDaysUntilPrompt:1];
|
||||
[Appirater setUsesUntilPrompt:10];
|
||||
[Appirater setSignificantEventsUntilPrompt:-1];
|
||||
[Appirater setTimeBeforeReminding:2];
|
||||
[Appirater setDebug:YES];
|
||||
```
|
||||
|
||||
Help and Support Group
|
||||
----------------------
|
||||
Requests for help, questions about usage, suggestions and other relevant topics should be posted at the [Appirater group] [appiratergroup]. As much as I'd like to help everyone who emails me, I can't respond to private emails, but I'll respond to posts on the group where others can benefit from the Q&As.
|
||||
|
||||
License
|
||||
-------
|
||||
Copyright 2012. [Arash Payan] [arash].
|
||||
This library is distributed under the terms of the MIT/X11.
|
||||
|
||||
While not required, I greatly encourage and appreciate any improvements that you make
|
||||
to this library be contributed back for the benefit of all who use Appirater.
|
||||
|
||||
Ports for other SDKs
|
||||
--------------
|
||||
A few people have ported Appirater to other SDKs. The ports are listed here in hopes that they may assist developers of those SDKs. I don't know how closesly (if at all) they track the Objective-C version of Appirater. If you need support for any of the libraries, please contact the maintainer of the port.
|
||||
|
||||
+ MonoTouch. [Github] [monotouchport]
|
||||
+ Corona SDK. [Github] [coronasdkport]
|
||||
+ Titanium SDK. [Github] [titaniumport]
|
||||
|
||||
[appiratergroup]: http://groups.google.com/group/appirater
|
||||
[homepage]: http://arashpayan.com/blog/index.php/2009/09/07/presenting-appirater/
|
||||
[arash]: http://arashpayan.com
|
||||
[Appirater.h]: https://github.com/arashpayan/appirater/blob/master/Appirater.h
|
||||
[monotouchport]: https://github.com/chebum/Appirater-for-MonoTouch
|
||||
[coronasdkport]: https://github.com/aliasgar84/Appirater
|
||||
[titaniumport]: https://github.com/mpociot/TiAppirater
|
||||
4
appirater-master/ca.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/ca.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Si li agrada utilitzar %@, li importaria prendre’s un moment per a valorar-lo? No trigarà més d’un minut. Gràcies por la seva col·laboració!";
|
||||
"Rate %@" = "Valorar %@";
|
||||
"No, Thanks" = "No, gràcies";
|
||||
"Remind me later" = "Recordar-m’ho més tard";
|
||||
4
appirater-master/cs.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/cs.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Pokud se Vám aplikace %@ líbí, mohli byste ji prosím ohodnotit v App Store? Zabere to jen chvilku. Díky za Vaši podporu!";
|
||||
"Rate %@" = "Ohodnotit %@";
|
||||
"No, Thanks" = "Ne, díky";
|
||||
"Remind me later" = "Možná později";
|
||||
4
appirater-master/da.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/da.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Hvis du synes om at bruge %@, vil du have noget imod at bruge et kort øjeblik på at bedømme det? Det tager kun et minut. Tak for din støtte!";
|
||||
"Rate %@" = "Bedøm %@";
|
||||
"No, Thanks" = "Nej tak";
|
||||
"Remind me later" = "Påmind mig senere";
|
||||
4
appirater-master/de.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/de.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Sie nutzen %@ gerne? Dann nehmen Sie sich bitte für eine Bewertung einen Moment Zeit! Es dauert nicht länger als eine Minute. Vielen Dank!";
|
||||
"Rate %@" = "Bewerte %@";
|
||||
"No, Thanks" = "Nein, Danke";
|
||||
"Remind me later" = "Später erinnern";
|
||||
4
appirater-master/el.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/el.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Αν σου αρέσει το %@, θα μπορούσες να αφιερώσεις μια στιγμή για να το βαθμολογήσεις; Η διαδικασία είναι πολύ σύντομη. Ευχαριστούμε για τη στήριξη!";
|
||||
"Rate %@" = "Βαθμολόγηση του %@";
|
||||
"No, Thanks" = "Όχι, ευχαριστώ";
|
||||
"Remind me later" = "Υπενθύμιση αργότερα";
|
||||
4
appirater-master/en.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/en.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!";
|
||||
"Rate %@" = "Rate %@";
|
||||
"No, Thanks" = "No, Thanks";
|
||||
"Remind me later" = "Remind me later";
|
||||
4
appirater-master/es.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/es.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Si le gusta utilizar %@, ¿le importaría valorarlo? No le llevará más de un minuto. ¡Gracias por su colaboración!";
|
||||
"Rate %@" = "Valorar %@";
|
||||
"No, Thanks" = "No, gracias";
|
||||
"Remind me later" = "Recordar más tarde";
|
||||
4
appirater-master/fi.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/fi.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Jos käytät mielelläsi %@, voisitko käyttää hetken ja arvostella sen? Se ei kestä minuuttia kauempaa. Kiitos tuestasi!";
|
||||
"Rate %@" = "Arvioi %@";
|
||||
"No, Thanks" = "Ei kiitos";
|
||||
"Remind me later" = "Muistuta minua myöhemmin";
|
||||
4
appirater-master/fr.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/fr.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Si vous aimez %@, voulez-vous prendre un moment pour l'évaluer? Cela ne vous prendra pas plus d'une minute. Merci de votre soutien!";
|
||||
"Rate %@" = "Notez %@";
|
||||
"No, Thanks" = "Non, Merci";
|
||||
"Remind me later" = "Rappelez-moi plus tard";
|
||||
4
appirater-master/he.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/he.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "אם נהנת להשתמש ב %@, האם תסכים לדרג אותה? זה לא יקח יותר מדקה. תודה על התמיכה!";
|
||||
"Rate %@" = "דרג את %@";
|
||||
"No, Thanks" = "לא תודה";
|
||||
"Remind me later" = "מאוחר יותר";
|
||||
4
appirater-master/hu.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/hu.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Ha tetszik a %@, ne felejtsd el értékelni az App Store-ban! Csak egy perc az egész. Köszönet a támogatásért!";
|
||||
"Rate %@" = "%@ értékelése";
|
||||
"No, Thanks" = "Most inkább nem";
|
||||
"Remind me later" = "Emlékeztess később";
|
||||
4
appirater-master/it.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/it.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Se trovi utile %@, perchè non spendere qualche momento per dare una valutazione? Non richiederà più di un minuto. Grazie per il supporto!";
|
||||
"Rate %@" = "Valuta %@";
|
||||
"No, Thanks" = "No, grazie";
|
||||
"Remind me later" = "Ricordamelo più tardi";
|
||||
4
appirater-master/ja.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/ja.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "楽しんでいただけたならば簡単なご意見をお願いします。%@を評価しますか?";
|
||||
"Rate %@" = "%@の評価";
|
||||
"No, Thanks" ="いいえ";
|
||||
"Remind me later" = "後で見る";
|
||||
4
appirater-master/ko.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/ko.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "%@ 사용이 맘에 드셨나요? 잠시만 시간을 내서 평가를 부탁드리겠습니다. 감사합니다!";
|
||||
"Rate %@" = "%@ 평가하기";
|
||||
"No, Thanks" = "평가하지 않겠습니다";
|
||||
"Remind me later" = "다음에 평가하겠습니다";
|
||||
4
appirater-master/nb.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/nb.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Hvis du liker å bruke %@, kan du ta deg et øyeblikk for å vurdere den? Det vil ikke ta mer enn ett minutt. Takk for din støtte!";
|
||||
"Rate %@" = "Vurder %@";
|
||||
"No, Thanks" = "Nei, takk du";
|
||||
"Remind me later" = "Påminn meg senere";
|
||||
4
appirater-master/nl.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/nl.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Als het gebruik van %@ je bevalt, zou je dan een momentje de tijd willen nemen om het te beoordelen? Het duurt nog geen minuut. Bedankt voor je steun!";
|
||||
"Rate %@" = "%@ beoordelen";
|
||||
"No, Thanks" = "Nee, bedankt";
|
||||
"Remind me later" = "Herinner me er later aan";
|
||||
4
appirater-master/pl.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/pl.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Jeżeli podoba Ci się korzystanie z %@, może zechciałbyś poświęcić chwilę czasu, aby ocenić aplikację? Nie zajmie Ci to więcej niż minutę. Dziękujemy za pomoc!";
|
||||
"Rate %@" = "Oceń %@";
|
||||
"No, Thanks" = "Nie, dziękuję";
|
||||
"Remind me later" = "Przypomnij później";
|
||||
4
appirater-master/pt.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/pt.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Se você gosta de usar o %@, que tal avaliá-lo? Não levará mais de um minuto. Agradecemos o seu apoio!";
|
||||
"Rate %@" = "Avaliar o %@";
|
||||
"No, Thanks" = "Não, obrigado";
|
||||
"Remind me later" = "Mais tarde";
|
||||
4
appirater-master/ru.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/ru.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Если Вам понравилась %@, пожалуйста поставьте свою оценку. Это займет у Вас не более одной минуты.\n Спасибо за поддержку!";
|
||||
"Rate %@" = "Оценить %@";
|
||||
"No, Thanks" = "Нет, спасибо";
|
||||
"Remind me later" = "Напомнить позже";
|
||||
4
appirater-master/sk.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/sk.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Pokiaľ sa Vám páči aplikácia %@, mohli by ste ju prosím ohodnotiť v App Store? Zaberie to len chvíľu. Vďaka za Vašu podporu!";
|
||||
"Rate %@" = "Ohodnotiť %@";
|
||||
"No, Thanks" = "Nie, ďakujem";
|
||||
"Remind me later" = "Pripomenúť neskôr";
|
||||
4
appirater-master/sv.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/sv.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Om du tycker att %@ är ett praktiskt verktyg, kan du tänka dig att betygsätta det åt oss? Det tar bara en minut. Tack för hjälpen!";
|
||||
"Rate %@" = "Betygsätt %@";
|
||||
"No, Thanks" = "Nej tack";
|
||||
"Remind me later" = "Påminn mig senare";
|
||||
4
appirater-master/tr.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/tr.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "Eğer %@ uygulamasını kullanmaktan keyif alıyorsanız, onu değerlendirmek için zaman ayırabilir misiniz? Desteğiniz için teşekkür ederiz!";
|
||||
"Rate %@" = "%@ uygulamasını değerlendir";
|
||||
"No, Thanks" = "Hayır, teşekkürler";
|
||||
"Remind me later" = "Daha sonra hatırlat";
|
||||
4
appirater-master/zh-Hans.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/zh-Hans.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "如果你喜欢使用%@,你介意花一点时间给它评分吗?不会超过一分钟。感谢您的支持!";
|
||||
"Rate %@" = "给%@评分";
|
||||
"No, Thanks" = "不,谢谢";
|
||||
"Remind me later" = "稍后提醒我";
|
||||
4
appirater-master/zh-Hant.lproj/AppiraterLocalizable.strings
Executable file
4
appirater-master/zh-Hant.lproj/AppiraterLocalizable.strings
Executable file
@@ -0,0 +1,4 @@
|
||||
"If you enjoy using %@, would you mind taking a moment to rate it? It won't take more than a minute. Thanks for your support!" = "如果你喜歡使用%@,你介意花一點時間給它評分嗎?不會超過一分鐘。感謝您的支持!";
|
||||
"Rate %@" = "給%@評分";
|
||||
"No, Thanks" = "不,謝謝";
|
||||
"Remind me later" = "稍後提醒我";
|
||||
Reference in New Issue
Block a user