WatchKitフレームワークに関するよくある質問

開発者にとって、Apple Watchは単なるセンセーショナルなガジェットではありません。 今、彼らはウォッチキットを習得して、スマートウォッチ用のアプリケーションを作成して適応させる必要があります。 もちろん、この技術に慣れると、多くの疑問が生じます。

Alconostでは 、広範なWatchKitフレームワークFAQ 翻訳しました。 弊社の技術翻訳者の仕事があなたにとって役立つことを嬉しく思います。 一部の問題については、明確な解決策がまだありません。そのような場合、常識、専門家のアドバイス、合理的な仮定に頼るべきです。 この技術はまだ大部分が開発中であるため、変更される可能性があります。 それにもかかわらず、多くの燃えるような質問への答えはすでに見つかっています。 あなたを猫に招待します!



主な問題


WatchKitとは何ですか?


WatchKitは、Xcode 6.2を含むApple Watch用のハイブリッドアプリを作成するためのAppleのフレームワークです。

WatchKitは、アプリケーションを2つの部分に分割します。



時計Apple WatchとiPhoneの間でのこのような情報交換は、自動的かつ無意識に行われることは注目に値します。

あなたはいつものように働き、WatchKitはすべてのデータ交換をワイヤレスで実行します。 作成するコードに関しては、ビューとアウトレットは別々のデバイスに配置されていてもローカルに接続します。 とても快適です!


SwiftでApple Watch用のアプリを開発できますか?


はい、Apple WatchアプリケーションはObjective-CとSwiftの両方で開発できます( 翻訳者注:ところで、 この言語 のドキュメントの一部を Alconostで 翻訳 ました )。一度に2つの言語を使用できます。 例として、AppleはWatchKit環境用の2つのプロジェクトを公開しています。

さらに、 WatchKitチュートリアルWatchKit実践ビデオチュートリアルシリーズ 、およびWatchKit トレーニングチュートリアルは、Swiftでのみ記述されています。

Appleは、Objective-CおよびSwiftのWatchKitフレームワークに関するドキュメントを提供しています。


独自のウォッチフェイスを作成できますか?


いいえ、カスタムウォッチフェイスはまだサポートされていません。

ウォッチフェイスの変更はまだサポートされていません!

Apple Watchは1つのiPhoneデバイスに何時間接続できますか?


接続は排他的であるため、一度に1つのiPhoneデバイスに接続できるのは1つのApple Watchのみです。

Apple WatchをiPadに接続できますか?


いや 現在、Apple WatchはiPhoneにのみ接続できます。

iPhoneスマートフォンのアプリケーションは、WatchKit拡張機能とアプリケーションを数時間で「起動」できますか?


いや WatchKit拡張機能は、iPhoneデバイス用のコンパニオンアプリケーションを起動するようにシステムに要求するだけで、バックグラウンドで実行します。 現在、反対方向の作業はサポートされていません。

サードパーティのアプリは、時計アプリから電話をかけることができますか?


いや WatchKit拡張機能から直接通話を開始できるオープンAPIはありません。 iPhoneの付随するアプリケーションにも優先順位を付けることができないため、システムは付随するスマートフォンアプリケーションからのすべての電話呼び出しまたはopenURLリクエストを無視します。

時計アプリから心拍センサーやその他の時計センサーにアクセスできますか?


いや Apple Watchのハードウェアセンサーにアクセスするためのソフトウェアインターフェイスはまだありません。

短い通知、長い通知、静的な通知、動的な通知の違いは何ですか?



- 静的通知には、通知コンテンツを使用して自動的に入力される単一のテキスト文字列が含まれます。 時計のアプリケーションのストーリーボードで静的通知のシーンを作成できますが、カスタマイズに関しては、分割ストリップとタイトルの色のみを変更できます。
- 動的通知には、 WKUserNotificationInterfaceControllerのサブクラス化が必要です 。 ストーリーボードからインスタンス化され、独自のインターフェイスを定義できます。 動的通知インターフェースは常に表示されるわけではないことに注意してください。 たとえば、時計のバッテリーが切れた場合、電力を節約するために、システムは動的なインターフェースではなく静的な通知インターフェースを表示することを決定する場合があります。

