AFNetworking 2.x 와 iOS6

AFNetworking은 Server-Client 개발 시 많이 사용하는 오픈소스입니다. Connection 세션관리부터 iOS7에서 새로이 추가된 Task 개념까지 충실히 지원하고 있으며 현재도 업데이트가 활발한 오픈소스입니다. iOS7이 정식으로 발표되고 또 iPhone5s/iPad mini retina가 출시되면서 64bit 지원이 또 다른 개발 화두가 된 시점에서 제가 진행 중인 프로젝트의 앱에도 64bit를 지원해보고자 세팅을 바꾸고 여러 compile warning을 하나씩 확인하면서 수정하다보니 기 적용되어있던 AFNetworking 1.x가 문제가 되었습니다. 이를 다 바꾸기보다는 최신버전이 있는지 확인을 해보았더니 2.0이 등록되어 있었고 반갑게 64bit 지원을 한다고 되어 있어 선뜻 업데이트를 했습니다. 문제는 여기서부터.. 현재 진행 중인 프로젝트 iOS Client의 deployment target이 6.0부터인데 7.0에서만 주로 테스트하다보니 간과하고 넘어간 부분이 있었습니다. 바로 AFHTTPSessionManager 의 블록코드 정의에 있는 NSURLSessionDataTask 였습니다. 이 녀석이 7.0에 추가된 개념이더군요.. 바로 수정에 들어갔는데 블럭 정의를 바꿀 수 있는 방법이.. 있을리 만무하죠; 결론은.. 역시나 저와 같은 문제를 겪은 분의 친절한 Q&A thread가 있더군요. http://stackoverflow.com/questions/20772984/afnetworking-2-0-3-not-working-on-ios-6 참 친절한 stackoverflow입니다. 위 URL의 답변에 보면 iOS7 이상 지원 시에는 AFHTTPSessionManager를 사용하고, iOS6 이상 지원 시에는 AFHTTPReuqestOperationManager를 사용하라고…

iOS 7에서 드디어! 추가된 기능들

본문의 글은 DoubleEncore의 iOS7 Additions:OMG Finally! 를 참고하여 작성되었습니다. (This article is refer to iOS 7 Additions: OMG Finally! at DoubleEncore)   iOS7이 발표된지도 꽤 많은 시간이 지났습니다만 이제서야 review를 하네요… 바로 본문으로 들어갈게요. 1. Support Attachments at Message UI Framework. 개발 시 앱 내에서 iMessage 기능을 편하게 사용하기 위해서 MFMessageComposeViewController를 사용해왔을 것입니다. 이 클래스의 약점 중 하나는 code-level에서 첨부 파일을 넣을 수 없다는 것이였죠. – (BOOL)addAttachmentData:(NSData *)attachmentData typeIdentifier:(NSString *)uti filename:(NSString *)filename; – (BOOL)addAttachmentURL:(NSURL *)attachmentURL withAlternateFilename:(NSString *)alternateFilename; 위 두 메소드가 추가되며 드디어 메시지에 첨부파일을 첨부할 수 있게 되었습니다. Data의 경우 MobileCoreService Framework에 포함된 UTCoreTypes에 정의된 파일형식이라면 대부분 가능한 것 같습니다. 단, 용량제한이나 기타 제한에 대해서는 충분하게 테스트해보지 않았으니 참고하세요. 2. MPVolumeView in Media Player Framework MPVolumeView는 단말의 볼륨을 조절하는 슬라이더와 라우팅할 오디오 소스를 선택할 수 있도록 해주었습니다만 AirPlay system의 정보를 얻기에는 부족함이 있었습니다. @property areWirlessRoutesAvailable; @property isWirelessRouteActive; NSString *const MPVolumeViewWirelessRoutesAvailableDidChangeNotification; NSString *const MPVolumeViewWirelessRoutesActiveDidChangeNotification; 하지만 iOS 7부터 위 코드처럼 두 개의…

iOS7에서 UITableViewCell의 AccessoryView에 버튼을 배치하고 버튼의 selector에서 cell을 참조하기

아래와 같이 특정 서비스에서 친구를 초대하거나 follow할 때 주로 쓰는 UI화면이 있다. UITableView에 UITableViewCell 혹은 이를 상속받는 클래스 구조인데, 여기서 Invite 버튼을 터치했을 때 버튼이 속하는 NSIndexPath를 받기 위해 아래와 같이 코딩을 할 때가 있다. /* UITableView의 data source 메소드 중 cellForRowAtIndexPath: 메소드 */ – (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (!cell) { UIButton *inviteButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; /* 프로퍼티 정의는 생략 */ [inviteButton addTarget:self action:@selector(onInvite:) forControlEvents:UIControlEventTouchUpInside]; cell.accessoryView = inviteButton; } return cell; } /* Invite 버튼의 selector 메소드 */ – (void)onInvite:(id)sender { if ([sender isKindOfClass:[UIButton class]]) { UIButton *inviteButton = (UIButton *)sender; UITableViewCell *selectedCell = (UITableViewCell *)[inviteButton superview]; NSIndexPath *indexPath = [_tableView indexPathForCell:selectedCell]; NSLog(@"selected row is :%d", indexPath.row); } } 이 경우 onInvite: 메소드의 [inviteButton superview] 가 iOS7 미만에서는 포인터를 가져오는데 문제가 없었지만 iOS7 부터는 문제가 된다. view의 구조를 봤을 때 Invite 버튼은 UITableViewCell의 accesoryView로 대치되었기 때문에 superview는…