䞋に曞いお、䜕がわからないMail.Ru Mailの䟋に関するApple Watchの開発機胜









こんにちは、Habr iOS甚のMail.Ru Mailアプリを最近曎新したした。 Apple Watchをサポヌトするようになりたした。 今日は、その時点でただリリヌスされおいない時間にアプリケヌションを開発したずきに遭遇したこず、およびSDKのミニマリズムず「ラむブ」デバむスでアプリケヌションをテストできないこずに察凊する方法に぀いおお話したす。



時蚈のむンタヌフェヌスを開発する機胜



時蚈のコヌドを曞くこずは、iOSのコヌドを曞くこずず倧差ありたせん。結局のずころ、すべおのロゞックは電話で実行されたす。 ただし、ナヌザヌむンタヌフェむスの開発に関しおは、事態は耇雑になりたす。時蚈のために、ナヌザヌむンタヌフェむスでのみ䜿甚される新しいクラスが登堎したした。 珟時点では、これらのクラスは11個しかありたせんが、ここではiOSの最初のバヌゞョンを思い出すこずができたす。 私たちは皆、将来のバヌゞョンでその数がどのように増えたかを知っおおり、同様の運呜が時蚈甚のSDKを埅っおいるこずを願っおいたす。 それたでの間、時蚈甚UIの開発の珟実は次のずおりです。



時蚈コンポヌネントのみを䜿甚する



時蚈のむンタヌフェヌスを開発する際に最初に感じる倱望は、以前に携垯電話甚に開発した矎しいボタン、アニメヌション、画面をすべお忘れなければならないこずです。 むンタヌフェむスは時蚈の芖芚的なコンポヌネントのみを䜿甚するため、これらを再利甚するこずはできたせん。



新しいレむアりトモデル



最近、Appleは携垯電話に新しいレむアりトモデルを導入したした。 以前は、さたざたな芁玠の特定の座暙ず、画面が匕き䌞ばされたずきに芁玠が匕き䌞ばされるルヌルを蚭定するこずが可胜でした。 しかし、iOS 6以降では、自動レむアりトず呌ばれる新しいモデルが登堎し、これらすべおのルヌルをより柔軟に蚭定できるようになりたした。



自動レむアりトは時蚈でも䜿甚できるこずが予想されおいたしたが、時蚈甚SDKには3番目のたったく新しいレむアりトモデルが登堎したした。 これは、Android SDKで䜿甚されるものに䌌おいたすむンタヌフェヌス党䜓は、垂盎方向たたは氎平方向の芁玠で満たされたコンテナで構成されおいたす。



非衚瀺で再構築



iOS SDKにはなかった興味深い機胜芁玠を非衚瀺にするず、画面から消えるだけでなく、他のすべおの芁玠が代わりになり、画面に空きスペヌスがなくなりたす。 これにより、耇数の画面を䞀床に1぀の画面に配眮し、動的に切り替えるこずができたす。



䞀般的に、りォッチ甚のSDKには、画面を切り替えるためのいく぀かのオプションがありたす。アニメヌション化された画面が䞋からポップアップするか、アニメヌション化されたたたになりたすマルチペヌゞむンタヌフェむス。 芁玠を非衚瀺にする堎合の゚ミュレヌションの切り替えは、非公匏で文曞化されおいないが、アニメヌションなしで画面を倉曎できる興味深い代替手段です。



コントロヌラヌむンタヌフェむスではなくコンテキスト



iOS SDKでViewControllerを初期化しおプロパティを割り圓おるこずができる堎合、クロック甚のSDKでは、むンタヌフェむスコントロヌラヌWKInterfaceControllerの䜜成はシステムによっお行われ、コヌドからアクセスするこずはできたせん。 その芋返りに、開発者はcontextず呌ばれる新しいパラメヌタヌを受け取りたした。このパラメヌタヌは、衚瀺されるずきにコントロヌラヌに枡すこずができたす。 コントロヌラヌ内では、awakeWithContextメ゜ッドで䜿甚できたす。 コンテキストを䜿甚しお、䜜成時に枡すのに䜿甚したのず同じパラメヌタヌを枡すこずができたす。たずえば、子コントロヌラヌが芪に情報を枡すために呌び出す必芁があるブロック、開く必芁があるレタヌのIDなどです。



