Youtube Live 放送終了後の動画でチャットを見たかったが Youtube API を使っても見れない

ニコニコ生放送だとタイムシフトで見るときもコメントが見れるけど、 Youtube Live で放送終了後の動画はコメントが見れない。
API からコメントの取得くらいできないかと思って実際に API を叩いてみたがダメだった。

Youtube API

Youtube Live のコメントにアクセスするには、 liveChatId を取得する必要がある。
2段階のデータアクセスが必要。

  1. videoId を使って Videos: list API から liveChatId を取得
  2. liveChatId を使って LiveChatMessages API からチャットデータにアクセス

Youtube Live 放送中であればこれでチャットデータの取得が可能。

Youtube Live 放送後

Youtube Live が終わった後だと、まず liveChatId が取得できなくなる。

URL: https://www.googleapis.com/youtube/v3/videos?part=liveStreamingDetails&id=iEO1rjU16SY&key=YourApiKey

Live 中

Live 中はこのような Response。

{
 "kind": "youtube#videoListResponse",
 "etag": "\"aaaaaaa-jxt9MnFhfJsoACygTo\"",
 "pageInfo": {
  "totalResults": 1,
  "resultsPerPage": 1
 },
 "items": [
  {
   "kind": "youtube#video",
   "etag": "\"S8kisgyDEblalhHF9ooXPiFFrkc/0-Viv-YeQmW8wgR2wZnDPCBPXqY\"",
   "id": "iEO1rjU16SY",
   "liveStreamingDetails": {
    "scheduledStartTime": "2018-01-06T10:17:40.000Z",
    "scheduledEndTime": "2018-01-06T14:39:46.000Z",
    "activeLiveChatId": "Cg0KC2lFTzFyalUxNlNZ"
   }
  }
 ]
}

Live 終了後

actualStartTime, actualEndTime が増えて activeLiveChatId が消えているのがわかる。

{
 "kind": "youtube#videoListResponse",
 "etag": "\"aaaaaaa/KYex8I1p-jxt9MnFhfJsoACygTo\"",
 "pageInfo": {
  "totalResults": 1,
  "resultsPerPage": 1
 },
 "items": [
  {
   "kind": "youtube#video",
   "etag": "\"S8kisgyDEblalhHF9ooXPiFFrkc/0-Viv-YeQmW8wgR2wZnDPCBPXqY\"",
   "id": "iEO1rjU16SY",
   "liveStreamingDetails": {
    "actualStartTime": "2018-01-06T10:17:56.000Z",
    "actualEndTime": "2018-01-06T14:22:59.000Z",
    "scheduledStartTime": "2018-01-06T10:17:40.000Z",
    "scheduledEndTime": "2018-01-06T14:39:46.000Z"
   }
  }
 ]
}

あらかじめ liveChatId を取得して放送後に Chat API にアクセスしてみる

では放送中に liveChatId を取得しておいて、放送終了後にアクセスしてみるとどうなるか。

URL: https://www.googleapis.com/youtube/v3/liveChat/messages?part=snippet,authorDetails&liveChatId=Cg0KC2lFTzFyalUxNlNZ&key=YourApiKey

{
 "error": {
  "errors": [
   {
    "domain": "youtube.liveChat",
    "reason": "liveChatEnded",
    "message": "The live chat is no longer live."
   }
  ],
  "code": 403,
  "message": "The live chat is no longer live."
 }
}

403 が返ってきてチャットデータにアクセスはできなかった。

おわり

ということで、Youtube Live の放送終了後はチャットデータにアクセスができない。( activeLiveChatId って Response だし放送終了したら active じゃないなってしまう... )

もしかしたら Youtube Live のチャットデータは DB に残っておらず放送終了後に消えてしまっているのかもしれない。もし DB に残っているのであれば API でだけでもチャットデータにアクセスできると嬉しいのだが。

もし放送後にもチャットデータを参照したいのであれば、放送中にデータを保存しておくしかなさそう。

