1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

アプリの動作環境ごとに「ファイル」からのディレクトリ内閲覧許諾を切り替える

Last updated at Posted at 2020-12-14

この記事は株式会社シンプルウェイ 2020 アドベントカレンダーの参加記事です。
https://qiita.com/advent-calendar/2020/simpleway

概要

Xcodeプロジェクトにおいてinfo.plistに

  • LSSupportsOpeningDocumentsInPlace
  • UIFileSharingEnabled

をそれぞれtrueに設定することで、アプリ内ディレクトリの中を「ファイル」アプリで閲覧することができる。
検証環境でアプリを動かした際に、データが正しく保存されているか等確認するのに役に立つ。
一方で、本番でユーザーに閲覧されてしまうと、アプリ内ディレクトリのファイルの削除等も出来てしまうため、
アプリの意図しない動作を引き起こす可能性がある。
そのため、ビルド環境ごとに権限を切り替えるようにしたい。


前置き

ここでは、アプリの環境を

  • 開発:Debug
  • 検証:Staging
  • 本番:Release

の3つが存在するとして進めます。

方法

普通、info.plistの値を環境毎に切り替えるには、
Build Settings内でUser-Definedパラメータを追加して、その値をinfo.plistの値に紐付ければよい。
だが、User-DefinedパラメータにBool値を持たせることができないため、この方法が使えない。

そのため、アプリのビルド時にスクリプトでinfo.plistを書き換える必要がある。

手順① PreProcess info.plistを有効にする

Build SettingsのPackages項目の「Preprocess info.plist File」パラメータをYESにする

preprocess.png

これをYESにすることで、

  • info.plistがBuild Phasesの他の何よりも先に作成される。
  • 通常のInfo.plistと別に${TEMP_DIR}/Preprocessed-Info.plistという名前で別のInfo.plistが作成されるようになる。

あとは、Run ScriptでそのPreprocessed-Info.plistのほうを編集すると、それがアプリに即反映される。

手順② Run Scriptにてスクリプトを記述する

Build Phasesにおいて左上の+からRun Scriptを新規作成する
作成したらスクリプト記述欄に以下のように書く

# plist編集の準備
plutil="/usr/bin/plutil"

# 先述したPreprocessed-Info.plistを編集する
infoPlistFileDestination="${TEMP_DIR}/Preprocessed-Info.plist"

# ビルド環境によってファイル閲覧許諾を切り替える
# こうすることで検証時のディレクトリ内確認ができ、かつ本番ではOFFにできる
$plutil -remove 'LSSupportsOpeningDocumentsInPlace' $infoPlistFileDestination
$plutil -remove 'UIFileSharingEnabled' $infoPlistFileDestination

echo ${CONFIGURATION}
if [ ${CONFIGURATION} == "Debug" ] || [ ${CONFIGURATION} == "Staging" ]; then
$plutil -insert 'LSSupportsOpeningDocumentsInPlace' -xml '<true/>' $infoPlistFileDestination
$plutil -insert 'UIFileSharingEnabled' -xml '<true/>' $infoPlistFileDestination
else
$plutil -insert 'LSSupportsOpeningDocumentsInPlace' -xml '<false/>' $infoPlistFileDestination
$plutil -insert 'UIFileSharingEnabled' -xml '<false/>' $infoPlistFileDestination 
fi

こうすることで、ビルド直前にinfo.plistの値を書き換えて環境毎にパラメータを変えられる。

※CONFIGURATIONの値はプロジェクトのConfiguration設定によって変わるので確認する。echoの値でも確認できる。
このRun Scriptで出力したechoの値はXcode左メニューのReport Navigatorで確認できる。
echo.png

手順③ Run ScriptのInput FilesにPreprocessing-Info.plistを追加する

②で作ったRun ScriptのInput FilesにPreprocessing-Info.plistを追加する。
理由はこちらの記事が詳しく解説していただいています。

inputFiles.png

手順④ Run ScriptをCopy Bundle Resourcesより前に配置する

Run ScriptをCopy Bundle Resourcesより前にドラッグ・アンド・ドロップで配置する。

seq.png

ここまで行ったら、それぞれの環境ごとにビルドして、

  • 開発・検証 → 「ファイル」アプリの「このiPhone内」にビルドしたアプリが表示される
  • 本番 → 「ファイル」アプリの「このiPhone内」にビルドしたアプリが表示されない

となるか確認して完了。

参考にさせていただいた記事

Xcode10以降でBuild PhasesのRun ScriptでInfo.plistが加工できない
コマンドラインでplistを操作(データ追加・編集・削除)
Configurationによってinfo.plistを書き換えてATSの有効/無効を切り替える
これがXcodeでのバージョニングの決定版になるかも

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?