반응형


iPad가 지원되게 수정 후 심사 제출을 하려고 하였지만, 위 와 같은 에러가 발생하였다.



Devices에 iPhone, iPad, Universal을 각각 확인을 해보면, 아래 Requires full screen 체크가 안되어 있는 것이 있다.

이 부분을 체크를 한 후에 다시 컴파일 후 업로드를 해보자.

반응형
반응형

정확한 것인지는 모르겠으나, 테스트를 한 방법을 설명하겠다.


우선 프로젝트의 그룹을 iphone과 ipad를 만든 후, 각각 스토리보드 및 ViewController를 생성/재배치 하였다.


각 스토리보드는 형태를 다르게 label을 생성하였다.









Info.plist 설정값을 보자.

아래 "Main strobyoard file base name (iPad)를 추가해주고 Value는 생성한 스토리보드 이름을 넣어준다.


TARGETS의 General을 보면 Devices에는 iPhone, iPad, Universal 3가지를 선택할 수 있는데,

이부분을 선택하여 "Main Interface"의 기본 스토리보드를 선택해주면 된다.


이 후 아이패드 일때와 아이폰 일때 각각 시뮬레이션을 하면, 설정한 스토리보드 대로 UI가 표시가 될 것이다.

반응형
반응형

var str = "Hello, playground"


 * 앞자리 기준

 - 0번째 자리 부터