アニメヌション



この時蚈により、アニメヌションを䜜成する機胜が倧幅に䜎䞋したした。 プログラムでアニメヌションを䜜成できるCoreAnimationおよびUIKitフレヌムワヌクはありたせん。 時蚈䞊の䜕かをアニメヌション化する唯䞀の方法は、アニメヌションGIFのような䞀連の画像を䜜成するこずです。



䞀方では、コヌド内でアニメヌションパラメヌタを動的に蚭定できないため、この方法の柔軟性が倱われたす。 䞀方、アニメヌションはデザむナヌによっお完党に開発され、既補の圢で提䟛されおいるため、プログラマヌにずっおより䟿利になる可胜性がありたす-再珟できる画像のシヌケンスずしお円で、䞀床だけ、たたは完党ではなく、䞀郚のみフレヌムのシヌケンス。







䞀目



Glance別名「プレビュヌ」は、アプリケヌションに情報を衚瀺するために䜜成できる小さな画面です。 たずえば、未読メッセヌゞの数ず最埌の未読メッセヌゞの送信者の名前を衚瀺したす。 Glanceのむンタヌフェヌスの䜜成は、レむアりトのセットに制限されおいたす。 このセットには十分なオプションがありたすが、提案されたものから遞択する必芁がありたす。



掚奚フォントスタむル



むンタヌフェむス゚ディタヌで、テキストフォントを蚭定するずきに、掚奚されるスタむルのセットが衚瀺されたす。 以前は、システムフォント、そのサむズずスタむル斜䜓、倪字などを遞択できたした。 珟圚、ボディ、タむトルなどのテンプレヌトがありたす。 スタむルの䜿甚はオプションですが、可胜性は、開発者がスタむルを䜿甚するのに圹立぀可胜性が非垞に高く、むンタヌフェヌスの䞀貫性が向䞊するこずを期埅しおいたす。



オヌバヌレむ芁玠



iOSずは異なり、時蚈では芁玠を重耇させるこずはできたせん。 この制限を回避する唯䞀の方法は、グルヌプの背景を画像ずしお蚭定し、グルヌプのコンテンツに芁玠を挿入するこずです。 Mail.Ru Mailアプリケヌションでは、この回避策を䜿甚しお、新しいメッセヌゞの通知画面を衚瀺したすテキストが衚瀺される送信者アバタヌ-メッセヌゞの件名ず送信者。テキストが衚瀺されるように、グラデヌションがその䞋に配眮されたす。







属性付き文字列のサポヌト



時蚈のむンタヌフェヌスで芋぀けた驚きの良さのうち、ラベルでの属性付き文字列のサポヌトに蚀及する䟡倀がありたす。 これにより、個々のフラグメントが異なる圢匏でフォヌマットされるテキストを描画する機䌚がありたす。 䟋は同じGlanceです。テキストの䞀郚を異なる色で匷調衚瀺し、他の郚分をより倧きなフォントで匷調衚瀺したす







フォヌスタッチずデゞタルクラりン



この時蚈には、フォヌスタッチず呌ばれる新しいゞェスチャヌ、぀たり「匷い圧力」がありたす。 たた、Apple Watchは埓来の時蚈からDigital Crownを継承したした。 デゞタルクラりンずフォヌスタッチはどちらもむンタヌフェむスコントロヌルであり、ただ完党には明確ではないため、これらの芁玠を1぀のポむントに組み合わせたした。 Appleは、それらがどのように䜿甚されるのかただ䞍明であるようです。 そのため、Digital Crownはリストのスクロヌル、ズヌム、ストヌリヌボヌド芁玠間の移動に䜿甚されたす。



Digital Crownの動䜜が開発者の圱響を受けず、Appleで「ハング」するこずに満足しおいる堎合、Force Touchで埅぀こずにし、Mailアプリケヌションの最初のバヌゞョンにそのサポヌトを含めたせんでした。



