2013 이전/iOS개발

[iOS 개발] UIPopoverController 의 EKEventEditViewController 키보드 문제

hagulu 하구루2017.02.25 16:31

iOS5에서 PopoverController위에 EKEventEditViewController를 올려서 사용하다 보면 cancel 버튼이나 done 버튼을 통해서 나왔을때는 문제가 없지만,


UIPopoverController의 바깥 공간을 선택했을때는 UIPopoverController가 사라져도 키보드가 내려가지 않는 문제가 발생한다.

해당 viewController의 view에 endEditing: 을 이용해 보아도 변화가 없다.

구글링을 통해서 일본사이트에서 해결 방법을 찾았다.

일본어는 번역기로도 꽤 읽을 만한 내용이 나온다.

해당 내용은 참고한 사이트에서 문제점을 수정하고 정리한 소스이다.
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController {

    EKEventEditViewController *ev = (EKEventEditViewController *)self.popoverController.contentViewController;
    for (UIView* view in [[ev navigationBar] subviews])
    {
        if ([NSStringFromClass([view class]) isEqualToString: @"UINavigationButton"])
        {
            UIButton* btn = (UIButton*)view;
            
            for (UIBarButtonItem* buttonItem in [btn allTargets])
            {
                id target = [buttonItem target];
                SEL sel = @selector(cancel:);
                
                if ([target respondsToSelector: sel])
                {
                    [target performSelector:sel];
                    
                    NSLog(@"target = %@", NSStringFromClass([target class]));
                    NSLog(@"action = %@", NSStringFromSelector(sel));
                    
                }
            }
        }
    }
    
    return YES;   
}

위 소스 처럼 UIPopoverController의 delegate인 "popoverControllerShouldDismissPopover:" 에 추가해주면 된다.

위 소스 내용은 UIPopoverController가 바깥쪽을 선택하여 사라지기 직전에 EKEventEditViewController의 navigation item중에서 selector가 cancel:인 item을 찾아서 cancel: 를 실행해주는 방식이다.

어찌보면 꼼수라고 할 수 있어서 정답이라고는 말할 수 없을것 같다.

혹시 좀더 깔끔한 답을 알게 된다면 다시 포스팅 해보도록 하겠다.


댓글

댓글쓰기 폼

2013 이전/iOS개발

[iOS 개발] 현재 view의 모든 text editing 중단하기

hagulu 하구루2017.02.25 16:30

textfeild 나 textView 등 text를 editing 하는 view를 만들다 보면

키보드등 여러 문제로 골머리를 썩은 경험이 있을것이다.

특히, resignFirstResponder를 통해서 해당 editing을 그만 두려고 해야할때,

cell위에 사용하거나 여러 view가 중첩되어 해당 view의 객체를 컨트롤 하기 힘든경우가 발생할 수 있다.

이때 해당하는 뷰의 모든 subview들의 editing을 그만 두도록 한번에 처리 할수 있는 메소드가 있다.

[targetView endEditing:YES];

위 처럼 해당 뷰의 메소드를 호출하게되면 모든 subview들에 있는 editing이 멈추게 된다.

editing 때문에 올라와 있던 키보드들도 내려가게 된다.


댓글

댓글쓰기 폼

2013 이전/node.js

[node.js] npm을 이용한 module 설치

hagulu 하구루2017.02.25 16:30

node.js 가 최근 많은 각광을 받는 이유 중 가장 큰 이유가 바로 강력한 추가 module들 때문이다.

 

 위 주소 공식사이트를 가보면 알겟지만 현재 18,333개의 모듈들이 들록되어 있다. 게다가 빠른속도록 추가되고 있고, 업데이트도 활발이 이루어 지고 있다. 모듈을 설치하고 사용하는 법은 매우 간단하다.
 node.js 를 설치할때 같이 설치된 npm을 이용하면 간단히 사용 할 수 있다. npm 은 간단한 명령으로 등록된 module을 쉽게 install 하고 update 할 수 있다.
 Mac 의 Mac port 나 Linux 의 apt-get 등의 package 관리 툴들을 이용해 보았다면 낯설지 않게 이용할수 있을것이다.

