기타2013. 9. 14. 16:10

 

짜릿한 역전승 즐거운 감상하시기 바랍니다.

'기타' 카테고리의 다른 글

파워디렉터를 이용하여 워터마크 삽입하기  (0) 2015.07.01
마이의 새로운 전략 전술 공개합니다.  (0) 2013.09.14
Mac, ip-time 그리고 VPN  (0) 2013.02.12
상식 상식  (0) 2012.06.15
우리은행 구로점  (0) 2012.05.22
Posted by 다오나무
PhoneGap2012. 6. 26. 10:39



이번 문서에서는 PhoneGap를 셋팅하고 (iOS) PhoneGap 프로젝트에서 javascript 초기화에 대해 다룬다.


Getting Start PhoneGap



PhoneGap을 시작하는 사람들을 모두 들어가 봤을만한 공식 사이트다. 아주 친절하게도 http://phonegap.com/start 이 주소로 들어 가면 플랫폼 별로 초기 셋팅을 어떻게 하는지에 대해 순서대로 나와 있다. 



주의 해야할 사항은 xcode 를 이용하여 iOS 플랫폼에 셋팅을 하는 경우라면 초기에 PhoneGap을 설치하고 Cordova Project로 생성을 한 뒤에 위와 같은 폴더 구조가 나오는데 바로 컴파일을 하면 제대로된 화면이 안나오고 아래와 같은 메세지를 볼수 있다.



PhoneGap에서 사용되는 javascript 와 html, css파일들은 프로젝트 하위의 www 폴더에 생성되는데 xcode에서 이를 인식하지 못하여 발생하는 문제이다. xcode에 플러그인 형식으로 설치 하는 거라 플러그인에서 생성 시킨 폴더(www)를 자동으로 프로젝트에 추가 해주지 못해서 그런것 같다. 위의 문제는 프로젝트를 한번 컴파일 한뒤에 프로젝트를 저장한 폴더에 이동해 보면 www폴더가 생성되어 있는걸 볼수 있는데 아래와 같이 프로젝트에 추가해 주면 제대로 동작 하게 된다.


www폴더를 드래그 해서 위의 phonegap_sample 프로젝트에 드랍해 주면 프로젝트에서 www를 인식 하게 된다. 





www/index.html 



<script type=
"text/javascript" charset="utf-8" src="cordova-1.5.0.js"></script>
<script type="text/javascript">
 
function onBodyLoad() {
 
    document.addEventListener("deviceready", onDeviceReady, false);
}
 
function onDeviceReady()
{
    // Device Ready!
}
 
  
</script>
<body onload="onBodyLoad()">
</body>


www폴더를 보면 PhoneGap을 동작하는데 필요한 cordova.js와 index.html 이 있다. cordova.js를 PhoneGap을 초기화 하고 디바이스와 통신하는데 필요한 준비 및 API로 구성되어 있다. 한번 훑어 보는것도 좋을듯 하다.


위의 코드는 index.html에서 기본적인 source만 뽑아낸 것이다. 어플리케이션이 실행 되면 처음으로 시작되는 곳이 index.html 이다. 모든 초기화는 여기서 이루어 진다. 일반 웹 페이지와 다른 것은 "deviceready" 이벤트를 통해 PhoneGap이 동작하는 기기(플랫폼)가 준비가 되었는지 확인하는 과정이 필요하다. 위의 코드에서 알수 있듯이 onDeviceReady가 호출 된 후에에 PhoneGap API 등을 사용할 수 있다. 그 전에 호출을 해봤자 실행 되지 않는다.



2개의 문서로 마무리를 지으려고 했는데, 문서를 작성하면서 생각이 덧붙여 지면서 분량이 더 많아 졌다. 다음 문서에서는 iOS와 Android 플랫폼에서 동작하는 Plugin 개발하는 방법을 다루겠다.

Posted by 다오나무
iOS2012. 6. 20. 15:19

당신은 지난 몇개월간 (어쩌면 몇일간) 고생해서 만든 앱을 앱스토어에 올려놨다.
아마 Waiting for Review단계라서 잠이 안 올지도 모르겠다.
그리고 처음 등록한 앱이라서 아직 설레이기도 하고 요즘 대세라는 FreeMium모델로 IAP도 설계해놨고
이제 대박이 나서 로또맞을 생각만 하고 있을지도 모른다. 
당신의 앱이 IAP설계상에서 만들어졌다면, 심사전에 반드시 확인하고 또 확인했으면 하는 것이 있다. 

케이스 1) 

