次の方法で共有


iOS 9 の互換性

iOS 9 の機能をすぐにアプリに追加する予定がない場合でも、最新バージョンの Xamarin でアプリを再構築する必要があります。

重要

このページの情報は、iOS 8 以前を対象とする App Store に既に存在するアプリを持ち、iOS 9 の互換性に関する更新プログラムをまだ提出していないお客様を対象としています。 すでに最新バージョンの Xcode 7 と Xamarin.iOS 9 をアプリ開発に使用している場合は、iOS 9 の概要をご覧ください。

最初の iOS 9 ベータが登場したとき、以前のバージョンの Xamarin で、これまでのアプリが iOS 9 で起動できないという 2 つの問題が確認されました。

  • iOS 8 以前で構築されたアプリは、32 ビット デバイスで起動できません (Unified API で構築されたアプリを含む)。
  • 完全パスが指定されていない場合、P/Invoke に失敗します。

Xamarin のインストールを最新の安定チャネル リリースに更新した後、アプリを再構築して再デプロイすると、これら 2 つの問題は解決されます。

iOS 9 の機能でアプリをすぐに更新する予定がない場合でも、最新バージョンの Xamarin を使用して再構築し、App Store に再提出することをお勧めします

再提出しておくことで、顧客がアップグレードした後でもアプリが iOS 9 で動作するようになります。 iOS 8 を引き続きサポートできます。最新リリースで再構築しても、アプリケーションのターゲット バージョンには影響しません。

iOS 9 で既存のアプリのテスト中にさらに問題が発生した場合は、以下の「互換性の向上」セクションを参照してください。

Visual Studio での更新

Visual Studio が最新の安定バージョンに更新されていることを明示的に確認することをお勧めします。

コンポーネント、NuGet、およびその他のライブラリについて

上記の 2 つの問題に対処するために、使用しているコンポーネントまたは Nuget の新しいバージョンを待つ必要はありません。 これらの問題は、Xamarin.iOS の最新の安定リリースでアプリを再構築するだけで修正されます。

同様に、コンポーネント ベンダーと NuGet の作成者は、上記の 2 つの問題を修正するためだけに、新しいビルドを提出する必要はありません。 ただし、コンポーネントまたは NuGet が UICollectionView を使用していたり、Xib ファイルからビューを読み込む場合は、以下で説明する iOS 9 の互換性の問題に対処するために更新プログラムが必要になる場合があります

コードの互換性の向上

以前のバージョンの iOS で動作していた コード パターンが、iOS 9 で破損するケースがいくつかあります。 iOS 9 でテストする際に発生する可能性のある問題 (およびその解決策) を次に示します。

UICollectionViewCell.ContentView がコンストラクターで Null である

理由: iOS 9 では、UICollectionView ドキュメントの状態で記載されているように、iOS 9 の動作が変更されたため、initWithFrame: コンストラクターが必要になりました。 指定した識別子のクラスを登録し、新しいセルを作成する必要がある場合は、その initWithFrame: メソッドを呼び出すことによってセルが初期化されます。

修正: 次のように initWithFrame: コンストラクターを追加します。

[Export ("initWithFrame:")]
public YourCellClassName (CGRect frame) : base (frame)
{
    Initialize (); // refactor initialize code into a method
}

関連サンプル: MotionGraphTextKitDemo

Xib/Nib からビューを読み込むと UIView がコーダーで初期化に失敗する

理由:initWithCoder: コンストラクターは、Interface Builder Xib ファイルからビューを読み込むときに呼び出されるコンストラクターです。 このコンストラクターがエクスポートされていない場合、アンマネージ コードはマネージド バージョンを呼び出すことはできません。 以前は (iOS 8) ビューを初期化するために IntPtr コンストラクターが呼び出されていました。

修正: 次のように initWithCoder: コンストラクターを作成してエクスポートします。

[Export ("initWithCoder:")]
public YourClassName (NSCoder coder) : base (coder)
{
    Initialize (); // refactor initialize code into a method
}

関連サンプル: チャット

Dyld Message: No Cache Image with Name...

ログに次の情報が記録されてクラッシュすることがあります。

Dyld Error Message:
Dyld Message: no cache image with name (/System/Library/PrivateFrameworks/JavaScriptCore.framework/JavaScriptCore)

理由: これは、Apple のネイティブ リンカーのバグです。この問題は、プライベート フレームワークをパブリックにすると発生します (JavaScriptCore はプライベート フレームワークとなる前に iOS 7 でパブリックにされました)。フレームワークがプライベートだったとき、アプリのデプロイ ターゲットは iOS バージョンでした。 この場合、Apple のリンカーは、パブリック バージョンではなく、プライベート バージョンのフレームワークとリンクします。

修正: これは iOS 9 で対処されますが、それまでの間、適用できる簡単な回避策があります。プロジェクトの新しい iOS バージョンをターゲットにするだけです (この場合は iOS 7 を試すことができます)。 他のフレームワークでも同様の問題が発生する可能性があります。たとえば、WebKit フレームワークが iOS 8 でパブリックにされました (そのため、iOS 7 をターゲットにすると、このエラーが発生します。アプリで WebKit を使用するには iOS 8 をターゲットにする必要があります)。