IONAssetHandler.m 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #import "IONAssetHandler.h"
  2. #import <MobileCoreServices/MobileCoreServices.h>
  3. @implementation IONAssetHandler
  4. -(void)setAssetPath:(NSString *)assetPath {
  5. self.basePath = assetPath;
  6. }
  7. - (void)webView:(WKWebView *)webView startURLSchemeTask:(id <WKURLSchemeTask>)urlSchemeTask
  8. API_AVAILABLE(ios(11.0)){
  9. NSString * startPath = @"";
  10. NSURL * url = urlSchemeTask.request.URL;
  11. NSString * stringToLoad = url.path;
  12. NSString * scheme = url.scheme;
  13. if ([scheme isEqualToString:@"ionic"]) {
  14. if ([stringToLoad hasPrefix:@"/_app_file_"]) {
  15. startPath = [stringToLoad stringByReplacingOccurrencesOfString:@"/_app_file_" withString:@""];
  16. } else {
  17. startPath = self.basePath;
  18. if ([stringToLoad isEqualToString:@""] || [url.pathExtension isEqualToString:@""]) {
  19. startPath = [startPath stringByAppendingString:@"/index.html"];
  20. } else {
  21. startPath = [startPath stringByAppendingString:stringToLoad];
  22. }
  23. }
  24. }
  25. NSData * data = [[NSData alloc] initWithContentsOfFile:startPath];
  26. NSInteger statusCode = 200;
  27. if (!data) {
  28. statusCode = 404;
  29. }
  30. NSURL * localUrl = [NSURL URLWithString:url.absoluteString];
  31. NSString * mimeType = [self getMimeType:url.pathExtension];
  32. id response = nil;
  33. if (data && [self isMediaExtension:url.pathExtension]) {
  34. response = [[NSURLResponse alloc] initWithURL:localUrl MIMEType:mimeType expectedContentLength:data.length textEncodingName:nil];
  35. } else {
  36. NSDictionary * headers = @{ @"Content-Type" : mimeType, @"Cache-Control": @"no-cache"};
  37. response = [[NSHTTPURLResponse alloc] initWithURL:localUrl statusCode:statusCode HTTPVersion:nil headerFields:headers];
  38. }
  39. [urlSchemeTask didReceiveResponse:response];
  40. [urlSchemeTask didReceiveData:data];
  41. [urlSchemeTask didFinish];
  42. }
  43. - (void)webView:(nonnull WKWebView *)webView stopURLSchemeTask:(nonnull id<WKURLSchemeTask>)urlSchemeTask API_AVAILABLE(ios(11.0)){
  44. NSLog(@"stop");
  45. }
  46. -(NSString *) getMimeType:(NSString *)fileExtension {
  47. if (fileExtension && ![fileExtension isEqualToString:@""]) {
  48. NSString *UTI = (__bridge_transfer NSString *)UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)fileExtension, NULL);
  49. NSString *contentType = (__bridge_transfer NSString *)UTTypeCopyPreferredTagWithClass((__bridge CFStringRef)UTI, kUTTagClassMIMEType);
  50. return contentType ? contentType : @"application/octet-stream";
  51. } else {
  52. return @"text/html";
  53. }
  54. }
  55. -(BOOL) isMediaExtension:(NSString *) pathExtension {
  56. NSArray * mediaExtensions = @[@"m4v", @"mov", @"mp4",
  57. @"aac", @"ac3", @"aiff", @"au", @"flac", @"m4a", @"mp3", @"wav"];
  58. if ([mediaExtensions containsObject:pathExtension.lowercaseString]) {
  59. return YES;
  60. }
  61. return NO;
  62. }
  63. @end