私のアプリには2つのプリインストールされたビデオがバンドルされており、ユーザーはアプリ内購入を通じてさらに購入することができます。
_videoFilePath
各ビデオエピソードは、 (property NSString* videoFilePath
)と呼ばれるivarを持つObjective-Cオブジェクトです。
動画のダウンロードが終了すると、ファイルパスが適切に設定されます。プレインストールされたエピソードの場合、起動時に次のようなコードで1回設定されます。
NSString* fileName = [NSString stringWithFormat:@"Chapter_%03d", _episodeNumber];
self.videoFilePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"m4v"];
(エピソードメタデータは、最初の実行時にバンドルされた.plistから初期化され、その.plistのコピーが/ Documentsに保存され、後続の実行で使用されます。これは、メタデータが読み取り/書き込みであるが、バンドルされたリソースが読み取り専用であるためです。 )。
一部のユーザーは、アプリをアップグレードした後、プレインストールされたビデオを再生できることに気付きました。私は現在これを調査しているので、デバイスからアプリを削除し、バージョン1.0(Xcode-> Runから)をインストールし、アーカイブバージョン1.1をAdHocとしてインストールし、その上にインストールしました。予想どおり、プレインストールされたエピソードは再生されません。
そのため、今回は、いくつかのブレークポイントを有効にして、AdHocインストールに加えてXcodeからバージョン1.1をビルド/実行しました。
購入した(ダウンロードした)エピソードはキャッシュに保存されるため、有効なファイルパスが存在するだけでは、再生を保証するのに十分ではありません(システムによって削除される可能性があります)。したがってNSFileMananger
、次のようなコードを使用して、再生を試みる前にファイルが存在するかどうかを確認するために使用します。
if (_videoFilePath) {
// Video File Path is Set...
if ([[NSFileManager defaultManager] fileExistsAtPath:_videoFilePath]) {
// ...and file exists in system;
// Can Play:
return YES;
}
else{
// ...but file has been deleted, possibly as a result of a
// restore from iTunes backup;
// Can Not Play:
return NO;
}
}
fileExistsAtPath:
ブレークポイントは、テストが失敗したことを明らかにしました。ただし、コンソールには次の値が表示_videoFilePath
されます。
/var/mobile/Applications/CEAA80EF-A85F-4C60-929D-9BA18E8D1702/[App Name]/Chapter_001.m4v
それで、何が得られますか?
注:アプリを削除してバージョン1.1を再インストールすると、問題が解決するようです。 このバグは、1.0に加えて1.1にアップグレードした場合にのみ発生します。
補遺
少し考えた後(物事を書き留めることは助けになります)、私はそれを理解したと思います。リソースのファイルパスは、バージョン1.0の最初の実行時に取得され、残りのメタデータとともに/Documentsフォルダーに保存されます。アップグレード時に、アプリのパスの「乱数、文字、ハイフン」の部分が別のものに変更されると想定しているため、バージョン1.0からの「ハードコードされた」パスは壊れたURLになります。これを確認するには、v1.0とv1.1の両方でフルパスをNSLogする必要がありますが、私はそれを取得したと思います。回答やコメントは大歓迎です。