A씨는 야심차게 준비한 앱을 승인올리고 매일 심사가 마무리되길 기다렸다.
승인을 올린지 4일 째 되던날 In Review가 들어갔고,
다음 날 아침에 일어나보니 Ready for Sale이라는 메일을 받았다.
신나서 앱을 릴리즈하고 보니 앱내에서 IAP 결제가 안되는 것이었다.
이런 망 ;;;; 



당신의 앱이 최초로 승인받는 앱이라면, IAP는 앱과 함께 "심사를 거쳐야 한다"
당신이 IAP를 통해서 무슨 콘텐츠를 제공할지 모르는 애플은 이 모든 것을 심사하길 원한다. 
그러므로 당신은 앱 심사를 올린 후에, [Manager In-App Purchases]에서 IAP의 상태를 다시 한번 점검해야 한다. 



 
IAP 아이템의 상태는 총 4가지 있으니 잘 기억하기 바란다. 


1) Ready to Submit: 당신의 IAP가 생성되었으나 아직 애플에 승인이 들어가지 않은 상태이다. 그러니 위의 케이스같은 황당한 일을 겪지 않기 위해서는 <앱 승인을 최초로 올려놓고 당신의 IAP가 "Ready for Submit"이라면> 큰 착오를 한것이라고 이해하고 다시 한번 App을 올려야 할 것이다. (IAP 승인요청 방법은 나중에...) 

2) Waiting for Review: 앱과 마찬가지로 심사를 기다리고 있는 중인 것이다. 당신은 "참 잘했어요" 도장을 받아야겠다.

3) Developer Action Needed: 이 케이스는 언제 발생하냐면, 애플이 당신의 앱을 리젝했을 때, 앱과 함께 심사를 요청했던 IAP들도 함께 심사가 반려된다. (IAP의 리젝은 아니다) 그 때 당신의 IAP의 상태는 Developer Action Needed 상태로 변결된다. 이때는 IAP의 <Display Name>을 살짝 수정해주면 다시 "Waiting for Review"상태로 변경되는 것을 확인할 수 있다. 만약 Developer Action Needed 상태에서 리젝됐던 앱만 다시 승인을 올릴 경우에는 다시 Case1의 상황을 맞을 수 있으니 주의하자. (난, 아직 안 당해서 모르겠네 ;;;) 
 

 

4) Approved: 앱이 판매 가능한 상태가 Ready for Sale 이라면 IAP는 Approved이다. 초록불을 보고 기뻐하면 된다. 



5) Waiting for Screenshot: 아, 이런 케이스도 봤다. IAP를 스크린샷으로 표현할 수 없는 경우도 있다. 그리고 어떤 개발자(혹은 담당자)는 깜빡하고 스크린샷을 안 올리는 실수를 범할 수 있다. 이때는 애플은 가찬없이 스크린샷이 없어서 심사를 못 하겠다고 한다. 이때는 스크린샷을 올리면 Waiting for Review상태로 돌아온다. 




자 이제 마무리를 하자. 
당신이 앱을 올리고 나서 [Manage IAP]메뉴로 들어가서 반드시 확인할 것은 "IAP가 Waiting for Review"상태인 것을 확인하는 것이다. 이 절차를 빠뜨렸다가는 아까운 5일의 시간을 그냥 날려버리는 수가 있다. 



In-App Purchase 아이템을 심사요청하는 절차는 애플이 프로세스를 이상하게 만들어놨다고 생각하는데,
어째든 그건 이 글이 사람들에게 도움을 주고 있는지 여부(댓글의 여부?)를 살펴보고 계속 작성해야겠다. 

Posted by 다오나무
영삼이의 IT정보2012. 6. 10. 17:08

- (void) viewDidLoad 에서

scrollView.contentSize = self.view.frame.size;

선언 이후 화면 변환(키보드 등장)에 대한 노티피케이션 감시 코드 추가

1) viewWillAppear 에서 UIKeyboardDidShowNotification 과 UIKeyboardDidHideNotification 등록

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];


-(void)keyboardDidShow:(NSNotification *)notif 
{
//키보드를 여러 객체들이 열 수 있는데, 자신의 키보드에만 반응하기 위해서, 이 정보를 갖고 있어야 한다
  if(keyboradVisible) 
  { return; }
  NSDictionary* info = [notif userInfo];
  NSValue* aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
  CGSize keyboardSize = [aValue CGRectValue].size;

  CGRect viewFrame = self.view.frame;
  viewFrame.size.height -= keyboardSize.height;

  scrollView.frame = viewFrame;
  keyboardVisible = YES;
}

