2016년 4월 20일 수요일

Cordova : x-code ios 9 빌드 이슈 "Transport Security has Blocked a cleartext HTTP"

.plist file - NSAppTransportSecurity : dictionary / NSAllowsArbitraryLoads : yes

참고 :
http://stackoverflow.com/questions/31254725/transport-security-has-blocked-a-cleartext-http

cordova 취약점 으로 인한 앱 등록 거부 이슈

cordova 현재 버전에서 취약점 발견으로 인한 이슈
 - cordova 버전 업데이트
 - cordova 취약버전 embed  확인 및 삭제
 - cordova platform android 버전 업데이트

참조 :
http://community.phonegap.com/nitobi/topics/rejected-app-for-apache-cordova-security-issue

취약점 관련자료 :
http://www.trendmicro.co.kr/kr/blog/trend-micro-discovers-apache-vulnerability-that-allows-one-click-modification-of-android-apps/index.html

Android Build Issue : Could not find any version that matches com.android.support:support - (Number)

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring root project 'android'.
> Could not resolve all dependencies for configuration ':_debugCompile'.
   > Could not find any version that matches com.android.support:support-v4:+.
     Searched in the following locations:
         https://repo1.maven.org/maven2/com/android/support/support-v4/maven-metadata.xml
         https://repo1.maven.org/maven2/com/android/support/support-v4/
     Required by:
         :android:unspecified

* Try:

Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

:Android SDK Update
Tool - Android - SDK Manager : Extra - Android Support Repository Update

Node JS - Cron

