前提・実現したいこと
Objective-cでUIWebViewを使用しPHPからPDFを表示しております。
iPadOS13になってからPDFがテキストエディタで開いた表な状態で描画されるようになってしまいました。
iOS12のiPAdでは正常にPDFが描画されます。
iPadOS13でも正常に表示させるにはどうすればよいでしょうか?
iOS開発ほぼ初心者になります。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
ソースコード
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
iPadOS13 な iPad はいま手元にないので確認できませんが、**UIWebView は iOS8 以降は非推奨**となっていますし、Appleも日本語のページで WebKit への移行を促しているので、どんな不具合があっても仕方がないことだと思います。
投稿2020/02/25 14:12
編集2020/02/25 14:16総合スコア5086
0
ベストアンサー
開く先が確実にPDFであるなら、PDFKitを使うのがよいかと思います。
当方でも類似の問題に直面しており、現時点では顧客側要件(WebViewで表示する先が、普通のWebコンテンツとPDFとをURL等で判別できるのかどうか?)がはっきりしないため実装にまで着手できていません、対応策が固まったらこちらにもShareしたいと思います。
同じ現象ではありませんが関連するteratailの質問とStackoverflowを貼っておきます。こちらは、表示が真っ白になったり遷移しなかったりという内容です。
Mar 11, 2020 追記
仕様固めに時間がかかってしまいました。
「いったんWebコンテンツを開くが、PDFのダウンロードリンクを開く場合がある」というシチュエーションで、当方では下記のように実装しました。ご参考になれば幸いです。
objectivec
1// MyWebViewController.h 2#import <UIKit/UIKit.h> 3#import <WebKit/WebKit.h> 4#import <QuickLook/QuickLook.h> 5 6NS_ASSUME_NONNULL_BEGIN 7 8@interface MyWebViewController : UIViewController <WKNavigationDelegate, WKUIDelegate, QLPreviewControllerDataSource> 9 10@property (nonatomic) NSString *firstUrl; 11 12@end 13 14NS_ASSUME_NONNULL_END
objectivec
1// MyWebViewController.m 2 3@interface MyWebViewController() 4 5@property (nonatomic) WKWebView *webView; 6@property (nonatomic) NSString *previewFilePath; 7 8@end 9 10- (void)viewDidLoad { 11 [super viewDidLoad]; 12 self.webView = [[WKWebView alloc] init]; 13 self.webView.navigationDelegate = self; 14 self.webView.UIDelegate = self; 15 self.webView.translatesAutoresizingMaskIntoConstraints = false; 16 17 [self.view addSubview:self.webView]; 18 // 制約の設定等は省略... 19} 20 21- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { 22 NSURL *url = navigationAction.request.URL; 23 if([url.absoluteString compare:self.firstUrl] == NSOrderdSame) { 24 decisionHandler(WKNavigationActionPolicyAllow); 25 return; 26 } 27 28 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 29 [[NSURLSession.sharedSession dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 30 if(error != nil || data == nil || data.length == 0) { 31 NSString *errorDescription = [@"ファイルのダウンロードに失敗しました。" stringByAppendingString:error.localizedDescription]; 32 UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"通信エラー" message:errorDescription preferredStyle:UIAlertControllerStyleAlert]; 33 [alertController addAction:[UIAlertAction actionWithTitle:@"閉じる" style:UIAlertActionStyleDefault handler:nil]]; 34 dispatch_async(dispatch_get_main_queue(),^{ 35 [self presentViewController:alertController animated:YES completion:nil]; 36 }); 37 decisionHandler(WKNavigationActionPolicyCancel); 38 return; 39 } 40 41 // PDF以外はとりあえず通すが何が起こっても知らない 42 NSHTTPURLResponse *res = (NSHTTPURLResponse*)response; 43 if([res.allHeaderFields[@"Content-Type"] compare:@"application/pdf"] != NSOrderedSame) { 44 decisionHandler(WKNavigationActionPolicyAllow); 45 return; 46 } 47 48 NSString * __block filename = @"ダウンロードファイル"; 49 [[(NSString*)res.allHeaderFields[@"Content-Disposition"] componentsSeparatedByString:@";"] enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 50 NSArray<NSString*> *pair = [[obj stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet] componentsSeparatedByString:@"="]; 51 if([pair[0] compare:@"filename"] != NSOrderedSame) return; 52 filename = [pair[1] stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet]; 53 if([filename hasPrefix:@"\""]) filename = [filename substringFromIndex:1]; 54 if([filename hasSuffix:@"\""]) filename = [filename substringToIndex:filename.length - 1]; 55 }]; 56 57 NSString *filePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"tmp/"] stringByAppendingPathComponent:filename]; 58 [data writeToFile:filePath atomically:YES]; 59 self.previewFilePath = filePath; 60 61 dispatch_async(dispatch_get_main_queue(),^{ 62 MyQuickLookViewController* ql = [[MyQuickLookViewController alloc] init]; 63 [self.navigationController pushViewController:ql animated:YES]; 64 ql.dataSource = self; 65 [ql refreshCurrentPreviewItem]; 66 }); 67 68 decisionHandler(WKNavigationActionPolicyCancel); 69 }] resume]; 70 }); 71} 72 73// MARK: - QuickLook 74- (void)presentQuickLookPreviewController { 75 dispatch_async(dispatch_get_main_queue(),^{ 76 MyQuickLookViewController* ql = [[MyQuickLookViewController alloc] init]; 77 [self.navigationController pushViewController:ql animated:YES]; 78 ql.dataSource = self; 79 [ql refreshCurrentPreviewItem]; 80 }); 81} 82 83// MARK: QLPreviewControllerDataSource 84- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController*)previewController { 85 return 1; 86} 87 88/// プレビューするファイルのパスを NSURL で返す 89- (id<QLPreviewItem>)previewController:(QLPreviewController*)controller previewItemAtIndex:(NSInteger)index { 90 NSURL *url = [NSURL fileURLWithPath:self.previewFilePath]; 91 return url; 92}
投稿2020/02/26 02:23
編集2020/03/11 13:49総合スコア2982
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/17 00:13
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/26 01:47