-(void)keyboardDidhide:(NSNotification *)notif 
{
  if(!keyboardVisible)
  { return; }

  NSDictionary *info = [notif userInfo];
  NSValue *aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
  CGSize keyboardSize = [aValue CGRectValue].size;

  CGRect viewFrame = self.view.frame;
  viewFrame.size.height += keyboardSize.height;

  scrollView.frame = viewFrame;
  
  keyboardVisible = NO;
  
}

2) viewWillDisappear 에서 등록 해지

[[NSNotificationCenter defaultCenter
] removeObserver:self]



'영삼이의 IT정보' 카테고리의 다른 글

Tabbar 아이콘  (0) 2012.06.11
StoreKit  (0) 2012.06.10
아이폰 OS 개발 자료 총정리  (2) 2012.06.04
UIImageJPEGRepresentation  (0) 2012.06.04
XHTML/CSS 무료 템플릿 배포사이트  (0) 2012.06.01
Posted by 다오나무
영삼이의 IT정보2012. 5. 31. 15:06

각 단말기에는 해당 단말기를 식별하는 유일값인 UDID가 존재합니다. iOS 플랫폼의 경우 SDK 상에서 쉽게 이 UDID 값을 추출할 수 있었습니다. 이 UDID는 사용자의 직접적인 개인정보를 이용하지 않고 사용자의 패턴 분석에서부터 타겟광고 소스 등 여러 부분에서 이용하고 있었습니다만 현재 베타테스트가 진행 중인 iOS5에서는 이 UDID 의 이용은 제한될(deprecated) 예정입니다. 이에 따라 애플에서는 UDID보다는 UUID를  생성하여 이용하라고 권고하고 있습니다. UUID는 단말기의 고유값이 아닌 어플리케이션에서 생성한 유일값으로 생성할 때마다 변경되는 랜덤값입니다. 따라서 개발자분들은 이에 대한 대응을 미리 하시는 것이 좋을 것 같아서 정리해보았습니다.

  • uniqueIdentifier 메소드가 사라질 예정

