태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

'appstore'에 해당되는 글 5건

기껏 열심히 app을 만들어 팔려고 appstore에 올렸는 데, 해킹당해서 수익은 없고 널리 퍼지는 꼴을 보면... 참 씁쓸하죠.

물론, 값어치없는 app들도 꽤 많긴 하지만, 어쨌든 만드는 사람의 수고를 무위로 만드는 건 옳지 못한 일이겠죠.

몇가지 해킹방지에 대해 좀 고민을 하고 있는 중인데,

구글링을 하다 이런 방법이 있길래 소개합니다.  [원문 :  http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html]

방법은 간단합니다. app의 Info.plist파일의 변조여부를 판단하는 건데,

1.  app과 Info.plist의 timestamp를 비교해봅니다. 아마 대부분은 같겠죠. 해킹당하지 않았다면.

2. Info.plist의 사이즈를 체크합니다. app에서 Info.plist의 크기를 이미 알고있다면 간단하게 비교할 수 있겠죠.

3. Info.plist의 형태가 binary인지를 확인합니다. Distribution시 Info.plist는 binary로 변환되는데 해킹당하면 다시 XML로 바뀌게 되죠.

4. key-pair에 SignerIdentity, 또는 Apple iPhone OS Application Signing 필드가 있는 지 확인합니다. 원래는 없어야 정상입니다.
    이 키쌍은 application loader에게 이 app은 decrypt되어있고 믿을 수 있다고 속이는 역할을 하게 됩니다.

이러한 방법도 뚫렸다는 이야기도 있지만, 아직 대부분은 이러한 방식으로 막을 수도 있답니다.

좀 더 연구가 필요할 것 같습니다.
신고
블로그 이미지

*별빛*

UI/UX관련 개발이슈 및 방법을 나누는 곳입니다. Flex/AIR, Silverlight등 pc 기반 iPhone, Android등 smartphone 기반


#! /usr/bin/perl
# Autofetch category rank

package itunesRank;

use warnings;
use strict;

# FSWB
my $appName = "Full Screen Web Browser";
my $appID = 303154925;
# my $categoryName = "Top Overall";
my $categoryName = "Utilities";

my %categories = (
	"Top Overall"		=> 25204,
	"Books"				=> 25470,
	"Business"			=> 25148,
	"Education"			=> 25156,
	"Entertainment"		=> 25164,
	"Finance"			=> 25172,
	"Healthcare & Fitness"		=> 25188,
	"Lifestyle"			=> 25196,
	"Medical"			=> 26321,
	"Music"				=> 25212,
	"Navigation"		=> 25220,
	"News"				=> 25228,
	"Photography"		=> 25236,
	"Productivity"		=> 25244,
	"Reference"			=> 25252,
	"Social Networking"	=> 25260,
	"Sports"			=> 25268,
	"Travel"			=> 25276,
	"Utilities"			=> 25284,
	"Weather"			=> 25292,
	"All Games"			=> 25180,
	"Games/Action"		=> 26341,
	"Games/Adventure"	=> 26351,
	"Games/Arcade"		=> 26361,
	"Games/Board"		=> 26371,
	"Games/Card"		=> 26381,
	"Games/Casino"		=> 26341,
	"Games/Dice"		=> 26341,
	"Games/Educational"	=> 26411,
	"Games/Family"		=> 26421,
	"Games/Kids"		=> 26431,
	"Games/Music"		=> 26441,
	"Games/Puzzle"		=> 26451,
	"Games/Racing"		=> 26461,
	"Games/Role Playing"=> 26471,
	"Games/Simulation"	=> 26481,
	"Games/Sports"		=> 26491,
	"Games/Strategy"	=> 26501,
	"Games/Trivia"		=> 26511,
	"Games/Word"		=> 26521,
);

# print "$appName Ranking in Category $categoryName:\n";
# getAppRankingInCategoryForUS($appID, $categories{$categoryName});

print "$appName Ranking in Category Top Overall:\n";
getAppRankingInCategoryForWorld($appID, $categories{"Top Overall"});

print "$appName Ranking in Category $categoryName:\n";
getAppRankingInCategoryForWorld($appID, $categories{$categoryName});

#
# Subroutines
#

sub getAppRankingInCategoryForUS {
	my ($appID, $categoryID) = @_;
	my ($country, $storeID);
	$country = "United States";
	$storeID = 143441;
	# $categoryID = 25284;
	fetchAppCategoryRankForCountry($appID, $categoryID, $country, $storeID);
}

