iOS Unable to process request - PLA Update available 해결방법

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


Unable to process request - PLA Update available

App Store Connect를 들어가 프로그램 라이선스 동의를 해주면 된다.

  1. 자신 계정으로 로그인
  2. 상단에 사용권 계약이 업데이트 되었다는 팝업이 뜸
  3. Account > Review Agreement 버튼 눌러줌

Xcode, 프로젝트에서 pod 삭제 후 재 적용해보기

|

개인적인 연습 내용을 정리한 글입니다.
더 좋은 방법이 있거나, 잘못된 부분이 있으면 편하게 의견 주세요. :)


Xcode, 프로젝트에서 pod 삭제 후 재 적용해보기

제 문제상황은 다음과 같았습니다.

  1. 프로젝트의 이름을 바꿈
  2. 이름을 변경하고 나니 pod install 이 제대로 실행이 되지 않았다.
  3. 실제 모든 프로젝트의 이름을 변경했는데도 계속해서 실행이 되지않았다.
  4. xcode 내부에서는 프로젝트명이 제대로 변경되어있었는데, 파인더를 통해 확인해보니 xcworkspace에 해당하는 파일명이 변경되지 않았다.
  5. 강제로 변경하려고 하니 적용이 되지 않는다.
  6. pod 을 프로젝트에서 삭제하고 다시 실행해야겠다고 생각이 들었다.

이에 대한 방법은 아래와 같았습니다.

  1. 터미널에 pod deintegrate 입력
  2. Podfile, Podfile.lock 파일 삭제
  3. xcworkspace 파일 삭제
  4. xcodeproj 파일을 열어 pod 관련 모든것 삭제
  5. 다시 pod init, pod install

이렇게 하고 다시 open ~.xcoworkspace를 했더니 no scheme 이 뜨더라.
xcode를 cmd + q 를 통해 강제 종료하고 다시 열어보니 정상 작동!

iOS SwiftLint 적용해보기

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


SwiftLint 적용해보기

이전에 글에서는 SwiftLint를 적용했을 때 발생하는 경고들에 대한 해결방안에 대해서만 정리를 했었습니다. > iOS SwiftLint 적용하며 수정한 것들

이번글에서는 좀 더 근간이 되는.. SwiftLint 자체를 프로젝트에 어떻게 적용하는지? 에 대한 방법을 정리해보도록 하겠습니다.

우선 프로젝트에 vi Podfile 한 후 SwiftLint를 추가해줍니다. > pod install

pod 'SwiftLint'

그리고 프로젝트로 돌아와 Target > build phase > + > new run script phase 절차를 밟아줍니다.
그리고 아래 사진처럼 run script에 해당 코드를 추가해 주세요.

${PODS_ROOT}/SwiftLint/swiftlint

그리고 빌드를 해줍니다…
그러면 에러든.. 경고든… 뭔가가…우수수… 나타나게 될 것입니다..

이 swiftLint에는 정말 다양하고도 많고 많은 규칙들이 나오게 되는데요.
이 모든것들을 제가 다 컨트롤 하지못하고 그저 시키는대로만 해야한다면.. 그건 또 너무 힘들겠죠?

그래서 사실 이 규칙들을 또 제가 컨트롤 할수도 있습니다.

하는 방법은 아래와 같습니다.

새로운 파일을 만듭니다. Empty 파일로 만들어주세요.
여기서 중요한 뽀인트는 프로젝트에 파일을 추가해야 하는 것입니다. 프로젝트 > 앱 이름 폴더 안이 아니구요!
프로젝트 자체에 추가!!!!!!!!!!!!!
그리고 이름은 무조건 .swiftlint.yml 로 지어주세요. 무 족 권

그러면 경고창으로 파일 이름 앞에 .을 붙이면 숨김 파일 되는데 너 쓸거야? 라고 물어봅니다. 응~ 쓸거야(Use “.”) 버튼 눌러줍니다.

그리고 이곳에서 각자 예외를 만들어줄 것들을 추가해줍니다.

# 파일 length
file_length: 1200

# 깊이
nesting:
  type_level: 3

# 한줄 길이
line_length: 300

# 함수 길이
function_body_length: 160

# body 길이
type_body_length: 500

# 함수 복잡성
cyclomatic_complexity: 60

# 변수명
identifier_name:
  min_length: 2

# 튜플 최소갯수
large_tuple: 3

# 타입길이
type_name:
  min_length: 2
  max_length:
    warning: 100
    error: 150

# 규칙제거 - 축약
disabled_rules:
- syntactic_sugar
- trailing_whitespace
- compiler_protocol_init

# 제외 경로
excluded:
  - Pods

저는 대략적으로 이렇게 짜놓았습니다.

여기서 집고 넘어갈 부분은 disabled_rules, excluded 정도가 있겠네요.

1. disabled_rules

swiftLint에서 디폴트로 적용되는 규칙들을 내 프로젝트에서는 아닌 상태로 만들어줍니다.

2. excluded

swiftLint가 검사하지 않을 영역을 지정해주는 것입니다.
특정 파일에서 경고가 뜨는데, 별로 보고싶지 않다면 이 특정 폴더 혹은 파일을 제외시킬 수도 있게 됩니다.

저 같은 경우는 코코아팟 라이브러리들에서 나는 에러와 경고는 모두 무시할 수 있도록 지정해놓았습니다.

3. included

추가로 included같은 경우는 유추 가능하듯 반드시 검사가 필요한 영역에 사용해볼 수 있겠습니다.
근데 저는 이 included는 사용하지 않을 것 같네욤..ㅎ..

iOS UIPageControl 사용해보기

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


UIPageControl 사용해보기

이번 프로젝트에서 저는 UIPageControl을 UICollecionView와 함께 사용한 경험이 있습니다.
정확히는 테이블뷰 셀 위에 컬렉션뷰를 놓았고, 그 컬렉션뷰 셀에 대한 페이지 컨트롤을 동작하게 만들어 놓았습니다.

다음 사용방법은 아래와 같습니다.

class HomeTableViewCell: UITableViewCell{
    @IBOutlet weak var collectionView: UICollectionView!
    @IBOutlet weak var pageControl: UIPageControl!

    override func awakeFromNib() {
        super.awakeFromNib()

        // pageControl 
        pageControl.numberOfPages = 2
        pageControl.currentPage = 0
        pageControl.pageIndicatorTintColor = UIColor.white.withAlphaComponent(0.3)
        pageControl.currentPageIndicatorTintColor = UIColor(named: "7A7BDA")
        pageControl.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
    }
}

extension HomeTableViewCell: UICollectionViewDelegate, UICollectionViewDataSource {
    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        // 현재까지 스크롤된 크기를 구함
        let page = Int(targetContentOffset.pointee.x / self.frame.width)
        self.pageControl.currentPage = page
      }
    
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let width = scrollView.bounds.size.width
        let x = scrollView.contentOffset.x + (width/2)
        
        let newPage = Int(x/width)
        if pageControl.currentPage != newPage {
            pageControl.currentPage = newPage
        }
    }
}

이때 여기서 가장 중요한 포인트는 코드에 있지않습니다.

일반적으로 생각해보면 페이지컨트롤이 컬렉션뷰 안에 존재할것같다고 생각할수도 있습니다.
그렇지만 그렇지 않습니다. 컬렉션뷰 바깥에 같은 동일선상에 존재하고 있어야 합니다.

이렇게 말이죠!

iOS AppIcon 추가해보기

|

개인공부 후 자료를 남기기 위한 목적임으로 내용 상에 오류가 있을 수 있습니다.


AppIcon 추가해보기

  1. 1024px 이상의
  2. 사진은 정방형이여야 하고, 확장자는 png 이면서
  3. 제일 중요하게 불투명한 배경을 가진 이미지인 앱 아이콘 이미지를 준비한다.

App Icon Generator

그리고 이 홈페이지에 접속을 하면 준비된 이미지를 드래그 해놓기만 하면 이미지들이 형성이 됩니다.

이렇게 다운로드 파일에 들어가 AppIcon 파일이 저장되어있는 것을 확인했다면 AppIcon.appiconset 안에 생성된 이미들이 종류별로 있음을 확인 가능할 것입니다. 이때 이 AppIcon.appiconset 파일을 통째로 프로젝트 내 assets에 임포트(import) 해줍니다.

그리고 Xcode를 재실행(빌드) 해보고 나면 원했던 앱 아이콘이 제대로 적용 되어있음을 볼수있을 것 입니다.

만약 반영이 안된다면, Target > Build settings > Asset Catalog compiler - Options - Primary App Icon Set NameAppIcon 으로 되어있는지 확인을 해봅시다! 혹은 Assets에 있는 기본 AppIcon 파일을 지우고 직접 만들어 이미지를 임포트 해주면 추가가 되기도 합니다!