ssh 経由で fastlane match できるようにする

$ ssh my@mac.com
$ bundle exec fastlane match
...

[12:19:58]: Enter the passphrase that should be used to encrypt/decrypt your certificates
[12:19:58]: This passphrase is specific per repository and will be stored in your local keychain
[12:19:58]: Make sure to remember the password, as you'll need it when you run match on a different machine
[12:19:58]: Passphrase for Git Repo: *********
[12:20:12]: Type passphrase again: *********
security: SecKeychainAddInternetPassword <NULL>: User interaction is not allowed.
[12:20:15]: Couldn't decrypt the repo, please make sure you enter the right password!

match のパスワードは正しく入れているのになにやらエラーが出ている。ssh じゃなくて直接ログインして match は成功するので ssh 経由なのが問題っぽい。

security unlock-keychain

どうやら keychain を unlock しないといけないっぽい、 ssh 経由だと keychain にアクセスできなくなっているようだ。

下記のコマンドを実行後に fastlane match した Passphrase のところはうまくいった。

$ ssh my@mac.com
$ security unlock-keychain -p <YourPassword> ~/Library/Keychains/login.keychain

superuser.com

WARNING: fastlane requires your locale to be set to UTF-8.

しかし次のようなエラーが出た

[12:20:32]: WARNING: fastlane requires your locale to be set to UTF-8. To learn more go to https://docs.fastlane.tools/getting-started/ios/setup/#set-up-environment-variables

どうやら sshUTF-8 になってないっぽい。
ssh 接続元マシンの ssh config に UTF-8 で繋ぐように設定した。

Host *.hoge.com
  SendEnv LANG LC_ALL=en_US.UTF-8

おわり

これで万事解決。

jenkins などでビルド環境作るときはおきまりの手順っぽいけど、気軽に unlock-keychain していいものか不安である。

参考

2017 年振り返り

2017 年色々あった。

日報

1月から wikihub で日報を書き始めて、ずっと続けている。
nippo つながりで友達もできたし、ざっくりとだけど毎日アウトプットにもなったし良かった。

nippo.wikihub.io

GitHub

f:id:star__hoshi:20180101013110p:plain

約 4000 Commit だったのでまあまあやった方だと思う。
8月以降は基本的に毎日やっていて、会社より家の方がコード書いていた気がする。

OSS

VIPER 勉強の為に作ったアプリを公開したり、ライブラリを作ったり、fastlane の設定を公開するなどした。

登壇

6回勉強会で登壇した。去年まで1回もしたことなかったので頑張ったと思う。
Presentations by star__hoshi // Speaker Deck

特にこれは950ブクマくらいついてバズって嬉しい。
この登壇資料作っている時はマジで辛くて、こんなくそみたいな発表誰が喜ぶんだ発表したくないと思っていた。でもいざ発表したらバズって、あまり考えすぎずにもっとアウトプットすべきなのだろうな、と気が楽になったのを覚えている。

blog / Qiita

この blog に 75 記事、 Qiita に 50 記事書いたので結構アウトプットした気がする。
しょうもない記事も多いけど 2018 年も気楽に書いていこうと思う。

既存のサービスを組み合わせて本質的な開発に集中する という記事がホッテントリ入って良かったけど、これは表面を撫でるだけの浅い記事なのでもっと深い記事をかけるようになりたい。

また、 モバイルアプリアーキテクチャ勉強会 - Qiita を書くのにあたって色々調べて DI やテスト、疎結合など色々詳しくなれてとても勉強になった。

個人的には人間だものという記事が一番好きで、これは今でも毎日思っている。
布団に入って色々思い詰めて最終的には「人間だもの、気楽に生きよう」と思って就寝する日々、気楽に生きたい。

starhoshi.hatenablog.com

Twitter

star__hoshi_dev というアカウントを作った。star__hoshi はフォロワー多いしあんま雑なツイートしたくないという気持ちがあって、逆に star__hoshi_dev は雑になんでもツイートできるアカウントになっている。

