iOS 설정 번들에 라이선스 섹션을 추가하는 가장 좋은 방법


116

내 iOS 애플리케이션은 Apache 2.0 및 유사한 라이선스에 따라 라이선스가 부여 된 여러 타사 구성 요소를 사용하므로 다양한 텍스트를 포함해야합니다.

* Redistributions in binary form must reproduce the above copyright
  notice, this list of conditions and the following disclaimer in the
  documentation and/or other materials provided with the distribution.

이 정보를 설정 번들의 '라이선스'하위 항목에 넣는 합리적인 선례가있는 것 같습니다 (아이 패드 페이스 북, 페이지, 키 노트, 숫자 및 위키 패널에서 모두이 작업을 수행하는 것으로 보입니다).

나는 실제로 똑같은 것을 달성하기 위해 약간 고군분투하고있다. 텍스트를 한 줄씩 분할하고 한 번에 한 줄씩 xcode에 입력해야하는 것 같습니다 (그리고 xcode4는 plist를 편집 할 때 충돌 문제가있는 것 같습니다).

어딘가에 할 스크립트가 있거나 내가 놓친 간단한 방법이있는 것 같습니다.

답변:


192

나는 지금 내가 겪었던 모든 문제를 해결할 수 있다고 생각합니다.

  • 라이센스를 보유하기 위해 그룹 요소 제목을 사용하는 것이 가장 좋은 것 같습니다 (이는 iWork 앱에서 Apple이 수행하는 작업입니다). 그러나 이들의 길이에는 제한이 있으므로 (정확히 제한이 무엇인지는 아직 알지 못함) 각 라이센스 파일을 여러 문자열로 분리해야합니다.
  • 리터럴 캐리지 리턴 (예 : ^ M, \ r 또는 0x0A라고도 함)을 포함하여이 안에 줄 바꿈을 만들 수 있습니다.
  • 리터럴 "의 중간 텍스트를 포함하지 않도록하십시오. 이렇게하면 파일의 일부 또는 모든 문자열이 자동으로 무시됩니다.

아래에 표시된 .plist 및 .strings 파일을 생성하는 데 사용하는 편리한 스크립트가 있습니다.

그것을 사용하려면 :

  1. 프로젝트 아래에 'licenses'디렉토리를 만듭니다.
  2. 해당 디렉토리에 스크립트 넣기
  3. .license로 끝나는 파일 이름을 사용하여 각 라이센스를 해당 디렉토리에 파일 당 하나씩 넣습니다.
  4. 라이센스에서 필요한 재 포맷을 수행하십시오. (예 : 줄 시작 부분에 추가 공백을 제거하고 단락 중간에 줄 바꿈이 없는지 확인). 각 단락 사이에 빈 줄이 있어야합니다.
  5. 라이센스 디렉토리로 변경하고 스크립트를 실행하십시오.
  6. 'Acknowledgements'라는 하위 섹션을 포함하도록 설정 번들 Root.plist를 편집합니다.

다음은 스크립트입니다.

#!/usr/bin/perl -w

use strict;

my $out = "../Settings.bundle/en.lproj/Acknowledgements.strings";
my $plistout =  "../Settings.bundle/Acknowledgements.plist";

unlink $out;

open(my $outfh, '>', $out) or die $!;
open(my $plistfh, '>', $plistout) or die $!;

print $plistfh <<'EOD';
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>StringsTable</key>
        <string>Acknowledgements</string>
        <key>PreferenceSpecifiers</key>
        <array>
EOD
for my $i (sort glob("*.license"))
{
    my $value=`cat $i`;
    $value =~ s/\r//g;
    $value =~ s/\n/\r/g;
    $value =~ s/[ \t]+\r/\r/g;
    $value =~ s/\"/\'/g;
    my $key=$i;
    $key =~ s/\.license$//;

    my $cnt = 1;
    my $keynum = $key;
    for my $str (split /\r\r/, $value)
    {
        print $plistfh <<"EOD";
                <dict>
                        <key>Type</key>
                        <string>PSGroupSpecifier</string>
                        <key>Title</key>
                        <string>$keynum</string>
                </dict>
EOD

        print $outfh "\"$keynum\" = \"$str\";\n";
        $keynum = $key.(++$cnt);
    }
}