ボンネットの下



適切なスキームの選択

シミュレータを使用してクイックビューまたは通知を確認するにはどうすればよいですか?


「クイックビュー」および通知ごとにシミュレータで実行するには、独自のアセンブリスキームが必要です。 適切な回路を選択して、ビルドして実行するだけです。

インターフェイス要素を上下に配置することは可能ですか?


いや デフォルトでは、インターフェイス要素を上下に配置することはできません。 ただし、この制限は回避できます。 たとえば、 WKInterfaceGroupを使用して、コントロールを構成するものの背景画像を設定し、その上に別のコントロールを追加する必要があります。 次に、このグループ内に、必要なテキスト行、ボタンなどを追加できます。

インターフェイス要素のCALayerプロパティを設定できますか?


いや Apple Watchインターフェース要素には、 UIViewクラスまたはCALayerクラスのどちらからも来ないため、 CALayerプロパティがありません。

WatchKitフレームワークにあるクラスをサブクラス化することは可能ですか?


WatchKitフレームワークのクラスのサブクラス化を妨げるものはありませんが、この機能を使用できない場合があります。 WKInterfaceControllerWKUserNotificationInterfaceControllerなどの一部のクラスサブクラス化し、ストーリーボードで使用できます。

ただし、監視アプリケーションのストーリーボードでは、インターフェイス要素のクラスを変更できません。 インターフェイス要素を動的に作成し、表示されたサブ要素として挿入または削除することはできません。 ストーリーボードに既に存在するインターフェイス要素のみを非表示または表示できます。

ページベースのインターフェイスコントローラーと再配置ベースのインターフェイスコントローラーを組み合わせることはできますか?


可能ですが、いくつかの制限があります。

階層インターフェイスを使用している場合、ページベースのインターフェイスはモジュールを使用して表すことができます。 いずれかのページが階層インターフェイスの場合、そのルートディレクトリが表示され、スタックへの追加は失敗します。

ページベースのインターフェイスがある場合、階層インターフェイスはモジュールを使用して表すことができますが、ルートインターフェイスコントローラのみが表示され、スタックには何も追加されません。

Apple WatchにはUIActivityIndi​​catorクラスとUIAlertControllerクラスに相当するものがありますか?


いいえ。ただし、 UIAlertControllerクラスの代わりに、カスタムのWKInterfaceControllerをモーダルに表示できます

一連の画像を追加して必要なアニメーションを作成するか、適切なテキストを含むテキスト文字列を表示するだけで、アクションインジケーターを回避できます。 これを行う方法は、Appleが提供するリスターアプリケーションの例を見ることができます。「クイックルック」モードでは、360個の画像が時計アプリケーションの1つの円形アニメーションを表します。


Core Graphicsを使用して画像を動的に作成し、それを時計アプリで使用できますか? 時計にキャッシュできますか?


はい、可能ですが、Core Graphicsを使用する画像は、拡張機能の一部としてiPhoneでコンパイルする必要があります。 Core GraphicsグラフィックコンテキストがUIImageクラスのインスタンスに変換されると、 WKInterfaceDeviceクラスのaddCachedImage(_:name :)メソッドを使用してクロックに配置できます。

Apple Watchでカスタムビューを使用し、オープンクロックAPIのフレームワーク外でインターフェイス要素をカスタマイズできますか?


いや カスタムビューは使用できません。 WatchKitは、独自のインターフェイス要素の一部のみをサポートしています。 これらの要素は、オープンAPIの外部でサブクラス化またはカスタマイズすることはできません。 次のインターフェース要素があります: WKInterfaceLabelWKInterfaceButtonWKInterfaceImageWKInterfaceGroupWKInterfaceSeparatorWKInterfaceTableWKInterfaceSwitchWKInterfaceMapWKInterfaceSliderおよびWKInterfaceTimer