let start = str.index(str.startIndex, offsetBy: 0

str.substring(from: start)  //Hello, playground 출력


 - 2번째 자리 부터

  => "offsetBy: 2"의 숫자 2는 2번째 자리가 아니라 3번째 자리이다.

       index는 0부터 시작하므로, 즉 3자리미만으로 해석해야함.

let end = str.index(str.startIndex, offsetBy: 2)

str.substring(from: end)  //llo, playground 출력


 * 뒷자리 기준

 - 뒤에서 4번째 자리 부터

let end = str.index(str.endIndex, offsetBy: -4)

str.substring(from: end)  //ound 출력



 * substring

 - 1번째 자리부터 2자리만 가지고 온다.

let start2 = str.index(str.startIndex, offsetBy: 2)

let range = start ..< start2

str.substring(with: range)  //He 출력


 - 3번째 자리부터 끝에서 4번째자리 이전까지만 가지고 온다.

let range2 = start ..< end

str.substring(with: range2)  //llo, playgr 출력


var replaceStr = "This is my string"


 * replace

let NewString = replaceStr.replacingOccurrences(of: " ", with: "+")

print(NewString) //This+is+my+string



종합하여, 해당 범위에 있는 문자를 추출하고자 한다면...

예시로 "my"를 "your"로 바꾸어 출력해 보겠다.

let begin = replaceStr.index(replaceStr.startIndex, offsetBy: 8)

let finish = replaceStr.index(replaceStr.endIndex, offsetBy: -7)

let NewRange = begin ..< finish

let StringNew = replaceStr.replacingOccurrences(of: replaceStr.substring(with: NewRange), with: "your")

print(StringNew)  //This is your string 출력



playground

//: Playground - noun: a place where people can play


import UIKit


let channel = "asdfg35sahadhxbadgaswgreh"



let start5 = channel.index(channel.startIndex, offsetBy: 0)

let end5 = channel.index(channel.startIndex, offsetBy: 2)

let range5 = start5 ..< end5

channel.substring(with: range5)  // play

let name5 = channel.replacingOccurrences(of: channel.substring(with: range5), with: "UU")


var str = "Hello, playground"

let start = str.index(str.startIndex, offsetBy: 0)

str.substring(from: start)


let start2 = str.index(str.startIndex, offsetBy: 2)

str.substring(from: start2)


let end = str.index(str.endIndex, offsetBy: -4)

str.substring(from: end)



let range = start ..< start2

str.substring(with: range)


let range2 = start2 ..< end

str.substring(with: range2)


let replaceStr = "This is my string"

let NewString = replaceStr.replacingOccurrences(of: " ", with: "+")

print(NewString)


let begin = replaceStr.index(replaceStr.startIndex, offsetBy: 8)

replaceStr.substring(from: begin)

let finish = replaceStr.index(replaceStr.endIndex, offsetBy: -7)

replaceStr.substring(from: finish)

let NewRange = begin ..< finish

replaceStr.substring(with: NewRange)

let name = replaceStr.replacingOccurrences(of: replaceStr.substring(with: NewRange), with: "your")

print(name)




let ins = "select a from name"

//ins.indexes(of: " ")

var rang = ins.range(of: " ")

var aaa = ins.indexes(of: " ")


print(aaa[1])


extension String {

    func index(of string: String, options: String.CompareOptions = .literal) -> String.Index? {

        return range(of: string, options: options)?.lowerBound

    }

    func indexes(of string: String, options: String.CompareOptions = .literal) -> [String.Index] {

        var result: [String.Index] = []

        var start = startIndex

        while let range = range(of: string, options: options, range: start..<endIndex) {

            result.append(range.lowerBound)

            start = range.upperBound

        }

        return result

    }

    func ranges(of string: String, options: String.CompareOptions = .literal) -> [Range<String.Index>] {

        var result: [Range<String.Index>] = []

        var start = startIndex

        while let range = range(of: string, options: options, range: start..<endIndex) {

            result.append(range)

            start = range.upperBound

        }

        return result

    }

}


반응형
반응형

흔히 컴퓨터에서 실행취소(command+z, ctrl+z)를 무의식적으로 많이 사용하고 있다.


그런데 아이폰에 기본 어플이 메모를 종종 사용을 하게 되는데,

가끔 지우기 버튼을 오래 누르고 있다보니 지우지 말아야 할 것 까지 지워져서 당황한 경우가 많이 있다.


이럴 경우 이제는 당황하지 말자..


이전으로 되돌리고 싶으면 아이폰을 흔들어 주어라..

실행취소 버튼을 누르면 이전 값으로 되돌아 간다.



다만 여기서 주의해야 할 점은....

설정에서 흔들어서 실행 취소가 켜짐으로 있어야 한다.

설정 > 일반 > 손쉬운 사용 > 흔들어서 실행 취소



반응형
반응형

itunes Connect 사용하기 헷갈리고 정말 어렵지 않은가? ㅜㅜ


지금도 삽질하면서 잘못 기입되거나, 삭제하고 싶은 것들이 상당히 많다. ㅜㅠ


많이 생기는 일은 아니겠지만, 보통 tvOS앱을 버튼을 잘 못 클릭하여 "제출 준비상태" 가 되곤 할지도 모른다.

itunes에 "제출 준비상태" 로 된 앱을 삭제하려고 이것저것 찾아보다 이것저것 클릭하다가 버전 및 플랫폼 을 클릭 하게 되었다.

차라리 처음부터 다시 만들었으면 만들었지, 나같은 경우 성격 상 이런 것을 그냥 못 보고 지나친다.

(참고로 알아본 바, 앱 삭제는 한번 승인 받았던 앱에 대해서만 삭제가 가능 하다고 한다. 그러면 승인 받지 못한앱은 어쩌란 말인가? 3개월인가.. 몇개월 지나면 애플에서 삭제하겠다고 메일을 보내준다고 한다. - 그때까지 기다려 ㅡㅡ;;;;)


삭제하는 법을 몰라... 앱 제출할 때 tvOS 은 사용 되지 않는다고 메모를 해서 제출 하였다만...

나중에 알고 보니 삭제는 정말 간단하더군.. 어이 없음


마우스를 올려보니 빨간 색 삭제버튼이 살짝 나타났다.

이것도 이것 저것 보다가 우연히 발견..ㅠㅠ


삭제 버튼 클릭 하면 된다.


아 정말 어렵다!!  itunesConnect 여.....

반응형
  1. 익명 2020.06.30 12:22

    비밀댓글입니다

  2. 평생초보 2020.07.03 13:51 신고

    안녕하세요.^^
    본 글이 오래되어서 말씀해주신 사항이 변경이 되었는지 확인을 해보았는데요,
    마우스 오버시 "-" 표시가 잘 나왔습니다. 다른 걸 한적은 없어요.
    혹시나 브라우저를 타는지도 해보았는데 동일하게 삭제를 할 수 있었습니다.
    도움이 되지 못해서 죄송합니다.

반응형

 - 본 설명은 윈도우가 아닌 맥에서 사용할 수 있는 USB를 포맷하는 과정이다.


1.디스크 유틸리티 선택



2. 포맷을 usb 또는 외장 장치를 선택




- 포맷의 리스트를 보면 아래와 같다.

: 윈도우에서 사용을 하기 위함은 ExFAT를 선택해야한다.

: OS X 확장(저널링) 은 맥에서만 사용할 수 있다. 윈도우에서 보면 포맷하라고 뜨니 주의를 하기 바란다.

반응형
반응형

$ pod install 

아래와 같은 메세지가 나왔을 경우.

[!] The `TESTCocoaPods [Debug]` target overrides the `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` build setting defined in `Pods/Target Support Files/Pods-TESTCocoaPods/Pods-TESTCocoaPods.debug.xcconfig'. This can lead to problems with the CocoaPods installation

    - Use the `$(inherited)` flag, or

    - Remove the build settings from the target.


[!] The `TESTCocoaPods [Release]` target overrides the `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` build setting defined in `Pods/Target Support Files/Pods-TESTCocoaPods/Pods-TESTCocoaPods.release.xcconfig'. This can lead to problems with the CocoaPods installation



반응형
반응형

http://stackoverflow.com/questions/37851459/the-document-main-storyboard-requires-xcode-8-0-or-later


xcode 7 에서 시뮬레이터를 실행시킬때, 또는 스토리보드를 클릭하여 화면을 보고자 할 때 아래와 같은 오류가 발생하였다.




해당 오류는 프로젝트가 Xcode8.0으로 설정이 되어 있어서 그렇다.

Xcode8.0으로 프로젝트를 실행시킨다.



스토리보드를 선택한 후 위와 같이 설정을 바꿔주고 Xcode7로 다시 실행시킨다.

그래도 되지 않는다면..


스토리보드 마우스 우클릭하여 소스코드를 선택한다.



아래와 같은 코드를 찾아서 삭제한다.

<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> 


다시 실행을 시키면 제대로 작동이 된다.

반응형
반응형

- Main storyboard에서 버튼을 클릭 하였을 때 Sub storyboard로 이동하는 것을 테스트 해 볼 것이다.


1. 우선 또 다른 스토리보드를 생성하자.(SubMain.storyboard)



2. 새로운 스토리보드에 아무 컨트롤러를 만들어 놓자(SubViewController.swift)



3. Main.storyboard에 버튼을 만들고 Storyboard Reference 를 드래그하여 Main.storyboard에 넣자.



4. 버튼과 Storyboard Reference와 연결 시킨 후 오른쪽 상단과 같이 지정한 서브 스토리보드 명과 컨트롤러 이름을 지정하여 실행시켜보자.


반응형
반응형

http://stackoverflow.com/questions/39377807/strange-terminal-messages-in-xcode-8


Xcode8에서 아무작업도 하지 않고 시뮬레이션을 하였다.

터미널에서 아래와 같은 문구가 발생하였다.

2016-09-23 15:54:23.701321 TestStoryBoard[9522:420281] subsystem: com.apple.UIKit, category: HIDEventFiltered, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0

2016-09-23 15:54:23.708568 TestStoryBoard[9522:420281] subsystem: com.apple.UIKit, category: HIDEventIncoming, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0

2016-09-23 15:54:23.724923 TestStoryBoard[9522:420274] subsystem: com.apple.BaseBoard, category: MachPort, enable_level: 1, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0

2016-09-23 15:54:23.930622 TestStoryBoard[9522:420177] subsystem: com.apple.siri, category: Intents, enable_level: 1, persist_level: 1, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0

2016-09-23 15:54:24.010428 TestStoryBoard[9522:420177] subsystem: com.apple.Accessibility, category: AccessibilityBundleLoading, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0

2016-09-23 15:54:24.060352 TestStoryBoard[9522:420177] subsystem: com.apple.UIKit, category: StatusBar, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0

2016-09-23 15:54:24.171057 TestStoryBoard[9522:420177] subsystem: com.apple.BackBoardServices.fence, category: App, enable_level: 1, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 0, privacy_setting: 0, enable_private_data: 0

2016-09-23 15:54:24.428111 TestStoryBoard[9522:420177] subsystem: com.apple.Accessibility, category: VOTHandwriting, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0

2016-09-23 15:54:25.402295 TestStoryBoard[9522:420177] subsystem: com.apple.Accessibility, category: ElementTraversal, enable_level: 0, persist_level: 0, default_ttl: 0, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0

2016-09-23 15:54:26.158518 TestStoryBoard[9522:420177] subsystem: com.apple.UIKit, category: Touch, enable_level: 0, persist_level: 0, default_ttl: 1, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0

2016-09-23 15:54:26.159825 TestStoryBoard[9522:420177] subsystem: com.apple.UIKit, category: Gesture, enable_level: 0, persist_level: 0, default_ttl: 1, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0

2016-09-23 15:54:26.160907 TestStoryBoard[9522:420177] subsystem: com.apple.UIKit, category: GestureEnvironment, enable_level: 0, persist_level: 0, default_ttl: 1, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0

2016-09-23 15:54:26.161597 TestStoryBoard[9522:420177] subsystem: com.apple.UIKit, category: GestureExclusion, enable_level: 0, persist_level: 0, default_ttl: 1, info_ttl: 0, debug_ttl: 0, generate_symptoms: 0, enable_oversize: 1, privacy_setting: 2, enable_private_data: 0



아래와 같이 해보자.



반응형
반응형

Guard에 대해서는 설명이 잘 나온 글들이 많다.

완벽하게 이해하지는 못하였지만 느낌은 알 것 같은..

설명은 쓸 수 없지만.. 잊지않기 위해 활용한 소스라도 올려본다.



 * 처음 테스트로 작성한 코드

var ValueNil:String? = nil

ValueNil = "Guard"


func guardTest() {

    guard ValueNil != nil else {

        print("bad")

        return

    }


    print(ValueNil)

}

guardTest() // 출력은 Optional("Guard")



 - 그러나 여기서 Optional이 붙어 버리니 어찌해야하나..

 - Guard 부분에서 nil을 체크하였기 때문에 print에서 "!" 를 붙여도 상관이 없음.

 - 그러나 "!" 자체가 불안하다.

 - 그래서 물어본 결과...단순한 사실을 잊고 있었다.


var ValueNil:String? = nil

ValueNil = "Guard"

func guardTest() {

    guard let tmp = ValueNil else {

        print("bad")

        return

    }

    print(tmp)

}

guardTest()  // 출력은 Guard


- guard를 사용하게 되면 이후 소스에서도 계속적으로 언래핑된다는 것이다.

- 쓸데없는 if let을 사용을 줄일 수가 있다고 한다.

반응형
반응형

http://chanlee.github.io/2015/06/14/Introduce-Swift-Optional/

https://www.appcoda.com/beginners-guide-optionals-swift/

https://devxoul.gitbooks.io/ios-with-swift-in-40-hours/content/Chapter-2/optionals.html


playground에서 예제를 똑같이 실행해 보았다.

import UIKit


class Messenger {

    var message1: String = "Swift is awesome"

    var message2: String?

}


func findStockCode(company: String) -> String? {

    if (company == "Apple") {

        return "AAPL"

    } else if (company == "Google") {

        return "GOOG"

    }

    

    return nil

}


var stockCode:String? = findStockCode("Facebook")

let text = "Stock Code - "

//let message = text + stockCode!

//print(message)



if let tmpStock = stockCode {

    let message = text + tmpStock

    print(message)

}


if var stockCode = findStockCode("Facebook") {

    let message = text + stockCode

    print(message)

}



class Stock {

    var code: String?

    var price: Double?

}


func findStockCode2(company: String) -> Stock? {

    if (company == "Apple") {

        let aapl: Stock = Stock()

        aapl.code = "AAPL"

        aapl.price = 90.32

        

        return aapl

    } else if (company == "Google") {

        let goog: Stock = Stock()

        goog.code = "GOOG"

        goog.price = 556.36

        

        return goog

    }

    return nil

}


if let stock = findStockCode2("Apple") {

    if let sharePrice = stock.price {

        let totalCost = sharePrice * 100

        print(totalCost)

    }

}


if let sharePrice = findStockCode2("Apple")?.price {

    let totalCost = sharePrice * 100

    print(totalCost)

}


반응형
반응형

developer로 결재하기 위해 굳은 마음으로 카드를 옆에 두고 개발자 결재 등록 사이트로 들어갔다.

왠걸 아래와 같이 나온다.


발표 때문에 잠시 중단을 시킨 것 같다.

각 나라 언어로 동일한 문구를 차례대로 출력시키는 것 같다. 한국어는 15개(?) 언어 중 10번쯤(?)에 출력되고 있는 것 같더라.


큰 맘먹고 개발자 등록 해보려고 했는데..ㅜㅜ

발표끝나면...내일 되겠지...


반응형
반응형

무엇을 잘 못 눌렀는지 갑자기 자동 줄 바꿈이 되지 않는 것이다.



어지간히 불편한게 아니였다. 화면도 작은데..ㅠㅠ

제대로 나와있는게 없더라.. 그래서 더 열심히 찾아봤다.

http://stackoverflow.com/questions/5271530/how-to-disable-word-wrap-in-xcode-4-editor




위 Line wrapping 에 체크를 하였더니 잘 됨.



특정페이지에서만 자동 줄바꿈이 되지 않는다면, 아래 이미지 처럼 Wrap lines 체크해보자.



반응형
반응형

복사 : Command +  c

붙여넣기 : Command + v

잘라내기 : Command + Option + v

반응형
반응형

* AppDelegate

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        // Override point for customization after application launch.

        UIApplication.sharedApplication().valueForKey("statusBar")?.setValue(UIColor.redColor(), forKey: "foregroundColor")

        return true

    } 



