watchアプリで「A signed resource has been added, modified, or deleted.」となったときの対処法


現象

watchアプリを実機にインストールしようとすると、「App Installation failed. A signed resource has been added, modified, or deleted.」というエラーがでる。

simulatorでの実行やiOSアプリ単体での実行は問題なくできる。

cleanしたり、DerivedData消したり、provisioning profileを一回消して入れ直したりとかやってたら、一度直ったけど、その後また再現して今度は直らなくなった。

※Xcode8.2.1, watchOS3.1で確認

対処法

watchOSから利用するフレームワークは、Carthageの利用をやめ、Cocoapodsを使う。

Using copy-frameworks for watch extension causes "A signed resource has been added, modified, or deleted" Xcode error · Issue #1272 · Carthage/Carthage にあるように、Carthageのcopy-frameworkが原因っぽい。

↑のissueに書いてある方法だと、別のエラーでたり、実行時にFrameworkが見つからなかったりしたので、Cocoapodsを使ったら、ひとまず無事に実機インストールできた。

ググったり、Twitter検索したりすると、Cocoapodsでも過去に同様の現象はあったようだが、少なくとも自分が試したv1.1.1では今のところ問題ない。

ここまでたどり着くのにトータルでまる1日ぐらい費やしてしまった。。。

Cocoapodsだとbitcode注意

iOSではbitcodeを無効にしていても、watchOSではbitcode必須となる。そのため、watchOS側で利用するフレームワークは ENABLE_BITCODEYES にする必要がある。

post_install do |installer|
  installer.pods_project.targets.each do |target|
    # watchosではbitcode必須
    watchos_targets = ['Pods-HogeWatch Extension', 'Alamofire', 'SwiftyBeaver', 'SwiftDate']
    target.build_configurations.each do |config|
      config.build_settings['ENABLE_BITCODE'] = watchos_targets.include?(target.name) ? 'YES' : 'NO'
    end
  end
end