私のアプリは、iPhone/iPad で書籍を閲覧するための電子書籍リーダーです。ユーザーは、デバイスに保存された書籍を .epub ファイル (zip コンテンツ) としてダウンロードするオプションを利用できます。これにより、オフラインで書籍を表示できるようになります。ページの内容は html です。
ただし、ビデオなどの一部のアセットは、この .epub コンテンツには含まれていません。ユーザーがそのようなページに移動すると、.ePub にない外部アセットを検出し、「このコンテンツはオフライン時は利用できません」というテキストを含む単純なプレースホルダーを表示する必要があります。
これらのビデオは、iFrame html タグまたは object タグに埋め込むことができます。
現在、NSURLProtocol 抽象クラスから継承するクラスがあり、それを使用してこの要件を処理しています。これらの 3 つのメソッドの実装があります。
+ (BOOL) canInitWithRequest:(NSURLRequest *)request
- (void)startLoading
- (void) sendResponse:(NSData *)data mimetype:(NSString *)mimetype url:(NSURL *)url
私の問題は、「このコンテンツはオフラインのときは利用できません」という単純な .png があることですが、iFrame の領域が画像よりも小さい場合があるため、見苦しくなります。フィットするようにスケーリングするにはどうすればよいですか?または、より良いアプローチがありますか?コンテンツが利用できないというこのメッセージを表示できる限り、画像である必要はありません。startLoading メソッドの現在のコード:
- (void) startLoading
{
…
NSString *bundlePath = [NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle] bundlePath],@"PxeReaderResources.bundle"];
NSString *pathToPlaceholder = [NSString stringWithFormat:@"%@/%@",bundlePath,@"OfflinePlaceholder.png"]; //my placeholder image
NSLog(@"Path to placeholder is: %@", pathToPlaceholder);
data = [[NSFileManager defaultManager] contentsAtPath:pathToPlaceholder];
…
[self sendResponse:data mimetype:@"application/octet-stream" url:self.request.URL];
}
- (void) sendResponse:(NSData *)data mimetype:(NSString *)mimetype url:(NSURL *)url
{
NSDictionary *headers = @{@"Content-Type" : mimetype, @"Access-Control-Allow-Origin" : @"*", @"Cache-control" : @"no-cache"};
NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:url statusCode:200 HTTPVersion:@"HTTP/1.1" headerFields:headers];
[self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
[self.client URLProtocol:self didLoadData:data];
[self.client URLProtocolDidFinishLoading:self];
}
ご提案ありがとうございます。