- swift 3.0

//        let statWindow = UIApplication.shared.value(forKey:"statusBar") as? UIView

        

//        if let sub = statWindow?.subviews[0] {

//            let statusBar = sub as UIView

//            statusBar.backgroundColor = UIColor(red: 206/255.0, green: 206/255.0, blue: 210/255.0, alpha: 1.0)

//        }

//        

반응형
반응형

아래와 같은 이미지를 만들려고 한다.



storyboard에 비스무리하게 만들었다.



layout을 맞춰주기 위해서 아래와 같이 size을 임의로 조절 하였다.

 func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

        let screenSize = UIScreen.mainScreen().bounds

        let screenHeight = screenSize.height

        

        var width: CGFloat? = nil

        var height: CGFloat? = nil

        

        // 아래 CGFloat 수치는 임의 수를 넣은 것이기 때문에 layout이 화면과 안맞을 수 있다.

        if(screenHeight == 568) {

            width = 5

            height = 7

        } else if(screenHeight == 667) {

            width = 5

            height = 6

        } else if(screenHeight == 736) {

            width = 5

            height = 5

        }

        

        return CGSize(width: (collectionView.frame.size.width)/width!, height: (collectionView.frame.size.height)/height!)

    } 


여기서 문제가 생김.

6s와 6s 플러스는 정상적(?)으로 보여지나 5s는 제대로(?) 보여지지 않았음.