sub getAppRankingInCategoryForWorld {
	my ($appID, $categoryID) = @_;
	my %appStore = (
		143441 => "United States",
		143505 => "Argentina",
		143460 => "Australia",
		143446 => "Belgium",
		143503 => "Brazil",
		143455 => "Canada",
		143483 => "Chile",
		143465 => "China",
		143501 => "Colombia",
		143495 => "Costa Rica",
		143494 => "Croatia",
		143489 => "Czech Republic",
		143458 => "Denmark",
		143443 => "Deutschland",
		143506 => "El Salvador",
		143454 => "Espana",
		143447 => "Finland",
		143442 => "France",
		143448 => "Greece",
		143504 => "Guatemala",
		143463 => "Hong Kong",
		143482 => "Hungary",
		143467 => "India",
		143476 => "Indonesia",
		143449 => "Ireland",
		143491 => "Israel",
		143450 => "Italia",
		143466 => "Korea",
		143493 => "Kuwait",
		143497 => "Lebanon",
		143451 => "Luxembourg",
		143473 => "Malaysia",
		143468 => "Mexico",
		143452 => "Nederland",
		143461 => "New Zealand",
		143457 => "Norway",
		143445 => "Osterreich",
		143477 => "Pakistan",
		143485 => "Panama",
		143507 => "Peru",
		143474 => "Phillipines",
		143478 => "Poland",
		143453 => "Portugal",
		143498 => "Qatar",
		143487 => "Romania",
		143469 => "Russia",
		143479 => "Saudi Arabia",
		143459 => "Schweitz/Suisse",
		143464 => "Singapore",
		143496 => "Slovakia",
		143499 => "Slovenia",
		143472 => "South Africa",
		143486 => "Sri Lanka",
		143456 => "Sweden",
		143470 => "Taiwan",
		143475 => "Thailand",
		143480 => "Turkey",
		143481 => "United Arab Emirates",
		143444 => "United Kingdom",
		143502 => "Venezuela",
		143471 => "Vietnam",
		143462 => "Japan"
	);
	while (my ($storeID, $country) = each(%appStore)) {
		# print "$storeID\n";
		# my $country = $appStores{$storeID};
		fetchAppCategoryRankForCountry($appID, $categoryID, $country, $storeID);
	}
}

sub fetchAppCategoryRankForCountry {
	my ($myAppID, $categoryID, $country, $storeID) = @_;
	my ($rank, $found);
	my @top100= fetchTop100InCategory($storeID, $categoryID);
	for (my $i = 0; $i < $#top100; $i += 3) {
		$rank = $top100[$i];
		my $appID = $top100[$i+1];
		my $title = $top100[$i+2];
	    # print $rank . " " . $title . " " . $appID . "\n";
		if ($appID == $myAppID) {
			$found = 1;
			# print $rank . " " . $title . "\n";
			last;
		}
	}
	if ($found) {
		# $rank = "n/a";
		print "$country: $rank\n";
	}
}

sub fetchTop100InCategory {
	my($storeID, $categoryID) = @_;

	# 30 == paid
	# 27 == free
	my $popId = 30;

	my $fetchcmd = qq{curl -s -A "iTunes/4.2 (Macintosh; U; PPC Mac OS X 10.2" -H "X-Apple-Store-Front: $storeID-1" 'http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?id=$categoryID&popId=$popId' };
	# Might need to pipe through these...
	# | gunzip
	# | xmllint --format -

	my $doc = `$fetchcmd`;

	# DEBUG: read from local file
	# my $filename = '/Users/phatblat/tmp/itunes_utilties_top100.xml';
	# open (FILE, "<", $filename)  or  die "Failed to read file $filename : $! \n";
	# my $doc;
	# {
	#     local $/;
	#     $doc = ;
	# }
	# close(FILE);

	my @top100;
	while ($doc =~ m#(\d+)\.\.*?viewSoftware\?id=(\d+).*?draggingName="([^"]+)"#gs) {
		# 1 => rank
		# 2 => app ID
		# 3 => app name
	    # print $1 . " " . $3 . " " . $2 . "\n";
		push(@top100, ($1, $2, $3));
	}

	return @top100;
}
신고
블로그 이미지

*별빛*

UI/UX관련 개발이슈 및 방법을 나누는 곳입니다. Flex/AIR, Silverlight등 pc 기반 iPhone, Android등 smartphone 기반

애플은 3월 18일 iPhone OS 3.0 preview event에서 다음과 같은 성과를 발표했다.

2008년 기준
판매대수 : 1370만대 -> 목표(1000만대) 대비 37% 초과달성
               iPod touch 및 iPhone 1세대 포함하여 3000만대이상 판매

SDK 다운로드 : 80만회 이상

개발회사 및 개발자 : 5만이상, 이중 60%정도는 이전에 애플플랫폼을 개발한 적이 없음

