2016년 1월 31일 일요일

Transport Security has Blocked a cleartext HTTP 문제해결 @@ in Swift2.x

Transport Security has Blocked a cleartext 이슈 해결 방법

 info.plist 파일을 열어 키값을 추가한다.
<info.plist 파일>
<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>localhost</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
        </dict>
    </dict>
<추가 할 키 값>
<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

UIDatePicker use mode option (사용법 및 정보) @@ in Swift2.x - Xcode 7.3 iOS 9.3


1. 스토리보드 UIDatePicker 추가

아래처럼 Main.storyboard 파일을 연다음 UIDatePicker 를 드래그



드래그하면 아래처럼 View Controller Scene 에 UIDatePicker가 추가된 것을 확인 할 수 있다.
ViewContoller.swift 파일로 이동하여
IBOutlet을 만들고 "DatePicker" 라고 이름으로 만든다



같은 방법으로 UILabel 도 드래그하여 추가후 IBOutlet을 만들고 "DateLabel" 라고 이름을 정한다




2. ViewController.swift 코딩 추가

//IBOutlet 생성 된 상태
@IBOutlet weak var DatePicker: UIDatePicker!
@IBOutlet weak var DateLabel: UILabel! // 날짜값을 출력할 라벨

override func viewDidLoad() {
  super.viewDidLoad()
    //날짜를 
yyyy-MM-dd 형식으로 문자열 값으로 불러오기
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd"
    let strDate = dateFormatter.stringFromDate(NSDate())
    //라벨에 날짜 표시
    self.DateLabel.text = strDate
}


시뮬레이터 실행해 보면 아래처럼 현재 날짜 값이 라벨에 출력됩니다.



'


날짜 값 변경 시 라벨의 날짜 값도 바뀌도록 하겠습니다.
이번엔 IBOutlet이 아닌 Action 을 만들고 "DatepickerAction" 라고 이름을 정한다.




추가된 함수에 아래처럼 코딩을 넣어줍니다.

@IBAction func DatepickerAction(sender: AnyObject) {

  let dateFormatter = NSDateFormatter()
  dateFormatter.dateFormat = "yyyy-MM-dd"
  let strDate = dateFormatter.stringFromDate(DatePicker.date)
  self.DateLabel.text = strDate
  print(strDate)
}


시뮬레이션 실행 하면 날짜가 변경됨에 따라 라벨의 텍스트도 변하는것을 확인 할 수 있

<프린트 출력값>




3. Date Picker Mode & option 참고용

- 다양한 모드를 지원 및 옵션 지원 -




- Mode -







- Date Picker 컬러 설정 -


<백그라운드 컬러>
DatePicker.backgroundColor = UIColor.blueColor()

<텍스트 컬러>
DatePicker.setValue(UIColor.whiteColor(), forKeyPath: "textColor")

< 알파값 설정>
DatePicker.setValue(0.8, forKeyPath: "alpha")

<하이라이트 효과 없애기 (선택 날짜 컬러)>
DatePicker.setValue(false, forKey: "highlightsToday")

2016년 1월 12일 화요일

Swift 란? (소개, 특징)

Swift  소개

Swift 는 애플이 출시한 새로운 프로그래밍 언어로 코코아 터치(iOS) 와 코코아(Mac OS)  앱 개발하기 위한 언어입니다.

Swift  특징


1. 메모리 관리가 간단하다

  기존 Objective - C 로 개발을 하기 위해서는 메모리를 효율적으로 쓰는데 신경 써야 했으나 ARC
  (Auto Reference Counting)이 나온 후로 조금 간편해지긴 했지만 역시 메모리 사용에 주의를 기울
  이지 않으면 문제가 발생하곤 한다 이런 Memory Leak 문제는  원인을 찾기 어렵기 때문에 디버깅에 
  많은 시간과 노력이 필요하다. 하지만 스위프트는 타입지정이 필요없고 ARC를 사용하기 때문에 메모리
  관리를 위한 노력을 덜 수 있고 로직에 집중 할 수가 있다.


