ちょっと話題の記事

[iOS] アプリの設定画面にバージョン表記と謝辞を自動で設定する

2014.12.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

アプリの設定画面を活用しよう

iOS アプリでは、Settings.bundle ファイルを作成することで iOS の設定に iOS アプリの設定を追加することができます。iOS 8 からはプッシュ通知やネットワーク接続を利用しているアプリは必ず表示されるようになりました。

settings-bundle-01

プッシュ通知などの設定は OS が勝手に表示するものですが、その下のグループにある設定項目は Settings.bundle で自分で定義した設定が表示されます。

settings-bundle-02

この領域を活用すると、アプリのバージョンや OSS の謝辞 (Acknowledgements) を掲載することができます。弊社で開発している iOS アプリでも採用されることが多いですし、何より世の中にリリースされているアプリの多くで見かけます。

settings-bundle-03

バージョンと謝辞は自分で書くこともできますが、プロジェクトで設定だけしてしまえば簡単に自動化することができます。社内で聞かれることが多いので、簡単ですが手順をまとめてみました。

Settings.bundle の作成

まずは Settings.bundle を作成しましょう。プロジェクト内の「Supporting Files」グループの中で右クリックし、コンテキストメニューから「New File...」を選択します。その中に「Settings Bundle」という項目を選択して作成します。

settings-bundle-04

作成後、Settings.bundle 内に Root.plist ファイルを選択し、ソースを次のようにします。バージョンを表す VersionBuild、謝辞を表す Acknowledgements の3つのアイテムを定義します。

<?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>PreferenceSpecifiers</key>
	<array>
        <dict>
			<key>Title</key>
			<string>About</string>
			<key>Type</key>
			<string>PSGroupSpecifier</string>
			<key>FooterText</key>
			<string>Copyright © 2014 ◯◯◯◯◯ All Rights Reserved.</string>
		</dict>
		<dict>
			<key>Type</key>
			<string>PSTitleValueSpecifier</string>
			<key>DefaultValue</key>
			<string>1.0.0</string>
			<key>Title</key>
			<string>Version</string>
			<key>Key</key>
			<string>sbVersion</string>
		</dict>
		<dict>
			<key>Type</key>
			<string>PSTitleValueSpecifier</string>
			<key>DefaultValue</key>
			<string>1</string>
			<key>Title</key>
			<string>Build</string>
			<key>Key</key>
			<string>sbBuild</string>
		</dict>
		<dict>
            <key>Type</key>
            <string>PSChildPaneSpecifier</string>
            <key>Title</key>
            <string>Acknowledgements</string>
            <key>File</key>
            <string>Acknowledgements</string>
        </dict>
	</array>
	<key>StringsTable</key>
	<string>Root</string>
</dict>
</plist>

バージョン表記の書き出し

iOS アプリには、内部的なバージョンである Bundle と、外部的なバージョンである Version の2つのバージョン設定があります。これらを自動で書き出されるようにします。

まず、プロジェクト設定の Build Phases を開き、左上の「+」をクリックして表示される「New Run Script Phase」をクリックします。

settings-bundle-05

新しく作成した Run Script Phase に、次のスクリプトを貼り付けてください。

APP_VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $PRODUCT_SETTINGS_PATH)
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:1:DefaultValue ${APP_VERSION}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"

BUILD_NUMBER=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $PRODUCT_SETTINGS_PATH)
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:2:DefaultValue ${BUILD_NUMBER}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"

これで、アプリをビルドしたときに Settings.bundle の Root.plist の中に Build と Version が自動で書き込まれるようになりました。

CocoaPods の Acknowledgements の書き出し

CocoaPods は、pod install を実行すると、インストールした OSS のライセンスを表記した Acknowledgements ファイルを様々な形式で書き出してくれています。このうち Plist ファイルを Settings.bundle の中にコピーするように設定します。

post_install do | installer |
  require 'fileutils'
  FileUtils.cp_r('Pods/Target Support Files/Pods-<プロジェクト名>/Pods-<プロジェクト名>-acknowledgements.plist', '<プロジェクト名>/Settings.bundle/Acknowledgements.plist', :remove_destination => true)
end

pod install 実行後、Settings.bundle 内が下図のようになっていれば正常に書き出せています。

settings-bundle-06

完成!

以上で完成です!お疲れ様でした。 アプリを実行し、設定を表示すると正しく書き出されていることが確認できるはずです。

settings-bundle-03

バージョンに現在のバージョンが反映されなかったり、謝辞が更新されないなどいといった事象が発生する場合は、デバイスに iOS アプリを再インストールしたりクリーンビルドすると直る可能性があります。

まとめ

以上、iOS アプリにバージョンと謝辞を自動で掲載する手順について解説しました。これらは採用されることが多いので、覚えておいて損はないです!ぜひ参考にしてください。