#PasswordBox LastPass를 대체할 PasswordBox


Chrome, Firefox, Safari, IE, Android, iOS 에서 패스워드 25개 저장 한정으로 무료로 사용할 수 있음.
5명 초대하면 무제한으로 사용 가능함.

사용방법 동영상 보면 모바일에서도 자동으로 로그인 해주고 기능은 괜찮아 보인다.

LastPass는 모바일 무조건 Premium 사용자만 가능하니… 25개 한정이지만 괜찮아 보이네요.

PasswordBox 추천 & 다운로드 URL:
http://j.pbox.io/K40ze5HB

이미지

이미지

이미지

이미지

이미지

– 끝 –

 

광고

애플 앱스 추천, 가로모드 날씨 시계 앱


탁상시계 모드 (알람 불필요.)

  • Weather+ Free : 가로모드 미지원
  • Weather Clock (Free) : 가로모드 미지원
  • BellWeather Alam (Free) : 광고 (눈에 거슬림)
  • Night Stand HD Lite : 날씨 정보 없음.
  • 네이버시계 : 날씨 정보 없음.
  • Nightstand : 가로모드, 광고없음, 날씨정보 <<<<= 선택

iPhone, xmppframework 컴파일 참고사항.


xmppframework URL : http://code.google.com/p/xmppframework/

필요 Framework
1. CoreLocation.framework
2. libresolv.dylib
3. CoreData.framework
4. SystemConfiguration.framework
5. CFNetwork.framework

