swift 에서 mp4 파일 bundle 에 추가하고 url 로 가져올 때 nil 값이 나올 경우

이미지
 아이폰 앱에서 사용할 데모 영상파일을 추가하였습니다. 이 파일을 가져오는 버튼 이벤트에 다음과 같이 추가하였습니다. 실제로 실행해보니 가져오지 못하는 겁니다. 프로젝트엔 파일이 있는데요. 이 경우 프로젝트 파일로 갑니다. 그런 다음 타켓을 선택합니다. 상단 탭에 Build Phases 가 있어요. 이 부분에 파일이 없으면 추가합니다. 제 경우엔 여기에 파일이 없어서 추가했더니 잘 나옵니다. 아마도 처음 추가할 때 복사가 잘 안되었던거 같아요.

Xcode 11.7 업데이트 후 iPhone not available 오류 조치 방법

이미지
 Xcode 11.7 로 업데이트를 하였다. 하지만 오류가 생겼다. 오류 화면 - 1 컴파일 할 때 이 화면과 같은 오류가 생겼음 몇번을 다시 연결하고 심지어 XCode를 재설치하기까지 했다. 이에 대한 조치 방법은 아래와 같다. 아이폰 13.6 인데 이에 대한 지원파일이 없는거 같다. 1. 엑스코드를 닫는다 2. 이곳에서 해당 지원파일을 다운로드 받는다. https://github.com/iGhibli/iOS-DeviceSupport 3. 다운 받은 파일을 이곳에 복사한다. /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/ 4. 이제 XCode 를 다시 연다 이와 같이 하면 해당 오류는 나지 않는다. 혹시라도 다시 연결해도 컴파일 오류가 난다면 디바이스 연결 부분에서 언페어링을 하고 다시 페어링을 해보도록 한다.

Let's Encrypt Expiry Bot 메일 조치

 네이버 클라우드에 우분투 서버를 하나 운영하고 있다. 여기에 가비아에서 도메인을 하나 사서 연결시켰음 API 서비스를 위해 https 필요해서 LetsEncrypt 설정하여 Haproxy로 부하분산을 설정했다. 처음에 잘 설정되었다고 생각했는데 인증서 갱신이 되지 않았나보다. 찾아보니 설명이 부실하여 나름 다시 적용하고 정리한다. 1. 80 과 443 포트가 열려 있는지 확인하고 열려 있으면 닫는다. $ netstat -an | grep ':80' $ netstat -an | grep ':443' 만약 열려 있다면 닫는 방법은 haproxy 를 중지하면 된다. $ sudo systemctl stop haproxy 2. standalone 으로 인증서를 발급한다. $ sudo certbot certonly --standalone -d www.example.com 인증서가 발급되면 /etc/letsencrypt/live/www.example.com/ 폴더에 파일이 생성된다. 3. haproxy 에서 사용할 인증서로 생성한다. $ DOMAIN='www.example.com' sudo -E bash -c 'cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/$DOMAIN/privkey.pem > /etc/haproxy/$DOMAIN.pem' 4. 이제 haproxy 를 다시 기동한다. $ sudo systemctl start haproxy 

Realm Studio 사용할 때 시뮬레이터 연결 안될때

이미지
 Realm 디비를 오랫만에 다시 사용하게 되었다. 시뮬레이터로 디비의 내용을 확인하면서 개발을 해야 하는데 Realm Studio 프로그램으로 이를 연결하고자 하는데  사용자 폴더에서 라이브러리가 보이지 않는다. 1. 파인더를 연다. 2. 왼쪽 사인더 바에서 사용자를 선택한다. 3. 상단 설정 클릭한다. 4. 새로운 창에서 제일 밑의 라이브러리 폴더 보기를 체크한다.

서버용 스위프트에서 MongoDB 와 Perfect 사용해서 Collection 수가 replyInt 로 나와서 처리가 힘들때

서버용 스위프트로 모듈을 만들때이다. 보통 API 를 만들때 사용한다. 데이터베이스는 MongoDB를 사용했다. 웹서버 모듈은 Perfect 를 사용했고 디비연결은 PerfectMongoDB를 사용했다. 문제는 컬렉션의 수를 셀때이다. 결과 값이 replyInt(500) 이런식으로 나온다. 이를 Int 로 변경해야 처리가 편한데....., 검색해보니 나오지 않는다. 어쩐다...., let countResult = collection.count(query: bson) if case .replyInt(let count) = countResult {   // 여기서 count 가 Int 이므로 처리하면 된다.   print("count \(count)") } 이 방법을 사용하면 카운트의 수를 가져올 수 있다. 처음에 이게 안되어서 find 결과를 세었는데  수가 많아지면 너무 오래 걸려서  결국은 count 를 사용할 수 밖에 없다.

swift pickerView toolbar > uiconstraintbasedlayoutdebugging 오류 추적

일단 화면에 PickerView 가 있다. 그리고 그 위에 ToolBar 를 추가하여 확인 버튼을 달았다. 하지만 실행하면 uiconstraintbasedlayoutdebugging 오류가 생성되었음. let toolbar = UIToolbar () toolbar. barStyle = . default toolbar. isTranslucent = true toolbar. tintColor = . black toolbar. sizeToFit () let flexBarButton = UIBarButtonItem (barButtonSystemItem: . flexibleSpace , target: nil , action: nil ) let doneBarButton = UIBarButtonItem (title: "확인" , style: . plain , target: self , action: #selector ( endEditing )) toolbar. items = [flexBarButton, doneBarButton] toolbar. isUserInteractionEnabled = true          birthYearTextField . inputAccessoryView = toolbar cityTextField . inputAccessoryView = toolbar 일단 소스는 위와 같이 추가하였음. 검색을 해보니 툴바와 피커뷰를 같이 생성하라고 하는 등등.... 모두 안되었다. 아래와 같이 하니까 오류 없이 잘 된다. let toolbar = UIToolbar (frame: CGRect (x: 0 , y: 0 , width: UIScreen . main . bounds . width , height: 37 )) 즉, 툴바를 생성할 때 크기를 지정해주면 된다.

whose view is not in the window hierarchy

swift 5로 코드를 작성 중이었다. self.performSegue(withIdentifier: "ResultToMainSegue", sender: nil) 이 코드가 실행 되면서 나는 오류이다. 그냥 버튼에 이벤트로 적용하면 잘 되는데... 구글 애드몹을 적용하여 광고를 시청하고 끝나는 시점에 넣으니 오류가 난다. whose view is not in the window hierarchy 검색해보니 대충 이게 첫번째 뷰가 아니어서 그런다 첫번째 뷰를 찾아서 거기서 명령을 실행해야 한다고 한다. 그렇게 해보았다. 역시 되지 않는다. 내가 해결한 방법은 이것이다. DispatchQueue.main.async {   self.performSefue(withIdentifier: "ResultToMainSegue", sender: nil) } 이렇게 하니 잘된다. 현재 뷰에서 광고뷰로 넘어가고 다시 현재 뷰로 넘어오면서 뷰의 계층 구조가 명확히 정립되지 않은 상태에서 메인창을 호출하니 오류가 날때도 있고 아닐때도 있었을꺼 같다. 항상 기초에 충실해야겠다.