10월, 2016의 게시물 표시

EKEventStore requestAccess 사용할때 접근되지 않고 오류날 때 조치방법(Swift3, Xcode 8.1, iOS 10.1)

이미지
일단 오류는 아래와 같은 오류입니다. 기존에 잘되던게 업데이트 하고 나서 안되는 경우입니다. info.plist 에 Privacy - Calendars Usage Description 추가하면  접근 메시지가 보여야 하는데 보여지지 않고 아래와 같은 오류가 나는 겁니다. 오류에 대한 대처는 전부 다 해본거 같습니다. 아래와 같이 수정하니 이부분의 오류는 나지 않고 잘 넘어갑니다. 접근 메시지도 잘 나옵니다, 결론은 error: Error? 이부분에서 ? 를 넣어주니 오류가 안납니다. 옵셔널 값에 대한 널을 허가 해주는 부분인거 같습니다.

Xcode 8 에서 GoogleMobileAds 추가하는 방법

이미지
XCode 8 에서 GoogleMobileAds 를 추가하는데 보통 cocoapods 을 사용한다. 하지만 이부분이 오류가 나서 되지 않는다. 그래서 수동으로 추가하니 No Such Module 오류가 난다. 매뉴얼을 보니 수동으로 추가하는 방법은 이렇다. Xcode -> File -> Add Files to "Project name" 를 클릭한다. 그러면 새로운 파일 선택 창이 뜬다. 여기서 다운 받은 Framework 파일 들을 선택한다. GoogleMobileAds.framework FirebaseAnalytics.framework FirebaseInstanceID.framework GoogleInterchangeUtilities.framework GoogleSymbolUtilities.framework GoogleUtilities.framework 위와 같은 파일은 선택하고 반드시 if need copy 를 체크해야 한다. 그러면 Xcode 왼쪽 프로젝트 파일 부분에 추가가 된다. 이제 소스에서 import GoogleMobileAds 를 추가해보자. 난 이렇게 하니 오류가 나지 않는다.

source code 이쁘게 나타내는 방법

설정의 템플릿에 헤더 부분에 아래 두개의 자바스크립트를 추가한다. https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/highlight.min.js https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/github.min.css 스위프트 코드 시험 func LongPress(_ gestureRecognizer:UIGestureRecognizer) { if gestureRecognizer.state == UIGestureRecognizerState.began { typingPlayer?.play() if view.subviews.contains(tableViewUser) { tableViewUser.removeFromSuperview() } userTextField.text = ShiftUserArray[selectedIndex] userTextField.layer.zPosition = userButton.layer.zPosition + 0.1 userTextField.isHidden = false userTextField.becomeFirstResponder() } }

swift 3 에서 AutoLayout 적용 후 하위 뷰의 width 값이 1000으로 이상하게 나올 경우

swift 3 에서 AutoLayout을 적용하였다.  하위 뷰에 코드로 생성하여 프레임 단위로 버튼을 여러개 넣는데 잘 안나온다.  로그를 찍어보니 Button.width = 1000 으로 나온다.  view.width = 375 인데....,  뭐가 잘못되었나?  동적으로 생성되는 많은 버튼도 전부 AutoLayout 방식으로 하자니 그동안 계산으로 만들어 놓은 코드가 아깝다.  단 한줄의 코드로 문제를 해결하였다.  전체적인 아웃라인은 뷰를 이용하여 디자인 타임에 스토리보드에서 작성을 하고 동적 생성은 뷰에 프레임 계산해서 넣으면 된다.  뷰가 로드 된 다음에 다음 줄을 넣어야만 정상적인 값이 나와서 계산이 가능하다. self.view.layoutIfNeeded() 나는 이런 방법으로 문제를 해결하였다.  계산 값 바로 이전에 넣어도 되는데 귀찮아서 viewDidLoad() 에 넣었다.

애플 개발자 사이트 접근할 때 forbidden 403 오류 뜰 때

평소와 같이 애플 개발자 사이트에 접근을 했습니다. 하지만 브라우저는 forbidden 403 화면만 보여주더군요. 사파리로 접속했는데...., 위 오류는 서버에서 접근 권한이 없는 주소를 접근했을 때 나는 오류인데요. 보통 캐시나 쿠키를 삭제하고 다시 접속하면 세션이 초기화 하기 때문에 해결됩니다. 이런 사파리 쿠키 삭제하는 법을 모르겠네요. 사파리 메뉴를 클릭하면 환경설정 바로 밑에 방문기록 지우기가 있습니다. 이걸 이용해서 기존 삭제된 기록을 지우고 다시 접속하면 됩니다. 저도 이런 방법으로 해결했습니다.

This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. 오류 조치 방법

swift 3 에서 작성하는 도중에 이런 오류가 발생했다. This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread.  대충 내용은 백그라운드에서 메인 스레드를 접속해서 뭔가 안 맞는다는 이야기 같다.  검색 결과 디스패치를 구현할 때 백그라운드에서는 데이터 처리만 그리고 메인은 UI 처리만 하면 된다고 한다. DispatchQueue.global(qos: .background).async { // 오직 데이터 처리만 DispatchQueue.main.async { // 오직 UI } } 위와 같이 처리하니 오류가 안난다.

아이폰 위치정보와 지하철 역과 거리 구하기

서울시에서 제공하는 지하철역과의 거리 구하는 URL 은 좌표가 WTM 방식이다. 하지만 대부분의 스마트폰의 좌표는 WGS84 방식이다. 이를 변환하는 다음 개발자 URL 도 있기는 있지만 이러한 방식으로 구현해서 확인했더니 속도가 나오지 않아서 인터넷에 돌아다니는 소스를 참고 삼아 메소드를 만들었다. // wgs84 좌표 사이의 거리 측정 후 정렬하여 가까운 역 표시 func distanceBetweenCoordinate(lat1: Double, lon1: Double) -> [String] { var distanceStaion:[String:Double] = Dictionary()//[:] // 현재 위치와 subways 좌표와 계산하여 distance.append(code, distance) 넣으면 된다. for subway in subways { let lat2 = subway.latitude let lon2 = subway.longitude let theta = lon1 - lon2 var dist = sin(deg2rad(deg: lat1)) * sin(deg2rad(deg: lat2)) + cos(deg2rad(deg: lat1)) * cos(deg2rad(deg: lat2)) * cos(deg2rad(deg: theta)) dist = acos(dist) dist = rad2deg(rad: dist) dist = dist * 60 * 1.1515 // Kilo Meter dist = dist * 1.609344 distanceStaion[subway.name] = dist } // 계산 끝났으므로 다시 하지 않도록 설정 _isDistance

Xcode slow index 문제 해결 방법

이미지
Xcode 에서 배열을 만들었는데 slow index 만 뜨고 진행이 되지 않는다. 위와 같이 filter 만 걸었는데 인덱싱 문제가 발생했다. filter 부분을 주석처리하니까 괜찮아졌다. 배열 부분에서 타입이 맞지 않거나 그러면 인덱싱 문제가 발생되므로 콜렉션 분야을 다룰땐 조심해야 겠다.