如您所知,使用MPMoviePlayerController对象播放电影
[[MPMoviePlayerController alloc] initWithContentURL: aURL];
Run Code Online (Sandbox Code Playgroud)
现在,我想实现一个自定义NSURLProtocol,我将在其中解密已被AlgorithmDES加密的电影源.那可能吗?谢谢你给予任何想法.需要你的帮助〜
我们的应用程序中有很多Web视图,我最近添加了一个NSURLProtocol来拦截它们的一些请求.
我注意到一些Web视图多次调用+ [NSURLPRotocol canInitWithRequest:]方法,看起来是完全相同的请求.有时6或7次.我想弄清楚为什么会发生这种情况.
有人对这个有经验么?我已经注销了[NSURL absoluteString]和httpMethod值,它们对于每个请求都是相同的.我希望这个方法只能为服务器所需的任何给定文件或资源调用一次,而不是多次.它似乎每个网页都有所不同.
有任何想法吗?
我通过扩展NSURLProtocol在我的应用程序中使用自定义URL协议.它大部分时间都可以正常工作但我看到通过crashlytics报告了以下崩溃.我自己无法重现这一点.最让我担心的是,我没有在崩溃的线程的堆栈跟踪中看到我的应用程序,所以我对从哪里开始调试毫无头绪.以下是崩溃报告
Thread : Crashed: com.apple.NSURLConnectionLoader
0 libsystem_kernel.dylib 0x3562cc84 __pthread_kill + 8
1 libsystem_pthread.dylib 0x356d0733 pthread_kill + 62
2 libsystem_c.dylib 0x355c4f21 abort + 108
3 libsystem_c.dylib 0x355a47eb __assert_rtn + 302
4 CFNetwork 0x22b82e45 CFURLProtocol_NS::_protocolInterface_cancelLoad() + 322
5 CFNetwork 0x22c3740f ___ZN19URLConnectionLoader27_private_ScheduleOriginLoadEPK12NSURLRequestPK20_CFCachedURLResponse_block_invoke_2 + 38
6 CFNetwork 0x22b66ccd ___ZNK19URLConnectionLoader25withExistingProtocolAsyncEU13block_pointerFvP11URLProtocolE_block_invoke + 16
7 libdispatch.dylib 0x35513bd7 _dispatch_client_callout + 22
8 libdispatch.dylib 0x3551d187 _dispatch_block_invoke$VARIANT$mp + 446
9 CFNetwork 0x22b66caf RunloopBlockContext::_invoke_block(void const*, void*) + 18
10 CoreFoundation 0x2326ab51 CFArrayApplyFunction + 36
11 CFNetwork 0x22b66b97 RunloopBlockContext::perform() + 182
12 …Run Code Online (Sandbox Code Playgroud) 我有一个使用WebKit WebView的应用程序,我想将使用自定义URL协议加载到此WebView中的URL映射到不同的HTTP URL.例如,假设我正在加载:
定制://路径/到/资源
我想在内部实际加载:
http://something-else.com/path/to/resource
换句话说,自定义协议几乎用作速记.但我不能使用-webView:resource:willSendRequest:redirectResponse:fromDataSource :,因为我希望WebKit实际上相信这是有问题的URL,而不是简单地从一个重定向到另一个.
到目前为止,我一直在尝试使用自定义NSURLProtocol子类.然而,这比我最初想的要复杂,因为至少根据我的理解,我将不得不在NSURLProtocol子类'startLoading方法中进行实际加载.我想要一种方法将工作交给现有的HTTP协议加载器,但我找不到一种简单的方法来做到这一点.
有没有人对此提出建议,或者可能是另一种解决此问题的方法?
谢谢!
我的应用程序用于NSURLConnection与服务器通信.我们使用https进行通信.为了在一个地方处理来自所有请求的身份验证,我使用NSURLProtocol并处理该类中的委托中的身份验证.现在我决定用NSURLSession而不是NSURLConnection.我想做得到NSURLProtocol的工作与NSURLSession
我创建了一个任务,并使用NSURLProtocol通过
NSMutableURLRequest *sampleRequest = [[NSMutableURLRequest alloc]initWithURL:someURL];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.protocolClasses = @[[CustomHTTPSProtocol class]];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
NSURLSessionDataTask *task = [session dataTaskWithRequest:checkInInfoRequest];
[task resume];
Run Code Online (Sandbox Code Playgroud)
CustomHTTPSProtocol这是我的NSURLProtocol班级看起来像这样
static NSString * const CustomHTTPSProtocolHandledKey = @"CustomHTTPSProtocolHandledKey";
@interface CustomHTTPSProtocol () <NSURLSessionDataDelegate,NSURLSessionTaskDelegate,NSURLSessionDelegate>
@property (nonatomic, strong) NSURLSessionDataTask *connection;
@property (nonatomic, strong) NSMutableData *mutableData;
@end
@implementation CustomHTTPSProtocol
+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
if ([NSURLProtocol propertyForKey:CustomHTTPSProtocolHandledKey inRequest:request]) { …Run Code Online (Sandbox Code Playgroud) 我NSURLProtocol编写了一个自定义("UrlProtocol")来拦截UIWebView导航到特定网站时的请求,并在发送之前应用额外的HTTP标头.我跟着https://www.raywenderlich.com/59982/nsurlprotocol-tutorial上了一个工人阶级.我的问题是从已弃用的切换NSURLConnection到NSURLSession:我测试了一个非常简单的单文件html页面,它已成功加载.但是,具有js文件,图像等资源的稍微复杂的站点将超时,而使用NSURLConnection整个站点将在几秒钟内加载.
我将UrlProtocol使用原始粘贴NSURLConnection,然后使用新类NSURLSession.原本的:
#import "UrlProtocol.h"
#import "Globals.h"
@implementation UrlProtocol
+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
if (![request.URL.absoluteString hasPrefix:@"http"]) return NO; //No need to intercept non-http requests
if ([NSURLProtocol propertyForKey:@"handled" inRequest:request]) {
return NO;
}
return YES;
}
+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
NSString* key = @"custom-auth-header";
Globals* globals = [Globals getInstance];
NSString* token = [globals token];
NSMutableURLRequest *newRequest = [request mutableCopy]; //Create a mutable copy …Run Code Online (Sandbox Code Playgroud) 我有一个 HTML 文件,其中包含本地资源文件,例如其内容中的 css、js 和 png 文件。这些本地资源文件采用 zip 格式。我的应用程序使用 WKWebView 来显示这个 html 文件。我想找到一个解决方案来拦截 web 视图请求,以检测哪些本地资源文件与此 html 文件一起加载 -> 如果它们仍然是 zip 格式,则将它们解压缩。
我的 HTML 数据内容包含数千个这样的本地资源文件,因此在显示内容之前我无法解压缩所有这些文件。使用 UIWebView,我们使用 NSURLProtocol 子类拦截请求,检测本地资源文件并根据用户正在查看的 html 页面按需解压缩。
将 UIWebView 转换为 WKWebView 时遇到此问题。类似的问题在这里发布:https : //forums.developer.apple.com/thread/87474
======== 更新 ========>
我通过使用WKURLSchemeHandler 弄清楚了。
注意:您需要将文件方案更改为自定义方案才能使用 WKURLSchemeHandler,因为它不适用于文件、http、https 等标准方案。
1. 向 WKWebView 注册自定义方案
let configuration = WKWebViewConfiguration()
configuration.setURLSchemeHandler(self, forURLScheme: "x-file")
webView = WKWebView(frame: view.bounds, configuration: configuration)
Run Code Online (Sandbox Code Playgroud)
2. 将文件方案转换为自定义方案(x-file),然后使用 WKWebView 加载它
let htmlPath = Bundle.main.path(forResource: "index", ofType: "html")
var htmlURL = URL(fileURLWithPath: htmlPath!, …Run Code Online (Sandbox Code Playgroud) 我正在使用NSURLProtocol的子类来拦截所有HTTP调用并修改用户代理以及添加我的服务器所需的其他http头.
-(id)initWithRequest:(NSURLRequest *)request
cachedResponse:(NSCachedURLResponse *)cachedResponse
client:(id <NSURLProtocolClient>)client
{
NSMutableURLRequest* lInnerRequest;
//************************************************
lInnerRequest = [request mutableCopy];
[lInnerRequest setValue:@"MyUserAgent" forHTTPHeaderField:@"User-Agent"];
//************************************************
self = [super initWithRequest:lInnerRequest
cachedResponse:cachedResponse
client:client];
//************************************************
if (self)
{
self.innerRequest = lInnerRequest;
}
//***********************************00*************
[lInnerRequest release];
//************************************************
return self;
}
Run Code Online (Sandbox Code Playgroud)
然后我的协议使用NSURLConnection
- (void)startLoading
{
self.URLConnection = [NSURLConnection connectionWithRequest:self.innerRequest delegate:self];
}
Run Code Online (Sandbox Code Playgroud)
然后,我通过将调用转发到等效的NSURLProtocolClient方法来实现NSURLConnection中的所有委托方法.这通常很好,但是当我将数据上传到服务器时,使用NSURLConnection的代码不会被回调:
连接:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite:
我理解为什么这是因为我没有在NSURLProtocol中实现该方法,因为没有可用于报告上载进度的等效NSURLProtocolClient方法.
有人找到了解决方法吗?
我在通过NSURLProtocol子类中的特殊协议方案处理视频请求时遇到了一些问题.每个其他资源(图像/文本)都得到正确处理,但是,当发送视频请求时,我只会调用'canInitWithRequest'而不会跟进.所以,我的视频资源无法解决.现在,我环顾四周,发现没有明确的解决办法.有些人使用嵌入式HTTP服务器,但这似乎有点过分.有谁知道这是一个错误,或者如果没有,为什么这个限制,是否有解决方法?
类似的问题:在HTML5文档中加载视频时,WebView的自定义NSURLProtocol类不起作用,但遗憾的是没有答案.
我有一个在后台队列中运行的NSURLSession.我正在添加我的NSURLProtocol子类,NSURLsessionConfiguration.protocolClases但override class func canInitWithRequest(request: NSURLRequest) -> Bool永远不会被调用.
这就是我添加我的方式 NSURLProtocol
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.protocolClasses!.append(MockNetwork)
urlSession = NSURLSession(configuration: configuration, delegate: self, delegateQueue: operationQueue)
Run Code Online (Sandbox Code Playgroud)
此外,我尝试使用不在后台运行的会话,但也没有工作:
let configuration = NSURLSessionConfiguration.defaultSessionConfiguration()
configuration.protocolClasses!.append(MockNetwork)
urlSession = NSURLSession(configuration: configuration)
Run Code Online (Sandbox Code Playgroud)
由于这不起作用我只是尝试:
urlSession = NSURLSession.sharedSession()
Run Code Online (Sandbox Code Playgroud)
并在我的AppDelegate中调用它
NSURLProtocol.registerClass(MockNetwork)
Run Code Online (Sandbox Code Playgroud)
这确实有用,我做错了什么?!
nsurlprotocol ×10
ios ×7
nsurlsession ×3
cfnetwork ×1
cocoa ×1
css ×1
ios9 ×1
ipad ×1
iphone ×1
javascript ×1
nsurl ×1
objective-c ×1
request ×1
sigabrt ×1
swift ×1
uiwebview ×1
url ×1
webkit ×1
wkwebview ×1
xcode ×1