$npm install socket.io

 위와 같은 명령으로 간단하게 socket.io 를 설치 할 수 있다.
 기본 설치 위치가 /usr/local 으로 되어 permission 문제 때문에 설치가 제대로 이루어 지지 않을 수도 있으니 sudo 를 통해서 하기를 권장한다.

이외에 해당 module을 최신화를 위해 아래와 같이 update 명령을 이용하면 된다.

$npm update socket.io

이외에도 여러 명렁을 통해서 npm을 컨트롤 할 수있다  이들에 대해서는

$npm

위 처럼 command 없이 입력하면 이용가능한 명령어들을 볼 수 있다.
//socket_io.js
var socket = require("socket.io");

socket.listen(8005);

socket.sockets.on('connections', function(socket) {

        socket.emit('news', {hello:'world'});

});

socket.sockets.on('my event', function(data) {
        console.log(data);
});
설치한 module 은 위처럼 require 를 통해서 사용할 수 있다.
위 예제에서는 나중에 socket.io에 대해서 다룰때 다시한번 언급 해보도록 하겠다.

하지만 이대로 소스를 실행하명 다음과 같은 에러를 보게 될것이다.

module.js:337
    throw new Error("Cannot find module '" + request + "'");
          ^
Error: Cannot find module 'socket.io'
    at Function._resolveFilename (module.js:337:11)
    at Function._load (module.js:279:25)
    at Module.require (module.js:359:17)
    at require (module.js:375:17)
    at Object.<anonymous> (/Users/gwanlija/socket_io/socket_io.js:1:76)
    at Module._compile (module.js:446:26)
    at Object..js (module.js:464:10)
    at Module.load (module.js:353:31)
    at Function._load (module.js:311:12)
    at Array.0 (module.js:484:10)

 해당 module 이 없다는 것인데, 방금 설치 했는데 없다니.. 무슨일일까? 바로 디렉토리 문제이다.
 해당 module이 설치된 디렉토리에서 소스를 저장하고 실행해야 해당 module 못찾는다는 위와 같은 에러가 나타나지 않는다. 일반적인 경우라면 /usr/local/lib 의 하위 디렉토리에서 가능하다.
 그런데.. 이렇게만 가능하다면 찝찝할 수 밖에 없다. 내가 원하는 디렉토리에서 실행이 불가능 한걸까?
 방법은 있다 해당하는 module 들을 소스가 들어 있는 디렉토리에 포함시켜야 한다. 이를 간단하게 해주는 것이 바로 package.json 파일이다. 해당 파일은 module 패키지에 대한 여러 정보를 정리 한 파일이다.

자세한 사항은 아래 링크를 확인 하기 바란다.


일단 여기서는 위에서 발생하는 문제의 해결에 필요한 것만 초점을 맞추도록 하겠다.
//package.json
{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app"
  },
  "dependencies": {
    "socket.io": "0.9.11"
  }
}
위와 같은  구조로 되어 있다. 윗부분은 보는것처럼 간단한 application 에 대한 정보를 기록한다.

그리고 주목하야 할것이 "dependencies" 항목이다.

socket.io 에 의존하고 있다고 명시하고 있다.
json 문법대로 키 벨류 쌍으로 이용하는 module을 필요하다면 추가로 명시해주면 된다.
이 파일을 소스가 들어 있는 디렉토리에 저장하면 된다.

그리고 해당 디렉토리에서

$npm install

위 처럼 입력하고 수행하면 package.json 의 "dependencies" 에 명시되어 있는 module을 해당 디렉토리에 설치가 되어 진다.
설치가 끝나고 다시한번 소스를 수행해 보면 문제 없이 수행되는것을 확인 할 수 있을 것이다.


댓글

댓글쓰기 폼

2013 이전/node.js

[node.js] mac에서 node.js 설치 하기

hagulu 하구루2017.02.25 16:29