Apple WatchはどのようにiPhoneと通信しますか?


ペアリングされたiPhoneと情報を共有するために、Apple WatchはBluetooth LEとWi-Fiを最大限に活用します。 このような情報交換の実装は、ユーザーまたは開発者にとって透過的ではありません。


Apple Watchをオフラインで使用できますか?


はい オフラインモードを有効にした後、BluetoothとWi-Fiをオンにしてデータを交換し、時計を使用できます。


オフラインモードを有効にした後、Wi-FiとBluetoothをオンにします

Apple Watchが関連するiPhoneデバイスと通信できない場合、アプリケーションはどうなりますか?


簡単に言えば、アプリケーションは動作せず、すでに動作している場合、作業は中断されます。

現在のインターフェイスコントローラーのWatchKit拡張機能では、 didDeactivate()メソッドが呼び出され、必要なクリーニングを実行できます。 時計のステータス行に、iPhoneデバイスの赤いアイコンが表示され、通信が失われたことを示します。インターフェイスは画面に残りますが、インタラクティブではありません。 ユーザーは、アプリケーションを再接続するか終了することができます。

時計アプリは、iPhone上のコンパニオンアプリとどのように通信しますか?


これはさまざまな方法で行われます。 最も一般的な方法は、監視アプリケーションが共有コンテナーでデータを書き込みまたは更新し、スマートフォンでアプリケーションに通知する場合です。 その後、スマートフォン上のアプリケーションは、共有コンテナーから変更を抽出できます。

別の方法は、辞書を介してiPhoneデバイスアプリケーションにデータを転送することですが、この方法は監視アプリケーションによってのみ開始できます。 これを行うには、WatchKit拡張機能に別のAPIがあります。次の例に示すように、 WKInterfaceControllerクラスのopenParentApplication(userInfo:reply :)メソッドが呼び出されます。
// Notify companion iPhone app of some changes in the shared container. let kSharedContainerDidUpdate = "com.rayWenderlich.shared-container.didUpdate" let requestInfo: [NSObject: AnyObject] = [kSharedContainerDidUpdate: true] WKInterfaceController.openParentApplication(requestInfo) { (replyInfo: [NSObject : AnyObject]!, error: NSError!) -> Void in // Handle the reply from the companion iPhone app... } 