[ https://www.npmjs.com/package/node-crontab ]


npm install node-crontab

var crontab = require('node-crontab');

var jobId = crontab.scheduleJob("*/2 * * * *", function(){ 

    console.log("It's been 2 minutes!");  //This will call this function every 2 minutes

});


[ https://github.com/harrisiirak/cron-parser ] 

npm install node-crontab

var parser = require('cron-parser');

try {
    var interval = parser.parseExpression('*/2 *  * * *');

    console.log('Date: ', interval.next().toString()); // Sat Dec 29 2012 00:42:00 GMT+0200 (EET)
    console.log('Date: ', interval.next().toString()); // Sat Dec 29 2012 00:44:00 GMT+0200 (EET)
    console.log('Date: ', interval.next().toUTC().toString()); 
    // Sat Dec 28 2012 22:46:00 GMT+0200 (EET)
catch (err) {
    console.log('Error: ' + err.message);
}


other module :
https://github.com/ncb000gt/node-cron

Node JS - install issue

- sudo 권한으로 설치

Appears to be a git repo or submodule Refusing to remove it. Update manually, or move it out of the way first.

Tab Bar Item Center Position

- image inset
             top :5
             bottom:-5

참고 :
http://stackoverflow.com/questions/10533917/ios-5-custom-tab-bar-image-vertical-alignment

When I try to run the Xcode simulator I get the error 'Stop “(null)”?


- cmd+b  ->  cmd+r

참고 :

http://stackoverflow.com/questions/32700580/when-i-try-to-run-the-xcode-simulator-i-get-the-error-stop-null

Uploading archive error: "Missing iOS Distribution signing identity for..."

1. 키체인 - 만료된 인증서 보기
2.WWDRCA 인증서 확인 (만료된 인증서) - 시스템로그인 확인  삭제
3.새로운 WWDRCA 인증서 키체인 적용 (시스템)

Renew WWDRCA 
https://developer.apple.com/certificationauthority/AppleWWDRCA.cer

참고 :

https://forums.developer.apple.com/thread/37208

xcode : archive 비활성화 이슈

빌드 타켓을 iOS Device 설정

참고 :
http://bdyne.net/?p=317

dyld: Library not loaded: @rpath/libswiftCore.dylib

* Restarting Xcode, iPhone, computer
* Cleaning & rebuilding
* Revoking and creating new certificate/provision profile
* Runpath Search Paths is $(inherited) @executable_path/Frameworks
* Embedded Content Contains Swift Code is 'Yes'
* Code Signing Identity is developer

참조 :
http://stackoverflow.com/questions/26024100/dyld-library-not-loaded-rpath-libswiftcore-dylib

The identity used to sign the executable is no longer valid

1.  xcode - Preferences
2. Accounts
3. your apple account Remove
4. Add again your apple account
5. Run your app

참조 : 
http://stackoverflow.com/questions/31484742/0xe8008018-the-identity-used-to-sign-the-executable-is-no-longer-valid

x - code 6.4버전 빌드파일을 7.0에서 빌드시 convert 후 발생하는 에러사항 처리

6.4버전 빌드파일을 7.0에서 빌드시 convert  이 후 발생한 에러사항

1. linker command failed with exit code 1 (use -v to see invocation) : bitcode enabled

설명 : 에러 메시지 바로 위에 출력해주는 파일의 링크가 깨지는 원인

해결 :  Build Setting - Build Option : Enable Bitcode - No 변경


2. error :  cannot parse the debug map for "...DerivedData/buildissuegscrggrmorxzlpbdeogxhdokjckf/Build/Intermediates/SwiftMigra
tion/buildissue/Products/Debug-iphonesimulator/buildissue.app/buildissue"
: No such file or directory

설명 :  디버깅 분석 에러

해결 :
프로젝트 - Targets : 프로젝트명Tests - Build Settings - Testing - Test Host 
- [Debug / Release] 삭제


3. ld: warning: directory not found for option '-F/Applications/Xcode-beta.app/Contents/Dev
eloper/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.0.sdk/
Developer/Library/Frameworks'


설명 : 지정된 프레임워크를 찾을수 없음

해결 :
프로젝트 - Targets : 프로젝트명Tests - Build Settings - Search Paths - Framework Search Paths 
- [ iphoneos/Developer/Library/Frameworks ] 삭제

Node JS - proxy 접속

-  Add "request" 

var request = require('request');


- Proxy API  Add

var url = ' Target Page URL';
request(url, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(response.statusCode);
        res.json(response.statusCode);
    }
})


참고 : http://blog.vanamco.com/proxy-requests-in-node-js/

동기와 비동기의 이해

데이터를 받는 형식

동기 : 데이터가 올때까지 기다림

비동기: 데이터가 올때까지 기다리지 않고 작업하다 데이터가 왔다는 응답으로 처리


참고 :
http://twinbraid.blogspot.kr/2015/02/blog-post_2.html

웹 환경의 이해 (Web Environment)

[ Server, Client ]
 클라이언트와 서버로 나뉘는 네트워크 아키텍쳐를 나타냄

   서버 :  특별한 서비스를 제공하는 컴퓨터
   클라이언트 :  서비스를 제공하는 사용자 혹은 사용자의 단말기

   서버의 주소 :
        URL (IP와 PORT로 구성)

   서버의 종류 :
        웹서버 ( 80 )
        데이터베이스 서버 ( MySQL : 3306 )
        DNS 서버 ( 1023, 53 )
        FTP 서버 ( 21 )
        ssh 서버 ( 22 )
        메일 서버 ( 110, 25, 143 )


[ Http ]
 Hyper Text Transfer Protocol 로 WWW상에서 정보를 주고 받을수 있는 프로토콜

  - TCP와 UDP 통신을 통해 서버의 80 포트로 접속


[ Request, Response ]
 Request : 서버로의 요청
  - GET : 정보를 가져오는 역활
  - POST : 정보를 수정, 입력하는 역활

 Response : 서버로 부터의 응답
  - html, javascript, css, image 등


[ Frontend (html, css, javascript) ]
사용자가 브라우저에서 정보를 보고, 웹서버에서 특정정보를 요청하기 위한 사전 작업을 수행

 - HTML : 웹페이지를 구조적으로 나타내는 문서, 데이터
 - CSS :  HTML 파일을 꾸며주는 역활, 디자인
 - JavaScript : 객체기반의 스크립트 프로그래밍 언어, 동작


[ Backend (web server, DB server, web framework) ]
사용자의 요청을 받아서 저장되어 있는 정보를 바탕으로 각 사용자에게  적합한 페이지 전송

 - 웹 서버 : 사용자의 요청에 맞게 데이터를 전송 (html, image, etc)
 - 데이터 베이스 :  사용자의 정보를 저장하는 저장소
 - 스크립트 엔진 : 웹서버에서 사용자의 요청을 분석해주는 프로그램 (php, jsp ..)
- 웹프레임 워크 : 웹개발을 보다 편리하게 해주는 도구, 생산성 향상, 정신공격에 좋음

웹 환경의 이해 1
https://www.youtube.com/watch?v=9svJZ55RTrg&index=1&list=PLWUxS6i2fXtip8sHElwRUubwWfLowlFA4

웹 환경의 이해 2
https://www.youtube.com/watch?v=0acywSaxlXo&index=2&list=PLWUxS6i2fXtip8sHElwRUubwWfLowlFA4



search bar cleanbutton image set

참고 :
http://stackoverflow.com/questions/31446458/how-to-change-height-of-search-bar-swift

Search Bar text color

var searchBar : UISearchBar!

if let searchTextField = self.searchBar.valueForKey("searchField"asUITextField {
        
        searchTextField.textAlignment = NSTextAlignment.Left
        
}

# search bar textfield background color - first : search style prominent

참고 :
http://stackoverflow.com/questions/26284658/searchbar-how-to-change-text-color

cell border color

let myColor : UIColor = UIColorred: 225/255, green: 228/255, blue:229/255, alpha: 1  )
cell.layer.borderColor = myColor.CGColor


참고 :
http://stackoverflow.com/questions/24764596/how-do-i-set-a-uitextfields-bordercolor

ScaleAspectFill 적용시 이미지 사이즈 고정

-(UIView).clipsToBounds = true

참고 :
http://stackoverflow.com/questions/30073097/why-scale-to-fill-give-bigger-image-than-uiimageview-size-using-swift

Remove CALayers from Parent UIView

- View border 추가 및 삭제

참고 :
http://stackoverflow.com/questions/30721649/remove-calayers-from-parent-uiview

URL 이미지 사이즈 구하기

var url:NSURL? = NSURL(string: imageString)
var data:NSData? = NSData(contentsOfURL : url!)
var image = UIImage(data : data!)

ex ) image.size.height

