목록분류 전체보기 (50)
Stacking Fire
iOS는 매년 새로운 API를 출시하는가 하면, 예전에 있던 API를 제거하기도 합니다. 하지만 상용 앱을 만드는 입장에서 타겟은 늘 정해져 있죠. iOS의 장점 중 하나가 프래그멘테이션 최소화를 통해 강력한 새 기능들을 최대한 많은 사람들에게 제공한다는 데 있기 때문에, 새 기능을 도입하는 것은 필수적입니다. 그러면서 하위호환도 생각해주기 위해, #available을 이용해서 분기 처리를 해 줍니다. 사용 방법 if #available(iOS 10.0, *) { // iOS 10.0 이상이라면 이런 행동을 해라 } else { // 아니면 이런 행동을 해라. } *의 의미 원래 플랫폼 여러 개에 대해서 예외처리를 해주는 코드이기 때문에, 아래처럼 다른 플랫폼을 추가해 줄 수 있습니다. 마지막의 *는, ..
UIView에는 animate(withDuration:animations:completion:)라는 애니메이션 메서드가 있습니다. 프레임(frame) 베이스의 앱에서는 아주 직관적이고 편리한 메서드입니다. 하지만 오토 레이아웃을 쓰게 되면 좀 혼란스러워지죠. 프레임처럼 단순히 값만 바꿔주는 걸로는 작동하지 않습니다. 애초에 프레임 값의 변화를 캐치해서 애니메이션으로 만들어 주는 메서드이기 때문입니다. 찾아보면 슈퍼뷰(superview)에 layoutIfNeeded()를 사용하면 된다고 하는데, 모든 서브뷰를 다시 레이아웃하는 메서드인 만큼 부작용이 따를 수 있습니다. 게다가 뷰의 레이아웃 뿐만 아니라 컬러라든가 컨텐츠 등을 업데이트하는 것도 같은 타이밍에 애니메이션되어야 한다면 머리가 좀 아파집니다. 관..
어느 사회적인 기준이든, 그 기준을 잘 지켜낸 사람들에게는 안정감이 주어진다.어쩌면 모든 사람들이 찾아 헤매는 것. 괜찮다는 한 마디를 누구에게든 들을 수 있다. 그리고 나면 나머지는 그저 작은 불만들이다. 자아 실현 같은, 그다지 중요하지 않은 것들 말이다. 부럽다. 근데 난 이미 늦은 거 같다. 그래서 이제 그런 기준을 쫓아 사는 데는 큰 관심이 없다. 그렇다고 해서 꿈만 먹고 사는 일에도 흥미를 못 느낀다. 문제는 욕심까지 없어진 건 아니라는 데 있다. 성공하기 위해 사는 일도, 꿈을 먹고 사는 일도 각자 나름대로의 욕심을 채운다. 돈과 돈에서 오는 안정감, 성취감. 성취와 성취에서 오는 돈과 안정감. 뭐가 어디서 출발했든, 어느 게 어느 것보다 우월할 것도 열등할 것도 없다. 나도 그런 걸 갖고 ..
이니페이 모바일(INIPay Mobile)은 이니시스(INICIS)의 서비스 중 하나로, 앱 내에서 웹뷰를 이용해 결제 서비스를 제공할 수 있도록 하는데요. 직접 iOS에 붙이면서 배운 점을 정리해 보았습니다. 언어는 Swift 4.0입니다. 주의할 쿼리, P_RESERVED 앱 내에서 웹뷰를 띄울 때를 위한 대부분의 설정은 여기서 해 줍니다. 그런데 P_RESERVED는 '복합 필드'라고 해서, P_라는 프리픽스가 붙는 쿼리들과 섞여서 요청되게 되는데 그 값에 문자열 &이나 = 들어가야만 합니다. INIPay 문서 쪽에는 이 처리를 위한 iOS 가이드가 없습니다. 따라서 캐릭터셋 중에 .alphanumerics이라는 놈을 이용하여 퍼센트인코딩을 해 주었습니다. 일단 잘 동작하긴 하지만, 테스트를 많이 ..
Closure 안에서 self를 무심코 참조하여 쓰는 경우가 많습니다. 하지만 Swift에서는 Closure가 일급 객체이기 때문에, self의 프로퍼티로 저장될 수도 있습니다. 아무 조치 없이 그냥 쓴다면 상호참조로 인해 메모리 누수가 발생하기 쉬운데요. 그래서 클로저 파라미터 앞에 [weak self]를 넣어 리테인 카운트를 올리지 않은 채 참조할 수 있도록 해주는 것이 필요합니다. 이렇게 weak 키워드를 넣으면 클로저 내부에서는 self를 옵셔널로 판단합니다. 쓰려면 까 주어야죠. someInstance.someFunction { [weak self] param in guard let `self` = self else { return } self.someOtherFuction(param) //아니..
앱 개발을 하게 되면 보통 UI 디자인은 Sketch로 하게 됩니다.그리고 그 디자인을 제플린이나 여타 툴로 받아서 구현하게 되는데요. 제플린은 정말 좋은 툴이라 텍스트에 필요한 여러 옵션을 읽어서 글꼴 프리셋을 만들어 주기도 합니다. 하지만 늘 그렇듯 자동화라는 게 스스로 짜놓은 것만 못하고, 또 어쩌다가 실수로 0.1만 틀려진 설정도 다 다른 설정으로 받아들입니다. 그렇다고 안 쓰자니, Sketch에서는 버튼 한 두개로 바꿀 수 있는 설정이 개발에서는 그리 간단히 되질 않습니다. 그래서 스케치에서 할 수 있는 글꼴 설정의 (거의) 모든 걸 지원할 수 있는 익스텐션을 만들었습니다. Code extension String { enum AttributePreset { case body case headli..
누구든 건드리면 안 되는 영역이 있다는 말을 들었다. 그 때 나의 반응은, 그걸 건드리면 안 되는지 내가 어떻게 아는가 하는 반발심이었다. 그런데 생각해 보면 사람은 물건이 아니라서 그 사람과 잘 지낼 수 있는 설명서 따위가 제공될 리 만무하다. 제조사조차 만드는 역할 그 자체에 크게 관여하지는 않았기 때문에... 당연히 없는 거더라. 인간은 설탕파의 큰 갈래 중 하나일 뿐이다. 지구상에 널려 있는 설탕을 이용해 생을 이어 나가는, 지구식 생명체의 한 갈래. 인간은 생존능력이나 육체능력으로 보면 다른 종보다 딱히 나을 것이 없지만, ‘범(general)’과 ‘용(use)’을 개발해낼 수 있는 감각기관과 인지능력을 갖추고 있다. 처음에는 단순히 생존을 위해 발전시켰을 시력이 주변 환경을 분석할 수 있도록 ..
(이 포스팅은 StackOverFlow의 이 답변의 아이디어를 기반으로 간단한 수정만을 거쳤음을 알립니다.) iOS에서 로컬라이제이션을 하려면 아래와 같은 코드를 사용합니다. myLabel.text = Bundle.main.localizedString(forKey: "쓰고자 하는 글", value: nil, table: nil) 스트링이 들어가는 모든 부분에 말이죠. 한두번도 아니고 말그대로 수십번 이렇게 쓰는 것은 쉬운 일이 아닙니다. 그래서, 이 똑같은 걸 간단하게 바꾸는 아이디어가 있기에 가져와 보았습니다. 그러니까 스트링이 들어가는 모든 부분에 필요한 거잖아요. 그럼 스트링한테 시키면 된다는 겁니다. extension String { var localized: String { return Bund..
2016년 겨울, 보수 정당인 새누리당과 그 우두머리 대통령 박근혜 정부 일어난 일은 여러 모로 많은 변화를 가져왔다. 세상이 바뀔 필요가 있다고 생각하는 사람들에게 그 사건은 드디어 터질 게 터진 사건이었고, 기존 질서를 믿었던 사람들에게는 배신감으로 다가왔다. 어느 쪽이든 이대로는 안 되겠기에 거리로 나왔고, 사실을 받아들일 수 없을 정도로 충격받은 사람들도 깃발을 들고 거리로 나왔다. 그렇게 겨울을 추운 거리에서 보내고 새해가 밝았다. 이제 한국은 공식적으로 바꿀 것이 많은 나라가 되었고, 청산이 가장 큰 목표가 되었다. 탄핵 사태로부터 딱 1년이 되는 지금, 무엇이 달라졌을까. 젊은이들은 자기가 못나서 그런 것이라는(노오오오오오력이 부족해서 내가 이꼴로 사는구나) 상처(일부는 사실이지만)에서 벗어..
개요 Crashlytics는 모바일 앱에서 발생한 크래시를 개발자가 알 수 있도록 해 주는 솔루션입니다. (언어 : Swift) 사용법 Fabric ID가 필요하며, iOS에 해당하는 라이브러리는 CocoaPods을 통해 설치합니다. Kit를 프로젝트에 추가하기 // Podfile pod 'Fabric' pod 'Crashlytics' // Run Script Build Phase "${PODS_ROOT}/Fabric/run" ##################API KEY################ // Info.plist Fabric APIKey ##################API KEY################ Kits KitInfo KitName Crashlytics Crashlytics ..