등록된 App : 약 25,000개, 등록률 96%

총 App 다운로드수 : 약 8억회

------------------------

또한, 3.0에 대한 신규기능이 다음과 같다고 한다.

1.  App 내에서의 결제기능 : 정액제, 추가 스테이지 다운로드시 과금 등이 가능

2. P2P : 대전 게임이 본격적으로 가능

3. Maps : App 내에 구글 맵을 직접 embedding 가능 --> 네비게이션 App등 가능.

4. Push notifications : 서버에서 iphone으로 Alarm 송신이 가능.
                                3rd-party보다 배터리 소모가 적고, Callback과 같이 사용자가 선택시 app이 바로 실행됨
                                예를 들어 ESPN에 특정 팀의 경기에 대해 push notification을 사용하는 경우 그 팀의
                                경기중계 (streaming), 경기 결과 (text)등을 바로 즐길 수 있게 된다.

5. Cut/Copy/Paste : App들간의 cut, copy, paste로 데이터 이동 가능. Undo 지원. (좌우로 흔들면 undo)

6. Multiple Select 지원 : 사진등에서 한번에 여러개를 선택할 수 있고 이것을 copy하여 메일또는 메시지에 paste하여 보낼 수 있다.


7. Landscape : 메일이나 Notes, SMS등에서 Landscape모드를 사용할 수 있다.

8. Messages : Text Messaging (SMS) + MMS

9. Voice Memo

10. CalDAV 지원


11. Dock connector, Bluetooth를 통한 custom protocol 가능:
     --> 3rd-party H/W와 직접 통신 지원 : FM transmitter, 혈압측정등이 가능
     --> standard 및 custom 프로토콜 개발 가능
     --> 이를 통한 다양한 Accessory H/W 개발 가능


12. 1000여개의 새로 추가된 API


--------------------------------------------------------------------------

또다시 애플은 큰 일을 저지르고 말았다.

1.0이 시도, 2.0이 확산이었다면, 3.0은 혁신이라고 할 만하다.

일단, 3.0을 직접 써봐야 겠다.
신고
블로그 이미지

*별빛*

UI/UX관련 개발이슈 및 방법을 나누는 곳입니다. Flex/AIR, Silverlight등 pc 기반 iPhone, Android등 smartphone 기반


AnyClock 1.0 has been released on Feb.18.2009.

Features:
    - Synchronize with google calendar
    - Show date, time, day of the week
    - Support Backlight

ToDo:
    - Support weather info.
    - Support alarm
    - Support skin
    - Support Multi-language (English, Korea, Japanese)

You can ask anything by writing comment.

AnyClock 1.0.0 이 릴리즈 되었습니다.

특징은 다음과 같습니다.

- 날짜, 시간, 요일 표시
- 구글 캘린더와 연동하여 오늘의 일정 표시
- 백라이트 지원 (화면을 1-2초정도 누른 후 뗀다)


추후 지원예정.

- 날씨정보 연동
- 알람 기능
- 스킨 기능
- 다중 언어 지원 (한,영,일)

궁금한 점은 아래 코멘트에 문의하세요.
신고
블로그 이미지

*별빛*

UI/UX관련 개발이슈 및 방법을 나누는 곳입니다. Flex/AIR, Silverlight등 pc 기반 iPhone, Android등 smartphone 기반

iPhone 어플을 다국어버전으로 만드는 것은 생각보다 간단하다.

프로젝트 내에서 쓰이는 여러가지 문자열을 사용할 때, 다음과 같이 하면 된다.

NSString *str = NSLocalizedString(@"Hello",@"");

이와 같이 사용한 후, 터미널에서 "genstrings -o en.lproj *.m" 과 같이 하면,

프로젝트 내의 모든  소스파일에서 사용된 localizedstring이 자동으로 en.lproj/Localizable.strings로 저장된다.

마찬가지로, 한글화를 시키려면, "genstrings -o ko.lproj *.m"과 같이 하면 ko.lproj/Localizable.strings로 저장된다.

이렇게 만들어진 각각의 Localizable.strings를 프로젝트에 삽입한 후, ko.lproj/Localizable.strings파일을 열어 각 문자열에 번역을 한 후 컴파일 하여 실행하면

iphone설정이 한글이면 한글 문자열로, 영어면 영어문자열이 자동으로 나타나게 된다.

중국어, 일어 등도 마찬가지 방법으로 지원할 수 있다.

신고
블로그 이미지

*별빛*

UI/UX관련 개발이슈 및 방법을 나누는 곳입니다. Flex/AIR, Silverlight등 pc 기반 iPhone, Android등 smartphone 기반

티스토리 툴바