최근 많은 관심을 받고 있는 node.js 에 관해서 하나씩 포스팅 해보려고 한다. 현재 내가 구동하고 있는 서버가 mac이므로 mac 위주로 진행될 것이다.



일단 node.js를 정말 간단히 소개하면, javascript 엔진위에 돌아가는 프레임워크로 기존의 웹 클라이언트에서 이용되는 것이 아니라,  서버 사이드에서 python, perl, rudy 와 비슷한 방식으로 이용할 수 있다고 보면 될 것이다.

자세한 사항은 아래 위키 페이지와 다른 정보를 더 얻어 보기 바란다.



설치 방법은 매우 간단하다.
아래 공식 사이트를 가서 각 플랫폼에 맞는 파일을 받아서 설치하면된다.


mac pkg 로 배포하기 때문에 매우 설치가 간단하다.





node.js 를 설치하면 위에 보는것 같이 npm 도 같이 설치되고, 기본 설치 경로가 위와 같다.
npm 이란 node packaged modules 의 약자로 node.js에 쓰이는 각종 module들을 설치하고 update 할수 있는
 tool 이다.

npm 사용법은 앞으로 포스팅될 여러 모듈들 예제에서 사용법을 설명하겠다.
npm의 공식 사이트는 https://npmjs.org/ 이다.
그리고 $PATH 설정도 추가 되어 node 라는 명령으로 어디서든 사용이 가능하다.

여기 까지 완료되면 아주 간단하게 node.js 의 기본 설정이 완료 되었다.
사용법은 기존 python이나 perl등의 언어를 사용해 봤다면 익숙할 것이다.  
아래와 같이 node 명령어로 인터프리터를 바로 사용할 수 있다 (나가려면 ^c 를 두번 해주면 된다)



그리고 .js 파일을 작성하여 실행할 수도 있다.
아래는  wiki에 나와 있는 간단한 웹서버 구현 예제이다.
//nodeHttp.js

var http = require('http');
 
http.createServer(function (request, response) {
    response.writeHead(200, {'Content-Type': 'text/plain'});
    response.end('Hello World\n');
}).listen(8000);
 
console.log('Server running at http://localhost:8000/');
위와 같이 작성하고 아래처럼 실행하면 웹서버가 수행되고




다음과 같은 결과를 얻을 수 있다.
보는 것처럼 기본적인 설치와 사용법은 매우 간단하고 직관적이다.
문법이 javascript라는 점도 매우 매력 적이다.


댓글

댓글쓰기 폼

2013 이전/iOS개발

[iOS 개발] 유용한 각종 UI controller open source 정리 사이트

hagulu 하구루2017.02.25 16:26

iOS에서 쓰이는 기본적인 UI 컨트롤러 외에 좀더 편리한 Custom controller 를 구현하고자 한다면 다음 사이트를 먼저 찾아보고 해보기 바란다.



해당 사이트는 custom으로 만들어 놓은 각종 컨트롤들이 open source로 공개되어 정리되어 있다.
iOS 뿐아니라 Max OSX까지도 올려져 있다. 꽤나 많은 자료가 있고, 최근 유행하는 Custom controller들이 많이 올라와 있어서 아주 유용할것이다. 그리고 라이센스 별로 나누어져 있어서 이부분에서도 사용이 편리할 것이다.


댓글

댓글쓰기 폼

2013 이전/iOS개발

[iOS 개발] 지역에 맞게 날짜 표기 하기

hagulu 하구루2017.02.25 16:26

글로벌하게 앱을 배포하려 하다 보면 날짜 형식을 표시하는데 문제가 생긴다.


일반적으로 우리나라의 표기 방식은

"2012년 10월 5일 금요일" 이런식으로 표시 된다.

하지만 미국의 경우는

"Friday October 5, 2012" 로 표기 순서와 방식이 다르다

그외에 또 다른 나라는 그 나라만의 표기 방식이 있다.

하지만 이를 지원하기 위해 모든 지역의 표기 방식을 찾아서 따로 처리 할 수는 없는 노릇이다.


다행이도 이를 쉽게 적용할 수 있는 method가 존재한다.