해당 스토리보드는 6s를 기준으로 하여 만들었기에 6s플러스도 완전하게 정상적으로 보여지지는 않았다. 그냥 봐줄만한 정도랄까나

5s는 봐줄만한 정도를 넘어서 button 이미지가 image와 동떨어져 있거나, 코딱지 만하게 보이거나 아예 사라져버림.(제대로 보이기 위해 다양한 시도를 했음)

해당 원인은 추측하건데, 동떨어진 것은 cell안에 이미지와 버튼 사이즈가 작아지면서 각자 위치를 찾아가고 있었던 듯하다. 

그림이 많이 구리지만 예를 들면 아래와 같다.

그리고 코딱지만하게 보이거나 사라져버리는 경우는 버튼 이미지가 심하게 작아진 경우가 될 것으로 보인다.



해결방법(?)을 보자. 테스트의 제약이 있을 수 있겠으나, 현재까지 본 상황으로 무리없이 잘 보임.






"Resolve Auto Layout Issues" 클릭하여 "Update Constraints" 를 클릭한 후 실행해 보라.


반응형
반응형

https://developer.apple.com/library/mac/documentation/LanguagesUtilities/Conceptual/iTunesConnect_Guide_ko/Chapters/About.html#//apple_ref/doc/uid/TP40016320-CH1-SW1

