2012-07-07 1 views
2

저는 압축 파일을 가지고있는 iPhone/iPad 앱을 쓰고 있습니다. 기본적으로 압축을 풀 때 실행할 수있는 웹 사이트의 콘텐츠입니다. 그러나 이러한 모든 파일과 폴더를 하나의 파일, 즉 NSBundle 파일에 넣어서 단일 파일이었던 것처럼 사용자에게 표시 할 수 있도록하고 삭제되거나 이동 될 수는 있지만 통과 할 수는 없습니다. 내가 쉽게 가져올 수 있다는 것을 알고내 파일을 NSBundle에 쓰려면 어떻게해야합니까?

(내 앱이 NSDocuments 폴더에 걸쳐 폴더를 탐색 할 수 있습니다) 자신의 프로젝트에 NSBundle 다음 웹 사이트에 그것을 읽었다. 하지만 이전에 설명한 웹 폴더와 같이 그대로 유지해야하는 파일 및 폴더가있는 기존의 디렉토리 구조를 사용하여 작성할 수 있습니까?

NSBundle이 아닌 경우 폴더를 다른 유형의 패키지로 쓸 수 있습니까?

그렇지 않다면, 당신은 내 처지

+0

사용자의 문서 디렉토리에 쓸 수 있습니다.이 질문을보십시오 : pasawaya

답변

2

이 귀하의 질문에 직접 대답하지만, 문제를 보는 또 다른 방법이 아니다을 위해 다른 제안을 할.

  1. 특히, 앱이 NSDocumentDirectory에서 폴더를 탐색 할 수 있다고 명시하셨습니다. 코드는 파일/폴더를 열거하는 코드이므로 일부 패턴 (예 : * .bundle)과 일치하는 폴더를 계층 구조의 리프 노드로 처리하도록 열거 코드를 구현하기 만하면됩니다. 사용자는 내부에 어떤 것이 있는지 절대 모를 필요가 있습니다.

  2. 한 걸음 더 나아가 문서 디렉토리에 직접 .zip 파일을 저장 한 다음 개별 URL에 대한 액세스를 요청할 때 해당 내용을 UIWebView에 직접 제공 할 수 있습니다.

    NSURLProtocol의 하위 클래스를 등록하면 모든 URL 요청을 검사 할 때 처음 균열이 생길 수 있습니다. 하위 클래스가 특정 URL (예 : 특정 호스트 또는 경로)을 처리 할 수 ​​있다고 말하면 하위 클래스의 인스턴스가 만들어져 콘텐츠를 제공하라는 메시지가 표시됩니다.

    그 시점에서 일부 우편 판독 코드 (예 : Objective-Zip)를 사용하여 요청한 파일을 zip에서 읽고 요청 내용을 다시 돌려받을 수 있습니다.

    NSURLProtocol +registerClass:을 사용하여 서브 클래스를 시스템에 등록하십시오.

    다음 예제에서 내 프로토콜 처리기는 내 사이트의 요청을 제외한 모든 요청을 무시합니다.

    MyURLProtocolRedirector.h :

    #import <Foundation/Foundation.h> 
    
    @interface MyURLProtocolRedirector : NSURLProtocol 
    + (BOOL)canInitWithRequest:(NSURLRequest *)request; 
    + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request; 
    - (void)startLoading; 
    - (void)stopLoading; 
    @end 
    

    MyURLProtocolRedirector.m :

    #import "MyURLProtocolRedirector.h" 
    
    @implementation MyURLProtocolRedirector 
    
    + (BOOL)canInitWithRequest:(NSURLRequest *)request { 
        if ([request.URL.host compare:@"martinkenny.com"] == 0) { 
        return YES; 
        } 
        return NO; 
    } 
    
    + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request { 
        return request; 
    } 
    
    - (void)startLoading { 
        NSURLResponse *response = [[NSURLResponse alloc] initWithURL:self.request.URL MIMEType:@"text/plain" expectedContentLength:11 textEncodingName:nil]; 
        [self.client URLProtocol:self didLoadData:[[NSData alloc] initWithBytes:"Hello World" length:11]]; 
        [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageAllowed]; 
        [self.client URLProtocolDidFinishLoading:self]; 
    } 
    
    - (void)stopLoading { 
    } 
    
    @end 
    

    분들은 (개념 증명)를 같은 하드 코딩 된 문자열을 반환 SomeViewController.m :

    // register the new URL protocol handler with the system 
    [NSURLProtocol registerClass:[MyURLProtocolRedirector class]]; 
    
    UIWebView *webView = [[UIWebView alloc] initWithFrame:self.view.bounds]; 
    [webView loadRequest:[[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.seenobjects.org/"]]]; 
    [self.view addSubview:webView]; 
    
+0

내가 끝내게 된 것. 전체 폴더의 이름을 바꿉니다. zip 내부의 파일에 대한 액세스를 리디렉션하는 NSURLProtocol 하위 클래스의 의미가 확실하지 않습니다. 디렉토리에 압축을 풀지 않고 zip 컨텐츠를 읽을 수있는 방법이 있습니까? – davidelias16

+0

네, 그게 제가 얻었던 것입니다. 나중에 대답을 조금 더 명확하게하려고 노력할 것입니다. 기본적으로, 앱에서 URL 요청 (http 요청을 포함하여)에서 첫 번째 크랙을 얻고 자체 콘텐츠를 제공하는 처리기를 등록 할 수 있습니다. 그 핸들러를 코드화하여 zip 파일 내부에서 직접 파일을 검색 할 수 있습니다. –