위와 같이 날짜를 표기 할때 NSDateFomatter를 사용하게 될 것이다.

기본적인 사용법은 따로 언급하지 않겠다.

한국의 표기 법대로 위의 경우라면

"yyyy MMMM d EEEE" 정도가 될 것이다.
이것을 현재 디바이스에 설정된 지역의 표기 방식으로 한방에 변환 시켜주는 함수가 있다.

간단한 예제를 보여 주겠다.
   NSString *dateFormatString = @"yyyy MMMM d EEEE";
    dateFormatString = [NSDateFormatter dateFormatFromTemplate:dateFormatString options:0 locale:[NSLocale currentLocale]];
    
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:dateFormatString];
    
    NSLog(@"%@", [dateFormat stringFromDate:[NSDate date]]);
위 예제를 수행하게 되면 위에 언급했던 방식으로

한국은 "2012년 10월 5일 금요일" 미국은 "Friday October 5, 2012"로 표시 된다.

위에서 보는것처럼 우리나라의 표시 방식으로 포멧을 스트링으로 만들고 이것을 아래 메소드를 통해서

만든 포멧 스트링과 현재 로케일 정보를 넣어 주면 해당 지역에 맞는 포멧 스트링을 리턴해 준다

dateFormatFromTemplate:dateFormatString:options:locale:

미국의 경우 "EEEE, MMMM d, yyyy"로 변환이 되고한국의 경우 "yyyy년 MMMM d일 EEEE"으로 변환이 된다.

미국의 경우 순서가 바뀌었고,

한국의 경우 "년" "일" 이라는 포멧을 넣지 않았지만 우리나라에 맞춰서 들어가는것을 알 수 있다.
("월"은 EEEE포멧일경우 자동으로 들어 간다)

이것을 이용하면 글로벌하게 배포될 앱의 날짜 포멧의 문제는 한방에 해결되게 된다.

참고로 위 메소드에 현재 로케일은 아래 그림에 표시된 부분의 설정에 따르게 된다. 


 .     


댓글

댓글쓰기 폼

2013 이전/기타

손쉽게 개발서버 구축하기

hagulu 하구루2017.02.25 16:24

예전에 우분투 환경에서 웹서버를 구축하고 이용을 하였었다.


그때 당시 필요에 의해서 ruby on rails 와 redmine을 셋팅하려고 하였는데.. 몇일을 삽질하다가 포기한적이 있다.

리눅스 셋팅에 아직 서투른가보다 하고 고배를 마셨다가,

최근 다시 필요로 해서 Mac환경에서 Redmine을 설치하려고 하였다.

Mac은 더 어려우면 어쩌지하고 찾아 보고 있다가 엄청난 것을 발견하였다.

바로 Bitnami 라는 프로그램이었다.


위 링크를 보면 알겠지만 redmine을 비롯해서 서버 개발자들이 좋아하는 툴들이 모아져 있다.

해당 툴들을 이용하기위한 모든 설치와 셋팅을을 간단한 설치 하나로 해결해 준다.  

더욱 엄청난 것은 윈도우, 리눅스, 맥OS 등의 os에 설치 파일을 제공할 뿐 아니라 vmware을 위한 이미지와 cloud Amazone machine 에서 사용할 수 있는 Amazon AMI 또한 제공해준다.

게다가 일부 메뉴는 설명에 한국어까지 지원되니.. 감격일 따름이다.

본인의 경우 redmine에 mysql, php, svn 등 패키지로 설치가 되어, redmine만 사용하려다가 svn 까지 적용해서 사용하게 되었다.

그외에도 많은 서비스와 툴들이 숨어 있으니 한번 훑어 보는것도 좋을것 같다.



댓글

댓글쓰기 폼

2013 이전/기타

내 도메인을 활용한 무료 ddns 설정 dnsEver

hagulu 하구루2017.02.25 16:23

유동 ip를 사용하는 집에서 서버를 이용하려면 언제 바뀔지 모르는 ip 때문에 힘든점이 많다.


