読者です 読者をやめる 読者になる 読者になる

URL Scheme の追加と Configuration によって変更する方法

環境:
Xcode8.3.2
Swift3

URL Scheme の追加

Target -> Info -> URL Types から URL Scheme を追加する。
まだ何も追加していない状態。
f:id:xyk:20170517122753p:plain

+ボタンを押して以下を追加した。

identifier: com.example.myapp
URL Schemes: myapp

f:id:xyk:20170517122758p:plain

Info.plist に URL Types の項目が追加された。

f:id:xyk:20170517123322p:plain

Info.plist のソースコードを直接見ると以下のようになっている。

 <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeRole</key>
            <string>Editor</string>
            <key>CFBundleURLName</key>
            <string>com.example.myapp</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>myapp</string>
            </array>
        </dict>
    </array>

Configuration によって URL Scheme を変更する

Release 環境では上で設定したmyappでよいが、Debug 環境ではmyapp-debugに変更したい。
そこで Run Script を使ってコンパイル時に自動で更新させる。

シェルコマンドは Run Script の入力欄に直接を書いてもよいのだがproject.pbxprojに埋め込まれてしまうので別ファイルに切り出すことにする。
以下のようにScirptsディレクトリを作成し、そこにシェルスクリプトファイルを置いた。

f:id:xyk:20170517121830p:plain

シェルスクリプトの中身。CONFIGURATIONDebugのときのみ書き換えるようになっている。
URL Schemes は複数設定できるが今回は1つ目に設定されたものを更新対象にしているので注意。

#!/bin/sh

if [ ${CONFIGURATION} = "Debug" ]; then

lower_conf=`echo ${CONFIGURATION} | tr 'A-Z' 'a-z'`
myapp_url_scheme="myapp-$lower_conf"
info_plist_file_path="${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/Info.plist"

/usr/libexec/PlistBuddy -x -c "Set :CFBundleURLTypes:0:CFBundleURLSchemes:0 $myapp_url_scheme" "$info_plist_file_path"
updated_myapp_url_scheme=`/usr/libexec/PlistBuddy -c "Print CFBundleURLTypes:0:CFBundleURLSchemes:0" "$info_plist_file_path"`

echo "MyApp URL Scheme set to: $updated_myapp_url_scheme"

fi

Build Phasesから新たな Run Script を追加する。

f:id:xyk:20170517121820p:plain

追加する箇所はcompile sourcescopy bundle resourcesフェーズの終わった後。

f:id:xyk:20170517121823p:plain

Run Scriptのところをクリックすると名前が変更できる。ここでは以下のように変更した。

f:id:xyk:20170517121826p:plain

先ほど作成したシェルスクリプトを実行させる。

. ${PROJECT_DIR}/Scripts/url_schemes.sh

f:id:xyk:20170517125509p:plain

そしてビルドを実行する。
変更されているか Info.plist を確認。

${TARGET_BUILD_DIR} 以下の Info.plist のパス

~/Library/Developer/Xcode/DerivedData/MySample-gbqatlezfkhslgeiregazsgqloel/Build/Products/Debug-iphonesimulator/MySample.app/Info.plist

myapp-debugに書き換わっている。

 <key>CFBundleURLTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeRole</key>
            <string>Editor</string>
            <key>CFBundleURLName</key>
            <string>com.example.myapp</string>
            <key>CFBundleURLSchemes</key>
            <array>
                <string>myapp-debug</string>
            </array>
        </dict>
    </array>

Run Script の実行結果はCmd + 8開く Report Navigator に表示されるのだが、echoコマンドで出力したログはAll Issuesには出ないのでAll Messagesの方で確認する。

f:id:xyk:20170517131033p:plain

ちなみに

echo "error: xxx"
echo "warning: xxx"

という書き方をするとAll Issuesの方にもログが出力される。

Fastlane で URL Scheme を更新するやり方は以前書いた。

xyk.hatenablog.com