ConvertKML2GPX.zip

Google Map 혹은 Google Earth를 사용하면, 현재 찾은 위치값을 별도로 저장하는 방법을 제공합니다. 이 때 사용하는게 KMZ 혹은 KML 입니다. 위치 정보를 XML 형식으로 저장만 한 것이 KML 이고, 이를 압축한 것이 KMZ이더군요. 여기서는 압축해제 기능은 없으므로, KML을 중심으로 바라보도록 하겠습니다.

Google Earth를 통해 특정 위치를 저장하게 다음 대략 다음과 같은 Format의 데이터를 볼 수 있습니다.

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
<Document>
    <name>기온 거리 입구.kml</name>
    <Style id="sn_ylw-pushpin12">
        <IconStyle>
            <scale>1.1</scale>
            <Icon>
                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
            </Icon>
            <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
        </IconStyle>
    </Style>
    <StyleMap id="msn_ylw-pushpin0">
        <Pair>
            <key>normal</key>
            <styleUrl>#sn_ylw-pushpin12</styleUrl>
        </Pair>
        <Pair>
            <key>highlight</key>
            <styleUrl>#sh_ylw-pushpin6</styleUrl>
        </Pair>
    </StyleMap>
    <Style id="sh_ylw-pushpin6">
        <IconStyle>
            <scale>1.3</scale>
            <Icon>
                <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href>
            </Icon>
            <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/>
        </IconStyle>
    </Style>
    <Placemark>
        <name>기온 거리 입구</name>
        <LookAt>
            <longitude>135.7768254558997</longitude>
            <latitude>35.00373926533617</latitude>
            <altitude>0</altitude>
            <heading>-0.0001637968873225001</heading>
            <tilt>0</tilt>
            <range>639.2308830322888</range>
            <altitudeMode>relativeToGround</altitudeMode>
            <gx:altitudeMode>relativeToSeaFloor</gx:altitudeMode>
        </LookAt>
        <styleUrl>#msn_ylw-pushpin0</styleUrl>
        <Point>
            <altitudeMode>absolute</altitudeMode>
            <coordinates>135.7771083872684,35.00372287912489,46.1143527964634</coordinates>
        </Point>
    </Placemark>
</Document>
</kml>

이 값을 GPX로 변경해주는 사이트가 있는데, 그 사이트를 통해 변환해 보면, 대략 다음과 같이 표시됩니다.
http://www.gpsvisualizer.com/convert?output

<?xml version="1.0" ?>
- <gpx creator="GPS Visualizer http://www.gpsvisualizer.com/" version="1.0" xmlns="http://www.topografix.com/GPX/1/0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
- <wpt lat="35.003722879" lon="135.777108387">
  <ele>46.1143527964634</ele>
  <name>기온 거리 입구</name>
  <sym>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</sym>
  </wpt>
  </gpx>

상당히 단순해진 모양을 볼 수 있는데, 대략 사용되는 값은 lat, lon, ele 그리고 name과 sym입니다. 굳이 내용을 살펴보면

latitude 라는 값, longitude 라는 값과 함께, element 값으로 구성된 좌표 정보와, 이 좌표에 대한 이름, 그리고 이 위치 값을 표시하기 위한 아이콘 이미지 위치(보통 URL)값으로 변한 것을 볼 수 있습니다.
이 중 latitude, longitude, element 값을 가져 올 때, /Document/Placemark/Point/coordinates 에 담긴
값을 사용하면 됩니다. 그 외에 /Document/Placemark/Point/name 에 있는 값을 name 으로 사용하면 됩니다.
마지막으로 아이콘은 /Document/Style/IconStyle/Icon/href 안의 값을 사용하면 됩니다.

이 작업은 Xml의 XPath를 통해 필요한 데이터를 조회하면 됩니다.
단지 문제는 namespace 부분만 고려해서 구성하면 됩니다.

이 자료의 소스는 여기의 첨부파일로 등록하였습니다. 이 자료는 Visual Studio 2010 으로 되어 있읍니다.
실행하면, 특정 폴더를 선택하면, 그 폴더에 있는 모든 KML 파일들을 읽고 그 안의 이름대로 GPX 파일을 생성하는 것입니다. 자세한 내용은 안의 소스를 참고하시면 됩니다. 또한 이 모든 것은 .NET Framework 2.0 기반으로 구성되어 있어, 큰 문제 없이 실행하실 수 있을 겁니다.

728x90

Google Apps Engine을 보다가, 우연히 Google Apps를 보게 되었습니다. 바로 전 직장이 MS 쪽 계열이 아닌 IBM 쪽이었는데, 협업도구가 생각보다 매력적인 것이 없었습니다. 물론 IBM Notes 란 것이 있지만, 간단히 깔아 단순하게 막 쓸 수 있는 솔루션은 아니었죠. 무언가 전문가의 손이 거쳐 지나가야 물건이 되는 그런 것이었습니다.