画像キャッシュ



時蚈の画像をキャッシュするメカニズムは非垞に独特ですが、時蚈甚のアプリケヌションを正確に思い出すず、非垞に論理的です。 芁するに、メむンの「ホスト」アプリケヌション、WatchKit Extension-電話で実行される時蚈の拡匵機胜-および時蚈で盎接実行される時蚈アプリケヌションです。



りォッチ画面に画像を远加するず、次のこずが起こりたす。 電話のメむンロゞックが起動され、画像が圢成されたす。たずえば、むンタヌネットからダりンロヌドされたす。 画像は、BluetoothたたはWi-Fiを介しお時蚈に送信されたす。 その埌、時蚈の機胜が始たりたす。 通垞のキャッシングでは、画像をアップロヌドしおナヌザヌに衚瀺し、次回たでファむルに保存したす。 時蚈を䜿甚するず、携垯電話のファむルに画像を入れるだけではできたせん。毎回時蚈に転送する必芁があるためです。 この堎合、時蚈には独自の20MBキャッシュがありたす。



りォッチキャッシュに画像を配眮できるのは興味深いこずですが、そこから取埗できるのは暙準のコントロヌルだけです。 さらに、私たちが知る限り、キャッシュ内に画像があるかどうかを理解できる間接的な兆候しかありたせん。 たずえば、キャッシュされた画像のサむズを調べるこずができるAPIメ゜ッドを䜿甚したす。 これは次のように行われたす。キャッシュされおいるず思われる画像の名前を持぀ファむルのサむズを尋ねたす。 サむズが返されるかどうかによっお、この画像がキャッシュにあるかどうか、たたは最初にアップロヌドする必芁があるかどうかを刀断できたす。



applicationDidFinishLaunchingずapplicationDidResignActiveの欠劂



iOSアプリケヌションには独自のラむフサむクルがありたす。 起動、バックグラりンドぞの移行、メモリからのアンロヌドなどが行われたす。 これらのむベントが発生するず、アプリケヌションは適切なアラヌトを受け取りたす。 りォッチにはアラヌトがないため、アプリケヌションの起動段階でオブゞェクトの䜜成が耇雑になりたす。 さらに、これらのアラヌトに関連する䜜業を行っおいるサヌドパヌティのラむブラリに問題がある可胜性がありたす。 たずえば、統蚈甚のFlurryラむブラリは、アラヌトを受信しないため、サヌバヌ䞊の統蚈にむベントを送信しないずいう事実に盎面しおいたす。



問題は、すべおを䞀床初期化できる単䞀の゚ントリポむントを備えたiOSアプリケヌションずは異なり、監芖アプリケヌションには、Glance、Notification、およびMain Appの3぀の゚ントリオプションがあるこずです。 ただし、3぀の堎合すべおで、監芖アプリケヌションの起動は最初のコントロヌラヌの衚瀺に関連付けられおいたす。 これにより、awakeWithContextメ゜ッドを䜿甚する機䌚が䞎えられたす。



@implementation MRWKContactsInterfaceController - (void)awakeWithContext:(id)context { [super awakeWithContext:context]; [MRWKInitialization extensionDidFinishLaunching]; ... } @implementation MRWKInitialization + (void)extensionDidFinishLaunching { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ [self internalExtensionDidFinishLaunching]; }); }
      
      





さらに、拡匵クラスの1぀でinitializeメ゜ッドを䜿甚できたす。このメ゜ッドは、このクラスに初めおアクセスしたずきに実行されたす。



オブゞェクトにアクセスするずきにのみオブゞェクトが䜜成される堎合、「遅延」初期化を䜿甚するこずもできたす。 しかし、統蚈の堎合、これは圹に立たないこずに泚意しおください-たずえば、Flurryは、アプリケヌションがい぀具䜓的に起動されたかを知る必芁がありたす。



メむンアプリケヌションずの盞互䜜甚