반응형
반응형

http://stackoverflow.com/questions/3463157/tab-bar-covers-uitableviews-last-cell




Under Bottom Bars 의 체크를 해제 한다.



반응형
반응형

var section1 = ["100","1","a","","","2","k","","10",""]


let order = section1.sort() {

    (s1, s2) -> Bool in

    

    if(s1 < "A" && s2 < "A") {  // 둘 다 숫자이면

        return s1.localizedStandardCompare(s2) == NSComparisonResult.OrderedAscending

        

    } else if (s1 >= "A" && s2 >= "A" && s1 <= "z" && s2 <= "z") {  // 둘다 영문이면

        return s1.localizedStandardCompare(s2) == NSComparisonResult.OrderedAscending

    } else if(s1 > "z" && s2 > "z") { // 둘 다 한글 이면

        return s1.localizedStandardCompare(s2) == NSComparisonResult.OrderedAscending

    } else { //둘 중에 하나라도 같은 타입이 아니면

        return s1.localizedStandardCompare(s2) == NSComparisonResult.OrderedDescending

    }

}


위 빨간색으로 칠한 문은 지역로컬이 지정되지 않아 무조건 영문이 우선순위로 소팅이 될 것이다.

한글부터 sort하고 자 한다면 이렇게 하자.

let locale = NSLocale(localeIdentifier: "korea")

