Blueprint & C++のiOS向けプロジェクトをWindowsで開発する

UE4

前置き

この記事は、先に下記の親記事を読んで頂くとよいかと思います。
【UE4】いろんなパターンのiOSアプリ開発環境を用意してみる

iOSの開発環境を用意する上で一番躓きやすい、C++プロジェクトをWindowsで開発してMacにRemote Buildをして、Windowsに接続されているiOS実機で動作確認する環境を用意していきます。

この環境は 4.18 から手順が若干簡略化されています。詳しくは下記のスライドに記載されています。
[CEDEC+KYUSHU 2017] 最新モバイルゲームの実例からみるUE4のモバイル向け機能・Tipsを全部まるっとご紹介!

更新履歴

2019.05.05 エラーその9、その10追加
2018.12.13 UE4.21.1でssh-keygenの問題が改善されたことの追記、「Macで生成した証明書をWindowsで使用する」を追加
2018.11.11 「4.9 デバイスでマップをテストする」のエラーその2、その3を追加

動作環境

この手順は以下のバージョンで確認しています。

  • Unreal Engine 4.22.1
  • Visual Studio 2017 Community
  • macOS Mojave 10.14.4
  • Xcode 10.2.1

手順

今回は最低限のプロジェクトを作成して、iOS実機で動作確認するところまでを解説します。

プログラマ向けクイックスタートiOS クイックスタートの手順をもとにプロジェクトと証明書関連の用意をし、Windows で iOS をビルドするのページを参考にMacでRemote Buildする環境を用意します。
「iOS クイックスタート」は各ページにプラットフォームを選択する箇所があるので、今回は Windows を選択してください。

インストールの前提条件

1.インストールの前提条件 | Unreal Engine

WindowsにiTunesをインストールします。この記事執筆時のバージョンは 12.9.1.4 です。
尚、iTunesはMicrosoft StoreからではなくAppleのiTunesのページから直接ダウンロードするようにしてください。Microsoft Storeからダウンロードしたものをインストールした場合、UE4からiPhoneで起動することができません。

プロジェクトを作成する

プログラマ向けクイックスタート | Unreal Engine

ここでは「プログラマ向けクイックスタート」を参考に、C++のプロジェクトを作ります。

今回はチュートリアル同様、C++タグの中からBasic Codeのテンプレートを選択します。このチュートリアルはDesktop向けの設定になっているので、ターゲットを Mobile / Tablet にして、スターターコンテンツを含めた状態で作成します。

プロジェクト作成時にエラーになる
プロジェクト作成時に以下のようなエラーが出た場合は、Visual Studioインストール時に必要なオプションを足し忘れていることになります。

再度 Visual Studioのインストーラーを用意して、必要なオプションを追加してください。
詳しくはUE4 に Visual Studio を設定する方法 の下の方に、Visual Studio 2017 ユーザー向けの必要なオプションが記載されているので参考にしてください。

再度起動してみます。

Windows SDK v8.1 が無いと言われてプロジェクト作成に失敗した場合は、再びVisual Studioのインストーラーを起動して、「Windows 8.1 SDK」を追加インストールしてください。

その後は「プログラマ向けクイックスタート」を参考にプロジェクトを作っていきます。
詳細は省略しますが、「5 – 応用編」は時間がかかるので「4 – コードをテストする」まででよいかと思います。

iOS プロビジョニング- 署名証明書の生成

3. iOS プロビジョニング- 署名証明書の生成 | Unreal Engine

チュートリアルの手順通りに、Engine\Binaries\DotNET\IOS\ ディレクトリに移動し、iPhonePackager.exe を実行します。
デフォルトでは CドライブのProgram FilesフォルダにUE4をインストールしていると思いますので、C:\Program Files\Epic Games\UE_4.21\Engine\Binaries\DotNET\IOS\ というディレクトリになるかと思います。

コマンドプロンプトに「ファイル ’ ... UE4Game-Info.plist’ が見つかりませんでした」と表示される
現在はこの時点で.plistファイルは不要みたいなので、気にしなくてOKです。