star__hoshi はタイムライン早くて追えないけど dev の方は追えるし人数少ないからコミュニケーション増えたり、昔のツイッターこんなだったなって懐かしさがあってこのアカウントばかり使っている。アイコンや名前を毎日変えたり好き勝手やっている。

twitter.com

転職

前の会社を10ヶ月くらいでやめて8月からクックパッドという会社で働いている。

starhoshi.hatenablog.com

内定出た時はモバイル基盤という部署に行く予定だったのだが、やっぱサービス作りたいという気持ちになりいまは新規事業をやっている。 Firebase を使っており iOS エンジニアだけでサービスを作っている。

転職して給料は上がり労働時間は減り勤務体系がフルフレックスになり自宅勤務可になり周りのレベルも高くとても良い。とても良いのだが周りに引けを取らないように頑張らないと... という感じで気を張り詰めてしまいなんか疲れている。

個人開発

今年はアプリを 3 つリリースした。
新しいアプリを作るというより ダメージ計算Z の開発と機能追加をやるのが主な一年だった。
アプリの評価もそこそこいいし、頑張って作った甲斐があった。リリースした時に App Store のトレンドに載ったのが嬉しかった。

ライバロリ氏にツイートしてもらえたのも嬉しかった。

ダメージ計算Z for ポケモン ウルトラサンムーン

ダメージ計算Z for ポケモン ウルトラサンムーン

  • Kensuke Hoshikawa
  • ユーティリティ
  • 無料

個人チーム開発

2016年振り返り でも書いているが、チームでサービスを作るというのをやっていた。

しかし権利的にまずそうだったり仕事が忙しかったり気持ちがついてこなかったり、なんやかんやあって結局リリースされずになってしまった。

チーム開発、楽しいし勉強にもなるけど熱量の差や考え方の違いなどやはり人間的なところで難しさも出てくる。仕事と違って任意での開発になるし余暇の過ごし方は人それぞれだし難しい。難しいけどチームでやることの可能性みたいなのもあるしまた何かやれたらなとは思っている。

2018年

仕事はとりあえず 4 月にリリースが迫っているのでそれに向けて頑張る。
また、チームの方針としてアウトプットどんどんしていきましょう、というのがあるのでやっていきたい。特に自分はライブラリを作って公開などあまりしていないのでそこをもっとやりたい。

やりたいということもあるのだが、この記事でも何回も出てきている 気楽に生きる というのをやりたい。もっと気軽に何かをやったり何かをやめたりしたい。
別に仕事をサボりたいとか勉強をやらないということじゃなくて、圧倒的成長とか一発当てるとかじゃなくてゆるく生きたい。

今年もよろしくお願いします。

既存のサービスを組み合わせて本質的な開発に集中する

qiita.com

個人開発アドベントカレンダー9日目です! (2週間遅れです... 🙏)

一年前に開発してた Web サービスで、このような構成の開発をしていました。

f:id:star__hoshi:20171219234544p:plain

個人開発はとにかく時間が足りないので、既存のサービスを使える場合はそのサービスを使って開発を行いました。

開発していたものは結局リリースしなかったのですが、CI や SaaS を使い快適に開発できたので、使っていたサービスや構成について書いていきます。

これは個人開発での遊びであり、これで商用サービスもいけるかというとわかりません。
(それと私は iOS エンジニアであり、サーバサイドは門外漢です)

サービス概要

Lastfm のような、音楽を再生したらその履歴をとって何回再生したか、いつどこで再生したかなどを自分が聞いた音楽を歴史として遡れるようなアプリを作っていた。

メインの技術スタックは Rails + Heroku で、 Client 側は Android アプリ。
私が Rails の開発をし、 Android は自分ではなく @sjnyas 氏が開発していた。

料金

リリースする前のプロトタイプ開発だったのでお金を払っていたのは一部サービス。