참고 : 
http://stackoverflow.com/questions/10972555/ios-load-an-image-from-url

CollectionView 예제

import UIKit

class CollectionView: UICollectionViewController{
    

    // 표시할  갯수
    override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return 1
    }
    
    // 섹션 갯수
    override func collectionView(collectionView: 
        UICollectionView, numberOfItemsInSection     section: Int) -> Int {
           return 10
    }
    
    
    // 재사용  요청  이미지설정
    override func collectionView(collectionView: 
      UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("photoCell"
           forIndexPath:indexPath) asCollectionViewCell
       
        // URL 이미지 사용 예 :
        var imgURL: NSURL = NSURL(string: "image url")!
        let request: NSURLRequest = NSURLRequest(URL: imgURL)
        var response:NSURLResponse = NSURLResponse()
        var data:NSData = NSData()
        var error:NSError
        NSURLConnection.sendAsynchronousRequest(request, queue:     
             NSOperationQueue.mainQueue(), completionHandler:{ response, data, error in
                   cell.imageViews.image = UIImage(data: data!)
        })

        // 셀 초기 효과적용 
        cell.alpha = 0
   
        return cell

    }
    
    
   //  Display에서 보이지 않은 셀 설정 
    override func collectionView(collectionView: UICollectionView, didEndDisplayingCell cell: 
        UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) {
        
        // 셀 초기화 (이미지 삭제)
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier
           ("photoCell", forIndexPath:indexPath) asCollectionViewCell
       
    }
    
    // /  Display에서 보여질 셀 설정 
    override func collectionView(collectionView: UICollectionView, willDisplayCell cell: 
        UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) {
           
           // 셀 효과
           UIView.animateWithDuration(2, animations: { cell.alpha = 1 })
           cell.backgroundColor = UIColor.redColor()   
    }    

}

참고 : 
http://rshankar.com/uicollectionview-demo-in-swift/
https://www.youtube.com/watch?v=IhwSGdQ2res
https://www.youtube.com/watch?v=yh9_YZfxtpI

 - collection view delegate 설명
http://atmarkplant.com/swift-uicollectionview/

 - pinterest layout
http://shrikar.com/ios-swift-tutorial-uicollectionview-pinterest-layout/

NSURL : image URL 예제

let imgURL: NSURL = NSURL(string: "image URL")!
let request: NSURLRequest = NSURLRequest(URL: imgURL)
let response:NSURLResponse = NSURLResponse()
let data:NSData = NSData()
let error:NSError

NSURLConnection.sendAsynchronousRequest(request, queue:  
           NSOperationQueue.mainQueue(), completionHandler:
                 { response, data, error in
                     
                   // 추가코드


                 }
 )



참고 :
http://stackoverflow.com/questions/30788287/swift-2-0-not-downloading-images-to-ui-imageview

Callback 예제

 func imageRequest (callback: (Array<String>, String?)  -> Void){
                        .
                        .
                        .
       callback(Array(photoArray), nil)
                        .
                        .
                        .

}
     

 imageRequest(){ (data, error) -> Void in
     if error != nil {
           print ("error")
     }else{
           print ("ok")
             }
         
     }

}

- callback 데이터 타입 배열(Array) 일때 사용

참고 :
https://medium.com/swift-programming/learn-nsurlsession-using-swift-ebd80205f87c#.wtyifthfq

NSMutableURLRequest API 요청 예제

import UIKit

internal var photoArray = [String]()

class ViewController: UIViewController {

