Fastlane を使ってPush通知のpemファイルの有効期限が切れているアプリの情報をリストで出す

表題通りのTIPS。
Fastlaneの[ソースコード](https://github.com/fastlane/fastlane/blob/master/spaceship/lib/spaceship/portal/app.rb)を見れば分かるんだけど[ドキュメント](https://github.com/fastlane/fastlane/blob/master/spaceship/docs/DeveloperPortal.md)に載って無くて面倒なのでメモ。

# version
Fastlane 2.59.0


# lane

これ。

```Fastfile.rb
lane :fetch_should_update_pem_apps do
  rows = []
  index = 0
  Spaceship::Portal.login('YOUR_ID', 'YOUR_PW')
  Spaceship::Portal.select_team
  Spaceship::Portal.app.all.collect do |app|
    next if app.details.prod_push_enabled == true
    next if app.details.features['push'] == false
    p app.details.name
    p "> app.details.bundle_id: #{app.details.bundle_id}"
    p "> app.details.prod_push_enabled: #{app.details.prod_push_enabled}"
    p "> app.details.features[push]: #{app.details.features['push']}"
    p '------------'
    index += 1
    rows << [index, app.details.name, app.details.bundle_id]
  end
  table = Terminal::Table.new headings: %w[Index Target BI], rows: rows
  if rows.count != 0
    puts "\n #{table}".red
  end
end
```


## 説明

`app.details.prod_push_enabled` はPush通知のCertificateが設定されていないなどであればfalse
`app.details.features['push']` はPush通知の設定がONであればtrue。
つまり、 Certificateが設定されていないけどPush設定がされてて、Push通知の送信をしたそうに見えるアプリ一覧が以下の様に出力されます。

```
 +-------+----------------------------------------------------------------------------+-------------------------------------------------------------------------+
| Index | Target                                                                     | BI                                                                      |
+-------+----------------------------------------------------------------------------+-------------------------------------------------------------------------+
| 1     | hogeho hogeh                                                               | ffff.f.f..f                                                |
| 2     | hogehoge                                                                   | your.host                                                         
| 3     | aaaaaaa                                                                    | your domain                                                          |
```



# メモ

## 処理模索方法

> spaceship exposes both the Apple Developer Center and the iTunes Connect API.

より、Spaeshipを使えば情報の一括取得が出来る。
必要な処理は、ソースコードとドキュメントを見ながら処理を模索できる。
今回のでいえば、

```
$ fastlane spaceship 
Username: XXXXXXXXXXXXXXXXXXXx
[1] pry(#<Spaceship::Playground>)> all_apps = Spaceship::Portal.app.all
The current user is in 41 teams. Pass a team ID or call `select_team` to choose a team. Using the first one for now.
=> [#<Spaceship::Portal::App:0x2345524e5768>,
 #<Spaceship::Portal::App:0x3fa26ef334fd4>,
...
[2] pry(#<Spaceship::Playground>)> app = Spaceship::Portal.app.find("me.aaaaa.fccccc")
```

な感じで、 `Spaceship::Portal::App` のObject[^obujekutonandesuka]であることが分かる。
で、ドキュメントから安全そうなメソッドを呼びまくる。
すると、ファイル名がついてエラーがでる。

```
[3] pry(#<Spaceship::Playground>)> app.update_service
ArgumentError: wrong number of arguments (given 0, expected 1)
from /Users/hogehoge/.rbenv/versions/2.3.3/lib/ruby/gems/2.3.0/gems/fastlane-2.59.0/spaceship/lib/spaceship/portal/app.rb:156:in `update_service'
```
あとはそのソースコードを見れば何を隠し持ってるかすぐわかる。
この方法でファイル探しまくってるけど、ググった方が早そうであればググっても良いと思います。



[^obujekutonandesuka]: RubyってObjectっていうんでいいんですかね？


## Gemfileを利用している場合は

これが必要な場合がある。

```Gemfile
gem 'pry'
gem 'rb-readline'
```