Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

iOS版でApp Storeにサブミットすると問題がありと指摘され受取拒否される。 #715

Open
1 of 4 tasks
nekomimimi opened this issue Dec 27, 2023 · 13 comments
Labels

Comments

@nekomimimi
Copy link
Contributor

nekomimimi commented Dec 27, 2023

不具合の内容

手元で動いてるVOICEVOXライブラリを含んだiOS版アプリをApp StoreにサブミットするとUploadが完了するがその後、
ITMS-90426: Invalid Swift Support - The SwiftSupport folder is missing. Rebuild your app using the current public (GM) version of Xcode and resubmit it.
と指摘があり受取を拒否される。

環境

voicevox_core: 0.15.0-preview.16
(voicevox_core-ios-xcframework-cpu-0.15.0-preview.16.zip)
onixruntime: 1.14.1
(onnxruntime-ios-xcframework-1.14.1.zip)
Xcode Version 15.1 (15C65)
MacOS Sonoma 14.1.1

現象・ログ

スクリーンショット 2023-12-28 0 08 00

再現手順

新規プロジェクトを作り正常にサブミットできることを試した後に再度サブミットし、上記エラーを受ける手順となります。
AppleのDeveloperのアカウントがあり証明書が設定されているStoreへアプリをサブミットできる環境の下で、以下の手順で再現します。
①XCodeで新規プロジェクトを作る。
②App Store Connect側にプロジェクトと同じBundle Identifierのアプリ情報を登録する。
③適当にAssetsにアイコン、プロジェクトのTargetのGeneralのDisplay Name(アイコン下の名前)を適当に設定する。(最低限ストアーへのサブミットを通すため)
④リリース用にAny iOS Device(Arm64)などに向けてArchive。
⑤OrganizerのArchivesから今回のアプリを選んでDistribute AppをするとバイナリーをApple側で受け取ってくれる。メールでcompleted processingが来るのでこれを確認。
⑥Onnix runtimeを追加する。
プロジェクトのTargetのGeneralのFrameworks, Libraries, and Embedded Contentから + をおしてonnxruntime.xcframeworkのファイルを追加。(onnixruntimeがembedでsignedになるはず。)
⑦再度、④⑤のアーカイブとサブミットを行うと、今度はUploadは成功するが、後ほどメールでITMS-90426: Invalid Swift Supportと通知があり受取拒否される。
(voicevox_coreも確認が必要ですがとりあえずonnxruntimeだけを試しています。)

期待動作

AppleのApp Storeでバイナリーを正常に受領される。

VOICEVOXのバージョン

  • voicevox_core: 0.15.0-preview.16
    (voicevox_core-ios-xcframework-cpu-0.15.0-preview.16.zip)
  • onixruntime: 1.14.1
    (onnxruntime-ios-xcframework-1.14.1.zip)

OSの種類/ディストリ/バージョン

  • Windows
  • macOS
  • Linux
  • iOS

iOS 17.1.2

その他

原因はiOSの
onnxruntime.xcframework
voicevox_core.xcframework
にダイナミックライブラリーを含んでいるためと推測しています。

公式ドキュメントでは以下のように書かれています。
https://developer.apple.com/documentation/xcode/creating-a-multi-platform-binary-framework-bundle

Avoid using dynamic library files (.dylib files) for dynamic linking. An XCFramework can include dynamic library files, but only macOS supports these libraries for dynamic linking. Dynamic linking on iOS, watchOS, and tvOS requires the XCFramework to contain .framework bundles.
(翻訳 - .dylib ファイルをダイナミックリンキングに使用しないでください。XCFramework には .dylib ファイルを含めることができますが、ダイナミックリンキングにこれらのライブラリをサポートしているのは macOS のみです。iOS、watchOS、および tvOS でのダイナミックリンキングには、XCFramework が .framework バンドルを含んでいる必要があります。)

これは、ゲームエンジンのGodot Engineで同じ文言の同じ事象があったようです。
godotengine/godot#86224

@nekomimimi
Copy link
Contributor Author

nekomimimi commented Dec 28, 2023

回避策

以下のように回避できましたので、ご参考まで。

方針

xcframeworkの中に、ios-arm64-simulatorとios-arm64のframworkをぞれぞれ作りその中にダイナミックライブラリを入れる。