print $plistfh <<'EOD';
        </array>
</dict>
</plist>
EOD
close($outfh);
close($plistfh);

Settings.bundle 설정

Settings.bundle을 만들지 않은 경우 파일-> 새로 만들기-> 새 파일 ...으로 이동합니다.

리소스 섹션에서 설정 번들을 찾습니다. 기본 이름을 사용하고 프로젝트의 루트에 저장합니다.

Settings.bundle그룹을 확장하고을 선택 Root.plist합니다. 키 Preference Items유형 이 될 새 섹션을 추가해야 합니다 Array. 다음 정보를 추가하십시오.

여기에 이미지 설명 입력

Filename이 스크립트에 의해 생성 된 PLIST에 핵심 포인트. title원하는대로 변경할 수 있습니다 .

빌드시 스크립트 실행

또한 프로젝트를 빌드 할 때마다이 스크립트를 실행하려면 대상에 빌드 단계를 추가 할 수 있습니다.

  1. 프로젝트 파일로 이동
  2. 대상 선택
  3. 빌드 단계 탭을 클릭합니다.
  4. 해당 창의 오른쪽 하단에서 'Add Build Phase'를 클릭합니다.
  5. '실행 스크립트 추가'를 선택하십시오.
  6. perl 스크립트를 스크립트 섹션으로 끌어다 놓습니다. 다음과 같이 수정하십시오.
  1. cd $SRCROOT/licenses( $SRCROOT프로젝트의 루트를 가리킴)
  2. ./yourScriptName.pl

완료 한 후에 Run Script는 빌드 프로세스에서 빌드 단계를 더 빨리 드래그 할 수 있습니다 . Compile Sources설정 번들에 대한 업데이트가 컴파일되고 복사되도록 이전에 위로 이동하는 것이 좋습니다.

iOS 7 업데이트 : iOS 7은 "제목"키를 다르게 처리하는 것으로 보이며 렌더링 된 텍스트를 엉망으로 만듭니다. 생성 된 Acknowledgements.plist를 수정하려면 "Title"대신 "FooterText"키를 사용해야합니다. 스크립트를 변경하는 방법은 다음과 같습니다.

for my $str (split /\r\r/, $value)
{
    print $plistfh <<"EOD";
            <dict>
                    <key>Type</key>
                    <string>PSGroupSpecifier</string>
                    <key>FooterText</key> # <= here is the change
                    <string>$keynum</string>
            </dict>
 EOD

    print $outfh "\"$keynum\" = \"$str\";\n";
    $keynum = $key.(++$cnt);
}

1
정말 멋진 아이디어입니다! 나는 특히 극악한 그룹 제목 길이 제한 때문에 자동화 된 솔루션이 필요하다는 것을 빨리 깨닫기 전에 수동으로 시작했습니다.
Hilton Campbell

9
주의해야 할 사항은 "파일 이름"입니다. 키의 표시 형식입니다. 실제 키는 "파일"입니다. 자식 창이 표시되지 않으면 마우스 오른쪽 단추를 클릭하고 "원시 키 / 값 표시"를 선택하고 키 이름이 "파일"인지 확인합니다.
atticus

10
환상적입니다. 감사합니다. 한 프로젝트에서 여러 사람이 작업하는 경우 좀 더 잘 작동하는 Run Script 블록에서 'cd "$ SRCROOT / Licenses /"를 사용했습니다.
chris

9
iOS7에서 이것을 사용하는 경우 devforums.apple.com/message/894791#894791을 읽으십시오 . 특히 <key> Title </ key>를 <key> FooterText </ key>로 변경해야 정상적으로 보이게 할 수 있습니다.
esilver 2013-09-27

2
하위 창으로 만드는 방법 : 기본 설정 항목 내에 항목 0을 만듭니다. 유형으로 하위 창을 선택할 수없는 것처럼 보이지만 항목 0 (항목 0의 하위 항목) 아래에 항목을 만들고 첫 번째 항목에 "유형"키가 있습니다. 더 쉽게하려면 이것을 마우스 오른쪽 버튼으로 클릭하고 원시 키 / 값 표시를 선택합니다. Type의 값을 PSChildPaneSpecifier로 설정하려고합니다. 원시 키 / 값 표시를 설정 해제하면 이제 항목 0의 이름 인 "Its 0 (Child Pane-)"에서도 Child Pane이 표시됩니다. 이것이 당신이 원하는 것입니다.
Marc

36

@JosephH가 제공 한 (번역없이) 동일한 솔루션이 있지만 펄보다 python을 선호하는 모든 사용자를 위해 Python으로 수행되었습니다.

import os
import sys
import plistlib
from copy import deepcopy

os.chdir(sys.path[0])

plist = {'PreferenceSpecifiers': [], 'StringsTable': 'Acknowledgements'}
base_group = {'Type': 'PSGroupSpecifier', 'FooterText': '', 'Title': ''}

for filename in os.listdir("."):
    if filename.endswith(".license"):
        current_file = open(filename, 'r')
        group = deepcopy(base_group)
        title = filename.split(".license")[0]
        group['Title'] = title
        group['FooterText'] = current_file.read()
        plist['PreferenceSpecifiers'].append(group)

plistlib.writePlist(
    plist,
    "../Settings.bundle/Acknowledgements.plist"
)

이 답변에는 더 많은 찬성 투표가 필요합니다. Python 구문 <3Perl 구문. ;)
Ricardo Sanchez-Saez 2014 년

5
current_file = codecs.open(filename, 'r', 'utf-8')유니 코드 라이센스의 경우.
user2821144

감사! Carthage에 적합한이 버전을 기반으로 새 버전을 만들었습니다. 또한 라이센스 텍스트에서 일부 불필요한 줄 바꿈을 제거합니다. 확인 : gist.github.com/Zyphrax/0d015c618d46093b4f815e62a6a33969
Zyphrax

1
나는 그것에 약간 더 많은 작업을하였습니다. 참조 : github.com/Building42/AckAck
Zyphrax

15

대안으로 CocoaPods를 사용하는 경우 해당 대상에서 사용 된 각 포드에 대한 라이선스 세부 정보를 포함하는 Podfile에 지정된 각 대상에 대한 '승인'plist를 생성합니다 (포드 사양에 세부 정보가 지정되었다고 가정). iOS 설정 번들에 추가 할 수있는 속성 목록 파일입니다.

이 데이터를 변환하여 앱 내에서 대신 표시 할 수있는 프로젝트도 진행 중입니다.

https://github.com/CocoaPods/cocoapods-install-metadata

https://github.com/cocoapods/CPDAcknowledgements


3
여기에 대한 자세한 정보는 다음과 같습니다 github.com/CocoaPods/CocoaPods/wiki/Acknowledgements
오렌

Cocoapods 위키에는 Pods-Acknowledgements.plist와 같은 입력 파일 이름이 있지만 실제로 파일은 Pods-acknowledgements.plist (소문자 'a')로 생성됩니다. 파일 시스템이 대소 문자를 구분하는 경우 잘못된 대소 문자를 사용하면 포드 설치가 중단됩니다.
Keller

14

나는 Sean의 멋진 파이썬 코드에 내 반복을 던질 것이라고 생각했습니다. 주요 차이점은 입력 디렉토리를 가져온 다음 재귀 적으로 LICENSE 파일을 검색한다는 것입니다. LICENSE 파일의 상위 디렉토리에서 제목 값을 가져 오므로 cocoapods와 잘 작동합니다.

동기는 내가 포드를 추가하거나 제거 할 때 내 앱의 법적 섹션을 자동으로 최신 상태로 유지하는 빌드 스크립트를 만드는 것이 었습니다. 또한 라이선스에서 강제 줄 바꿈을 제거하는 등의 다른 작업을 수행하여 장치에서 단락이 좀 더 잘 보이도록합니다.

https://github.com/carloe/LicenseGenerator-iOS

여기에 이미지 설명 입력


8

@JosephH 스크립트를 사용하여 Ruby로 스크립트를 작성했습니다. 이 버전은 제 생각에 개별 오픈 소스 프로젝트를 더 잘 표현할 것입니다.

