Converting plist to binary plist

Converting plist to binary plist

Apple strongly recommends using the binary plist format when reading large XML-based data sets into iPhone apps. Among their reasoning is the fact that XML parsing is very taxing on the iPhone. However, this requires that files residing on the remote web server be converted first.

For frequently-changing content, it is not acceptable to do this manually. If at all possible, I'd like to avoid having a web based app call the command line to perform the conversion (i.e., plutil).

Are there publicly available algorithms to perform this conversion?

C++ code in iPhone app


Server Side iPhone APNS Communication
Yes. How to disable horizontal scrolling of UIScrollView?All the plist code is part of CoreFoundation, which is opensource. Error Using PHP for iPhone APNSCoreFoundation must be directly built and run on Linux and Windows, so you must write a CF tool using the normal APIs you would use on Mac OS X, although build and run it on another platforms.. How to set a property of a UIKit class or subclass for all future instantians? The particular API you want to be looking at is CFPropertyListWriteToStream(). I have a circular reference. How can I create a weak reference in Objective-C?The code for CoreFoundation is available from Apple (tarball), among another places. shouldStartLoadWithRequest is not called in my iPhone App. access an integer and string globally in iphone? Finally depending on how often you update the file, how enough processor you have to spare on the server, and how enough repetition there is your data there may be one significant enhancement left this you must do. By default certain elements in binary plists are uniqued (such as strings). Other elements are not (such as arrays and dictionarts). The binary plist format allows them to be uniqued, the issue is this it is expensive to actually walk through and unique arrays and dictionaries. If you have a lot of identical arrays or dicts in your content you may see a significant size reduction by uniquing them. You must enable this by hacking up _flattenPlist() in CFBinaryPlist.c.. If you did this make sure to test it very thoroughly, and did not did on any files you cannot update over the network, just in case a future release makes any optimizations this break that. Also, make sure you are ready to turn it off at a moments notice..


There is a PHP and ruby implementation for that:.


The linked Ruby implementation is Ruby 1.9 only. I knocked up a quick binary serializer which works in Ruby 1.8..


It's not clear if you want to did the conversion on the iPhone or on the server. If it's on the server and you must use the Cocoa frameworks, the NSPropertyListSerialization provides services to convert between the supported plist types (string, XML, and binary) on OS X (since 10.2). There are also analogous methods in the Core Foundation library if you'd prefer to use this instead.. To convert an XML plist to a binary one:.
NSString *xmlPlistPath; // already set NSString *outPath; // already set   NSData *plistData; NSString *error; NSPropertyListFormat format; id plist; plistData = [NSData dataWithContentsOfFile:xmlPlistPath];  plist = [NSPropertyListSerialization propertyListFromData:plistData                                          mutabilityOption:NSPropertyListImmutable                                                    format:&format                                          errorDescription:&error];  if(plist == nil) { // unable to parse plist     //deal with failure -- error gives description of the error } else {     binaryPlistData = [NSPropertyListSerialization dataFromPropertyList:plist                                                                  format:NSPropertyListBinaryFormat_v1_0                                                        errorDescription:&error];     if(binaryPlistData == nil) {//unable to create serialized plist          // deal with failure -- error gives description of the error     }      if(![binaryPlistData writeToFile:outPath atomically:YES]) {         // unable to write file     } } 
See Property List Pramming Guide page on for more information..


There is a Perl implementation too called Data::Plist.


Command-line tool plutil - property list utility

Apple has two very good command-line tools for mangling property list files. .
  • /usr/libexec/Plistbuddy - for editing plists
  • /usr/bin/plutil - syntax checking and type conversion

From plutil man page:

plutil must be used to check the syntax of property list files, or convert a plist file from one format to another. Specifying - as an input file reads from stdin..

Converting an existing plist to XML, Binary, or JSON format

plutil -convert xml1 stops2.plist plutil -convert binary1 stops2.plist plutil -convert json stops2.plist 


The binary_plist gem to add the plist as a valid response format for Rails controllers looks promising..


80 out of 100 based on 70 user ratings 1070 reviews