이떄 사용하는 것이 ddns 라는 방법이다.

ddns에 대해서는

http://terms.co.kr/DDNS.htm 를 참조해 보기 바란다.

일반적으로 공유기에서 제공해주는 기능을 이용하는 것이 간편하다.

ipTime의 경우 아래의 링크를 확인해 보기 바란다.


하지만 자신의 도메인을 이용할 수 없어서 그닥 땡기지가 않는다.

일반적으로 호스팅을 사용하는 사용자는 dns를 이용해서 ddns를 활용할 수 있는 방법이 없기때문에 한계가 있다.

그러던 중 알게된 무료! 서비스를 하나 소개하려고 한다.

dnsEver 라는 곳인데, 간단히 이야기 하면 간단한 dns를 제공하고 웹으로 손쉽게 셋팅을 할 수 있게 해주는 서비스다.

주소는 http://dnsever.com 이다

무엇보다 좋은것은 ddns를 제공하고, 해당 ip를 http 리퀘스르를 통해서 쉽게 변경 할 수 있다.

즉, ddns를 자동화 하기가 쉽다는 것이다.

심지어는 윈도우에서는 자동화 프로그램까지 배포 하고 있다.

기본적인 사용 방법은 아래 링크에 너무나도 잘 설명되어 있다.



나같은 경우 지금 보고 있는 블로그는 cafe24의 호스팅을 hagulu.com으로 유지하고

ddns로 mini.hagulu.com을 추가하여 이용하도록 설정하였다.


이를 위해서는 먼저 도메인의 네임 서버를 dnsEver에서 제공해주는것으로 교체를 하고,





메뉴 중에서 호스트 ip 관리를 통해서 메인 ip를 등록하고(본인의 경우 cafe24 내 ip),

다이나믹 dns 관리를 통해 위에 링크에서 설명하는데로 설정해주면 된다.

기존에 메일을 다른쪽으로 돌려서 쓰고 있더라도 메일서버(MX)도 가능해서 걱정할 필요가 없다.

이외에도 위에 보이듯이 여러 작업을 할 수 있으며

 현재, 웹 포워딩 외에는 모두 무료로 사용 할수 있다.


네임서버를 변경하면 몇일은 안정적이게 도메인이 작동하지 못하니 이점은 고려하고 작업을 진행해야 할것이다.


댓글

댓글쓰기 폼

2013 이전/일단까고보자

[일단까고보자] 겔럭시 카메라

hagulu 하구루2017.02.25 16:22

지난 8월 삼성은 겔럭시 노트2, 겔럭시 노트 10.1 등 새로운 라인업을 소개 했다.


그리고 그와 함께 당당하게 소개된 겔럭시 카메라!





겔럭시s3의 카메라와 검색이 겹쳐서 찾기도 번거로운 이름이다. 출시 전에 이런걸 개발하고 있다는 소린 들었는데 어느새 만들어서 발표까지 해버렸다.

일단 까기 전에 일단 스펙을 정리 해보자
1600만 화소 CMOS이미지 센서,  광각 23mm, 광학 21배 줄 렌즈, 4.3 인치 디스 플레이
똑딱이 치고는 잘빠진 스펙임이 분명하다. 일단 자동 카메라를 사용하려는 사용자들에게는 인기가 있을만한 스펙이다. 몇년전의 일이라면 말이다.

그럼 본격적으로 까보겟다


1. 어정쩡한 포지션