このURLの通り。
https://stackoverflow.com/questions/53818772/embedding-a-dylib-inside-a-framework-for-ios/62962630#62962630

方法例

空のframeworkを作りダイナミックライブラリを上書きし、それをxcframework化します。

1.空のフレームワークの作成

onnixrunntimeなどの名前で空のframeworkのprojectを作って、TargetのGeneralのMinimum Deploymentをonnixruntimeでは16.0、voicevox_coreでは16.2とする。
ios-arm64-simulatorとios-arm64の2つをBuild。

2.ダイナミックライブラリ名の変更

libonnxruntime.1.14.0.dylibの名前を1.に合わせてonnxruntimeとしたいので、

lipo -create libonnxruntime.1.14.0.dylib -output onnxruntime

としてframeworkを上書き。

3.xcframeworkにする

ios-arm64-simulatorとios-arm64をくっつける。

xcodebuild \
-create-xcframework \
-framework Release-iphoneos/onnxruntime.framework  \
-framework Release-iphonesimulator/onnxruntime.framework  \
-output outuput/onnixruntime.xcframework

などとする。

4.rpathの変更

今の自分自身のrpathが@rpath/libonnxruntime.1.14.0.dylibとなっていて見つからないので
今回の環境に合わせて変更する。

install_name_tool -id "@rpath/onnxruntime.framework/onnxruntime" onnixruntime.xcframework/ios-arm64/onnxruntime.framework/onnxruntime

install_name_tool -id "@rpath/onnxruntime.framework/onnxruntime" onnixruntime.xcframework/ios-arm64-simulator/onnxruntime.framework/onnxruntime 

voicevox_coreも1.〜4と同様にする。

5.voicevox_coreの依存のrpathの変更

加えて、voicevox_coreはonnxruntimeに依存しているので、それを見つけるためrpathも変更する。

install_name_tool -change "@rpath/libonnxruntime.1.14.0.dylib" "@rpath/onnxruntime.framework/onnxruntime" voicevox_core.xcframework/ios-arm64/voicevox_core.framework/voicevox_core 

install_name_tool -change "@rpath/libonnxruntime.1.14.0.dylib" "@rpath/onnxruntime.framework/onnxruntime" voicevox_core.xcframework/ios-arm64_x86_64-simulator/voicevox_core.framework/voicevox_core

@Hiroshiba
Copy link
Member

詳細なissue作成とコメントありがとうございます!!!
ちょっとちゃんとつかめてないのですが、dylibではなくframeworkにしてからxcframeworkに含める必要があったんですね!!

ちなみにビルドもOSSで管理しているので、どのようなビルドコードになっているかは見れたりします。

onnxruntimeのxcframeworkのビルド箇所はこちらです。
https://github.com/VOICEVOX/onnxruntime-builder/blob/e4e26e437fd9dba1b33ac1927181b41d71fed9ce/.github/workflows/build.yml#L216

voicevox_coreのxcframeworkのビルド箇所はこちら。

見た感じの雰囲気的に、ちょっとコードを足せばよさそう・・・・・・・・・・?
(ちゃんと精査できてないですが。。。)

@nekomimimi
Copy link
Contributor Author

nekomimimi commented Dec 29, 2023

workflowが何一つわからないので、年内、直せそうかを試してみて、無理そうだったらgive upします〜。

@Hiroshiba
Copy link
Member

Hiroshiba commented Dec 29, 2023

おお!!チャレンジしてくださるの嬉しいです!!
とりあえずworkflowを回してビルドチェックするのは、Forkしたリポジトリ内で、Actionsを許可した後、Actionsタブへ行き、左からbuild and deploy workflowを選んで、右のRun workflowを押して、ブランチを選べばできると思います!
不明な点があればなんでも聞いていただければ!

@nekomimimi
Copy link
Contributor Author

nekomimimi commented Dec 31, 2023

大体上の説明で理解しました。ありがとうございます!
作成してみたいと思います。

2点質問があります。

1.onnxruntime
iOSのonnxruntime側も変更する必要がありますが、
https://github.com/VOICEVOX/onnxruntime-builder/
このレポジトリですか?

