2014-11-08 2 views
7

Objective-C에서 __DATE____TIME__을 사용하여 내 앱의 빌드 날짜와 시간을 가져옵니다. 스위프트에서이 정보를 얻을 수있는 방법을 찾을 수 없습니다. 가능한가?Swift에서 빌드 날짜 및 시간 가져 오기

+0

스위프트에서 말할 수없는 많은 것들이 있습니다. 별거 아니야. Objective-C로 작성된 도우미 클래스를 사용하십시오 ... – matt

답변

8

#line, #column#function을 사용할 수 있습니다.


원래 답 :

프로젝트에 새로운 목표 - C 파일을 만들고 엑스 코드가 요청할 때, 브리지 헤더를 만드는 예 말한다. 이 새로운 목표 - C 파일에서

다음하여 .h 파일 추가 : 이제

NSString *compileDate() { 
    return [NSString stringWithUTF8String:__DATE__]; 
} 

NSString *compileTime() { 
    return [NSString stringWithUTF8String:__TIME__]; 
} 

가교 헤더 및 가져 오기로 이동 :

NSString *compileDate(); 
NSString *compileTime(); 

그리고 .m에서

가 이러한 기능을 구현을 .h 우리가 만들었습니다. 이제 다시 스위프트 파일 중 하나에

:

println(compileDate() + ", " + compileTime()) 
+0

굉장합니다. 감사합니다 nhgrif. –

+0

유감스럽게도 Swift에서'__LINE__' 또는'__FILE__'을 정확하게 사용하는 방법은 없습니다. 이 같은 접근법은 Objective-C 코드의 라인/파일을 반환합니다. – nhgrif

+1

사실, 방법이 있습니다. Apple에서이 게시물을 확인하십시오. https://developer.apple.com/swift/blog/?id=15 –

17

당신은 목표-C에 복귀하지 않고 빌드 날짜와 시간을 얻을 수 있습니다. 응용 프로그램이 빌드되면 번들에있는 Info.plist 파일은 항상 프로젝트의 Info.plist 파일에서 만들어집니다. 따라서 해당 파일의 작성 날짜가 빌드 날짜 및 시간과 일치합니다. 앱 번들의 파일을 읽고 속성을 가져올 수 있습니다. 그래서 당신은 그것의 Info.plist 파일에 액세스하여 스위프트의 빌드 날짜를 얻을 수 속성 :

var buildDate:NSDate 
{ 
    if let infoPath = NSBundle.mainBundle().pathForResource("Info.plist", ofType: nil), 
     let infoAttr = try? NSFileManager.defaultManager().attributesOfItemAtPath(infoPath), 
     let infoDate = infoAttr["NSFileCreationDate"] as? NSDate 
    { return infoDate } 
    return NSDate() 
} 

참고 :이 내가 처음이 문제를 가지고 때 브리지 헤더를 사용하는 저를 얻었다 게시물입니다. 나는이 "Swiftier"솔루션을 발견하여 나중에 참조 할 수 있도록 공유 할 것이라고 생각했습니다.

[EDIT] 전체 빌드를 수행하지 않을 때에도 최신 컴파일 날짜를 얻기 위해 compileDate 변수를 추가했습니다. 이것은 앱 스토어에서 애플리케이션을 릴리스하기 위해 전체 빌드를해야하기 때문에 개발 중에만 의미가 있지만 여전히 사용 중일 수 있습니다. 동일한 방식으로 작동하지만 Info.plist 파일 대신 실제 코드가 포함 된 번들 파일을 사용합니다.

var compileDate:Date 
{ 
    let bundleName = Bundle.main.infoDictionary!["CFBundleName"] as? String ?? "Info.plist" 
    if let infoPath = Bundle.main.path(forResource: bundleName, ofType: nil), 
     let infoAttr = try? FileManager.default.attributesOfItem(atPath: infoPath), 
     let infoDate = infoAttr[FileAttributeKey.creationDate] as? Date 
    { return infoDate } 
    return Date() 
} 
+0

앱을 업데이트 할 때 info.plist가 동일하게 유지되고 '__DATE__'이 업데이트 시점까지 적절하게 업데이트되기 때문에 일관성있는 결과가'__DATE__ '로 주어지지 않습니다. –

+0

나는 OP가 빌드 날짜와 시간을 찾고 있다고 추론했다. 나는 당신이 "당신이 당신의 앱을 업데이트 할 때"무슨 뜻인지 모르겠다. 다시 작성 중이거나 항상 info.plist의 작성 날짜가 변경되거나 다시 작성되지 않고 날짜가 변경되지 않습니다 (예상대로). –

+0

그래, 나는 재건을 의미했다. 것은 Xcode를 통해 간단한 재 구축으로 가면 이전과 같은 시간을 출력한다는 것입니다. Going Product> Clean은 Info.plist를 강제 업데이트합니다. 그걸 확인할 수 있니? –

관련 문제