XCode 에서 iCloud 기능을 사용하려면 애플에 정식 개발자 계정을 등록해야 한다.

글을 쓰는 현재 환율 기준으로 결제하니 원화로 129000원이 결제 되었다.

https://developer.apple.com 에 접속하여 신청하면 되고 신청하니 하루 정도 있다가 계정에 등록되어 있는 정보와 결제한 신용카드의 정보가 다르다며 신분증 사본을 요구하는 메일이 왔다. 신분증을 사진찍어 보내고 다시 하루정도 후에 정식 승인이 되었다.

승인이 완료되면 개발자 사이트를 통해 인증서를 다운받고 디바이스를 등록하는 등의 과정을 진행할 수 있다.


이제 Xcode 의 프로젝트 메뉴중 Capabilities 탭에 들어가게 되면 iCloud , in-app purchase 등의 기능을 사용할수 있는데 iCloud 기능을 ON 시키고 icloud Documents의 체크박스를 클릭한다. 


위의 제반사항들에 대해서 처리가 다 되었다면 아래 샘플 코드를 참고하여 테스트앱을 만들어보자.


storyboard 의 UI 는 텍스트뷰와 버튼을 이용해 텍스트뷰에 작성 후 버튼을 누르면 iCloud 저장소에 저장이 되도록 하였다.




UIDocument 를 상속받는 클래스 (swift 파일 추가)


import UIKit


class MyDocument: UIDocument {


    var userText : String? = "Some Sample Text"

    

    override func contentsForType(typeName: String) throws -> AnyObject {

        if let content = userText {

            let length = content.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)

            return NSData(bytes: content, length: length)

        }else{

            return NSData()

        }

    }

    

    override func loadFromContents(contents: AnyObject, ofType typeName: String?) throws {

        if let userContent = contents as? NSData {

            userText = NSString(bytes: contents.bytes, length: userContent.length, encoding: NSUTF8StringEncoding) as? String

        }

        //return true

    }

}






viewDidLoad 메소드, 앱이 최초 실행시 코드 (viewController.swift 파일)


override func viewDidLoad() {

        super.viewDidLoad()

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

        let filemgr = NSFileManager.defaultManager()

        

        ubiquityURL = filemgr.URLForUbiquityContainerIdentifier(nil)

        

        guard ubiquityURL != nil else {

            print("unable to access iCloud Account")

            print("open the settings app and enter your Apple ID into iCloud settings")

            return

        }

        

        ubiquityURL = ubiquityURL?.URLByAppendingPathComponent("Documents/savefile.txt")

        

        metaDataQuery = NSMetadataQuery()

        metaDataQuery?.predicate = NSPredicate(format: "%K like 'savefile.txt'", NSMetadataItemFSNameKey)

        metaDataQuery?.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope]

        

        NSNotificationCenter.defaultCenter().addObserver(self, selector: "metadataQueryDidFinishGathering:", name: NSMetadataQueryDidFinishGatheringNotification, object: metaDataQuery!)

        

        metaDataQuery!.startQuery()

  }






metadataQueryDidFinishGathering 메소드 추가


func metadataQueryDidFinishGathering(notification : NSNotification) -> Void {

        let query : NSMetadataQuery = notification.object as! NSMetadataQuery

        query.disableUpdates()

        

        NSNotificationCenter.defaultCenter().removeObserver(self, name: NSMetadataQueryDidFinishGatheringNotification, object: query)

        query.stopQuery()

        

        let results = query.results

        if query.resultCount == 1 {

            let resultURL = results[0].valueForAttribute(NSMetadataItemURLKey) as! NSURL

            document = MyDocument(fileURL: resultURL)

            document?.openWithCompletionHandler({(success : Bool) -> Void in

                if success {

                    print("iCloud file open OK")

                    self.textView.text = self.document?.userText

                    self.ubiquityURL = resultURL

                } else {

                    print("iCloud file open failed")

                }

            })

        } else {

            document = MyDocument(fileURL: ubiquityURL!)

            document?.saveToURL(ubiquityURL!, forSaveOperation: .ForCreating, completionHandler: {(success :  Bool) -> Void in

                if success {

                    print("iCloud create OK")

                } else {

                    print("iCloud create failed")

                }

            })

        }   

}






텍스트 입력 후 저장 액션 메소드 


@IBAction func saveDocument(sender: AnyObject) {

        document!.userText = textView.text

        document?.saveToURL(ubiquityURL!, forSaveOperation: .ForCreating, completionHandler: {(success : Bool) -> Void in

            if success {

                print("Save overwrite OK")

            } else {

                print("Save overwrite failed")

            }

        })

}







위의 
코드는  "핵심만 골라 배우는 ios 9 프로그래밍 (닐스미스 지음/ 황반석 옮김)" 에 있는 예제를 참고하여 작성하였습니다.

+ Recent posts