그래서 팀 내에서 협업 도구로 쓸 만한 무언가가 필요했고, 마침 이 제품을 보게 되었습니다.
당시에는 유료 버전이 없었는데, 최근 간만에 접속해보니, 유료버전도 생겼더군요.
메일 크기 25G 이상, 막강한 협업 관련 기능이 필요하면, 유료버전을 써도 되지만,
작은 규모의 팀이나, 회사 내에서 별도의 투자 없이 사용할 만한 솔루션인 것 같습니다.
(물론 데이터가 Google Server에 저장되는 게 쪼큼 두렵지만, 보안 비로 회사의 매출 10~20% 소비하는 레벨이 아니라면, 뭐 그냥 써도 무방할 겁니다.

단, 이 작업을 수행하려면, 도메인이 필요합니다.
공인 도메인이 있어야 합니다. 그 이유가 서브 도메인 생성 가능 여부 때문인데, 예를 들면 knoie.net 이라는 도메인이 있으면 mail.knoie.net 같은 서브 도메인을 만들 수 있죠. 그 외에도 메일을 위한 "MX" 레코드 설정도 해야 되는데, 무료 도메인 같은 경우에는 대부분 사용이 불가능합니다.

그러므로 가급적 유료도메인을 확보하세요! ( 싸구려 pe.kr 같은 것도 상관 없습니다. )

단, 실제 사용할 때 도메인을 구매해서 연결을 해도, google에서 정한 google 도메인이 주소 줄에 나옵니다.

뭐 주소줄에 도메인 이름이 어떻게 표시되든 관계 없어야 합니다. 막상 설치하고 난 뒤, URL이 이상 야리꾸리하다는 걸 눈치 챘을 때는 이미 늦은 겁니다. - 도메인을 이미 샀고, 계정은 이미 만들고..

도메인은 준비되었고, 주소창에 URL이 어떻게 표시되어도 상관 없다는게 확실하면,
슬슬 시작을 해보도록 하겠습니다.
여기서는 설명을 편하게 하기 위해 knoie.net 이라는 도메인을 가지고 구축하겠습니다.

 

최초 계정 만들기

지금부터 할 작업은 자신의 도메인을 Google Apps에 등록하고, 관리자 계정을 만드는데 있습니다.
웹의 설명을 조심스럽게 따르기만 하면 어렵지 않게 생성할 수 있습니다.

  1. 제일 먼저 Google Apps 사이트 접속 합니다.
    http://www.google.com/apps/intl/ko/business/index.html
  2. 예전에는 바로 "시작하기" 같은 버튼이 있었는데, 이번에는 그리 쉽게 찾을 수는 없습니다.
    대신 왼편에 위치한 표준형이라는 부분을 클릭하시면 나옵니다.

  3. 다음 페이지로 전환 되면 "시작하기" 버튼이 보입니다. 그 시작하기 버튼을 클릭하세요.

  4. 이제 시작하기 화면에 들어가면 정보를 입력하는 창이 뜹니다.
    먼저 도메인 소유 여부 선택 부분과 도메인 이름을 넣는 부분이 나옵니다.
    도메인 권한 관련 묻는 항목에서는 “관리자: 이 도메인을 소유 또는 관리합니다”를 선택하세요.
    (그래야 나중에 작업하기가 수월합니다. 사실 구매한 도메인이면 당연히 첫 번째를 고르겠죠.)
    그리고 도메인이름에 구입한 도메인이름을 넣어주시기 바랍니다. 서브 도메인(www.knoie.net 같은)으로 넣지 마시고 대표 이름(knoie.net 같은)으로 넣어주시기 바랍니다.
    (이 도메인 이름으로 mail을 구성하게 됩니다. 지금 예제에서는 knoie.net 이니까, 나중에 admin@knoie.net 같은 이메일 계정으로 로그인도 하고, 메일을 사용하게 됩니다.)

  5. 입력 후 "시작" 버튼을 눌렀다면 이제 이 Google Apps 사이트의 기본 정보를 입력하게 됩니다.
    사이트 관리자에 대한 정보를 넣습니다. 그리고 연락을 위한 간단한 연락처 2가지를 입력받죠.
    그리고 지역적 위치 정보도 받게 됩니다. 중간에 체크 박스가 있는데, 일종의 확인을 위한 체크 박스인데,
    이 Google Apps를 사용하기 위해서는 DNS(도메인 서버)의 정보를 일부 변경해야 된다는 것입니다.
    즉 이 정보를 손댈 수 없다면 이 Google Apps 사이트를 만들 수 없다는 의미입니다. ( 이 부분은 앞 부분에서 언급 드렸죠?)
    그 외에 회사(혹은 팀) 이름 및 규모를 묻습니다. 그 외에 이 Google Apps를 사용하게 된 출발점에 대한 영업 정보를 넣게 되어 있는데, 대충 넣으시면 됩니다.
    다 입력 하셨으면 "계속"을 클릭하세요.

  6. 이제 이 Google Apps 사이트의 관리자이자 최초 계정을 생성을 합니다.
    일반적인 계정 생성 폼과 유사합니다. 자질구레한 부분은 없고, 단지 생성할 아이디와 암호 정도를 넣습니다.
    또, 외부 봇을 이용한 멋대로의 생성을 막기 위한 부분을 통과하시구요.(개인적으로는 이게 제일 힘들더군요 -_-;;;;) 다 입력하신 뒤, "동의 합니다. 설정 계속하기 >>" 버튼을 클릭하세요.

  7. 이제 화면에는 관리도구가 뜹니다. 이러면 최소한 여러분의 도메인으로 Google Apps내 사이트 구축이 완료된 것입니다. 아직은 동작하지는 않지만, 최소한 입력한 도메인에 대한 독립적인 공간이 구성된 것이죠!
    갈 길은 더 있지만, 어찌되었던 축하합니다!

 

도메인 연결하기.

지금까지의 작업은 사이트를 Google Apps 내에 생성하는 일이였다면, 지금 부터 할 작업은 진짜 여러분의 도메인이 실제로 권한이 있는지 없는지를 체크하는 것입니다. 체크 후에 진짜로 Google Apps와 연결하는 것이죠.
여기서는 설정 부분을 전반적으로 다룹니다.
하지만, 도메인 내 정보를 Google Apps를 바라보게 설정을 해도, 미국 내 에있는(정말 있는지는 모르겠습니다. -_-;; ) Google Apps 서버에서 변경된 정보를 수신 하는데 걸리는 시간이 좀 많이 걸립니다. 이 작업의 완료는 설정 후 빠르면 거의 1~2분 내로 적용 되지만, 늦으면 2~3일 정도 걸립니다. 이건 전 세계로 뻗어 연결된 DNS 서버간의 설정 때문이기 때문에, 설정 후 왜 바로 적용이 안되냐고 반문은 자제해주시고 그냥 될 때까지 기다려 주세요.

일단 제일 먼저 해야 하는 것은 Google Apps에게 현재 설정한 도메인이 진짜 자신의 것임을 증명하는 일을 해야 합니다. 있지도 않은 도메인으로 멋대로 Google Apps를 만들어 연결하는 짓을 막기 위한 일종의 장치입니다. Google Apps가 자신의 도메인을 도메인으로 인정할 수 있도록 하는 것입니다.
이제 도메인 연결 관련된 전반적인 작업을 시작하겠습니다.

  1. 맨 처음 관리자 창이 뜬 상태 위 쪽에 보면 "도메인 소유권을 확인하십시오" 라는 링크를 볼 수 있습니다. 이 링크에 먼저 들어가시기 바랍니다. ( 이 링크와 설명 부분은 인증을 정상적으로 받으면 사라집니다.)

  2. "도메인 소유권을 확인하십시오"의 링크로 들어가면 아래와 같은 그림같은 페이지가 뜹니다. 여기서 도메인 소유권을 확인 방법을 고릅니다.

    여기서 도메인 소유권 확인 방법이 두 가지 가 있습니다. 하나는 그 도메인을 위한 웹 서버가 이미 있고 구입한 도메인이 연결되어 있는 경우입니다. (즉 이미 홈페이지를 확보하고 계신 경우 ). 다른 하나는 완전히 도메인만 있고, 그 안의 설정만 할 수 있는 경우 입니다.
    전자의 경우에는 "HTML 파일 업로드" 라는 방법을 사용하시면 되고, 후자의 경우라면 "CNAME 레코드 변경" 이라는 방법을 사용하시면 됩니다. 각 방법 별로 나누어 설명을 드리겠습니다.
    해당 방법을 선택하는 화면은 아래와 같습니다.
    1. HTML 파일 업로드 방법
      1. 먼저 자신의 도메인으로 웹 서버가 정상적으로 연결되어 있는지 확인합니다.
        구입한 도메인에 www 나 w3 나 이런 앞부분의 서브도메인을 없애고, 그냥 도메인이름으로만
        웹 페이지에 접근이 가능한지 보세요( 여기 예제가 knoie.net 인데, http://www.knoie.net 같은 게 아니라, http://knoie.net  으로 접근이 되어야 합니다. )
      2. 확인이 되었으면 "귀하의 도메인 소유권을 확인하십시오" 라는 항목 에 있는 선택 상자에서 "HTML 파일 업로드"를 선택하세요.
      3. 선택하면 아래 그림처럼 적용하는 방법이 나옵니다. 일단 googlehostedservice.html 이라는 파일을 만들고 그 안에 문자열을 복사해주세요. googleXXXXXXXXXXXX 형태의 문자인데, 자신의 도메인 인증 번호에 따라 나오는 값입니다.
      4. 그리고 난뒤에 만들어진 html 파일을 해당 웹 서버의 Root 폴더에 업로드 해주세요.
        (업로드는 각 웹 호스팅 혹은 웹 서버 설정에 따라 맞게 하시면 됩니다.)
      5. 2번 항목에 있는 url 처럼 http://knoie.net/googlehostedservice.html 해서 브라우저 상에 자신이 입력한 문자열이 정상적으로 나오면 확인 버튼을 클릭하세요.

    2. CNAME 레코드 변경.
      1. 이 방법은 위의 웹 서버 방식이 불가능한 경우 사용합니다. 대표적으로 웹 호스팅 같은 서비스가 없고 도메인만 있는 경우입니다. 이 때, 반드시 해당 도메인의 DNS 설정을 할 수 있어야 합니다. 대개 도메인 구입한 곳에서 무료로 DNS 서비스를 합니다. 여기서는 제 도메인인 knoie.net로 전체적인 소개를 하며, 그 도메인을 구입할 때 이용한 whois.co.kr 을 통해 설정하는 방법까지 제시하겠습니다.
      2. 먼저 옵션 창에서 "CNAME 레코드 변경을 선택하면 아래의 그림과 같이 표시 됩니다.
        항목 중 2번 항목에 있는 고유의 문자열을 적당한 위치에 복사해주세요.
        googleXXXXXXXXXX 형식의 이름입니다.
      3. DNS 서비스를 변경할 차례입니다. DNS 설정 부분은 각 DNS 서비스 마다 다릅니다. 자체적으로 DNS를 구축하여 하시고 있다면 CNAME 레코드를 위의 이름으로 만들면 됩니다.
        만일 저처럼 별도 DNS 서비스를 구축한게 아니라면, 자신의 도메인을 구입한 곳에서 제공하는 DNS 서비스를 이용하여 변경하면 됩니다. 앞서 설명 드렸듯이 여기서는 제가 이용하는 whois.co.kr 이라는 곳을 기준으로 설명 드립니다.
      4. 먼저 whois.co.kr 에 접속한 뒤, 로그인을 합니다. 그리고 도메인 관리에 들어가도록 합니다.
      5. 도메인 관리 화면에서 이번엔 메뉴 중에 "도메인 활용 / 부가서비스" 안에 있는 "네임서버 고급설정"에 들어갑니다.
      6. 그러면 도메인 이름을 입력하는 창이 있는데, 자신의 도메인 이름을 넣으시면 됩니다.(선택상자가 아니고 직접 입력합니다.) 여기서는 knoie.net 을 사용하니까, knoie.net을 넣습니다. 그리고 그 옆에 있는 선택 상자 중 "#CNAME 레코드 관리"를 선택합니다. 선택을 했으면 "확인 >" 버튼을 클릭합니다.
      7. 이제 앞서 메모했던 CNAME 이름을 호스트 이름에 설정하고, 그에 연결되는 값을 "google.com" 이라고 넣습니다. 완료 되었으면 다음 단계로 넘어갑니다.
      8. 그러면 최종적으로 그 추가/변경된 정보들이 요약되서 나오고 확인 후 신청하기 버튼을 클릭합니다.
      9. 완료되었으면  앞서 열었던 도메인 확인 페이지에 다시 들어가서 "확인" 버튼을 클릭하세요.

    3. 웹 방법이든, CNAME 방법이든, googleapps를 관리하는 서버에서 해당 도메인에 정상적으로 접근하는 순간 각 방법대로 체크를 하게 됩니다.
    4. 첫 화면으로 돌아가면 아래의 그림과 같은 표시를 보실 수 있습니다.

메일 서비스 연결하기.

위 단계 까지 왔다면 중요한 설정은 다 끝난 것입니다. 도메인 소유권 확인까지 끝나면 사실상 중요한 설정 대부분은 끝난 것입니다. 이제, 이 Google Apps 의 핵심 서비스인 메일 서비스가 남았습니다.
여기서는 메일을 위한 MX ( Mail Exchange ) 설정과 메일 서버와의 연결 작업만 수행하면 됩니다.
단 이 작업은 도메인 소유권 확인이 정상적으로 완료되시면 수행하시기 바랍니다.

  1. 기본적으로는 메일 서비스를 사용하기로 되어 있지만, 만일 되어 있지 않다면 서비스를 활성화 시킵니다.
    활성화 하는 방법은 Google Apps 도메인 관리에 있는 대쉬보드에 들어가시면 중앙 정도에 "서비스 추가하기" 링크가 있습니다. 그것을 클릭하시기 바랍니다.
  2. 현재 비활성화 된 서비스들이 나열되어 있는데 그 중, 이메일에 위치한 "바로 추가" 버튼을 클릭하시기 바랍니다. 그러면 자동적으로 닫히면서 도메인 관리도구로 이동하게 됩니다.
  3. 다음은 메일을 활성화 하는 작업을 해야 합니다. 이 때 메일을 접근하기 위한 도메인 이름을 만듭니다.
    즉 메일 서버에 접근하기 위한 전체 도메인 이름을 의미합니다.
    여기서는 mail.knoie.net 이라는 이름으로 만들도록 하겠습니다.
  4. 다시 도메인 관리도구의 대시보드에 갑니다. 그리고 이메일 항목으로 이동하여 링크를 클릭합니다.
  5. 이메일 설정 화면으로 이동되면, 웹 주소라는 항목을 보실 수 있습니다.
    그 곳에서 URL 변경을 클릭합니다.
  6. 그러면 이 메일 서비스에 바로 접속할 때 사용될 URL을 구성할 수 있습니다.
    기본적으로는 http://mail.google.com/a/도메인이름 으로 접근이 되지만, 그래도 자신의 도메인으로 알기 쉽게 만드는게 좋습니다. webmail 이나, mail, mailsvr 등등 쉽게 알 수 있는 이름으로 정해주시면 됩니다.
    여기서는 mail.knoie.net으로 설정하도록 하겠습니다. - 아래 항목을 선택 후 mail 이라는 이름을 넣습니다.
    구성이 되었으면 계속>> 버튼을 클릭합니다.
  7. 메일 접속을 위한 CNAME 설정 방법을 설명하는 화면이 나옵니다.
    앞서 도메인 확인을 위해 CNAME을 설정했는데, 마찬가지로 자신이 결정한 이름에 대한 CNAME으로 ghs.google.com을 설정합니다. CNAME의 설정을 위한 네임서버 설정은 각기 자신의 네임서버 설정에 따라 진행하시면 됩니다. 네임 서버 상의 설정도 끝났으면 다음 단계를 완료했습니다.를 클릭하시기 바랍니다.
    ( whois.co.kr 인 경우, 앞서 도메인 확인을 위하여 CNAME 설정한 부분을 확인하시기 바랍니다. )

  8. 이제 남은 것은 MX(Mail Exchanger) 설정이 있습니다. 이 작업은 네임 서버의 설정 작업입니다.
    앞서 네임 설정을 했던 것 처럼 네임 서버의 서비스를 접근해야 합니다. 마찬가지로 여기서는 knoie.net에 대한 도메인 서비스를 수행하는 whois.co.kr을 가지고 작업을 하도록 하겠습니다.
    기본적인 로그인 및 서비스 접근 부분은 건너 뛰도록 하겠습니다.
  9. 네임 서버 고급 설정에 들어가, 자신의 도메인 이름을 넣고, "#MX 레코드 관리"를 선택합니다. 그리고 확인 버튼을 클릭합니다.
  10. MX 레코드 값을 입력하는 창을 5개 정도 만듦니다. 그리고 각 MX 값을 아래에 제공하는 표 내용대로 채워주시기 바랍니다. MX 값은 한 개만 있어도 되지만, 원할한 메일 송수인을 위해 gmail에서 제공하는 모든 MX를 설정하는 것이 좋습니다. 이 MX 정보는 http://www.google.com/support/a/bin/answer.py?answer=48242 에 기록되어 있습니다.
    우선순위 메일 서버
    1 ASPMX.L.GOOGLE.COM.
    5 ALT1.ASPMX.L.GOOGLE.COM.
    5 ALT2.ASPMX.L.GOOGLE.COM.
    10 ASPMX2.GOOGLEMAIL.COM.
    10 ASPMX3.GOOGLEMAIL.COM.
    채우면 아래의 그림처럼 나열될 것입니다.
  11. 설정이 완료된 뒤, Outlook 이나, Apple mail 이나, 기타 메일 클라이언트 연결은 Gmail 연결방법과 동일합니다. pop.gmail.com 으로 POP3로 연결할 수 있으며, smtp.gmail.com 으로 메일을 발송할 수 있습니다. 이 설정들은 gmail의 도움말을 참고하시기 바랍니다.
    http://www.google.com/support/a/bin/topic.py?hl=kr&topic=9202


총 3단계를 걸쳐 Google Apps에 대한 구성방법을 소개해 드렸습니다.
실제로 기존에 Google에서 Google 계정만 등록하면 사용할 수 있는 각종 도구들을 한데로 묶어 제공합니다. 기존에 Google에서 제공하는 서비스를 사용한 경험이 있다면 큰 문제없이 활용하실 수 있습니다.
단지, 자신의 도메인을 연결할 수 있다는 점 때문에, 이렇게 긴 글을 쓴 것이구요.

조직 내에서 보다 본격적인 활용을 하신다면 유료로 도전해보는 것도 나쁘지는 않습니다. 메일 저장 사이즈나, 기타 추가적인 기능들을 확장하실 수 있으니까요. 하지만, 무료 버전으로 제공하는 표준형도 상당히 괜찮은 솔루션입니다. 현재 제가 다니는 회사도 이 Google Apps에 연결해서 사용하며, 몇몇 부족한 부분만을 제외하면 만족스럽게 사용하고 있습니다. 모바일로도 지원되기 때문에, 의외의 사용성이 증대되었다고나 할까요?

독자적인 도메인을 갖고 있는 작은 규모의 회사 혹은 팀이 있다면 이런 Google Apps의 활용이 어떨까 조심스럽게 짐작해 봅니다.

728x90

정확히는 버튼이 사라지는 문제는 아니고, 단지, Focus가 된 부분만 버튼이 보이는 문제를 의미한다.

VGridControl 에 ButtonEdit를 가져다 붙인 것인데, 이상하게 Focus 가 된 줄만 버튼이 보이고, 나머지는 보이지 않는다. 다른 줄에 Focus를 보내면 그제서야 나온다는…

이 속성 값이 어디서 설정하는 것인지 한 참을 찾다가, DevExpress의 Support 페이지에서 찾았다.
(http://www.devexpress.com/Support/Center/p/Q96026.aspx)
Foucs가 안가더라도 모두 보이게하는 방법을 찾고 있었다.

간단했다. Grid 개체에 ShowButtonMode 라는 Property에 ShowAlways로 설정하면 되었다.
코드로 표기하면 아래와 같다.

gridCtrl.ShowButtonMode = DevExpress.XtraVerticalGrid.ShowButtonModeEnum.ShowAlways;

그러면 원하는 형태인 모든 Row에 해당 컨트롤들이 보인다.

728x90

Visual Studio를 써서 팀 작업을 할 때, TFS(Team Foundation Server)를 활용할 때가 있는데, 단순한 소스 버전관리를 벗어나서 실제 각 작업에 대한  계획이나, 한 내용들을 기입할 수 있다.

Agile 기반으로 프로젝트를 만들었다면 Bug, Issue, Task, Test Case, User Story 등 원한 형태로 생성이 가능하다.
지금 현재는 Task들을 정리해서 기록하여 정리하고 있다.
그런데, 2010 부터는(정확히는 2008 부터 되는 것 같으나, 2008은 사용해본 기억이 없음) 이 Task들을 계층적으로 적용할 수 있다고 한다. 그래서 마치 MS Project 에서 Task 밑에 Task 개념으로 표시하는 방법으로 구성할 수 있다.

몇가지 삽질을 하고 난 뒤, 그 표현 방법을 소개하려고 한다.

1. Task 생성.

Task 생성은 간단하다. 일단 Team Explorer를 띄우고 Work Items 위에서 메뉴를 띄워 New Task를 선택한다.

간단하게 만들도록 한다. 최소한 제목만 제대로 넣어도 된다.
그리고 Assigned To: 에서 자신의 이름을 꼭 넣도록 하자. 그래야 자신의 내용을 쉽게 찾아 볼 수 있다.
그리고 Save Work Item을 꼭 눌러서 내용을 저장해서 서버에 올리도록 한다.
 

2. 하위 Task 생성.

다시 Team Explorer 에서 Work Items –> Team Queries 안에서 My Tasks를 클릭해서 열도록 한다.
그러면 앞서 넣은 Task를 볼 수 있는데, 그 Task 에서 오른 쪽 클릭을 눌러 “New Linked Work Item”을 눌러
상위 혹은 하위 작업을 추가한다.

그러면 Link Type 선택과 기본적으로 필요한 이름과 설명 정도를 넣는 창이 나온다.

여기서 Link가 되는 형태(Link Type)에는 여러가지 종류가 있다.

  • Child : 앞서 선택한 작업을 Parent로 두는 하위 작업을 만들 때 사용한다.
  • Parent : 앞서 선택한 작업을 Child로 포함하는 상위 작업을 만들 때 사용한다.
  • Predecessor : 앞서 선택한 작업을 하기 위해 먼저 처리할 작업을 만들 때 사용한다.
  • Relate : 앞서 선택한 작업과 일부분 혹은 전부가 연관되는 형태의 작업을 만들 때 사용한다.(수평적 연결)
  • Shared Step : 앞서 선택한 작업을 수행하기 위한 공통적인 작업을 만들 때 사용한다.
  • Successor : ??
  • Test Case : 앞서 선택한 작업에 대한 테스트 작업을 만들 때 사용한다.
  • Tested By : ??
  • Tests

그런데,실제로 단순하게 계층형 작업 구성을 할 때는 Child와 Parent 만 사용할 것이다.
(프로젝트의 진행상 Task가 복잡하게 나열되면 거의 대부분의 유형의 Link들을 사용할 것 같다.)

일단, Child 든 Parent 든, Task를 만들도록 한다.

만든 뒤, 아랫쪽 정보들이 나온 탭 중에 All Link를 누르면 현재 설정한 대로 Link가 걸렸는지 체크가 가능하다.
(상위 작업의 Child로 만들었으므로, 상위 작업이 Parent로 표시)

확인이 되었으면 Save를 꼭해서 서버에 저장하도록 한다.

3. Query View를 바꾸기.

자, 그런데, Parent 관계를 세우기는 했는데, My Tasks를 열어 보면 가관이다.
아무리 링크를 걸고 넣어도 나오는것 쭉 나열형 뿐!

이를 계층형으로 표시하는 것을 바꿔야 한다.
바꾸려면, 보기를 위한 Query를 수정한다.
수정하려는 Query 항목에서 메뉴를 띄운 뒤, Edit Query를 한다.
여기서는 어차피 My Tasks만 보니까, 당연히 My Tasks에서 Edit Query를 해본다.

다른 부분은 손대지 말고, Type of Query 부분에서 Tree of Work Items를 선택한다.

어떻게 나오는지 체크해보려면 아래 쪽에 있는 Task들에서 Refresh를 해서 보도록 한다. 그러면 최소한 어떠한 형태로 나오는지 미리 보여준다.

이제 테스트 까지 완료되었으면 Save Query 버튼을 눌러 꼭 저장하고 닫도록 한다.

그러면 다음 부터는 계층형으로 Task를 볼 수 있다.

 

4. 기존 Task들을 계층화 시키기.

위의 방법은 새로운 Task를 추가할 때 이야기라면, 이번에는 기존에 만들어진 Task들의 관계를 맺을 때다.

만일 기존에 “예전작업”이라는 Task가 있었는데, 이 작업을 상위 작업 아래에 넣는 방법을 예제로써 언급할 것이다.

먼저 예전 작업이든, 상위 작업이든, 연결의 중심이 될 항목에서 메뉴를 띄워 “ Link to An Existing Item…”을 선택한다.

그러면 이 기준 작업(여기서 선택한것은 예전 작업)을 기준으로 어떻게 누구를 붙일 것인지를 입력할 수 있는 창이 뜬다.

이 예전 작업이 상위 작업아래로 들어갈 테니, Parent로 고치고…

Work item IDs 에서 Browse 버튼을 클릭해서 기존 Item을 찾는다.

연결된 Item이 위치한 Project를 선택하고(특별한 경우가 아니면 그대로 둔다.) Saved query 중에서 원하는 아이템이 보이는 Query를 선택한다.
그리고 하위에 Find 버튼을 눌러서 아이템을 나열시켜 원하는 아이템을 선택한다.
( 느낌표 표시가 난 Task는 자기 자신으로 선택하지 말자! )

OK를 누르면 항목이 자동으로 채워진다. 그림으로 확인해보고, 이상 있으면 수정하고, 없으면 OK를 클릭한다.

그럼 위의 내용대로 해당 Task의 수정화면이 뜨는데, 내용을 적당히 수정하고, 상단의 Save Results을 클릭한다.

728x90

NTFS로 포멧된 폴더에 다양한 사용 권한을 걸어 사용하다가,
운영체제를 자주 변경하는 경우, 데이터용으로 사용한 파티션의 파일들이
알 수 없는 권한이 걸려 Access Denine이 걸리는 경우가 많다.

보통 C:\는 운영체제용으로 사용하고, D:\를 데이터로 하는데, C:\ 야 설치 중에 Format을 하니, 큰 문제가 없지만, 백업 처럼 사용하는 D:\ 드라이브에서는 어떻게 될지 모른다. 특히 공유 폴더들을 설정하거나, 개인용 폴더 설정등을 하다가 보면, 자신도 모르게 파일 권한이 변경이 되어 있고,
나중에 운영체제를 바꿔서 해당 폴더를 접근하려다 보면, 접근 불가에 빠진다.
그렇다고 속성을 열어서 이렇게 저렇게 수정해봐도 도저히 불가능한 경우에도 빠지게 된다.

이 경우 보안 속성을 어떻게든 초기화 해야 하는데, 이 경우에 처리하는 방법이다.

1. 시작 –> cmd를 검색 –> cmd를 관리자 권한으로 실행한다.

2. 권한을 바꾸려는 폴더 이름이 D:\Works 면 다음과 같이 입력한다.

icacls D:\Works /T /Q /C /RESET

만일 드라이브 전체라면, 해당 드라이브로 옮겨가서 D:\Works 대신 * 라고 넣는다.

icacls * /T /Q /C /RESET

3. 기다린다.

 

파일이 많으면 생각보다 긴 시간이 소요된다.
이렇게 바꾸면 최소한 기존에 설정된 각종 보안 설정 값들이 초기화 되서, 접근 되지 않는 경우가 많이 없어진다.

728x90

이 모든 자료는 apple.com과 AppsNext.com에 그 권한이 있습니다.

(한글) 앱스토어 리뷰가이드 라인

제공: iPhone 개발의 모든 것- AppsNext.com   

우리는 당신이 iOS를 위한 어플리케이션을 개발하려고 하는 것을 매우 기쁘게 생각합니다. iOS 앱 개발은 직업적, 금전적으로 수많은 개발자들에게 도움을 주고 있는 작업이며, 우리는 당신이 이 성공적인 개발자들의 대열에 합류하길 기원합니다. 우리가 앱스토어 리뷰 가이드라인을 작성한 것은 이번이 처음입니다. 우리는 이 리뷰가 당신이 앱을 개발하는데 발생할 수 있는 문제에 대해 명확한 지침을 제공해줄 수 있을거라고 기대하며, 그로 인해 앱 승인 절차를 빠르게 할 수 있을거라고 생각합니다.

우리는 앱을 책이나 노래 따위의 우리가 취급하지 않는 것들과는 다르게 보고 있습니다. 만약 당신이 종교를 비판하고 싶다면 책을 쓰십시오. 만약 당신이 섹스에 대해 묘사하고 싶다면 책을 쓰거나 노래를 만들거나, 혹은 의학적 서류를 만드십시오. 구분하기 다소 복잡할 수 있습니다만, 우리는 그런 류의 컨텐츠들을 앱스토어에 등록하지 못하도록 결정하였습니다. 하기의 지침들을 인지하는 것이 당신들의 앱 개발에 도움이 될 것입니다.
많은 아이들이 앱들을 다운받고 있으며, 부모들이 별도로 아이들을 위한 컨트롤 장치를 세팅하지 않는 한 아이들의 앱 다운로드를 제어할 수 있는 방법은 없습니다. (많은 부모들이 보통 그 장치를 세팅하지 않습니다.) 우리가 아이들에게 나쁜 영향을 주지 않도록 항상 주의하고 있음을 주지하십시오.
앱스토어에는 250,000개가 넘는 앱들이 있습니다. 더 이상의 의미없는 앱들은 필요없습니다. 당신이 만든 앱이 실용적 으로 쓸모있거나 혹은 지속적인 즐거움을 제공할 수 없다면 우리는 그 앱을 승인하지 않을 수 있습니다.
만약 당신이 만든 앱이 고작 며칠 사이에 조잡하게 만들어졌다고 보이거나, 당신의 친구들에게 보여주기 위해 연습용 으로 만든 앱을 스토어에 올릴 경우 해당 앱들은 승인 받지 못할 것입니다. 많은 전문 앱 개발자들은 자신들의 양질의 개발물이 아마추어들이 유희로 만든 것들과 같이 앱스토어에 전시되는 것을 원하지 않습니다.
우리가 판단하기에 선을 넘었다고 보이는 컨텐츠나 행동을 다룬 앱은 승인을 거부당할 수 있습니다. 당신이 그 기준이 무엇이냐고 묻는다면, “보면 알것입니다.” 라고 대답하겠습니다. 우리는 당신들 역시 그 기준을 충분히 인식할 수 있을 거라고 생각합니다.
만약 당신의 앱이 승인을 거부당했을 경우, 당신은 우리가 제공하는 Review Board를 통해서 이를 어필할 수 있습니다. 당신이 이런 프로세스를 따르지 않고 언론사에 우리를 비난한다고해서 그 문제를 해결하지는 못할 것입니다.
이 가이드라인은 지속적으로 업데이트될 수 있습니다. 만약 새로이 개발된 앱이 새로운 문제점을 야기할 경우 우리는 새 룰을 언제든 추가할 수 있습니다.어쩌면 당신이 만든 앱이 그것을 불러올지도 모릅니다.

마지막으로, 우리는 당신이 개발하는 앱을 매우 좋아하며 당신이 하는 일들에 존경심을 가지고 있습니다. 우리는 앱 개발에 있어서 당신의 능력을 최대한 발휘할 수 있는 최고의 플랫폼을 구축할 수 있도록 노력하고 있습니다. 어쩌면 당신이 보기에 우리의 통제가 지나치다고 생각할지도 모르지만, 만약 그렇다면 그건 우리가 고객의 입장에서 생각하고 그들이 우리의 제품을 통해 양질의 경험을 할 수 있도록 신경쓰기 때문 일 겁니다. 그런 생각은 당신들 대부분도 아마 마찬가지일겁니다.

목차

1. 약관
2. 기능성
3. 메타데이터, 등급, 순위
4. 지역
5. 알림서비스 (푸쉬 노티피케이션)
6. 게임센터
7. 전자광고
8. 상표, 상품외장
9. 미디어 컨텐츠
10. 유저 인터페이스
11. 구입, 통화
12. 긁어오기, 종합
13. 기기에 손상
14. 개인적인 공격
15. 폭력성
16. 거부감을 주는 컨텐츠
17. 사생활
18. 포르노그래피
19. 종교, 문화, 인종
20. 컨테스트, 경품, 복권, 추첨
21. 자선, 기부
22. 법적 요구사항

1. 약관

1.1     앱스토어의 어플리케이션을 개발하는 개발자로서 당신은 Program License Agreement (PLA), Human Interface Guidelines (HIG), 그 외에 다른 애플과 맺은 라이센스 혹은 계약들에 종속된다. 하기의 룰과 예시는 당신이 만드는  앱이 승인을 받는데 도움을 주기 위한 것이지 다른 협의문을 수정하거나 그에 종속된 조항을 무효화하기 위함이 아니다.

2. 기능성

2.1     (시스템을) 고장내는 앱은 승인하지 않는다.
2.2     버그가 발견되는 앱은 승인하지 않는다.
2.3     개발자가 명시한대로 작동하지 않는 앱은 승인하지 않는다.
2.4     문서 상의 설명과는 일치하지 않는 숨겨진 요소 혹은 불법적 요소를 포함한 앱은 승인하지 않는다.
2.5     공개되지 않은 API(어플리케이션 프로그래밍 인터페이스)를 사용한 앱은 승인하지 않는다.
2.6     할당된 공간 외의 곳에서 데이터를 읽거나 쓰는 앱은 승인하지 않는다.
2.7     어떤 방식이나 형태로든 코드를 다운받는 앱은 승인하지 않는다.
2.8     다른 실행 가능한 코드를 인스톨 혹은 실행시키는 앱은 승인하지 않는다.
2.9     “베타”, “데모”, “체험판” 혹은 “테스트” 버전인 앱들은 승인하지 않는다.
2.10   아이폰 앱은 별도의 조정없이 아이패드에서도 사용할 수 있어야한다. 해상도는 아이폰과 동일, 아이폰3GS의 2배 이다.
2.11   앱스토어에 이미 있는, 그중에서도 특히 유사한 종류 여럿이 존재하는 앱을 복제한 앱은 승인하지 않는다.
2.12   실용적으로 유용하지 않거나 지속적인 오락적 가치를 제공하지 못하는 앱은 승인하지 않는다.
2.13   마케팅이나 광고가 주목적으로 제작된 앱은 승인하지 않는다.
2.14   명확하게 명시되지 않은 속임 혹은 가짜 기능을 제공하기 위해 만들어진 앱은 승인하지 않는다.
2.15   20메가가 넘는 크기의 앱은 무선 네트워크를 통해서 다운로드할 수 없다. (앱스토어에서 자동적으로 이를 방지함)
2.16   멀티태스킹 앱은 백그라운드 서비스를 그것들의 기본적인 목적에 맞게 사용해야한다.
          (예: 인터넷전화, 오디오 플레이백, 지역, 과제수행, 지역 공지 등)
2.17   웹브라우징하는 앱은 IOS WebKit framework와 WebKit Javascript를 반드시 사용해야한다.
2.18   알코올 혹은 법적으로 금지된 물질의 과도한 소비를 조장하거나, 미성년자의 음주 및 흡연을 조장하는 앱은 승인 하지 않는다.
2.19   잘못된 진단결과 혹은 기타 부정확한 기기 정보를 제공하는 앱은 승인하지 않는다.
2.20   앱스토어에 유사한 앱의 여러가지 버전을 올려서 “스팸질”을 하는 개발자는 iOS 개발자 프로그램에서 퇴출한다.

3. 메타데이터 (이름, 설명, 등급, 순위 등)

3.1     다른 모바일 플랫폼의 이름을 명시한 메타데이터를 포함한 앱은 승인하지 않는다.
3.2     플레이스홀더 텍스트를 포함한 앱은 승인하지 않는다.
3.3     앱 설명에서 앱 컨텐츠, 기능과 상관없는 기술을 한 앱은 승인하지 않는다.
3.4     아이튠스 커넥트 상에 표시되는 앱의 이름과 기기 상에 표시되는 앱의 이름은 서로 비슷해야한다.
          이는 혼란을 피하기 위한 목적이다.
3.5     앱의 큰 아이콘과 작은 아이콘은 혼란을 피하기 위해 서로 비슷해야한다.
3.6     4세 이상 등급을 지키지 않은 앱 아이콘과 스크린샷을 포함한 앱은 승인하지 않는다.
3.7     앱 컨텐츠에 맞지 않는 카테고리, 장르를 표기한 앱은 승인하지 않는다.
3.8     개발자는 자신의 앱에 적합한 등급을 매길 책임이 있다. 부적합한 등급은 애플이 수정할 수 있다.
3.9     개발자는 자신의 앱에 적합한 키워드를 부여할 책임이 있다. 부적합한 키워드는 애플이 수정하거나 삭제할 수
          있다.
3.10   거짓 리뷰, 돈을 주고 작성한 리뷰, 혹은 기타 부적합한 방법으로 유저 리뷰 혹은 앱스토어 상의 차트 순위를 조작 하거나 부풀리려는 시도를 한 개발자는 iOS 개발자 프로그램에서 퇴출한다.

4. 지역

4.1     지역 데이터를 수집, 전송, 혹은 사용하기 전에 해당사항에 관해 사용자의 합의를 공지하지 않거나 득하지 않은 앱은 승인하지 않는다.
4.2     지역 데이터에 근거한 API를 통해 자동차, 비행기 혹은 기타 기기들의 자동, 자주적인 조작을 하고자 하는 앱은 승인하지 않는다.
4.3     지역 데이터에 근거한 API를 통해 발송, 차량관리, 혹은 긴급 서비스를 하고자 하는 앱은 승인하지 않는다.

5. 알림서비스 (푸쉬 노티피케이션)

5.1     APN(애플 푸쉬 노티피케이션) API를 사용하지 않은 알림서비스를 제공하는 앱은 승인하지 않는다.
5.2     애플로부터 푸쉬 어플리케이션 ID를 득하지 않고 APN 서비스를 사용하는 앱은 승인하지 않는다.
5.3     사용자 합의를 먼저 득하지 않고 알림서비스를 보내는 앱은 승인하지 않는다.
5.4     알림서비스를 통해 민감한 개인정보, 혹은 비밀정보를 보내는 앱은 승인하지 않는다.
5.5     알림서비스를 통해 원하지 않는 메시지를 전하거나, 피싱 혹은 스팸의 목적으로 만들어진 앱은 승인하지 않는다.
5.6     앱의 알림서비스를 이용하여 광고, 프로모션, 혹은 어떠한 직접적 마케팅도 해서는 안된다.
5.7     앱의 알림서비스 사용료를 사용자들로 하여금 부담하게 해서는 안된다.
5.8     알림서비스를 통해 네트워크 용량 혹은 APN 서비스의 대역폭을 과도하게 사용하거나 기기에 지나친 부담을 주는 앱은 승인하지 않는다.
5.9     바이러스, 파일, 컴퓨터 코드, 혹은 APN 서비스의 정상적인 기동을 방해하거나 손상을 끼치는 프로그램을 전송하는 앱은 승인하지 않는다.

6. 게임센터

6.1     플레이어 ID를 최종사용자 혹은 제3자에게 보여주는 앱은 승인하지 않는다.
6.2     어떠한 목적으로든 플레이어 ID를 사용하는 앱은 승인하지 않는다. 단, 그것이 게임센터 약관에 근거하였을 경우는 논외로 한다.
6.3     룩업, 트레이스, 릴레이트, 어소시에이트, 마인, 하베스트 등을 역추적하여 플레이어 ID, 가명 혹은 기타 게임센터를 통해 얻을 수 있는 정보를 이용하고자 하는 개발자는 iOS 개발자 프로그램에서 퇴출한다.
6.4     순위권 점수 따위의 게임센터 정보는 게임센터의 승인을 받은 앱에서만 사용할 수 있다.
6.5     게임센터 서비스를 통해 원하지 않는 메시지를 전하거나, 피싱 혹은 스팸의 목적으로 만들어진 앱은 승인하지
          않는다.
6.6     게임센터 서비스를 통해 네트워크 용량 혹은 APN 서비스의 대역폭을 과도하게 사용하는 앱은 승인하지 않는다.
6.7     바이러스, 파일, 컴퓨터 코드, 혹은 게임센터 서비스의 정상적인 기동을 방해하거나 손상을 끼치는 프로그램을
          전송하는 앱은 승인하지 않는다.

7. 전자광고

7.1     인위적으로 광고의 시청수나 조회수를 올리고자 하는 앱은 승인하지 않는다.
7.2     아무 내용이 없는 전자광고 배너를 달고 있는 앱은 승인하지 않는다.
7.3     광고를 보여주는 것이 주목적인 앱은 승인하지 않는다.

8. 상표, 상품외장

8.1     개발자들은 애플 상표 및 저작권 사용에 관한 가이드라인과 애플 상표 리스트에 명시된 모든 약관에 근거하여 앱을 제작해야 한다.
8.2     애플이 앱의 소스나 공급자라고 주장하거나 애플이 앱의 품질이나 기능을 보증한다는 내용을 주장 혹은 암시하는 앱은 승인하지 않는다.
8.3     애플 제품이나 광고 주제와 혼동할 수 있을 정도로 유사한 앱은 승인하지 않는다.
8.4     앱 이름 상에 애플 제품 이름의 철자를 잘못 적었을 경우 (예, GPS for Iphone, iTuz) 해당 앱은 승인하지 않는다.
8.5     법적으로 보장되는 제3자의 권리(상표, 저작권, 기업비밀, 기타 등록된 컨텐츠)를 사용할 경우 요청 시 서류화된 사용권을 제출해야한다.
8.6     오리지널 컨텐츠의 기능에 변화가 없고 해당 브랜드에 관해 모든 것을 명확히 확인할 수 있다는 전제 하에서 구글 맵스 API를 통해 습득한 구글 맵스 및 구글 어스 이미지는 어플리케이션 내에서 사용할 수 있다.

9. 미디어 컨텐츠

9.1     음악 라이브러리에 접속 시 MediaPlayer framework를 사용하지 않는 앱은 승인하지 않는다.
9.2     아이팟 인터페이스를 흉내낸 사용자 인터페이스를 가진 앱은 승인하지 않는다.
9.3     무선 네트워크를 통한 오디오 스트리밍 컨텐츠는 5분 간 5메가 이상 사용하지 않도록 한다.
9.4     무선 네트워크를 통한 비디오 스트리밍 컨텐츠는 10분을 초과하는 경우 HTTP 라이브 스트리밍을 사용해야하며, 기본 64kbps 오디오만 사용한 HTTP 라이브 스트림을 포함해야한다.

10. 사용자 인터페이스

10.1   모든 앱은 애플 아이폰 Human Interface Guidelines과 애플 아이패드 Human Interface Guidelines에 맞춰 제작해야 한다.
10.2   앱스토어, 아이튠스스토어, 아이북스토어를 포함한 아이폰 상에 기본으로 제공되는 번들 앱과 유사한 앱은 승인 하지 않는다.
10.3   애플 아이폰 Human Interface Guidelines과 애플 아이패드 Human Interface Guidelines에 명시된대로 버튼이나  아이콘 등을 제대로 제공하는 시스템이 없는 앱은 승인하지 않는다.
10.4   변경된 데스크탑/홈 스크린 환경을 만들거나 멀티앱 위젯 환경을 시뮬레이션하는 앱은 승인하지 않는다.
10.5   볼륨 업/다운 및 벨소리/진동 스위치 같은 기본적인 스위치 기능을 변경하는 앱은 승인하지 않는다.
10.6   애플과 애플의 고객들은 심플하고 세련되며 창의적이고 좋은 아이디어에서 나온 인터페이스를 높이 평가한다.
          이러한 인터페이스를 만들기 위해서는 더 많은 노력이 필요하지만, 그럴만한 가치가 있는 일이다.
          인터페이스에 관한 애플의 기준치는 높다.
          만약 당신의 사용자 인터페이스가 복잡하거나 좋지 않을 경우 해당 앱을 승인하지 않을 것이다.

11. 구입, 통화

11.1   락을 풀어서 앱스토어 이외의 메커니즘에서 추가적인 기능을 사용할 수 있도록 하는 앱은 승인하지 않는다.
11.2   앱 상의 구매 API (IAP) 이외의 시스템을 통해 앱 상의 컨텐츠, 기능, 혹은 서비스를 구매할 수 있도록 하는 앱은 승인하지 않는다.
11.3   IAP를 통해 어플리케이션 외에서 쓰이는 상품이나 서비스를 구입할 수 있도록 하는 앱은 승인하지 않는다.
11.4   IAP를 통해 신용이나 다른 통화를 구입하는 앱의 경우 해당 신용을 어플리케이션 내에서 소비해야한다.
11.5   IAP를 통해 만료된 신용이나 다른 통화를 구입하는 앱은 승인하지 않는다.
11.6   IAP를 통한 컨텐츠 가입은 최소 30일 동안 유지되어야하며, iOS를 사용하는 기기를 가진 모든 사용자들에게 공개 되어야한다.
11.7   IAP를 통해 물품을 구입하는 앱의 경우 정확한 구입기능이 있어야한다.
11.8   IAP를 통해 카메라나 자이로스코프 따위의 iOS에 내장된 기능에 접속할 수 있는 권한을 구매할 수 있도록 하는 앱은 승인하지 않는다.
11.9   “렌탈” 컨텐츠나 일정 기간이 지나면 만료되는 서비스를 포함한 앱은 승인하지 않는다.
11.10   보험 어플리케이션은 무료여야하며, 배포되는 지역의 법을 준수해야한다. 또한, 해당 앱은 IAP를 사용할 수 없다.
11.11   전반적으로, 당신이 만든 앱이 비쌀수록 우리는 더 철저하게 리뷰를 할 것이다.

12. 긁어오기, 종합

12.1   애플 사이트(예: apple.com, 아이튠스스토어, 앱스토어, 아이튠스커넥트, 애플 개발자 프로그램 등)로부터 정보를 긁어오거나 애플 사이트와 서비스의 컨텐츠를 이용해서 순위를 만드는 앱은 승인하지 않는다.
12.2   어플리케이션은 아이튠스스토어 RSS feed 따위의 승인받은 애플 RSS feeds를 사용해야 한다.
12.3   웹상의 자료를 잘라온 것이나 컨텐츠 모음, 혹은 링크모음 따위의 앱은 승인하지 않는다.

13. 기기에 손상

13.1   사용자들로 하여금 애플 기기를 기기를 손상시키는 방향으로 사용하게 유도하는 앱은 승인하지 않는다.
13.2   기기의 배터리를 급격히 소모시키거나 과도한 열을 발생시키는 앱은 승인하지 않는다.

14. 개인적인 공격

14.1   명예훼손, 공격적, 비열한 내용을 포함하거나 혹은 특정인이나 집단에게 해를 끼칠 수 있는 앱은 승인하지 않는다.
14.2   직업적 정치 풍자가나 유머작가는 공격적, 비열한 코멘트로 인한 금지 항목에서 제외한다.

15. 폭력성

15.1   사람이나 짐승이 살해당하는 모습, 불구가 되는 모습, 총에 맞는 모습, 칼에 찔리는 모습, 고문당하거나 다치는
          모습의 실제 이미지를 표현한 앱은 승인하지 않는다.
15.2   폭력이나 아동학대를 묘사한 앱은 승인하지 않는다.
15.3   게임 상의 “적”은 특정인종, 문화, 실존하는 정부나 회사, 혹은 그 어떤 실제적 존재를 단독으로 지목하여 만들어서는 안된다.
15.4   무기를 통한 폭력을 현실적으로 보여줘서 무기의 불법적, 난폭한 사용을 독려하는 앱은 승인하지 않는다.
15.5   러시안 룰렛을 포함한 앱은 승인하지 않는다.

16. 거부감을 주는 컨텐츠

16.1   과도하게 거부감을 주거나 상스러운 컨텐츠를 보여주는 앱은 승인하지 않는다.
16.2   주로 사용자를 기분나쁘게 하거나 역겹게 하기 위한 목적으로 제작된 앱은 승인하지 않는다.

17. 사생활

17.1   모든 앱은 사용자 정보 사용에 관해 사전에 사용자의 허락없이, 그리고 사용자로 하여금 해당 정보가 어디서 어떻게 사용될 것인지에 관해 알려주지 않은 채 사용자 정보를 전송할 수 없다.
17.2   구동을 위해서 이메일 주소나 생년월일 따위의 사용자 개인정보의 공유를 필요로 하는 앱은 승인하지 않는다.
17.3   미성년자를 대상으로 정보수집을 하는 앱은 승인하지 않는다.

18. 포르노그래피

18.1   웹스터 사전에서 정의한 “생식기관의 노골적 묘사, 그리고 미적이나 감성적인 느낌이 아닌 에로틱한 느낌을 유발하기 위한 목적의 노골적 행위를 표현한 것”에 해당하는 포르노물을 포함한 앱은 승인하지 않는다.
18.2   수시로 포르노물에 해당하는 내용이 등장하는 사용자 제작 컨텐츠를 포함하는 앱(예: “채트 룰렛” 앱)은 승인하지 않는다.

19. 종교, 문화, 인종

19.1   특정 종교, 문화, 혹은 인종에 대해 명예훼손, 공격적, 비열한 태도를 취하고 있거나 해당 그룹에게 피해를 끼칠 수 있는 코멘트 혹은 문헌을 포함한 앱은 승인하지 않는다.
19.2   앱이 종교적인 텍스트를 포함할 경우, 텍스트 상의 멘트나 번역은 정확해야한다. 코멘트는 선동적이라기보다는 교육적이거나 정보전달 차원에서 그쳐야한다.

20. 컨테스트, 경품, 복권, 추첨

20.1   경품 및 컨테스트는 앱의 개발자/회사가 후원하여 제공해야한다.
20.2   경품 및 컨테스트에 관한 공식적인 룰이 앱 상에 표기되어야하며, 해당 행위에 관해 애플이 관련이 없다는 점을 명확히 해야한다.
20.3   복권 앱을 만들기 위해서는 개발자가 법적 허가를 득해야하며, 복권 앱은 해당 3가지 특성을 모두 갖추고 있어야 한다: 배려, 기회, 상금
20.4   사용자로 하여금 직접적으로 복권이나 추첨티켓을 살 수 있도록 하는 앱은 승인하지 않는다.

21. 자선, 기부

21.1   자선단체에 기부할 수 있는 기능을 포함한 앱은 무료여야한다.
21.2   기부금의 모금은 사파리 상의 웹사이트나 SMS를 통해 이뤄져야한다.

22. 법적 요구사항

22.1   앱은 사용자에게 공개되는 지역의 법적 요구사항을 충족시켜야한다. 모든 지역법을 이해하고 따르는 것은 개발자 들의 의무사항이다.
22.2   허위사실, 사기, 호도된 정보를 포함한 앱은 승인하지 않는다.
22.3   범죄 혹은 난폭한 행위를 요청, 촉진, 장려하는 앱은 승인하지 않는다.
22.4   불법적 파일 공유를 가능케하는 앱은 승인하지 않는다.
22.5   카드 카운터를 포함한 불법적 도박을 조장하기 위해 만들어진 앱은 승인하지 않는다.
22.6   익명 혹은 장난스러운 전화나 SMS/MMS 메시지 전송이 가능한 앱은 승인하지 않는다.
22.7   부정한 방법으로 사용자의 패스워드나 기타 개인정보를 알아내고자 하는 목적으로 앱을 만든 개발자는 iOS 개발자 프로그램에서 퇴출한다.

이 문서는 지속적으로 업데이트되는 문서임

이 문서는 개발자들이 앱스토어에 제출하는 앱을 우리가 어떻게 리뷰하는지 알려줍니다. 또한 우리는 이 가이드가 당신이 앱을 개발하고 제출하는데에 있어 도움이 될 수 있기를 바랍니다. 이 가이드는 새로운 앱과 상황이 발생함에 따라 지속적으로 업데이트되는 문서이며, 변경사항이 있을 경우 주기적으로 이를 반영할 계획입니다.
iOS의 앱 개발에 참여해주셔서 감사합니다. 비록 이 문서가 당신이 하지 말아야할 것들로 가득하긴 하지만, 그보다 훨씬 짧더라도 당신이 꼭 해야하는 것들의 리스트를 꼭 기억해두시길 바랍니다. 무엇보다도, 사용자들을 놀라게 하고 기쁘게 하는 것에 동참 해주시길 바랍니다. 그들에게 창조적인 길을 보여주고, 이전에는 볼 수 없었던 방법으로 소통할 수 있도록 해주십시오. 우리의 경험에 의하면 사용자들은 기능적으로나 사용자 인터페이스적으로 세련된 것에 적극적으로 반응합니다. 조금 더 노력하셔서 그들에게 그들이 기대하는 이상을 보여주십시오. 그들이 이전까지 본 적이 없는 세계를 보여주시기 바랍니다. 우리는 당신을 도울 준비가 되어있습니다.


*위 문서는 개인 블로그 ,카페등에 가져가실수 있지만, 반드시 문서의 출처 Appsnext.com 을 명기해주시기 바랍니

728x90

댓글을 이용해서 pjyoung 님께서 질문을 남겨주셨는데요.( http://www.hind.pe.kr/805#comment6147213 )
내용을 읽어보다가, 잠시 대기라는 느낌이 들어 글을 남김니다.

지금 OBJECT 태그를 이용하시는 것까지는 맞는데요. CODEBASE 부분의 Tag 부분이 잘못된 것 같습니다.
CODEBASE라는 부분의 의미는 Object 태그가 들어간 페이지를 브라우저를 통해 띄울 때,
해당 ActiveX가 없을 때 어디서 받아가지고 오는 것인지 알려주는 부분입니다.

은행권 사이트를 예를 들어볼께요.(ActiveX 범벅이라 참 좋은 예제 같습니다 -_-;;; )
먼저 한번도 들어가본적이 없는 은행권 사이트에 접속을 합니다.
그 은행권에서 사용하는 보안용 ActiveX의 GUID가 33e6b301-a928-438d-b3b1-733bfc68ccdb 라고 하죠.
그 은행권 사이트에 접속하는 IE에서는 자신의 컴퓨터 안에 저 위의 GUID에 해당하는 ActiveX가 있는지 검색합니다.
당연히 있으면 띄우고 없으면 CODEBASE에 설정된 정보를 따라 들어가 다운로드 받고 설치합니다.
그 때 IE에서 보면 주소바 아래쪽에 노란색 바 같은게 뜨잖아요?
바로 그 행동을 한다고 사용자에게 알려주는 부분입니다.
그러나 여기서 잠시… 이 CODEBASE에 담기려면, 인증서가 배포 파일 안에 있어야 됩니다.
공인인증서 같은 것인데, 프로그램 배포용 공인인증서 입니다.
그거 안들어가면 IE에서 설치 못합니다.
(바이러스 따위로 인지해버린다는 거죠.)

아래의 링크를 보시면 알겠지만, 그 CODEBASE에 관련된 내용이 자세히 나와있습니다.

.http://digitalangelmaster.wordpress.com/2008/02/15/기존-activex-control-업그레이드/

 

그런데 위의 내용은 어떻게 보면 실험용이라기보다는 실전용의 의미에 가깝습니다.

만일 그냥 웹페이지에 띄우는 실험이나 자체적인 연습이라고 한다면 다르게 접근하시면 됩니다.
먼저 CODEBASE 부분을 삭제하시구요.
다음은 그 ActiveX를 띄우는 PC에 ActiveX를 강제적으로 설치하는 것입니다.

C:\Windows\Microsoft.NET\Framework\v2.0.50727\regasm /codebase “xxxxxxxx/form.dll”

저 위의 명령이 바로 그 ActiveX를 강제적으로 설치하는 것입니다.
아예 미리 PC 안에 설치되어 있으면 IE 에서는 군말 없이 띄웁니다. 즉 위의 명령을 써서, 직접 PC에 인스톨을 하는 것입니다. 그러면 특별한 코드상의 문제만 없다면 화면에 뜰 것입니다.

한번 확인해보세요.
(제가 해보고 싶었지만, 지금 밀린일이 좀 많아서 테스트는 안해봤어요 -_- ;;;)

728x90

2. Visual Studio 2010 Deployment Project

Visual Studio 안에 배포 프로젝트를 만들 때 사용하는 도구가 있다. Visual Studio 2002 때 부터 이미 존재는 했었고, Windows Installer의 버전과 .NET 내 지원 여부에 따라 몇번의 개정은 있었지만, 2005 때 부터의 기능적인 변화는 크게 없다. 그래서 생각보다 제작하기는 쉽다.

문제는 커스터마이징 부분이 많다. 현재로는 이 커스터마이징에 대한 벽에 부딪혀 더 이상의 진행은 잘 안되고 있다. 지금까지 파악된 내용을 정리하도록 하겠다.
여기서는 현재 개발도구가 Visual Studio 2010이여서 Visual Studio 2010을 기준으로 설명할 예정이다.
그리고 영문판이다 - -;;;

1. 프로젝트 생성 및 배포 대상 구성.

프로젝트를 생성하는 방법은 간단한다.

메뉴에서 File -> New -> Project를 선택한다.

그러면 새로운 프로젝트의 유형을 묻는 창이 뜨는데, 왼편의 Tree 에서 Other Project Type -> Setup and Deployment -> Visual Studio Installer 를 선택한다.(만일 Install Sheild가 없다면 Setup and Deployment 에서 바로 보인다.

selectproject

프로젝트 종류 중에 Setup Project를 선택한다. 그리고 .NET Framework 종류를 2.0을 선택하도록 한다.
요즘 최소한 .NET Framework 2.0 정도는 설치되어 있으니 2.0으로 선택하는 것이 좋을 것이다. (4.0 같은 것을 설치하면 나중에 배포 할 때 .NET 4.0 배포 처리를 해야 한다.

그리고 프로젝트이름을 적절히 정하고, 프로젝트가 위치할 곳도 정하도록 한다. 그리고 OK를 누르도록 한다.

최초 생성되면 신규 솔루션 파일안에 이 배포 프로젝트만 달랑 있는데, 실제 배포할 프로그램이 있는 프로젝트를 연결하도록 한다. 여기서는 예제로 필자가 기존에 재미삼아 만든 프로젝트를 포함해보도록 한다.

solutiontree 
배포할 것은 바로 GetLottoNum 에서 만들어진 Exe 파일을 올리는 것으로 판단하면 될 것이다.

2. 배포될 파일 구성.

먼저 배포 프로젝트에서 오른쪽 버튼을 클릭한다.
그러면 나오는 컨텍스트 메뉴에서 View -> File System을 선택한다.
selectview_filesystem

그러면 중앙 화면에 배포 파일 위치들이 나오게 된다.
filesystem_view

팬이 두개가 나오는데 그 중 왼편이 일종의 Tree 같은 것이고, 오른편이 왼쪽에서 선택한 폴더의 내용을 보여주는 부분이다. 최초 기본값으로 만들어진 내용은 총 3가지의 폴더의 형태를 가지고 있다.
Application Folder에는 배포할 때 배포 위치에 저장될 파일목록을 기록하는 내용이다.
두번째의 User's Desktop은 바탕화면을 의미한다.
마지막의 User's Programs Menu는 시작을 눌러서 나오는 프로그램 메뉴를 의미한다.

즉 두번째와 세번째에 위치한 User's Desktop과 User's Program Menu에는 일종의 아이콘들을 넣는 곳이라고 보면 되고, 첫번째에 위치한 Application Folder가 바로 실제 응용 프로그램들이 담기는 위치를 의미한다.

일단 왼편 트리에서 Application Folder를 선택한다. 그리고 오른쪽 빈공간에서 오른쪽 버튼을 클릭하여,
Add -> Project Output.. 을 선택한다.
addproject001

그러면 다음화면과 같은 Project 내 추가할 그룹들을 선택하게 된다.

selectprojectgroups

먼저 Project 에서 추가시킬 프로젝트를 선택한다.

그리고 난 뒤 하단에 위치한 종류를 원하는 대로 선택한다.

  • Primary output : 프로젝트를 빌드하면 출력되는 최종 결과물. 보통 Exe 나 Dll 이된다.
  • Localized resource : 언어별로 만들어진 Resource Dll 들이 된다.
  • Debug Symbol : 만일 빌드하는 형태가 Debug인 경우 pdb 같은 디버그 관련 정보 파일들이 된다.
  • Content Files : 프로젝트내에서 프로젝트 파일들을 Source가 아닌 Content로 선택한 내용들을 복사해온다.
  • Soruce Files : 프로젝트에서 빌드하기 위해서 있는 Source 들을 복사해온다.
  • Documentation Files : 프로젝트 내에서 문서로 분류해놓은 파일들을 복사해온다.
  • XML Serialization Assembles : XML 시리얼라이즈로 구성된 XML 파일들을 복사해온다.

보통은 Primary output을 하지만, 간혹 content 나 Localized resource를 포함하는 경우가 있다. 또 기본값 설정을 위해 XML Serialize 구성이 되어 있다면 XML Serialize Assemblies를 포함해야 한다. 원하면 여러개를 선택하여 한꺼번에 넣을 수 있다. Ctrl 키를 눌러 다중 선택이 가능하다.

그리고 Debug/Release 별로 나누고 싶을 때는 Configuration 부분을 적절히 선택하면 된다.

여기서는 Primary output을 선택하도록 한다.

3. 바탕화면, 시작메뉴에 프로그램 바로가기 만들기.

아이콘으로 된 바로가기를 만드는 작업을 한다.

왼편 트리에서 User's Desktop 을 선택하고, 오른편에서 오른쪽 버튼을 클릭하여, Create New Shortcut을 선택한다.
그러면 아래와 같은 선택 창이 나오는데, 앞서 설정한 Application Folder 안에 있는 Primary output을 선택하도록 한다.
select_newshortcut

OK를 누르면 알아서 자동으로 바로가기가 추가된다.적당한 이름으로 변경해준다.

이번에는 User's Programs Menu 이다.

바탕화면은 바로 만들었지만, 시작 메뉴는 하위에 폴더를 먼저 만들도록 한다. 시작메뉴 바깥에 그냥 만드는 경우도 있지만, 대개의 경우에는 폴더를 구성해서 그 폴더 안에 바로가기가 들어 있다. 그러므로 가급적이면 다른 프로그램 처럼 구성하는 것이 좋다.

startmenu_examples

앞서 바탕화면에서 했던 작업과는 별도로 한가지 더 작업이 있는 것이다. 폴더를 만드는 것.
여기서는 Get Lotto Number 이라는 폴더를 만들고 그 안에 바로가기를 만든다. 폴더를 만드는 방법은 해당 위치에서 오른쪽 버튼을 눌러 Add -> Folder를 선택하면 된다.
새로 만들어진 폴더를 클릭하고 앞서 만든 바로가기 처럼 추가하면 된다.

createshortcutforstartmenu

그냥 이렇게 만들어진 바로가기는 이쁘지 않으니, 해당 바로가기를 선택한 뒤, Properties 창에서 Icon 부분을 클릭해 새로운 아이콘을 넣도록 한다. 넣는 방법은 Properties 중에서 Icon 부분을 클릭하면 드랍다운 창이 드는데 그 중 (Browse..) 를 선택한다 그러면 선택창이 나오는데, Application Folder를 선택하고, Add File을 선택한다.
그리고 적당한 ico 파일을 선택하면 자동으로 Application Folder로 들어간다. 새롭게 Application Folder에 들어간 icon 파일을 선택하고 OK를 클릭한다.

selectnewicon

4. Build

오른편에 위치한 솔루션 트리에서 Deployment 프로젝트를 선택하고 오른쪽 버튼을 클릭해 Build 혹은 Rebuild를 선택한다. 그러면 자동으로 빌드를 하고 해당 프로젝트 하위에 각 프로젝트 형태(Debug/Release) 형태로 폴더를 만들어 결과물을 만들어 낸다.

5. 선결 설치 내용 정의하기.

개발 환경에는 개발을 위해서 다양한 선결 조건이 먼저 구축되어 있다. 최소한 .NET 프로그램을 만들기 때문에, 당연히 이에 필요한 .NET Framework가 버젼별로 구성되어 있다. 하지만, 이 프로그램을 설치할 PC에서는 해당되는 구성요소가 없을 수 있다. 이를 위한 설정을 해야 한다.

이를 위해서는 Deployment Project에서 오른쪽 버튼을 클릭하여 Property에 들어간다.
deploymentproejctproperty

속성창 하단에 위치한 Prerequisites 버튼을 클릭하도록 한다.
그러면 각종 선결작업으로 사용될 패키지들이 보인다. 만일 원한하는 패키지가 없다면 MS 사이트에서 업데이트 받으면 된다. ( 중간에 보이는 Check Microsoft Update for more redistributable component 를 클릭해도 된다. )
prerequisite

만일 이 프로그램을 설치하는 사람들이 인터넷을 사용할 수 없다면 맨 아래쪽에 선택하는 것들 중에 중간을 선택하도록 한다. 그러면 배포 패키지 안에 설치본이 자동으로 들어간다. 예를 들면, .NET Framework 3.0 같은 경우 인터넷에서 다운받아서 설치하게 끔 되어 있은데, 2번째를 선택하면 이미 전체를 다운 받은 버전을 설치본에 넣어줘서 인터넷 접속없이도 설치가 가능하게 된다. (가급적 2번째를 선택하는게 설치 작업을 빠르게 끝낼 수 있다.)

위에 나열된 내용은 Microsoft SDK 라는 곳에 있는 버젼별 SDK 안에 Bootstrapper 의 Package 안의 내용을 보여준다. (아래 캡쳐 화면에 있는 주소줄 위치로 보시면 된다. )

bootstrappers

각 폴더 안에는 설치본들이 담겨 있으며, 자동으로 설치되는 설정이나, 버젼 체크 방법을 위한 도구들이 같이 담겨 있다. 이 패키지를 만드는 방법은 다음 사이트를 참고하도록 한다.

http://msdn.microsoft.com/en-us/library/ms165429.aspx (Creating Bootstrapper Packages )
http://msdn.microsoft.com/ko-kr/library/ms165429.aspx

6. 인스톨러 추가 기능 만들기.

사실 Visual Studio 안에서 이 설치 프로젝트를 수정하는 방법이 애매하다.
그래서 추가적인 기능을 덪붙이기는 쉽지는 않다.
대신 방법은 Exe 나 Dll 을 통해 처리하도록 할 수 있다.

여기서는 간단하게 DLL 프로젝트로 만들도록 한다.
현재 Deployment Project가 있는 솔루션에 Class Library 프로젝트를 하나 만든다.
installeraddon

References(참조)에서 .NET 중, System.Configuration.Install 을 추가하도록 한다.

그리고 현재 Main Class 에 System.Configuration.Install.Installer 클래스를 상속 받게 한다.

classinheritance

안에 다음과 같은 함수들을 추가한다. "override" 라는 키워드를 치면 인텔리센스를 통해 자동으로 대부분 나오게 된다.

  • Install
  • Uninstall
  • Commit
  • Rollback

꼭 만들필요는 없지만, 원하는 이벤트의 형태에 따라 만들면 된다.

  • OnBeforeInstall
  • OnAfterInstall
  • OnBeforeUninstall
  • OnAfterUninstall
  • OnBeforeCommit
  • OnAfterCommit
  • OnBeforeRollback
  • OnAfterRollback

각 실행지점에 대한 설명을 하고 싶지만, 애석하게도 명확히 구분이 안되서 필자역시 여기가 한계다.

일단 이런 DLL이 만들어지면, 다음에는 Deployment Project로 돌아가도록 한다.

이제 Application Folder에 위의 프로젝트의 결과물을 넣도록 한다.
View -> File System을 선택한 뒤, 위의 프로젝트의 Primary Outputs를 넣도록 한다.

이 예제대로면 아래와 같이 2개의 Primary output이 들어가 있을 것이다.

primaryouts2

그리고 View -> Custom Actions를 클릭하여 Custom Actions 창을 띄우도록 한다.
창이 떴으면 원하는 단계에서 오른쪽 버튼을 클릭하여 Add Custom Action.. 을 클릭한다.
(만일 모든 단계에 포함하고 싶으면 트리의 최상단에 있는 Custom Actions에서 하면 된다).

addcustomactions

그러면 선택화면이 뜨는데, 그 중 Application Folder 안에 있는 Primary output 중에 앞서 만든 Installer 를 선택한다.

selectinstallerprimaryoutput

등록이 성공하면 Install 아래에 한가지의 Action이 추가되었을 것이다. 이 Actions을 선택하고 속성창을 열도록 한다.

actionproperties 

여기서 반드시 확인해야 하는것이 바로 InstallerClass 부분이다. 반드시 이 부분이 True로 되어 있어야 한다.

그리고 이 사용자 정의 Installer에 정보를 별도로 제공하려면, CustomActionData를 사용해야 한다.
마치 파라미터를 통해 데이터를 주듯 주면 된다.
예를 들어 설치 폴더의 정보를 주려면,

/DestDir="[TARGETDIR]\"

이라는 값을 CustomActionData 속성으로 넣어야 한다.

만일 그 외의 값들을 추가적으로 주려면, 한칸 띄고 그 옆에 / 하여 계속 붙여서 보내주면 된다.

/내부이름=값

위의 형식을 기억하면 간단한 것이다. 여러개인 경우 /내부이름1=값  /내부이름2=값  /내부이름3=값 … 이런식으로 넣는다. 또 값안에 공백이 있는 경우에는 반드시 " " 를 통해 막아서 보내도록 한다.

위의 예제에서 보면 /DestDir="[TARGETDIR]\" 라고 했는데, 값 부분에서 맨 끝에 \ 가 들어가 있다.
정확히는 왜 이런지는 모르겠는데 안들어가면 오류가 난다. 아마도 내부 변수 ([TARGETDIR] 같은 것들)를 사용하면
오류가 발생하는 것 같다.

이렇게 전달되는 값을 프로그램안에서 쓰려면 아래와 같이 하면 된다.

destdir_paramtest

this.Context.Parameter 를 통해 값을 전달 받는 것이다.

이를 통해 인스톨러 내에서 사용되는 각종 값을 수신하는 것이다.(상태값, 입력값 등등)

7. Launch Condition.

각 구성요소의 실행 조건을 미리 만들어 놓는 곳이다.

View -> Launch Conditions 를 선택하면 나온다.

왼편 폴더가 보이는데 그 중 Search Target Machine이 바로 IF문을 만드는 부분이다.
종류는 총 세가지가 있다.

  • File Search
  • Registry Search
  • Windows Installer Search

각각 파일이 존재여부로, 레지스트리의 특정값이 존재여부로, 마지막으로 Windows Installer로 설치된 ID로 있는지 없는지를 판단하여 true/false로 결정되는 사항이다.

하위에 있는 Lauch condition인데, 여기서는 외부에서 실행될 내용을 연결할 때 사용되는 부분이다.

앞서 만든 Custom Action들 중에 특정 조건에 해당할 때만 실행되도록 만들려면, 먼저 Search Target Machine에서 해당 조건을 만들고, 이를 가지고 Lanch Condition을 만든다. 이를 Custom Acition 의 속성안에 설정한다.

 

 

사실 이 프로젝트를 이용하여 좀더 커스터마이징을 가해서 원하는 형태로 뽑아내고 싶었다.
이 Deployment Project는 Visual Studio로 만드는 모든 프로젝트 결과물을 가장 효율적으로 묶을 수 있기 때문에, 사용성은 우수하다. 하지만, 정말 원하는 기능을 추가하기 위해서는 제약점이 너무크다. 그나마 커스터마이즈 율이 제일 큰게 외부 모듈을 이용해 Action을 정의할 수 있는 부분인데, 그 마저도 애석하게도 한계점이 자주 보인다.

(아직 조사가 끝난 것은 아니지만, UI를 제어할 방법이 있는지를 명확히 모르겠다.)

시간이 허락되면 나중에 이 Installer에 대한 자세한 파악이 병행될 필요는 있어보인다.

728x90

+ Recent posts

728x90