UDID는 단말기를 식별하기 위해 고유하게 할당된 40개의 숫자와 문자열입니다. 이런 고유값은 개인정보이다. 아니다 기기 식별값이므로 개인정보는 아니다라는 논란으로 잠시 인터넷이 뜨거웠던 적이 있습니다. (2011/05/10 서울경제 기사, http://economy.hankooki.com/lpage/it/201105/e20110510173640117700.htm)

이 UDID는 구글, 오픈페인트를 비롯한 여러 광고 및 트래픽 분석툴에 사용되고 있는 상황에서 애플이 드디어 칼질을 가하기 시작했습니다. iOS5 beta 6에서는 UDID를 가져올 때 사용하는 메소드를 없애겠다는 의지로 해당 메소드를 deprecated시키고 대신 Core 레벨에서 랜덤한 UUID를 생성하는 메소드를 이용하라는 권고를 내렸습니다. (Apple Sneaks A Big Change Into iOS 5: Phasing Out Developer Access To The UDID :http://techcrunch.com/2011/08/19/apple-ios-5-phasing-out-udid/).

실제로 iOS5 beta 6에서 [[UIDevice currentDevice] uniqueIdentifier]가 포함된 프로젝트를 빌드하면 아래와 같은 경고가 나타납니다.

  

  • UDID가 아닌 UUID를 이용하라는 권고

애플에서는 UDID값이 아닌 UUID(Universally Unique Identifiers)를 이용하라는 권고를 내렸습니다. CFUUID Documentation을 참조하면 이 UUID는 128-bit 값으로 생성된 유일값이며 이는 시간과 공간값으로 생성된 유일값이므로 중복될 염려가 없다고 합니다.

유일값 생성 방법은 아래와 같으며,

CFUUIDRef uuid = CFUUIDCreate(kCFAllocatorDefault);
NSString *string = (NSString *)CFUUIDCreateString(kCFAllocatorDefault, uuid);

생성되는 UUID는 아래와 같은 형태의 결과값을 가집니다.

이렇게 생성된 UUID를 NSUserDefaults 등을 이용하여 값을 유지시켜줌으로 UDID와 동일한 역할을 하도록 개발자들의 추가 구현이 필요하다라고 문서에는 나와있습니다. 어느 부분에서는 한 줄이면 가능한 유일값 추출을 이제는 개발자가 직접 신경을 써서 관리하라고하니 한숨이 나오는 건 사실입니다.

  이렇게 생성된 관리를 위한 방법으로는 NSUserDefaults를 이용하여 앱 내부에서 관리하는 방법별도의 서버에 이 값을 저장하여 관리하는 방법, 또는 iOS5 이상의 iCloud를 이용하는 앱이라면 iCloud의 Key-Value Data Storage를 이용하는 방법을 생각해 볼 수 있습니다. 이도 문제가 된다면 Mac Address를 추출하고 이를 해쉬값을 이용(MD5)하는 방법도 최근 iOS 개발자분들이 관심을 가지고 있는 것 같습니다. (GitHub : http://github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5).

 

  • UDID vs. UUID

 UDID는 Unique Device Identifier로 기기의 고유값입니다. 하지만 UUID는 앱 자체에서 생성되는 고유값으로 사용자가 사용하는 앱의 고유값으로 볼 수 있습니다. 즉, UUID를 사용하도록 권고하는 것은 단말기의 고유값을 사용하지 말고 앱마다 각자의 고유값을 이용하라는 풀이로 볼 수 있습니다.

  이 두 유일값의 장단점을 간략히 살펴보면 아래 표와 같습니다.

 

  • 당장은 고려하지 않아도 된다?
  •  

Deprecated 된 메소드는 아시다시피 현재 사용하지 못한다는 의미는 아니지만 앱스토어에 앱을 등록할 때 리젝 사유가 될 수 있습니다. 위에서 설명드린대로 경고가 항상 나타난다면 당장 대안을 찾아야하는 상황이지만 프로젝트의 Deployment Target을 5.0 이하. 즉, 4.x나 3.x로 한다면 메소드를 사용이 가능합니다. 물론 개발 상에서 사용가능하다는 것이며 정책상으로 어떻게 될지는 모르는 상황입니다.

UDID를 활용하는 서비스나 앱이 많을 것으로 예상됩니다. iOS5가 정식으로 릴리즈되더라도 당장에 사용못하게 하지는 않을 것으로 예상되지만 미리 준비를 해두시는 것이 좋을 것 같습니다.

아래는 Deployment Target을 4.0으로 설정하는 화면과 설정 이후 빌드한 결과 uniqueIdentifier에 경고가 나타나지 않는 화면입니다.

 

  • UUID가 아닌 다른 유일값 사용에 대해서
  •  

UUID가 아닌 유일값에 대해서는 애플에서는 아직 언급하고 있지 않습니다만 Ethernet의 MAC AddressBundle identifier 등 여러 대안을 생각해볼 수 있습니다. MAC Address의 경우 Cocoa API에는 추출 메소드가 없어 직접 Core에 접근하여 추출을 해야하며, 해당값을 그대로 사용하는 것이 아닌 MD5나 SHA-1 등의 해쉬를 이용하여 보안이슈가 발생되지 않게 해야합니다. 이로 인해 작업 공수가 더 추가된다는 것, 또한 이후에 애플에서 해당값의 사용을 금지할 수도 있다는 잠재적인 위험요소가 있으므로 되도록이면 애플에서 권장하는 UUID를 이용하는 방법으로 문제를 해결하는 것을 추천해드립니다.

 

  • 결론

UDID를 얻어오는 메소드는 iOS5부터 사용할 수 없는, 삭제 예정인 메소드입니다.
- 프로젝트의 Deploy Target을 5.0이 아닌 그 이하 버전으로 설정하는 경우에는 UDID 추출 메소드 사용이 가능합니다.
- 정책상 결정된 부분은 아니지만 애플의 권고는 UUID를 이용하는 것입니다.
- 또한, iOS5가 정식으로 발표된 이후에는 반드시 고려되어야하는 이슈이므로, 미리 이에 대한 대비가 마련되어야 합니다.
- UUID도 단말기의 고유값이 아니므로 서비스의 특성에 따라서는 UDID가 아닌 단말기의 고유값으로 간주할 수 있는 MAC Address를 이용하는 방법 등을 고려할 수 있습니다.
- UDID를 사용하지 못하는 것과 동일하게 MAC Address도 사용이 불가할 수도 있다는 점은 고려하여 대책 마련을 하시는 것이 좋습니다.
- MAC Address를 해쉬처리한 문자열이 단말기의 고유값으로 보는 방안은 애플의 정책에 위배되지 않는다는 가정하에서 현재 단말기의 유일값으로 지정할 수 있는 최상의 방안으로 고려됩니다. (iOS5 정식출시가 되어봐야 알 것 같습니다.)

Posted by 다오나무
영삼이의 IT정보2012. 5. 29. 15:14

/* 

아래 같은 방식으로 smsURL이라는 주소로 post 형식으로 데이터를 감싸 전송이 가능해진다.

*/

- (void)connectToServer

{

NSString *smsURL = @"http://www.google.co.kr";

NSMutableURLRequest *request = [[[NSMutableURLRequest allocinitautorelease];

NSString *post = [NSString stringWithFormat:@"password=%@&id=%@",@"password",@"id"];

NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

NSString *postLength = [NSString stringWithFormat:@"%d",[postData length]];

[request setURL:[NSURL URLWithString:smsURL]];

[request setHTTPMethod:@"POST"];

[request setValue:postLength forHTTPHeaderField:@"Content-Length"];

[request setValue:@"Mozilla/4.0 (compatible;)" forHTTPHeaderField:@"User-Agent"];

[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

[request setHTTPBody:postData];


[NSURLConnection connectionWithRequest:request delegate:self ];

}


/*

아래 Delegate에서는 HTML이 처리되고 난 후 받는 데이터를 얻을 수 있다.

*/

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{

NSString *returnString = [[NSString allocinitWithData:data encoding:NSUTF8StringEncoding];

NSLog(returnString);

}


/* 

아래 Delegate를 이용하면 post를 보낸 후 쿠키를 얻을 수 있다.

*/

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)aResponse

{

NSHTTPCookie *cookie;

int i=0;

for (cookie in [[NSHTTPCookieStorage sharedHTTPCookieStoragecookies])

{

NSLog([cookie description]);

}

}

Posted by 다오나무
카테고리 없음2012. 3. 12. 15:26

- (NSString *)stringFromTimeInterval:(NSTimeInterval)interval {

    NSInteger ti = (NSInteger)interval;

    NSInteger seconds = ti % 60;

    NSInteger minutes = (ti / 60) % 60;

    NSInteger hours = (ti / 3600);

    return [NSString stringWithFormat:@"%02i:%02i:%02i", hours, minutes, seconds];

}

Posted by 다오나무
영삼이의 IT정보2011. 11. 11. 19:01

스크립트를 이용하는방법
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
<!--
// [/iPhone/i]  OS가 iPhone
// [/iPod/i]  OS가 iPod
// [/Symbian/i]  OS가 심비안
// [/Windows CE/i] OS가 윈도우모바일
// [/BlackBerry/i] OS가 블랙베리 
// [/Android/i]  OS가 안드로이드일 경우
if( (navigator.userAgent.match(/iPhone/i)) ||
(navigator.userAgent.match(/iPod/i)) ||
(navigator.userAgent.match(/Symbian/i)) ||
(navigator.userAgent.match(/Windows CE/i)) ||
(navigator.userAgent.match(/BlackBerry/i)) ||
(navigator.userAgent.match(/Android/i)))
{
window.location.href='./photo.php'; // 저중 하나라도 조건이 만족하면 /m/index.php 로 이동한다.

//-->
</SCRIPT>

php를 이용하는방법
<?
$T = $_SERVER['HTTP_USER_AGENT'];
if(strrpos($T,"Android") || strrpos($T,"iPhone"))
{
if(strrpos($T,"SHW-M180S")) // 갤럭시 탭
{
  $goMobile = "No";
}
else
{
  $goMobile = "Yes";
}
}

if($goMobile == "Yes")
{
?>
<SCRIPT LANGUAGE="JavaScript" TYPE="text/javascript">
<!--
  window.location.href='m1.php';
//-->
</SCRIPT>
<?
}
?>
먼저 $T로 브라우져의 정보를 알아낸다음...
그것으로 처리 하면 된다.

Posted by 다오나무
영삼이의 IT정보2011. 11. 2. 08:02

오늘 소개해 드릴 아이디어는 아이폰을 DSLR카메라처럼 만들자는 아이디어 입니다.

단지 렌즈만 붙이는것이 아니라 셔터같은 부가적인 기능도 있는데요.
전용 앱(APP)을 실행 시키면 진짜 카메라로 찍는듯한 느낌이 듭니다.

Concept Camera: The WVIL from Artefact on Vimeo.
그리고 사진보정및 사진공유같은 기능도 있네요~
실용화가 된다면 카메라를 따로 살 필요 없이 간편하게 화려한 사진을 찍을수 있을것 같습니다.
아이폰을 생각하다보면 핸드폰도 핸드폰이지만
이런 아이디어 넘치는 악세사리가 많아서 많이들 구입하시는것 같아요.

'영삼이의 IT정보' 카테고리의 다른 글

로딩중&hellip; 메세지박스 출력  (0) 2011.11.09
자바스크립트 명령어  (0) 2011.11.04
jQuery Mobile 일본글  (0) 2011.10.31
jQueryMobile 일본 글 [출처]  (0) 2011.10.31
데이터베이스와 테이블생성  (0) 2011.10.28
Posted by 다오나무
영삼이의 IT정보2011. 10. 19. 10:25


Posted by 다오나무