watchOS のトラブルシューティング
このページには、発生する可能性がある問題に関する追加情報と回避策が含まれています。
Xcode Interface Builder 用のインターフェイス コントローラー ファイルの手動による追加。
既知の問題
全般
以前のリリースの Visual Studio for Mac では、AppleCompanionSettings アイコンの 1 つが 88 x 88 ピクセルと誤って表示されていました。そのため、App Store に送信しようとするとアイコンが見つからないエラーが発生します。 このアイコンは 87 x 87 ピクセル (@3x の Retina 画面では 29 単位) にする必要があります。 これは、Visual Studio for Mac では修正できません。Xcode でイメージ資産を編集するか、Contents.json ファイルを手動で編集します。
ウォッチ拡張機能プロジェクトの Info.plist > WKApp バンドル ID がウォッチ アプリのバンドル ID と一致するように正しく設定されていない場合、デバッガーは接続に失敗し、Visual Studio for Mac は "デバッガーの接続を待機しています" というメッセージで待機します。
デバッグは通知モードでサポートされていますが、信頼性が低い場合があります。 再試行が機能することがあります。 ウォッチ アプリの Info.plist
WKCompanionAppBundleIdentifier
が iOS 親/コンテナー アプリ (iPhone で実行されるアプリ) のバンドル識別子と一致するように設定されていることを確認します。iOS Designer では、Glance インターフェイス コントローラーまたは通知インターフェイス コントローラーのエントリポイント矢印は表示されません。
ストーリーボードに 2 つの
WKNotificationControllers
を追加することはできません。 回避策: ストーリーボード XML のnotificationCategory
要素は常に同じid
で挿入されます。 この問題を回避するには、2 つ (またはそれ以上) の通知コントローラーを追加し、テキスト エディターでストーリーボード ファイルを開き、id
要素を一意になるように手動で変更します。アプリを起動しようとすると、"アプリケーションがビルドされていません" というエラーが表示されることがあります。 これは、スタートアップ プロジェクトがウォッチ機能拡張プロジェクトに設定されている場合に Clean の後に発生します。 修正は、[ビルド] > [すべてリビルド] を選択してから、アプリを再起動することです。
アイコン イメージからのアルファ チャネルの削除
アイコンにアルファ チャネルを含めないようにします (アルファ チャネルはイメージの透明な領域を定義します)。そうしないと、App Store の申請中にアプリは拒否され、次のようなエラーが表示されます。
Invalid Icon - The watch application '...watchkitextension.appex/WatchApp.app'
contains an icon file '...watchkitextension.appex/WatchApp.app/Icon-27.5@2x.png'
with an alpha channel. Icons should not have an alpha channel.
プレビュー アプリを使用すると、Mac OS X のアルファ チャネルを簡単に削除できます。
プレビューでアイコン イメージを開き、[ファイル] > [エクスポート] を選択します。
表示されるダイアログには、アルファ チャネルが存在する場合は [アルファ] チェック ボックスが表示されます。
[アルファ] チェックボックスをオフにし、ファイルを正しい場所に保存します。
これで、アイコン イメージは Apple の検証チェックに合格するはずです。
インターフェイス コントローラー ファイルの手動による追加
重要
Xamarin の WatchKit のサポートには、iOS Designer (Visual Studio for Mac と Visual Studio の両方) でのウォッチ ストーリーボードの設計が含まれています。この場合、以下で説明する手順は必要ありません。 Visual Studio for Mac の Properties Pad でインターフェイス コントローラーにクラス名を付けるだけで、C# コード ファイルが自動的に作成されます。
Xcode Interface Builder を使用している場合は、次の手順に従って、ウォッチ アプリ用の新しいインターフェイス コントローラーを作成し、Xcode との同期を有効にして、C# でアウトレットとアクションを使用できるようにします。
Xcode Interface Builder でウォッチ アプリの Interface.storyboard を開きます。
新しい
InterfaceController
をストーリーボードにドラッグします。コントロールをインターフェイス コントローラーにドラッグできるようになりました (ラベルやボタンなど) が、.h ヘッダー ファイルがないため、アウトレットやアクションはまだ作成できません。 次の手順を実行すると、必要な .h ヘッダー ファイルが作成されます。
ストーリーボードを閉じて、Visual Studio for Mac に戻ります。 新しい C# ファイル MyInterfaceController.cs (または任意の名前) を、(ストーリーボードがあるウォッチ アプリ自体ではなく) ウォッチ アプリ拡張機能プロジェクトに作成します。 次のコードを追加します (名前空間、クラス名、コンストラクター名を更新します)。
using System; using WatchKit; using Foundation; namespace WatchAppExtension // remember to update this { public partial class MyInterfaceController // remember to update this : WKInterfaceController { public MyInterfaceController // remember to update this (IntPtr handle) : base (handle) { } public override void Awake (NSObject context) { base.Awake (context); // Configure interface objects here. Console.WriteLine ("{0} awake with context", this); } public override void WillActivate () { // This method is called when the watch view controller is about to be visible to the user. Console.WriteLine ("{0} will activate", this); } public override void DidDeactivate () { // This method is called when the watch view controller is no longer visible to the user. Console.WriteLine ("{0} did deactivate", this); } } }
ウォッチ アプリ拡張機能プロジェクトに別の新しい C# ファイル MyInterfaceController.designer.cs を作成し、次のコードを追加します。 名前空間、クラス名、
Register
属性は必ず更新してください。using Foundation; using System.CodeDom.Compiler; namespace HelloWatchExtension // remember to update this { [Register ("MyInterfaceController")] // remember to update this partial class MyInterfaceController // remember to update this { void ReleaseDesignerOutlets () { } } }
ヒント
Visual Studio for Mac Solution Pad の他の C# ファイルにドラッグすることで、このファイルを (必要に応じて) 最初のファイルの子ノードにすることができます。 次のように表示されます。
使用した新しいクラスが Xcode 同期で (
Register
属性を介して) 認識されるように、[ビルド] > [すべてビルド] を選択します。ウォッチ アプリのストーリーボード ファイルを右クリックし、[プログラムから開く] > [Xcode Interface Builder] を選択して、ストーリーボードを再び開きます。
新しいインターフェイス コントローラーを選択し、上記で定義したクラス名を指定します。例:
MyInterfaceController
. すべてが正常に機能している場合、これが [クラス:] ドロップダウン リストに自動的に表示され、そこから選択できます。ストーリーボードとコードを並べて表示できるように、Xcode のアシスタント エディター ビュー (2 つの円が重なったアイコン) を選択します。
コード ウィンドウにフォーカスがある場合は、.h ヘッダー ファイルを表示していることを確認します。表示していない場合は、階層リンク バーを右クリックして適切なファイル (MyInterfaceController.h) を選択します。
これで、ストーリーボードから .h ヘッダー ファイルに Ctrl キーを押しながらドラッグすることで、アウトレットとアクションを作成できるようになりました。
ドラッグを離すと、アウトレットとアクションのどちらを作成するかを選択し、その名前を選択するように求められます。
ストーリーボードの変更が保存され、Xcode が閉じられると、Visual Studio for Mac に戻ります。 ヘッダー ファイルの変更が検出され、.designer.cs ファイルにコードが自動的に追加されます。
[Register ("MyInterfaceController")] partial class MyInterfaceController { [Outlet] WatchKit.WKInterfaceButton myButton { get; set; } void ReleaseDesignerOutlets () { if (myButton != null) { myButton.Dispose (); myButton = null; } } }
C# でコントロールを参照 (またはアクションを実装) できるようになりました。
コマンド ラインからのウォッチ アプリの起動
重要
ウォッチ アプリは、既定では通常のアプリ モードで起動できます。Visual Studio for Mac と Visual Studio ではカスタム実行パラメーターを使用して、Glance モードまたは通知モードでも起動できます。
コマンド ラインを使用して、iOS シミュレーターを制御することもできます。 ウォッチ アプリの起動に使用されるコマンド ライン ツールは mtouch です。
完全な例を次に示します (ターミナルで 1 行として実行されます)。
/Library/Frameworks/Xamarin.iOS.framework/Versions/Current/bin/mtouch --sdkroot=/Applications/Xcode.app/Contents/Developer/ --device=:v2:runtime=com.apple.CoreSimulator.SimRuntime.iOS-8-2,devicetype=com.apple.CoreSimulator.SimDeviceType.iPhone-6
--launchsimwatch=/path/to/watchkitproject/watchsample/bin/iPhoneSimulator/Debug/watchsample.app
アプリを反映するために更新する必要があるパラメーターは launchsimwatch
です。
--launchsimwatch
ウォッチ アプリと拡張機能を含む iOS アプリのメイン アプリ バンドルへの完全なパスです。
Note
指定する必要があるパスは、iPhone アプリケーション .app ファイル用です。つまり、iOS シミュレーターにデプロイされ、ウォッチ拡張機能とウォッチ アプリの両方を含むパスです。
例:
--launchsimwatch=/path/to/watchkitproject/watchsample/bin/iPhoneSimulator/Debug/watchsample.app
通知モード
アプリの通知モードをテストするには、watchlaunchmode
パラメーターを Notification
に設定し、テスト通知ペイロードを含む JSON ファイルへのパスを指定します。
通知モードにはペイロード パラメーターが必要です。
たとえば、mtouch コマンドに次の引数を追加します。
--watchlaunchmode=Notification --watchnotificationpayload=/path/to/file.json
その他の引数
残りの引数について、以下で説明します。
--sdkroot
必須。 Xcode (6.2 以降) へのパスを指定します。
例:
--sdkroot /Applications/Xcode.app/Contents/Developer/
--device
実行するシミュレーター デバイス。 これは、特定のデバイスの udid を使用するか、ランタイムとデバイスの種類の組み合わせを使用するかの、2 つの方法で指定できます。
正確な値はマシンによって異なり、Apple の simctl ツールを使用してクエリを実行できます。
/Applications/Xcode.app/Contents/Developer/usr/bin/simctl list
UDID
例:
--device=:v2:udid=AAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE
ランタイムとデバイスの種類
例:
--device=:v2:runtime=com.apple.CoreSimulator.SimRuntime.iOS-8-2,devicetype=com.apple.CoreSimulator.SimDeviceType.iPhone-6