Memory Leak
메모리 누수는 프로그램이 메모리를 할당 후, 해제하지 않아서 시스템의 메모리를 고갈시키는 소프트웨어 오류
* ARC
앱의 메모리 사용량을 추적하기 위해 자동 참조 갯수(ARC: Automatic Reference Counting)를 사용합니다. 대부분의 경우, Swift에서 메모리 관리는 그냥 사용되고, 메모리 관리에 대해서 생각 할 필요가 없습니다. ARC는 인스턴스가 더 이상 필요 없을때 클래스 인스턴스를 자동적으로 메모리에서 해제 해줍니다.
출처: http://kka7.tistory.com/21 [까칠코더]



2. 안전한 코딩을 설계할 수 있다

스위프트는 안전한 프로그래밍을 지향합니다. 현대의 언어는 유연성을 강조한 나머지 의도치 않은
동작을 해서 디버깅이 어려운 경우가 많습니다. 애플은 이런 경우를 대비하여 문법을 통해 미연에 방지코자 노력하였고 변수는 사용되기 전에 반드시 초기화하여야 한다거나, 배열의 오버플로우를 검사하는등
문제가 발생할 여지가 있는 부분을 미리 체크하고 예외를 발생하는 함수나 메소드에 대해서는 반강제적으로 처리하도록 하는등 스위프트는 안전한 프로그래밍을 구현하고 있습니다.

3. 신속하다

스위프트는 성능을 예측할 수 있고 일정한 수준으로 유지할 수 있는 부분에 초점을 맞춰 개발되었습니다.
Objective - C 와 마찬가지로 고성능의 컴파일러인  LLVM으로 컴파일 되어 실행속도의 최적화 뿐만 아니라 빠른 컴파일 성능을 구현해 나가고 있습니다.

* LLVM

Xcode 내에서 실행되지만 LLVM은 스위프트의 검파일러이자 애플 기기를 가동시켜 프로세서가 필요로하는 비트와 바이트로 변환해줍니다.

4. 코드의 실행결과를 바로 확인 할 수 있는 Playground 기능

Playground 기능을 통해 실제 개발에 적용하기 전에 코드 조각이 제대로 동작하는지 확인 하거나, 
알고리즘의 로직을 검증하거나, 문법을 학습하는 용도로 사용할 수 있다.

5. Objective - C 와 같이 사용해서 개발을 할 수 있다.


한줄요약 

상대적으로 언어에 대한 진입 장벽이 낮고 개발하기 쉬운 자바스크립트나 파이썬, 루비와 같은 동적 바인딩 타입의 언어는 생산성이 좋으나 성능면에서 떨어지는 경우가 많고 성능이 좋은 언어일수록 진입 장벽이
높고 개발하기 어려워 생산성이 낮은경우가 많습니다. 이에 비해 스위프트는 개발 생산성과 앱 성능
모두에서 좋은 결과를 가져오는 언어임을 강조하고 있습니다.


2016년 1월 3일 일요일

Saving image to custom album (사진첩 추가하여 사진저장 하기) @@ in Swift2.x - Xcode 7.3 iOS 9.3

*사진첩을 추가하여 추가된 사진첩에 사진파일을 저장하는 예제입니다.

1. 새로운 .swift 파일 생성

 < 파일명 :  PhotoAlbumCustom.swift >



2. PhotoAlbumCustom.swift 파일에 아래 코드 입력

import Photos
import AssetsLibrary
enum PhotoAlbumUtilResult {
   case SUCCESS, ERROR, DENIED
}