    var postsEndpointString = "API URL"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        imageRequest()
        
    }
    
 func imageRequest (){
        
    var request = NSMutableURLRequest(URL: NSURL(string: postsEndpoint)!)
    var session = NSURLSession.sharedSession()
    request.HTTPMethod = "POST"
        
    //create dictionary with your parameters (example)
    var params = ["no":0"count":30as Dictionary<StringInt>
    
    request.HTTPBody = tryNSJSONSerialization.dataWithJSONObject(params, options: [])
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
        
    let task = session.dataTaskWithRequest(request) { data, response, error in
        guard data != nil else {
            print("no data found: \(error)")
            return
        }
            
        // this, on the other hand, can quite easily fail if there's a server error, so you definitely
        // want to wrap this in `do`-`try`-`catch`:
            
    do {
       if let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) asNSDictionary {
           var resultData = json as NSDictionary
           var resultData2 = resultData["data"asNSArray
   
           for photo in resultData2 {
                photoArray.append(photo["post_photo"asString)
                
                if photoArray.count == resultData2.count {
                    print(photoArray)
                }
           }
                    
         } else {
            // No error thrown, but not NSDictionary
            let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)    
            print("Error could not parse JSON: \(jsonStr)")
         }
       } catch let parseError {
          // / Log the error thrown by `JSONObjectWithData`
           print(parseError)                                                          /
           let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
           print("Error could not parse JSON: '\(jsonStr)'")
       }
       }
        
task.resume()

} }


참고 :
http://stackoverflow.com/questions/31030366/http-post-error-handling-in-swift-2

In App Purchase 예제

mport UIKit
import StoreKit

class ViewController: UIViewController,SKPaymentTransactionObserverSKProductsRequestDelegate{

    var product : SKProduct?
    var productId = "제품 ID"
    

    override func viewDidLoad() {
        super.viewDidLoad()
   
       // 트래잭션 감시자 결제 큐에 할당
        SKPaymentQueue.defaultQueue().addTransactionObserver(self)

        getProduct()
    }
    
   
    // 앱스토어 접속, 지정한 제품에 대한 정보 표시
    func getProduct(){
  
        if SKPaymentQueue.canMakePayments(){
            let request = SKProductsRequest(productIdentifiers: 
              NSSet(objects: self.productIdasSet<String> )
            
            request.delegate = self
            request.start()

        }else{
            // 설정 - 앱에서 앱 내 결제가 비활성화 되어 있음을 알림
        }
    }
    
    // 제품 정보에 대한 요청 결과 반환
    func productsRequest(
        request: SKProductsRequest!, didReceiveResponse response: SKProductsResponse!
    ) {
        var products = response.products
        
        // 제품을 가지고 있는 경우
        if(products.count != 0 ){
            product = products[0as SKProduct
            
            // 이벤트 입력 (ex :  버튼 활성화)
            
            
        }else{
            
           // 제품이 없을 경우
            print("product not found ")
         }   
    }
    
   
    // 결제 요청 버튼
    @IBAction func inAppSuccess(sender: AnyObject) {
        
        // SKPayment 객체의 형태로 결제 요청 생성
        let payment = SKPayment(product: product!)
        SKPaymentQueue.defaultQueue().addPayment(payment)
    }
    
    
    // 결제 프로세스 진행 
    func paymentQueue(
        queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]
     ) {

        for transaction in transactions as [SKPaymentTransaction]{
   
            // 프로세스 상태에 따른 이벤트 입력
            switch transaction.transactionState {

            // 결제 완료시
            case SKPaymentTransactionState.Purchased :
                SKPaymentQueue.defaultQueue().finishTransaction(transaction)

               // 이벤트 입력 ( 결제 완료 후 콜백 처리 : unlockFeature( ) )
                
             // 결제 실패시
            case SKPaymentTransactionState.Failed :
                SKPaymentQueue.defaultQueue().finishTransaction(transaction)
                
            default :
                break
            }
        }
    }
    
    // 결제 완료 콜백
    func unlockFeature (){
        print("결제 완료")
    }  

}

- 프로세스 상태 참고
https://developer.apple.com/library/ios/documentation/StoreKit/Reference/SKPaymentTransaction_Class/#//apple_ref
/c/tdef/SKPaymentTransactionState

SKStoreProductViewController 앱 스토어 연결 예제

import UIKit
import StoreKit

class ViewController: UIViewControllerSKStoreProductViewControllerDelegate {

    @IBAction func buyEvent(sender: AnyObject) {

        // 인스턴스 생성 및 초기화
        let storeViewController = SKStoreProductViewController()
        
        // storeViewController 인스턴스에 대한 델리케이터로 자신을 할당
        storeViewController.delegate = self
        
        let parameters = 
          [SKStoreProductParameterITunesItemIdentifier : NSNumber(integer: 제품번호)]
        
        storeViewController.loadProductWithParameters(parameters, completionBlock: 
           { result, error in
            
            if result {

                // 성공시 사용자에게 표시
                self.presentViewController(storeViewController, animated: true, completion: nil)                       }
        })
    }

    // 구입이나 취소했을시 메서드
    func productViewControllerDidFinish(viewController: SKStoreProductViewController) {
        viewController.dismissViewControllerAnimated(true, completion: nil)
    }


}


- 제품번호 확인
iTunes에 있는 제품에서 Ctrl - 클릭 (윈도우에서는 우클릭) 후 URL 끝에 있는 ID 복사