ちゃんと運用しようと思ったら Heroku などでもっとお金がかかると思う。

使っていたサービス

ZenHub

GitHub を拡張して使いやすくしてくれるサービス。
Issue をタスクボードに並べることができるので、それを重宝して使っていた。

f:id:star__hoshi:20171220005147p:plain

バーンダウンチャートなども見れて大変便利。

f:id:star__hoshi:20171220005218p:plain

GitHub

ソース管理は GitHub でやっていた。BitBucket なら無料だけど、Integration の手軽さや使いやすさなどは GitHub の方が良い。

CircleCI と連携していたので、テストが通らないとマージできないようにしていた。

f:id:star__hoshi:20171220010541p:plain

CircleCI

Rails でテストを書いていたので、テストの実行とマージ後の Heroku への Deploy をやってもらった。

Rails 開発で GitHub に Push して CircleCI のテストが通ったら Heroku に deploy する - star__hoshi's diary

また、 Gem を常に最新にしたかったので、 bundle update を毎日動かして PR を出す仕組みも作った。

starhoshi.hatenablog.com

Heroku

サーバサイドは Heroku で構築した。
自分は iOS エンジニアでインフラはわからないしメンテナンスもしたくないので Heroku の上で Rails を動かしていた。Enterprise じゃない場合はサーバが海の向こうにあるので早くはないが、 heroku deploy するだけでアプリケーションが動くのは素晴らしい。

Heroku addons

ボタンぽちぽちしたりちょっとコード追加するだけで色々なサービスと連携できる。

f:id:star__hoshi:20171220014354p:plain

Rollbar

エラー監視、レポートサービス。

Rails でエラーが出たらそれの集計をしてくれる。
Slack への通知もしてくれたり、 GitHub に issue 立てたりができる。

f:id:star__hoshi:20171224205825p:plain

papertrail

サーバログが見れるサービス。

heroku logs でも見れるけど、それよりも見やすい。
過去のログを検索したり、検索に引っかかったら slack 通知を飛ばすとかができる。
status:5 がログに流れてきたら slack に通知を飛ばす設定をしていた。

f:id:star__hoshi:20171224210733p:plain

New Relic

Rails のパフォーマンスが見れる。
どのコントローラが遅いかとか、DB が遅いとか、どの処理で時間かかってるか見れるのでボトルネックの解消に使える。

f:id:star__hoshi:20171224220559p:plain

CloudFlare

ドメインはお名前.comでとり、それのネームサーバや CDN として使っていた。

f:id:star__hoshi:20171224221907p:plain

また、プロトタイプ開発だったので SSL 化もこれでやった。(本リリース時にはちゃんと SSL 証明書とらないとまずい)

uzulla.hateblo.jp

Firebase

Timeline 機能として Firebase Realtime Database を利用した。

Rails5 で WebSocket を ActionCable でなく Firebase でやった話 - star__hoshi's diary

BITRISE

モバイルに特化した CI サービス。
Android アプリのβ版配布に利用していた。

qiita.com

Bluemix

heroku みたいに使える PassS。
slack から github issue を立てられるようにしたり、 slack 経由で deploy できるようにしていた。

qiita.com

Slack

アプリのβ配布、サーバのエラー、GitHub の更新など、基本的に何か起きたら全て Slack に通知が来るようにしていた。

おわり

個人開発だったので余計なことは気にせず色々と使いたいサービスを使って開発ができた。

テスト書いたり、 CI 環境整備したり、 Slack に通知を飛ばしたり... 前々職はお堅い会社でクラウドサービスなど全然使えなかったので、モダンな開発はこんな感じなのか〜というのを個人開発で経験できてよかった。

TypeScript で `error TS2300: Duplicate identifier` がでたが yarn にしたら治った

npm ライブラリを install して tsc したらこんなエラーが大量に出た。