手順通りにメールアドレスと名前を入力し、.keyファイルと.csrファイルを作成して保存しておきます。
その後、手順通りにApple iOS Developer サイトの iOS Certificates ページに行き、証明書ファイル (.cer)を作成後ダウンロードしておきます。

Macで生成した証明書をWindowsで使用する
iPhonePackager.exeを使用せずにMacで生成した証明書をWindowsで使用する場合、Apple Developer ProgramのCertificatesからダウンロードしたものを使用するとうまくいきません。

Macのキーチェーンアクセスから下図の証明書を右クリック→書き出しでエクスポートします。.p12形式のファイルが生成されますので、このファイルをWindowsに持っていってダブルクリック→インストールすると、証明書が正しくインストールされます。

iOS プロビジョニング – デバイスの追加

4. iOS プロビジョニング- デバイスの追加 | Unreal Engine

開発機の登録をします。一度登録すればその機種は変更することはありません。
今後開発端末が増えるたびに追加していきます。

iOS プロビジョニング- App ID の作成

5. iOS プロビジョニング- App ID の作成 | Unreal Engine

開発するアプリのIDを作成します。チュートリアルで使用している *(ワイルドカード)は、開発の時に使えるジョーカーのようなもので、UE4側でBundle IDを指定しなくてもよくなります。開発の時はそれでもよいのですが、完成版に仕上げる際には結局IDを指定しないといけないので、この時点でIDを決めておいた方が後々になって慌てることもないかと思います。(ワイルドカードを使用してもOKです)

今回はテストなので com.soramame.ioswinbpcpp というBundle IDにしてみました。

iOS プロビジョニング- プロビジョニングの作成とインポート

6. iOS プロビジョニング- プロビジョニングの作成とインポート | Unreal Engine

これまでに登録した情報を用いてプロビジョニングプロファイルを作成します。
作成したプロビジョニングプロファイルをダウンロードすることで、以下の4ファイルが手元に存在しているはずです。(.csrファイルはもう使いませんが…)


※入力した情報によってファイル名は異なる可能性があります。

証明書関連のファイルをUE4にインポートする

7.デバイスでマップをテストする | Unreal Engine

いよいよこれまで作成したファイルをUE4にインポートします。
「Project Settings」にてチュートリアルの手順の通り、ProvisionファイルとCertificateファイルをインポートします。Certificateファイルをインポートする際には、.keyファイルを指定するように求められるので、先ほど作成した.keyファイルを指定します。
それぞれ、追加された情報の左側にチェックボックスがあるのでチェックしておきます。

次に、Bundle IDがワイルドカードではないので、先ほど指定した Bundle IDを入力します。
これで下図のようになります。

正しく設定しているのにNo Valid Certificate Foundのままになってしまう
ここでややこしいのが、ProvisionファイルとCertificateファイルとBundle IDが正しかったとしても、登録の反映に時間がかかるためか、Provisionの右側が Valid にならず、No Valid Certificate Found のままになっています。
設定自体がきちんと出来ていれば、次の日の夜には Valid に変わるのですが、それまで表示がこのままなのでうまくいっているのかわかりにくいです。
きちんと設定出来ていれば、この表示の状態でもiOS実機で動作させることが可能です。

また、もしMacで生成したCertificateファイルをWindowsで使用した場合は、上述の「Macで生成した証明書をWindowsで使用する」を確認してみてください。

これでようやく実行!…といきたいところですが、C++のプロジェクトをiOSに転送するには、一度Mac側に転送してゴニョゴニョしなければなりません。そのためのリモートビルドの設定をします。

リモートビルドの設定をする

Windows で iOS をビルドする | Unreal Engine

まずはMac側で設定をします。下図のように「リモートログイン」を有効にしてアクセスを許可します。

リモートログインにチェックをいれて、すべてのユーザに対してアクセスを許可します。
後ほどコンピュータ名とユーザ名が必要となります。コンピュータ名は画面上部のものを、ユーザ名は画面中央付近の「リモートログイン:オン」の箇所にある、アットマーク(@)の前の部分を使用すれば間違いないかと思います。

次にMacでの証明書のインポートですが、これは4.18にてWindowsで証明証をインポートしてあればMacでの証明書インポートは不要になりました。ですのでリンク先の「Macの設定」項目2、3の手順は不要となります。

次にチュートリアルの通りにWindowsのUE4のProject Settingsを開き、[Platforms]->[iOS]を開きます。下の方にスクロールすると[Build]->[Remote Build Options]という閉じたセクションがあるので、これを開きます。


Remote Server Nameには先ほどのMacのコンピュータ名を入力します。
RSync User Name には同様に先ほどのユーザ名を入力します。

次にGenerate SSH Keyボタンを押して、チュートリアルの「SSHの設定」の手順の通りにSSHキーを入力します。正常に作成されれば、鍵ファイルのファイルパスが自動的に入力されます。(初回は反映までに数十秒かかることがあります)

チュートリアルの「オプションのチーム設定」は今回は省略します。

デバイスでマップをテストする

ついに実際にiOSデバイスで実行できるか確認してみます。

Windows側にiOSデバイスをUSBで接続し、UE4のLaunchメニューから、iOSデバイスを選択して起動してみます。

ここで何度もエラーと戦うことになります。失敗する場合はOutput Logウィンドウを表示してエラーの内容を確認してください。(Windows -> Developer Tools -> Output Log)

エラーその1 : Permissions 0660 for ... are too open. (4.22.1修正済)
一部文字化けしていますが、エラー内容としてはMacにリモートで接続するための秘密鍵のパーミッションが正しくないと怒られています。
(参考:Chmodding RemoteToolChainPrivate.key for iOS remote builds – UE4 AnswerHub
修正方法としては秘密鍵のアクセス権を修正するのですが、Cygwinで操作するのが手っ取り早いのでインストールしていない場合は入れておくとよいかと思います。

秘密鍵は C:\Users\ユーザ名\AppData\Roaming\Unreal Engine\UnrealBuildTool\SSHKeys\Mac名\Macユーザ名\ の場所にあります。
RemoteToolChainPrivate.keyというファイルがあるので、chgrpでグループをUsersにし、chmodでアクセス権を600にします。

エラーその2 : Output = Permission denied (publickey,password,keyboard-interactive). (4.21.1修正済)

「Permission denied (publickey,password,keyboard-interactive).」の原因はいくつか考えられますが、その中で私がハマったものを紹介します。

WinからMacへリモートビルドを行うために、事前に[プロジェクト設定] -> [iOS] -> [Build] -> [Remote Build Options] にてリモートビルドのセットアップを行いますが、[新規SSHキーを生成]する際に、リモート先のMacのOpenSSHのssh-keygenを使用して秘密鍵を生成します。
しかしMacのOSバージョンが 10.14 Mojave 以上の場合、OpenSSHのバージョンが7.8になり、ssh-keygenで使用する秘密鍵のデフォルト形式がPEM形式からOpenSSH形式に変更されたようで、これはUE4が使用しているDeltaCopyのバージョン5.1には対応していません。このため、上記のエラーが発生します。
(参考:OpenSSH 7.8p1 での変更点のまとめ
これは[新規SSHキーを生成]をMojave以前のOSでしていても、その後にMojaveにアップデートして新たに[新規SSHキーを生成]をし直してしまうと発生するはずです。

この不具合はUE4の4.21.1にて修正済みです。もし発生する場合は、4.21.1以降のバージョンで再度[新規SSHキーを生成]を実行してください。

記録として手動での修正方法を下記に残しておきます。


根本対応としてはUE4付属のDeltaCopyで使用しているOpenSSHをOpenSSH形式の秘密鍵に対応したバージョンまで引き上げることですが、とりあえず簡単にできる暫定対応として、Mac側にssh-keygenをリクエストする際に、オプションをつけてPEM形式で秘密鍵を生成してもらうようにします。

UE4の下記のフォルダにある MakeAndInstallSSHKey.bat を編集します。
C:\Program Files\Epic Games\UE_4.xx\Engine\Build\BatchFiles\MakeAndInstallSSHKey.bat

36行目の後ろの方に ssh-keygen を呼び出している箇所がありますので、引数に -m PEM というオプションを追記します。
その後、改めて[プロジェクト設定]から[新規SSHキーを生成]を実行して、PEM形式の秘密鍵を作り直すことで、このエラーは解消されます。

エラーその3 : Unable to determine home directory for remote user
UE4の4.21から、秘密鍵周りのエラーがこの文言に集約されてしまったようです。
上記のエラー1、エラー2の原因が当てはまる可能性が高いので、そちらを試してみてください。

エラーその4 : Mac側にXcodeがインストールされていない
Mac側でXCodeがインストールされてないとこのようなエラーが出力されます。XCodeの最新版をインストールしてください。
エラーその5 : iOSデバイスが接続されていない
これはログを見ればすぐわかると思います。ただ、iPhoneの純正ケーブルはすぐ接触が悪くなるので、接続しているつもりでも正しく通信出来ていないことがあるかもしれません。
エラーその6 :Xcode上でApple IDが正しく設定されていない
MacのXcode側でApple IDアカウントが正しくセットアップされていません。Xcodeを起動して、メニューの[Xcode]->[Preferences]->[Accounts]からApple IDアカウントを正しく入力し直してください。
エラーその7 : rsync errorと表示される
リモート先のMacの電源が入っていなかったり、スリープになっていたり、ディスプレイの蓋が閉まっている可能性があります。

エラーその8 : IPP ERRORと表示される
とてもわかりにくいエラーで、日本語環境だとエラーログも文字化けしてしまうので何のことかわかりにくいです。文字化けしていない状態のエラーログにはKeyset does not existと表示され、秘密鍵周りで何かが存在しないと言われていることがわかります。

この場合、以下のフォルダのアクセス権限を確認してください。
C:\ProgramData\Microsoft\Crypto

重要なのはこのフォルダ以下の RSA\MachineKeys のフォルダで、その中に必要なファイルが存在しているはずが、フォルダのアクセス権が間違っているとファイルが空っぽになってしまいます。

Cryptoのプロパティを開き、[セキュリティ]->[詳細設定]を開き、アクセス許可を以下のように書き換えます。

その後、UE4のProject SettingsからCertificateファイルのインポートをやり直すことで、秘密鍵のファイルが正しくコピーされます。

(参考:Resolve Cryptographic Exception ‘Keyset Does Not Exist or Access is Denied issue’

エラーその9 : Wrong server running, restarting the server(4.22.1修正済)
ビルドが成功しているように見えて、よく見ると途中でエラーが吐かれていてゲームアプリが転送できていません。
4.22.0でのみ発生するバグで、パス文字列の操作に不具合があるためです。

この不具合は4.22.1で修正済みです。

エラーその10 : 指定された状態で使用するには無効なキーです。
「指定された状態で使用するには無効なキーです。」という表記が特徴的なこのエラーは、上記の その8 のエラーと同様のもので、最近のUE4のバージョンだとこのように表示されます。Windowsを新規インストールした際などによく発生するようです。

ゲームをパッケージ化する

8.ゲームをパッケージ化する | Unreal Engine

ここまで困難を乗り越えてきた人ならばきっとパッケージ化できると思います。
信じて完成を待ちましょう!

おまけ

ProvisionファイルやCertificateファイルを削除したい

ProvisionファイルやCertificateファイルはiOS Developer Programのサイトで登録を解除することはできますが、ローカルのPCにはファイルが残ったままになっています。このままにしておくと同じようなファイルのゴミがどんどん溜まっていってしまいます。以下の手順で不要となったファイルを削除することができます。

Windowsの場合

Provisionファイル (Windows)

以下の場所に置いてあるので、そのまま削除することができます。
C:\Users\ユーザ名\AppData\Local\Apple Computer\MobileDevice\Provisioning Profiles

Certificateファイル (Windows)

Win + Rでファイル名を指定して実行を開き、certmgr.msc と入力して証明書管理を立ち上げます。
[個人]->[証明書]の中にCertificateファイルの情報が残っているので、削除することができます。

Macの場合

Provisionファイル (Mac)

以下の場所に置いてあるので、そのまま削除することができます。
ユーザ名 -> Library -> MobileDevice -> Provisioning Profiles

Certificateファイル (Mac)

キーチェーンアクセスを実行し、[自分の証明書]の[ログイン]もしくは[システム]の中にCertificateファイルの情報が残っているので、削除することができます。