최근에는 스마트폰이 급격히 보급이 되면서 그에 따라 똑딱이의 수요는 급격히 줄어 들었다.




 예전의 똑딱이 사용자들은 간단히 자신의 생활을 기록하거나, 여행등 추억을 꽤 쓸만한 화질로 간직하려고 하는 수요 였다. 하지만  최근 나오는 스마트폰의 카메라들은 일반 사용자들은 크게 차이점을 못 느낄정도로 좋은 화질을 자랑한다. 그렇기 때문에 휴대성이 휠씬 뛰어나고 공유 면에서도 편한 휴대폰 카메라로 똑딱이의 수요가 넘어가고 있다. 또한 좋은 사진을 바라는 준 고급 사용자들은 이미 똑딱이는 관심 밖이 었다. 꽤 낮아진 가격으로 접하기 쉬워진 DSLR을 많이 사용하게 되었다. 그리고 최근 무게와 크기가 부담인 고급 사용자를 위하여 콤펙트한 미러리스 DLSR이 각광을 받고 있다. 점점 똑딱이의 경쟁력은 두말 할 필요도 없이 떨어지고 있다. 내 예상으로는 스마트폰의 카메라가 점점더 발전 함으로써 위에 보이는 사진의 판매 추의 예측량보다 훨씬 더 빨리 떨어질 것으로 예상된다.  벌써 여기서부터 똑딱이로 나와 버린 겔럭시 카메라는 경쟁력이 없어 진다.
똑딱이 사용자들이 떠난 이유는 휴대성 때문인데, 원할한 공유가 이를 극복할 수 있을 것이라고 생각했던 것일까.
카메라 용어로 핀이 나가버린 것이다.

2. 요금제? 돈문제!

 겔럭시 카메라의 두번째 무리수는 3G/4G 데이터 사용 가능이다.
평소에는 크게 꺼내 쓰지도 않는 카메라를 위해서 데이터 요금제를 가입해서 쓸사용자가 얼마나 있을까? 삼성에서 내 놓을테니 특화 요금제가 생기긴 하겠지만, 언제 쓸지도 모르는 카메라를 위한 데이터 요금이라니..... 뭐.. 요금제 빌미로 공짜로 뿌리지 않을까 싶긴하다. 일부는, 데이터 요금제 가입하지 않고 사용하면 되지 않겠나? 싶겠지만.. 3G/4G사용 때문에 들어간 칩을 핑계로 가격이 일반 똑딱이라고 할 수 없는 가격이 나올 것이 뻔하다. 아이패드 처럼 와이파이 전용 모델이 나오면 모르겠지만 그런 움직임이 보이지 않는것 같다. 차라리 겔럭시 카메라가 나오기 전에 삼성에서 선보인 미러리스 와이파이 모델  NX 시리즈가 차라리 더 나을지도 모르겠다.
와이파이만 지원이 되고 요즘 각광 받는 미러리스 카메라니 여기가 좀더 포지셔닝이 깔끔해 보인다.





위에 보이는 세 가지 모델로 와이파이 카메라가 나왔었다.
이 카메라 시리즈가 나왔을때 혹시... 안드로이드가 탑제된 카메라가 나오지 않을까 했는데.. 실제로 나와 버린것이다.

정말 이 겔럭시 카메라를 경쟁 모델로 키워 나갈껀지는 의문이지만, 실험적인 하나의 케이스로 남고 끝나길 바란다. 알단까고보자 포스팅의 첫번째 타겟으로 잡은것 이유도 너무나도 명확히 이건 아니라고 생각이 들어서 가볍게 글을 쓸수 있을 것 같아 서이다..

정말 이건 아니다...



댓글

댓글쓰기 폼

2013 이전/iOS개발

[iOS 개발] iCloud keyValue Data Storage 사용

hagulu 하구루2017.02.25 16:20

유니버셜 앱을 개발하여 배포할때 각 앱의 설정을 연동할때 유용하게 사용할 수 있는

 
iCloud keyValue Data Storage를 소개 해보려고 한다.

앱 내에서 iCloud 연동을 위한 설정은 아래 포스팅을 통해 진행하면 된다.


설정이 다되면 이를 이용하는 것은 매우 간단하다.

NSUserDefault를 이용해 본 사용자라면 보자 마자 이해 할 수 있을것이다.

NSUbiquitousKeyValueStore 라는 클래스를 통해서 쉽게 사용 할수 있다.


 NSUbiquitousKeyValueStore* store = [NSUbiquitousKeyValueStore defaultStore];
        
[store setBool:YES forKey:@"kUsrDefAskDeleting"];

 [store synchronize];
