iOS2015. 8. 31. 14:53



호스트 연결전에 DNS Name resolving피하기


호스트에 접속하는 적절한 방법은 DNS 명을 받는 CFHost나 CFNetService같은 API가 있다. 앱에서 DNS name으로 리졸브된 ip주소로 접속을 한다고 해도 이 방법은 피해야 한다. DNS lookup은 보통 여러개의 IP주소를 반환하며 어떤 IP주소가 가장 좋은 연결을 제공하는지 알 수 없다.

최근의 대부분의 컴퓨터나 모바일디바이스들은 멀티홈을 가진다. 즉 WiFi + Ethernet이거나 3G + WiFi이거나 하는 환경이 많다. 하지만 모든 호스트가 모든 컨넥션에서 유효한것은 아니다. 예를 들어 iPhone으로 Apple TV를 제어하려고 하는 경우 App TV는 Wifi망에 있고 폰은 3G망에 있다면 이는 연결이 불가하다.

디바이스와 서버가 모두 멀티IP주소를 가지고 있다면 서버에 연결할 가장 좋은 IP주소는 어떤 네트웍에 연결되어 있느냐에 따라 결정된다. 예를 들어 가정의 멀티미디어 서버가 LAN과 WiFi IP주소를 모두 가지고 있다면 OS에서 더 빠른 네트웍을 감지할 수 있을것이며 프로그램이 이 주소를 통해 연결가능할것이다.

서버가 IPv4와 IPv6를 모두 지원하면 두 프로토콜을 사용함으로 인해 도달하지 못할 수 있다. host-name-basedAPI를 사용하여 OS는 동시에 시도를 할 수 있고 첫번째것으로 성공시킬수 있다. 앱이 먼저 찾아낸 IP주소가 어떤 주소냐에 따라서 연결이 안될 가능성 도 있다.

구형 서버로  IPv6를 지원하지 않는 경우에 AAAA형식의 IPv6주소로 접을을 요청하면 동기로 호출되는 DNS조회는 요청시간내내 블럭될것이다.(디폴트는 30초) . 만일 호스트명을 취하는 API를 사용하면 OS는 IPv4와 IPv6요청이 동시에 수행되는지 사용자가 알수 없게 할것이고 내부적으로 IPv4연결이 완성되면 IPv6연결시도는 취소할것이다.

Bonjours를 사용해서 서비스를 게시하는 경우(DHCP는 동작하지 않음) 앱이 해당서비스를 찾아서 IP주소를 얻어내었다면 해당 디바이스가 IP주소를 유지하는 동안에는 유효하다. 하지만 DHCP서비스가 다시 온라인이 되게 되면 IP주소는 변경되고 이전 IP주소는 더이상 유효하지 않게 된다. 만일 게시이름으로 연결을 시도하게 된다면 앱에서는 서버가 최종적으로 언어진 IP주소로 계속 연결을 할 수 있게 될것이다.

DNS Name 해결하기를 직접 피할수 없다면 먼저 CFHost API가 요구사항에 만족하는지 확인해보아야 한다. 이는 싱글주소 대신에 호스트에 주어진 모든 주소목록을 제공한다. CFHost가 만족시키지 못한다면 DNS Service Discovery API를 사용하라.



Posted by 삼스
iOS2015. 8. 31. 13:38