추가 필요 Framework
1. facebook-ios-sdk ( http://developers.facebook.com/docs/guides/mobile/ )

MacDev, Convert long double to NSString


지도 좌표와 같은 곳에서 double 형 숫자가 짤리지 않도록 하기 위한 방법.

double longDouble=37.55870106702469;
NSString *testStr001=[NSString stringFormat:@"%lf", longDouble];
NSString *testStr002=[[NSNumber numberWithDouble:longDouble] stringValue];
NSLog(@"TEST 001 : [%@]", testStr001);
NSLog(@"TEST 002 : [%@]", testStr002);

Result:

TEST 001 : [37.558701]
TEST 002 : [37.55870106702469]

iPhone, 4.2 beta에서 4.1로 downgrade, 1015에러 해결


1015에러는 다운그레이드 시 발 생하는 에러로..
애플은 다운그레이드를 지원하지 않는다고 한다.

http://support.apple.com/kb/TS1275?viewlocale=ko_KR

오류 1015: 이 오류는 iPhone, iPad 또는 iPod touch 소프트웨어를 다운그레이드하려고 할 때 발생합니다. 이전 .ipsw 파일을 사용하여 복원하려고 할 때 발생할 수도 있습니다. 이전 버전으로의 다운그레이드는 지원되지 않습니다. 이 문제를 해결하려면 Apple에서 제공하는 최신 iPhone, iPad 또는 iPod touch 소프트웨어로 복원해 보십시오.

개발용 iPhone에서 beta버전을 사용해 보고싶은 욕심에 설치했는데…
SDK 버전이 낮으면 iPhone에 못 올리는 문제가 발생한다.
( 생각해 보면 전에도 삽질 했었는데… 또한다.. ㅡ.ㅡ; )

그렇다고 SDK 까지 베타버전을 사용해서 개발할 수도 없는 일이고 해서
정식버전인 4.1로 다운그레이드를 시도해 봤다.
하지만 1015 에러가 발생한다.

iRecovery 관련 글들이 많으나 iOS 버전이 높아서 인지 잘 안되고…
iTunes는 1015 에러를 계속 내뱉는다.

1015를 애플에서 찾아보니 “이전 버전으로의 다운그레이드는 지원되지 않습니다.”
를 발견할 수 있다. 고로 베타버전 깔았으면 베타버전을 정식 4.2버전이 나올때 까지 쓰라는 얘기… ㅡ.ㅡ;
물론 경고 같은게 웹에 있을것 같다. 잘 보지 않고 설치한 사용자 탓도 없긴 하다만…
하여튼… 해결을 하기 위해서는 어둠의 방법을 사용하는 수밖에 없다.

구구절절하게 다시 떠들 필요없이 내가 참고 했던 싸이트를 링크한다.

* How to Restore iPhone 4, 3GS on iOS 4.0.1 Successfully, Bypassing iTunes 1004, 1015 Error
http://www.redmondpie.com/fix-itunes-1004-1015-error-and-restore-iphone-4-3gs-successfully-on-ios-4.0.1-how-to-guide/

* iPod, iPhone and iPad Firmware Download
http://www.felixbruns.de/iPod/firmware/

* TinyUmbrella – Unified TinyTSS and The Firmware Umbrella in ONE!
http://thefirmwareumbrella.blogspot.com/2010/05/tinyumbrella-unified-tinytss-and.html

– 끝 –

iPhone, UIWebView, Twitter, OAuth의 PIN 값 파싱


트위터 연동에서 PIN 값을 찾아서 자동으로 인증을
시켜 주는 부분을 찾았다.
아직 적용은 시켜 보지 못했다.


- (NSString *) locateAuthPinInWebView: (UIWebView *) webView {
NSString *js = @"var d = document.getElementById('oauth-pin'); if (d == null) d = document.getElementById('oauth_pin'); if (d) d = d.innerHTML; if (d == null) {var r = new RegExp('\\\\s[0-9]+\\\\s'); d = r.exec(document.body.innerHTML); if (d.length > 0) d = d[0];} d.replace(/^\\s*/, '').replace(/\\s*$/, ''); d;";
NSString *pin = [webView stringByEvaluatingJavaScriptFromString: js];
NSString *html = [webView stringByEvaluatingJavaScriptFromString: @"document.body.innerText"];

if (html.length == 0) return nil;

const char *rawHTML = (const char *) [html UTF8String];
int length = strlen(rawHTML), chunkLength = 0;

for (int i = 0; i < length; i++) {
if (rawHTML[i] < '0' || rawHTML[i] > '9') {
if (chunkLength == 7) {
char *buffer = (char *) malloc(chunkLength + 1);

memmove(buffer, &rawHTML[i - chunkLength], chunkLength);
buffer[chunkLength] = 0;

pin = [NSString stringWithUTF8String: buffer];
free(buffer);
return pin;
}
chunkLength = 0;
} else
chunkLength++;
}

return nil;
}

다음은 “locateAuthPinInWebView” 메소드가 불려지는 곳이다.


- (void) webViewDidFinishLoad: (UIWebView *) webView {
_loading = NO;
if (_firstLoad) {
[_webView performSelector: @selector(stringByEvaluatingJavaScriptFromString:) withObject: @"window.scrollBy(0,200)" afterDelay: 0];
_firstLoad = NO;
} else {
NSString *authPin = [self locateAuthPinInWebView: webView];

if (authPin.length) {
[self gotPin: authPin];
return;
}

NSString *formCount = [webView stringByEvaluatingJavaScriptFromString: @"document.forms.length"];

if ([formCount isEqualToString: @"0"]) {
[self showPinCopyPrompt];
}
}

[UIView beginAnimations: nil context: nil];
_blockerView.alpha = 0.0;
[UIView commitAnimations];

if ([_webView isLoading]) {
_webView.alpha = 0.0;
} else {
_webView.alpha = 1.0;
}
}

참고 URL : http://github.com/bengottlieb/Twitter-OAuth-iPhone/blob/master/Twitter+OAuth/SAOAuthTwitterEngine/SA_OAuthTwitterController.m

iPhone SDK, UIButton, 이미지 버튼과 글자 위치 조정.


버튼에 이미지와 글자를 같이 사용하려면,
이미지는 backgroundImage로 빼는게 맞는 것 같다.
버튼 image에 이미지를 넣으면 contents에 image와 title이 존재하므로 아래에서 보여줄 글자 위치 조정이 어려워 질 수 있다.
예를들어서 버튼 image에 이미지를 넣으면 글자가 이미지의 오른쪽으로 밀려서 마진을 맞출때 left 에 -100.0f 와 같이 마이너스 값을 넣어야 해서 위치 조정이 복잡해 진다.


#define RGBA(r, g, b, a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a]


UIButton *aButton=[UIButton buttonWithType:UIButtonTypeCustom];
[aButton addTarget:self action:@selector(aBtnDownAction:) forControlEvents:UIControlEventTouchDown];
[aButton addTarget:self action:@selector(aBtnCancelAction:) forControlEvents:UIControlEventTouchDragExit];
[aButton addTarget:self action:@selector(aBtnUpAction:) forControlEvents:UIControlEventTouchUpInside];
aButton.frame=CGRectMake(110.0f, 129.0f, 100.0f, 57.0f);
aButton.contentVerticalAlignment=UIControlContentVerticalAlignmentTop;
aButton.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft;
[aButton setTitle:@"버튼명" forState:UIControlStateNormal & UIControlStateHighlighted & UIControlStateSelected];
[aButton setTitleColor:RGBA(136, 136, 136, 1) forState:UIControlStateNormal & UIControlStateHighlighted & UIControlStateSelected];
[aButton.titleLabel setFont:[UIFont fontWithName:@"AppleGothic" size:15.0f]];
aButton.adjustsImageWhenDisabled=YES;
aButton.adjustsImageWhenHighlighted=YES;
aButton.backgroundColor=[UIColor clearColor];
[aButton setTitleEdgeInsets:UIEdgeInsetsMake(29.0f, 22.0f, 0.0f, 0.0f)];
[aButton setBackgroundImage:[UIImage imageNamed:@"abutton_normal"] forState:UIControlStateNormal];
[aButton setBackgroundImage:[UIImage imageNamed:@"abutton_pressed"] forState:UIControlStateHighlighted];
[self.view addSubview:aButton];

위 코드에서

aButton.contentVerticalAlignment=UIControlContentVerticalAlignmentTop;
aButton.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft;

컨텐츠는 title 이 되고 top, left 정렬이 된다.
기본으로는 center 정렬인 것 같다.

다음을 이용해서

[aButton setTitleEdgeInsets:UIEdgeInsetsMake(29.0f, 22.0f, 0.0f, 0.0f)];

안쪽의 마진으로 위치를 조정할 수 있다.
인자는 (top, left, bottom, right) 이다.