omz / appsales-mobile Goto Github PK
View Code? Open in Web Editor NEWApp Sales allows iPhone and Mac App Store developers to download and analyze their daily and weekly sales reports from iTunes Connect.
Home Page: http://omz-software.com
App Sales allows iPhone and Mac App Store developers to download and analyze their daily and weekly sales reports from iTunes Connect.
Home Page: http://omz-software.com
Great app! Been using it for a little over 1 month. As of nov. 17th I stopped recieving any new data from iTunes connect. I keep hitting refresh but nothing seems to change. No new information is appearing. Any suggestions would be appreciated!
-Brendan
There is a way to download all given comments from the AppStore for your application. The way to talk to the store and get them is described in a Script by Erica Sadun (http://blogs.oreilly.com/iphone/2008/08/scraping-appstore-reviews.html ).
Is there a way to integrate such a functionality to appsales mobile?
In the weekly report tableview, when I select any week outside of the current month the app crashes. I just compiled and install this app on a 3Gs runing 4.0.2OS. Is it just me? BTW, love this app so far.
I try to build the source code with the latest released SDK.
I get builderrors: foundation.h not found, UIKit.h not found.
Tried to remove + add the foundation framework, but now I get even more errors: about 3000 build errors ....
Anyone who can help me out?
When you select a review from the Reviews controller some text shown in the tableview for each review is not shown correctly. For example, an apostrophe is shown as ' These appear to be the HTML entity codes. When the review is selected the full review is shown, and these characters are translated correctly.
Is there a simple fix to have these characters shown correctly in the main reviews tableview?
Thanks
Dear Evan,
Do you have a Paypal a/c to accept donation? It's such great piece of software for iPhone developer to keep tract of sales and the presentation is so well crafted and layout is so beautiful.
If you need another suggestion, it'd be nice to add "Ranking" information.
Thanks
horace
appsales doesn't compute the percentage of sales correctly, I think what is going on is that the percentage number is computed based on the number of downloads and not revenue, even when you are looking at regional revenue pie chart. So you can get a line like this:
AU: 10% ($0)
Clearly the AU region can't be 10% of sales if it had 0 dollars revenue... If you look carefully you see that the percentage numbers on the list don't match the pie slices drawn.
I've noticed a couple of issues with the graph views. First, the percentages reported for the various regions, and sorting order always use the sales statistics, even when in revenue mode.
Also, in revenue mode, I personally prefer fractions to be displayed.
I use this patch to make these changes against the git code to handle this (the first 3 hunks take care of the first part of this issue, the last hunk enables fraction display):
diff -ru AppSales-Mobile-pristine/Classes/RegionsGraphView.m AppSales-Mobile/Classes/RegionsGraphView.m --- AppSales-Mobile-pristine/Classes/RegionsGraphView.m 2010-07-09 13:50:31.000000000 -0500 +++ AppSales-Mobile/Classes/RegionsGraphView.m 2010-07-13 13:40:42.000000000 -0500 @@ -150,7 +150,10 @@ for (NSString *region in sortedRegions) { totalRevenue += [[revenueByRegion objectForKey:region] floatValue]; } - sortedRegions = [unitsByRegion keysSortedByValueUsingSelector:@selector(compare:)]; + if (showUnits) + sortedRegions = [unitsByRegion keysSortedByValueUsingSelector:@selector(compare:)]; + else + sortedRegions = [revenueByRegion keysSortedByValueUsingSelector:@selector(compare:)]; //draw title: [[UIColor darkGrayColor] set]; @@ -191,7 +194,12 @@ if (colorIndex < 0) colorIndex = [colors count] - 1; float units = [[unitsByRegion objectForKey:region] floatValue]; - float percentage = units / totalUnits; + float revenue = [[revenueByRegion objectForKey:region] floatValue]; + float percentage; + if (showUnits) + percentage = units / totalUnits; + else + percentage = revenue / totalRevenue; CGContextBeginPath(c); CGContextMoveToPoint(c, center.x, center.y); float angle = lastAngle + (percentage * -M_PI * 2); @@ -214,7 +222,12 @@ NSString *region = [sortedRegions objectAtIndex:j]; float revenue = [[revenueByRegion objectForKey:region] floatValue]; float units = [[unitsByRegion objectForKey:region] floatValue]; - float percentage = units / totalUnits; + float percentage; + if (showUnits) + percentage = units / totalUnits; + else + percentage = revenue / totalRevenue; + UIColor *color = [colors objectAtIndex:colorIndex]; colorIndex--; if (colorIndex < 0) colorIndex = [colors count] - 1; @@ -233,7 +246,7 @@ if (showUnits) legendString = [NSString stringWithFormat:@"%@%% (%i)", percentString, (int)units]; else - legendString = [NSString stringWithFormat:@"%@%% (%@)", percentString, [[CurrencyManager sharedManager] baseCurrencyDescriptionForAmount:[NSNumber numberWithFloat:revenue] withFraction:NO]]; + legendString = [NSString stringWithFormat:@"%@%% (%@)", percentString, [[CurrencyManager sharedManager] baseCurrencyDescriptionForAmount:[NSNumber numberWithFloat:revenue] withFraction:YES]]; [legendString drawInRect:CGRectMake(205, y + 3, 110, 10) withFont:[UIFont boldSystemFontOfSize:11.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentLeft]; i++; }
the in app sales are shown as free because the transactionType start with "IA".
To solve this problem I add this in initWithCSV:(NSString *)csv method of Day class:
if([transactionType rangeOfString:@"IA"].location == 0){
transactionType = [transactionType substringFromIndex:2];
}
So the in app purchais is shown like an app!
Sorry for my english...
Nicola
Love the new reviews integrated into the app! However, it seems as if only the last 25 reviews per country are being retrieved (the first page of reviews as shown in iTunes).
In order to have a correct review count and average rating, it would be great if all reviews could be downloaded.
I recently migrated from an individual account to a company account, and the seller name got switched over it with it. Now when I log into itts.apple.com, the very first screen asks me to select a vendor. The choices are my personal name and my company name, each having its own unique vendor id.
When I try to download the latest reports, app sales crashes because of this.
This isn't really an issue its more of a request. It would be great if appsales-mobile would total up all of the weekly sales reports and the daily reports. I find it quite annoying having to add up my sales reports every week I get a new weekly report. It would be great if this was included.
Josh
First of all... great app!
The IA9 code is not managed. It is a payed in-app subscription.
I've added this line in Day.m - initWithCSV:
if ([transactionType isEqualToString:@"IA9"]) transactionType = @"1";
Need to check for invalid buttonIndexes in the clickedButtonAtIndex selector, adding the following fixes it:
Just confirmed that Import / Export works fine on my iPad (iOS 3.2) using the most recent build. However, neither iOS 4 device (iPhone / iPod Touch) allow access to the Import / Export web page.
With the new operating system, I am having troubles saving data. I can load the data fine, but in iOS4, when you press the home button it leaves it semi-open.... So you can still double tap the home button and it shows up as it is in the background. If I close it from there, or shut off my phone, none of my reports will have saved.
Just wanted to give everyone a heads up.
I tried to get my sales reports this morning (6/10/10) and it was reporting "no new reports found" due to some changes they made to the reporting system.
I fixed it by making the same kind of changes we did in Feb. 2010
CHANGED
if (i==0) {
downloadType = @"Daily";
downloadActionName = @"17.13.1";
}
else {
downloadType = @"Weekly";
downloadActionName = @"17.15.1";
}
AND
downloadType, @"17.11",
downloadType, @"hiddenDayOrWeekSelection",
@"Summary", @"17.9",
@"ShowDropDown", @"hiddenSubmitTypeName", nil];
AND
downloadType, @"17.11",
dayString, @"hiddenDayOrWeekSelection",
@"Download", @"hiddenSubmitTypeName",
@"ShowDropDown", @"hiddenSubmitTypeName",
@"Summary", @"17.9",
TO NEW CALUES OF
if (i==0) {
downloadType = @"Daily";
downloadActionName = @"19.15.1";
}
else {
downloadType = @"Weekly";
downloadActionName = @"19.17.1";
}
AND
downloadType, @"19.13",
downloadType, @"hiddenDayOrWeekSelection",
@"Summary", @"19.11",
@"ShowDropDown", @"hiddenSubmitTypeName", nil];
AND
downloadType, @"19.13",
dayString, @"hiddenDayOrWeekSelection",
@"Download", @"hiddenSubmitTypeName",
@"ShowDropDown", @"hiddenSubmitTypeName",
@"Summary", @"19.11",
ReportManager.m in method fetchReportsWithUserInfo: crashes on me for the "Choose vendor" page.
The code block begins on line 175, apparently Christian Beer contributed the code.
My guess is that the html changed.
LIne 181 and 181 were:
[scanner scanUpToString:@"<option value="null">" intoString:NULL];
[scanner scanString:@"<option value="null">" intoString:NULL];
Doing this doesn't find the vendor ID for me. I had to change it to the following:
[scanner scanUpToString:@"<option value="0">" intoString:NULL];
[scanner scanString:@"<option value="0">" intoString:NULL];
That is only the first problem though...
The code around line 240-242 doesn't work anymore:
[scanner scanUpToString:@"<td class="content">" intoString:NULL];
[scanner scanUpToString:@"<a href="" intoString:NULL];
[scanner scanString:@"<a href="" intoString:NULL];
The it doesn't find the URL it is looking for (in the table?). The problem is that I don't know what the URL is supposed to be. I've gone through the HTML and made it find URLs I thought might work, but they don't. I don't know what to do with this, I don't know what it is looking for.
Any help would be appreciated.
Following is the html source for the Vendor ID page:
In GUI-Land, you choose a vendor ID, then click the "Submit" button.
</HEAD>
<BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" MARGINHEIGHT="0" MARGINWIDTH="0" TOPMARGIN="0" RIGHTMARGIN="0">
<center>
<div style="width:100%;background-color:#ffffff; float: middle;">
<img width="1" height="8" src="/WebObjects/piano.woa/Contents/WebServerResources/spacer.gif"/>
<br/>
<div class="ipoditunes" id="globalheader">
<ul id="globalnav">
<li id="gn-apple">
<a href="http://www.apple.com/">Apple</a>
</li>
<li id="gn-store">
<a href="http://store.apple.com/">Store</a>
</li>
<li id="gn-mac">
<a href="http://www.apple.com/mac/">Mac</a>
</li>
<li id="gn-ipoditunes">
<a href="http://www.apple.com/itunes/">iPod + iTunes</a>
</li>
<li id="gn-iphone">
<a href="http://www.apple.com/iphone/">iPhone</a>
</li>
<li id="gn-downloads">
<a href="http://www.apple.com/downloads/">Downloads</a>
</li>
<li id="gn-support">
<a href="http://www.apple.com/support/">Support</a>
</li>
</ul>
<div id="globalsearch"> </div>
</div>
</div>
</center>
<input Id="roleHidden" type="hidden" value="1" name="2" /><input type="hidden" name="3" />
<TABLE BORDER=0 CELLPADDING=4 CELLSPACING=0 WIDTH="99%">
<TR>
<TD ALIGN=center>
|
Here is the source for the following page which chooses the daily report:
<TITLE>iTunes Label Connect</TITLE> <script language="javascript"> function showButton(obj) { if(obj.value=="3") { ``` } } function FillDate(strDropdown){ } function FillWeek(strDropdown){ } function handleSelReportType() { if(document.getElementById('selReportType').value=='Select Report Type') return false; if(eval(document.getElementById('dayorweekdropdown'))){ if(document.getElementById('selDateType').value=='Select Date Type'){ alert("Please select a Date Type"); return false; } } if(document.getElementById('selReportType').value=='Summary'){ document.frmVendorPage.hiddenSubmitTypeName.value="Summary"; document.frmVendorPage.submit(); } else{ document.frmVendorPage.hiddenSubmitTypeName.value="ClearSummary"; document.frmVendorPage.submit(); } } function handleSelDateType() { if(document.getElementById('selReportType').value=='Select Report Type'){ if(!(document.getElementById('selDateType').value=='Select Date Type')) alert("Please select a Report Type"); if(document.getElementById('selDateType').value=='Weekly') document.frmVendorPage.hiddenDayOrWeekSelection.value="Weekly"; if(document.getElementById('selDateType').value=='Daily') document.frmVendorPage.hiddenDayOrWeekSelection.value="Daily"; return false; } if(document.getElementById('selDateType').value=='Weekly'){ document.frmVendorPage.hiddenDayOrWeekSelection.value="Weekly"; document.frmVendorPage.hiddenSubmitTypeName.value="ShowDropDown"; document.frmVendorPage.submit(); } if(document.getElementById('selDateType').value=='Daily'){ document.frmVendorPage.hiddenDayOrWeekSelection.value="Daily"; document.frmVendorPage.hiddenSubmitTypeName.value="ShowDropDown"; document.frmVendorPage.submit(); } if(document.getElementById('selDateType').value=='Monthly Free'){ document.frmVendorPage.hiddenDayOrWeekSelection.value="Monthly Free"; document.frmVendorPage.hiddenSubmitTypeName.value="ShowDropDown"; document.frmVendorPage.submit(); } ``` //////////////// The below part of code has been commented to solve the issue comming while selecting "select date Type" and click on Download ///////////////////////// // // disable the button activity on change : Begin // window.document.getElementById('idlnkprevious').href = "#"; // window.document.getElementById('idlnkdownload').href = "#"; // window.document.getElementById('idlnkpreview').href = "#"; // // disable the button activity on change : End //////////////// The above part of code has been commented to solve the issue comming while selecting "select date Type" and click on Download ///////////////////////// ``` } function submitThisForm(){ } function validateData(inValue){ jsClearErrorMsg(); if(document.getElementById('selDateType').value=='Select Date Type' && document.getElementById('selReportType').value=='Select Report Type') alert("Please select a Report Type and Date Type"); else if(document.getElementById('selReportType').value=='Select Report Type') alert("Please select a Report Type"); else if(document.getElementById('selDateType').value=='Select Date Type') alert("Please select a Date Type"); else if(document.getElementById('dayorweekdropdown').value=='Select Value') alert("Please select a value for Daily or Weekly"); else if(document.getElementById('dayorweekdropdown').value=='') alert("There is no date for this selection"); else{ document.frmVendorPage.hiddenDayOrWeekSelection.value=document.getElementById('dayorweekdropdown').value; document.frmVendorPage.hiddenSubmitTypeName.value=inValue; document.frmVendorPage.submit(); } } function jsClearErrorMsg() { window.document.getElementById('iddownloadmsg').innerHTML = ""; } ``` </script> <tr>
<td colspan="3" height="10px"></td>
</tr>
<tr>
<td colspan="3"><font color="black" size="2%"><ul type="square"><li style="margin-left:-10px;">Please note that reports are purged on a regular basis (daily after 7 days and weekly after 13 weeks).</li>
<li style="margin-left:-10px;">Sales/Trend reports are for directional purposes only, do not use for financial statement purpose.</li></ul></font></td>
</tr>
<tr>
<td background="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_top.gif" align="left" width="18"><img src="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_topl.gif" width="18" height="15" alt="" border="0"></td>
<td background="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_top.gif"><img src="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_top.gif" height="15" width="698" alt="" border="0"></td>
<td align="left"><img src="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_topr.gif" width="19" height="15" alt="" border="0"></td>
| |||||
Reporting > Transaction Reports | |||||
|
|||||
|
I've been unable to load the daily reports for the last 2-3 days. I see the message "Downloading Daily Reports..." but then nothing happens. Perhaps there's been a change in iTunes Connect that is causing this?
I have a new app, and it will show up in the reports and Reviews, but without a thumbnail.
In reviews it is just blank, in reports there is an 'app' icon
Cannot download weekly report after Nov. 22
Just thought I'd let you know if it isn't something that you want to happen/is agains the license.
I have files that I kept from my previous iPhone and want to move the data to my new iPhone. How do I get the previous files to show up on the new iPhone? I thought I saw a way to do this in the old google group, but that no longer exists.
Hi,
I have just recompilled App Sales-Mobile using the newly released iOS4 SDK.
The build has succeeded, but has 14 Warnings. These range from Depreciated functions to Invalid number of segments of a segmeted control.
Can you tell me if a new iOS4 compatible version will be available?
Thanks.
This is an improvement to the existing main screen buttons for the iPhone. It does some better color coding and also shows the last 3 days and last 3 weeks of total revenue on the Days and Weeks buttons. The graphs have also been extended to show 30 days for the Days graph, and it will show lifetime for the Weeks graph with labels beneath.
In RootViewController.m:
- (UIImage *)sparklineForReports:(NSArray *)days
{
UIGraphicsBeginImageContext(CGSizeMake(180, 37));
CGContextRef c = UIGraphicsGetCurrentContext();
NSSortDescriptor *dateSorter = [[[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO] autorelease];
NSArray *sortedDays = [days sortedArrayUsingDescriptors:[NSArray arrayWithObject:dateSorter]];
Day *lastDay = [sortedDays objectAtIndex:0];
if ( ( !lastDay.isWeek ) && ( [sortedDays count] > 30 ) )
{
// Limit days to 30, but show all weeks in graph so we can see a lifetime summary
sortedDays = [sortedDays subarrayWithRange:NSMakeRange(0, 30)];
}
BOOL reportIsLatest = NO;
if ([sortedDays count] > 0) {
Day *lastDay = [sortedDays objectAtIndex:0];
NSTimeInterval reportAge = [[NSDate date] timeIntervalSince1970] - [lastDay.date timeIntervalSince1970];
if (!lastDay.isWeek && reportAge < 172800) { //48 hours
reportIsLatest = YES;
}
else if (lastDay.isWeek && reportAge < 1209600) { //14 days
reportIsLatest = YES;
}
}
NSMutableArray *unitSales = [NSMutableArray array];
int maxUnitSales = 0;
for (Day *d in [sortedDays reverseObjectEnumerator]) {
float revenue = [d totalRevenueInBaseCurrency];
if (revenue > maxUnitSales)
maxUnitSales = (int)revenue;
[unitSales addObject:[NSNumber numberWithFloat:revenue]];
}
//Use number of sales if no revenue was made (e.g. for free apps):
if (maxUnitSales == 0) {
[unitSales removeAllObjects];
maxUnitSales = 0;
for (Day *d in [sortedDays reverseObjectEnumerator]) {
int units = [d totalUnits];
if (units > maxUnitSales)
maxUnitSales = units;
[unitSales addObject:[NSNumber numberWithInt:units]];
}
}
[[UIColor grayColor] set];
float maxY = 27.0;
float minY = 3.0;
float minX = 2.0;
float maxX = 75.0;
int i = 0;
float prevX = 0.0;
float prevY = 0.0;
CGMutablePathRef path = CGPathCreateMutable();
CGContextBeginPath(c);
if ( lastDay.isWeek )
[@"Lifetime" drawInRect:CGRectMake(minX, 26, maxX-minX, 15) withFont:[UIFont boldSystemFontOfSize:9.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentCenter];
else
[@"Last 30 Days" drawInRect:CGRectMake(minX, 26, maxX-minX, 15) withFont:[UIFont boldSystemFontOfSize:9.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentCenter];
for (NSNumber *sales in unitSales) {
float r = [sales floatValue];
float y = maxY - ((r / maxUnitSales) * (maxY - minY));
float x = minX + ((maxX - minX) / ([unitSales count] - 1)) * i;
if (prevX == 0.0) {
CGPathMoveToPoint(path, NULL, x, y);
}
else {
CGPathAddLineToPoint(path, NULL, x, y);
}
prevX = x;
prevY = y;
i++;
}
if ([unitSales count] > 1) {
CGContextSetLineWidth(c, 1.0);
CGContextSetLineJoin(c, kCGLineJoinRound);
CGContextSetLineCap(c, kCGLineCapRound);
CGMutablePathRef fillPath = CGPathCreateMutableCopy(path);
CGPathAddLineToPoint(fillPath, NULL, prevX, maxY);
CGPathAddLineToPoint(fillPath, NULL, minX, maxY);
[[UIColor colorWithWhite:0.95 alpha:1.0] set];
CGContextAddPath(c, fillPath);
CGContextFillPath(c);
CGPathRelease(fillPath);
[[UIColor grayColor] set];
CGContextAddPath(c, path);
CGContextStrokePath(c);
NSNumber *lastDayUnits = [unitSales lastObject];
NSNumber *lastButOneDayUnits = [unitSales objectAtIndex:[unitSales count]-2];
float percentage = ([lastDayUnits floatValue] - [lastButOneDayUnits floatValue]) / [lastButOneDayUnits floatValue];
int roundedPercent = (int)(percentage * 100.0);
NSString *percentString = (roundedPercent < 0) ? [NSString stringWithFormat:@"%i%%", roundedPercent] : [NSString stringWithFormat:@"+%i%%", roundedPercent];
[(reportIsLatest) ? ([UIColor blackColor]) : ([UIColor darkGrayColor]) set];
if (roundedPercent < 0)
[[UIColor colorWithRed:0.84 green:0.11 blue:0.06 alpha:1.0] set];
else
[[UIColor colorWithRed:0.11 green:0.84 blue:0.06 alpha:1.0] set];
[percentString drawInRect:CGRectMake(80, 7, 40, 15) withFont:[UIFont boldSystemFontOfSize:12.0]];
CGContextFillEllipseInRect(c, CGRectMake(prevX-2.5, prevY-2.5, 5, 5));
}
// Show the last 3 days/weeks of total revenue to the right of the graph
NSNumberFormatter *numberFormatter = [[NSNumberFormatter new] autorelease];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
[numberFormatter setMinimumFractionDigits:2];
[numberFormatter setMaximumFractionDigits:2];
[numberFormatter setMinimumIntegerDigits:1];
[numberFormatter setPerMillSymbol:@","];
[[UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1.0] set];
int nOffset = 0;
if ([unitSales count] > 1+nOffset)
{
if ( reportIsLatest )
{
// We have the latest report
NSNumber *number = [unitSales objectAtIndex:[unitSales count]-1+nOffset];
NSString *string = [ numberFormatter stringFromNumber:[ NSNumber numberWithFloat:[number floatValue] ] ];
[[NSString stringWithFormat:@"%@%@", [[CurrencyManager sharedManager] baseCurrencyDescription], string] drawInRect:CGRectMake(120, -3, 60, 15) withFont:[UIFont boldSystemFontOfSize:12.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentRight];
}
else
{
// We don't have the latest report, so show ----'s so we know by just looking that we aren't up to date
nOffset = 1; // Shift the two most recent reports down one line
[[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0] set];
[[NSString stringWithFormat:@"- - - - . - -"] drawInRect:CGRectMake(120, -3, 60, 15) withFont:[UIFont boldSystemFontOfSize:12.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentRight];
[[UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1.0] set];
}
}
if ([unitSales count] > 2-nOffset)
{
NSNumber *number = [unitSales objectAtIndex:[unitSales count]-2+nOffset];
NSString *string = [ numberFormatter stringFromNumber:[ NSNumber numberWithFloat:[number floatValue] ] ];
[[NSString stringWithFormat:@"%@%@", [[CurrencyManager sharedManager] baseCurrencyDescription], string] drawInRect:CGRectMake(120, 10, 60, 15) withFont:[UIFont boldSystemFontOfSize:12.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentRight];
}
if ([unitSales count] > 3-nOffset)
{
NSNumber *number = [unitSales objectAtIndex:[unitSales count]-3+nOffset];
NSString *string = [ numberFormatter stringFromNumber:[ NSNumber numberWithFloat:[number floatValue] ] ];
[[NSString stringWithFormat:@"%@%@", [[CurrencyManager sharedManager] baseCurrencyDescription], string] drawInRect:CGRectMake(120, 23, 60, 15) withFont:[UIFont boldSystemFontOfSize:12.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentRight];
}
[[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0] set];
CGPathRelease(path);
UIImage *trendImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return trendImage;
}
Many reviews come for other countries where English (or German) is not the lingua Franca (per se - natch). Having a link that would submit the text to Google translate using the country of origin (with it's most common language as the source) and a destination langauge from a preference, would be great.
Or at least enable copying of the text to bring it into a browser ourselves.
PS. Great work! I use it all the time!
Anybody know why the sales report data is available (in the UK anyway) within the Apple iTC Mobile App hours before they're downloadable within AppSales?
Reviews for in-app sales are copies of reviews for the app in which they appear, so having them download and appear in the list of reviews is a waste of time and resources.
I am happy to make the change that excludes in-app purchases from the code that grabs reviews online if someone would provide the information I need to get those changes into the main code branch or get those changes to the developer so that he can commit them. I don't want to have local changes to the code that don't carry over to new revisions.
Since the Entitlements.plist was added to the project, it won't allow you to install it on a device, giving the error in the title.
Fix: Command + I on the target (AppSalesMobile), go to the Build tab and double click on the Code Signing -> Code Signing Entitlements. Erase "Entitlements.plist" and you'll be able to compile and install the application on the device.
Since you introduced the 2modes for the graphs (by revenue and by sales) the differences on the home screen (daily and weekly) are messed up. I dont't know if they show differences by sales, but it's not by revenue. Toggling the mode from the graphs screen doesnt seem to affect this.
I was using an older version of the app because of this behavior, but the recent itunesconnect change broke it and it doesnt work at all.
When importing reports into AS-M, I've found that reviews are not downloaded for products where the only reported sales have come in through the import mechanism. Only sales that have been downloaded are captured for review downloads. This patch corrects that:
diff -ru AppSales-Mobile-pristine/Classes/ReportManager.m AppSales-Mobile/Classes/ReportManager.m --- AppSales-Mobile-pristine/Classes/ReportManager.m 2010-07-09 13:50:31.000000000 -0500 +++ AppSales-Mobile/Classes/ReportManager.m 2010-07-13 13:41:08.000000000 -0500 @@ -638,6 +638,19 @@ [weeks setObject:report forKey:report.date]; } else { [days setObject:report forKey:report.date]; + for (Country *c in [report.countries allValues]) { + for (Entry *e in c.entries) { + NSString *appID = e.productIdentifier; + NSString *appName = e.productName; + if (appID && ![self.appsByID objectForKey:appID]) { + App *app = [[App new] autorelease]; + app.appID = appID; + app.appName = appName; + app.reviewsByUser = [NSMutableDictionary dictionary]; + [appsByID setObject:app forKey:appID]; + } + } + } } }
The date stored with the individual day data is time-zone dependent - if some reports are downloaded in a different time zone than others, the list of days will show missing and duplicate days.
Freshly imported days (through the web interface) don't show up in the date selector in graph view.
You have to quit the app first and relaunch to make them appear.
after a failed download session (due to bad connection) it seems that a day was badly downloaded.
This day wouldn't appear in the list (so I couldn't delete it) and wouldn't be downloaded.
I have fixed this instance of the issue by using the debugger and manually calling the deleteDay but I think that corrupted days should either be detected and automatically cleaned or should show in the list so they can be manually deleted.
I have the .dat file corresponding to the corrupted day, but I can't upload it to the issue.
I have 45 reviews with my app.
After downloading it says 45 reviews (43 new)
I mark them all as read (with the button "Mark all as read") and push the Download button.
Again 45 reviews (43 new)
This happened a little while ago after an update.
I think you should add [[UIApplication sharedApplication] setIdleTimerDisabled:YES/NO] in the updateProgress and updateStatus functions, so that while reports or reviews are being downloaded, the device won't go into sleep mode (like when downloading reviews for all countries, which can take a long time). I've already made those changes in my version, and it works better this way (for me at least).
Everything was working great before but after syncing today several days including today turned to Nan (not a number)
Needs passcode lock on startup.
(I will eventually provide code here).
Hi, I did import my reports by using build-in update and import a ZIP file which contains reports in txt format. The build-in works great but the import one got wrong application name since it is in Chinese...
I recently upgraded to the newest build from quite an old build.
Old data disappeared from the day list for me, even though it was in the Documents directory. Reverting the following commit fixed for me:
http://github.com/omz/AppSales-Mobile/commit/69e602f27e960c2d42b415550a43047a4c74575b#comment_36212
Free apps are displayed as blank graphs when the mode is on revenue.
The last weekly report downloaded was for 23 Nov, I haven't had any since on my iPhone. Daily reports are downloaded fine. Strangely enough, when I run it in the simulator it works, and downloads the two missing Weekly reports.
I have updated to the latest version as of today, 16 Dec, still has this issue.
See http://snapplr.com/vhya.
At some positions the text on top of the graph or below it appears blurry. Looks like its placed on a half pixel or so.
I work on three different companies so it would be nice to store all three logins and the data is saved in separately for those three.
For reviews on the App Store Japan, AppSales shows "Was this review helpful?" as the reviewer’s user name.
On line 56 of ReportManager.m, you have "NSDateFormatter * lFormat = [NSDateFormatter new];". This NSDateFormatter is never released.
I have code to generate a master.log file that includes all days and weeks of sales even from earlier versions of AppSalesMobile. I had 450+ days of sales held hostage on my iPhone, so I wrote these functions to export all of the data so I could back up all of my sales numbers and get the data onto my iPad. I noticed that the newer version of this app lost details of my weekly sales from a while ago...so these functions will generate new weekly sales reports based on the daily sales data that is stored on the device. If anyone is interested, reply here and I'll post the code or email it to you if you can merge it into the github code base.
I think the spark line is not taking into account the last day retrieved
using XCode 3.2 new "Build and Analyze" finds many errors.
It would be create if the login screen used a UITableView with custom cells instead of a view with a faux table background and some text boxes. UITableViews are always a pain to get data out of and not lose it on redraw, but it is worth it, I think.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.