userInfoディクショナリではアクションを実行する必要がある関連するiPhoneアプリケーションのラベルまたはデータを単に転送します。 このようなメッセージを受信するには、iPhoneデバイスのコンパニオンアプリケーションがアプリケーションデリゲートでアプリケーション(_:handleWatchKitExtensionRequest:reply :)を実行する必要があります。
 func application(application: UIApplication!, handleWatchKitExtensionRequest userInfo: [NSObject : AnyObject]!, reply: (([NSObject : AnyObject]!) -> Void)!) { let kSharedContainerDidUpdate = "com.rayWenderlich.shared-container.didUpdate" if let isUpdate = userInfo[kSharedContainerDidUpdate] as? Bool { // Process request, then call reply block reply(...) } } 

関連するスマートフォンアプリケーションが一時停止または終了すると、システムはバックグラウンドで起動します。 メッセージの目的に応じて、コンパニオンiPhoneアプリケーションは応答ブロックに何かを表示する場合があり、監視アプリケーションはそれに応じて処理できます。

iPhoneアプリはどのように時計アプリと通信しますか?


iPhone上のアプリケーションは、拡張機能との情報交換を開始できません。 共有コンテナーへの書き込みや監視アプリケーションからの要求への応答に加えて、スマートフォン上のアプリケーションはDarwin Notification Centerを使用して、特定のイベントについてWatchKit拡張機能に通知できます。 Darwin Notification Centerは、Core FoundationフレームワークAPIです。

ダーウィン通知センターを使用する場合、留意すべき非常に重要な点がいくつかあります。


静的または動的な通知インターフェイスを使用しないとどうなりますか?


iPhoneにアプリケーション用のコンパニオンウォッチアプリケーションがない場合でも、システムはそのようなアプリケーションの通知をウォッチに表示します。 ただし、デフォルトの通知インターフェースにはカスタムレイアウトがありません。 アプリケーションにインタラクティブな通知がある場合、システムはこれらのアクションをウォッチで非表示にします。

setImage(_ :)とsetImageNamed(_ :)メソッドの違いは何ですか?


setImageNamed(_ :)メソッドは、表示する必要のある画像がウォッチキャッシュに格納されているか、ウォッチアプリケーションバンドルのアセットディレクトリにある場合に使用されます。 Apple Watchにワイヤレスで送信されます。

次の基準のいずれかを満たす画像は、ウォッチキャッシュに保存されます。
  1. プロジェクトでは、画像は時計のアプリケーションの目的に関連しています。つまり、画像はプロジェクトの時計のアプリケーションの目的に関連する資産カタログにあります。
  2. 画像は、次のWKInterfaceDeviceクラスAPIのいずれかを使用して事前に直接キャッシュされました: addCachedImage(_:name :)またはaddCachedImageWithData(_:name :)


時計アプリでiCloudを使用できますか?


はい、iCloudはApple Watchアプリで使用できます。 これを行う方法は、Appleが公開した単純なプロジェクトの1つであるListerヘルパーアプリケーションの例を見ることができます。

アニメーション


ウォッチアプリにアニメーションを追加する方法は?


Apple Watchでアニメーションを表示する唯一の方法は、 一連の画像を使用することです。 アニメーションを作成するには、ノートブックに描かれた漫画のように、最初に一連の画像を作成してから、それらを循環させる必要があります。 アニメーションGIFの時代が帰ってきました! ;]

独自のアニメーションを作成するには、 WKInterfaceImageオブジェクトに一連の静止画像を表示できます。
 @IBOutlet weak var image: WKInterfaceImage? ... image?.setImageNamed(image1) // Load the initial image using the required <name><number> format image?.startAnimating() // Starts animating ... image?.stopAnimating() // Optional. Stops animating. 

次のコードスニペットに示すように、選択した画像の一部のみをアニメーション化することもできます。
 image?.startAnimatingWithImagesInRange(range, duration: 2, repeatCount: 1) 

Apple Watchのアニメーションをコードとして作成できますか?


はい-しかし、おそらくあなたの考え方ではありません。 上記のように、Core Animationフレームワークまたはそれに相当するものはありません。 Core Graphicsを使用して、各フレームにオフスクリーンコンテキストのアニメーションを提供し、 UIImageインスタンスに割り当て、最終的にApple Watchでアニメーション化できる一連の画像を取得できます。

次のコードスニペットは、各フレームの画像シーケンスを生成することにより、Core Graphicsフレームワークを使用して動く円のアニメーションを作成する方法を示しています(コードはWatchKitチュートリアルチュートリアルの著者の1人であるJack Wuから提供されました):
 // Create an offscreen context UIGraphicsBeginImageContextWithOptions(size, opaque, scale) let context = UIGraphicsGetCurrentContext() for centerX in 0..100 { // Draw a circle at centerX. // Create a snapshot. let image = UIGraphicsGetImageFromCurrentImageContext() // Write the image as a file let data = UIImagePNGRepresentation(image) let file = "path\\image_\(centerX).png" data.writeToFile(file, atomically: true) } // End the context. UIGraphicsEndImageContext() 



Apple Watchの最大フレームレートはいくらですか?


Apple Watchでフレームアニメーションの頻度を設定することはできません。 ただし、アニメーションの継続時間を設定すると、システムがフレームレートを自動的に決定します。

画像がキャッシュされていない場合など、一連の画像がワイヤレスで送信されると、それらは最大で毎秒10フレームの速度で移動します。 画像が既にWatchKitアプリケーションバンドルの画像キャッシュまたはアセットカタログを介してApple Watchにキャッシュされている場合、最大30フレーム/秒の速度で移動します。

デバッグと単体テスト


シミュレーターを使用してApple Watchアプリを使用しているときに、iPhoneデバイスアプリを起動してデバッグするにはどうすればよいですか?


  1. ウォッチアプリをビルドして実行します-Apple Watchクロックシミュレーターとウォッチアプリが起動し、デバッガーにスナップします。
  2. 次に、iOSシミュレーターで、アイコンをタッチしてスマートフォンアプリケーションを起動します。
  3. Xcodeに戻り、トップメニューで[ デバッグ ] \ [ プロセスアタッチ ]をクリックし、iPhoneデバイスに適切なアプリケーションを選択します。これにより、Xcodeデバッグブラウザーに新しいプロセスが追加され、スマートフォンアプリケーションがデバッガーにアタッチされます。


WatchKit拡張機能の単体テストの実施方法


ウォッチアプリケーションの単体テストは、iPhoneおよびiPadデバイスのアプリケーションの単体テストと同じ方法で作成されます。プロジェクトのWatchKit拡張機能に新しい単体テストの目標を追加するだけです。 ただし、監視アプリケーションをホストアプリケーションとして指定すると失敗します。


iPhoneデバイス用のアプリケーションの「目的」については、スマートフォンアプリケーション自体がホストアプリケーションとして表示されます。


また、WatchKit拡張機能の場合、ホストアプリケーションがありません

WatchKit拡張機能の単体テストの目的で、テストする各ファイルを個別に追加する必要があります。


WatchKit拡張機能から単体テストの目標まで、テストするファイルを追加します

データ共有


WatchKit拡張機能とiOSオペレーティングシステムの対応するアプリケーション間のデータ共有を整理する方法は?


これを行うには、アプリケーショングループのアプリグループをアクティブにする必要があります。これは、iPhoneデバイス用の拡張機能とそれを含むアプリケーションがアクセスできるローカルファイルシステム内のコンテナです。 複数のアプリケーショングループを定義し、さまざまな拡張機能に対してそれらをアクティブにすることができます。

アプリケーショングループをアクティブにした後、次の適切な方法を使用できます。

 let kMyAppGroupName = "com.raywenderlich.mywatchapp.container" var sharedContainerURL: NSURL? = NSFileManager.defaultManager(). containerURLForSecurityApplicationGroupIdentifier(kMyAppGroupName) 


 let kMyAppGroupName = "com.raywenderlich.mywatchapp.container" let sharedUserDefaults = NSUserDefaults(suiteName: kMyAppGroupName) 

ご注意 データの破損を回避するには、異なるプロセスが同時に共有コンテナにアクセスできるため、一貫した方法で共有コンテナのデータを読み書きする必要があります。 NSFilePresenterNSFileCoordinatorを使用して読み取りと書き込みを調整することをお勧めします。 アプリケーションの拡張機能でファイル承認APIを使用することはお勧めしません。これはハングにつながる可能性があるためです。

この動作の理由は、アプリケーション拡張のライフサイクルです。 アプリケーション拡張機能には、a)実行中、b)中断、c)完了の3つの状態しかありません。 ファイル承認APIを使用するアプリケーションの拡張機能が記録中に中断されると、そのようなプロセスはリソースを解放できなくなり、他のプロセスはブロックされます。