試しにforkして1.15.1を指定してbuld.ymlを実行したら、エラーとなりました。
https://github.com/nekomimimi/onnxruntime-builder/actions/runs/7368431899/job/20052719209

2.ファイルの置き場
現状ある
voicevox_core/crates/voicevox_core_c_api/xcframework
の中に、今回使うframeworkの雛形ファイルを入れて大丈夫ですか?

  • 背景
    環境や動作タイミングがよくわからないのです問題があるかわからないのですが、
    ソース側がタグで管理されていてworkflowはタグで管理されない仕組みな気がします。
    過去のタグをbuild and deploy workflowをした時にファイルが見つからずに通らなくならないかを心配しました。

@Hiroshiba
Copy link
Member

Hiroshiba commented Dec 31, 2023

1.onnxruntime

はい、そちらのリポジトリになります!

試しにforkして1.15.1を指定してbuld.ymlを実行したら、エラーとなりました。

おっと・・・! distutilsが無いというエラーが出てますね。ちょっと調べてみました。
いつの間にかGithub Actionsのmacos-12上でのデフォルトpythonのバージョンが3.12になっていて、distutilsが削除され、onnxruntime 1.15.1をビルドするためのコードが非対応になってしまったっぽいです。

↓の感じで、バージョン3.12未満のPythonをインストールすると良さそうです!
このコードの3.8はちょっと古いので3.10とかでも良いかもです。

- uses: actions/setup-python@v4
with:
python-version: "3.8"

(たぶん、ubuntu上でapt installされているpythonもついでに削除できると思います!)

2.ファイルの置き場
現状ある
voicevox_core/crates/voicevox_core_c_api/xcframework
の中に、今回使うframeworkの雛形ファイルを入れて大丈夫ですか?

ちょっとわかってないのですが、たぶん大丈夫なのかなと思っています!

環境や動作タイミングがよくわからないのです問題があるかわからないのですが、
ソース側がタグで管理されていてworkflowはタグで管理されない仕組みな気がします。
過去のタグをbuild and deploy workflowをした時にファイルが見つからずに通らなくならないかを心配しました。

こちらですが、もしよかったらどういう例を懸念されているかお聞きしてもよろしいでしょうか 🙇

@nekomimimi
Copy link
Contributor Author

nekomimimi commented Dec 31, 2023

↓の感じで、バージョン3.12未満のPythonをインストールすると良さそうです!

動きました。ありがとうございます!

こちらですが、もしよかったらどういう例を懸念されているかお聞きしてもよろしいでしょうか 🙇

自分が相当勘違いしてたようなので忘れてください🙇

@nekomimimi
Copy link
Contributor Author

nekomimimi commented Jan 3, 2024

すみません、一点、躓いていまして。

build_and_deploy.ymlのdownload testで失敗したり成功したりするという症状で調べてまして、
例えばmainの現状の最新の[4e13bca]で

失敗例

https://github.com/nekomimimi/voicevox_core/actions/runs/7392613001
https://github.com/nekomimimi/voicevox_core/releases/tag/0.15.0-preview.10

成功

https://github.com/nekomimimi/voicevox_core/actions/runs/7388802114
(すでにrelease物は残ってない)

でして、原因を調べてます。
何か失敗の原因がわかりますでしょうか?

Releasesの同名のタグの前回のリリース物を削除して、
バージョン(例):0.15.0-preview.10
コード署名:チェックなし
製品版ビルド:チェックなし
で使ってます。
(自分の使い方を疑ってます💦)

追記

ccをアップデートする前でも同じ失敗が出るので、最近の修正とは関係なさそう(?)
1回目 成功
https://github.com/nekomimimi/voicevox_core/actions/runs/7388743149
(すでにrelease物は残ってない)
2回目 失敗
https://github.com/nekomimimi/voicevox_core/actions/runs/7393347917
https://github.com/nekomimimi/voicevox_core/releases/tag/0.15.0-preview.18
3回目 失敗
https://github.com/nekomimimi/voicevox_core/actions/runs/7393491688
https://github.com/nekomimimi/voicevox_core/releases/tag/0.15.0-preview.20

ブランチを作って1回目は成功して2回目以降は失敗する印象。

