2016-10-24 4 views
2

나는 App Store에 제출하려고하는 앱의 스크린 샷을 만들기 위해 Fastlane'ssnapshot을 사용하고 있습니다.Fastlane 스냅 샷으로 UserDefaults 읽기 어려움

"광고 한대로"작동하지만 앱 내에서 UserDefaults에 액세스하는 방식처럼 보이지 않습니다. 한 테스트에서 종료 상태 : 65 오류가 발생합니다.

UI Testing Failure - com.me.MyApp crashed in (extension in MyApp):__ObjC.NSObject.defaultTime() -> Swift.Float

나는 구문 오류에 초대에 UserDefaults.standard.value(forKey: "defaultTime")을 발견, 그래서 나는 UserDefaults에 액세스 할 수 확장을 만들었습니다. 내가 defaultTime 필요할 때마다, 난 그냥 defaultTime()을 입력 응용 프로그램에 섯

class CustomExtensions: NSObject { 
    /* 
    This is blank. Nothing else in here. No really...nothing else 
    */ 
} 

extension NSObject { 
    // User Defaults  
    func defaultTime() -> Float { 
     return UserDefaults.standard.value(forKey: "defaultTime") as! Float 
    } 

    // a bunch of other UserDefaults  
} 

다음은 확장의 모습입니다. 이 방법을 사용하여 UserDefaults 값에 액세스하면 시뮬레이터 및 테스트 한 장치에서 정상적으로 작동합니다. 나는 snapshot으로 만 문제가 발생합니다.

테스트 중에 sleep(1)을 추가하려고했지만 아무 것도하지 않는 것 같습니다. 제안 사항을 환영합니다 : UserDefaults에 액세스하는 다른 방법으로 MyApp에서 쉽게 액세스 할 수 있습니다.

답변

3

아마도 시뮬레이터와 장치에서 키 defaultTime에 대한 사용자 기본값에 값을 쓰는 경우가 있습니다. value(forKey:은 선택 사항을 반환하고 강제로 언 랩핑하거나 강제로 언더 캐스팅하면 여기에 따라 다운 캐스팅됩니다. 값이 nil이면 충돌합니다. 선택 사양 인을 돌아보십시오 :

func defaultTime() -> Float? { 
    return UserDefaults.standard.value(forKey: "defaultTime") as? Float 
} 

또는 기본값 사용 :

func defaultTime() -> Float { 
    return UserDefaults.standard.value(forKey: "defaultTime") as? Float ?? 0.0 
} 
+0

최고를! 나는'nil coalescing operator's에 대해서 읽었을뿐입니다. https://www.hackingwithswift.com/read/12/2/reading-and-writing-basics-userdefaults. 그게 바로이 문제를 해결했습니다. 이제 오른쪽 셀을 클릭하여 내 테스트를 조정해야합니다 ... 조금 쉬워야합니다 :) 감사합니다! – Adrian

+1

제게는 초기 기본값이'AppDelegate.swift'에 설정되어 있습니다. 귀하의 솔루션이 내 문제를 해결했다는 것을 UI 테스트가 AppDelegate를 건너 뜁니다. 나는 결코 그것을 짐작하지 못했을 것이다. 바라기를이 코멘트 누군가 더 줄을. – Adrian