#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) 이다.

iPhone, Remove warning, When using undocumented method.


Example,
If you want to remove warning when you use undocumented “setDimsBackground” method of UIAlertView,
add below code on your implementation file(“.m”),

@interface UIAlertView(TRICK)
- (void)setDimsBackground:(BOOL)yesOrNo;
@end

put over the “@implementation” line.

iPhone, UIKit, “loadNibNamed:owner:options:” crash


My program crashed when I apply “Loading Nib Files Programmatically” part.
http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW8

2010-01-29 18:18:21.183 NateOn[20274:207] *** Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (UITableViewCellContentView)'

I found below URL that is just answer of this problem. thanks~ 🙂

URL:
http://stackoverflow.com/questions/2152321/weird-uitableviewcell-loading-exception

iPhone SDK 3.0, may not respond to ‘-className’


iPhone SDK 3.0 에서 className 메소드를 왜 없앴는지 모르겠다.
Device vs. Simulator 블로그에서 메소드를 추가 하는 방법을 소개하고 있다.
난 className 메소드를 많이 사용하지 않으므로 부분 처리를 했다.

기존 코드 :

if ([[aSession className] isEqualToString:@”TTSession”])

수정 안 #1 :

if ([[NSString stringWithUTF8String:(const char *)class_getName(aSession)] isEqualToString:@”TTSession”])

수정 안 #2 :

if ([NSStringFromClass([aSession class]) isEqualToString:@”TTSession”])

– 끝 –