애플이 제공하는 설정으로의 이동은 인앱 설정 정도 밖에 없다. 혹시라도 Settings 메인화면으로 가는 거라면, 폰이 제공하는 시스템 팝업을 이용한 경우 라고 보면 될 것 이다. 1. 가능한 한 많은 사람들이 설정 영역으로 이동하지 않고 작업별 옵션을 수정할 수 있도록 합니다. 설정 까지 이동하지 말고, 해당 페이지에서 제공하는 것울 우선함 2.필요한 경우 앱 수준 옵션을 별도의 설정 영역에 넣습니다. 앱의 설정 영역에서 제공 하는 것을 권장함. 사용자들은 인앱 설정으로 잘 이동하지 않음 3. 제공하는 설정의 수를 최소화합니다 설정이 너무 많으면 앱에 대한 접근성이 떨어지고 특정 설정을 찾기가 어려워질 수 있습니다. 4. 사람들의 시스템 전체 설정을 존중하고 앱별 설정 영역에 중복 버전을 포함하지 마십..
테스트 함수에서 제공하는 스크린샷 기능을 사용해 본다. 최종 목적지는 버튼을 눌렀을 때, 나오는 화면을 캡쳐해서 폴더에 저장 하는 것이다. (나중에 slack 같은 곳에 업로드도 가능할 거 같다.) 1. 먼저 버튼 을 클릭하면 나오는 화면을 캡쳐하는 테스트 코드를 작성한다. 코드는 앱을 런칭하고 버튼을 누르면 약간의 딜레이 후에 스크린샷을 찍고, 어테치먼트에 추가하는 코드이다. func testButtonClickEventResult() throws { //given app.launch() //when app.buttons["Button"].tap() //then sleep(10) let screenshot = XCUIScreen.main.screenshot() let attachment = XCTAtt..
보통 iphone se (1st) 가 가장 가혹한 UI환경 이므로 해당 기기에서 테스트 되도록 해야하고, 자동으로 빌드와 동시에 테스트 되도록 하는 스크립트를 가져와서 내 프로젝트에 맞게 수정한다. (자료를 포스팅 해준 뱅크샐러드에게 무한 감사) 1. 시뮬레이터 를 가져오는 스크립트 getSimulatorMatchingCondition.rb require "json" deviceName = ARGV[0] runTime = ARGV[1] json = JSON.parse(%x(xcrun simctl list 'devices' -j)) devices = json["devices"]["com.apple.CoreSimulator.SimRuntime.iOS-#{runTime}"] if devices == nil p..
xcode가 업데이트 되면서 iphone se (1st) 시뮬레이터를 자동으로 넣어 주지 않는다. iphone se (1st) 가 가장 작은 폰이라 무조건 테스트를 해야 하는 빈번하게 사용하는 시뮬레이터라서 수동으로 넣는 법을 작성해 둔다. 1. xcode 상단 메뉴 중 window -> Device and Simulator 로 이동 2. 좌측 하단의 + 버튼을 눌러서 iphone se (1st) 를 추가 한다. 화면 중간에도 +가 있는데 전체 창의 좌측 하단 이다. 선택하고 create 누르면 이제 시뮬레이터 리스트에 보여진다. 2022.07.28 - [iOS/Test] - 스크립트로 빌드와 테스트 동시에 하기( iphone se 1st)
UITextField 가 변하는 값에 대해 Rx 형태로 구독을 하고 구독한 값이 변경 되었을 때, 해당 값을 UserDefault로 기록하는 코드를 작성 해 보았다. 순서는 아래와 같다. 1. 스토리 보드에서 UITextField 를 만들어 붙여넣고 2. IBOutlet으로 소스코드로 이어서 변수 생성 3. orEmpty 로 optinal -> String 형태로 받아온다. 4. obserbable 형태로 변환하기 위해 asObservable()을 사용한다. 5. 같은 값으로 호출 되는 것을 막기 위해 distinctUntilChanged()를 사용한다. 6. 구독하고 클로저에서 처리할 내용을 작성한다. 소스코드 @IBOutlet weak var searchTextField: UITextField! pr..
코딜리티에서 예제 Sort를 풀어 보았다. 주요한 문제 해결 전략은 입력된 데이터를 소팅하고 나서 답을 찾는 것 이다. 1번 문제는 set으로 중복을 제거하고 개 수를 리턴 했다. def solution(A): B=set(A) return len(B) 2번문제는 sort 이후에 최대값을 찾는 형태로 음의 입력이 있는 것을 감안하여 CASE가 하나 더 나오는 것이 주요 했다. def solution(A): B = A.sort() if A[0]*A[1]*A[-1]> A[-1]*A[-2]*A[-3]: return A[0]*A[1]*A[-1] else: return A[-1]*A[-2]*A[-3] 3번문제는 input 이 특정 숫자 이하 일 때 예외처리, sort 이후에 순차적으로 1회 탐색 하는 형태로 해결..
1. 설치 Podfile 에 추가 해 준다. pod 'RealmSwift' 2. 기본 사용 방법 테스트용 class 생성 @objc dynamic 은 swift에서 최적화를 하지 말라는 것으로 이해하면 된다. class Person : Object { @objc dynamic var name : String = "" @objc dynamic var age : String = "" override static func primaryKey() -> String? { return "name" } } Init 초기화는 단순하다. print 문을 찍은 이유는 생성되는 .realm 이라는 db 파일의 위치를 알기 위함이다. //init let realm = try! Realm() print( Realm.Config..
- Total
- Today
- Yesterday
- geohash
- jenkins
- GCD
- bitrise
- firebase
- 코테
- ATS failed system trust
- 같이쓰기
- async
- ChatGPT
- 무료는 아니지만
- AWS IoT
- 빌드자동화
- CI/CD
- IF (KAKAO) DEV 2022
- ios
- Fastlane
- AppThinning
- RxSwift
- Default Rules
- chatgpt 4o
- swift
- MQTT
- 프로그래머스
- swiftLint
- Moya
- 모듏화
- xcode whitespace trim option
- GPT4
- XCTestExpectation
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |