GADErrorCode

/// The ad request is invalid. The localizedFailureReason error description will have more
/// details. Typically this is because the ad did not have the ad unit ID or root view
/// controller set.
InvalidRequest = 0,

/// The ad request was successful, but no ad was returned.
NoFill = 1,

/// There was an error loading data from the network.
NetworkError = 2,

/// The ad server experienced a failure processing the request.
ServerError = 3,

/// The current device's OS is below the minimum required version.
OSVersionTooLow = 4,

/// The request was unable to be loaded before being timed out.
Timeout = 5,

/// The mediation response was invalid.
MediationDataError = 7,

/// Error finding or creating a mediation ad network adapter.
MediationAdapterError = 8,

/// Attempting to pass an invalid ad size to an adapter.
MediationInvalidAdSize = 10,

/// Internal error.
InternalError = 11,

/// Invalid argument error.
InvalidArgument = 12,

/// Received invalid response.
ReceivedInvalidResponse = 13,

/// A mediation ad network adapter received an ad request, but did not fill. The adapter's error
/// is included as an underlyingError.
MediationNoFill = 9,

/// Will not send request because the ad object has already been used.
AdAlreadyUsed = 19,

/// Will not send request because the application identifier is missing.
ApplicationIdentifierMissing = 20,

GADPresentationErrorCode

/// Ad isn't ready to be shown.
AdNotReady = 15,

/// Ad is too large for the scene.
AdTooLarge = 16,

/// Internal error.
Internal = 17,

/// Ad has already been used.
AdAlreadyUsed = 18,

/// Attempted to present ad from a non-main thread.
NotMainThread = 21,

/// A mediation ad network adapter failed to present the ad. The adapter's error is included as an
/// underlyingError.
Mediation = 22,

 

 

에러 도메인

"com.google.admob"

반응형

이전 시큐리티기능을 사용하지 않고 따로 히든텍스트라든 변수를 정의해줘서 비밀번호 가리고 보이고하는 기능을 구현해놨었다

해당 스크린을 테스트하기위해 테스트코드를 짜놨었는데....

 

이번 최신 버전을 배포하던중 텍스트필드에 중대한 버그가 발견되어 텍스트필드의 시큐리티 기능을 이용하는 방식으로 전환했다

그리고.. 그 이후로 UI테스트코드를 통과하지 못하고있다

도저히 잘못된점을 모르겠어서 뷰를 하나하나 스택쌓아가듯이 찾아 나아가보지만 여전히 해당 아이디를 가진 텍스트필드를 찾을 수 없다고 오류를 뱉고있었다.

 

나의 이 멍청한 시도를 다른이는 하지 않기를 기도하며 문제점을 여기에 적는다

나는 해당 부분을 이렇게 정의하며 찾아보고있었다.

- 라인2 오류 -

let loginvcContentView = app.otherElements["loginvcScrollViewContentView"]
let pwTextField = loginvcContentView.textFields["loginvcPwTextField"]

UITest에 대해 누가 알려주지 않아 거의 그냥 막코딩이라 변수이름이라던가 방법은 그냥 넘어가줬으면 좋겠다

문제는 loginvcContentView에서 찾는 엘레먼트 타입이였다.

텍스트필드에

textField.isSecureTextEntry = true

라고 정의를 해주면 textFields로는 찾을 수 없고

아래와 같이 해줘야한다.

let loginvcContentView = app.otherElements["loginvcScrollViewContentView"]
let pwTextField = loginvcContentView.secureTextFields["loginvcPwTextField"]

그렇다 

저 속성하나 켜줬다고 textField가 아닌 secureTextFields로만 찾을 수 있게되었다.

망할

 

반응형

'iOS > swift' 카테고리의 다른 글

No such module ~~ 설치되지 않는 Snapkit 문제  (0) 2023.04.12
ios - Admob 에러코드 메모  (0) 2023.03.21
Alamofire.AFError Code  (0) 2022.10.06
Block Based KVO, iOS - contentSize  (0) 2022.09.27
Date 끼리의 비교  (0) 2022.08.04

'Alamofire', '~> 5.2'

code name
0
createUploadableFailed
1
createURLRequestFailed
2
downloadedFileMoveFailed
3 invalidURL
4
multipartEncodingFailed
5
parameterEncodingFailed
6
parameterEncoderFailed
7
requestAdaptationFailed
8
requestRetryFailed
9
responseValidationFailed
10
responseSerializationFailed
11
serverTrustEvaluationFailed
12
sessionInvalidated
13
sessionTaskFailed
14
urlRequestValidationFailed
15
explicitlyCancelled
16
sessionDeinitialized

 

반응형

'iOS > swift' 카테고리의 다른 글

ios - Admob 에러코드 메모  (0) 2023.03.21
XCTest, textFields["passwordTextField"] 는 찾을 수 없다.  (0) 2022.10.31
Block Based KVO, iOS - contentSize  (0) 2022.09.27
Date 끼리의 비교  (0) 2022.08.04
bringSubviewToFront(_:)  (0) 2022.06.29

기존 스크롤뷰의 컨텐츠 사이즈가 변경될때마다 작업을 해야하는게 있어서 어떻게 해줄까 고민하다 

스크롤뷰에

horizentalScrollView.addObserver(self, forKeyPath: "contentSize", options: .new, context: nil)

해주고  observeValue 를 override해줘서 받을 수 있다는 내용 그대로 따라해 준적이 있다.

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {
    if let obj = object as? UIScrollView, obj == self.horizentalScrollView && keyPath == "contentSize" {
    // 작업 내용
    }
}

 

 오브젝트에 컨텐츠 사이즈 라는 키로 .new 될때마다 옵저브 벨류에서 받아서 해줄수 있구나 라며 기뻐했건만

Lint 작업을 추가하면서 이걸 변경해야되는 일이 생겼다.

Block Based KVO Violation: Prefer the new block based KVO API with keypaths when using Swift 3.2 or later. (block_based_kvo)

라며 이건 옛날 스타일이라며 나를 갈구는 xcode의 메시지에 이걸 그냥 비활성화 해줄까 고민하다 방법을 찾았다.

나는 옵저버 추가를 viewdidload에서 해줬었는데 아래와 같이 변경해줬다.

var scrollViewContentSizeObserver: NSKeyValueObservation?

override func viewDidLoad() {
...

    scrollViewContentSizeObserver = horizentalScrollView.observe(\.contentSize, options: [.new], changeHandler: { view, change in
        // 작업 내용
    })

...
}

혹시 동작을 안할까봐 걱정을 많이 했으나 시뮬레이터 상에서는 멀쩡히 돌아가서 다행이다.

솔직히 저 contentSize 집어 넣는 부분이 아직도 잘 이해가 안간다.

누가 알려줄 사람은 없나

 

 

반응형

Swfit의 compare를 이용하면 Date끼리의 비교도 가능하다.

이글에서 할 순서는

1. 동일 문자열 형식으로 비교할 값을 정의한다.

2. 동일한 DateFormatter로 String 을 Date 형으로 변경한다

3. 비교

비교할 형식은이다 "yyyy-MM-dd "

아래는 gist로 작성한 예제 코드이다.

 

compare는 Same, DESC, ASC로 세가지의 결과를 반환해주는데

이를 이용해 Date 끼리의 비교를 따로 함수로 정의해서 사용하거나 바로 이렇게 사용할수 있다.

반응형

https://developer.apple.com/documentation/uikit/uiview/1622541-bringsubviewtofront

 

Apple Developer Documentation

 

developer.apple.com

 

쓰다보면 항상 헷갈려서 검색하게되어 글을 남겨본다

swift로 앱을 만들다보면 하나의 부모뷰에 여러 자식들이 들어가게 되는데

겹쳐있는 자식들중 하나를 맨앞으로 끌어오고싶을때 쓰는 메소드이다.

쓰는 방법은

부모뷰.bringSubviewToFront(맨앞으로 당길 자식뷰)

ex: https://www.hackingwithswift.com/example-code/uikit/how-to-bring-a-subview-to-the-front-of-a-uiview )

parentView.bringSubviewToFront(childView)

다음엔 잊지않기를 바란다

반응형

Showing All Messages In  ~~~~~~~/WebP.framework/WebP(anim_decode.o), building for iOS Simulator, but linking in object file built for iOS, file ~~~~~~~~/WebP.framework/WebP for architecture arm64

라고 뜨며 앱빌드가 되지 않는다.

재택근무하며 집에 있는 맥북은 intel 기반이고 사무실은 m1이라 왔다갔다 하면서 사용되는 라이브러리가 달라 발생하는 문제로 보인다.

문구 그대로 검색하면 나오는 방법은

프로젝트 빌드 설정의 Excluded Architectures에 arm64를 넣으면 만사ok 라는데

이를 행하면 아래와 같은 오류가 발생한다.

~~/ Could not find module 'SnapKit' for target 'arm64-apple-ios-simulator'; found: x86_64-apple-ios-simulator, at: ~~~/Library/Developer/Xcode/DerivedData/Store-cnoxkdqeqkddojftbwfdqjacdaxo/Build/Products/Debug-iphonesimulator/SnapKit/SnapKit.framework/Modules/SnapKit.swiftmodule

오랜 세월을 함께한 나의 전우같은 스냅킷님에서 문제가 발생했다.

대충 보면 arm64시뮬레이터로 지정됐는데 해당 모듈을 찾을수 없다고한다.

/**

* 이쯤 되면 진짜 WebP.framework를 사용하고 싶지 않다.

* 더불어 YY이름이 여럿 붙은 오픈소스가 이용되는데 이게 다 무슨소린가 싶다

* 왓츠앱의 스티커 깃헙에서 제공해주고있는 오픈소슨데 왓츠앱이면 꽤 큰곳인데 이런 따로 오픈소스를 사용한다니 이해가 되지 않는다.

* 왓츠앱 스티커 관련 작업이라 공식에서 제공해주는걸 해야겠지싶기도 하다.

**/

여러가지를 시도해본 결과 아래와같은 절차를 행하면 동작한다.

우선

1. /Users/유저폴더/Library/Developer/Xcode/DerivedData  폴더를 비운다.

2. 프로젝트 루트폴더의 Podfile.lock 를 삭제

3. 동일 폴더의 Pod폴더를 삭제하여 설치된 파일을 삭제한다.

4. pod install --repo-update 를 실행

5. 워크스페이스파일로 프로젝트를 연다

6. 클린을 해준다 ( 쉬프트 + 커맨드 + k )

7. 프로젝트 -> 빌드 -> Excluded Architectures 에 Any iOS Simulator SDK 의 arm64 를 넣어서 빌드에서 제외해준다.

https://jusung.github.io/Xcode12-Build-Error/ 의 "1. EXCLUDED_ARCHS에 arm64를 추가" 에 해당한다.

8. Pod 프로젝트 설정에서 7번과 동일하게 Excluded Architectrues 에 arm64를 넣어준다.

9. 시뮬레이터에서 빌드 테스트.

10. 해피엔딩

 

나와 동일한 방법을 행했는데도 문제가 발생했다면 나도 모르겠다.

반응형

https://stackoverflow.com/questions/18946302/uinavigationcontroller-interactive-pop-gesture-not-working

UINavigationController에 붙어있는 ViewController이지만백제스쳐가 동작하지 않는 경우가 왕왕있다.

 

해당 문제는 제스쳐 이벤트 끼리의 충돌문제인것으로 보인다이때 네비게이션 제스쳐를 하나의 UINavigationController 내부의 viewControllers개수가 하나보다 많을때만 동작하도록 지정해주는 걸 달아주면 이상하게도 동작을 잘한다.

 

해당 소스는 상단 스택오버플로우의 답에 달린 코드이다.

class NavigationController: UINavigationController, UIGestureRecognizerDelegate {

    /// Custom back buttons disable the interactive pop animation
    /// To enable it back we set the recognizer to `self`
    override func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }

    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return viewControllers.count > 1
    }

}
반응형

+ Recent posts