node_modules/@google-cloud/firestore/types/firestore.d.ts(28,15): error TS2300: Duplicate identifier 'DocumentData'.
node_modules/@google-cloud/firestore/types/firestore.d.ts(35,15): error TS2300: Duplicate identifier 'UpdateData'.
...略
node_modules/firebase-admin/node_modules/@google-cloud/firestore/types/firestore.d.ts(28,15): error TS2300: Duplicate identifier 'DocumentData'.
node_modules/firebase-admin/node_modules/@google-cloud/firestore/types/firestore.d.ts(35,15): error TS2300: Duplicate identifier 'UpdateData'.
...略

解決策を先に言うと npm から yarn に乗り換えたらこのエラーが出なくなった。

$ rm packege-lock.json
$ rm -rf node_modules
$ npm i -g yarn
$ yarn
$ yarn run build          # tsc する

これだけで解決した。

原因

依存関係が Duplicate してしまっていたぽい。

  • package.json
    • pring.ts
    • firebase-admin

みたいに @google-cloud/firestore が2箇所から呼ばれて、それを npm がうまく解決できずどちらも install してしまい、その中に型定義があるため型定義が2回呼ばれて Duplicate identifier になっていたっぽい。

社の若者に「そのエラーつらそうだけど yarn にしたら治りそう」という助言をもらって yarn にしたら解決した。
yarn の方が賢いっぽい。

JavaScript でテストを書く時のライブラリについて調べた

1年半前は 業務 とか 趣味 で TypeScript を使ってテストも書いてたんだけど、最近は iOS ばかりで忘れてしまっていた。

けどまた仕事で同じような環境を作ったので、テストを書くときにどういう Framework があって役割は何かをメモっておく。

テストフレームワーク

テストを書くために必要なライブラリ。
iOS でいったら Quick や XCTest, Rails でいったら rspec とかが該当する。

アサーションライブラリ

iOS でいうと Nimble が該当する。
XCTest や rspec には組み込みで入っている。

mock / stub / spy

sinon 以外に話題に上がっているのを見なかったので、デファクトスタンダードだと思っていいのかもしれない。

テストランナー

コマンドラインでテスト実行したらブラウザが開いて〜みたいなのができるっぽい。

用途に合わせて構成を決める

自分はモックやテストランナーは不要だけど TypeScript を使っているので mocha + power-assert + espower-typescript という構成になった。
今後モックしたくなったら sinon を追加すると思う。

ReactNative とかでがっつりテスト書くなら jest は良さそうだし、ブラウザでテストをするなら Karma などが必要かもしれない。
その辺は人によって違うので各自選ばないといけない。

参考

PlantUML でシーケンス図を書いたがめっちゃ良かった

PlantUML

シンプルなテキストファイルで UML を作ることのできる、オープンソースのツール

今までは astah とかでユースケース図とかシーケンス図書いてたんだけど、 GUI で書くの辛いなと思って PlantUML というのを使ってみた。

コードで UML を書ける、今回はシーケンス図を書いたけどユースケース図やフローチャートなども書ける。

環境構築

Web のエディタだと PlantUML Editor というのがある。

けどローカルでやりたかったので VSCode の拡張を入れた。

marketplace.visualstudio.com

これを入れるだけ、シンタックスも効くようになって良い。
Java, Graphviz などを入れておけとあるけど、特に何もせず使えているので別アプリケーション経由でインストールされてたのかもしれない。

拡張子は .pu, .plantuml, .wsd などあるっぽいが .pu にしている。

書いてみる

記法

今回自分が使ったやつだけ。
シーケンス図の構文と機能 に網羅的に書いてあるけど多すぎて使いこなせていない。

  • 登場人物の宣言
    • 表示形式や表示順などを最初に定義できる
      • actor Hoge
      • database Fuga
  • 矢印
    • -> は直線、 --> は破線
    • Hoge -> Fuga: description
    • Fuga --> Huga
  • 動作中を示す表示
    • activate, deactivate で動作中を示せる
      • activate Hoge
      • deactivate Fuga
  • メモ
    • note, hnote でメモが書ける
    • note は四角、 hnote はひし形
    • left of, right of, over で位置を指定できる
      • note left of Hoge: desc
      • note right of Fuga
      • note over Hoge
  • タイトル
    • == で文字を囲むとタイトルになる
        • == タイトル ==

