初心者デベロッパー:1つのバグのストーリー、またはiOSの新バージョンが気に入らない理由





最近では、AppleはiOSの新しいバージョンのベータ版を導入しました。これには、通常どおり、多くの「おいしい」機能が含まれています。 しかし、楽しいものとともに、疑問が生じます。すでにリリースされたアプリケーションは、iOSの新しいバージョンでどのように機能しますか? 一般に、モバイルOSの新しいバージョンでの古いアプリケーションの作業のテーマはめったに言及されません。 ここでは、Habrで、 「iOS SDKでの下位互換性」という記事が1つしかありませんでした。 私の話で補足したいと思います。



カットの下のテキスト-iOS 5をサポートするParallels Mobileの新しいバージョンを準備するときにたまたま行った「レーキ」の簡単な説明と、このレーキを回避する方法。 また、iOS SDKでの下位互換性のトピックに対するAppleの「特別な」態度の例と、モバイルOSの新しいバージョンに切り替える際の問題を最小限に抑える方法に関するヒントをいくつか紹介します。







バグの調査は、多くの場合、そのローカライズから始まります。つまり、いつ(そして誰によって、なぜ)承認されたかを理解することから始まります。 これを行うには、問題の場所に関連する最新の変更を検索します。 通常、誰が責任を負うかはすぐに明らかになり、何をすべきかを理解することはあまりありません。 しかし、最後のリリースバージョン以降、誰も触れていない古いコードでエラーが発生した場合、もちろんすべてが機能しますか?



状況は単純ではなく、単一の解決策はありません。 したがって、Parallels Mobile更新をリリースするときに発生した実際の問題の例を考えます。アプリケーションが起動するとき(およびバックグラウンドモードから戻るとき)、 UISegmentedControl要素の状態はページのコンテンツと一致しません。 次の図に状況を示します。







UISegmentedControlのタブを手動で切り替えて、プログラムで目的の設定を行わない場合、すべてが正しく機能します。



何らかの形でUISegmentedControlとページのコンテンツに影響を与える可能性のあるすべてのコンポーネントの調査は何も終わりませんでした:UISegmentedControlの状態に応じて、ページのコンテンツに変更を提供するコードにプロジェクトへの変更は関連付けられていませんでした。 さらなる実験により、App Storeのアプリケーションと同じソースからコンパイルされたバージョンには、前述のバグも含まれていることが示されました。 しかし、同じソースからコンパイルされたプログラムは、同じバージョンのiOSでどのように動作するのでしょうか? (実験を完了するために、アプリケーションテスト:App Storeからの古いバージョンと新しい再構築されたバージョンが同じiOSデバイスで実行されました)。



特定のタスクでグローバルな問題の調査を開始します。UISegmentedControlを詳しく見ていきます。 タブの切り替えを追跡するには、UIControlEventValueChangedイベントハンドラーを次のように登録する必要があります。



[self addTarget:self action:@selector(didValueChanged:) forControlEvents:UIControlEventValueChanged];
      
      





didValueChangedハンドラー関数は、UISegmentedControlの状態に応じてページのコンテンツを変更します。



AppleのドキュメントでこのUIコントロールをさらに調査した結果、iOS 5.0以降では、プログラムによる状態の変更によりUIControlEventValueChangedイベントが生成されなくなりました。 つまり、iOSの新しいバージョンでは、ページのコンテンツを変更するために、ユーザーではなくアプリケーションコードでセグメントが選択された場合、このイベントを明示的に生成する必要があります。



選択したセグメント番号を設定した直後にイベントを生成できます。iOSのバージョンを事前に確認することをお勧めします。そうしないと、古いバージョンのオペレーティングシステムではUIControlEventValueChangedイベントが2回生成されます。



 [self setSelectedSegmentIndex:ind]; if (SYSTEM_VERSION >= 5.0) [self sendActionsForControlEvents: UIControlEventValueChanged];
      
      





提示されたコードは問題を解決しますが、非常に重要な疑問を残しています。AppStoreのバージョンが新しいiOS 5.1でも同じように機能するのはなぜですか?



Appleのドキュメントからの回答: 「後方互換性のメカニズムとして、Appleフレームワークはアプリケーションのビルド対象のSDKのバージョンを確認することがあり、古いSDKの場合は互換性のために動作を変更します。 これは、Appleが互換性の問題を予測または発見した場合に行われます。



行くぞ! AppleがiOSの新しいバージョンで対応する変更を行うかどうかを推測しようとすると

アプリケーションが同じように機能するように、ロシアのルーレットに非常に似ています。 したがって、不可解な問題を回避するために、次の3つの単純なルールに従ってください。

  1. 特にオペレーティングシステムのメジャーアップデートが発表された場合は、 iOS APIの変更を慎重に検討してください。
  2. 新しいiOS SDKに切り替えるときに完全な回帰テストを実行します。
  3. 一連の回帰テストを展開します。 これにより、iOSの新しいバージョンに切り替えるときに問題を検出できるようになります。つまり、ソリューションの検索を絞り込み、問題の解決に必要な時間を短縮できます。


結論として、Appleはプラットフォームのバージョン間でプラットフォーム要素(UIコントロール、機能など)の動作を変更できる数少ないベンダーの1つであると言わなければなりません。 通常、既存のコンポーネントの機能が拡張されます。要素をより柔軟に制御するための新しいパラメーターが表示されます。 または、デフォルトの動作が異なる新しい要素が表示され、古いコンポーネントは廃止され、プラットフォームの新しいバージョンでは削除されます。 Appleが進化よりも革命の道を選ぶことがあるのは明らかではありませんが、 Androidに切り替えて新しいiOSに切り替える際の問題最小限に抑えることだけが残っています。



All Articles