iOS의 social / account framework을 이용한 페이스북 로그인 구현시 다음과 같은 상황이 발생하였다.
fb://로 시작하는 url에 접속 가능한지 여부, 즉 Facebook app이 설치되었는지 확인하려고 다음의 코드를 호출하였다.

-(BOOL) function… {
if ([Objective-C>[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@”fb://”]]) { NSString *urlString = request.URL.absoluteString; if ([@”https://m.facebook.com/plugins/login_success.php” isEqualToString:urlString]){ [self accountStore]; return NO; } return YES; }  

return YES; }

하지만 아래와 같은 오류 메세지를 줄기차게 뱉어냈다.

2015-08-24 21:57:23.219 meerkat[277:20308] -canOpenURL: failed for URL: "fb://" – error: "This app is not allowed to query for scheme fb"

이는 iOS9으로 변경되면서 바뀐 정책으로 Info.plist에 다음과 같은 항목을 추가하여야 한다. 

스크린샷 2015-08-24 오후 10.03.49

Info.plist – Property list로 본 화면.

스크린샷 2015-08-24 오후 10.06.25

Info.plist – Source code로 본 화면.

주의할 점은 연결하고자 하는 app의 custom url scheme에서 ://를 제외하고 입력하여야 한다는 것이다. 위의 갈무리 화면은 Facebook app이다.

현재 OS X El Capitan beta 6(15A244d)과 Xcode 7 beta 5에서 simulator crash 및 storyboard를 열 수 없을 경우에는 아래의 경로에 있는
구 버전의 simulator를 삭제후 Xcode를 재기동 하면 된다.

/Library/Developer/CoreSimulator/Profiles/Runtimes

나의 경우에는 다음과 같은 simulator 폴더가 있었고, 모두 삭제한 후 Xcode를 재기동 하니 정상적으로 작동하였다.

iOS 7.1.simruntime
iOS 8.1.simruntime
iOS 8.2.simruntime 

참고 : Apple Developer Forums

간만에 iOS 코딩을 하려고 샘플 프로젝트를 빌드하였다.
빌드까진 잘 되었는데, 이상하게도 Simulator로 돌리면 반응이 없고 Xcode가 얼어버렸다.

어머니 심부름과 이런 저런 일들때문에 잠깐 잠깐 만지작 거리면서 흘러간 시간이 7시간 이상…
구글링도 해보고, Xcode도 4~5번 재설치를 했지만 나아지질 않았다.
희안한건, 단말(iPhone/iPad)에서 구동시키면 잘된다는… T.T

그러다가 문득 든 생각이 혹시 회사 업무 때문에 수정한 hosts 파일 때문이 아닐까 싶어 수정을 하고 Simulator를 실행시키니…
자~알 실행이 되더라. 이런 제길...

스크린샷 2014-03-29 오후 8.42.30

127.0.0.1을 주석으로 막아놔서… T.T

NSObject에 정의되어 있는 setValue:forKey에서 setValue가 nil일 경우 처리함.
Cocoa 3rd RaiseMan Application에서 사용.
다음은 책의 내용중 일부.

NSObject에 정의된 이 메서드가 예외를 발생시키기 때문에 사용자가 ExpectedRaise필드를 비워 두면 여러분의 객체는 예외를 발생시킬 것이다. 일반적으로 setNilValueForKey:를 재정의해서 인스턴스 변수를 어떤 기본 값으로 정한다. 이 경우 Person 클래스에 있는 이 메서드를 재정의하여 expectedRaise를 0.0으로 설정한다. 다음 메서드를 Person.m에 추가하자.


- (void)setNilValueForKey:(NSString *)key {

if ([key isEqual:@"expectedRaise"]) {

[self setExpectedRaise:0.0];

} else {

[super setNilValueForKey:key];

}


}


위의 메서드를 재정의 하지 않은 상태에서 예제의 Raise 입력부를 비우면 다음과 같이 예외가 발생한다.
스크린샷 2009-09-09 오후 2.52.06
5장 143쪽에서 awakeFromNib메서드 구현 부분에서 NSTableView에 나열되어 있는 NSSpeechSynthesizer의 목소리 목록에서 기본 목소리 값을 선택하게끔 하는 부분이 있다.

// 테이블 뷰가 화면에 나타날 때 기본 목소리가 선택되어야 한다.
NSString *defaultVoice = [NSSpeechSynthesizer defaultVoice];
NSArray *voices = [NSSpeechSynthesizer availableVoices];
int defaultRow = [voices indexOfObject:defaultVoice];
[tableView selectedRow:defaultRow byExtendingSelection:NO];
[tableView scrollRowToVisible:defaultRow];


이 부분을 책에 있는 그대로 입력하게 되면 다음과 같은 경고(warning)이 출력된다.

Xcode의 개발자 문서에서 해당 메서드를 검색하니 deprecated 되었단다. NSTableView의 selectedRow:byExtendingSelection 대신 권장되는 selectedRowIndexs:byExtendingSelection 이다.
deprecated된 기존의 메서드의 NSInteger 타입이 아닌, NSIndexSet 타입의 파라미터를 받게된다. 따라서 위의 경고가 출력된 부분을 다음과 같이 수정하면 이상없이 빌드 / 실행(디버그) 할 수 있다.

[tableView selectRowIndexes:
[NSIndexSet indexSetWithIndex:defaultRow] byExtendingSelection:NO];


그림 2

Xcode에서 #pragma 주석을 이용하면 위와 같이 메서드를 그룹핑하여 쉽게 이동할 수 있다.
하지만 특정 환경에서는 제대로 작동되지 않는 경우가 있다.

그림 3

이는 아래와 같이 Xcode > Preferernces > Code Sense에 있는 Sort list alphabetically 옵션을 체크 해제해 주면 된다.

그림 4

+ Recent posts