CocoaPods の利用手引き

現在 iOS アプリ開発において、ライブラリの導入には Swift Package Manager が標準となりつつあります。

CocoaPods の利用シーンは減りつつありますが、下位の iOS バージョンサポートや、様々な理由でライブラリのバージョンを上げることができない場面では、まだ利用が必須のシーンもあります。

iOS エンジニアの採用コードチェックにおいても利用されるケースがあって、その場合に警告を無視した状態で提出されることもあります。それに対するフィードバックを書いていましたが、以下の補足として、最初からこういうところに気をつけてほしい内容を記事としてまとめます。

[私が（iOS エンジニアの）採用でコードチェックする時何を見ているのか](https://qiita.com/lovee/items/d76c68341ec3e7beb611)

# チェック項目
- Swift Package Manager で導入できないか
- platform が指定されているか
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES が指定されているか
- master の参照が残っていないか
- Pods ディレクトリをリポジトリに含めていないか

## Swift Package Manager で導入できないか

まず、前述の通り、 Swift Package Manager で導入できるなら、 Swift Package Manager を利用しましょう。

導入したいライブラリが CocoaPods にしか対応していないなど特別な理由があって、 CocoaPods での導入を決めたなどのパッケージマネージャの選定理由があると嬉しいです。

## よくある警告

次に CocoaPods での導入となった場合、導入時の警告は可能な限り対応されていることが望ましいです。
対応しない場合は、こういった理由で対応していない、というコメントがコミットメッセージや PR に記録されていると安心です。
 
### platform が指定されているか

platform が未指定だと、以下の警告が出力されます。

```
[!] Automatically assigning platform `iOS` with version `15.0` on target `iOSEngineerCodeCheck` because no platform was specified. Please specify a platform for this target in your Podfile. See `https://guides.cocoapods.org/syntax/podfile.html#platform`.
```

Podfile にもコメント付きで指定方法が明記されています。

```
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
```

こうすれば良いです。

```
platform :ios, '9.0'
```

未指定なら iOS 15.0　が指定されますが、それを意図する場合でも、デフォルトの挙動が変わることもあるので、想定している OS バージョンを指定しておくと安心です。

## ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES が指定されているか

platform が未指定だと、以下の警告が出力されます。

```
[!] The `iOSEngineerCodeCheckUITests [Debug]` target overrides the `ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES` build setting defined in `Pods/Target Support Files/Pods-iOSEngineerCodeCheck-iOSEngineerCodeCheckUITests/Pods-iOSEngineerCodeCheck-iOSEngineerCodeCheckUITests.debug.xcconfig'. This can lead to problems with the CocoaPods installation
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.
```


二通りの対応が案内されています。

1. 親の設定を継承する
2. 設定を削除する

### 親の設定を継承する

```
  target 'iOSEngineerCodeCheckUITests' do
    inherit! :search_paths
```

### 設定を削除する

https://qiita.com/yum_fishing/items/fbdcab7e1ac62fcbe74f



## master の参照が残っていないか

`pod repo list` を実行した時に `cocoapods - Type: git (remotes/origin/master)` の部分で **master** の参照が残っているという警告になっています。

```
% pod repo list

cocoapods
- Type: git (remotes/origin/master)
- URL:  https://github.com/CocoaPods/Specs.git
- Path: /Users/ykws/.cocoapods/repos/cocoapods

trunk
- Type: CDN
- URL:  https://cdn.cocoapods.org/
- Path: /Users/ykws/.cocoapods/repos/trunk

2 repos
```

期待する結果は次の通りです。

```
% pod repo list

trunk
- Type: CDN
- URL:  https://cdn.cocoapods.org/
- Path: /Users/ykws/.cocoapods/repos/trunk

1 repo
```

`pod repo remove cocoapods` を実行することで期待する結果になります。

なお、警告のメッセージには `pod repo remove master` を案内されますが、

> [!] Your project does not explicitly specify the CocoaPods master specs repo. Since CDN is now used as the default, you may safely remove it from your repos directory via `pod repo remove master`. To suppress this warning please add `warn_for_unused_master_specs_repo => false` to your Podfile.

これを実行すると次のようなエラーとなると思います。

```
% pod repo remove master
[!] repo master does not exist
```

### 参考

> It has relation to this change which removes git repo and makes trunk default repository https://github.com/CocoaPods/CocoaPods/pull/8923 I have solved the problem by listing repos 'pod repo list' and then removing master 'pod repo remove' leaving only trunk
>
> https://stackoverflow.com/questions/65407287/your-project-does-not-explicitly-specify-the-cocoapods-master-specs-repo-warni

## Pods ディレクトリをリポジトリに含めていないか

各環境で `pod install` を実行するのであれば `Pods` はその時に生成されるためリポジトリには含めないのが慣習としてあります。その場合は Git リポジトリに含めると `git clone` の時に余計な時間がかかってしまいます。

もし Pods をキャッシュとして含める場合は、キャッシュとしている理由を添えて `pod install` を利用しない構築を想定していると思うので、その手順が明示されているとスムーズです。