Wisit iOS-AcknowledgementGenerator 를 사용하여 스크립트 및 샘플 프로젝트를 다운로드합니다.

다음은 앱에 표시되는 승인입니다.

Settings.app Settings.bundle 감사의 말 여기에 이미지 설명 입력


2

이것은 JosephH의 대답에 대한 부록입니다. (댓글 할 담당자가 없습니다)

나는 <key>StringsTable</key> <string>Acknowledgements</string> 마지막 위로 아래 로 이동해야했다 </dict>Perl 스크립트에서 .

이 수정 전에는 앱의 Acknowledgments 섹션이 비어 있었고 XCode는 결과 Acknowledgements.plist를 읽을 수 없습니다. ( "데이터가 올바른 형식이 아니기 때문에 읽을 수 없습니다.")

(XCode 6.3.2 iOS 8.3)


2

이 스레드에서 Sean의 Python 스크립트가 작동합니다. 그러나 알아야 할 몇 가지 기본 사항이 있습니다.

  1. Xcode에서 프로젝트 네비게이터 트리 상단의 프로젝트 이름을 마우스 오른쪽 버튼으로 클릭하고 새 그룹을 추가합니다. 그러면 프로젝트에 새 폴더가 생성됩니다.
  2. 여기에 Sean의 스크립트를 추가하고 Acknowledgements.py로 저장합니다.
  3. 시스템에 Python이 설치되어 있는지 확인하십시오. Mac을 사용하고 있습니다.
  4. 1에서 만든 폴더에 첫 번째 라이선스 파일을 추가합니다. 파일에 한 단어 만있는 것처럼 간단하게 만드십시오. 폴더에 Test1.license로 저장합니다.
  5. 위의 JosephH에 따라 Settings.bundle을 설정하십시오.
  6. 터미널 앱을 사용하여 1에서 만든 폴더로 CD를 만듭니다.
  7. 스크립트를 실행하십시오. 유형 : python Acknowledgements.py. 오류가 발생하지 않으면 터미널 프롬프트로 바로 돌아갑니다. 빌드에 실행 스크립트를 추가하기 전에이 모든 작업을 수행하십시오.
  8. 앱을 빌드하고 실행합니다.
  9. iPhone 홈 버튼을 두 번 탭하고 설정을 종료하십시오. 설정이 다시 시작될 때까지 앱의 설정 변경 사항을 선택하지 않는 경우가 많습니다.
  10. 설정을 다시 시작한 후 앱으로 이동하여 작동하는지 확인하십시오.
  11. 모두 작동하면 천천히 라이센스 파일을 추가하되 매번 스크립트를 실행하십시오. 파일의 특정 문자로 인해 스크립트 실행 오류가 발생할 수 있으므로 디버그하는 쉬운 방법은 파일을 추가하고 스크립트를 실행 한 다음 작동하는지 확인하고 계속하는 것입니다. 그렇지 않으면 .license 파일에서 특수 문자를 편집하십시오.
  12. 위의 지침에 따라 빌드 스크립트 실행 작업을 얻지 못했습니다. 그러나 .license 파일을 자주 변경하지 않는 경우이 프로세스가 제대로 작동합니다.

1

Ack Ack : 승인 Plist 생성기
A 이전에 라이센스 파일을 스캔하고 Settings.plist에서 사용할 수있는 멋진 Acknowledgments plist를 만드는 Python 스크립트를 만들었습니다. 그것은 당신을 위해 많은 일을합니다.

https://github.com/Building42/AckAck

풍모

  • Carthage 및 CocoaPods 폴더 감지
  • 사용자 지정 라이선스에 대한 기존 plist를 감지합니다.
  • 불필요한 새 줄과 줄 바꿈을 제거하여 라이센스 텍스트를 정리합니다.
  • 다양한 사용자 정의 옵션 제공 (자세한 내용 --help은 참조)
  • Python v2 및 v3 모두 지원

설치

wget https://raw.githubusercontent.com/Building42/AckAck/master/ackack.py
chmod +x ackack.py

운영

./ackack.py

스크린 샷

감사의 말

개선에 대한 제안이 있으면 GitHub에 문제를 게시하거나 요청을 가져 오세요!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.