Skip to content

Commit

Permalink
Merge pull request #432 from Simperium/develop
Browse files Browse the repository at this point in the history
Simperium Mark 0.7.6
  • Loading branch information
jleandroperez committed Jan 6, 2015
2 parents 576cc9e + 34ccc2e commit 7dafa22
Show file tree
Hide file tree
Showing 42 changed files with 1,091 additions and 370 deletions.
5 changes: 5 additions & 0 deletions External/SocketRocket/SRWebSocket.h
Expand Up @@ -40,6 +40,7 @@ typedef enum SRStatusCode : NSInteger {
@class SRWebSocket;

extern NSString *const SRWebSocketErrorDomain;
extern NSString *const SRHTTPResponseErrorKey;

#pragma mark - SRWebSocketDelegate

Expand Down Expand Up @@ -84,6 +85,9 @@ extern NSString *const SRWebSocketErrorDomain;
// Send a UTF8 String or Data.
- (void)send:(id)data;

// Send Data (can be nil) in a ping message.
- (void)sendPing:(NSData *)data;

@end

#pragma mark - SRWebSocketDelegate
Expand All @@ -99,6 +103,7 @@ extern NSString *const SRWebSocketErrorDomain;
- (void)webSocketDidOpen:(SRWebSocket *)webSocket;
- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
- (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload;

@end

Expand Down
67 changes: 53 additions & 14 deletions External/SocketRocket/SRWebSocket.m
Expand Up @@ -111,7 +111,13 @@ @interface _SRRunLoopThread : NSThread
assert(length <= UINT32_MAX);
CC_SHA1(bytes, (CC_LONG)length, md);

return [[NSData dataWithBytes:md length:CC_SHA1_DIGEST_LENGTH] base64Encoding];
NSData *data = [NSData dataWithBytes:md length:CC_SHA1_DIGEST_LENGTH];

if ([data respondsToSelector:@selector(base64EncodedStringWithOptions:)]) {
return [data base64EncodedStringWithOptions:0];
}

return [data base64Encoding];
}

@implementation NSData (SRWebSocket)
Expand All @@ -134,6 +140,7 @@ - (NSString *)stringBySHA1ThenBase64Encoding;
@end

NSString *const SRWebSocketErrorDomain = @"SRWebSocketErrorDomain";
NSString *const SRHTTPResponseErrorKey = @"HTTPResponseStatusCode";

// Returns number of bytes consumed. Returning 0 means you didn't match.
// Sends bytes to callback handler;
Expand Down Expand Up @@ -357,8 +364,10 @@ - (void)dealloc
[_inputStream close];
[_outputStream close];

sr_dispatch_release(_workQueue);
_workQueue = NULL;
if (_workQueue) {
sr_dispatch_release(_workQueue);
_workQueue = NULL;
}

if (_receivedHTTPHeaders) {
CFRelease(_receivedHTTPHeaders);
Expand Down Expand Up @@ -437,9 +446,8 @@ - (void)_HTTPHeadersDidFinish;

if (responseCode >= 400) {
SRFastLog(@"Request failed with response code %d", responseCode);
[self _failWithError:[NSError errorWithDomain:@"org.lolrus.SocketRocket" code:2132 userInfo:[NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"received bad response code from server %ld", (long)responseCode] forKey:NSLocalizedDescriptionKey]]];
[self _failWithError:[NSError errorWithDomain:SRWebSocketErrorDomain code:2132 userInfo:@{NSLocalizedDescriptionKey:[NSString stringWithFormat:@"received bad response code from server %ld", (long)responseCode], SRHTTPResponseErrorKey:@(responseCode)}]];
return;

}

if(![self _checkHandshake:_receivedHTTPHeaders]) {
Expand Down Expand Up @@ -500,7 +508,13 @@ - (void)didConnect

NSMutableData *keyBytes = [[NSMutableData alloc] initWithLength:16];
SecRandomCopyBytes(kSecRandomDefault, keyBytes.length, keyBytes.mutableBytes);
_secKey = keyBytes.base64Encoding;

if ([keyBytes respondsToSelector:@selector(base64EncodedStringWithOptions:)]) {
_secKey = [keyBytes base64EncodedStringWithOptions:0];
} else {
_secKey = [keyBytes base64Encoding];
}

assert([_secKey length] == 24);

CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Upgrade"), CFSTR("websocket"));
Expand Down Expand Up @@ -600,7 +614,7 @@ - (void)unscheduleFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;

- (void)close;
{
[self closeWithCode:-1 reason:nil];
[self closeWithCode:SRStatusCodeNormal reason:nil];
}

- (void)closeWithCode:(NSInteger)code reason:(NSString *)reason;
Expand Down Expand Up @@ -690,6 +704,7 @@ - (void)_writeData:(NSData *)data;
[_outputBuffer appendData:data];
[self _pumpWriting];
}

- (void)send:(id)data;
{
NSAssert(self.readyState != SR_CONNECTING, @"Invalid State: Cannot call send: until connection is open");
Expand All @@ -708,6 +723,16 @@ - (void)send:(id)data;
});
}

- (void)sendPing:(NSData *)data;
{
NSAssert(self.readyState == SR_OPEN, @"Invalid State: Cannot call send: until connection is open");
// TODO: maybe not copy this for performance
data = [data copy] ?: [NSData data]; // It's okay for a ping to be empty
dispatch_async(_workQueue, ^{
[self _sendFrameWithOpcode:SROpCodePing data:data];
});
}

- (void)handlePing:(NSData *)pingData;
{
// Need to pingpong this off _callbackQueue first to make sure messages happen in order
Expand All @@ -718,9 +743,14 @@ - (void)handlePing:(NSData *)pingData;
}];
}

- (void)handlePong;
- (void)handlePong:(NSData *)pongData;
{
// NOOP
SRFastLog(@"Received pong");
[self _performDelegateBlock:^{
if ([self.delegate respondsToSelector:@selector(webSocket:didReceivePong:)]) {
[self.delegate webSocket:self didReceivePong:pongData];
}
}];
}

- (void)_handleMessage:(id)message
Expand Down Expand Up @@ -850,7 +880,7 @@ - (void)_handleFrameWithData:(NSData *)frameData opCode:(NSInteger)opcode;
[self handlePing:frameData];
break;
case SROpCodePong:
[self handlePong];
[self handlePong:frameData];
break;
default:
[self _closeWithProtocolError:[NSString stringWithFormat:@"Unknown opcode %ld", (long)opcode]];
Expand Down Expand Up @@ -1049,7 +1079,7 @@ - (void)_pumpWriting;
if (dataLength - _outputBufferOffset > 0 && _outputStream.hasSpaceAvailable) {
NSInteger bytesWritten = [_outputStream write:_outputBuffer.bytes + _outputBufferOffset maxLength:dataLength - _outputBufferOffset];
if (bytesWritten == -1) {
[self _failWithError:[NSError errorWithDomain:@"org.lolrus.SocketRocket" code:2145 userInfo:[NSDictionary dictionaryWithObject:@"Error writing to stream" forKey:NSLocalizedDescriptionKey]]];
[self _failWithError:[NSError errorWithDomain:SRWebSocketErrorDomain code:2145 userInfo:[NSDictionary dictionaryWithObject:@"Error writing to stream" forKey:NSLocalizedDescriptionKey]]];
return;
}

Expand Down Expand Up @@ -1129,9 +1159,14 @@ - (void)_scheduleCleanup

- (void)_cleanupSelfReference:(NSTimer *)timer
{
// Nuke NSStream delegate's
_inputStream.delegate = nil;
_outputStream.delegate = nil;


// Remove the streams, right now, from the networkRunLoop
[_inputStream close];
[_outputStream close];

// Cleanup selfRetain in the same GCD queue as usual
dispatch_async(_workQueue, ^{
_selfRetain = nil;
Expand Down Expand Up @@ -1304,7 +1339,11 @@ - (void)_sendFrameWithOpcode:(SROpCode)opcode data:(id)data;
{
[self assertOnWorkQueue];

NSAssert(data == nil || [data isKindOfClass:[NSData class]] || [data isKindOfClass:[NSString class]], @"Function expects nil, NSString or NSData");
if (nil == data) {
return;
}

NSAssert([data isKindOfClass:[NSData class]] || [data isKindOfClass:[NSString class]], @"NSString or NSData");

size_t payloadLength = [data isKindOfClass:[NSString class]] ? [(NSString *)data lengthOfBytesUsingEncoding:NSUTF8StringEncoding] : [data length];

Expand Down Expand Up @@ -1336,7 +1375,7 @@ - (void)_sendFrameWithOpcode:(SROpCode)opcode data:(id)data;
} else if ([data isKindOfClass:[NSString class]]) {
unmasked_payload = (const uint8_t *)[data UTF8String];
} else {
assert(NO);
return;
}

if (payloadLength < 126) {
Expand Down
2 changes: 1 addition & 1 deletion README.md
@@ -1,6 +1,6 @@
simperium-ios
=============
[![Build Status](http://img.shields.io/travis/Simperium/simperium-ios.svg?branch=develop)](https://travis-ci.org/Simperium/simperium-ios)
[![Build Status](http://img.shields.io/travis/Simperium/simperium-ios.svg?branch=develop&style=flat)](https://travis-ci.org/Simperium/simperium-ios)
[![Pod Version](http://img.shields.io/cocoapods/v/Simperium.svg?style=flat)](http://www.github.com/Simperium/simperium-ios)
[![Pod Platform](http://img.shields.io/cocoapods/p/Simperium.svg?style=flat)](http://www.simperium.com)
[![Pod Platform](http://img.shields.io/cocoapods/p/Simperium-OSX.svg?style=flat)](http://www.simperium.com)
Expand Down
14 changes: 14 additions & 0 deletions Simperium-OSX/Simperium-OSX.xcodeproj/project.pbxproj
Expand Up @@ -194,6 +194,8 @@
B5F43C31194F56D300495590 /* SPProcessorConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F43C2F194F56D300495590 /* SPProcessorConstants.m */; };
B5F43C33194F578E00495590 /* SPChangeProcessorTests.m in Sources */ = {isa = PBXBuildFile; fileRef = B5F43C32194F578E00495590 /* SPChangeProcessorTests.m */; };
B5F65F7C1847DE3E00CEF48D /* SPManagedObject+Internals.h in Headers */ = {isa = PBXBuildFile; fileRef = B5F65F7B1847DE3E00CEF48D /* SPManagedObject+Internals.h */; };
B5FDA4AF1A2E47F300E83054 /* SPCoreDataStorage+Mock.m in Sources */ = {isa = PBXBuildFile; fileRef = B5FDA4AB1A2E47F300E83054 /* SPCoreDataStorage+Mock.m */; };
B5FDA4B01A2E47F300E83054 /* SPManagedObject+Mock.m in Sources */ = {isa = PBXBuildFile; fileRef = B5FDA4AD1A2E47F300E83054 /* SPManagedObject+Mock.m */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -406,6 +408,11 @@
B5F43C2F194F56D300495590 /* SPProcessorConstants.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SPProcessorConstants.m; path = ../../Simperium/SPProcessorConstants.m; sourceTree = "<group>"; };
B5F43C32194F578E00495590 /* SPChangeProcessorTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SPChangeProcessorTests.m; path = ../../SimperiumTests/SPChangeProcessorTests.m; sourceTree = "<group>"; };
B5F65F7B1847DE3E00CEF48D /* SPManagedObject+Internals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "SPManagedObject+Internals.h"; path = "../../Simperium/SPManagedObject+Internals.h"; sourceTree = "<group>"; };
B5FDA4AA1A2E47F300E83054 /* SPCoreDataStorage+Mock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "SPCoreDataStorage+Mock.h"; path = "../../SimperiumTests/SPCoreDataStorage+Mock.h"; sourceTree = "<group>"; };
B5FDA4AB1A2E47F300E83054 /* SPCoreDataStorage+Mock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "SPCoreDataStorage+Mock.m"; path = "../../SimperiumTests/SPCoreDataStorage+Mock.m"; sourceTree = "<group>"; };
B5FDA4AC1A2E47F300E83054 /* SPManagedObject+Mock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "SPManagedObject+Mock.h"; path = "../../SimperiumTests/SPManagedObject+Mock.h"; sourceTree = "<group>"; };
B5FDA4AD1A2E47F300E83054 /* SPManagedObject+Mock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "SPManagedObject+Mock.m"; path = "../../SimperiumTests/SPManagedObject+Mock.m"; sourceTree = "<group>"; };
B5FDA4AE1A2E47F300E83054 /* XCTestCase+Simperium.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "XCTestCase+Simperium.h"; path = "../../SimperiumTests/XCTestCase+Simperium.h"; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -732,6 +739,11 @@
B5D581D1183565CA00B08996 /* Extensions */ = {
isa = PBXGroup;
children = (
B5FDA4AA1A2E47F300E83054 /* SPCoreDataStorage+Mock.h */,
B5FDA4AB1A2E47F300E83054 /* SPCoreDataStorage+Mock.m */,
B5FDA4AC1A2E47F300E83054 /* SPManagedObject+Mock.h */,
B5FDA4AD1A2E47F300E83054 /* SPManagedObject+Mock.m */,
B5FDA4AE1A2E47F300E83054 /* XCTestCase+Simperium.h */,
B5D581CE183565C500B08996 /* XCTestCase+Simperium.h */,
B5D581CF183565C500B08996 /* XCTestCase+Simperium.m */,
);
Expand Down Expand Up @@ -1074,10 +1086,12 @@
B56B16511835682500E45C98 /* Config.m in Sources */,
B58EC3251885B74100ED37E5 /* SPThreadsafeMutableSetTests.m in Sources */,
B59D9F191A1A49F800941154 /* SPMemberJSONTests.m in Sources */,
B5FDA4B01A2E47F300E83054 /* SPManagedObject+Mock.m in Sources */,
B56B16541835682500E45C98 /* TestObject.m in Sources */,
B58EC3241885B74100ED37E5 /* SPPersistentMutableSetTests.m in Sources */,
B566128C1A1E1E610064A625 /* SPStorageObserverAdapter.m in Sources */,
B59D9F131A1A49BB00941154 /* SPIndexProcessorTests.m in Sources */,
B5FDA4AF1A2E47F300E83054 /* SPCoreDataStorage+Mock.m in Sources */,
B59D9F171A1A49E800941154 /* SPCoreDataStorageTests.m in Sources */,
B56B16501835682500E45C98 /* PostComment.m in Sources */,
B59D9F151A1A49DD00941154 /* SPWebSocketInterfaceTests.m in Sources */,
Expand Down
4 changes: 2 additions & 2 deletions Simperium.podspec
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = "Simperium"
s.version = "0.7.5"
s.version = "0.7.6"
s.summary = "Simperium libraries."
s.description = "Simperium is a simple way for developers to move data as it changes, instantly and automatically."
s.homepage = "https://github.com/Simperium/simperium-ios"
Expand All @@ -13,7 +13,7 @@ Pod::Spec.new do |s|
s.ios.deployment_target = '6.0'
s.osx.deployment_target = '10.8'

s.source_files = 'Simperium/*.{h,m}', 'External/SPReachability/*'
s.source_files = 'Simperium/*.{h,m}', 'External/SPReachability/*', 'External/SSKeychain/*'
s.osx.source_files = 'Simperium-OSX/**/*.{h,m}'

s.osx.exclude_files = 'Simperium/SPAuthenticationViewController.{h,m}', 'Simperium/SPTOSViewController.{h,m}', 'Simperium/SPAuthenticationButton.{h,m}'
Expand Down
12 changes: 12 additions & 0 deletions Simperium.xcodeproj/project.pbxproj
Expand Up @@ -209,6 +209,8 @@
B5DF229318B41E3200874C75 /* SPMemberJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = B5DF229118B41E3200874C75 /* SPMemberJSON.m */; };
B5DF229518B41FB700874C75 /* SPMemberJSONTests.m in Sources */ = {isa = PBXBuildFile; fileRef = B5DF229418B41FB700874C75 /* SPMemberJSONTests.m */; };
B5E03D99182C115100412572 /* JSONKit+Simperium.m in Sources */ = {isa = PBXBuildFile; fileRef = B5E03D97182C115100412572 /* JSONKit+Simperium.m */; };
B5E5C2171A2E34D900915DBA /* SPManagedObject+Mock.m in Sources */ = {isa = PBXBuildFile; fileRef = B5E5C2161A2E34D900915DBA /* SPManagedObject+Mock.m */; };
B5E5C21A1A2E400900915DBA /* SPCoreDataStorage+Mock.m in Sources */ = {isa = PBXBuildFile; fileRef = B5E5C2191A2E400900915DBA /* SPCoreDataStorage+Mock.m */; };
B5E662AA18F492AD0065EF11 /* NSStringSimperiumTest.m in Sources */ = {isa = PBXBuildFile; fileRef = B5E662A918F492AD0065EF11 /* NSStringSimperiumTest.m */; };
B5E8D3091831221100AE2C5A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B5E8D3081831221100AE2C5A /* XCTest.framework */; };
B5E8D30F1831237500AE2C5A /* MockWebSocketInterface.m in Sources */ = {isa = PBXBuildFile; fileRef = B5ECEA251831154700B9289A /* MockWebSocketInterface.m */; };
Expand Down Expand Up @@ -452,6 +454,10 @@
B5DF229418B41FB700874C75 /* SPMemberJSONTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SPMemberJSONTests.m; sourceTree = "<group>"; };
B5E03D96182C115100412572 /* JSONKit+Simperium.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = "JSONKit+Simperium.h"; sourceTree = "<group>"; };
B5E03D97182C115100412572 /* JSONKit+Simperium.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "JSONKit+Simperium.m"; sourceTree = "<group>"; };
B5E5C2151A2E34D900915DBA /* SPManagedObject+Mock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SPManagedObject+Mock.h"; sourceTree = "<group>"; };
B5E5C2161A2E34D900915DBA /* SPManagedObject+Mock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SPManagedObject+Mock.m"; sourceTree = "<group>"; };
B5E5C2181A2E400900915DBA /* SPCoreDataStorage+Mock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SPCoreDataStorage+Mock.h"; sourceTree = "<group>"; };
B5E5C2191A2E400900915DBA /* SPCoreDataStorage+Mock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SPCoreDataStorage+Mock.m"; sourceTree = "<group>"; };
B5E662A918F492AD0065EF11 /* NSStringSimperiumTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSStringSimperiumTest.m; sourceTree = "<group>"; };
B5E8D3081831221100AE2C5A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
B5E8D33A1831237500AE2C5A /* UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
Expand Down Expand Up @@ -900,6 +906,10 @@
children = (
B565ECA71832940B00D162FF /* XCTestCase+Simperium.h */,
B565ECA81832940B00D162FF /* XCTestCase+Simperium.m */,
B5E5C2151A2E34D900915DBA /* SPManagedObject+Mock.h */,
B5E5C2161A2E34D900915DBA /* SPManagedObject+Mock.m */,
B5E5C2181A2E400900915DBA /* SPCoreDataStorage+Mock.h */,
B5E5C2191A2E400900915DBA /* SPCoreDataStorage+Mock.m */,
);
name = Extensions;
sourceTree = "<group>";
Expand Down Expand Up @@ -1333,6 +1343,7 @@
B565ECA41832643000D162FF /* PostComment.m in Sources */,
B565ECA51832643000D162FF /* Post.m in Sources */,
B5F068B1186223DF00D0D7B7 /* DiffMatchPatchTest.m in Sources */,
B5E5C2171A2E34D900915DBA /* SPManagedObject+Mock.m in Sources */,
B565ECA61832643000D162FF /* Config.m in Sources */,
B5DF229518B41FB700874C75 /* SPMemberJSONTests.m in Sources */,
B51397F11947612B004C1416 /* SPChangeProcessorTests.m in Sources */,
Expand All @@ -1344,6 +1355,7 @@
B565ECAA1832940B00D162FF /* XCTestCase+Simperium.m in Sources */,
B5A57EAC1951C128006E2455 /* SPIndexProcessorTests.m in Sources */,
B5E8D30F1831237500AE2C5A /* MockWebSocketInterface.m in Sources */,
B5E5C21A1A2E400900915DBA /* SPCoreDataStorage+Mock.m in Sources */,
B5E8D3121831237500AE2C5A /* MockWebSocketChannel.m in Sources */,
B57FA3B21900568A00957205 /* SPRelationshipResolverTests.m in Sources */,
B5DE0E0F1850D0200080C44D /* SPCoreDataStorageTests.m in Sources */,
Expand Down
11 changes: 10 additions & 1 deletion Simperium.xcodeproj/xcshareddata/xcschemes/Framework.xcscheme
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0500"
LastUpgradeVersion = "0610"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down Expand Up @@ -39,6 +39,15 @@
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "26563AE914FDAD0F0081C8C1"
BuildableName = "Framework"
BlueprintName = "Framework"
ReferencedContainer = "container:Simperium.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
Expand Down
11 changes: 10 additions & 1 deletion Simperium.xcodeproj/xcshareddata/xcschemes/Simperium.xcscheme
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0500"
LastUpgradeVersion = "0610"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down Expand Up @@ -59,6 +59,15 @@
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
allowLocationSimulation = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "264CD8FA135DFD7A00C51BAD"
BuildableName = "libSimperium.a"
BlueprintName = "Simperium"
ReferencedContainer = "container:Simperium.xcodeproj">
</BuildableReference>
</MacroExpansion>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
Expand Down

0 comments on commit 7dafa22

Please sign in to comment.