return s1.compare(s2, locale: locale) == NSComparisonResult.OrderedDescending 


반응형
반응형

해석하는데 어려움을 겪음..영어 못하는게 죄..ㅠㅠ

나를 더 화나게 한 것은 한글 지원이 되었다는거...ㅡㅡ^

https://firebase.google.com/docs/crash/ios


cocoapods 설정

pod 'Firebase/Crash' 


1. Download a service account key to authenticate your uploads:

  1. Go to the Firebase console and open your Firebase project.
  2. Click settings and select Permissions.
  3. On the Permissions page, select Service Accounts from the left menu.
  4. Click Create service account.
  5. Name the service account "Symbol Upload service account".
  6. Set the Role to Editor (Project -> Editor)
  7. Check the box for Furnish a new private key.
  8. Select the JSON option for key type.
  9. Click Create. This automatically downloads a JSON file with the required keys.

해석하자면...

a. Firebase console 로 가서 프로젝트를 열어라




b.설정을 클릭하고, 권한을 선택하라


c, d. 권한페이지에서 좌측메뉴의 서비스 계정을 선택하고, 서비스 계정 만들기를 클릭 한다.



e, f. 서비스 계정이름을 Symbol Upload service account 로 한다. 역할에서 편집자를 선택한다.


g, h, i. 새 비공개 키 제공을 체크하고 JSON을 선택하고 만들어라. 자동으로 JSON 파일이 다운로드 된다.