아래는 애플뉴스스(https://developer.apple.com/news/?id=08282015a)의 전문이다.

Supporting IPv6 in iOS 9

August 28, 2015


At WWDC 2015 we announced that iOS 9 will support IPv6-only network services. All apps submitted to the App Store must support IPv6 starting in early 2016. To make sure your app is compatible, use the networking frameworks (e.g., “NSURLSession”), avoid use of IPv4-specific APIs, and avoid hard-coded IP addresses. Before submitting your app, test for compatibility.

To learn more, read Supporting IPv6 DNS64/NAT64 Networks and watch Your App and Next Generation Networks.


WWDC2015에서 이미 언급했다는데 iOS9부터 IPv6-only network service를 지원할거라나. 코드상에 웹서비스 주소를 도메인주소를 사용하고 있다면 문제가 안되겠지만 ip주소를 사용하고 있다면 문제가 될거란다. 내년(2016) 초부터 앱스토어가 지원을 시작할거라는데 이 얘기인즉슨 그런 앱들을 리젝을 놓겠다는건지 정확히 모르겠다. 무슨 지혼자 잘났다고 IPv6를 강제한단 말인가? 장비부터 해서 갑자기 강제하면 분명히 혼란과 혼돈이 있을것인제...

무튼 IPv4전용 API는 하드코딩된 IP주소를 모두 피해야 한다. 기존 앱들은 물론 다 바까야겠지.

자 그럼 불평만 할떄가 아니다 기존앱들은 그리고 새로운앱들은 또 어떻게 대응해야 할까를 연구해보자...

만일 앱이 high-level network api를 즉 NSURLSession이나 CFNetwork frameworkd의 API들을 사용하고 연결은 도메인명으로 하고 있다면 아무것도 할게 없다.

만일 도메인명으로 연결하고 있지 않다면 가이드(Avoid Resolving DNS Names Before Connectiing to Host)를 참고







Posted by 삼스
iOS2015. 8. 28. 16:12


http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/


App Transport Security Technote


앱과 웹서비스간의 보안을 더 향상시킬 수 있는 기능이다.

디폴트연결 요구사항들로 구성한다. 이 요구사항은 보안연결을 위한 최적의 구성을 기술한다.

App은 이 동작에 대해 오버라이드하거나 기능을 아예 꺼버릴 수 있다.

iOS 9.0, OSX 10.11 이후부터 지원한다.


디폴트 동작

iOS 9.0과 OSX 10.11에서 돌아가는 앱에서 NSURLConnection, CFURL 또는 NSURLSession을 이용한 모든 통신은 Transport security의 디폴트 동작을 사용한다.

이 요구사항에 부합하지 않은 모든 연결을 실패할것이다.


ATS 필수 요구사항

- 서버는 Transport Layer Security(TLS) protocol version 1.2이상을 지원해야 한다.

- 암호화는 forward secrecy를 지원하는것들로 제한된다.

- 인증서는 반드시 SHAR256이나 더 발전된 해시알고리즘을 사용해야 한다. 잘못된 인증서는 실패한다.


허용된 암호화

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384

TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256

TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA


예외

디폴트 동작에 대한 예외를 info.plist파일을 통해서 정의할 수 있다. 해당 예외에 대한 키값들을 사용하거나 기능을 끌 수 있다. 다음은 키값들과 키값에 해당하는 타입들을 나타내었다.



NSAppTransportSecurity   Dictionary

    NSAllowsArbitraryLoads   Boolean

    NSExceptionDomains Dictionary

        <domain-name-for-exception-as-string> Dictionary

            NSExceptionMinimumTLSVersion String

            NSExceptionRequiresForwardSecrecy Boolean

            NSExceptionAllowsInsecureHTTPLoads Boolean

            NSIncludesSubdomains Boolean

            NSThirdPartyExceptionMinimumTLSVersion String

            NSThirdPartyExceptionRequiresForwardSecrecy Boolean

            NSThirdPartyExceptionAllowsInsecureHTTPLoads         Boolean



NSAppTransportSecurity

  디폴트동작을 오버라이드할 셋팅값들을 포함하는 딕셔너리이다. info.plist의 최상위 key값


NSAllowArbitraryLoads

  NSExceptionDomains 딕셔너리에 리스터업되지 않는 도메인들에 대한 ATS를 사용할지 boolean 값으로 정의한다.

  디폴트값은 NO이고 모든 연결들에 대해 ATS를 요구한다.


NSExceptionDomains

  ATS 예외 도메인들의 딕셔너리이다. 각 키는 예외할 도메인명을 담은 문자열이다. named domain이며 예를 들면 www.google.com같은것이다.


NSExceptionMinimumTLSVersion

  최소 TLS버전으로 TLSv1.0, TLSv1.1, TLSv1.2 가 있다. TLSv1.2가 디폴트값이다.


NSExceptionRequiresForwardSecrecy

  도메인이 지원하는 암호화 요구사항을 오버라이드 한다. YES가 디폴트이며 디폴트동작에서 정의한 암호화로 제한다.

  No이면 다음 암호화가 추가된다.


TLS_RSA_WITH_AES_256_GCM_SHA384

TLS_RSA_WITH_AES_128_GCM_SHA256

TLS_RSA_WITH_AES_256_CBC_SHA256

TLS_RSA_WITH_AES_256_CBC_SHA

TLS_RSA_WITH_AES_128_CBC_SHA256

TLS_RSA_WITH_AES_128_CBC_SHA


NSExceptionAllowsInsecureHTTPLoads

  No가 디폴트값이며 모든 연결이 HTTPS를 사용할지 결정한다. 이 키값으로 도메인이 인증서없이 접근하거나 self-signed로 접근하거나, 만료되거나 호스트명 미스매치 인증으로 접근가능하도록 할 수 있다.

  

NSIncludeSubdomains

  No가 디폴트 값이며 최상위 레벨 도메인의 모든 서브도메인에도 적용할지 결정한다.


NSThirdPartyExceptionMinimumTLSVersion

NSThirdPartyExceptionRequiresForwardSecrecy

NSThirdPartyExceptionAllowsInsecureHTTPLoads

  개발자에의해 앱서비스가 컨트롤되지 않는 도메인의 경우 사용된다. <- 먼소린지???



Posted by 삼스
Linux2015. 8. 27. 09:24



sudo apt-get update

sudo apt-get upgrade

sudo apt-get install bison

sudo apt-get install g++

sudo apt-get install flex



/*1. flex 설치

flex download

tar xfv flex-2.5.39.tar.bz2

./configure 

make

sudo make insatll

*/


2. glib 설치

glib download : http://ftp.acc.umu.se/pub/gnome/sources/glib/2.46/glib-2.46.0.tar.xz

dependencies

- pkgconfig : http://www.freedesktop.org/software/pkgconfig/

- libiconv : http://www.gnu.org/software/libiconv/

- gettext : http://www.gnu.org/software/gettext/


2.1 pkgconfig

pkgconfig download

wget http://pkgconfig.freedesktop.org/releases/pkg-config-0.19.tar.gz

./configure

make

sudo make install


export PKG_CONFIG_PATH=/usr/local/bin/pkg-config 를 ~/.bash_profile에 추가


2.2 libiconv

libiconv downloa

http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz

./configure

make

sudo make install



2.3 gettext

gettext download

wget http://ftp.gnu.org/pub/gnu/gettext/gettext-0.19.6.tar.xz

./configure

make

sudo make install


2.4 libffi

libffi download

ftp://sourceware.org/pub/libffi/libffi-3.2.tar.gz

./configure

make

sudo make install



2.4 glib

glib download

wget http://ftp.gnome.org/pub/gnome/sources/glib/2.44/glib-2.44.1.tar.xz

sudo apt-get install zlib1g-dev

//sudo apt-get install libffi-dev


./configure --with-libiconv

make

sudo make install


아래 에러가 발생할 수 있다.

error while loading shared libraries: libiconv.so.2: cannot open shared object file:


/usr/local/lib에 libiconv.so.2가 있음에도 불구하고 link가 연결이 제대로 안되는 경우가 있다.

ldd $(which iconv)를 입력해서 아래와 같이 나오면 이런 경우이다.

녀애 

$ ldd $(which iconv)

linux-gate.so.1 => (0xb77b1000)

/usr/local/lib/preloadable_libiconv.so (0xb76cc000)

libiconv.so.2 => not found

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb74f7000)