class PhotoAlbumUtil: NSObject {
  // 사진첩 생성 작업 및 이미지 저장 작업
  class func saveImageInAlbum(image: UIImage, albumName: String, completion: ((result:PhotoAlbumUtilResult) -> ())?) {
      // 사진첩 폴더 생성
      var eventAlbum: PHAssetCollection?
      // 사진첩 이름
      let albumName = "CustomAlbum"
      let albums = PHAssetCollection.fetchAssetCollectionsWithType(PHAssetCollectionType.Album, subtype: PHAssetCollectionSubtype.Any, options: nil)
      albums.enumerateObjectsUsingBlock { (album, index, stop) in
          if album.localizedTitle == albumName {
             eventAlbum = album as? PHAssetCollection
             stop.memory = true
          }
 }

 //폴더 생성 유무 확인 후 각각 상태값에 따라 함수 호출
 //앨범 첫 생성 시 
eventAlbum == nil
  if let album = eventAlbum {
    completion?(result: .DENIED)
  }else{
  
//eventAlbum == nil 일 경우 폴더 재생성
    PHPhotoLibrary.sharedPhotoLibrary().performChanges({ PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(albumName)
  }, 
completionHandler: { (succeeded, error) -> Void in

    if succeeded {
      //
succeeded  시 사진접 생성 함수 재호출
      self.saveImageInAlbum(image, albumName: albumName, completion: completion)

    } else {
      // 에러
      completion?(result: .ERROR)
    }
  })
 }




// 사진첩 앨범 생성 확인 됐을 시 이미지 저장 작업 진행

  if let albumdex = eventAlbum {
    PHPhotoLibrary.sharedPhotoLibrary().performChanges({
       let result = PHAssetChangeRequest.creationRequestForAssetFromImage(image)
       let assetPlaceholder = result.placeholderForCreatedAsset
       let albumChangeRequset =
PHAssetCollectionChangeRequest(forAssetCollection: albumdex)
       let enumeration: NSArray = [assetPlaceholder!]
       albumChangeRequset!.addAssets(enumeration)
    }, completionHandler: { (succeeded, error) -> Void in
            if succeeded {
              completion?(result: .SUCCESS)
            } else{
              print(error!.localizedDescription)
              completion?(result: .ERROR)
            }

       })
    }
  }
}

3. ViewController.swift 에 호출 하는 함수 입력

import UIKit

class ViewController: UIViewController{

  override func viewDidLoad() {

    super.viewDidLoad() 
    
    // 함수 호출
    imageSave()
 
  }

  func imageSave(){ 
  // 테스트용 이미지 객체 생성
    let image = UIImage(named: "test.png")
    PhotoAlbumUtil.saveImageInAlbum(image, albumName: "TestAlbum", completion: { (result) in
      switch result {
        case .SUCCESS:
          dispatch_async(dispatch_get_main_queue(), {
            self.callback()
          })
        break
        case .ERROR:
          dispatch_async(dispatch_get_main_queue(), {
            self.errorCallback()
          })
        break
        case .DENIED:
        break
        default:
        break
      }
    })
  }

  // Alert 뷰로 이미지 저장 성공 / 에러 표시해주는 콜백 함수  
  func callback(){
    let ac = UIAlertController(title: "Save", message: "", preferredStyle: .Alert)
    ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
    presentViewController(ac, animated: true, completion: nil)
  }

  func errorCallback(){
  let ac = UIAlertController(title: "Save error", message: "", preferredStyle: .Alert) 
  ac.addAction(UIAlertAction(title: "OK", style: .Default, handler: nil))
  presentViewController(ac, animated: true, completion: nil)
  }
}
* 아래 이미지는 결과물입니다. TestAlbum 이라는 사진첩이 생성된것을 확인 할 수 있습니다.





참고하여 만든 예제라서 예제중에 사용된 메소드에 관한 설명이 많이 부족합니다. 
자세한 설명이 필요하신 분들은 구글링을 통해서 검색하셔서 좋은 정보 얻으시길 바랍니다.



추천 게시물

애플 개발자 등록방법 2016년 5월 8일 기준!!

애플 개발자 등록 절차 1. 개발자 등록 페이지 이동    애플 개발자 로그인 > Account 페이지 이동 > 하단 영역 클릭 (이미지 참조)   >> Enroll 클릭 >> 무조건 승인!! ...