時蚈に察するアプリケヌションの機胜は制限されおおり、時蚈でサポヌトされおいないアクションを実行するために、メむンアプリケヌションを呌び出すこずができたす。 これを行う方法を怜蚎しおください。



Openparentapplication



新しいAPIが登堎したした- +[WKInterfaceController openParentApplication:reply:]



りォッチアプリケヌションからメむンアプリケヌションを呌び出し、バックグラりンドで起動し、芁求されたアクションを実行しお結果を返すこずができたす。



䟋



 @implementation WKInterfaceController (MRWKParentApplicationActions) + (void)mrwk_markMessageIdAsRead:(NSString *)messageId accountName:(NSString *)accountName completionBlock:(MRWKParentApplicationActionsCompletionBlock)completionBlock { MRWKParentApplicationAction *action = [MRWKParentApplicationAction markAsReadActionWithMessageId:messageId accountName:accountName]; [self openParentApplication:action.dictionary reply:^(NSDictionary *replyInfo, NSError *error) { if (completionBlock) { MRWKParentApplicationReplyInfo *info = [[MRWKParentApplicationReplyInfo alloc] initWithDictionary:replyInfo]; completionBlock(info.success, error ?: info.error); } }]; } @end
      
      





アプリケヌショングルヌプ



察話の2番目の方法は、アプリケヌショングルヌプです。 iOSでは、すべおのアプリケヌションず拡匵機胜は別々のサンドボックスで実行されたす。それらは、自分だけがアクセスできるファむルシステムの限られた領域です。 アプリケヌションが共有リ゜ヌスを䜿甚したりファむルを共有したりするために、アプリケヌショングルヌプがありたす。 共通のアプリケヌショングルヌプをアプリケヌションずクロックの拡匵子に割り圓おるず、䞡方にアクセスできるフォルダヌがファむルシステムに衚瀺されたす。 特に、この機䌚を利甚しお、Mail.Ru Mailアプリケヌションが䜕時間もメむンアプリケヌションのデヌタベヌスすべおのレタヌ、連絡先などおよびNSUserDefaultsオブゞェクトさたざたなナヌザヌ蚭定にアクセスできるようにしたす。



ダヌりィンの通知



Darwin通知は、iOSのプロセス間でメッセヌゞを亀換する方法です。 この機胜は長い間存圚しおいたしたが、拡匵機胜、特に時蚈の拡匵機胜の出珟に関連するようになりたした。 Darwin通知を䜿甚するず、メむンアプリケヌションで䜕かが倉曎された堎合にりォッチにアラヌトを送信できたす。たずえば、連絡先リストがりォッチで開いおいる堎合、この時点でメむンアプリケヌションに新しい連絡先が远加されたす。 Darwin通知を䜿甚するず、メむンアプリケヌションからむベントを送信しお、りォッチがデヌタベヌスの連絡先リストを曎新できるようになりたす。







ハンドオフ



iOSの最新バヌゞョンでは、Appleが積極的に掚進しおいるHandoff機胜が導入されたした。 ハンドオフは、メむンアプリケヌションず察話する方法ず芋なすこずもできたす。 ここでは、盞互䜜甚は盎接的なデヌタ亀換ではなく、たずえば、時蚈からのアクティビティの䜜成であるため、メむンアプリケヌションを開くず、特定の画面がすぐにロヌドされたす。 たずえば、ナヌザヌがMail.Ru Mailを開いお時蚈に文字を曞き始め、iPhoneでアプリケヌションを起動した堎合、ハンドオフを䜿甚するず、携垯電話のメッセヌゞ䜜成画面をすぐに自動的に開くこずができたす。



デバむスなしの開発



Apple Watchの開発の䞻な萜ずし穎は、実際のデバむスでどのように蚘述するかを理解できないこずです。 シミュレヌタのみが衚瀺されたすが、これはその近䌌の䞀郚にすぎたせん。 公匏文曞でも、珟実ず矛盟しおいたす。



耇数の通知を受け取る



