[iOS] NSDataDetector에서 발생한 이슈 공유 iOS

구글신을 통해 찾은 string에서 link 찾아내기. 

당연하게도(?) 간단히 복붙해서 사용중이었다. 


extension String {

    public func extractAllLinks() -> [NSTextCheckingResult]? {
        let types: NSTextCheckingResult.CheckingType = .link

        let detector = tryNSDataDetector(types: types.rawValue)
        guard let detect = detector else { return nil }

        let matches = detect.matches(inselfoptions: [], rangeNSRange(location0lengthself.count))
        return matches
    }

}


하지만, 당연하게도(?) 버그가 발생했으니...


링크가 텍스트의 하단에 존재할 경우, http://gsstudio.egloos.com/category/iOS 이런 링크일 경우


matches 에는 http://gsstudio.egloos.com/categ 중간에 잘라서 찾아내는게 아닌가.



빠르게 결론만 얘기하자면 range가 잘못된 문제였던듯 싶다. 



let matches = detect.matches(in: self, options: [], range: NSRange(location: 0, length: self.utf16.count))



range의 length를 utf16으로 값을 정확히 잡아주었다. 한글 등등 때문에 정확히 range를 못잡아서 짤린 것 같다. 


텍스트는 항상 유니코드 조심하자... 


끝.


[IU] 있잖아 ETC


오늘은 지은이 열애설.

중학생이었던 우리 지은이 벌써 만삼십세.


언제나 사랑받는 아이 지은아.


어느새 현재가 된 미래에서 

네 이름을 불러줄 사람을 만났니.

너의 옆자리를 고른 사람은 손을 꽉 잡고 함께 바람을 세로질러줄 사람이길.


여전히 무릎 나온 추리닝을 입는 삼촌은

이제야 조금 철이 들어서 

네가 더 미안해할거란 생각에 마음이 아프다. 


너를 알게 되서 기뻤고, 너를 사랑해서 좋았다. 

여전히 너의 걸음에 의심없이 의문 없이 그 다음으로 가는 너를 따라 부지런히 걸어간다. 


오르골은 없어서 아이폰에 담아둔 사랑시를 듣고 또 듣고 영원히 되감고 있어. 

나의 삶 어느 부분, 유난히 긴 밤 기꺼이 헤메고는 있지만, 곁에 함께 걸어주어 고마워.

너와 함께 있음이 여전히 자랑이고 다시 마주하기 어려운 행운이다. 


툭툭 살다 또 만나. 어떤 꿈을 꾸었는지 깨어나면 또 들려줘. 

봄 여름 가을 겨울마다, 네가 놓아둔 한 송이를 한 컵에 한 장만큼 적셔 한 숨으로 봄이 되어 와준 널 그리며 기다린다.

살랑 살랑 불어오는 봄바람에 안녕하며.


열애가 흘러가던 하루 끝에 하나부터 열까지 다 널 위한 잔소리 늘어놓는 친오빠처럼 쓰는 글.


to my boo.




[iOS]typealias는 이런 식으로도 쓸 수 있다. iOS

예시 소스코드는 kingfisher

#if os(macOS)

import AppKit

public typealias KFCrossPlatformImage = NSImage

public typealias KFCrossPlatformView = NSView

public typealias KFCrossPlatformColor = NSColor

public typealias KFCrossPlatformImageView = NSImageView

public typealias KFCrossPlatformButton = NSButton

#else

import UIKit

public typealias KFCrossPlatformImage = UIImage

public typealias KFCrossPlatformColor = UIColor

#if !os(watchOS)

public typealias KFCrossPlatformImageView = UIImageView

public typealias KFCrossPlatformView = UIView

public typealias KFCrossPlatformButton = UIButton

#if canImport(TVUIKit)

import TVUIKit

#endif


그동안은 typealias를 써온 방법을 나열하자면.. 
  • 단순치환
  • closure를 깔끔하게 만들기
  • 프로토콜 선언 시에 사용