この 5 つの要素を覚えるだけでいいシーケンス図がかけた。

サンプル

@startuml

actor GameManager
database Application
database Database
actor User

== マスタデータ更新 ==

GameManager -> Application: データ登録
activate GameManager
activate Application

note over GameManager: 処理中は画面操作できない

Application -> Database: Insert
activate Database

Database --> Application: Success
deactivate Database

Application -> Application: データ加工

note right of Application #aqua
攻撃力↑↑
end note

Application -> Database: Insert
activate Database

Database --> Application: Success
deactivate Database

Application --> GameManager: Complete
deactivate Application
deactivate GameManager

== データ表示 ==

User -> Application: データ取得
activate User
activate Application

hnote over User : 読み込み待ち

Application -> Database: select * from item
activate Database

Database --> Application: result
deactivate Database

Application -> Application: jsonize

Application --> User: render json
deactivate User
deactivate Application

@enduml

f:id:star__hoshi:20171208181929p:plain

iOS Test Night #6 1周年 まとめ #ios_test_night

testnight.connpass.com

iOS Test Night #6 にブログ枠として参加したので、そのレポートです。 ㊗️ 1周年 🎉

開始前の挨拶として、Qiita に投稿された iOS のテスト関連の記事がこの一年で増えたのか? という話から始まりました。
結果として、増えはしたけどそこまで増えていないということで、今後も勉強会を通して iOS のテストをもっと盛り上げていくぞ 💪 とのことでした。

発表

Appiumで行う対話的テスト by @alligator_tama

TODO: 公開されたら資料はる

Appium で 2 つのアプリを立ち上げて、それらのアプリを対話的に実行させテストを行う、という内容。
Xcode9 から iOS Simulator が複数立ち上げられるようになってできるようになり、Appium の実行時に Port 番号を指定するだけで複数 Simulator を立ち上げることができる。

実際に 2 つのアプリが連携するデモが行われました。

Quick / Nimble をより快適に使うために by @tobi462

  • Quick / Nimble をライブコーディングを交えながら快適に使うはなし
    • Quick の概要や rspec のように構造的なテストにかけることのメリットの話や、 assertion ライブラリの Nimble についての話。
    • Nimble は英文のように読めるし、エラーメッセージもわかりやすく出力されるというメリットがある。
  • しかしメリットだけではなくデメリットもあって
    • 学習コストがかかる、ドキュメントの量も結構ある
    • BDD フレームワークの慣れが必要
    • 補完が微妙
      • Quick の expect ではなく XCTest の expect が出てきてしまったり、メソッドチェーンが切れると補完が効かない
  • これらのデメリットはラッパーを作ったり、スニペットを作って補完を改善できた。

fastlane snapshotの並列実行についてまとめた by @tarappo

fastlane snapshot の速度改善のはなし。

snapshot は指定端末・言語でスクショを簡単に取ることができるもの。snapshot は端末数・言語数が増えるほど実行時間が増加する。
今までの改善策はマシン3台用意するなど、金で殴っていた。

しかし Xcode9 から Simulator の並列実行ができるようになった、snapshot の設定を concurrent_simulators: true にするだけで良い。端末は devices で指定する。

MacPro (6コア) で並列実行した結果、5台同時起動する場合は 2 倍早くなったのでとりあえず並列実行するのが良さそう。

LT枠

assertion を積極的に使って役だった話 by @kboy_silvergym