/lib/ld-linux.so.2 (0xb77b2000)


이 떄는 다음 명령을 한번 실행한다.


sudo ldconfig -v


다시 ldd명령을 수행하면 정상적으로 링크가 걸린것을 확인할 수 있다.


ldd $(which iconv)

linux-gate.so.1 => (0xb77b4000)

/usr/local/lib/preloadable_libiconv.so (0xb76cf000)

libiconv.so.2 => /usr/local/lib/libiconv.so.2 (0xb75c1000)

libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7416000)

/lib/ld-linux.so.2 (0xb77b5000)



3. liboil

liboil download

http://liboil.freedesktop.org/download/liboil-0.3.17.tar.gz

./configure

make

make install


4. gstreamer

아래 패키지들을 모두 다운로드 및 설치 진행(http://gstreamer.freedesktop.org/data/src)

./configure && make && sudo make install

gstreamer

gst-plugins-base

gst-plugins-good/bad/ugly

gst-ffmpeg는 deprecated됨. gst-libav설치(https://bugzilla.gnome.org/show_bug.cgi?id=676260)

sudo apt-get yasm  nasm 먼저 설치 후 진행

순서로 설치


mp3파일 재생 테스트

gst-launch-1.0 playbin uri=file:///home/leeyosam/gmediarender/iu-knee.mp3

이 때 아래와 같은 에러가 날 수 있다.

gst-launch-1.0: symbol lookup error: gst-launch-1.0: undefined symbol: _gst_date_time_type

이 경우 ldconfig를 실행해주면 된다.

sudo ldconfig




Posted by 삼스
Android/Wear2015. 8. 24. 16:43


안드로이드 웨어는 HTTP통신 같은 인터넷 억세스를 지원하지 않는다고 한다. 이에 어떻게 데이터 전송을 지원하는지 알아보기 위해 아래 문서를 정리해 보았다.  실제로 이 API를 wrapper하여 http get을 지원하는 lib를 만들어서 공개한 개발자도 있다.

좀더 정확히 얘기 하면 Bluetooth로 연결이 되지 않은 상태에서 wifi에 연결이 되어 있다면 인터넷 억세스가 다이렉트로 가능하다. 하지만 bluetooth가 연결이 되는 순간 먹통이 된단다. 동시에는 안된다는데... 왜 안될까??? 단말과 워치간의 데이터 동기화를 위해서는 이 때는 Data Layer API로 bluetooth를 통해서 전송하는 방법을 사용해야 한다고 한다. 이건 맞다고 보는데 이 때 wifi가 진짜 안될까????? 워치가 없으니 확인할 방법은 없고.. 궁금하긴 하다. 워치 구매하면 제일먼저 해야할 일이다.


http://developer.android.com/training/wearables/data-layer/index.html


Data Layer API for Wearable은 Google Play Service의 일부로 폰과 웨어러블간의 통신채널을 제공한다.

데이터오브젝트의 셋을 제공하는데 전송 및 동기화 그리고 관련 콜백리스너를 제공한다.


Data Items

  DataItem한개는 단발과 웨어러블간에 자동으로 동기되는 데이터 스토리지를 제공한다.


Messages

  MessageApi클래스는 메시지들을 전송할 수 있으며 RPC에 기반하여 웨버러블에서 단말의 미디어플레이어를 제어한다거나 단말에서 웨어러블에 인텐트를 시작하거나 할 수 있다.

  Message는 단방향 및 양방향 통신을 모두 제공한다.

  단말과 웨어러블이 연결되면 메세지를 전달하기 위해 시스템은 큐잉하고 성공코드를 반환한다. 디바이스가 연결이 되지 않으면 에러를 반환한다. 


Asset

  Asset객체는 이미지 같은 바이너리데이터를 전송하기 위한 객체이다. Data item에 asset을 첨부하면 시스템은 자동으로 잘 전송해준다. 


WearableListenerService(for services)

  WearableListenerService를 확장하여 서비스에서 중요한 이벤트를 처리할 수 있다. 시스템은 lifecycle을 관리하고, data item이나 message를 전송해야 하면 서비스에 바인딩하며, 서비스가 더이상 필요없으면 언바인딩한다.


DataListener(for foreground activities)

  액티비티에서 DataListener를 구현하여 액티비티가 포그라운드로 진입히 중요한 이벤트를 처리할 수 있다. WearableListenerService대신에 사용하면 앱이 사용중에만 변경을 감지할 수 있다.


Channel

  ChannelApi클래스를 사용하여 큰 data item들을 전송할 수 있다. 음악이나 동여상파일들을 단말에서 웨어러블에 전송이 가능하다. ChannelApi는 다음과 같은 잇점이 있다.

  • 하나이상의 단말간에 대용량 데이터 파일을 전송한다(DataItem에 Asset으로 자동동기화를 하지 않고 가능). 디스크용량을 절약이 가능하다. DataApi클래스의 경우 동기화하기 전에 Asset을 복사한 후 수행하기 때문에 디스크용량 절약에 불리하다.
  • MessageApi 클래스를 사용하여 아주 큰사이즈를 안정적으로 전송이 가능하다.
  • network server나 micorophone같은 스트림데이터를 전송할 수 있다.


주의) 단말과 웨어러블간의 통신을 위해서 설계가 된 API이기 때문에 두 단말간에 셋업해야 하는 API가 있다. 예를 들어 low-level 소켓통신을 시도해서는 안된다.


안드로이드 웨어는 여러개의 디바이스와 동기화를 지원한다. 한단말에서 노트를 편집하면 연결된 모든 디바이스에 동기화가 된다. 동기화를 위해 구글 서비스에 클라우드 노드가 생성되고 이 노드를 통해서 동기화가 된단다.



Posted by 삼스
Linux2015. 8. 19. 11:24


GMediaRender는 UPnP media render중 하나이며 UPnP media server로부터 media content(video, audio, image)를 재생한다. 


UPnP A/V 는 3티어 시스템으로 구성된다.

Server, Renderer, Controller


UPnP controller로 UPnP Renderer에 UPnP Server의 컨텐츠를 재생하도록 명령을 내릴수 있다.


GMediaRenderer는 다음 3가지 디펜던시가 있다.

1. GNU C Compiler(gcc), 2.95 or later

2. libupnp 1.6.0 or later(BSD license)

3. GStreamer 0.10(LGPL)

그 외 GNU/Linux 라이선스로 제공되는 UPnP A/V 관련 오픈소스 프로젝트들

A/V Content Servers

- MediaTomb

- GeeXboX uShare

- GMediaServer

_ Cidero Internet Radio Server


A/V Content Renderers

- GMediaRender

- djmount

- Compère - Coherence-based media renderer

UPnP-Control for Mplayer

- A/V Content Controllers


Cidero Media Controller

- gUPnP universal control point (part of gupnp-tools)








Posted by 삼스