보는 것처럼 간단하게 defaultStore 메소드를 통해서 keyValue를 셋할수 있는 객체를 얻어 올수 있고,
 
해당 객체에 set 메소드를 통해서 BOOL 변수 뿐 아니라
- (void)setString:(NSString *)aString forKey:(NSString *)aKey;
- (void)setData:(NSData *)aData forKey:(NSString *)aKey;
- (void)setArray:(NSArray *)anArray forKey:(NSString *)aKey;
- (void)setDictionary:(NSDictionary *)aDictionary forKey:(NSString *)aKey;
- (void)setLongLong:(long long)value forKey:(NSString *)aKey;
- (void)setDouble:(double)value forKey:(NSString *)aKey;
- (void)setBool:(BOOL)value forKey:(NSString *)aKey;
위 메소드를 통해서 여러 형태의 객체를 저장할 수 있다.
 
그리고 모든 저장 절차가 끝나면

synchronize 메소드를 호출해 주면 된다.

synchronize를 호출했다고 해서, 해당 하는 내용이 iCloud로 바로 전송이 되어지는 것은 아니다.

해당 메소드를 호출하면 해당하는 내용이 즉시 파일에 저장이 된다.

이후 iCloud로 전송이 되는것은 시스템이 알아서 해준다.

즉, iCloud로 싱크 시키는것을 명시적으로 해줄 수 있는 방법은 없다.

그렇다고, 그 iCloud로 싱크되는 시점이 늦지는 않으니 걱정하지 않아도 될것이다.

네트워크가 안정적인 환경에서 테스트 해보았을때 30초 안에는 적용이 되어 다른 디바이스에 전달되는것을 확인 하였다.

이제 변경된 사항을 iCloud로 부터 받아 보는 방법을 보겠다.

이도 매우 간단하다.
 NSUbiquitousKeyValueStore *keyStore = [NSUbiquitousKeyValueStore defaultStore];
        
[[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector: @selector(ubiquitousKeyValueStoreDidChange:)
                                                     name: NSUbiquitousKeyValueStoreDidChangeExternallyNotification
                                                   object:keyStore];
    
[keyStore synchronize];

위 와 같은 방법으로 notification을 등록해 준후에 해당 메소드를 구현해주기만 하면 된다.

-(void) ubiquitousKeyValueStoreDidChange: (NSNotification *)notification
{
    // Get the list of keys that changed.
    NSDictionary* userInfo = [notification userInfo];
    NSNumber* reasonForChange = [userInfo objectForKey:NSUbiquitousKeyValueStoreChangeReasonKey];
    NSInteger reason = -1;
    
    // If a reason could not be determined, do not update anything.
    if (!reasonForChange)
        return;
    
    // Update only for changes from the server.
    reason = [reasonForChange integerValue];
    if ((reason == NSUbiquitousKeyValueStoreServerChange) ||
        (reason == NSUbiquitousKeyValueStoreInitialSyncChange)) {
        // If something is changing externally, get the changes
        // and update the corresponding keys locally.
        NSArray* changedKeys = [userInfo objectForKey:NSUbiquitousKeyValueStoreChangedKeysKey];
        NSUbiquitousKeyValueStore* store = [NSUbiquitousKeyValueStore defaultStore];
        NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
        
        // This loop assumes you are using the same key names in both
        // the user defaults database and the iCloud key-value store
        for (NSString* key in changedKeys) {
            id value = [store objectForKey:key];
            [userDefaults setObject:value forKey:key];
        }
    }
}

위 처럼 구현을 하였는데, 이는 apple developer page에서 그대로 가져다 쓴것이다.


NSUserDefault를 통해서 셋팅을 관리 한다면 그대로 가져다 써도 무방할 것이다.

 해당 내용은 그렇게 어렵지 않으므로 추가 적인 설명은 생략 하겠다. 


 사용이 간단하니 한번씩 앱에 적용해 보는 것도 나쁘지 않을 것으로 보인다.


댓글

댓글쓰기 폼

hagulu.com

.....

VISITED

Today : 66

Total : 155,598

Lately Comment