iPhoneまたはiPadデバイス用のアプリケーションがバックグラウンドに移動すると、アプリケーションデリゲートを介して通知を受け取り、プレゼンターオブジェクトを削除する必要があります。 アプリケーションが再び最前面に表示されたら、これらのプレゼンターオブジェクトを再度追加できます。

代わりに、 NSDataクラスのwriteToURL (_: atomically :)など、安全なストレージのアトミック操作を使用できます。 また、SQLiteとCore Dataを使用すると、操作時に一時停止された場合でも、異なるプロセス間で共有コンテナ内のデータを安全に交換できます。

詳細については、 テクニカルノートTN2408を参照してください。 拡張機能とそれを含むアプリケーションからの共有データへのアクセス。

ウォッチアプリとiPhoneアプリの間でコアデータデータベースを共有する方法


Core Dataの永続ストレージからファイルを共有するには、データ共有の例で示したものと同じメカニズムが必要です。 以下は、メカニズムの動作を示すコードスニペットです。
 let kMyAppGroupName = "com.raywenderlich.mywatchapp.container" var sharedContainerURL: NSURL? = NSFileManager.defaultManager(). containerURLForSecurityApplicationGroupIdentifier(kMyAppGroupName) if let sharedContainerURL = sharedContainerURL { let storeURL = sharedContainerURL.URLByAppendingPathComponent("MyCoreData.sqlite") var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) coordinator?.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: nil) } 