ver 0.14.5はOKかも
#の707もOKかも
#の710もOKかも
#の716はNG
https://github.com/nekomimimi/voicevox_core/actions/runs/7394339408
#の711はOK
原因は#の716?

@Hiroshiba
Copy link
Member

Hiroshiba commented Jan 3, 2024

@nekomimimi すみません遅くなりました!!
調べてるのですが、ちょっと原因まだわかりません。。

とりあえずの応急処置ですが、download_testは落ちていてもiOSのビルドのとこまでは大丈夫です!
(全部のビルドが終わってからdownload_testが始まる設計なのと、iOSのxcframework周りはダウンロードテストしていないので。。)

ちょっと原因は引き続き調査中です。キャッシュ周りが悪さしてそうな予感・・・?

調査結果(わからんという結論)

とりあえずファイルの中身にcuda関連のなにかが紛れ込んでるからエラーになってるっぽみ。う〜む。

https://github.com/VOICEVOX/voicevox_core/releases/tag/0.15.0-preview.16voicevox_core-windows-x64-directmlの内容

README.txt
VERSION
onnxruntime.dll
voicevox_core.dll
voicevox_core.h
voicevox_core.lib

https://github.com/nekomimimi/voicevox_core/releases/tag/0.15.0-preview.18voicevox_core-windows-x64-directmlの内容

README.txt
VERSION
onnxruntime.dll
onnxruntime_providers_cuda.dll
onnxruntime_providers_shared.dll
onnxruntime_providers_tensorrt.dll
voicevox_core.dll
voicevox_core.h
voicevox_core.lib

ありえるとしたらrust-cache・・・・・・・?

- name: cache target
uses: Swatinem/rust-cache@v2

@nekomimimi
Copy link
Contributor Author

nekomimimi commented Jan 3, 2024

とりあえずの応急処置ですが、download_testは落ちていてもiOSのビルドのとこまでは大丈夫です!

はい。気にせず作業を進めます!

(試したところでは #716 から発生しているようでしたが、原因わからずでした。)

@nekomimimi
Copy link
Contributor Author

nekomimimi commented Jan 4, 2024

@Hiroshiba

テスト中、エラーが出て原因を調べてまして、

ERROR voicevox_core::helpers: Caused by: (省略...)/voicevox/0.vvmの読み込みに失敗しました: モデルデータを読むことができませんでした

ERROR voicevox_core::helpers: Caused by: Failed to create session: Error calling ONNX Runtime C function: Failed to load model because protobuf parsing failed.
モデルデータを読むことができませんでした

現状、どこかバージョンがズレてるのかなと考えて、もし、以下で問題になりそうな点があったら教えてください。
(問題なさそうなら別の原因を探ります)

特に疑問点は
1.voicevox_core: 0.15.0.preview.16で動いてる.vvmのファイルを使ってればOKか。
2.onnixruntimeは1.15.1をrevertすれば1.14.0が作成できるか。
の2点です。

現状の組み合わせは、
1.現状、以下で正常に動いてるアプリがあります。
voicevox_core: 0.15.0.preview.16
onnxruntime: 1.14.0
これを、今回作成のライブラリに入れ替えてテストしようとしています。

2.onnxruntime
今回の修正を入れた後、
Revert "onnxruntimeのバージョンを1.15.1に上げる"
したもので、1.14.0とバージョンを指定して作成

3.voicevox_core
今回の修正を入れてライブラリ作成

@sevenc-nanashi
Copy link
Member

sevenc-nanashi commented Jan 4, 2024

3.voicevox_core
今回の修正を入れてライブラリ作成

実際に使われているキャラクターの声のモデルは暗号化されており、その復号コードはHiroshibaさんしかビルドできません。
自前ビルドの場合はこのリポジトリのmodel/sample.vvmのような暗号化されてないモデルのみ読み込めます。

ので、解決策としては:

  • テストにはsample.vvmを使う
  • 動くことが確認できたらこのリポジトリにPRを送る(確認前でもDraftとして送ってもいいと思います)
  • マージ後、previewリリースをお願いする

だと思います。

@nekomimimi
Copy link
Contributor Author

nekomimimi commented Jan 4, 2024

ありがとうございます。原因にたどり着けた気がします。とりあえずは、sample.vvmを使ってテストします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants