├── VERSION ├── .gitignore ├── ichat2json.xcodeproj ├── project.xcworkspace │ └── contents.xcworkspacedata ├── xcuserdata │ └── keyvan.xcuserdatad │ │ └── xcschemes │ │ └── xcschememanagement.plist └── project.pbxproj ├── ichat2json ├── StubCoder.h ├── Presentity.h ├── StubCoder.m ├── Presentity.m ├── InstantMessage.h ├── main.m └── InstantMessage.m ├── LICENSE └── README.md /VERSION: -------------------------------------------------------------------------------- 1 | 1.3.1 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | xcuserdata 2 | build 3 | -------------------------------------------------------------------------------- /ichat2json.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ichat2json/StubCoder.h: -------------------------------------------------------------------------------- 1 | // 2 | // StubCoder.h 3 | // ichat2json 4 | // 5 | // Created by Keyvan Fatehi on 12/9/16. 6 | // Copyright © 2016 Keyvan Fatehi. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface StubCoder : NSObject 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /ichat2json/Presentity.h: -------------------------------------------------------------------------------- 1 | // 2 | // Sender.h 3 | // ichat2json 4 | // 5 | // Created by Keyvan Fatehi on 12/9/16. 6 | // Copyright © 2016 Keyvan Fatehi. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface Presentity : NSObject 12 | 13 | @property (readonly, copy) NSString *accountName; 14 | @property (readonly, copy) NSString *serviceName; 15 | 16 | @end -------------------------------------------------------------------------------- /ichat2json/StubCoder.m: -------------------------------------------------------------------------------- 1 | // 2 | // StubCoder.m 3 | // ichat2json 4 | // 5 | // Created by Keyvan Fatehi on 12/9/16. 6 | // Copyright © 2016 Keyvan Fatehi. All rights reserved. 7 | // 8 | 9 | #import "StubCoder.h" 10 | 11 | @implementation StubCoder 12 | - (id)initWithCoder:(NSCoder *)decoder; 13 | { 14 | if (!(self = [super init])) 15 | return nil; 16 | 17 | return self; 18 | } 19 | 20 | - (void)encodeWithCoder:(NSCoder *)encoder; 21 | { NSAssert1(NO, @"%@ does not allow encoding.", [self class]); } 22 | @end 23 | -------------------------------------------------------------------------------- /ichat2json.xcodeproj/xcuserdata/keyvan.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ichat2json.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 7AE34B851DFBA30500969CBE 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | ISC License (ISC) 2 | Copyright (c) 2016, Keyvan Fatehi 3 | 4 | Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. 5 | 6 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 7 | -------------------------------------------------------------------------------- /ichat2json/Presentity.m: -------------------------------------------------------------------------------- 1 | // 2 | // Sender.m 3 | // ichat2json 4 | // 5 | // Created by Keyvan Fatehi on 12/9/16. 6 | // Copyright © 2016 Keyvan Fatehi. All rights reserved. 7 | // 8 | 9 | #import "Presentity.h" 10 | 11 | @implementation Presentity 12 | 13 | @synthesize accountName = _accountName; 14 | @synthesize serviceName = _serviceName; 15 | 16 | - (id)initWithCoder:(NSCoder *)decoder; 17 | { 18 | if (!(self = [super init])) 19 | return nil; 20 | _accountName = [decoder decodeObjectForKey:@"ID"]; 21 | _serviceName = [decoder decodeObjectForKey:@"ServiceName"]; 22 | return self; 23 | } 24 | 25 | - (void)encodeWithCoder:(NSCoder *)encoder; 26 | { NSAssert1(NO, @"%@ does not allow encoding.", [self class]); } 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /ichat2json/InstantMessage.h: -------------------------------------------------------------------------------- 1 | // 2 | // InstantMessage.h 3 | // ichat2json 4 | // 5 | // Created by Keyvan Fatehi on 12/9/16. 6 | // Copyright © 2016 Keyvan Fatehi. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "Presentity.h" 11 | 12 | @interface InstantMessage : NSObject 13 | 14 | @property (readonly, copy) NSDate *date; 15 | @property (readonly, copy) NSString *message; 16 | @property (readonly, copy) NSMutableArray *files; 17 | @property () BOOL isMultiParty; 18 | @property () BOOL isRead; 19 | @property () NSSet *participantIds; 20 | @property () NSString *chatId; 21 | @property (readonly, copy) Presentity *sender; 22 | @property (readonly, copy) Presentity *subject; 23 | - (NSString *) toJSONString; 24 | @end 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ichat2json 2 | 3 | Reads an .ichat binary plist file and writes newline-separated JSON to STDOUT 4 | 5 | ## Run Instructions 6 | 7 | - Open ichat2json.xcodeproj with Xcode. 8 | - Build it. 9 | - In console you'll find the path of the executable. 10 | 11 | Console: 12 | ```console 13 | Usage: /Users/[YOURUSER]/Library/Developer/Xcode/DerivedData/ichat2json-fgxipssxrjlhvrevepwucnmapdzq/Build/Products/Debug/ichat2json path/to/ichat 14 | ``` 15 | 16 | Copy the path, and use this command in a Terminal to dump it in a file: 17 | 18 | EX: 19 | ```bash 20 | cd /PATH_TO_YOUR_ICHAT_FILE 21 | /Users/[YOURUSER]/Library/Developer/Xcode/DerivedData/ichat2json-fgxipssxrjlhvrevepwucnmapdzq/Build/Products/Debug/ichat2json file.ichat > file.json 22 | ``` 23 | 24 | 25 | ## Special Thanks 26 | 27 | * [Jonathan](https://github.com/jmah) for [iChat-Image-Indexer](https://github.com/jmah/iChat-Image-Indexer) 28 | * [Karsten](https://github.com/karstenBriksoft) for [PlistExplorer](https://github.com/karstenBriksoft/PlistExplorer) 29 | * [Gianni](https://github.com/unzsnu) for [Run Instructions](https://github.com/matrix-hacks/ichat2json/issues/3#issuecomment-583489932) 30 | -------------------------------------------------------------------------------- /ichat2json/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // ichat2json 4 | // 5 | // Created by Keyvan Fatehi on 12/9/16. 6 | // Copyright © 2016 Keyvan Fatehi. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "InstantMessage.h" 11 | #import "Presentity.h" 12 | #import "StubCoder.h" 13 | 14 | int main(int argc, const char * argv[]) { 15 | @autoreleasepool { 16 | if(argc < 2) 17 | { 18 | fprintf(stderr, "Usage: %s path/to/ichat\n", argv[0]); 19 | exit(-1); 20 | } 21 | NSString *filePath = [NSString stringWithUTF8String:argv[1]]; 22 | [NSKeyedUnarchiver setClass:[InstantMessage class] forClassName:@"InstantMessage"]; 23 | [NSKeyedUnarchiver setClass:[Presentity class] forClassName:@"Presentity"]; 24 | 25 | [NSKeyedUnarchiver setClass:[StubCoder class] forClassName:@"NSFont"]; 26 | [NSKeyedUnarchiver setClass:[StubCoder class] forClassName:@"NSMutableParagraphStyle"]; 27 | [NSKeyedUnarchiver setClass:[StubCoder class] forClassName:@"NSTextAttachment"]; 28 | [NSKeyedUnarchiver setClass:[StubCoder class] forClassName:@"NSColor"]; 29 | 30 | NSData *data = [NSData dataWithContentsOfFile:filePath]; 31 | NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; 32 | NSArray* root = [unarchiver decodeObjectForKey:@"$root"]; 33 | NSMutableArray *ims = [NSMutableArray array]; 34 | NSMutableSet *people = [NSMutableSet set]; 35 | for (id object in root) { 36 | if ([object isKindOfClass:[NSArray class]]) { 37 | for (id sub in object) { 38 | if ([sub isKindOfClass:[InstantMessage class]]) { 39 | InstantMessage *im = (InstantMessage *) sub; 40 | if ([im subject] != nil) 41 | [people addObject:im.subject.accountName]; 42 | if ([im sender] != nil) 43 | [people addObject:im.sender.accountName]; 44 | [ims addObject:im]; 45 | } 46 | if ([sub isKindOfClass:[Presentity class]]) { 47 | Presentity *prs = (Presentity *) sub; 48 | [people addObject:prs.accountName]; 49 | } 50 | } 51 | } 52 | } 53 | for (InstantMessage* im in ims){ 54 | if ([people count] > 2) { 55 | [im setIsMultiParty:true]; 56 | } 57 | [im setParticipantIds:people]; 58 | [im setChatId: [root lastObject]]; 59 | fprintf(stdout, "%s\n", [[im toJSONString] UTF8String]); 60 | } 61 | 62 | } 63 | return 0; 64 | } 65 | -------------------------------------------------------------------------------- /ichat2json/InstantMessage.m: -------------------------------------------------------------------------------- 1 | // 2 | // InstantMessage.m 3 | // ichat2json 4 | // 5 | // Created by Keyvan Fatehi on 12/9/16. 6 | // Copyright © 2016 Keyvan Fatehi. All rights reserved. 7 | 8 | #import "InstantMessage.h" 9 | 10 | @implementation InstantMessage 11 | - (id)initWithCoder:(NSCoder *)decoder; 12 | { 13 | if (!(self = [super init])) 14 | return nil; 15 | 16 | _sender = [decoder decodeObjectForKey:@"Sender"]; 17 | _subject = [decoder decodeObjectForKey:@"Subject"]; 18 | _date = [decoder decodeObjectForKey:@"Time"]; 19 | _message = [decoder decodeObjectForKey:@"OriginalMessage"]; 20 | _files = [[NSMutableArray alloc] init]; 21 | _isMultiParty = false; 22 | _isRead = [(NSNumber*)[decoder decodeObjectForKey:@"IsRead"] integerValue] == 1 ? true : false; 23 | NSAttributedString *attrMsg = [decoder decodeObjectForKey:@"MessageText"]; 24 | NSArray *fileIds = [self getAttributesWithKey:@"__kIMFilenameAttributeName" fromAttributedString:attrMsg]; 25 | NSArray *fileNames = [self getAttributesWithKey:@"__kIMFileTransferGUIDAttributeName" fromAttributedString:attrMsg]; 26 | [fileIds enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 27 | NSString *fileId = [fileIds objectAtIndex:idx]; 28 | NSString *fileName = [fileNames objectAtIndex:idx]; 29 | NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:fileId, @"id", fileName, @"name", nil]; 30 | [_files addObject:dict]; 31 | }]; 32 | return self; 33 | } 34 | 35 | - (NSArray *) getAttributesWithKey: (NSString *)attrKey fromAttributedString:(NSAttributedString *)attrStr 36 | { 37 | NSRange effectiveRange = NSMakeRange(0, 0); 38 | NSMutableArray *mArray = [NSMutableArray array]; 39 | id value; 40 | while (NSMaxRange(effectiveRange) < [attrStr length]) { 41 | value = [attrStr attribute:attrKey atIndex:NSMaxRange(effectiveRange) effectiveRange:&effectiveRange]; 42 | if (value != nil) { 43 | [mArray addObject:value]; 44 | } 45 | } 46 | return [mArray copy]; 47 | } 48 | 49 | - (void)encodeWithCoder:(NSCoder *)encoder; 50 | { NSAssert1(NO, @"%@ does not allow encoding.", [self class]); } 51 | 52 | - (NSString *) toJSONString; 53 | { 54 | NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 55 | [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS"]; 56 | NSString *dateStr = [dateFormat stringFromDate:_date]; 57 | NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 58 | [_sender accountName], @"sender", 59 | [_sender serviceName], @"service", 60 | _message == nil ? [NSNull null] : _message, @"message", 61 | dateStr, @"date", 62 | [NSNumber numberWithBool:_isMultiParty], @"isMultiParty", 63 | [NSNumber numberWithBool:_isRead], @"isRead", 64 | _subject ? [_subject accountName] : [NSNull null], @"subject", 65 | [_participantIds allObjects], @"participantIds", 66 | _chatId, @"chatId", 67 | _files, @"files", 68 | nil]; 69 | 70 | NSError *error; 71 | NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error]; 72 | NSString *jsonString; 73 | if (! jsonData) { 74 | NSLog(@"Got an error: %@", error); 75 | } else { 76 | jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 77 | } 78 | return jsonString; 79 | } 80 | @end 81 | -------------------------------------------------------------------------------- /ichat2json.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 7A2C847A1E22084100DBB279 /* StubCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A2C84791E22084100DBB279 /* StubCoder.m */; }; 11 | 7AE34B8A1DFBA30600969CBE /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AE34B891DFBA30500969CBE /* main.m */; }; 12 | 7AE34B951DFBAB4800969CBE /* InstantMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AE34B941DFBAB4800969CBE /* InstantMessage.m */; }; 13 | 7AE34B9B1DFBB54F00969CBE /* Presentity.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AE34B9A1DFBB54F00969CBE /* Presentity.m */; }; 14 | /* End PBXBuildFile section */ 15 | 16 | /* Begin PBXCopyFilesBuildPhase section */ 17 | 7AE34B841DFBA30500969CBE /* CopyFiles */ = { 18 | isa = PBXCopyFilesBuildPhase; 19 | buildActionMask = 2147483647; 20 | dstPath = /usr/share/man/man1/; 21 | dstSubfolderSpec = 0; 22 | files = ( 23 | ); 24 | runOnlyForDeploymentPostprocessing = 1; 25 | }; 26 | /* End PBXCopyFilesBuildPhase section */ 27 | 28 | /* Begin PBXFileReference section */ 29 | 7A2C84781E22084100DBB279 /* StubCoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StubCoder.h; sourceTree = ""; }; 30 | 7A2C84791E22084100DBB279 /* StubCoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StubCoder.m; sourceTree = ""; }; 31 | 7AE34B861DFBA30500969CBE /* ichat2json */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = ichat2json; sourceTree = BUILT_PRODUCTS_DIR; }; 32 | 7AE34B891DFBA30500969CBE /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 33 | 7AE34B931DFBAB4800969CBE /* InstantMessage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InstantMessage.h; sourceTree = ""; }; 34 | 7AE34B941DFBAB4800969CBE /* InstantMessage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = InstantMessage.m; sourceTree = ""; }; 35 | 7AE34B991DFBB54F00969CBE /* Presentity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Presentity.h; sourceTree = ""; }; 36 | 7AE34B9A1DFBB54F00969CBE /* Presentity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Presentity.m; sourceTree = ""; }; 37 | /* End PBXFileReference section */ 38 | 39 | /* Begin PBXFrameworksBuildPhase section */ 40 | 7AE34B831DFBA30500969CBE /* Frameworks */ = { 41 | isa = PBXFrameworksBuildPhase; 42 | buildActionMask = 2147483647; 43 | files = ( 44 | ); 45 | runOnlyForDeploymentPostprocessing = 0; 46 | }; 47 | /* End PBXFrameworksBuildPhase section */ 48 | 49 | /* Begin PBXGroup section */ 50 | 7AE34B7D1DFBA30500969CBE = { 51 | isa = PBXGroup; 52 | children = ( 53 | 7AE34B881DFBA30500969CBE /* ichat2json */, 54 | 7AE34B871DFBA30500969CBE /* Products */, 55 | ); 56 | sourceTree = ""; 57 | }; 58 | 7AE34B871DFBA30500969CBE /* Products */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 7AE34B861DFBA30500969CBE /* ichat2json */, 62 | ); 63 | name = Products; 64 | sourceTree = ""; 65 | }; 66 | 7AE34B881DFBA30500969CBE /* ichat2json */ = { 67 | isa = PBXGroup; 68 | children = ( 69 | 7A2C84781E22084100DBB279 /* StubCoder.h */, 70 | 7A2C84791E22084100DBB279 /* StubCoder.m */, 71 | 7AE34B991DFBB54F00969CBE /* Presentity.h */, 72 | 7AE34B9A1DFBB54F00969CBE /* Presentity.m */, 73 | 7AE34B891DFBA30500969CBE /* main.m */, 74 | 7AE34B931DFBAB4800969CBE /* InstantMessage.h */, 75 | 7AE34B941DFBAB4800969CBE /* InstantMessage.m */, 76 | ); 77 | path = ichat2json; 78 | sourceTree = ""; 79 | }; 80 | /* End PBXGroup section */ 81 | 82 | /* Begin PBXNativeTarget section */ 83 | 7AE34B851DFBA30500969CBE /* ichat2json */ = { 84 | isa = PBXNativeTarget; 85 | buildConfigurationList = 7AE34B8D1DFBA30600969CBE /* Build configuration list for PBXNativeTarget "ichat2json" */; 86 | buildPhases = ( 87 | 7AE34B821DFBA30500969CBE /* Sources */, 88 | 7AE34B831DFBA30500969CBE /* Frameworks */, 89 | 7AE34B841DFBA30500969CBE /* CopyFiles */, 90 | ); 91 | buildRules = ( 92 | ); 93 | dependencies = ( 94 | ); 95 | name = ichat2json; 96 | productName = ichat2json; 97 | productReference = 7AE34B861DFBA30500969CBE /* ichat2json */; 98 | productType = "com.apple.product-type.tool"; 99 | }; 100 | /* End PBXNativeTarget section */ 101 | 102 | /* Begin PBXProject section */ 103 | 7AE34B7E1DFBA30500969CBE /* Project object */ = { 104 | isa = PBXProject; 105 | attributes = { 106 | LastUpgradeCheck = 0730; 107 | ORGANIZATIONNAME = "Keyvan Fatehi"; 108 | TargetAttributes = { 109 | 7AE34B851DFBA30500969CBE = { 110 | CreatedOnToolsVersion = 7.3.1; 111 | }; 112 | }; 113 | }; 114 | buildConfigurationList = 7AE34B811DFBA30500969CBE /* Build configuration list for PBXProject "ichat2json" */; 115 | compatibilityVersion = "Xcode 3.2"; 116 | developmentRegion = English; 117 | hasScannedForEncodings = 0; 118 | knownRegions = ( 119 | en, 120 | ); 121 | mainGroup = 7AE34B7D1DFBA30500969CBE; 122 | productRefGroup = 7AE34B871DFBA30500969CBE /* Products */; 123 | projectDirPath = ""; 124 | projectRoot = ""; 125 | targets = ( 126 | 7AE34B851DFBA30500969CBE /* ichat2json */, 127 | ); 128 | }; 129 | /* End PBXProject section */ 130 | 131 | /* Begin PBXSourcesBuildPhase section */ 132 | 7AE34B821DFBA30500969CBE /* Sources */ = { 133 | isa = PBXSourcesBuildPhase; 134 | buildActionMask = 2147483647; 135 | files = ( 136 | 7AE34B9B1DFBB54F00969CBE /* Presentity.m in Sources */, 137 | 7A2C847A1E22084100DBB279 /* StubCoder.m in Sources */, 138 | 7AE34B8A1DFBA30600969CBE /* main.m in Sources */, 139 | 7AE34B951DFBAB4800969CBE /* InstantMessage.m in Sources */, 140 | ); 141 | runOnlyForDeploymentPostprocessing = 0; 142 | }; 143 | /* End PBXSourcesBuildPhase section */ 144 | 145 | /* Begin XCBuildConfiguration section */ 146 | 7AE34B8B1DFBA30600969CBE /* Debug */ = { 147 | isa = XCBuildConfiguration; 148 | buildSettings = { 149 | ALWAYS_SEARCH_USER_PATHS = NO; 150 | CLANG_ANALYZER_NONNULL = YES; 151 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 152 | CLANG_CXX_LIBRARY = "libc++"; 153 | CLANG_ENABLE_MODULES = YES; 154 | CLANG_ENABLE_OBJC_ARC = YES; 155 | CLANG_WARN_BOOL_CONVERSION = YES; 156 | CLANG_WARN_CONSTANT_CONVERSION = YES; 157 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 158 | CLANG_WARN_EMPTY_BODY = YES; 159 | CLANG_WARN_ENUM_CONVERSION = YES; 160 | CLANG_WARN_INT_CONVERSION = YES; 161 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 162 | CLANG_WARN_UNREACHABLE_CODE = YES; 163 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 164 | CODE_SIGN_IDENTITY = "-"; 165 | COPY_PHASE_STRIP = NO; 166 | DEBUG_INFORMATION_FORMAT = dwarf; 167 | ENABLE_STRICT_OBJC_MSGSEND = YES; 168 | ENABLE_TESTABILITY = YES; 169 | GCC_C_LANGUAGE_STANDARD = gnu99; 170 | GCC_DYNAMIC_NO_PIC = NO; 171 | GCC_NO_COMMON_BLOCKS = YES; 172 | GCC_OPTIMIZATION_LEVEL = 0; 173 | GCC_PREPROCESSOR_DEFINITIONS = ( 174 | "DEBUG=1", 175 | "$(inherited)", 176 | ); 177 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 178 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 179 | GCC_WARN_UNDECLARED_SELECTOR = YES; 180 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 181 | GCC_WARN_UNUSED_FUNCTION = YES; 182 | GCC_WARN_UNUSED_VARIABLE = YES; 183 | MACOSX_DEPLOYMENT_TARGET = 10.11; 184 | MTL_ENABLE_DEBUG_INFO = YES; 185 | ONLY_ACTIVE_ARCH = YES; 186 | SDKROOT = macosx; 187 | }; 188 | name = Debug; 189 | }; 190 | 7AE34B8C1DFBA30600969CBE /* Release */ = { 191 | isa = XCBuildConfiguration; 192 | buildSettings = { 193 | ALWAYS_SEARCH_USER_PATHS = NO; 194 | CLANG_ANALYZER_NONNULL = YES; 195 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 196 | CLANG_CXX_LIBRARY = "libc++"; 197 | CLANG_ENABLE_MODULES = YES; 198 | CLANG_ENABLE_OBJC_ARC = YES; 199 | CLANG_WARN_BOOL_CONVERSION = YES; 200 | CLANG_WARN_CONSTANT_CONVERSION = YES; 201 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 202 | CLANG_WARN_EMPTY_BODY = YES; 203 | CLANG_WARN_ENUM_CONVERSION = YES; 204 | CLANG_WARN_INT_CONVERSION = YES; 205 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 206 | CLANG_WARN_UNREACHABLE_CODE = YES; 207 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 208 | CODE_SIGN_IDENTITY = "-"; 209 | COPY_PHASE_STRIP = NO; 210 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 211 | ENABLE_NS_ASSERTIONS = NO; 212 | ENABLE_STRICT_OBJC_MSGSEND = YES; 213 | GCC_C_LANGUAGE_STANDARD = gnu99; 214 | GCC_NO_COMMON_BLOCKS = YES; 215 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 216 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 217 | GCC_WARN_UNDECLARED_SELECTOR = YES; 218 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 219 | GCC_WARN_UNUSED_FUNCTION = YES; 220 | GCC_WARN_UNUSED_VARIABLE = YES; 221 | MACOSX_DEPLOYMENT_TARGET = 10.11; 222 | MTL_ENABLE_DEBUG_INFO = NO; 223 | SDKROOT = macosx; 224 | }; 225 | name = Release; 226 | }; 227 | 7AE34B8E1DFBA30600969CBE /* Debug */ = { 228 | isa = XCBuildConfiguration; 229 | buildSettings = { 230 | PRODUCT_NAME = "$(TARGET_NAME)"; 231 | }; 232 | name = Debug; 233 | }; 234 | 7AE34B8F1DFBA30600969CBE /* Release */ = { 235 | isa = XCBuildConfiguration; 236 | buildSettings = { 237 | PRODUCT_NAME = "$(TARGET_NAME)"; 238 | }; 239 | name = Release; 240 | }; 241 | /* End XCBuildConfiguration section */ 242 | 243 | /* Begin XCConfigurationList section */ 244 | 7AE34B811DFBA30500969CBE /* Build configuration list for PBXProject "ichat2json" */ = { 245 | isa = XCConfigurationList; 246 | buildConfigurations = ( 247 | 7AE34B8B1DFBA30600969CBE /* Debug */, 248 | 7AE34B8C1DFBA30600969CBE /* Release */, 249 | ); 250 | defaultConfigurationIsVisible = 0; 251 | defaultConfigurationName = Release; 252 | }; 253 | 7AE34B8D1DFBA30600969CBE /* Build configuration list for PBXNativeTarget "ichat2json" */ = { 254 | isa = XCConfigurationList; 255 | buildConfigurations = ( 256 | 7AE34B8E1DFBA30600969CBE /* Debug */, 257 | 7AE34B8F1DFBA30600969CBE /* Release */, 258 | ); 259 | defaultConfigurationIsVisible = 0; 260 | defaultConfigurationName = Release; 261 | }; 262 | /* End XCConfigurationList section */ 263 | }; 264 | rootObject = 7AE34B7E1DFBA30500969CBE /* Project object */; 265 | } 266 | --------------------------------------------------------------------------------