ビジネスに取り掛かる


Apple Watch用のゲームを作成できますか? どのゲームが適していますか?


どのタイプのゲームが成功するのか、ユーザーが時計でゲームをプレイしたいかどうかについて話すのは時期尚早ですが、Apple Watchを別の観点から見る必要があることはほぼ確実に言えます。

iPhoneおよびiPadデバイスでのゲーム開発には、デスクトップコンピューターでのゲームとはまったく異なる考え方が必要でした。 Apple Watchには特別なアプローチも必要です。

プラットフォームの制限についてはすでに知っています。AppleWatchにはハードウェアアクセス用のAPIがなく、ジェスチャ認識をサポートせず、画面に描画できません。 要確認:独自のインターフェース要素のみを使用できます。

しかし、これらの制限が創造的思考の逃避を止めさせないでください-それらを基本原則として考えてください。 :]

Apple Watchアプリを使用してお金を稼ぐ方法は?


それについて話すのは時期尚早です。 留意すべき点が1つあります。iAdプラットフォームはサポートされていません。また、画面サイズが小さく、ユーザーが時計アプリケーションと対話する時間を考えると、画面広告はユーザーを困らせる可能性が高く、いずれにしても経済的に正当化するほど効果的ではありませんそれのコスト。

さらに、WatchKit拡張機能がアプリケーションパッケージに含まれている場合、それを無効にしたり、ユーザーがインストールできないようにすることはできません。 したがって、アプリケーションから購入できる有料のアドオンにすることはできません。

ただし、WatchKit拡張機能を収益化する方法はまだあります。

もちろん、これはWatchKitアプリケーションの収益化の可能性を網羅したリストではありませんが、1つ明らかなのは、収益化は時計アプリケーション自体と同じくらい創造的に取り組むべきだということです。

時計アプリがApp Store用のアプリを開発することで生計を立てる新しい方法であると信じる理由はありますか


結論を出すのは時期尚早です。 そして、Apple Watchは本当に完全に新しいプラットフォームであり、興味深い機能がいっぱいで、App Storeのオープン時に見られる「ゴールドラッシュ」は見られません。

Apple Watchには別の目的があることを覚えておく必要があります。 外観と価格を考えると、スタンドアロンデバイスよりもiPhoneと通信する装飾に近いです。

ただし、WatchKit拡張機能は、1つまたは別のアプリケーションを群衆から際立たせるのに役立ちます。 iPadタブレット用に特別に設計されたアプリが、iPadにぴったり合うiPhoneスマートフォン用アプリよりも成功したように、iPhoneアプリを補完する適切に設計されたApple Watchアプリは売り上げを伸ばします。

Watch Kitについてのあなたの予想は何ですか?


翻訳者について

この記事はAlconostによって翻訳されました。

Alconostは、60の言語でアプリケーション、ゲーム、およびサイトをローカライズします 。 ネイティブ翻訳者、言語テスト、APIを備えたクラウドプラットフォーム、継続的なローカリゼーション、プロジェクトマネージャー24時間365日、あらゆる形式の文字列リソース。

また、Google PlayとApp Storeの販売、画像、広告、教育、ティーザー、エクスプライナー、予告編のサイト向けに、 広告および教育用ビデオを作成しています。

詳細: https : //alconost.com

Source: https://habr.com/ru/post/J257023/


All Articles