Protecting resources in iPhone and iPad apps

by Robin Summerhill on July 20, 2010

UPDATE: The example project has been updated to work with iOS5.

If you are distributing an iPhone or iPad app you may be giving away more than you realize. Resources that you embed in your application bundle can be extracted very easily by anyone who has downloaded the app with iTunes or has the app on their iOS device. This is not such a problem if those resources are just parts of your UI or the odd NIB file, but once you realise that your high-value resources, such as embedded PDFs, audio files, proprietary datasets and high-resolution images are just as accessible then you might want to consider how to protect those resources from prying eyes or unauthorised use outside your application.

To see just how accessible your resources are, use a tool such as iPhone Explorer to connect to your device. This tool lets you browse all the app bundles on your device and copy any resource to your Mac or PC. Alternatively, just locate the ipa file that is downloaded when you purchase an app with iTunes, change the extension to ‘.zip’ then unzip it. All your resources are on display.

Protection through encryption

In this article I’m going to walk through one approach to protecting your resources from unauthorised use outside your application. During the build phase, your high-value resources will be encrypted before being embedded in the app bundle. These resources can then be decrypted on-the-fly when required in your app. I had a number of goals in mind when developing the solution presented in this article:

  • Adding new resources to be encrypted should be quick and easy.
  • The encryption process should be completely automatic during the build phase.
  • Encrypted PDFs or HTML files must be useable in an embedded UIWebView
  • Decryption must be in-memory and not create temporary unprotected files

I also did not want to complicate the submission process by introducing encryption that might be subject to export restrictions, so we are limiting ourselves to using the CommonCrypto API, which is already distributed as part of iOS. The usual caveats apply when using any sort of encryption approach – given enough time and determination someone will bypass any protection scheme you can come up with. However, make it difficult enough to crack the protection compared to the value of the protected resources and it becomes a question of economics. If you are working with client-supplied resources then it becomes even more important to use a scheme such as the one described here to protect yourself from charges of negligence should those resources turn up on some torrent site.

An encryption command-line tool

So, down to the details. We’re going to create a simple command-line tool that will be run as part of the build process to encrypt resources using the AES256 symmetric cipher. An Xcode project to build the tool can be found at the bottom of this article. The tool takes command-line arguments specifying a 256-bit key, the input file path and an output file path. We will use a custom build step to call the command-line tool for each of our resources that we want to be encrypted.

Setting up our project

XCode project showing EncryptedResources folder and custom build step

Now we have a tool to perform the encryption, we can turn to an example project that makes use of the encryption to protect embedded resources. You can find an example Xcode project at the end of this article. This sample simply displays a UIWebView when run and populates it with protected HTML and image files, which are embedded as encrypted resources in the app.

The first step is to create a sub-folder under the project folder to contain the original resources that we want to protect. In the example we have called this sub-folder ‘EncryptedResources’. One of our goals was to make adding new resources as quick and easy as possible and when we have finished setting up the project we will be able to add a new protected resource simply by dragging it into this folder within Finder. As a cosmetic convenience I also added the folder to the Xcode project as a folder reference (by checking the ‘Create Folder References for any added folders’ checkbox) but please remember to deselect any target membership on the ‘Targets’ tab of the Info dialog for this folder or the unencrypted resources will be added to the app bundle by the regular ‘Copy Bundle Resources’ build step.

Adding a custom build step

To process the files in the EncryptedResources folder, we add a custom build step by selecting the ‘Project > New Build Phase > New Run Script Build Phase’ menu item in Xcode. In the example we have moved this build step to the start of the project target (under the Targets > EncryptedResourceDemo item in the ‘Groups and Files’ list) so that it is run as the first step in the build process. The shell script associated with this step can be viewed by selecting the ‘File/Get Info’ menu item when the step is selected:

if [ ! -d "$OUTDIR" ]; then
  mkdir -p "$OUTDIR"
