태터데스크 관리자

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

태터데스크 메시지

저장하였습니다.

'appstore'에 해당되는 글 5건

Creative Commons License
Creative Commons License
기껏 열심히 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 기반

Creative Commons License
Creative Commons License

#! /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 기반

Creative Commons License
Creative Commons License
애플은 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 기반

Creative Commons License
Creative Commons License

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 기반

Creative Commons License
Creative Commons License

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 기반

티스토리 툴바