筋肉 (assertion) の話。

  • assertion はわざとクラッシュさせること。
  • Assert, precondition, fatalError などがある。
  • assertion する目的は、実装漏れを防ぎたい、不安なところに念のため書いておく。
  • 実装もれを防ぐ
    • id == 0 だったらおかしい!
    • enum で絶対に通らないであろうところに assertionFailure()
  • 実際に防げた
    • サーバから uid というパラメータをサーバからもらえなかったことに気がつけた

未来のエンジニアのために assertion を残すというのはとても良さそう。

iOSシミュレータでのUIテストの様子を録画してみよう by @Kesin11

  • UITest は時間がかかるのと、テストが落ちた時にスクショを撮ってくれるけどなんでテストが落ちたのかわからない…。
    • なのでスクショじゃなくて録画したい。
  • QuickTime
    • コマンドからできないし不便
  • recordVideo

Test Nightきっかけでテストをはじめた人の発表枠

Mocking With Firebase by @d_date

TODO: 資料公開されたらはる

Firebase Realtime DB のテストについての話。

  • ターゲットで読み込むファイルを変えることでモック化する。
  • インターフェイスを同じにして処理を変えてテストをする。

プロジェクトの1ファイルにテストを書いてみた! 〜本当にこれで合ってるの…??〜 by @takattata

XCTest で CleanArchitecture のテストをかいてみたり、Firebase をモックしたり、RxSwift でテストを書いてみたけど本当に正しいのかわからんのであとでみんなに教えてほしい、みたいな感じだった。

何故テストが書けないのか by @fromkk

techblog.timers-inc.com

個人アプリなのでテストは書いてない。というかそもそもテストをかける設計になっていない。
なので設計を見直して適切に継承するようにした。

(自分の個人アプリもシングルトン + FatViewController + Realm + ノーテストなので心が痛かった... )

iTunes Connect に Upload 後の bitcode 再コンパイルでエラーが出た

iTunes Connect にバイナリのアップロードは完了したんだけど、 iTunes Connect: Processing stopped for HogeApp みたいなメールが来た。 何か問題があって bitcode の再コンパイルが止まってしまったようだ。

メール全文:

iTunes Connect: Processing stopped for HogeApp

Dear Kensuke Hoshikawa,

While processing your iOS app, HogeApp, errors occurred in the app thinning process, and your app couldn’t be thinned. If your > app contains bitcode, bitcode processing may have failed. Because of these errors, this build of your app will not be able to be submitted for review or placed on the App Store. For information that may help resolve this issue, see Tech Note 2432.

Regards,

The App Store team

解決策: 再アップロード

なんとなく再度バイナリアップロードしたら直る気がしたので、再アップロードした。
そしたら次は has completed processing の連絡が来た。

まあよくありますよね、 Apple 様の機嫌が悪かったようだ。

Tech Note 2432

メール本文には Tech Note 2432 に対処法が書いてあるから見てくれって書いてある。
今回は再アップロードで済んだけど、本当に何か問題がある場合は修正が必要になりそう。

参考

iTunes Connect に Upload しようとしたら Info.plist 関連で怒られた

f:id:star__hoshi:20171202012835p:plain

Unable to process application at this time due to the following error: This bundle is invalid. The Info.plist file is missing or could not be parsed. Please check it for embedded control characters..

iTunes Connect にバイナリアップロードしようとしたらこんなエラーがでた。
Info.plist が見つからないか、パースができないよ、と書かれている。

しかし Info.plist は問題ないし plist のフォーマットも問題なさそう。

ググる

ここに書いてる問題ではなさそう...。

LaunchScreen

Info.plist を眺めてみると、UILaunchStoryboardNameLaunch Screen になっている、正しくは LaunchScreen だった。
このスペース 1 つでエラーが出ていた、スペースを消したら無事提出ができた。

The Info.plist file is missing or could not be parsed. と書いてあって、 Info.plist そのものには問題がなくても UILaunchStoryboardName などがちゃんと設定されてないとうまく読み込めずこのエラーが出てしまうようなので注意しましょう。