정도였던 것 같다. 
kingfisher가 업데이트가 많이 된걸 이제 봐서 소스코드좀 살피다가 단순하고, 당연한건데, 정리 안해놓으면 잊어버려서 검색할 단어도 알기 어려운 그런 느낌이라, 단순하게 정리. 

전처리기와 함께 사용하여 OS별로 다른 클래스를 정의하도록. 
아무래도 저렇게 작업할 일은 많지 않다보니 iOS개발을 오래 해왔어도 저렇게 쓸 일이 없었던듯 하다. 
다른 언어였으면 좀 해봤었을까.. 싶지만, 아무튼 내가 알게 된거 내가 좋아서 정리하고, 기억하면 된거지.

끝.

[iOS] 아아. 이것이 의존성 주입이라는 것인가. iOS

만들고 있는 회사앱도 그렇고, 개인적으로 개발중인 "소리성경" 앱도 그렇고, 쬐끔씩 쬐끔씩 코드를 수정하는 일들을 취미삼아 하고 있다.

몇년간 의존성 주입(dependency injection)에 대해 헤맸고, 작년에 깨달음을 얻은뒤에 요샌 여기저기 사용중이다.

protocol IAPProtocol {

    func getProducts() -> Observable<[SKProduct]>

    func purchase(product: SKProduct) -> Observable<Bool>

    func restorePurchase() -> Observable<Bool>

}


인앱결제 의존성 주입을 위한 프로토콜. 
뭐.. 이번에야 만든거지만. 

1차로 IAPHelper 라는 구글인가 유튭에서 찾아서 복붙한뒤 수정한 코드를 사용했고, 

2차로 SwiftyStoreKit을 사용했다. 

위 둘의 문제는, receipt validation을 앱내에서 사용해야한다는거. 
말만 serverless가 아닌 정말 서버없이 서비스를 만든터라, recept validation이 큰 고민이었다. 

뭐 아무튼 그래서 선택한게 RevenueCat

그리고 인앱결제 서비스 용  protocol을 만들고, 결제 ViewModel에 해당 서비스를 넘겨줄 계획. 


잘 만들어진다면, 추후에  aws lambda 쪽에 receipt validation 기능을 만들 때, 그때는 결제 viewModel 수정없이 가능할듯. 

[iOS]개발하다보면 무진장 귀찮은 keyboard show/hide iOS

⌨ 

키보드가 나타나고 사라지는걸 처리하는게 여간 귀찮은게 아니다. 

스크롤뷰,테이블뷰같은 scrollable 한 애들 안에 textfield가 존재하면, 

스크롤뷰가 최하단이 가려지지 않도록 scrollview의 bottom을 키보드 높이에 맞춰 올려줘야한다. 

NSNotification.Name.UIKeyboardWillShow
NSNotification.Name.UIKeyboardWillHide

그걸 위해서 위의 두 notification을 viewcontroller에 등록해서
scrollview의 bounds를 조절하거나, scrollview의 bottom autolayout constraint의 constant의 값을 조절한다. 

나는 autolayout을 자주 사용하는 편이고, scrollview의 하단 bottom contraint를 

근데 그걸 viewcontroller마다 넣어줘야하는게 엄청 귀찮다는 말이지...


그 귀찮음을 해결해줄 오픈소스를 깃헙에서 발견했다. (MIT 감사합니다 MIT 라이센스 ㅠㅠ)

코드는 매우 간단하다. 
NSLayoutConstraint 를 상속해서 내부에서 show/hide를 처리해준다.
주의할점은 constant를 +하기 때문에 first item과 second item이 무엇이냐에 따라 변하는게 달라진다. 
뭐 직접 실행하고 돌려보며 적용하면 간단한거니. 

safe area 때문에 코드 수정이 필요한 부분도 있긴 한데, 이 난해한 글로 이해하셨다면 그정도는 잘 하실거라 생각한다. 

xib에서 custom class를 변경하는게 가장 간편하고, xib를 안쓴다면.. snapkit에는 이걸 어떻게 써야하나..

음 그건 알아서 잘 적용하시길.. 😁



1 2 3 4 5 6 7 8 9 10 다음


adsence 160x600