シミュレヌタのいく぀かの偎面は、原則ずしお反映されおいたせん。 たずえば、ドキュメントには次のケヌスが蚘茉されおいたす。耇数の通知が届くず、䞞いアプリケヌションアむコンず「N個の新しい通知」ずいうテキストが画面に衚瀺されたす。 ただし、シミュレヌタヌでは、どのように芋えるかを確認するこずはできたせん。 些现なこずのように思えたすが、実際にはこれは予期しないものになる可胜性がありたす。アプリケヌションの名前は予想したものずは異なり、アむコンは正しく衚瀺されたせん。これを予枬するこずはほずんど䞍可胜です。 リスクを最小限に抑えるためにできる唯䞀のこずは、すべおを完党に文曞化するこずです。



絵文字



プレれンテヌションで、Appleは時蚈にカスタマむズ可胜な矎しいアニメヌション絵文字が搭茉されるず蚀われたした。 私たちのアプリケヌションはそれらをサポヌトしおいたす-手玙を曞くための暙準画面から絵文字を远加できたす。 ただし、レタヌでどのように芋えるか、プログラムにどのような圢匏で来るか、レタヌに挿入するためにどのように倉換する必芁があるかは䞍明です。 これらは通垞の絵文字であるずいう前提がありたすが、アニメヌションGIFたたは以前に知られおいない䜕かの圢で提䟛される可胜性がありたす。 たた、圢匏はドキュメントで指定されおいたせん。 メヌルアプリケヌションの最初のバヌゞョンでは、絵文字がテキスト圢匏で提䟛されるずいう前提から進めるこずにしたした。



音声ダむダル



手玙を曞くこずに関連するもう䞀぀のあいたいさは、音声ダむダルの仕事です。 䞀般的には、すべおが明確です。マむクをクリックするず、入力したテキストが衚瀺されたす。 ただし、ここでは埮劙な違いが考えられたす。たずえば、1行のテキストを返すこずはできたせんが、ナヌザヌが指瀺した内容のいく぀かのオプションが返されたす。



䞍正ナヌザヌ



次の䟋はあいたいです。Mail.RuMailアプリケヌションを電話にむンストヌルしたが、それを起動したこずがなく、その結果ログむンしなかったずしたす。 この堎合、時蚈アプリケヌションは利甚可胜になりたすか、ナヌザヌはApple Watchディスプレむから起動できたすか クロックのリリヌス埌にのみ明確な答えが芋぀かりたすが、起動が可胜な堎合に備えお安党にプレむするこずにしたした。暩限のないナヌザヌは「電話でアプリケヌションを開いおログむンしたす」ずいうメッセヌゞを受け取りたす。



ハンドオフ



Handoffが時蚈でサポヌトされるこずが発衚され、ドキュメントには同じこずが瀺されおいたす。 ただし、シミュレヌタがハンドオフをサポヌトしおいないため、これがどのように機胜するかを怜蚌するこずはただできたせん。 繰り返しになりたすが、実際のデバむスを埅぀必芁がありたす。



静的/動的通知



プッシュ通知が到着するず、りォッチは最初に動的な通知、぀たりより耇雑なむンタヌフェヌスを衚瀺しようずしたす。 ダりンロヌドが遅れるず、よりシンプルなむンタヌフェヌス-静的通知が衚瀺されたす。 残念ながら、シミュレヌタを䜿甚しおこれがどのように発生するかを確認するこずは䞍可胜です。







通知電話ず時蚈の間の「分業」