2. Add an upload script for your symbol files:

  1. In Xcode, click on your application target, select Build Phases, and click `+` to add a phase.
  2. Select Run Script and add the following content, setting appropriate values for your service account path and GOOGLE_APP_ID:
    # Replace this with the GOOGLE_APP_ID from your GoogleService-Info.plist file
    GOOGLE_APP_ID=1:my:app:id
    
    # Replace the /Path/To/ServiceAccount.json with the path to the key you just downloaded
    "${PODS_ROOT}"/FirebaseCrash/upload-sym "/Path/To/ServiceAccount.json"
            


a. Xcode를 실행하고 당신의 애플리케이션 타켓에 Build Phases 를 선택하고 + 버튼을 클릭하여 추가하라

b. Run Script를 선택하고, 구글 아이디와 service 계정 경로 값을 넣어주어라.

  - 구글ID는 GoogleService-Info.plist 파일에 있음.

  - ServiceAccount.json 은 파일은 어디인지 확인하여 경로를 넣어준다.




3. 제대로 작동을 하는 지 테스트 하는 단계

  1. Add an assert to your AppDelegate's didFinishLaunchingWithOptions method to cause a crash when the app launches, right after the Firebase initialization call:

OBJECTIVE-C

SWIFT

fatalError()

  1. Launch the app from Xcode.
  2. Click Stop in Xcode to detach from the debugger.
  3. Launch the app directly from the home screen on the device or emulator.
  4. Wait until your app crashes.
  5. Remove the crashing line so your app can start successfully.
  6. Launch the quickstart from Xcode again. Within 15 secs you should see a log message indicating that the report was successfully uploaded.
  7. Check the Crash Reporting section of the Firebase console to see the error. Note that it takes 1-2 minutes for errors to show there.


AppDelegate 파일의 didFinishLaunchingWithOptions 에 fatalError()를 넣어라.


 - 아래는 구글 번역 돌렸다.

1. 엑스 코드에서 응용 프로그램을 실행합니다.

2. 디버거에서 분리 엑스 코드에서 중지를 클릭합니다.

3. 장치 또는 에뮬레이터의 홈 화면에서 직접 응용 프로그램을 실행합니다.

4. 앱이 충돌 할 때까지 기다립니다.

5. 앱이 성공적으로 시작할 수 있도록 충돌 라인을 제거합니다.

6. 다시 엑스 코드에서 퀵 스타트를 시작합니다. 15 초 이내에 보고서가 성공적으로 업로드되었음을 나타내는 로그 메시지를 볼 수 있습니다.

7. 오류를 확인하기 위해 중포 기지 콘솔의 충돌보고 섹션을 확인합니다. 오류가 표시하는 것은 1 ~ 2 분 거리에 있습니다. 



참고로..

Google-Mobile-Ads-SDK 가 버전이 낮다는 메세지가 나올 경우

cocoapods에서 아래 처럼 수정해 주어라.

platform :ios, '9.0'


target 'Demo' do

    use_frameworks!

    pod 'SQLite.swift', '~> 0.10.1'

    pod 'Firebase/Core'

    # pod 'Firebase/AdMob'     #삭제해 주고

    pod 'Google'

    pod 'Google-Mobile-Ads-SDK'  #추가해주자

    pod 'Firebase/Crash'

end 


Firebase/AdMob 이 낮은버전의 Google-Mobile-Ads-SDK를 바라보고 있어서 그런다.

반응형
반응형

https://firebase.google.com/docs/admob/ios/quick-start



 * Podfile

source 'https://github.com/CocoaPods/Specs.git'


platform :ios, '9.0'

    use_frameworks!

    pod 'Firebase/Core'

    pod 'Firebase/AdMob'


target 'Demo' do

    pod 'Firebase'

end

 $ pod install


 * AppDelegate.swift

import Firebase

import UIKit



@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {


    var window: UIWindow?



    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        // Override point for customization after application launch.

        

        FIRApp.configure()

        GADMobileAds.configureWithApplicationID("ca-app-pub-3940256099942544/2934735716")

        return true

    } 


 * ViewController.swift