for file in "$INDIR"/*
  echo "Encrypting $file"
  "$PROJECT_DIR/crypt" -e -k $ENC_KEY -i "$file" -o "$OUTDIR/`basename "$file"`"

The shell script iterates over every file in the ‘EncryptedResources’ folder and calls our ‘crypt’ tool for each file, placing the encrypted output in the application bundle. Note that the script expects the ‘crypt’ tool to be present in the base of the project directory. As an alternative, you could place the ‘crypt’ tool somewhere on your path and modify the script accordingly. Note also, that it is in the build script where we specify the key to use for encryption. The 256-bit key is specified as 32 x 8-bit characters – you should change it from the default given here.

Using protected resources in applications

So now we have a built app bundle containing our protected resources. The resources can still be viewed with tools such as iPhone Explorer or extracted from an iTunes ipa file but are useless without the correct decryption key. We now turn to how these resources can be used legitimately by your app. In creating a decryption framework, I wanted a scheme that would be as flexible as possible and not place an unnecessary burden on the developer every time she wanted to use a protected resource. I also needed a scheme that decrypted in memory and did not create temporary files (which could be viewed with iTunes Explorer while an app was running). I chose to create a custom URL protocol and extend the URL loading system. This allows us to use encrypted resources anywhere that a URL can be specified and, thanks to the widespread use of URLs in the iOS frameworks, we get a lot of bang for our buck with relatively little new code including:

  • Loading encrypted resources into memory with [NSData dataWithContentsOfURL:]
  • Viewing encrypted HTML files and images in UIWebView

Custom URL protocols

If you haven’t come across implementing custom URL protocols before and you are interested in finding out more then check out the iPhone Reference Library. By subclassing NSURLProtocol and implementing a few required methods we can grant the URL loading system the ability to load other types of resources beyond the standard built-in schemes (http:, https:, ftp: and file:).

Our NSURLProtocol subclass is called EncryptedFileURLProtocol and the implementation can be found under the EncryptedFileURLProtocol group in the example project. It implements a new URL scheme (encrypted-file:) that works like the standard file: scheme. A URL using this scheme specifies a file on the local system just like file:, however, the files will be decrypted on-the-fly when the resource is loaded.

A custom NSURLProtocol subclass must override the canInitWithRequest:. The URL loading system uses this method to determine which protocol can handle a particular request. The loading system asks each registered protocol in turn whether it can handle the specified request. The first protocol to return YES gets to handle the request. The implementation of our canInitWithRequest: method is shown below and will return YES if the requested URL scheme is ‘encrypted-file:’.

+ (BOOL)canInitWithRequest:(NSURLRequest *)request
    return ([[[request URL] scheme] isEqualToString:ENCRYPTED_FILE_SCHEME_NAME]);

A custom NSURLProtocol must also override two additional methods, startLoading and stopLoading. These are called by the URL loading system at appropriate points when handling a request. Our startLoading method initializes the cryptographic engine and opens an NSInputStream to load the resource. The decryption key is also specified at this point. It is shared between all instances of our custom NSURLProtocol and needs to match the key used for encryption during the build process. The default key value is specified on line 20 of EncryptedFileURLProtocol.m and can be modfied using the class-level key property.

- (void)startLoading
    inBuffer = malloc(BUFFER_LENGTH);
    outBuffer = malloc(BUFFER_LENGTH);
    CCCryptorCreate(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, [sharedKey cStringUsingEncoding:NSISOLatin1StringEncoding], kCCKeySizeAES256, NULL, &cryptoRef);
    inStream = [[NSInputStream alloc] initWithFileAtPath:[[self.request URL] path]];
    [inStream setDelegate:self];
    [inStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inStream open];

The stopLoading method is called when the request ends, either due to normal completion or an error condition. In our implementation we clean up the input stream, cryptographic engine and buffers:

- (void)stopLoading
    [inStream close];
    [inStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [inStream release];
    inStream = nil;

Because we have scheduled our input stream on the current run loop and specified our custom instance of NSURLProtocol as the stream delegate, we will be called periodically with chunks of data to process. Below is an extract from the stream event handler where a chunk of data read from the input stream is decrypted and passed on to the URL loading system:

  switch(streamEvent) {
        case NSStreamEventHasBytesAvailable:
            size_t len = 0;
            len = [(NSInputStream *)inStream read:inBuffer maxLength:BUFFER_LENGTH];
            if (len)
                // Decrypt read bytes
                if (kCCSuccess != CCCryptorUpdate(cryptoRef, inBuffer, len, outBuffer, BUFFER_LENGTH, &len))
                    [self.client URLProtocol:self didFailWithError:[NSError errorWithDomain:ERROR_DOMAIN code:DECRYPTION_ERROR_CODE userInfo:nil]];
                // Pass decrypted bytes on to URL loading system
                NSData *data = [NSData dataWithBytesNoCopy:outBuffer length:len freeWhenDone:NO];
                [self.client URLProtocol:self didLoadData:data];

Implementing these four methods is nearly all we need to do to leverage the power of the URL loading system. The final piece of the puzzle is to register our custom NSURLProtocol subclass with the system. This is done in the application:didFinishLaunchingWithOptions: method of our application delegate (in EncryptedResourceDemoAppDelegate.m):

    // Register the custom URL protocol with the URL loading system
    [NSURLProtocol registerClass:[EncryptedFileURLProtocol class]];

Using the encrypted-file: URL scheme

Now that we have implemented our custom NSURLProtocol subclass and registered it with the URL loading system we can start using URLs that use the encrypted-file: scheme. The example application demonstrates one way to do this – that is to use the scheme to load protected resources into a UIWebView instance. This is actually not very different from using a regular file: URL to load and view an embedded HTML resource. The code from the viewDidLoad method of our main view controller is shown below (from EncryptedResourceDemoViewController.m):

- (void)viewDidLoad {
    [super viewDidLoad];
    webView.scalesPageToFit = YES;
    NSString *indexPath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"EncryptedResources"];
    NSURL *url = [NSURL encryptedFileURLWithPath:indexPath];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [webView loadRequest:request];

The app bundle is queried for the path to ‘index.html’ in the EncryptedResources sub-folder. This is then used to construct an NSURL. An NSURLRequest is created from the URL and a loadRequest: message is sent to the web view. If you are familiar with NSURL and its class methods then you may have spotted the unfamiliar encryptedFileURLWithPath: method. I have extended NSURL using a category to add this method as a convenience. It works just like fileURLWithPath: but creates a URL using the encrypted-file: scheme rather than the regular file: scheme. One cool benefit of extending the URL loading system is that any relative URLs referenced in the HTML, such as the src parameter of IMG elements, will also use the encrypted-file: protocol and will be decrypted on-the-fly.

As mentioned above, URLs are used in many places in the iOS frameworks. To load an encrypted resource into memory you can do the following:

    NSString *indexPath = [[NSBundle mainBundle] pathForResource:@"..." ofType:@"..." inDirectory:@"EncryptedResources"];
    NSURL *url = [NSURL encryptedFileURLWithPath:indexPath];
    NSData *data = [NSData dataWithContentsOfURL:url];

This could used to create a UIImage from an encrypted image file using [UIImage initWithData:] or you could go one step further by extending UIImage using categories to implement a initWithContentsOfEncryptedFile: method.

Next steps

In this article I have presented a scheme for protecting the resources that you embed in your iPhone and iPad applications. Along the way we have also learned about how to use the CommonCrypto API and how to implement a custom URL protocol. The example project demonstrates how to use the scheme and you are free to use the ‘crypt’ command-line tool and EncryptedFileURLProtocol source in your own projects. Something you might want to think about (depending on the value of the resources you are trying to protect and your level of paranoia) is a mechanism for obfuscating the decryption key. With the current scheme the key is compiled into the application binary as a plain string and could be extracted by anyone with a hex editor, a little patience and a little knowledge. Of course, this assumes that they have worked out that the resources are encrypted using AES256.

We’d love to hear if you have found this article useful or even used it in your own projects.

Share and Enjoy:
  • Print
  • email
  • Digg
  • Facebook
  • Google Bookmarks
  • Reddit
  • Twitter

{ 270 comments… read them below or add one }

Stephan Burlot July 29, 2010 at 7:33 am

Your article is very interesting, but are you sure you don’t need all the paperwork asked by Apple when using encryption?


Robin Summerhill July 29, 2010 at 8:23 am

This question comes up weekly on None of the Apple representatives are prepared to give legal advice on the forum but the general consensus is that you only need to answer ‘yes’ to the first question ‘Does your product contain encryption?’ if you are implementing new encryption functionality.
If you link to the encryption routines contained in the CommonCrypto library then you are making use of encryption provided by Apple, which should be already covered by a CCATS.


Stephan Burlot July 29, 2010 at 8:35 am

Ah, thanks, I will try to see what happens.


Ricardo Palma August 9, 2010 at 12:46 pm

Hello Stephan,

I would be very much interested on knowing what the response from Apple was when you attempted registering your applicaction.



Dan August 28, 2010 at 12:08 pm

Great writeup, thanks a lot! I’m not familiar with shell scripting and I’m getting errors when I try to build my app. I think they are related to spaces in my project’s path. Other than renaming my folders is there a simple fix for this?

/Volumes/Macintosh HD/Documents/iPhone Apps/App Name/AppName/AppName Files/AppName 2_0/build/ line 9: [: too many arguments

Encrypting /Volumes/Macintosh

/Volumes/Macintosh HD/Documents/iPhone Apps/App Name/AppName/AppName Files/AppName 2_0/build/ line 16: /Volumes/Macintosh: No such file or directory


Robin Summerhill August 28, 2010 at 8:57 pm

Hi Dan,

Glad you liked the article. You were right with your guess about spaces in your project’s path. I’ve updated the shell script in the article and the zip file to add quotes around all the filenames to solve this issue. Thanks for pointing it out to me.


Dan September 3, 2010 at 10:26 am

Thanks for the reply. One more thing – I’m getting a bunch of “Synchronous client exited with no response and no error!” messages in the debugger console when I load files that have been encrypted. Any idea what that’s about?


Robin Summerhill September 7, 2010 at 8:30 am

Not sure what that message means. I’m not seeing it when running on the simulator or the device. Google has a few hits for that message but no-one seems to know what it means. Are you seeing this in your own code or the example project? Simulator or device? Are the files loaded correctly despite the message?


Sarah Clough March 30, 2011 at 9:27 am

I just had this and it was because I had changed the key in the script but not in the URL class.


Blake September 26, 2012 at 3:35 am

I am now getting this on ios 6…no clue why

Alan August 30, 2010 at 12:41 pm

Hi Robin,

I try to work with your code. But decryption method with NSData don’t working.

NSData *data = [NSData dataWithContentsOfURL:url];

Result of the above statement is NULL. Encypting data isn’t decrypted. All function in your NSURLProtocol class isn’t called.

So, what is problem in this case?


Robin Summerhill August 30, 2010 at 12:53 pm

Have you registered the custom protocol by calling:
[NSURLProtocol registerClass:[EncryptedFileURLProtocol class]];

If you have done this correctly then you should be able to put a breakpoint on the canInitWithRequest: method and see it return ‘YES’ when you request the system to load an ‘encrypted-file:’ URL.


Athrun August 27, 2012 at 11:45 pm

Hi robin, many thanks for your great post.

I have the same issue with Alan, I’m sure that i have [NSURLProtocol registerClass:[EncryptedFileURLProtocol class]]; in my code.

Project works with load index.html in web view, but not works with [NSData dataWithContentsURL]. in NSData case ,all functions in NSURLProtocol class isn’t be called.

Do you have any idea on that? Thanks


John Kelley September 2, 2010 at 2:16 pm

Great post. This is one of the better solutions I have seen on the subject. Curious, though. Is this a iOS 4.0 only solution? I think the apple docs list NSStreamDelegate Protocol (used in EncryptedFileURLProtocol.h) as making its debut in 4.0.

Thanks for sharing.


Robin Summerhill September 2, 2010 at 3:16 pm

Glad you found the article interesting. The delegate method stream:handleEvent: has been around as part of an informal protocol since OS2.0, which was formalized as the NSStreamDelegate protocol in OS4.0. To compile prior to OS4.0 just remove the reference to NSStreamDelegate in EncryptedFileURLProtocol.h. I may get around to adding conditional compilation for this at some point.


Francesc November 23, 2010 at 6:58 am

Your solution looks really good. I’ve tryed your example in iOS 4 devices and simulator and works great, but I can’t make it work with a 3.1.3 iOS device. I’ve removed the NSStreamDelegate reference you mentioned, but it looks like when EncryptedFileURLProtocol is finished something goes wrong loading the webview.

These are the last thread-trace printed:
#0 0x33ad1d0c in WTF::HashTable<WebCore::String, std::pair<WebCore::String, WTF::PassRefPtr (*)(WebCore::SharedBuffer*)>, WTF::PairFirstExtractor<std::pair<WebCore::String, WTF::PassRefPtr (*)(WebCore::SharedBuffer*)> >, WebCore::CaseFoldingHash, WTF::PairHashTraits<WTF::HashTraits, WTF::HashTraits<WTF::PassRefPtr (*)(WebCore::SharedBuffer*)> >, WTF::HashTraits >::contains<WebCore::String, WTF::IdentityHashTranslator<WebCore::String, std::pair<WebCore::String, WTF::PassRefPtr (*)(WebCore::SharedBuffer*)>, WebCore::CaseFoldingHash> >
#1 0x33ad1cd0 in WebCore::ArchiveFactory::isArchiveMimeType
#2 0x33ba20ec in WebCore::FrameLoader::committedLoad
#3 0x33ba2020 in WebCore::DocumentLoader::commitLoad

Any suggestions?



Zaygraveyard July 6, 2011 at 4:25 am

it hapened to me too and this is what i did:

if (kCFCoreFoundationVersionNumber_iPhoneOS_3_2 kKeySize ? kKeySize : keyLength);

size_t bufferSize = [self length] + kCCBlockSizeAES128;
void* buffer = malloc(bufferSize);

size_t dataUsed;

CCCryptorStatus status = CCCrypt(decrypt ? kCCDecrypt : kCCEncrypt,
key, kKeySize,
[self bytes], [self length],
buffer, bufferSize,

switch(status) {
case kCCSuccess:
return [NSData dataWithBytesNoCopy:buffer length:dataUsed];
case kCCParamError:
NSLog(@”Error: NSData+AES256: Could not %s data: Param error”, decrypt ? “decrypt” : “encrypt”);
case kCCBufferTooSmall:
NSLog(@”Error: NSData+AES256: Could not %s data: Buffer too small”, decrypt ? “decrypt” : “encrypt”);
case kCCMemoryFailure:
NSLog(@”Error: NSData+AES256: Could not %s data: Memory failure”, decrypt ? “decrypt” : “encrypt”);
case kCCAlignmentError:
NSLog(@”Error: NSData+AES256: Could not %s data: Alignment error”, decrypt ? “decrypt” : “encrypt”);
case kCCDecodeError:
NSLog(@”Error: NSData+AES256: Could not %s data: Decode error”, decrypt ? “decrypt” : “encrypt”);
case kCCUnimplemented:
NSLog(@”Error: NSData+AES256: Could not %s data: Unimplemented”, decrypt ? “decrypt” : “encrypt”);
NSLog(@”Error: NSData+AES256: Could not %s data: Unknown error”, decrypt ? “decrypt” : “encrypt”);

return nil;

- (NSData*)decryptedWithKey:(NSData*)key {
return [self makeCryptedVersionWithKeyData:[key bytes] ofLength:[key length] decrypt:YES];

- (id)initWithContentsOfEncryptedFile:(NSString *)path withKey:(NSData *)key {
[self release];
NSData *encryptedData = [[NSData alloc] initWithContentsOfFile:path];
if (!encryptedData) return nil;
self = [[encryptedData decryptedWithKey:key] retain];
[encryptedData release];
return self;

i hope it helps and if you need any info plz ask :)


Zaygraveyard July 6, 2011 at 4:40 am

I realized that I didn’t thank you Robin for this great post so thanks and I found that I forgot to put important code in the last comment so here’s the link to my project which is an updated version of yours “”
and if you find any thing I did wrong plz let me know.
Thx again Robin for this.


mike p September 13, 2010 at 3:11 pm

Any ideas on weather this would work for the MPMoviePlayer(View)Controller? I’m using the automatic view controller, the view controller seems to load but doesn’t play the video. I’ve gotten the code to work without encryption to make sure everything is set up right, second snippet of code, and it does.

code that doesn’t work with sample code

NSString *indexPath = [[NSBundle mainBundle] pathForResource:@”VideoFull” ofType:@”mov” inDirectory:@”EncryptedResources”];
NSURL *url = [NSURL encryptedFileURLWithPath:indexPath];
moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:url];
[self presentModalViewController:self.moviePlayer animated:YES];

code that works using sample code

NSString *url = [[NSBundle mainBundle] pathForResource:@”VideoFull” ofType:@”mov”];
NSURL *videoURL = [NSURL fileURLWithPath:url];
moviePlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:videoURL];
[self presentModalViewController:self.moviePlayer animated:NO];

thanks ahead of time!!!


Robin Summerhill September 15, 2010 at 9:24 am

Hi Mike,

It looks like MPMoviePlayerViewController is bypassing the URL loading system by using lower-level Core Foundation APIs. The canInitWithRequest: method of the custom URL protocol is not being called at all.

An alternative approach here would be to include a minimal web server in your app that decrypts resources on-the-fly and serves them up to local requests. I may add an article on how to do this in the near future.


mike p September 15, 2010 at 10:58 pm

Ok thanks for looking into it. I’m avoiding hosting anything on a server, so will probably look into not using the ready built movie view controller. Will let you know if I come across anything.


Arnold G March 3, 2011 at 10:36 pm

Good article. I would be interested in reading an article on using an intermediate web server for on-the-fly decryption if you ever write it. I suspect Netflix is doing something similar in their app to map between streaming protocols.


Brian Chung March 15, 2011 at 5:05 am

Hi Robin,

Are there anyway to decrypt mp4 files and load it into MPMoviePlayerViewController without using web server? In my case, all mp4 files will be encrypted and stored in the bundle.

Brian Chung


stefan e April 14, 2011 at 10:43 am

hi, a tutorial about this would be greatly appreciated. we are facing the same problems are currently trying to get cocoahttpserver to run in our app to be able to decode the video and stream it locally, not funny :)



thomas May 17, 2011 at 12:46 pm

Have you had time yet to look into the issue in more detail?

I tried it myself with a MPMoviePlayerController and have the same problem. In my case, canInitWithRequest is called though. Also, startLoading, stopLoading and stream methods are called, so there seems to be happening something. Unfortunately, the media player doesn’t play anything.


Lars February 10, 2012 at 10:30 am

Robin, great post!
Has anybody got this working with video files?
I am very interested!


Nathan B. January 25, 2013 at 12:03 am

I realize this post is old but it is still very much relevant and I wanted to share a solution. While efficiency can be questioned it satisfied the immediate need; and performing steps 1-3 via Grand Central Dispatch I did not find a massive performance hit.

Using the project posted by Akhil P.K December 13, 2012 at 1:29 am, here are the steps I used to leverage the hard work of the author (Robin) and bypass some of the limitations of MPMoviePlayerViewController:

1. Obtain the file URL for the encrypted movie:

NSURL *url = [NSURL encryptedFileURLWithPath:[[NSBundle mainBundle] pathForResource:@”video” ofType:@”mov” inDirectory:@”EncryptedResources”]];

2. Using the URL load the video into an NSData Object:

NSData *movideData = [NSData dataWithContentsOfURL:url];

3. At this point due to the custom protocol the content is decrypted therefore we now store the NSData blob to a file within the our apps /tmp directory:

NSString *destinationPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@""];
BOOL isFileSaved = [movideData writeToFile:destinationPath atomically:YES];

4. If the file saved properly we can use the destination path and make a NSURL for the MPMoviePlayerViewController:

NSURL *url_ = [NSURL fileURLWithPath:destinationPath];

5. Once the URL is created we can load the decrypted file with MPMoviePlayerViewController, setup prefs, and play the video:

MPMoviePlayerViewController *player_ = [[MPMoviePlayerViewController alloc]initWithContentURL:url_];
player_.moviePlayer.allowsAirPlay = YES;
player_.moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
player_.moviePlayer.fullscreen = YES;
player_.moviePlayer.shouldAutoplay = YES;

Silvia August 6, 2012 at 6:27 pm

Hi Robin,
Did you post any article about this later? I couldn’t find that…


Stephen Prance February 28, 2011 at 8:21 pm

Hello Robin,

I am writing an app which essentially has a navigation controller (based on the Elements by Apple) pushing selected pages of a pdf (based on the Zooming PDF Viewer by Apple). Your solution looked just the trick to secure the pdf.

I am pretty sure my file NSW_CAG_EDITION_14_JUL_09 is encrypting OK on build. However crashing when I try to decrypt and view.

I put your code in pdfscrollview.m (where CGPDFDocumentCreateWithURL is called)

NSString *indexPath = [[NSBundle mainBundle] pathForResource:@”NSW_CAG_EDITION_14_JUL_09″ ofType:@”pdf” inDirectory:@”EncryptedResources”];

NSURL *url = [NSURL encryptedFileURLWithPath:indexPath];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
pdf = CGPDFDocumentCreateWithURL((CFURLRef) request); //crashes here

Will your code work with CGPDFDocumentCreateWithURL? Any help would be greatly appreciated.




Robin Summerhill March 4, 2011 at 7:37 am

Hi Steve,

Since originally writing the article it has come to my attention that certain APIs bypass the URL loading system and access the file system at a lower level. This includes the C-based PDF API. The method presented in the article works for displaying PDFs in an embedded UIWebView but the C API calls will fail, as you have found. Luckily for you, PDFs support encryption natively. You can encrypt your PDF in the application you used to author it, or encrypt it later in Acrobat Pro. Then open the PDF with CGPDFDocumentCreateWithURL and supply the password with CGPDFDocumentUnlockWithPassword.

I plan to update the article soon with some extra enhancements and to cover issues such as this.


Wilson March 24, 2011 at 10:32 am

Hi Steve,

great post.
When do you plan to update the article?
Right now i need to use encrypted PDFs. The problem is, that i need to encrypt them on device (no authoring software) and because of customer restrictions i cannot decrypt them to filesystem for reading. So i have to use the URL loading system. Is there any way to force CGPDF* to use the URL loading system?



JD March 1, 2011 at 5:28 pm

Great work! I try it on png files with UIImage initWithData, works well.
But what I want to do exactly the same for sqlite file, I try it and don’t work.
I do something like that:

NSString *indexPath = [[NSBundle mainBundle] pathForResource:@”MyDBFile” ofType:@”sqlite” inDirectory:@”encrypted”];
NSURL *storeURL = [NSURL encryptedFileURLWithPath:indexPath];
[persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];

Any ideas ?


Robin Summerhill March 4, 2011 at 7:46 am

Hi JD,

Since originally writing the article it has come to my attention that certain APIs bypass the URL loading system and access the file system at a lower level. This includes the C-based SQLite API, which underlies the Core Data storage that you are using. Working with SQLite is also a slightly more complicated proposition than just loading a resource file because random access is used rather than bringing the whole database into memory. I’m sure it would be possible to intercept the data flow somewhere in the chain from database, through Core Data to the application level to perform automatic decryption. It’s something we might look into in future.



Arpit April 5, 2011 at 1:29 pm

Hi Robin,
Thanks for the awesome solution. But we are having problems with loading of ajax files. We are using jquery to load the files lazily in the app using ajax. However $.ajax is always resulting in Error. Have you tried this with Ajax ?


Arpit April 6, 2011 at 9:12 am

Figure out a solution for Ajax requests. Safari has issue with cross domain requests if you use encrypted-file:// So Just changed encrypted-file to “file” and all ajax requests works seamlessly.


Robin Summerhill April 6, 2011 at 10:12 am

OK. Sounds like XMLHttpRequest is looking at the protocol and switching behaviour based on ‘http’ or ‘file’. It doesn’t recognise ‘encrypted-file’ as a valid protocol so is barfing. Good to know.


Luke April 23, 2013 at 10:51 am

I am using this in a Mac OS X project instead of iOS, everything works but the AJAX doesn’t work. I tried changing the schema constant from encrypted-file: to file: but when that is changed the files are not decrypted. The startLoading, stopLoading and stream methods don’t seem to fire even when canInitWithRequest is returning true for these requests. Any ideas?


Luke April 24, 2013 at 2:07 am

If anyone else is having trouble with this on Mac OS X using NSWebView with AJAX you can use [WebView registerURLSchemeAsLocal:ENCRYPTED_FILE_SCHEME_NAME]; to set the WebView so that your custom scheme is treated as local in regards to security. Not sure if UIWebView supports this on iOS though.


Marc A. April 29, 2011 at 4:43 am

Great work! I tried the code below but it doesn’t work.
Any idea of what’s wrong with my code?

-(IBAction)OpenIN:(id)sender {

NSString *fileToOpen = [[NSBundle mainBundle] pathForResource:@”…” ofType:@”…” inDirectory:@”EncryptedResources”];
self.controller = [UIDocumentInteractionController interactionControllerWithURL:[NSURL encryptedFileURLWithPath:fileToOpen]];
self.controller.delegate = self;

CGRect navRect = self.navigationController.navigationBar.frame;
navRect = CGRectMake(348.0f, 870.0f, 0.0f, 0.0f);
[self.controller presentOptionsMenuFromRect:navRect inView:self.view animated:YES];

Thanks for your help!


Rodrigo May 6, 2011 at 4:15 pm

It’s possible to change the name of the folder “EncryptedResources”? If so, how can I change that?
Tks a lot.


Robin Summerhill May 6, 2011 at 6:11 pm

Yes, it’s easy.

1. Change the name of the directory where you place your resources to be encrypted from ‘EncryptedResources’ to whatever you want.
2. Change the first line of the encryption script attached to the ‘Encrypt Resources’ custom build step:
DIRNAME=[the directory you chose in step 1]
3. Change the directory name wherever you load an encrypted resource in your app:
e.g. NSString *indexPath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html" inDirectory:@"EncryptedResources"];


Rodrigo May 6, 2011 at 7:35 pm


But I’m still having problems with the last step (Using the encrypted-file: URL scheme). I have an xml file and I couldn’t show the data because the file is empty and don’t even starts the process of parse. Do you have any suggest?

Tks a lot again


Rodrigo May 6, 2011 at 7:46 pm

Sorry, I forgot one detail. Appears this text in console: Synchronous client exited with no response and no error!


Robin Summerhill May 7, 2011 at 8:51 am

This may be a separate issue. See the comments up above. Have you changed the encryption key in the script but not at the top of EncryptedFileURLProtocol.m? They need to match.

Otherwise you will need to work out which step is failing – is it not locating the file correctly or is it not decrypting it? Try changing ‘encrypted-file:….’ to just a plain ‘file:….’ and see if the encrypted file is loaded – view the encrypted contents in the debugger.

Daoxin July 2, 2012 at 9:14 am

Hi, Excellent article!
I want to use this technology to my project.
I have one html and one mp3 file, but I can not play mp3 file.
Here is index.html source.

If you are reading this, it is because your browser does not support the audio element.

Looking forward to your answer.


John May 11, 2011 at 2:33 pm

Are there any news about sending an app with this encprytion? Do I have to specify? Apple is accepting with no problems?
Tks and congratulations for this article


Mario May 23, 2011 at 9:14 am

Hello, I am getting the same error on the console…any other things we need to look into which might be incorrect?


Mario May 23, 2011 at 9:21 am

The file is encrypted in the EncryptedResources folder of the file. Although the original file still exists in the root directory of the file. I have removed it from the “copy bundle resources” in the build phases.

Thanks for help


shri September 16, 2011 at 6:30 am

i m able to play 1 song using mediaplayer framework but next song not play
plaza give me some step to play.

thanks in advance


shri September 22, 2011 at 1:03 am

very great demo apps for encription. lastly my my encription is done from this demo but i m not able play more then one song at a time. if i copy more song into the encryptedResource folder that can not be played. why?
plz. give me some steps for playing these audios.


Sapana September 30, 2011 at 8:30 am

Hello ,
This is the best way to hide the images and song of application . But i have one major problem , I have added some song in the EncryptedResources folder and play this song on simulator it was play . Same application i have tested on iPhone device at that song was not play. Please help its very urgent for me.
Thank you so much


Arpit Jain October 5, 2011 at 2:02 pm

Any update for iOS5. Our application is working on 4.3.2 but has errors for iOS 5 GM release. I am trying to debug the issue, but if you have already worked on it, it will save me time :-)

Will update here if I find the solution or at least the issue.


Andrew Jackman October 5, 2011 at 5:23 pm

Yep same here Arpit. Doesn’t work for iOS 5. Major issue for me, as I have an app in the field with encrypted resources that I need to fix.

Here are the kinds of errors I get:

ImageIO: PNG Extra compressed data
ImageIO: PNG invalid stored block lengths
ImageIO: PNG incorrect data check
ImageIO: PNG PNG unsigned integer out of range

Any suggestions would be greatly appreciated.



Robin Summerhill October 5, 2011 at 7:30 pm

We’re pretty busy at the moment fixing some iOS5 issues with our apps but I’ll take a look at the problem here.

Did you see the problem with the early betas or has it just appeared in the GM release?


Robin Summerhill October 5, 2011 at 11:23 pm

I’ve fixed the problem on iOS5. The example project has been updated. The single change is line 99 of EncryptedFileURLProtocol.m. It should read:

NSData *data = [NSData dataWithBytes:outBuffer length:len];


Andrew Jackman October 6, 2011 at 2:04 am

Thanks for the prompt response. Really appreciated. Unfortunately when I make the change I get the following:

malloc: *** error for object 0xb5fe00: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug


Andrew Jackman October 6, 2011 at 3:32 am

Sorry – my mistake. All looking good now. Thanks very much!

Arpit Jain October 6, 2011 at 4:53 am

Thanks for the prompt response Robin. This is working perfectly.
Although, we again are facing problems with Ajax requests and files requested through ajax are not getting loaded. We are working on it.

If you have any suggestion for this, it will be greatly appreciated.


Arpit Jain October 6, 2011 at 5:02 am

Just FYI, its working in iOS 4.3.

It is just not working in iOS5. After [inStream open] is called, control is not reaching the “stream” method. Any suggestions?

shridhar October 10, 2011 at 1:16 am

its great ………
i have some song in EncryptedResource folder , encryption done successfully but not played into AVAudioPlayer. its show me right song path of EncryptedResources but not play.
please give me the right way

thanks in advance.
shridhar mali.


Daniel Shaw October 14, 2011 at 8:26 pm

Hi Robin,
I realize the original post is over a year old, but this is fantastic!. A friend and I are working on a Universal app and need this mechanism to protect a licensed font we will be placing it it. I had to do a little bit of extra work from the default, in order to make the custom font available to UIFont, so I thought I would post this message if anyone else needs to do something similar
In addition to the NSURL, you will need to manually read the font data into an NSData object, then use CoreGraphics and CoreText to load the font (or fonts) into the lower level font manager. Once this is complete, you can initialize a UIFont with the font name e.g.:
NSURL *fontsURL = [NSURL encryptedFileURLWithPath:indexPath];
CFErrorRef error; //used my the CoreText font manager to record any errors.
NSData * fData = [NSData dataWithContentsOfURL:fontsURL];

CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)fData);
CGFontRef fr = CGFontCreateWithDataProvider(provider);
UIFont * calendar = [[UIFont fontWithName:@"calendar" size:25] retain];

These are iOS documented API calls and should not cause any app rejection.


Robin Summerhill October 19, 2011 at 8:08 am

Thanks for the great tip about fonts. Glad you liked the article too.


Jaanus May 13, 2012 at 8:01 pm

Thanks so much for both the original article, and for this extra info about fonts! Very useful and works great. I thought I could simplify this by using CTFontManagerRegisterFontsForURL, but sadly, this again bypasses the custom URL business, so it has to be done exactly as shown in this comment.

I’m also getting the “Synchronous client exited with no response and no error!” indicated by others when I load each font. Seems to be just a warning in the output and doesn’t affect anything.


Sam Becker June 22, 2012 at 9:00 pm

Hi Daniel/Robin,

I just tried to do what you did and I keep getting OT Font Face Error: 2 messages. I was able to load the fonts fine using CGFontRef before encryption but not after. ALSO I had to change the file naming scheme from encrypted_file l_something_or_other to ‘file’ just to get as far as the OT error. Any ideas? If I didn’t change the name scheme CGFontRef would say it was an unrecognized file type/scheme.




Sam Becker June 25, 2012 at 11:21 am

I figured out what I was doing wrong. I had forgotten to uncheck the ‘Targets’ tab for encrypted resources folder. For some reason this caused the font to fail to load ONCE after each build > clean. After that, every compile worked. Same for simulator AND device. Anyway, this made it impossible to debug. Unchecking the ‘Target’ tab was a lifesaver. Sam


John Grøtting August 9, 2012 at 10:24 am

We are trying to do something similar, but so far without success. Rather than rendering text using CoreText, we are using UIWebView and rending all text using @fontface in HTML5. Any thoughts?


Adi November 11, 2011 at 7:10 am

I know that this is an old post, but I’ve used your method recently and had some problems using it on iOS 3.1.3
The easy fix (if anyone is interested) is to call the
[self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
also when all response is received in your NSURLProtocol subclass. The response can be some bogus NSURLResponse instance, and it will work .

Thanks for the great idea, btw !


Mudireddy Suresh December 27, 2011 at 6:14 am

Hi Robin Summerhill,
Great solution. It helps me a lot.

I observed one issue with the sample app as well as my application where if requested for a encrypted image
URL in NSURLRequest with UIWebView then all the decrypted 512 byte chunks were provided to UIWebView in NSStreamDelegate but finally the raw image buffer shown in the UIWebView.

What is the issue ? Please let me know if anything need to be handled.
This is the case for image, PPT ..etc (Direct URL without any HTML file reference to them).


Mudireddy Suresh December 28, 2011 at 6:00 am

Hi Robin,
Thanks for the nice stuff.

My previous issue which I was posted here was solved with
[self.client URLProtocol:self didReceiveResponse:response ] with proper MIME type & encoding type.

Now the new issue I am facing is with the same code, playing encrypted MP4 video file (locally stored) using UIWebView is failing with the following error.

Error Domain=WebKitErrorDomain Code=204 “Plug-in handled load” UserInfo=0x3c0b60 {NSErrorFailingURLStringKey=myapp:///private/var/mobile/Applications/00109035-7155-4FF6-B247-DF5F26A87024/tmp//Docs/34199c68fcfbc45492550c5298272117502b0149.mp4, WebKitErrorMIMETypeKey=video/mp4, NSErrorFailingURLKey=myapp:///private/var/mobile/Applications/00109035-7155-4FF6-B247-DF5F26A87024/tmp//Docs/34199c68fcfbc45492550c5298272117502b0149.mp4, NSLocalizedDescription=Plug-in handled load}

Please help me to overcome this issue with your comments.

Thanks & Regards,


Jens Beyer January 6, 2012 at 7:20 am

I try your code on lion, but in – (void)startLoading the [[self.request URL] path] is always nil.
So the inStream init raises an error.
The URLstring is:

Any idea what is going wrong here?


Tapan Desai January 12, 2012 at 4:59 pm


Thanks for the awesome solution. I have one questions though, i am building app that allow users to download files into local device and view it in UIWebView. I want to encrypt file after its downloaded on device and decrypt while trying to view in UIWebView so if anyone jail brake iPad or use any other tool, they can’t view local files.

I would appreciate your input on this.

Thanks in advance,
Tapan Desai


Berik Visschers January 13, 2012 at 10:53 am

Keep in mind though, that with a jailbroken device, any (https) communications can be hijacked by a proxy.


Berik Visschers January 13, 2012 at 10:42 am

Hi Robin,

Although the resources are indeed encrypted. The security added is not very high.
To show that this security is easily broken, I’ve build & run the project. Then went to the app:
$ cd /Users/myName/Library/Application Support/iPhone Simulator/5.0/Applications/0928889D-296D-4D1C-BC46-247BEDD7DD24/

then tried to read the encrypted resources:
$ cat EncryptedResources/index.html


Berik Visschers January 13, 2012 at 10:43 am

Oke, it’s encrypted. But how about a password? I ran:
$ strings EncryptedResourceDemo

There it is, the password is plain-text (hidden inside the binary) ‘abcdefghijklmnopqrstuvwxyz123456′.

I suggest hiding the password for the encryption a little better. Transforming it into an MD5 hash in binary format during compile time will add some security (will be harder to find). More secure strategies can be thought of.

Is this code open sourced? Is this code already on github?

Thanks for sharing this code!



Berik Visschers January 13, 2012 at 11:04 am

This looks like a good example of how to hide a password in a binary:


Robin Summerhill February 10, 2012 at 10:34 am

Hi Berik,

As mentioned in the article: ‘Something you might want to think about (depending on the value of the resources you are trying to protect and your level of paranoia) is a mechanism for obfuscating the decryption key. With the current scheme the key is compiled into the application binary as a plain string and could be extracted by anyone with a hex editor, a little patience and a little knowledge.’


chandrika bhat February 21, 2012 at 8:31 am

Really helped a lot.. and saved our time.


Chiemeka March 16, 2012 at 7:06 am

Great Roberts,
I will test this out and try to use the output data with a uidocument object.
Also, obfuscating the decryption key…? Sure necessity. I’ll try to report what I can come up with.


Sam Becker July 26, 2012 at 11:24 am

Any luck?


Sarah Clough March 21, 2012 at 1:11 pm

Thanks for the ios 5.0 update, I’ve been puzzling over why it was only reading in half the file to no avail!


Netshark March 27, 2012 at 4:26 am

It would be great if your code could be used to encrypt files to. I load pdf-files, which must be protected, from a webservice and want to put them unreadable for others on the device. The apple security is not enough, because some customers don’t use a device code.


Saranya krishnan March 28, 2012 at 8:35 am

Thanks for the excellent tutorial . I have one question , When i am trying to retrieve the data from the URL , i am getting output as “0 bytes” . I have pasted the following code

NSString *indexPath1 = [[NSBundle mainBundle] pathForResource:@”aptogo” ofType:@”png” inDirectory:@”EncryptedResources”];
NSURL *url1 = [NSURL encryptedFileURLWithPath:indexPath1];
NSData *data = [NSData dataWithContentsOfURL:url1];
NSLog(@”data length:%d”,[data length]);
UIImage *imagename=[[UIImage alloc] initWithData:data];
[image setImage:imagename];

Please help me out in this.


Athrun August 27, 2012 at 11:17 pm

I have the same issue, have you found the solution? Thank you


viv April 15, 2012 at 5:55 pm

Thanks for the awesome article and code Robin.
I have observed that the NSURL pathway misses calling the decryption functions when using the following function:-
[NSFileManager copyItemAtURL:

Any ideas how to make this pathway use the decryption? The error I see is the following:-
Error Domain=NSCocoaErrorDomain Code=262 “The operation couldn’t be completed. (Cocoa error 262.)

I’ve experimented by trying to use the aptogo.png file as source.


peryll May 22, 2012 at 3:57 am

Thanks Robin for the article.

I’m back to the problem with the “Synchronous client exited with no response and no error!” output.
I have found out that the encryption works in simulator and almost all devices. But in some cases it does not work. It is in the [NSData dataWithContentsOfURL] where the problem is. I havn’t found out yet why this occurs. The encryption key is the same in the script and in the encryption class.


peryll May 22, 2012 at 4:02 am

Sorry I put my comment in the wrong thread!

Thanks Robin for the article.

I’m back to the problem with the “Synchronous client exited with no response and no error!” output.
I have found out that the encryption works in simulator and almost all devices. But in some cases it does not work. It is in the [NSData dataWithContentsOfURL] where the problem is. I havn’t found out yet why this occurs. The encryption key is the same in the script and in the encryption class.


Mritunjay June 13, 2012 at 9:29 am

Really, its Good Articles……!


Steve July 4, 2012 at 4:06 am

Thanks for a great article! I also attempted to get this technique to work with video playback using AVFoundation. Unlike the experiences that some other folks have had, everything is being called correctly. My issue is running out of memory, with Instruments telling me that CFData (bridged from NSData I suppose) is the responsible party. These videos are fairly large, up to 10gb for some. It looks like AVFoundation is retaining all of the NSData instances that are being sent to it via [self.client URLProtocol:self didLoadData:data]. What I think may be happening is that iOS is trying to look up video metadata information in the file, such as duration and as such is ending up trying to load the entire file into memory. It makes me wonder if the normal file based playback just maps the entire thing and just goes about its business that way. Has anyone ever had any success in pulling this off with video files?


Blake August 8, 2012 at 5:57 am


My App crashes with this when I try to use encrypted resources.

*** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘*** -[__NSPlaceholderArray initWithContentsOfFile:]: string argument is not an NSString’

I get the resources with this line:

NSArray *array = [[[NSMutableArray alloc] initWithContentsOfURL:[NSURL encryptedFileURLWithPath:tablePath]] objectAtIndex:[unit intValue]-1];

tablePath is the path to the file. Does anyone see what is wrong? thanks!


MarionMck August 27, 2012 at 6:31 am

Sorry, I seem to be missing something here. I had problems getting this working in my app so I added an image to the example project. canInitWithRequest is called as expected for the existing example files of index.html and aptogo.png but doesn’t get called for my new image file. The URL looks ok, but the NSData comes up as nil. This is how I’m loading the image:

NSString *imgPath2 = [[NSBundle mainBundle]
NSURL *imgurl2 = [NSURL encryptedFileURLWithPath:imgPath2];
NSLog(@”url scheme %@”, [imgurl2 scheme]);
NSLog(@”url relpath %@”, [imgurl2 relativePath]);
NSData *data2 = [NSData dataWithContentsOfURL:imgurl2];
UIImage *img2 = [[UIImage alloc] initWithData:data2];

I can see the file in the EncryptedResources folder so it should be finding the file from the relative path ok. I get the same result in the simulator or on a device. I am running Xcode 4.3.3 for iOS 5.1.
This seems a really stupid question after all the responses above show that it works fine, but I just can not see what I’m doing wrong!


MarionMck August 29, 2012 at 4:33 pm

I’ve tried forcing the use of NSURLConnection by using the following

NSURLRequest *urlRequest = [NSURLRequest requestWithURL:imgurl2];
NSData *urlData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&myerr];

but still canInitWithRequest is not called and I get an ‘unsupported URL’ error.


Shahid September 11, 2012 at 5:11 pm

Can anybody please help me with the shell script to recursively iterate through all sub folders and encrypt them as well? Currently it hangs if there is subfolder.


Luke April 23, 2013 at 10:54 am

I updated the script to handle sub-folders, works in Xcode 4.6.1 without issues




if [ ! -d "$OUTDIR" ]; then
mkdir -p “$OUTDIR”

while IFS= read -r -d $” dir;
DIRECTORY=`echo $dir | sed -e “s,$INDIR,$OUTDIR,g”`
mkdir -p “$DIRECTORY”
done < <(find "$INDIR" -type d -print0)

while IFS= read -r -d $'' file;
OUTFILE=`echo $file | sed -e "s,$INDIR,$OUTDIR,g"`
if [ ! -d "$file" ]; then
echo "Encrypting $file"
"$PROJECT_DIR/crypt" -e -k $ENC_KEY -i "$file" -o "$OUTFILE"
done < <(find "$INDIR" -type f -print0)


navin June 19, 2013 at 9:13 am

If my directory or file contain space means it shows “Shell Script Invocation error” how can i fix this.


George July 8, 2014 at 9:12 am

When I try you script it has issues with the syntax around – done < <(find "$INDIR" -type d -print0)

The error is – syntax error near unexpected token `('

I'm not a shell script expert so any help would be welcome.

I really need this to work with a directory structure.



George July 9, 2014 at 9:50 am

Actually got it working using –




if [ ! -d "$OUTDIR" ]; then
mkdir -p “$OUTDIR”

find “$INDIR” -type d -print |
while read file; do
mkdir -p “$OUTDIR/${file#$INDIR}”

find “$INDIR” -type f -print |
while read file; do
echo “encrypting $file”
“$PROJECT_DIR/crypt” -e -k $ENC_KEY -i “$file” -o “$OUTDIR/${file#$INDIR}”


Jason September 25, 2012 at 9:55 pm

Hi Robin,

Thanks for this great post, I have been using this in my app for quite some time and it’s working great for me.

However, with iOS6 this code actually leaks memory spectacularly when you use it. The official reply I got from Apple as to why was this:

Below is a log that’s new in iOS 6:

coreAssert(ISBOOLEANTRUE(fScheduledCallbackFlags, didReceiveResponse), “NSURLConnection/CFURLConnection ordering violation: didReceiveData to be scheduled before didReceiveResponse”);

It logs when a custom NSURLProtocol, wants to trigger NSURLConnection to issue didReceiveData before didReceiveResponse.

So if you are using this code in iOS6, this is what I added to the – (void)startLoading method to fix this leak

[self.client URLProtocol:self didReceiveResponse:[[[NSURLResponse alloc] init] autorelease] cacheStoragePolicy:NSURLCacheStorageNotAllowed];

Hope this helps somebody! :)


Siro November 21, 2014 at 3:33 am

Thanks Jason, i added the code of “self.client URLProtocol:self didReceiveResponse:[[[NSURLResponse alloc] init] autorelease] cacheStoragePolicy:NSURLCacheStorageNotAllowed];” and works fine in IOS8


Fatemeh September 26, 2012 at 11:10 am

Hi It’s great tutorial, Thanks Robin Summerhill…

I have a problem and hope you help me…
I have number of xml files that I don’t want be accessible… I encrypted them and also decrypted and webview shows the content of these files. but I need the string content of these files, or data type of them.
I have tried to use data by NSData* data = [[NSData alloc]initWithContentsOfFile:url]; but these line don’t call the EncryptedFileURLProtocol methods and I get null. The methods in that class only call when I use this line: [webView loadRequest:request];
I tried with other files format but this don’t work. Could you help me?
Thanks for your attention…


Jason September 26, 2012 at 8:29 pm

Fatemeh you should probably show all of your code leading up to before and after your call to NSData so we can see what your doing better


Fatemeh September 27, 2012 at 2:36 pm

On the sample code of “”, I only commented this line: [webView loadRequest:request];
and then put NSData* data = [[NSData alloc]initWithContentsOfFile:url] to load data on NSData object.
The data is null …


Jason September 27, 2012 at 9:06 pm

I’m assuming it’s null because you are not actually starting an actual stream for the file to be decrypted. Essentially what you are doing is just loading an encrypted file which isn’t actually decrypted.

If you create a NSURLConnection which loads the URL and then put in delegate methods for didReceiveData to compile the bits of the stream together into one big NSData object then conversely turn it into an NSString in didFinishLoading or whatever representation you want out of your data that it will work for you


Fatemeh September 28, 2012 at 5:00 pm

Thanks Jason, I followed the way you mentioned before, and I did not get the correct data. After your comment I tried this again and this return data. I think I made a mistake before.
Thanks very much Jason for your help and Thank you, Robbin for your useful topic…

Jason October 1, 2012 at 10:29 pm

No worries, glad you got it all working :)

Jeroen October 4, 2012 at 10:25 am

I really loved this way of encryption. I got it semi-working pretty fast. Sadly I was not able to get it working flawlessly. For some reason it sometimes fails to decrypt the last few characters of an encrypted file. This happens with both my application and the provided demo application. I use IOS SDK 5.1.

For instance:
index.html contains “abcdefghijklmnopqrstuvwxyz1234567890″
it occasionally shows “abcdefghijklmnopqrstuvwxyz123456″, sometimes it does it correctly.

In my main application (Cordova) this causes odd behavior when a closing tag is corrupt. I would love to know if other people faced the same problem. Any insight would be great!

On a side note: Does anyone know if you can disable the xcode warning “A signed resource has been added, modified, or deleted.”. It keeps showing the warning at “Verifying application”. I can get it running by revalidating the shell bash script though. For your info, I test on a device.


Jeroen October 4, 2012 at 10:28 am

I am pretty sure that it’s related to decrypting it. I have inspected the output files and at both cases (failure & success) it had the same content.


Jeroen November 6, 2012 at 11:26 am

I solved this by changing this line:
// NSData *data = [NSData dataWithBytesNoCopy:outBuffer length:len freeWhenDone:NO];
NSData *data = [NSData dataWithBytes:outBuffer length:len];

I suspect it has to do with Automatic Reference Counting.


Sam Becker November 7, 2012 at 2:02 pm

Does anyone else get this error:

CFNetwork internal error (0xc01a:/SourceCache/CFNetwork_Sim/CFNetwork-609/Connection/URLConnectionClient.cpp:2216)

When running on iOS 6?


Wilmar November 8, 2012 at 4:21 am

Tons of it, as does numerous other people in the comments. It ends with the error: Synchronous client exited with no response and no error!

No idea how to fix it yet.


Wilmar November 8, 2012 at 4:28 am

Haven’t tested completely yet, but I changed the following and the [code]Synchronous client exited with no response and no error![/code] error disappeared.

1) Changed [code]NSData *data = [NSData dataWithBytesNoCopy:outBuffer length:len freeWhenDone:NO];[/code] to [code]NSData *data = [NSData dataWithBytes:outBuffer length:len];[/code]

2) Added [code][self.client URLProtocol:self didReceiveResponse:[[[NSURLResponse alloc] init] autorelease] cacheStoragePolicy:NSURLCacheStorageNotAllowed];[/code] at the beginning of the -startLoading method in EncryptedFileURLProtocol.m

Thanks to the previous two commenters who posted these fixes.


Wilmar November 8, 2012 at 4:30 am

I see my [code] tags don't work. Here is a clean version:

Haven't tested completely yet, but I changed the following and the Synchronous client exited with no response and no error! error disappeared.

1) Changed NSData *data = [NSData dataWithBytesNoCopy:outBuffer length:len freeWhenDone:NO]; to NSData *data = [NSData dataWithBytes:outBuffer length:len];

2) Added [self.client URLProtocol:self didReceiveResponse:[[[NSURLResponse alloc] init] autorelease] cacheStoragePolicy:NSURLCacheStorageNotAllowed]; at the beginning of the -startLoading method in EncryptedFileURLProtocol.m

Thanks to the previous two commenters who posted these fixes.


Sam Becker November 8, 2012 at 8:50 pm

Thanks Wilmar (+ Jeroen)! You’re my hero(s)! I had added the didReceiveResponse: method but to the wrong part and I was getting some nasty crashes. Now I have no more errant console warnings and I can actually see what the hell is going on! Thanks SO much.


DJean May 29, 2013 at 4:34 am

thanks Wilmar!!


Akhil P.K December 13, 2012 at 1:29 am

Zaygraveyard has done great job and the final project can be downloaded from the below link. The issues relating to NSData, UIImage etc are solved and the application is working fine. Thanks to Robin Summerhill also. It is working fine in IOS 6.0 also. Please download the sample project from



WC April 16, 2013 at 11:54 am

Anyone had any luck trying to incorporate this somehow when using Titanium? Could this be made into a module somehow? I am needing to do encrypting/decrypting of media resources and am finding some examples using xCode, but having difficult time getting a solution to be used with Titanium, or even just a javascript way of doing this.
I have had some success using IOS Security feature of encryption when locked by creating an xCode module to set the ‘NSFileProtectionComplete’ value, but it will not work under any of the app bundle resources because they are read-only, so can’t be modified. I was thinking if I could get resources encrypted prior to build of app bundle, then in the app, at least the first run, decrypt to a new file in the Documents or Private Documents location and set the protection attribute there …


Criminal Lawyer Houston Texas April 24, 2013 at 11:17 pm

We appreciate you for putting up posts such as these to help
keep awareness. Be sure to look over my site and follow it,


KobeWong April 25, 2013 at 7:33 am

Hi, Robin

I change the “ENC_KEY” in the run script, and then the decrypt doesn’t work for me. Can you help this?


newssergw May 6, 2013 at 4:54 pm

Спецслужбы США, расследующие теракт на Бостонском марафоне, обнаружили в компьютере вдовы Тамерлана Царнаева Кэтрин Рассел электронный журнал Inspire, распространением которого занимается «Аль-Каида», и другие радикальные исламистские материалы, сообщает The Washington Post.


Meera May 30, 2013 at 2:57 am

Hi there, I downloaded the sample project of yours which works fine but when I tried to do the same with my project to protect my project resources I get this “Can’t open input file. Command /bin/sh failed with exit code 1″. When I tried on terminal to execute the shell script I get it like “this cannot execute binary file”. I dont know whats going wrong. Can you please help?


Maxthon Chan June 17, 2013 at 10:49 am

Do you think this a good idea: instead of hard coding the key in the app, hard code it into a server and use that server to distribute it in a safe manner and after retrieval, store it in keychain? That can be safer as the server can perform some authentication so that hackers are more difficult to break into it, and it can be adapted into a system allowing distributing encrypted IAP content too.


bart June 24, 2013 at 8:44 am

It doesn’t work when I use a pdf instead of html:

NSString *indexPath = [[NSBundle mainBundle] pathForResource:@”test” ofType:@”pdf” inDirectory:@”EncryptedResources”];
NSURL *url = [NSURL encryptedFileURLWithPath:indexPath];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];

Any clue?


chudanqin November 26, 2013 at 10:03 pm

And It doesn’t work when I use a mp4 file. MoviePlayer can’t play it.
If you have solutions about it. Please e-mail me.


Almas December 7, 2013 at 12:03 pm

Hi, have you got any solution? I’m facing with same problem.Please help)

Reply July 17, 2013 at 3:23 am

In fact no matter if someone doesn’t know afterward its up to other people that they will assist, so here it occurs.


real estate license texas July 17, 2013 at 6:22 am

Nice post. I learn something new and challenging on blogs I stumbleupon every day.

It’s always useful to read content from other authors and practice something from their web sites.


any September 19, 2013 at 2:23 am

can u please how to create the encrypted folder


trend micro titanium proxy settings September 24, 2013 at 12:04 am

Please lett me kknow if you’re looking for a author for your
blog. You have some really great posts and I believe I would be a good asset.
If you ever want to take some of the load off, I’d
absolutely love to writfe some content for your blog in
exchange for a link back to mine. Please send me an e-mail if
interested. Thanks!


shalini September 27, 2013 at 3:49 pm

Hi thanks for the gud worked well with htmls..but not working with uiimage..the .PNG files are not getting decrypted working on it for four days..somebody please help
I am using xcode4.6 and iOS 6.


shalini September 30, 2013 at 2:52 pm

Thanks Zaygraveyard for the updated is working fine with uiimage.but am having problems with htmls with CSS.It works fine with plain htmls


att cell phones with contract October 28, 2013 at 8:12 pm

Nice weblog right here! Alsoo your web site lots up fast!
What web host are you the use of? Can I am getting your associate hyperlink on your host?

I esire my site loaded up as quickly as yours lol


Ameen November 19, 2013 at 5:30 pm

Hi Robin, and all
But It’s very simple to see sharedKey in app.ipa with zip it extract and open the app with any hex editor and get it the ENC-Key.


Botas Ugg Espana November 27, 2013 at 11:38 pm

Hoke seems like an everyman and has turned on fans at Michigan again by bringing back the Michigan Way. He talks like a regular guy, and plays football the way Michigan fans were used to in the old days, when going to a Wolverines game gave you a certain feel.
Botas Ugg Espana


Woolrich Parka Donna November 27, 2013 at 11:38 pm

qu hay de los motores? Bien, Hyundai ofrecer hasta cuatro mec repartidas equitativamente entre di y gasolina. En Europa los aut superventas ser los 2.0 y 2.2 a gasoil, con 150 y 200 CV de potencia, mientras que quien busque el refinamiento m absoluto podr inclinarse por un 2.4 de 193 CV o (en EEUU) un 2.0 turbo que homologar 264 CV. La transmisi podr ser autom o manual, dependiendo de las versiones y del sistema de tracci pero siempre con seis marchas.
Woolrich Parka Donna


Moncler Bambini November 27, 2013 at 11:38 pm

Good Samaritans Rewarded: It sometimes pays to do the right thing (Video) Cheap Castles (Video) Unlike prison workers, federal inmates still getting paid during government shutdown Vatican misspells Jesus’s name on commemorative medals Bush, Cheney ‘never quite friends,’ new book reveals USPS may destroy ‘unsafe’ stamps Members of Congress are people too, drink beer They’re talking? Really? Republicans, President Obama have “productive” meeting on debt, shutdown Problemplagued New Jersey Senate campaign mars Booker’s political ascent Monsanto protesters toss money off balcony in Senate officeChristie weight loss surgery successful
Moncler Bambini


Nike Free Dame November 27, 2013 at 11:39 pm

3rd Party Cookies We use Advertising agencies to provide us with some of the advertising on our websites. These include (but are not limited to) Specific Media, The Rubicon Project, AdJug, AdConion, Context Web. Please click on the provider name to visit their optout page.Cyclists at Games to win
Nike Free Dame


Botas Ugg Baratas November 27, 2013 at 11:39 pm

New Range Handmade Wedding Cards 2012My Favorite Wedding Card For 2012New Range Of wedding Cards For 2012Wedding Invitations! When did They First Start with Invitations?Bookmark WidgetKate Middleton Wedding DressWedding PollWedding Day Photo Albums With Swarovski CrystalsAmazonWedding accessories Wedding Day CardsAmazonUK Greeting Cards Are Proud to Anounce Our Range of Civil Partnership CardsGreat Stuff on AmazonWedding AccessoriesHere Is Fabulous Wedding Day Card With Swarovski CrystalsFive Dollar Shake PollAmazon MP3Beautiful Wedding Place Card HolderDo You Run Online Business? Checkout My Other Featured LensesAmazon Voting (Plexo)Handmade Wedding Cards Wedding Invitations Online Worldwide ShippingHow About This Beutiful Handmade Wedding Day Guest BookAmazon SearchLinks Voting (Plexo)Lets Take a Look at Engagement CardsLens Love Widget Please RatePlease Add Your Comments Thank YouFollow Us on Twitter
Botas Ugg Baratas


dmitriy December 4, 2013 at 8:14 am

i have a problem with custom protocol while i’m working with media types ( or ). Media data doesn’t play. I have errors like “Unsupported URL”. i’ll wonder if you can tell me how i can fix this issue.


support December 5, 2013 at 5:22 am

Hi my loved one! I wish to say that this article is amazing, great written
and come with approximately all vital infos.
I’d like to look more posts like this .


情趣用品 December 10, 2013 at 1:12 am

I like to share understanding that I’ve accrued through the yr to help improve group functionality.


aes 256 bit December 23, 2013 at 6:50 am

Simply wish to say your article is as surprising. The clarity in your post
is simply great and i could assume you are an expert on this subject.
Well with your permission allow me to grab your feed to
keep up to date with forthcoming post. Thanks a million
and please keep up the rewarding work.


aes 256 January 5, 2014 at 9:05 am

i have problem when build script.
This error found :
“Encrypting /Projectdir/folderdecrypt/*
Can’t open input file: /Users/Projectdir/crypt ”

Can you tell me how to fix that?


May Phase January 5, 2014 at 9:19 am

How to protect with sqlite file. i have encrypt success but i don’t know how to decrypt this file


Cesar January 27, 2014 at 11:05 am

I need the same info too.


facebook infiltrator review January 23, 2014 at 6:01 pm

Their keywords received 165000 searches monthly on Google and the first 10 pages on Google were taken up by major travel agencies.
The plugin buttons can be used to promote your business Facebook account by adding them to business cards, emails and monthly
newsletters. Enter the ip address of the website you want to open instead of the website address
in the address bar.

Reply January 24, 2014 at 6:53 am

I visited many web sites еxcept thе audio quality for audio
songs current ɑt thiѕ site is genuinely superb.


Sylvia February 3, 2014 at 6:07 pm

No cell phone, no regular phone, no computers, no emails, no kids,
no expectations. This is one of the games where you can
play with multiple players and hence you can make friends across
the globe. Once you have a good idea of what they want, do some homework.


Financial services February 7, 2014 at 10:41 am

Thsnk you foг the good writeup. It iո fact աaѕ a amusement account іt.
ʟooк advanced tο far addded agreeable from you! By the way, how сan we communicate?


Melaine February 12, 2014 at 12:54 am

Therefore, assure your content is not the mediocre type and is great to be read
by a reader. This kind of traffic can be great – and even desired – especially
if you have a blog that is providing essential information to


Kevin February 13, 2014 at 11:02 am

Hi Robin
I have a problem with my project. when i load encrypted file html that embebded file javascript many time my page not run javascript function . Can you help me to fix this problem?
Thank you alot!

Reply February 21, 2014 at 1:25 pm

A fascinating discussion is worth comment. I think that you need to
publish more on this issue, it might not be
a taboo matter but usually people don’t discuss these issues.
To the next! Best wishes!!


film indonesia terbaru February 26, 2014 at 1:26 pm

Admiring the time and effort you put into your blog and in depth information you offer.
It’s good to come across a blog every once in a while that isn’t the same out of date rehashed
material. Wonderful read! I’ve bookmarked your site and I’m adding your
RSS feeds to my Google account.


football quotes February 27, 2014 at 3:06 pm

We are a group of volunteers and starting a new scheme in
our community. Your website provided us with valuable information to work
on. You have done a formidable job and our whole community will
be grateful to you.


pocong juga pocong March 2, 2014 at 3:07 am

I blog quite often and I really thank you for your information.
This great article has truly peaked my interest.
I am going to take a note of your blog and keep checking for new information about once a week.
I subscribed to your RSS feed as well.


Precio Zapatos Louboutin March 15, 2014 at 4:47 am

I’m really impressed with your writing skills and also with the layout on your weblog.
Is this a paid theme or did you modify it yourself?
Either way keep up the excellent quality writing, it’s rare to see a nice blog like this one nowadays.\


سباق سيارات March 17, 2014 at 4:51 pm

Aƿpreciate tɦe recommendation. ʟеt me try it out.


dressup March 19, 2014 at 3:29 pm

If you desire to get a good deal from this paragraph then you have to apply such
methods to your won web site.


Sushil March 22, 2014 at 12:20 pm
Roberto O. Buratti March 25, 2014 at 1:32 pm

Hi Robin, Great Post :)
So, what about if I need to dinamically encrypt resources (for example file downloaded from the Internet) ?
I tried to adjust things in your example to allow writing, but when I try to use the custom protocolo in things like

NSString *urlString = [NSString stringWithFormat:@"my-funny-file-protocol://%@", path];
NSURL *url = [NSURL URLWithString:urlString];
NSOutputStream *writer = [NSOutputStream outputStreamWithURL:url append:NO];

No exception raises, no logs on the console but the result is always nil. The same file works, if I use a standard file: protocol.

Any Idea? Perhaps I’m missing someting in my URLProtocol implementation… but what?

Reply April 9, 2014 at 8:11 pm

Hello, the whole thing is going fine here and ofcourse every one is sharing
information, that’s in fact fine, keep up writing.


Bali Villa Deals April 22, 2014 at 11:46 am

I like the helpful info you provide in your articles. I’ll
bookmark your weblog and check again here frequently. I’m quite sure I’ll learn
a lot of new stuff right here! Good luck for the next!


เสริมจมูก May 2, 2014 at 3:59 am

Hey There. I found your blog using msn. This is a really well
written article. I’ll make sure to bookmark it and return
to read more of your useful info. Thanks for the
post. I’ll certainly comeback.


The Woman Men Adore Review May 15, 2014 at 3:45 pm

Hiya there…. I have designed a unique Search engine optimization solution that should rank any webpage in virtually any sector (whether or not
it’s a competitive niche such as acai berry) to rank easily.
Search engines like google can’t ever ascertain because we take special
ways to avoid traces. Are you currently fascinated to make use of it without cost?


swarovski jewelry rings swarovski crystal May 18, 2014 at 11:19 pm

The Magic Technique For swarovski crystal mask


Swarovski Crystalline Set\/2 Flutes Toasting May 25, 2014 at 10:10 am

Progressive questions egarding swarovski jeweellery ebay uk replied to in addition to the rreasons
you need to start reading each and every statement on this documentation.


mortgage finder May 25, 2014 at 11:28 pm

Hi, I do think this is an excellent site. I stumbledupon it ;) I may come back once again since I book-marked it.
Money and freedom is the best way to change, may you
be rich and continue to help other people.

Reply May 27, 2014 at 7:05 am

Genius Whoo Happens To Be Concerned Aboutt swarovski outlet indonesia


mini warriors hack download May 27, 2014 at 6:53 pm

Today, I went to the beach front with my children. I found a sea shell and
gave it to my 4 year old daughter and said “You can hear the ocean if you put this to your ear.” She
placed the shell to her ear and screamed. There was
a hermit crab inside and it pinched her ear.

She never wants to go back! LoL I know this is entirely
off topic but I had to tell someone!

Reply June 17, 2014 at 2:18 pm

As I write the site venetian blind 100cm wide is How to Clean a Book.
After that, you need to follow a waitress bearing venetian blind 100cm wide nibbles only to
find himself reprimanded byy his CO,the imperious Patricia Hallam.

Do what you want to ask before you make your choice think about the purpose of blackout curtains.
Moost strikingly, there is something else the new guy does.

There are many designs to pick from.


gunblood hack June 29, 2014 at 4:26 am

Troubles adjoining gunblood tips can not be over analysed.
There are numerous aspects which in turn influenced the
particular development connected with gunblood secrets and cheats.
Considering that it’s have an effect on pervades our society, gunblood secrets is actually displaying a growing number of in the values on the younger and upwardly
mobile. It can be an sad consequence of our cultures background that gunblood
secrets and cheats is seldom given lucid thing to
consider through global business companies, whom kind one more fantastic hope
for our civilzation. Complex though it really is I shall today seek to offer an exaustive report upon gunblood cheats as well as a lot of ‘industries’.
It’s got just lately arrived at my attention that there are not enough individuals appreciate how wonderful gunblood cheats continues to be to the life.
Every day all of us awaken as well as probably possess one or more gunblood tips telling lies at the ft .
of our beds. It is wonderful so that you can wake along with smile
every morning for that reason.


how to treat hypothyroidism June 29, 2014 at 5:17 am

Fabulous, what a web site it is! This blog provides valuable data to us, keep it up.


fabrilor July 12, 2014 at 6:51 pm

Do you mind if I quote a couple of your posts
as long as I provide credit and sources back to your weblog?

My website is in the very same niche as yours and my users would genuinely benefit from a lot of
the information you present here. Please let me know if this okay with you.
Thanks a lot!


nowoczesne meble do sypialni July 12, 2014 at 9:41 pm

Helpful information. Lucky me I discovered your site accidentally, and I’m surprised why this accident didn’t happened in advance!
I bookmarked it.


boating holidays norfolk broads 2013 July 23, 2014 at 12:26 pm

Wow! In the end I got a weblog from where I be capable of really take helpful data concerning my study and knowledge.


Rosalina July 29, 2014 at 6:33 pm

If possibly you paint your head’s hair, you may obtain a cost-effective hair painting
for any couple of bucks, its surely not high-priced in any way,
then you may really start off searching great! . Should you usually have the very your hair
color then thats an advantage and also a issue significantly less to concern yourself with.
Afterwards you can want to obtain the key naruto outfit, on account
of any additional frizzy hair which it truly is acquired all around the the neck and throat,
you can obtain something style a sibling or even a cosing or almost certainly some lover
you realize appears to be to get obtained a sweater or some factor much like what
has got the distinct head of hair detail,
next the only concern other may very well be to set quite a few
orange apparel put on more than that to be sure the
hairs go on top of the top for this orange shirts or dresses producing it look and incredibly seem like this were a single.


Latisha July 30, 2014 at 6:19 pm

Thanks for sharing your thoughts about iphone.


urządzenia fitness outdoor August 15, 2014 at 9:36 pm

What’s up, its pleasant article on the topic of media print, we all be aware of media is a enormous source
of data.


male extended adolescence September 1, 2014 at 1:23 am

Hi! Do you use Twitter? I’d like to follow you if
that would be ok. I’m absolutely enjoying your blog and look forward to new posts.


Mariano September 3, 2014 at 10:28 pm

Hi, after reading this awesome paragraph i am also happy to share my familiarity here with colleagues.


Juliann September 4, 2014 at 6:22 am

Hey! This is my first visit to your blog! We are a collection of
volunteers and starting a new project in a community in the same niche.

Your blog provided us useful information to work on. You have done a marvellous job!


Home Skin Whitening scam September 8, 2014 at 5:19 am

This is really attention-grabbing, You’re an excessively professional blogger.
I’ve joined your feed and look forward to in search of extra of
your fantastic post. Also, I have shared your web site in my social


Potty Training In 3 Days Scam September 9, 2014 at 5:59 am

Congratulations! Here is your prize passcode: KSMBZ3. You need this in future.

It’s for a special opt-in promotion to acquire an item absolutely free.
We’re going to use our computer software to find
weblogs all round the web to seek out our champion in 1 month time!


Google September 9, 2014 at 5:28 pm

is updated frequently with free advice about Google Ad –
Words strategy, tactics, tips tricks and techniques for success in Ad –
Words advertising. The website speed test at Secret Search Engine Labs will analyze how fast a page on your site is loading and
give you tips on how to improve it. What Googlebot is
looking to see in the Free Local Google Advertising Listings
is quite another.


cop vsnl net lost mobile September 17, 2014 at 6:27 am

IMEI (International Mobile Equipment Identity) is usually a specific 15-17 digit number assigned to GSM as
well as iDEN wireless phones. Primarily this is planned in order to identify every mobile
phone and even in case the mobile phone has been lost. Generally IMEI
number is designed to recognize every mobile and whenever it was stolen or
lost, to bar the device from being used by the other person. When a
user sees that his / her device was robbed, it could block this IMEI digit code and then lock it out
of the network. In case you have any dual-SIM cellular phone, you will see 2 International Mobile Equipment Identity digit numbers, each one for each SIM slot.
Apart from cellphones, this International Mobile Equipment Identity codes are usually branded in netbooks with wireless internet cards, 3G/4G tables.
Now, alongside IMEI, numerous gadgets possess MEID too, (Mobile Equipment ID,
a super set of IMEI).

There are plenty of approaches to obtain your
IMEI digit number. Just one approach may perhaps not necessarily effectively function with other sorts of devices.
Let’s take a look into the different solution for determining this
particular IMEI/MEID digit number. This specific digit number will be found on every cell device.
To actually locate it, turn off you cellular phone , remove your cell
battery, and then take a look around the bare cell battery slot to get a white tag jotting your IMEI digits
which is 15 or perhaps 17 digits.
The other typical method to actually get is simply by dialing 5-digit string *#06#.
By the instance you type the very last digit, the IMEI digits would be displayed on your cellular.

Nonetheless, this approach may possibly not really perform for
other sorts of handsets. For example, an apple iphone with the Verizon network
dials this number as a phoning number, and then will not really
return the IMEI number. In case your cell device is
lost or perhaps stolen, all you need to do is to get the original packaging for your cell device
and discover the barcode label stuck on package.
IMEI is generally detailed together with the barcode and serial
number on the cover of your box.
Different mobile devices may have different tactics for obtaining the IMEI digit number.
Let’s look at some of these.

People who use Samsung cellular items, the person who have installed the Samsung KIES app in their very own personal computer in order to
synchronize their very own phone device with the
personal computer, they can obtain the particular IMEI number
from the details stored in the Computer.
To accomplish that, simply open up the Windows registry
using ‘regedit’ and navigate: HKEY_CURRENT_USER\Software\Samsung\Kies\DeviceDB\.

In the entry, you are going to obtain the actual IMEINUM and then DEVCONINFO keys.
Those keys incorporate your IMEI digit number of the cellphone.

For those who use Nokia units, the OVI (Nokia PC Suite) Computer’s desktop app will be able to help find the actual IMEI
digit codes. From the Nokia PC Suite application, navigate: My Computer->C Drive->Users->(Your user Name)->Application Data->Local->Nokia->Nokia Suite.
When you open any of the folders you will probably view folder names which will certainly have IMEI digit codes.
Motorola cell devices – Once you switch on your cell
phone, dial the following key series in quick succession: # * [menu] [right arrow].
And then scroll straight down till you discover IMEI/SIM ID.

IMEI (International Mobile Equipment Identity) digit codes tracking via Google
android handsets: this could make use of Google’s Dashboard app in order to retrieve this specific code.
First sign on to the Google account, as soon as on the Dashboard, expand the Android items list which generally
is 4th on your list. After that, look for your cell phone model on the list.

Its IMEI number are going to be placed right next to it.
For the ones who are using iPhone or iPad, this is exactly how
you could conduct: from the home screen press
‘Menu’, then open the ‘Settings’ window, move to ‘General’ proceed to
‘About’ field, there you will find MEID and then to the right side
of that code, a 14-digit number which is certainly your IMEI digits.


optionbit September 19, 2014 at 1:30 am

It is also called 2 to 1 against, which means 2 against, 1 for.
It has reached the pinnacle of popularity over the Internet,
enabling anybody to buy and sell currencies. The great advantage to this type of trading involves knowing upfront what you
will win or lose at the conclusion of the trade.


Mickey September 20, 2014 at 9:17 pm

Asking questions are really pleasant thing if you are nnot understanding somethig entirely, however this paragraph present good understanding yet.


Lamont September 23, 2014 at 12:36 am

Good day! Do you use Twitter? I’d like to follow you iif that
wold be okay. I’m absolutely enjoying your blog and look forward to new posts.


cheap iphone housing September 23, 2014 at 4:17 pm

My family members all the time say that I am wasting my time here at
web, but I knmow I am getting experience every day by reading thes pleasant content.


Ebony September 23, 2014 at 8:38 pm

This text is worth everyone’s attention. How can I find out

Reply September 24, 2014 at 7:58 am

Good day! I know this is kinda off topic but I was ondering if yoou knew where I could find a captcha plugin for mmy comment form?
I’m using the same blog platform as yours
and I’m having difficulty finding one? Thanks a lot!


Auto Repair Shop Software September 26, 2014 at 3:21 am

Onlookers’ glances are captured by the custom
paint job or the on the customized car accessories. The bad thing is if you add more high performance parts, after
the Dyno tune, you will have to pay and have it tuned again. Through my personal experience this can happen, but is
more feasible if the automobile is simply very
neglected, or if there was consequential damage because of some
other underlying problem that damaged many components.


projektant wnetrz wroclaw opinie October 1, 2014 at 5:17 pm



PS1 Emulator October 3, 2014 at 9:03 pm

Good way of explaining, and good piece of writing to get data on the topic of my presentation focus, which i am going
to present in institution of higher education.


أفضل شركة تنظيف في الرياض October 4, 2014 at 4:07 am

Hello friends, fastidious piece of writing and good arguments commented here, I am genuinely enjoying by these.


Clarence October 8, 2014 at 12:40 am

What’s Taking place i’mnew to this, I sumbled upon this I’ve found It absolutely useful andd it has aided me oout loads.
I’m hhoping to gove a contribution & help different customers like iits helpe me.
Good job.


Jovita October 13, 2014 at 6:13 am

I read this article completely regarding the comparison of most recent and earlier technologies, it’s amazing article.


Ayaz October 16, 2014 at 4:23 am

Great tutorial. Thanks. I have two questions.
1- How can i encrypt files through the app? I mean i will download a file and save the encrypted file in documents directory.
2- How can i play encrypted video file like a stream? I mean i don’t want to decrypt the whole file first and then play since it may take time to decrypt and whole file can be in memory which will consume more memory.


got pussies October 16, 2014 at 5:05 am

Why visitors still make use of to read news papers when in this
technological world all is presented on net?


window suppliers October 17, 2014 at 5:29 pm

Spot on with this write-up, I absolutely feel this amazing site
needs much more attention. I’ll probably be returning to read more,
thanks for the info!


side collection zm2931 October 19, 2014 at 4:58 am

Hi there, everything is going perfectly here and ofcourse every one
is sharing facts, that’s truly good, keep up writing.


guitar types October 23, 2014 at 3:38 am

Hi there to every body, it’s my first pay a visit of
this blog; this web site consists of amazing and
genuinely excellent stuff in favor of readers.


Siro October 23, 2014 at 7:42 am

Thanks for you codes, it works fine in iOS7 in real device, but it crashed in iOS8 in simulator, there is no iOS8 real device, so i cannot test in it, any one test in iOS8 real device?

The crash log:
2014-10-23 17:21:42.173 EncryptedResourceDemo[2941:189790] Application windows are expected to have a root view controller at the end of application launch
2014-10-23 17:22:03.704 EncryptedResourceDemo[2941:189857] Not handle NSStreamEventNone
2014-10-23 17:22:32.332 EncryptedResourceDemo[2941:190093] NSURLConnection/CFURLConnection ordering violation: didReceiveData to be scheduled before didReceiveResponse
2014-10-23 17:22:47.997 EncryptedResourceDemo[2941:190093] NSURLConnection/CFURLConnection ordering violation: didFinishLoading to be scheduled before didReceiveResponse
/SourceCache/WebCore_Sim/WebCore-7600.1.4.10/platform/ios/wak/ void WKViewAddSubview(WKViewRef, WKViewRef): invalid parameter
2014-10-23 17:22:48.005 EncryptedResourceDemo[2941:189844] *** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘*** -[__NSSetM addObject:]: object cannot be nil’


Bhardwaj November 26, 2014 at 3:56 am

Facing the same problem…i used it in one of my project..worked good in IOS 7..and when started working in IOS 8 device it crashes.


keyword rank checker October 25, 2014 at 2:09 pm

Hі, itts good pice of writingg аbout media print, ԝe all bе familiar աith media іs a great source of factѕ.


Alton October 26, 2014 at 10:50 pm

Had been actually searching for just an ordinary shower enclosures before
I came across this fabulous site, did not even know there were any
such thing as a ‘steam shower enclosure’, really, might possibly just may have to have one

Reply October 27, 2014 at 10:07 am

wonderful post, very informative. I wonder why
the other specialists of this sector don’t notice this.
You should proceed your writing. I’m confident, you’ve a huge readers’ base already!


mp3skull October 30, 2014 at 4:18 am

I like reading through a post that will make people think.
Also, many thanks for allowing for me to comment!


Quinton November 3, 2014 at 2:56 am

Wonderful site. Plenty of useful info here. I’m sending it
to several buddies ans also sharing in delicious.
And of course, thanks in your sweat!


finest food November 6, 2014 at 10:32 am

What i do not understood is in fact how you’re now not really much more smartly-liked than you may be right now.
You are so intelligent. You know therefore significantly with regards to this subject, made me in my view consider it from numerous
various angles. Its like women and men don’t seem to be interested except it’s one thing to do
with Girl gaga! Your personal stuffs nice.
At all times handle it up!


shopping sale November 6, 2014 at 11:31 pm

• The time allotted for the exam is 1 hour and 40 minutes only.
One can avoid the heavy traffic, money spent on the gas for the car,
time, energy, and the maddening crowd. Write down what you need and the amount it will cost, and make sure you
have the money to pay for it.


microjob November 7, 2014 at 12:50 am

You ought to be a part of a contest for one of the best
blogs online. I’m going to highly recommend this blog!


Kieran November 8, 2014 at 5:16 pm

Never before heard of a steam shower enclosure up until
I came across this website, so pleased I did want to have one right now and funds
letting will likely be enjoying one pretty soon


hair stylist November 9, 2014 at 8:50 pm

Hello terrific website! Does running a blog such
aas this take a massive amount work? I have very little expertise
in programming however I was hoping to start my own blog in the near future.
Anyways, should you have any recommendations or tikps
for new blog owners please share. I understand this is
off subject however I just had to ask. Appreciate it!


best music creation software review November 9, 2014 at 10:50 pm

If you are doing this you may appear to be desperate
and lame. You need to watch plenty of videos and focus a lengthy documentation before you can figure out how to use it.
- Quality poses a minor issue and could not be as good as
some hardware workstations.


hacking forums November 10, 2014 at 7:45 am

Thanks designed for sharing such a good thought, piece of writing is nice, thats why
i have read it fully


acompanhantes rj November 16, 2014 at 7:51 pm

Link exchange is nothing else except it is just placing the other person’s weblog
link on your page at proper place and other person will also do same for you.


learn to swim November 18, 2014 at 4:27 pm

I have read so many articles or reviews on the topic of the blogger lovers except this
paragraph is really a pleasant piece of writing, keep it up.


cheats mod apk November 21, 2014 at 4:00 pm

cheats mod apk Impressive web site. Numerous strategies the following. I am delivering it to several associates ans on top of that discussing throughout tasty. And indeed, thank you in your perspire!


Turramurra Plumbers November 22, 2014 at 6:09 pm

Pretty section of content. I just stumbled upon your weblog and
in accession capital to assert that I acquire actually enjoyed account your
blog posts. Any way I’ll be subscribing to your feeds
and even I achievement you access consistently rapidly.


phan mem bao co November 23, 2014 at 9:34 pm

I do not even know how I stopped up here, however I believed this submit used to be great.

I do not recognize who you are but certainly you’re going to a famous blogger should you
aren’t already. Cheers!


Home and property November 28, 2014 at 6:16 pm

It’s hard to come by knowledgeable people about this topic, however,
you sound like you know what you’re talking
about! Thanks


diamond ace plumbers and heating specialists December 5, 2014 at 7:04 pm

The best Houston electricians take effort to appear clean and neat when they have to work in, drop it in the future.
Courses do include theoretical aspects of electricity as well as mend faulty diamond ace contractors plumber technology.


Agen Tangkasnet December 7, 2014 at 6:01 pm

What i don’t realize is in fact how you are not actually
much more well-appreciated than you might be right now.
You’re so intelligent. You realize therefore considerably with
regards to this matter, made me for my part imagine it from a lot of various angles.
Its like men and women are not involved unless it is something to accomplish with
Woman gaga! Your own stuffs outstanding.
All the time take care of it up!

Reply December 8, 2014 at 8:48 pm

I know this web site provides quality depending articles and extra data, is there any other website which presents such things in quality?


import telefonu z chin December 18, 2014 at 3:44 pm

Thanks for sharing such a pleasant thinking, article is good,
thats why i have read it fully


iandrox December 21, 2014 at 12:04 pm

Great web site. A lot of useful info here. I’m sending it to several pals ans also sharing in delicious.
And obviously, thank you to your sweat!


Jolene December 22, 2014 at 7:56 am

Hi! I’m a canon fan.
I would like to thank you for this great post.
I certainly enjoyed seeing it.
I have already signed up for your RSS feeds and would like
to ask if you have and email list? would enjoy seeing your news in my
Thanks again!!


Noelia December 26, 2014 at 11:50 am

Normally I do not learn article oon blogs, however
I would like to say thatt this write-up very forced me
to take a look at and doo it! Your writing style has been amazed me.
Thanks, very great post.


Declan December 27, 2014 at 12:38 am

Pretty! This was an incredibly wonderful article. Many thanks
for providing this info.


Rosario December 29, 2014 at 7:02 pm

Thanks for any other magnificent article. Where else could anyone get that type of info in such a perfect manner of writing?
I’ve a presentation next week, and I am on the look for such information.


read more December 31, 2014 at 1:30 am

It’s in point of fact a nice and useful piece of info.
I’m glad that you just shared this useful information with us.
Please stay us up to date like this. Thanks
for sharing.


A Year Of Books January 5, 2015 at 12:12 pm

After looking over a number of the blog articles on your blog, I
really like your way of blogging. I saved it to my bookmark site list and will be checking back soon. Take a look
at my website too and let me know what you think.


CoasterVille Hack January 7, 2015 at 2:55 pm

Wow, wonderful weblog structure! How long have you ever been blogging for?
you make blogging look easy. The whole glance of your site is wonderful,
let alone the content material!

Reply January 25, 2015 at 5:37 am

I constantlʏ spent my half an ɦoսr tto read
tҺіs webpage’s articles everydqy ɑlong with a cup of coffee.


Eartha February 6, 2015 at 3:58 am

I have read so many posts concerning the blogger lovers except this piece of writing is truly a nice post, keep it


creative elegance February 7, 2015 at 12:54 am

The high end wedding photographer is a professional and is definitely experienced.
The couple should discuss with the wedding photographer about their expectations, the format of the wedding photography, and the moments in the wedding that they
want the photographer to capture. When I say recent I mean 6 months or less when available.


Tonja February 11, 2015 at 1:43 pm

It is hispanic comedy asking people who live and colonize in soil nearby homes.
The techs in the market has faced itsshare of challenges during
2005-07. While that’s comparable to traditional. Home pest control companies who arre seeking offer
delicious and rich nourishment.


ace fishing wild catch hack ios android February 11, 2015 at 5:26 pm

naturally like your web-site however you have to check
the spelling on several of your posts. Several of them are rife with spelling problems
and I to find it very bothersome to inform the truth however I will certainly come
back again.


unbroken pdf February 13, 2015 at 2:16 pm

Regardless of a diet that is naturally associated with
healing and lack unbroken pdff of appetite or as part of increasing their workout
routines. We have fingertips on the entire body, how
they are habitual of taking 5-HTP. Acai Ultra BurnThis FDA approved weight loss needs, it iss important
however unbroken ppdf that those fed oligomeric PCs had the specific dit regimens.

Maybe you’re drinking more water, your body in managing obesity and diabetes; they end
up with the results they get started! I tell this story iis not to be
onne of me, the calrie expenditure drop.


EvasionTeam February 14, 2015 at 6:50 am

We increased safety of Shadow Battle 2 Cheats adding Guard Protection Script together with a giant checklist of proxies.


Luis February 16, 2015 at 3:25 am

All positions require State Authorities and FBI background checks.


baby Health care February 22, 2015 at 8:54 pm

Hello to every body, it’s my first pay a quick visit of
this weblog; this web site contains amazing and in fact excellent stuff in support
of visitors.


türk mobil porno February 24, 2015 at 3:50 pm

Hi to every one, it’s really a nice for me to pay a quick visit this web
site, it includes priceless Information.


podatek dochodowy kalkulator February 26, 2015 at 9:35 pm

Prawnik dodaje, że narzeczona jest, w rozumieniu przepisów ustawy podatku od spadków i
darowizn, osobą należącą do trzeciej grupy podatkowej.


youtube views increaser botswana February 28, 2015 at 8:20 am

There are several service providers that are not genuine.
One of the most popular types of videos found under
the heading of people and blogs are video blogs. People use to search
videos on the basis of their title and their descriptions and hence these two
areas should be as much stronger as possible.

Reply February 28, 2015 at 10:08 pm

If you are going for finest contents like I do, simply go to see this web page all the time since
it offers feature contents, thanks


olive oil March 4, 2015 at 7:52 pm

They remain as black truffle Chairman off CSC will take a triip to Arizona when she said.
Tangles occur within cells and arre also in coconut milk to stir this and add a cup
of sugar.


urząd skarbowy warszawa ursynów March 10, 2015 at 12:59 pm

Urząd jednak postanowił nas skontrolować i
zażądał faktury na web z dowodami wpłat oraz świadectwo urodzenia i dokument tożsamości dziecka do wglądu.

Reply March 10, 2015 at 2:40 pm

W mojej ocenie 25 lat “wolności” to naprawdę tłuste lata dla wszystkich,
którzy w PRL zajmowali partyjne stołki.


limousine montreal March 10, 2015 at 3:08 pm

New York limo for three hurs or thee hen night.
The film was the woman was asking if they would ensure that you are assured they are taken care though.
Thhis question can vary differently in terms of corporate occasions
and those coming with is safe. If there are also used as it sesems to add montreal limo servbice more fun. Generally, finances are
the guests can be the solution? Some people in the business are initiated
in search ofsuchserviceswith the availability oof limousines is unmatched.


Nicole March 11, 2015 at 5:40 am

Im Esszimmer ist es vielleicht der Esstisch eines bekannten Designers, der den Beifall Ihrer Besucher findet.


leasing wrocław March 11, 2015 at 7:08 am

The leasing enterprise will lease the equipment, expecting to sell it secondhand at the finish of the lease, or to lease it once more to a person else.


seomoz open site explorer March 11, 2015 at 1:41 pm

This is an essential processing to see because the web-crawler regulations aren’t created being a
design of tenets or decrees.


live gold price in india chart March 12, 2015 at 9:56 am

For example the spot gold value for December will be bought in June
or July as it has a set future contract assigned
for latter months.


blog March 12, 2015 at 8:58 pm

They are the talk oof Manchester. There are plenty of rap videos that describe the benefits of
a veggke West Point, Giant Sequoias, El Capitan and Bridalveil blogging Falls.
Inquire on additional charges, taxation, and the cars must make
appointment 6months before the firest of which did not comment on the window.
Limos are usually offered with blogging the DFW Airport
to rehearsals, not all. Do you take the whole life.

An anniversary date is set to turn any ordinary activity or occasion.


tarotista gratis online March 13, 2015 at 9:48 am

Quazlity articles is the secret to interest the visitors to pay
a visit the web site, that’s what this web site is providing.


internet fraud complaint center uk March 13, 2015 at 6:56 pm

Internet fraud can are available in many different types, however all
of them are equally malicious and detrimental to the sufferer.


web designer job description singapore March 14, 2015 at 12:33 pm

Andrew Dunlop produces for Sonitek Firm with a crew of committed companies who targets supplying solutions to his customers.


android multiplayer games March 14, 2015 at 5:51 pm

The sport features a single participant campaign, however the principle draw of the game is that the online


headache remedies March 14, 2015 at 11:45 pm

Five of the limo. Each one of natural migraine relieef
the wedding day, you can have 19-passengers Bus.
The car features a voice natural migraine relief when others might not bbe a grand
experience for commuters, maks your life. If the kind of a kind.


themes bootstrap admin March 14, 2015 at 11:46 pm

One of the major issues I have with Twitter Bootstrap is that you find yourself with
lots of DOM elements full of pointless classes.


florida web design bryant smith March 15, 2015 at 1:40 am

Though often enough the possibility isn’t on what inquiries
to ask a web designer confident.


binary options demo account 60 seconds March 15, 2015 at 2:20 am

If you prefer to determine lots of movement in the electronic
alternatives then since it will bring you gain, you may need to trade near the starting.


online appointment scheduling freeware March 15, 2015 at 7:06 am

Online consultation scheduler allows sufferers to register book their
sessions and online without having voiced at top desk to individual medical team.


makeup forever concealer March 15, 2015 at 3:24 pm

In this article, we give 7 great make-up suggestions that
may provide help to to realize a radiant
and glowing look.


bbq catering los angeles wedding March 15, 2015 at 3:29 pm

The seafood eating places have massive dining
rooms and can sometimes handle banquets for parties, weddings,
reunions, and other special occasions.


air purifier ionizer walmart March 15, 2015 at 4:39 pm

Remote controls allow the ultraviolet ionizer air devices to control the ozone protection,
levelsAnion and timer function.


forex automated trading strategies March 15, 2015 at 7:52 pm

It is simpler than it has ever been to affix the fast paced and exciting world of forex trading with right this moment’s automated buying and selling
software program.

Reply March 16, 2015 at 2:30 am

Thre are many things, butt if you casque pour moto
jet are interested in, is non-removable. For all those who do not
come with a safe place overnight to stop at Thomas Keller’s
famed The French Laundry.


Sewa Mobil Surabaya March 19, 2015 at 1:57 am

It’s amazing to pay a quick visit this website and reading
the views of all colleagues about this post, while I am
also keen of getting knowledge.

Reply March 22, 2015 at 9:16 am

Link exchange is nothing else except it is just placing the other person’s webpage link on your page at appropriate place and other person will also do similar for you.


Leave a Comment

{ 37 trackbacks }

Previous post:

Next post: