酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

CocoaPods 1.0を導入後、JenkinsでCocoaPodsを含んだiOSアプリプロジェクトのビルドで署名に失敗してしまう

こんにちは、ビルド職人です。去年の今頃、このような記事を書きました。

CocoaPods 1.0にしたらこの現象が再発してしまいました。

=== BUILD TARGET DZNEmptyDataSet OF PROJECT Pods WITH CONFIGURATION Release ===

Check dependencies Code Sign error: Provisioning profile does not match bundle identifier: The provisioning profile specified in your build settings (“XXXXXXXX Ad Hoc”) has an AppID of “jp.ch3cooh.*” which does not match your bundle identifier “org.cocoapods.DZNEmptyDataSet”.

延々と悩んでいたのですが、ようやく対応できそうなので要点をまとめておきます。

CocoaPods 1.0以前にはpod install時に生成されるInfo.plistのBundle ID部分(CFBundleIdentifier)がorg.cocoapods.hogehogeになっていました。なので以前書いた記事の通りBundle IDをアプリ書き換えでうまく動いていました。

しかし、CocoaPods 1.0になって生成されるInfo.plistのBundle ID部分が下記のように変わったようです。

  <key>CFBundleIdentifier</key>
  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>

このためBundle IDの書き換えがうまくいかなかったようです。Xcode 7から導入された仕組みなのですがそれ以前に作成されたプロジェクトの場合にはフォローが必要なようです。

アプリのプロジェクト側でPRODUCT_BUNDLE_IDENTIFIERが指定されていない場合には、Info.plistと同じフォルダに入っているhogehoge.xcconfigの中にデフォルトの値が設定されています。

DZNEmptyDataSetの一例ですが下記のような感じです。

CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/DZNEmptyDataSet
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public"
OTHER_LDFLAGS = -framework "UIKit"
PODS_BUILD_DIR = $BUILD_DIR
PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES

解決しました

以上のことを踏まえてPodfileを修正しました。

post_install do |installer|
    # change bundle id of each pod to '${BUNDLE_ID}.*'
    bundle_id = 'jp.ch3cooh'

    # for xcconfig
    directory = installer.config.project_pods_root + 'Target Support Files/'
    Dir.foreach(directory) do |path|

        full_path = directory + path
        if File.directory?(full_path)

            Dir.foreach(full_path) do |path2|

                if path2.end_with?(".xcconfig")
                    xcconfig_path = full_path + path2
                    if File.exist?(xcconfig_path)
                        puts xcconfig_path
                    
                        text = File.read(xcconfig_path)
                        new_contents = text.gsub('org.cocoapods', bundle_id)
                        File.open(xcconfig_path, "w") {|file| file.puts new_contents }
                    end
                end
            end
        end
    end
    
    # for project.pbxproj
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = bundle_id + '.\${PRODUCT_NAME:rfc1034identifier}'
        end
    end
end

これでorg.cocoapods.hogehogeになっている部分をjp.ch3cooh.hogehgoeに書き換えることができました。

ここまでやってる人は他にはいないと思うので、正しい対処方法を模索すべきなんだろうけどよくわからない。