import GoogleMobileAds


class ViewController: UIViewController {

    

    @IBOutlet weak var bannerView: GADBannerView!


override func viewDidLoad() {

        super.viewDidLoad()

        //print("Google Mobile Ads SDK version: \(GADRequest.sdkVersion())")


        bannerView.adUnitID = "ca-app-pub-3940256099942544/2934735716"

        bannerView.rootViewController = self

        bannerView.loadRequest(GADRequest())


        // Do any additional setup after loading the view, typically from a nib.

    }







반응형
반응형

http://stackoverflow.com/questions/22214843/ios-7-difference-between-viewdidload-and-viewdidappear/22215127#22215127





전부 이해는 못하더라도 전체적인 흐름정도는 익히는 것도...


반응형
반응형

func MultiReturn() -> (String, Int, NSDate) {

    let name = "MultiReturn"

    let age = 25

    let date = NSDate()


    return (name, age, date)

}


print(MultiReturn().0)

print(MultiReturn().1)

print(MultiReturn().2)



반응형
반응형

버튼을 클릭했을 경우 화면에 해당 collectionViewCell 위치로 이동할 수 있게 한다.

@IBAction func time00(sender: AnyObject) {

    self.collectionview?.scrollToItemAtIndexPath(NSIndexPath(forItem: 0, inSection: 0), atScrollPosition: .Left, animated: true)


forItem 은 이동하는 셀로우 : IndexPath.row 라고 생각하면 될 듯..

atScrollPosition 은 화면에 어떤 위치를 기준으로 삼아서 해당 셀을 보여 줄 것인지 : .Top, .Bottom, .Left, .Right

반응형
반응형

http://stackoverflow.com/questions/28148843/ios-autolayout-two-buttons-of-equal-width-side-by-side


반응형
반응형


* Send

class SendClass {


    struct sendStruct {
        var name: String
        var age: String
    }

    var sendArray = [sendStruct]()

    func SendFunction() -> Array<sendStruct> {

        return sendArray

    }
}

* Receive

class RecevieClass {

    struct ReceiveStruct {
        var name: String
        var age: String
    }

    var ReceiveArray: Array<ReceiveStruct> = [ReceiveStruct]()

    let Send = SendClass()

    ReceiveArray =  Send.SendFunction().map {

        ReceiveStruct(name: $0.name, age: $0.age)

    }

}


반응형
반응형
let str = "man|17&woman|19"

let result = str.componentsSeparatedByString("&")

print(result)  // ["man|17", "woman|19]



let charSet = NSCharacterSet(charactersInString: "|^")

let result = str.componentsSeparatedByCharactersInSet(charSet)

print(result)  // ["man","17","woman","19"]



let Array2D = str.componentsSeparatedByString("^").map {

    $0.componentsSeparatedByString("|")

}


print(Array2D) // [["man,"17"],["woman","19"]]








반응형
반응형


$ pod install

Analyzing dependencies

[!] Unable to satisfy the following requirements:


- `SQLite.swift (~> 0.10.1)` required by `Podfile`


None of your spec sources contain a spec satisfying the dependency: `SQLite.swift (~> 0.10.1)`.


You have either:

 * out-of-date source repos which you can update with `pod repo update`.

 * mistyped the name or version.

 * not added the source repo that hosts the Podspec to your Podfile.


Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by default.


$ pod repo update


Updating spec repo `master`

Performing a deep fetch of the `master` specs repo to improve future performance

.

.

.


$ pod install

반응형
반응형

파일을 삭제하고자 하면 아래와 같은 오류가 발생한다.


이것은 파일을 중간에 갑작스럽게 취소했을 경우 발생 되더라

나는 압축을 하는 중에 취소를 누른후 파일을 삭제해보려니 발생했다.


해결방법은 여러가지 해결방법이 있다고 하는데...정확히 나와있는게 없는 것 같아서.........




난 그냥 재부팅한다.

반응형

+ Recent posts