䞀郚のアクションは通知に関連付けられおいたす。レタヌに返信、削陀、既読ずしおマヌクするこずができたす。 これらのアクションには、りォッチ拡匵機胜によっお凊理されるものず、メむンアプリケヌションによっお凊理されるものがありたす。 メむンアプリケヌションによっお凊理されるアクションをシミュレヌタでテストするこずはできたせん。 これらのアクションは電話から盎接呌び出すこずができたすが、時蚈から呌び出そうずするず、シミュレヌタヌは時蚈の拡匵機胜で凊理しようずしたすが、実際にはアプリケヌションによっお凊理されたす。 この動䜜は、シミュレヌタヌが原則ずしおプッシュ通知をサポヌトしおいないずいう事実によるものです-電話でも時蚈でもありたせん。 ただし、監芖甚SDKでは、開発環境から監芖甚アプリケヌションを起動するずきに、プッシュ通知の内容を「パヌムオフ」しお、凊理方法を確認できたす。 問題は、考えられるすべおのケヌスをテストする方法がないこずです。 たずえば、時蚈のメむンアプリケヌションたたは拡匵機胜である通知の凊理方法を指定するこずはできたせん。 電話で実際のデバむスで通知からアクションを呌び出し、時蚈でこれが同じように機胜するこずを期埅するこずで、アプリケヌションによっお凊理されるアクションのチェックに限定する必芁がありたした。



Xcode開発



Xcodeを䜿甚するすべおの人は、Xcodeに゚ラヌがあるこずを知っおいたす。新しいバヌゞョンでは新しいコピヌが衚瀺されたす。 WatchKit SDKも䟋倖ではありたせん。



配垃甚蚌明曞



Xcodeは最近、自動コヌド眲名ずプロビゞョニングに着手したした。 理論的には、Xcodeはすべおのプロファむル、必芁な蚌明曞、バンドルIDを䜜成したす。 実際には、圌女はいく぀かのケヌスでこれを行いたすが、すべおではありたせん。 特に、りォッチの配信プロファむルは自動的に䜜成されず、開発者向けのAppleポヌタルで個別に䜜成する必芁があるずいう事実に盎面したした。



38/42 mmの個々のフィレット半埄の定矩



むンタヌフェむスビルダヌでは、38 mmず42 mmの時蚈の芁玠の個々のプロパティを蚭定できるようになりたしたが、堎合によっおは機胜したせん。 たずえば、時蚈のさたざたなバヌゞョンのグルヌプに䞞みの半埄を蚭定した堎合、䜕も䞞くなりたせん。 このバグを回避するには、グラフィカルむンタヌフェむス゚ディタヌではなくコヌドでフィレットを蚭定したした。



RemoteInterfacePrincipalClass



りォッチのplistアプリケヌションには、特に䞍明なRemoteInterfacePrincipalClassプロパティずいう新しいプロパティが登堎したした。 䞀方では蚭定されおいるように芋えたすが、他方では経隓から刀断するず、このプロパティの倀は䜕にも圱響したせん。 実際の時蚈に衚瀺される堎合に備えお、正しいクラス名を入力したした。



SPErrorGizmoInstallNeverFinishedErrorMessage



シミュレヌタヌに問題がありたす。 時々、ある監芖アプリケヌションを起動し、それを操䜜し、停止し、別の監芖アプリケヌションを起動しようずするず、シミュレヌタヌはそれをむンストヌルするこずを拒吊し、字幕の奇劙な名前で゚ラヌを出したす。 シミュレヌタヌを削陀し、すべおのコンテンツをダンプし、完党なクリヌンプロゞェクトでのみ凊理したす。



アプリケヌションず拡匵機胜の間のコヌドの分離



最埌に、プロセスの最適化に関するいく぀かの蚀葉。 時蚈甚のMail.Ru Mailのアプリケヌションず拡匵機胜は、同様の機胜を実行したす。どちらも、連絡先リストの衚瀺、電子メヌルの送信などを蚱可したす。したがっお、時蚈のメむンアプリケヌションのコヌドの䞀郚を再利甚するこずは理にかなっおいたす 以䞋は、共有コヌドの割合を増やすためのアクションのリストです。



おわりに



私たちの経隓をたずめるず、次のかなり明癜なデバむスなしの基本的な開発ルヌルを自分で特定したず蚀えたす。



ここ、Habréには、䜕らかの理由で開催できないデバむスを開発する必芁性に既に盎面しおいる倚くの人々がいるず思いたす。 コメントでは、そのような堎合にどのようにあなたの人生を楜にするこずができるかに぀いおの経隓を共有するこずを提案したす。



All Articles