본문 바로가기
728x90

iOS106

HTTP 허용 API 호출을 하거나 어떤 사이트에 접근하거나 다운로드 등을 할 때 주소가 http로 시작하는 경우가 있습니다. https가 아닌 경우에는 에러가 발생하면서 접근이 불가능 합니다. 그럴 때는 간편하게 info.plist에서 몇가지 작업을 해주면 금방 해결이 가능합니다. 첫번째 방법. info.plist에 아래처럼 설정해주면 모든 http 접근이 가능해집니다. 두번째 방법. 첫번째 방법은 보안상 좋지 않은 방법이라고 하네여 그래서 특정 도메인만 허용하도록 설정 하는 방법도 있습니다. 2023. 9. 16.
페이지네이션(Pagination) 개발 시 발생할 수 있는 문제 생각보다 페이지네이션 작업은 까다롭다고 느껴진다. 페이지네이션 개발 방법은 예제가 많으므로 구현 자체는 어렵지 않지만, 깔끔하게 동작 하지 않는 경우가 너무 많은 것 같다. 아래 주의 사항은 내가 개발 하면서 마주 했던 문제점들을 해결하는 방법이다. 1) 최초 화면이 로드 될 때, 스크롤이 맨 밑에 있다고 인식 하는 경우 scrollViewDidScroll(_:) 에서 스크롤이 맨 밑에 도달 할 경우 새로운 페이지를 로드 시킨다면 처음 부터 새로운 페이지를 로드 하려 하기 때문에 오류가 발생한다. 이럴 때엔, 사용자가 스크롤 했다는 것을 알려주는 flag를 활용 할 수 있다. scrollViewWillBeginDragging(_:) { flag변수 = true } scrollViewDidScroll(_:.. 2023. 8. 31.
날린 작업 내역을 복구해보자 gitignore 가 제대로 동작 하지 않아 캐시를 날려봄.. 캐시를 날리기 전에 작업했던 내용들은 미리 커밋을 해야했는데..... 너무나 순식간 이었다.. 엔터를 누르는 순간 아차 싶었지만 이미 늦어버림... 와... 오늘 작업한 내용 싹 날려버렸넹 ㅎㅎ 회사 대리님에게 하소연을 했는데 다행히 Local History 라는걸 알려주셨다. 자동으로 그 간 작업한 내용이 저장되면서 이 히스토리가 로컬에 쌓인다는 것이다. 1. finder에서 복구가 필요한 파일의 위치로 이동 2. 파일을 텍스트에디터로 열어준다(나는 그냥 애플의 텍스트편집기로 열었다) 3. 상단 메뉴에 파일 - 다음으로 복귀 - 저장 파일 또는 모든 버전 탐색 4. 원하는 파일의 내용을 복사 5. Xcode에 해당 파일을 열어준다. 6. 복.. 2023. 3. 31.
unlisted app(등록되지 않은 앱) 배포 방법 특정 회사나 사람을 대상으로 앱을 만들경우 애플에서는 회사일 경우 '엔터프라이즈 계정'을 이용하여 배포하거나 'MDM솔루션'을 이용하라고 한다. 이 외에는 unlisted app으로 배포하는 것을 추천한다. (만약, 특정 회사만 사용하는 것이 노출 되지 않을 경우 특정 회사에서만 사용하는 앱 이더라도 일반 앱스토어 배포를 먼저 시도해보자) 만약 내가 근무 중인 회사 내 직원들에게 배포가 되는 거라면 엔터프라이즈 계정이나 MDM이용에 어려움이 없으나 외부에서 만들어진 앱의 배포가 필요하다면 unlisted app 으로 배포하는 것이 가장 깔끔하다. 1. 일단, 보편적인 방법 그대로 app store connect에 등록하고 심사 제출을 한다. 제출할 때 심사 메모 섹션에 unlisted app(등록되지 않.. 2023. 3. 3.
애플 리젝 ㄴ 이번에는 통과해도 다음엔 통과 못할 수도 있는게 애플 심사.... Guideline 2.1 - Performance - App Completeness We discovered one or more bugs in your app. Specifically, your app did not respond when we tapped on “버튼.” Please review the details below and complete the next steps. Review device details: Device type: iPad //애플에서는 아이패드를 이용해 테스트 진행함 OS version: iOS 15.1 Next Steps Please run your app on a device to reproduce .. 2023. 3. 3.
UINavigationViewController (with. Coordinator Pattern) 지저분한 viewController를 정리해보자 UINavigationController를 좀 더 관리하기 쉽고 재사용하기 쉽게하려면 Coordinator 패턴을 이용하면 된다. 한 곳에서 viewController들이 push되고 pop되는 등의 관리를 하고, 사용하는 곳에서는 관리클래스의 함수 하나만 호출해다 쓰면 된다. 기존의 방식은 let vc = self.storyboardinstantiateViewController(withIdentifier: "id") as! someViewController self.navigationController.pushViewController(vc, animated: true) 이렇게 매번 Avc가 Bvc를 알아야 했다. 이는 객체간 결합도가 높아지게 하는 방식.. 2023. 3. 2.
TableView 기본적인 테이블뷰 구현 방법 RxSwift에서는 옵저버블과 테이블뷰를 바인딩 하는 방식으로 데이터를 표시해주기 때문데 테이블뷰의 datasorce와 delegate를 연결해줄 필요가 없다. import UIKit import RxSwift import RxCocoa class MyTableViewViewController: UIViewController { @IBOutlet weak var table: UITableView! let priceFormatter: NumberFormatter = { let f = NumberFormatter() f.numberStyle = NumberFormatter.Style.currency f.locale = Locale(identifier: "Ko_kr") return.. 2023. 3. 2.
distinctUntilChanged(compare: ) let numbers = [1, 1, 2, 4, 4, 3, 5, 7, 1] Observable.from(numbers) .distinctUntilChanged { !$0.isMultiple(of: 2) && !$1.isMultiple(of: 2) } .subscribe { print($0) } .disposed(by: disposeBag) next(1) next(2) next(4) next(4) next(3) completed 과정 1 -> 1 1 1 true true 1 2 true false -> 2 2 4 false false -> 4 4 4 false false -> 4 4 3 false true -> 3 3 5 true true 3 7 true true 3 1 true true 1. 첫번째 값은.. 2023. 2. 20.
네이버 지도 API * 주의 사항 네이버 지도 API 사용시 메모리 해제가 되지 않는 문제가 있으니 주의 필요! 마커 위 정보창 기본 NMFInfoWindow *infoWindow = [NMFInfoWindow new]; NMFInfoWindowDefaultTextSource *dataSource = [NMFInfoWindowDefaultTextSource dataSource]; infoWindow.dataSource = dataSource; // 내가 생성해둔 마커 사용 NMFMarker * marker = [NMFMarker new]; if (marker.infoWindow == nil) { // infoWindow를 marker에 넣어 open [infoWindow openWithMarker:marker]; } els.. 2023. 2. 15.