アプリの基本情報(アプリのバージョンや状態)が書かれているInfo.plistから値を取得する方法を紹介します。

例えば、APIと通信するアプリを作成するときにアプリのバージョンを一緒に送信したい場合があるかと思います。

アプリのバージョンごとに描画する内容が異なる場合などです。

その値を手動でバージョンアップごとに書き換えるとなるととってもめんどくさく、またリスクがあると思います。

そのような値を設定ファイル(Info.plist)から取得すればまず間違いは起きません。

また設定ファイル(Info.plist)に独自の値を設定することも出来ます。

設定ファイルを有効活用してソースコードを少しでも簡素化できるようにしましょう。

ということで取得方法を紹介します。

Info.plist

今回はXcodeでプロジェクトを作成したときのまんまのInfo.plistをサンプルとして使いたいと思います。

Info.plist
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?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>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>jp.co.ninja.sample.$(PRODUCT_NAME:rfc1034identifier)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
</array>
</dict>
</plist>

とまあ上記のような感じです。

余談ですが、Xcode5の時のInfo.plistの名前って${ProjectModuleName}-Info.plistだったのに、Xcode6からはただのInfo.plistになってしまったのですね…。

あ、ちなみにこのソースコードどうやってみるんだよってお話ですが、とても簡単です。

Info.plistのファイルを選択して、右クリックしてOpen As -> source codeで確認することが出来ます。

ということでこの値を取得する方法をまずは紹介します。

値の取得

まずよく見る取得方法を紹介します。

Objective-C
1
2
// アプリのBundleIdentifierを取得
NSString *bundleIdentifier = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];
Swift
1
2
// アプリのBundleIdentifierを取得
let bundleIdentifier = NSBundle.mainBundle().infoDictionary["CFBundleIdentifier"] as NSString;

とこんな感じで値が取得できます。

がしかし僕はここで罠にはまっていました。

正確にはiOS8になってからだと思います。

infoDictionary

公式リファレンスからの引用です。

Common keys for accessing the values of the dictionary are CFBundleIdentifier, NSMainNibFile, and NSPrincipalClass.

いつも通り意訳しますが、「Dictionaryにアクセスするための一般的なキーはCFBundleIdentifierとNSMainNibFileとNSPrincipalClassとなっています。」という意味でしょうか。

iOS7の時点では[[NSBundle mainBundle] infoDictionary]Info.plistの値すべてを取得できていました。

しかし、iOS8でこれをしたところnilが返却されるようになりました。

iOS7の時点でリファレンス見たときは書いてなかったんだけどなー。

ということですべての値を取得する方法を改めて紹介します。

値の取得 iOS8用

こんな感じで取得できました。

Objective-C
1
2
3
4
// アプリのBundleIdentifierを取得
NSString *bundleIdentifier = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIdentifier"];
// アプリのバージョン名を取得
NSString *versionName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
lan:swift Swift
1
2
3
// アプリのBundleIdentifierを取得
let bundleIdentifier = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleIdentifier") as String
let versionName = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as String

とまあこんな感じです。

簡単にこのメソッドの説明をします。

objectForInfoDictionaryKey

Objective-C
1
- (id)objectForInfoDictionaryKey:(NSString *)key
Swift
1
func objectForInfoDictionaryKey(_ key: String) -> AnyObject?

公式リファレンスより引用します。

Return Value
The value associated with key in the receiver’s property list (Info.plist). The localized value of a key is returned when one is available.

Discussion
Use of this method is preferred over other access methods because it returns the localized value of a key when one is available.

Return Valueは「Info.plistに関連つけられているkeyの値。そのkeyがローカライズされた値の場合はローカライズされた値を返す」という感じでしょうか。

Discussionは「Info.plistに関連されているkeyがローカライズされている場合、それを返却するため、このメソッドを使うことが好ましい」という感じだと思います。使ってみた感想ですが。

とりあえず僕が試した結果、このメソッドを使えばInfo.plistにある値はしっかり返却されました。

つまりこのメソッドを使えば問題ないなという結論に至りました。

終わりに

と簡単な紹介でした。

使えなかったときはびっくりしましたが、天下のStackOverFlow様が助けてくれました。

以上になります。

参考

NSBundle Class Reference | iOS Developer Library