mirror of
https://github.com/status-im/react-native-tcp.git
synced 2025-01-11 19:24:12 +00:00
port of react-native-udp to use tcp instead
This commit is contained in:
commit
3317c90a5e
34
.gitignore
vendored
Normal file
34
.gitignore
vendored
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# OSX
|
||||||
|
#
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Xcode
|
||||||
|
#
|
||||||
|
build/
|
||||||
|
*.pbxuser
|
||||||
|
!default.pbxuser
|
||||||
|
*.mode1v3
|
||||||
|
!default.mode1v3
|
||||||
|
*.mode2v3
|
||||||
|
!default.mode2v3
|
||||||
|
*.perspectivev3
|
||||||
|
!default.perspectivev3
|
||||||
|
xcuserdata
|
||||||
|
*.xccheckout
|
||||||
|
*.moved-aside
|
||||||
|
DerivedData
|
||||||
|
*.hmap
|
||||||
|
*.ipa
|
||||||
|
*.xcuserstate
|
||||||
|
project.xcworkspace
|
||||||
|
|
||||||
|
# Android/IJ
|
||||||
|
#
|
||||||
|
.idea
|
||||||
|
.gradle
|
||||||
|
local.properties
|
||||||
|
|
||||||
|
# node.js
|
||||||
|
#
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log
|
197
TcpSocket.js
Normal file
197
TcpSocket.js
Normal file
@ -0,0 +1,197 @@
|
|||||||
|
//
|
||||||
|
// react-native-tcp
|
||||||
|
//
|
||||||
|
// Created by Andy Prock on 12/14/15.
|
||||||
|
// Copyright (c) 2015 Peel, Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @providesModule TcpSocket
|
||||||
|
* @flow
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var inherits = require('inherits');
|
||||||
|
var EventEmitter = require('events').EventEmitter;
|
||||||
|
var {
|
||||||
|
DeviceEventEmitter,
|
||||||
|
NativeModules
|
||||||
|
} = require('react-native');
|
||||||
|
var Sockets = NativeModules.TcpSockets;
|
||||||
|
var base64 = require('base64-js');
|
||||||
|
var noop = function () {};
|
||||||
|
var instances = 0;
|
||||||
|
var STATE = {
|
||||||
|
DISCONNECTED: 0,
|
||||||
|
CONNECTING: 1,
|
||||||
|
CONNECTED: 2
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = TcpSocket;
|
||||||
|
|
||||||
|
function TcpSocket(options, onopen) {
|
||||||
|
EventEmitter.call(this);
|
||||||
|
|
||||||
|
this._id = instances++;
|
||||||
|
this._state = STATE.DISCONNECTED;
|
||||||
|
this._connecting = false;
|
||||||
|
this._hadError = false;
|
||||||
|
this._handle = null;
|
||||||
|
this._parent = null;
|
||||||
|
this._host = null;
|
||||||
|
|
||||||
|
if (typeof options === 'number') {
|
||||||
|
options = { fd: options }; // Legacy interface.
|
||||||
|
} else if (options === undefined) {
|
||||||
|
options = {};
|
||||||
|
}
|
||||||
|
|
||||||
|
// these will be set once there is a connection
|
||||||
|
this.readable = this.writable = false;
|
||||||
|
|
||||||
|
this._subscription = DeviceEventEmitter.addListener(
|
||||||
|
'tcp-' + this._id + '-data', this._onReceive.bind(this)
|
||||||
|
);
|
||||||
|
|
||||||
|
// ensure compatibility with node's EventEmitter
|
||||||
|
if (!this.on) {
|
||||||
|
this.on = this.addListener.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (onopen) {
|
||||||
|
this.on('open', onopen);
|
||||||
|
}
|
||||||
|
|
||||||
|
Sockets.createSocket(this._id, options); // later
|
||||||
|
}
|
||||||
|
|
||||||
|
inherits(TcpSocket, EventEmitter);
|
||||||
|
|
||||||
|
TcpSocket.prototype._debug = function() {
|
||||||
|
if (__DEV__) {
|
||||||
|
var args = [].slice.call(arguments);
|
||||||
|
args.unshift('socket-' + this._id);
|
||||||
|
console.log.apply(console, args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TcpSocket.prototype.connect = function(options, callback) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
var port = options.port;
|
||||||
|
var host = options.host;
|
||||||
|
|
||||||
|
if (this._state !== STATE.DISCONNECTED) {
|
||||||
|
throw new Error('Socket is already bound');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (callback) {
|
||||||
|
this.once('connected', callback.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
this._state = STATE.CONNECTING;
|
||||||
|
this._connecting = true;
|
||||||
|
this._debug('connecting, host:', host, 'port:', port);
|
||||||
|
Sockets.connect(this._id, port, host, function(err, addr) {
|
||||||
|
err = normalizeError(err);
|
||||||
|
if (err) {
|
||||||
|
// questionable: may want to self-destruct and
|
||||||
|
// force user to create a new socket
|
||||||
|
self._state = STATE.DISCONNECTED;
|
||||||
|
self._debug('failed to bind', err);
|
||||||
|
if (callback) {
|
||||||
|
callback(err);
|
||||||
|
}
|
||||||
|
return self.emit('error', err);
|
||||||
|
}
|
||||||
|
|
||||||
|
self._debug('connected to address:', host, 'port:', port);
|
||||||
|
// self._host = addr.host;
|
||||||
|
// self._port = addr.port;
|
||||||
|
self.writable = self.readable = true;
|
||||||
|
self._state = STATE.CONNECTED;
|
||||||
|
self._connecting = false;
|
||||||
|
self.emit('connected');
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
TcpSocket.prototype.setTimeout = function(msecs, callback) {
|
||||||
|
// nothing yet
|
||||||
|
};
|
||||||
|
|
||||||
|
TcpSocket.prototype.end = function() {
|
||||||
|
if (this._destroyed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._destroyed = true;
|
||||||
|
this._debug('closing');
|
||||||
|
this._subscription.remove();
|
||||||
|
|
||||||
|
Sockets.close(this._id, this._debug.bind(this, 'closed'));
|
||||||
|
this.emit('close');
|
||||||
|
};
|
||||||
|
|
||||||
|
TcpSocket.prototype.destroy = TcpSocket.prototype.end;
|
||||||
|
|
||||||
|
TcpSocket.prototype._onReceive = function(info) {
|
||||||
|
this._debug('received', info);
|
||||||
|
|
||||||
|
// from base64 string
|
||||||
|
var buf = typeof Buffer === 'undefined'
|
||||||
|
? base64.toByteArray(info.data)
|
||||||
|
: new global.Buffer(info.data, 'base64');
|
||||||
|
|
||||||
|
this.emit('data', buf);
|
||||||
|
};
|
||||||
|
|
||||||
|
TcpSocket.prototype.write = function(buffer, encoding, callback) {
|
||||||
|
var self = this;
|
||||||
|
var encoded = false;
|
||||||
|
|
||||||
|
if (this._state === STATE.DISCONNECTED) {
|
||||||
|
throw new Error('Socket is not connected.');
|
||||||
|
} else if (this._state === STATE.CONNECTING) {
|
||||||
|
// we're ok, GCDAsyncSocket handles queueing internally
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof encoding === 'function') {
|
||||||
|
callback = encoding;
|
||||||
|
encoding = null;
|
||||||
|
}
|
||||||
|
callback = callback || noop;
|
||||||
|
var str;
|
||||||
|
if (typeof buffer === 'string') {
|
||||||
|
console.warn('socket.WRITE(): interpreting as UTF8');
|
||||||
|
str = buffer;
|
||||||
|
} else if (typeof Buffer !== 'undefined' && global.Buffer.isBuffer(buffer)) {
|
||||||
|
encoded = true;
|
||||||
|
str = buffer.toString('base64');
|
||||||
|
} else if (buffer instanceof Uint8Array || Array.isArray(buffer)) {
|
||||||
|
encoded = true;
|
||||||
|
str = base64.fromByteArray(buffer);
|
||||||
|
} else {
|
||||||
|
throw new Error('invalid message format');
|
||||||
|
}
|
||||||
|
|
||||||
|
Sockets.write(this._id, str, encoded, function(err) {
|
||||||
|
err = normalizeError(err);
|
||||||
|
if (err) {
|
||||||
|
self._debug('send failed', err);
|
||||||
|
return callback(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
function normalizeError (err) {
|
||||||
|
if (err) {
|
||||||
|
if (typeof err === 'string') {
|
||||||
|
err = new Error(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
13
TcpSockets.js
Normal file
13
TcpSockets.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
/**
|
||||||
|
* @providesModule TcpSockets
|
||||||
|
* @flow
|
||||||
|
*/
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
exports.Socket = require('./TcpSocket');
|
||||||
|
|
||||||
|
exports.createConnection = function(options, callback) {
|
||||||
|
var tcpSocket = new exports.Socket();
|
||||||
|
tcpSocket.connect(options, callback);
|
||||||
|
return tcpSocket;
|
||||||
|
};
|
51
examples/rctsockets/.flowconfig
Normal file
51
examples/rctsockets/.flowconfig
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
[ignore]
|
||||||
|
|
||||||
|
# We fork some components by platform.
|
||||||
|
.*/*.web.js
|
||||||
|
.*/*.android.js
|
||||||
|
|
||||||
|
# Some modules have their own node_modules with overlap
|
||||||
|
.*/node_modules/node-haste/.*
|
||||||
|
|
||||||
|
# Ignore react-tools where there are overlaps, but don't ignore anything that
|
||||||
|
# react-native relies on
|
||||||
|
.*/node_modules/react-tools/src/React.js
|
||||||
|
.*/node_modules/react-tools/src/renderers/shared/event/EventPropagators.js
|
||||||
|
.*/node_modules/react-tools/src/renderers/shared/event/eventPlugins/ResponderEventPlugin.js
|
||||||
|
.*/node_modules/react-tools/src/shared/vendor/core/ExecutionEnvironment.js
|
||||||
|
|
||||||
|
# Ignore commoner tests
|
||||||
|
.*/node_modules/commoner/test/.*
|
||||||
|
|
||||||
|
# See https://github.com/facebook/flow/issues/442
|
||||||
|
.*/react-tools/node_modules/commoner/lib/reader.js
|
||||||
|
|
||||||
|
# Ignore jest
|
||||||
|
.*/node_modules/jest-cli/.*
|
||||||
|
|
||||||
|
# Ignore Website
|
||||||
|
.*/website/.*
|
||||||
|
|
||||||
|
[include]
|
||||||
|
|
||||||
|
[libs]
|
||||||
|
node_modules/react-native/Libraries/react-native/react-native-interface.js
|
||||||
|
|
||||||
|
[options]
|
||||||
|
module.system=haste
|
||||||
|
|
||||||
|
munge_underscores=true
|
||||||
|
|
||||||
|
module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub'
|
||||||
|
module.name_mapper='^[./a-zA-Z0-9$_-]+\.png$' -> 'RelativeImageStub'
|
||||||
|
|
||||||
|
suppress_type=$FlowIssue
|
||||||
|
suppress_type=$FlowFixMe
|
||||||
|
suppress_type=$FixMe
|
||||||
|
|
||||||
|
suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(1[0-7]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
|
||||||
|
suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(1[0-7]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)? #[0-9]+
|
||||||
|
suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
|
||||||
|
|
||||||
|
[version]
|
||||||
|
0.17.0
|
1
examples/rctsockets/.watchmanconfig
Normal file
1
examples/rctsockets/.watchmanconfig
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
110
examples/rctsockets/index.js
Normal file
110
examples/rctsockets/index.js
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var React = require('react-native');
|
||||||
|
var {
|
||||||
|
AppRegistry,
|
||||||
|
StyleSheet,
|
||||||
|
Text,
|
||||||
|
View
|
||||||
|
} = React;
|
||||||
|
|
||||||
|
global.Buffer = global.Buffer || require('buffer').Buffer;
|
||||||
|
|
||||||
|
var telnet = require('./telnet-client');
|
||||||
|
var connection = new telnet();
|
||||||
|
|
||||||
|
// require('./test/simple/test-dgram-address')
|
||||||
|
// require('./test/simple/test-dgram-bind-default-address')
|
||||||
|
// require('./test/simple/test-dgram-bind-shared-ports')
|
||||||
|
|
||||||
|
// function randomPort() {
|
||||||
|
// return Math.random() * 60536 | 0 + 5000 // 60536-65536
|
||||||
|
// }
|
||||||
|
|
||||||
|
// var params = {
|
||||||
|
// host: 'towel.blinkenlights.nl',
|
||||||
|
// port: 23,
|
||||||
|
// shellPrompt: '/ # ',
|
||||||
|
// timeout: 1500,
|
||||||
|
// // removeEcho: 4
|
||||||
|
// };
|
||||||
|
|
||||||
|
var params = {
|
||||||
|
// host: '10.0.1.207',
|
||||||
|
port: 23,
|
||||||
|
timeout: 15000,
|
||||||
|
passwordPrompt: /Password[: ]*$/i
|
||||||
|
// removeEcho: 4
|
||||||
|
};
|
||||||
|
|
||||||
|
connection.on('ready', function(prompt) {
|
||||||
|
connection.exec('ls', function(err, response) {
|
||||||
|
console.log(response);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
connection.on('writedone', function() {
|
||||||
|
console.log('writedone');
|
||||||
|
});
|
||||||
|
|
||||||
|
connection.on('loginfailed', function() {
|
||||||
|
console.log('loginfailed');
|
||||||
|
});
|
||||||
|
|
||||||
|
connection.on('error', function(error) {
|
||||||
|
console.log(error);
|
||||||
|
});
|
||||||
|
|
||||||
|
connection.on('timeout', function() {
|
||||||
|
console.log('socket timeout!');
|
||||||
|
connection.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
connection.on('close', function() {
|
||||||
|
console.log('connection closed');
|
||||||
|
});
|
||||||
|
|
||||||
|
connection.connect(params);
|
||||||
|
|
||||||
|
var rctsockets = React.createClass({
|
||||||
|
render: function() {
|
||||||
|
return (
|
||||||
|
<View style={styles.container}>
|
||||||
|
<Text style={styles.welcome}>
|
||||||
|
Open Dev Tools to see socket chatter
|
||||||
|
</Text>
|
||||||
|
</View>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var styles = StyleSheet.create({
|
||||||
|
container: {
|
||||||
|
flex: 1,
|
||||||
|
justifyContent: 'center',
|
||||||
|
alignItems: 'center',
|
||||||
|
backgroundColor: '#F5FCFF',
|
||||||
|
},
|
||||||
|
welcome: {
|
||||||
|
fontSize: 20,
|
||||||
|
textAlign: 'center',
|
||||||
|
margin: 10,
|
||||||
|
},
|
||||||
|
instructions: {
|
||||||
|
textAlign: 'center',
|
||||||
|
color: '#333333',
|
||||||
|
marginBottom: 5,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// // only works for 8-bit chars
|
||||||
|
// function toByteArray(obj) {
|
||||||
|
// var uint = new Uint8Array(obj.length);
|
||||||
|
// for (var i = 0, l = obj.length; i < l; i++){
|
||||||
|
// uint[i] = obj.charCodeAt(i);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return new Uint8Array(uint);
|
||||||
|
// }
|
||||||
|
|
||||||
|
AppRegistry.registerComponent('rctsockets', () => rctsockets);
|
792
examples/rctsockets/ios/rctsockets.xcodeproj/project.pbxproj
Normal file
792
examples/rctsockets/ios/rctsockets.xcodeproj/project.pbxproj
Normal file
@ -0,0 +1,792 @@
|
|||||||
|
// !$*UTF8*$!
|
||||||
|
{
|
||||||
|
archiveVersion = 1;
|
||||||
|
classes = {
|
||||||
|
};
|
||||||
|
objectVersion = 46;
|
||||||
|
objects = {
|
||||||
|
|
||||||
|
/* Begin PBXBuildFile section */
|
||||||
|
00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
|
||||||
|
00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };
|
||||||
|
00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; };
|
||||||
|
00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; };
|
||||||
|
00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; };
|
||||||
|
00E356F31AD99517003FC87E /* rctsocketsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* rctsocketsTests.m */; };
|
||||||
|
133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; };
|
||||||
|
139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; };
|
||||||
|
139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; };
|
||||||
|
13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
|
||||||
|
13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; };
|
||||||
|
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
|
||||||
|
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
|
||||||
|
146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
|
||||||
|
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
|
||||||
|
96EDB0DC1C10F45200D41E94 /* libTcpSockets.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 96EDB0DB1C10F44500D41E94 /* libTcpSockets.a */; };
|
||||||
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
|
/* Begin PBXContainerItemProxy section */
|
||||||
|
00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 134814201AA4EA6300B7C361;
|
||||||
|
remoteInfo = RCTActionSheet;
|
||||||
|
};
|
||||||
|
00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 134814201AA4EA6300B7C361;
|
||||||
|
remoteInfo = RCTGeolocation;
|
||||||
|
};
|
||||||
|
00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 58B5115D1A9E6B3D00147676;
|
||||||
|
remoteInfo = RCTImage;
|
||||||
|
};
|
||||||
|
00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 58B511DB1A9E6C8500147676;
|
||||||
|
remoteInfo = RCTNetwork;
|
||||||
|
};
|
||||||
|
00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 832C81801AAF6DEF007FA2F7;
|
||||||
|
remoteInfo = RCTVibration;
|
||||||
|
};
|
||||||
|
00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
|
||||||
|
proxyType = 1;
|
||||||
|
remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
|
||||||
|
remoteInfo = rctsockets;
|
||||||
|
};
|
||||||
|
139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 134814201AA4EA6300B7C361;
|
||||||
|
remoteInfo = RCTSettings;
|
||||||
|
};
|
||||||
|
139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 3C86DF461ADF2C930047B81A;
|
||||||
|
remoteInfo = RCTWebSocket;
|
||||||
|
};
|
||||||
|
146834031AC3E56700842450 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;
|
||||||
|
remoteInfo = React;
|
||||||
|
};
|
||||||
|
78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 134814201AA4EA6300B7C361;
|
||||||
|
remoteInfo = RCTLinking;
|
||||||
|
};
|
||||||
|
832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 58B5119B1A9E6C1200147676;
|
||||||
|
remoteInfo = RCTText;
|
||||||
|
};
|
||||||
|
96EDB0DA1C10F44500D41E94 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 96EDB0CC1C10F44500D41E94 /* TcpSockets.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = 134814201AA4EA6300B7C361;
|
||||||
|
remoteInfo = TcpSockets;
|
||||||
|
};
|
||||||
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
|
/* Begin PBXFileReference section */
|
||||||
|
008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = "<group>"; };
|
||||||
|
00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = "<group>"; };
|
||||||
|
00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = "<group>"; };
|
||||||
|
00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = "<group>"; };
|
||||||
|
00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = "<group>"; };
|
||||||
|
00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = "<group>"; };
|
||||||
|
00E356EE1AD99517003FC87E /* rctsocketsTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = rctsocketsTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
00E356F21AD99517003FC87E /* rctsocketsTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = rctsocketsTests.m; sourceTree = "<group>"; };
|
||||||
|
139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = "<group>"; };
|
||||||
|
139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = "<group>"; };
|
||||||
|
13B07F961A680F5B00A75B9A /* rctsockets.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = rctsockets.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = rctsockets/AppDelegate.h; sourceTree = "<group>"; };
|
||||||
|
13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = rctsockets/AppDelegate.m; sourceTree = "<group>"; };
|
||||||
|
13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = "<group>"; };
|
||||||
|
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = rctsockets/Images.xcassets; sourceTree = "<group>"; };
|
||||||
|
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = rctsockets/Info.plist; sourceTree = "<group>"; };
|
||||||
|
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = rctsockets/main.m; sourceTree = "<group>"; };
|
||||||
|
146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = "<group>"; };
|
||||||
|
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
|
||||||
|
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
|
||||||
|
96EDB0CC1C10F44500D41E94 /* TcpSockets.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = TcpSockets.xcodeproj; path = "../node_modules/react-native-tcp/ios/TcpSockets.xcodeproj"; sourceTree = "<group>"; };
|
||||||
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
00E356EB1AD99517003FC87E /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
|
||||||
|
isa = PBXFrameworksBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
96EDB0DC1C10F45200D41E94 /* libTcpSockets.a in Frameworks */,
|
||||||
|
146834051AC3E58100842450 /* libReact.a in Frameworks */,
|
||||||
|
00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */,
|
||||||
|
00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */,
|
||||||
|
00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */,
|
||||||
|
133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */,
|
||||||
|
00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */,
|
||||||
|
139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */,
|
||||||
|
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */,
|
||||||
|
00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */,
|
||||||
|
139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXGroup section */
|
||||||
|
00C302A81ABCB8CE00DB3ED1 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
00C302B61ABCB90400DB3ED1 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
00C302BC1ABCB91800DB3ED1 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
00C302C01ABCB91800DB3ED1 /* libRCTImage.a */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
00C302D41ABCB9D200DB3ED1 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
00C302E01ABCB9EE00DB3ED1 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
00E356EF1AD99517003FC87E /* rctsocketsTests */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
00E356F21AD99517003FC87E /* rctsocketsTests.m */,
|
||||||
|
00E356F01AD99517003FC87E /* Supporting Files */,
|
||||||
|
);
|
||||||
|
path = rctsocketsTests;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
00E356F01AD99517003FC87E /* Supporting Files */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
00E356F11AD99517003FC87E /* Info.plist */,
|
||||||
|
);
|
||||||
|
name = "Supporting Files";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
139105B71AF99BAD00B5F7CC /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
139105C11AF99BAD00B5F7CC /* libRCTSettings.a */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
139FDEE71B06529A00C62182 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
139FDEF41B06529B00C62182 /* libRCTWebSocket.a */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
13B07FAE1A68108700A75B9A /* rctsockets */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
008F07F21AC5B25A0029DE68 /* main.jsbundle */,
|
||||||
|
13B07FAF1A68108700A75B9A /* AppDelegate.h */,
|
||||||
|
13B07FB01A68108700A75B9A /* AppDelegate.m */,
|
||||||
|
13B07FB51A68108700A75B9A /* Images.xcassets */,
|
||||||
|
13B07FB61A68108700A75B9A /* Info.plist */,
|
||||||
|
13B07FB11A68108700A75B9A /* LaunchScreen.xib */,
|
||||||
|
13B07FB71A68108700A75B9A /* main.m */,
|
||||||
|
);
|
||||||
|
name = rctsockets;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
146834001AC3E56700842450 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
146834041AC3E56700842450 /* libReact.a */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
78C398B11ACF4ADC00677621 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
78C398B91ACF4ADC00677621 /* libRCTLinking.a */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
96EDB0CC1C10F44500D41E94 /* TcpSockets.xcodeproj */,
|
||||||
|
146833FF1AC3E56700842450 /* React.xcodeproj */,
|
||||||
|
00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */,
|
||||||
|
00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */,
|
||||||
|
00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */,
|
||||||
|
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */,
|
||||||
|
00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */,
|
||||||
|
139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */,
|
||||||
|
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */,
|
||||||
|
00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */,
|
||||||
|
139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */,
|
||||||
|
);
|
||||||
|
name = Libraries;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
832341B11AAA6A8300B99B32 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
832341B51AAA6A8300B99B32 /* libRCTText.a */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
83CBB9F61A601CBA00E9B192 = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
13B07FAE1A68108700A75B9A /* rctsockets */,
|
||||||
|
832341AE1AAA6A7D00B99B32 /* Libraries */,
|
||||||
|
00E356EF1AD99517003FC87E /* rctsocketsTests */,
|
||||||
|
83CBBA001A601CBA00E9B192 /* Products */,
|
||||||
|
);
|
||||||
|
indentWidth = 2;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
tabWidth = 2;
|
||||||
|
};
|
||||||
|
83CBBA001A601CBA00E9B192 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
13B07F961A680F5B00A75B9A /* rctsockets.app */,
|
||||||
|
00E356EE1AD99517003FC87E /* rctsocketsTests.xctest */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
96EDB0CD1C10F44500D41E94 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
96EDB0DB1C10F44500D41E94 /* libTcpSockets.a */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXGroup section */
|
||||||
|
|
||||||
|
/* Begin PBXNativeTarget section */
|
||||||
|
00E356ED1AD99517003FC87E /* rctsocketsTests */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "rctsocketsTests" */;
|
||||||
|
buildPhases = (
|
||||||
|
00E356EA1AD99517003FC87E /* Sources */,
|
||||||
|
00E356EB1AD99517003FC87E /* Frameworks */,
|
||||||
|
00E356EC1AD99517003FC87E /* Resources */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
00E356F51AD99517003FC87E /* PBXTargetDependency */,
|
||||||
|
);
|
||||||
|
name = rctsocketsTests;
|
||||||
|
productName = rctsocketsTests;
|
||||||
|
productReference = 00E356EE1AD99517003FC87E /* rctsocketsTests.xctest */;
|
||||||
|
productType = "com.apple.product-type.bundle.unit-test";
|
||||||
|
};
|
||||||
|
13B07F861A680F5B00A75B9A /* rctsockets */ = {
|
||||||
|
isa = PBXNativeTarget;
|
||||||
|
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "rctsockets" */;
|
||||||
|
buildPhases = (
|
||||||
|
13B07F871A680F5B00A75B9A /* Sources */,
|
||||||
|
13B07F8C1A680F5B00A75B9A /* Frameworks */,
|
||||||
|
13B07F8E1A680F5B00A75B9A /* Resources */,
|
||||||
|
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
|
||||||
|
);
|
||||||
|
buildRules = (
|
||||||
|
);
|
||||||
|
dependencies = (
|
||||||
|
);
|
||||||
|
name = rctsockets;
|
||||||
|
productName = "Hello World";
|
||||||
|
productReference = 13B07F961A680F5B00A75B9A /* rctsockets.app */;
|
||||||
|
productType = "com.apple.product-type.application";
|
||||||
|
};
|
||||||
|
/* End PBXNativeTarget section */
|
||||||
|
|
||||||
|
/* Begin PBXProject section */
|
||||||
|
83CBB9F71A601CBA00E9B192 /* Project object */ = {
|
||||||
|
isa = PBXProject;
|
||||||
|
attributes = {
|
||||||
|
LastUpgradeCheck = 0610;
|
||||||
|
ORGANIZATIONNAME = Facebook;
|
||||||
|
TargetAttributes = {
|
||||||
|
00E356ED1AD99517003FC87E = {
|
||||||
|
CreatedOnToolsVersion = 6.2;
|
||||||
|
TestTargetID = 13B07F861A680F5B00A75B9A;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "rctsockets" */;
|
||||||
|
compatibilityVersion = "Xcode 3.2";
|
||||||
|
developmentRegion = English;
|
||||||
|
hasScannedForEncodings = 0;
|
||||||
|
knownRegions = (
|
||||||
|
en,
|
||||||
|
Base,
|
||||||
|
);
|
||||||
|
mainGroup = 83CBB9F61A601CBA00E9B192;
|
||||||
|
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
|
||||||
|
projectDirPath = "";
|
||||||
|
projectReferences = (
|
||||||
|
{
|
||||||
|
ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */;
|
||||||
|
ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */;
|
||||||
|
ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */;
|
||||||
|
ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = 78C398B11ACF4ADC00677621 /* Products */;
|
||||||
|
ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */;
|
||||||
|
ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */;
|
||||||
|
ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = 832341B11AAA6A8300B99B32 /* Products */;
|
||||||
|
ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */;
|
||||||
|
ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = 139FDEE71B06529A00C62182 /* Products */;
|
||||||
|
ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = 146834001AC3E56700842450 /* Products */;
|
||||||
|
ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = 96EDB0CD1C10F44500D41E94 /* Products */;
|
||||||
|
ProjectRef = 96EDB0CC1C10F44500D41E94 /* TcpSockets.xcodeproj */;
|
||||||
|
},
|
||||||
|
);
|
||||||
|
projectRoot = "";
|
||||||
|
targets = (
|
||||||
|
13B07F861A680F5B00A75B9A /* rctsockets */,
|
||||||
|
00E356ED1AD99517003FC87E /* rctsocketsTests */,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
/* End PBXProject section */
|
||||||
|
|
||||||
|
/* Begin PBXReferenceProxy section */
|
||||||
|
00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = archive.ar;
|
||||||
|
path = libRCTActionSheet.a;
|
||||||
|
remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = archive.ar;
|
||||||
|
path = libRCTGeolocation.a;
|
||||||
|
remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = archive.ar;
|
||||||
|
path = libRCTImage.a;
|
||||||
|
remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = archive.ar;
|
||||||
|
path = libRCTNetwork.a;
|
||||||
|
remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = archive.ar;
|
||||||
|
path = libRCTVibration.a;
|
||||||
|
remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = archive.ar;
|
||||||
|
path = libRCTSettings.a;
|
||||||
|
remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = archive.ar;
|
||||||
|
path = libRCTWebSocket.a;
|
||||||
|
remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
146834041AC3E56700842450 /* libReact.a */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = archive.ar;
|
||||||
|
path = libReact.a;
|
||||||
|
remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = archive.ar;
|
||||||
|
path = libRCTLinking.a;
|
||||||
|
remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
832341B51AAA6A8300B99B32 /* libRCTText.a */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = archive.ar;
|
||||||
|
path = libRCTText.a;
|
||||||
|
remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
96EDB0DB1C10F44500D41E94 /* libTcpSockets.a */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = archive.ar;
|
||||||
|
path = libTcpSockets.a;
|
||||||
|
remoteRef = 96EDB0DA1C10F44500D41E94 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
|
/* End PBXReferenceProxy section */
|
||||||
|
|
||||||
|
/* Begin PBXResourcesBuildPhase section */
|
||||||
|
00E356EC1AD99517003FC87E /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
13B07F8E1A680F5B00A75B9A /* Resources */ = {
|
||||||
|
isa = PBXResourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
|
||||||
|
13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
|
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
);
|
||||||
|
name = "Bundle React Native code and images";
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "./react-native-xcode.sh";
|
||||||
|
};
|
||||||
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
|
00E356EA1AD99517003FC87E /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
00E356F31AD99517003FC87E /* rctsocketsTests.m in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
13B07F871A680F5B00A75B9A /* Sources */ = {
|
||||||
|
isa = PBXSourcesBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
|
||||||
|
13B07FC11A68108700A75B9A /* main.m in Sources */,
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
};
|
||||||
|
/* End PBXSourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXTargetDependency section */
|
||||||
|
00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
|
||||||
|
isa = PBXTargetDependency;
|
||||||
|
target = 13B07F861A680F5B00A75B9A /* rctsockets */;
|
||||||
|
targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
|
||||||
|
};
|
||||||
|
/* End PBXTargetDependency section */
|
||||||
|
|
||||||
|
/* Begin PBXVariantGroup section */
|
||||||
|
13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = {
|
||||||
|
isa = PBXVariantGroup;
|
||||||
|
children = (
|
||||||
|
13B07FB21A68108700A75B9A /* Base */,
|
||||||
|
);
|
||||||
|
name = LaunchScreen.xib;
|
||||||
|
path = rctsockets;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
/* End PBXVariantGroup section */
|
||||||
|
|
||||||
|
/* Begin XCBuildConfiguration section */
|
||||||
|
00E356F61AD99517003FC87E /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
|
FRAMEWORK_SEARCH_PATHS = (
|
||||||
|
"$(SDKROOT)/Developer/Library/Frameworks",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
INFOPLIST_FILE = rctsocketsTests/Info.plist;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 8.2;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/rctsockets.app/rctsockets";
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
00E356F71AD99517003FC87E /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
FRAMEWORK_SEARCH_PATHS = (
|
||||||
|
"$(SDKROOT)/Developer/Library/Frameworks",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
INFOPLIST_FILE = rctsocketsTests/Info.plist;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 8.2;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/rctsockets.app/rctsockets";
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
13B07F941A680F5B00A75B9A /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
DEAD_CODE_STRIPPING = NO;
|
||||||
|
HEADER_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
||||||
|
"$(SRCROOT)/../node_modules/react-native/React/**",
|
||||||
|
);
|
||||||
|
INFOPLIST_FILE = rctsockets/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
|
OTHER_LDFLAGS = "-ObjC";
|
||||||
|
PRODUCT_NAME = rctsockets;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
13B07F951A680F5B00A75B9A /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
|
HEADER_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
||||||
|
"$(SRCROOT)/../node_modules/react-native/React/**",
|
||||||
|
);
|
||||||
|
INFOPLIST_FILE = rctsockets/Info.plist;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
|
OTHER_LDFLAGS = "-ObjC";
|
||||||
|
PRODUCT_NAME = rctsockets;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
83CBBA201A601CBA00E9B192 /* Debug */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
|
COPY_PHASE_STRIP = NO;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
|
"DEBUG=1",
|
||||||
|
"$(inherited)",
|
||||||
|
);
|
||||||
|
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
HEADER_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
||||||
|
"$(SRCROOT)/../node_modules/react-native/React/**",
|
||||||
|
);
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = YES;
|
||||||
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
};
|
||||||
|
name = Debug;
|
||||||
|
};
|
||||||
|
83CBBA211A601CBA00E9B192 /* Release */ = {
|
||||||
|
isa = XCBuildConfiguration;
|
||||||
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||||
|
CLANG_CXX_LIBRARY = "libc++";
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
CLANG_ENABLE_OBJC_ARC = YES;
|
||||||
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
|
COPY_PHASE_STRIP = YES;
|
||||||
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||||
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
HEADER_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
|
||||||
|
"$(SRCROOT)/../node_modules/react-native/React/**",
|
||||||
|
);
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 7.0;
|
||||||
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
|
SDKROOT = iphoneos;
|
||||||
|
VALIDATE_PRODUCT = YES;
|
||||||
|
};
|
||||||
|
name = Release;
|
||||||
|
};
|
||||||
|
/* End XCBuildConfiguration section */
|
||||||
|
|
||||||
|
/* Begin XCConfigurationList section */
|
||||||
|
00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "rctsocketsTests" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
00E356F61AD99517003FC87E /* Debug */,
|
||||||
|
00E356F71AD99517003FC87E /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "rctsockets" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
13B07F941A680F5B00A75B9A /* Debug */,
|
||||||
|
13B07F951A680F5B00A75B9A /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "rctsockets" */ = {
|
||||||
|
isa = XCConfigurationList;
|
||||||
|
buildConfigurations = (
|
||||||
|
83CBBA201A601CBA00E9B192 /* Debug */,
|
||||||
|
83CBBA211A601CBA00E9B192 /* Release */,
|
||||||
|
);
|
||||||
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
|
};
|
||||||
|
/* End XCConfigurationList section */
|
||||||
|
};
|
||||||
|
rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
|
||||||
|
}
|
@ -0,0 +1,112 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "0620"
|
||||||
|
version = "1.3">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
|
||||||
|
BuildableName = "rctsockets.app"
|
||||||
|
BlueprintName = "rctsockets"
|
||||||
|
ReferencedContainer = "container:rctsockets.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "NO"
|
||||||
|
buildForArchiving = "NO"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "00E356ED1AD99517003FC87E"
|
||||||
|
BuildableName = "rctsocketsTests.xctest"
|
||||||
|
BlueprintName = "rctsocketsTests"
|
||||||
|
ReferencedContainer = "container:rctsockets.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "00E356ED1AD99517003FC87E"
|
||||||
|
BuildableName = "rctsocketsTests.xctest"
|
||||||
|
BlueprintName = "rctsocketsTests"
|
||||||
|
ReferencedContainer = "container:rctsockets.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
</Testables>
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
|
||||||
|
BuildableName = "rctsockets.app"
|
||||||
|
BlueprintName = "rctsockets"
|
||||||
|
ReferencedContainer = "container:rctsockets.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
|
||||||
|
BuildableName = "rctsockets.app"
|
||||||
|
BlueprintName = "rctsockets"
|
||||||
|
ReferencedContainer = "container:rctsockets.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
<AdditionalOptions>
|
||||||
|
</AdditionalOptions>
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
|
||||||
|
BuildableName = "rctsockets.app"
|
||||||
|
BlueprintName = "rctsockets"
|
||||||
|
ReferencedContainer = "container:rctsockets.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
16
examples/rctsockets/ios/rctsockets/AppDelegate.h
Normal file
16
examples/rctsockets/ios/rctsockets/AppDelegate.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2015-present, Facebook, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the BSD-style license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
@interface AppDelegate : UIResponder <UIApplicationDelegate>
|
||||||
|
|
||||||
|
@property (nonatomic, strong) UIWindow *window;
|
||||||
|
|
||||||
|
@end
|
57
examples/rctsockets/ios/rctsockets/AppDelegate.m
Normal file
57
examples/rctsockets/ios/rctsockets/AppDelegate.m
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2015-present, Facebook, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the BSD-style license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import "AppDelegate.h"
|
||||||
|
|
||||||
|
#import "RCTRootView.h"
|
||||||
|
|
||||||
|
@implementation AppDelegate
|
||||||
|
|
||||||
|
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
|
||||||
|
{
|
||||||
|
NSURL *jsCodeLocation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loading JavaScript code - uncomment the one you want.
|
||||||
|
*
|
||||||
|
* OPTION 1
|
||||||
|
* Load from development server. Start the server from the repository root:
|
||||||
|
*
|
||||||
|
* $ npm start
|
||||||
|
*
|
||||||
|
* To run on device, change `localhost` to the IP address of your computer
|
||||||
|
* (you can get this by typing `ifconfig` into the terminal and selecting the
|
||||||
|
* `inet` value under `en0:`) and make sure your computer and iOS device are
|
||||||
|
* on the same Wi-Fi network.
|
||||||
|
*/
|
||||||
|
|
||||||
|
jsCodeLocation = [NSURL URLWithString:@"http://localhost:8081/index.bundle?platform=ios&dev=true"];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* OPTION 2
|
||||||
|
* Load from pre-bundled file on disk. The static bundle is automatically
|
||||||
|
* generated by "Bundle React Native code and images" build step.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
|
||||||
|
|
||||||
|
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
|
||||||
|
moduleName:@"rctsockets"
|
||||||
|
initialProperties:nil
|
||||||
|
launchOptions:launchOptions];
|
||||||
|
|
||||||
|
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
|
||||||
|
UIViewController *rootViewController = [[UIViewController alloc] init];
|
||||||
|
rootViewController.view = rootView;
|
||||||
|
self.window.rootViewController = rootViewController;
|
||||||
|
[self.window makeKeyAndVisible];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
@ -0,0 +1,42 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7702" systemVersion="14D136" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="iOS"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7701"/>
|
||||||
|
<capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
|
||||||
|
</dependencies>
|
||||||
|
<objects>
|
||||||
|
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
|
||||||
|
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
|
||||||
|
<view contentMode="scaleToFill" id="iN0-l3-epB">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="480" height="480"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Powered by React Native" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" minimumFontSize="9" translatesAutoresizingMaskIntoConstraints="NO" id="8ie-xW-0ye">
|
||||||
|
<rect key="frame" x="20" y="439" width="441" height="21"/>
|
||||||
|
<fontDescription key="fontDescription" type="system" pointSize="17"/>
|
||||||
|
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="rctsockets" textAlignment="center" lineBreakMode="middleTruncation" baselineAdjustment="alignBaselines" minimumFontSize="18" translatesAutoresizingMaskIntoConstraints="NO" id="kId-c2-rCX">
|
||||||
|
<rect key="frame" x="20" y="140" width="441" height="43"/>
|
||||||
|
<fontDescription key="fontDescription" type="boldSystem" pointSize="36"/>
|
||||||
|
<color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
|
||||||
|
<nil key="highlightedColor"/>
|
||||||
|
</label>
|
||||||
|
</subviews>
|
||||||
|
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="kId-c2-rCX" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="bottom" multiplier="1/3" constant="1" id="5cJ-9S-tgC"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="kId-c2-rCX" secondAttribute="centerX" id="Koa-jz-hwk"/>
|
||||||
|
<constraint firstAttribute="bottom" secondItem="8ie-xW-0ye" secondAttribute="bottom" constant="20" id="Kzo-t9-V3l"/>
|
||||||
|
<constraint firstItem="8ie-xW-0ye" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="MfP-vx-nX0"/>
|
||||||
|
<constraint firstAttribute="centerX" secondItem="8ie-xW-0ye" secondAttribute="centerX" id="ZEH-qu-HZ9"/>
|
||||||
|
<constraint firstItem="kId-c2-rCX" firstAttribute="leading" secondItem="iN0-l3-epB" secondAttribute="leading" constant="20" symbolic="YES" id="fvb-Df-36g"/>
|
||||||
|
</constraints>
|
||||||
|
<nil key="simulatedStatusBarMetrics"/>
|
||||||
|
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
|
||||||
|
<point key="canvasLocation" x="548" y="455"/>
|
||||||
|
</view>
|
||||||
|
</objects>
|
||||||
|
</document>
|
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"size" : "29x29",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"size" : "29x29",
|
||||||
|
"scale" : "3x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"size" : "40x40",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"size" : "40x40",
|
||||||
|
"scale" : "3x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"size" : "60x60",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"size" : "60x60",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"version" : 1,
|
||||||
|
"author" : "xcode"
|
||||||
|
}
|
||||||
|
}
|
48
examples/rctsockets/ios/rctsockets/Info.plist
Normal file
48
examples/rctsockets/ios/rctsockets/Info.plist
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>en</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>$(PRODUCT_NAME)</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>APPL</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>1</string>
|
||||||
|
<key>LSRequiresIPhoneOS</key>
|
||||||
|
<true/>
|
||||||
|
<key>UILaunchStoryboardName</key>
|
||||||
|
<string>LaunchScreen</string>
|
||||||
|
<key>UIRequiredDeviceCapabilities</key>
|
||||||
|
<array>
|
||||||
|
<string>armv7</string>
|
||||||
|
</array>
|
||||||
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
|
<array>
|
||||||
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
</array>
|
||||||
|
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||||
|
<false/>
|
||||||
|
<key>NSLocationWhenInUseUsageDescription</key>
|
||||||
|
<string></string>
|
||||||
|
<key>NSAppTransportSecurity</key>
|
||||||
|
<dict>
|
||||||
|
<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/-->
|
||||||
|
<key>NSAllowsArbitraryLoads</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
18
examples/rctsockets/ios/rctsockets/main.m
Normal file
18
examples/rctsockets/ios/rctsockets/main.m
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2015-present, Facebook, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the BSD-style license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
#import "AppDelegate.h"
|
||||||
|
|
||||||
|
int main(int argc, char * argv[]) {
|
||||||
|
@autoreleasepool {
|
||||||
|
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
|
||||||
|
}
|
||||||
|
}
|
24
examples/rctsockets/ios/rctsocketsTests/Info.plist
Normal file
24
examples/rctsockets/ios/rctsocketsTests/Info.plist
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>en</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>$(PRODUCT_NAME)</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>BNDL</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>1</string>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
70
examples/rctsockets/ios/rctsocketsTests/rctsocketsTests.m
Normal file
70
examples/rctsockets/ios/rctsocketsTests/rctsocketsTests.m
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/**
|
||||||
|
* Copyright (c) 2015-present, Facebook, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the BSD-style license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
#import <XCTest/XCTest.h>
|
||||||
|
|
||||||
|
#import "RCTLog.h"
|
||||||
|
#import "RCTRootView.h"
|
||||||
|
|
||||||
|
#define TIMEOUT_SECONDS 240
|
||||||
|
#define TEXT_TO_LOOK_FOR @"Welcome to React Native!"
|
||||||
|
|
||||||
|
@interface rctsocketsTests : XCTestCase
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation rctsocketsTests
|
||||||
|
|
||||||
|
- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test
|
||||||
|
{
|
||||||
|
if (test(view)) {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
for (UIView *subview in [view subviews]) {
|
||||||
|
if ([self findSubviewInView:subview matching:test]) {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)testRendersWelcomeScreen
|
||||||
|
{
|
||||||
|
UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
|
||||||
|
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS];
|
||||||
|
BOOL foundElement = NO;
|
||||||
|
|
||||||
|
__block NSString *redboxError = nil;
|
||||||
|
RCTSetLogFunction(^(RCTLogLevel level, NSString *fileName, NSNumber *lineNumber, NSString *message) {
|
||||||
|
if (level >= RCTLogLevelError) {
|
||||||
|
redboxError = message;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) {
|
||||||
|
[[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
|
||||||
|
[[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
|
||||||
|
|
||||||
|
foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) {
|
||||||
|
if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
return NO;
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
RCTSetLogFunction(RCTDefaultLogFunction);
|
||||||
|
|
||||||
|
XCTAssertNil(redboxError, @"RedBox error: %@", redboxError);
|
||||||
|
XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
50
examples/rctsockets/ios/react-native-xcode.sh
Executable file
50
examples/rctsockets/ios/react-native-xcode.sh
Executable file
@ -0,0 +1,50 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Copyright (c) 2015-present, Facebook, Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This source code is licensed under the BSD-style license found in the
|
||||||
|
# LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
# of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
|
||||||
|
# Bundle React Native app's code and image assets.
|
||||||
|
# This script is supposed to be invoked as part of Xcode build process
|
||||||
|
# and relies on envoronment variables (including PWD) set by Xcode
|
||||||
|
|
||||||
|
case "$CONFIGURATION" in
|
||||||
|
Debug)
|
||||||
|
DEV=true
|
||||||
|
;;
|
||||||
|
Release)
|
||||||
|
DEV=false
|
||||||
|
;;
|
||||||
|
"")
|
||||||
|
echo "$0 must be invoked by Xcode"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unsupported value of \$CONFIGURATION=$CONFIGURATION"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Xcode project file for React Native apps is located in ios/ subfolder
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
set -x
|
||||||
|
DEST=$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH
|
||||||
|
|
||||||
|
# Define NVM_DIR and source the nvm.sh setup script
|
||||||
|
[ -z "$NVM_DIR" ] && export NVM_DIR="$HOME/.nvm"
|
||||||
|
|
||||||
|
if [[ -s "$HOME/.nvm/nvm.sh" ]]; then
|
||||||
|
. "$HOME/.nvm/nvm.sh"
|
||||||
|
elif [[ -x "$(command -v brew)" && -s "$(brew --prefix nvm)/nvm.sh" ]]; then
|
||||||
|
. "$(brew --prefix nvm)/nvm.sh"
|
||||||
|
fi
|
||||||
|
|
||||||
|
react-native bundle \
|
||||||
|
--entry-file index.js \
|
||||||
|
--platform ios \
|
||||||
|
--dev $DEV \
|
||||||
|
--bundle-output "$DEST/main.jsbundle" \
|
||||||
|
--assets-dest "$DEST"
|
18
examples/rctsockets/package.json
Normal file
18
examples/rctsockets/package.json
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"name": "rctsockets",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"start": "react-native start"
|
||||||
|
},
|
||||||
|
"browser": {
|
||||||
|
"net": "react-native-tcp"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"buffer": "^3.5.3",
|
||||||
|
"events": "^1.1.0",
|
||||||
|
"react-native": "^0.15.0",
|
||||||
|
"react-native-tcp": "../../",
|
||||||
|
"util": "^0.10.3"
|
||||||
|
}
|
||||||
|
}
|
292
examples/rctsockets/telnet-client.js
Normal file
292
examples/rctsockets/telnet-client.js
Normal file
@ -0,0 +1,292 @@
|
|||||||
|
// https://www.npmjs.com/package/another-telnet-client
|
||||||
|
(function () {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var util = require('util');
|
||||||
|
var events = require('events');
|
||||||
|
var net = require('net');
|
||||||
|
|
||||||
|
|
||||||
|
// define a constructor (object) and inherit EventEmitter functions
|
||||||
|
function Telnet() {
|
||||||
|
events.EventEmitter.call(this);
|
||||||
|
if (false === (this instanceof Telnet)) {
|
||||||
|
return new Telnet();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
util.inherits(Telnet, events.EventEmitter);
|
||||||
|
|
||||||
|
Telnet.prototype.connect = function (opts) {
|
||||||
|
var self = this;
|
||||||
|
var host = (typeof opts.host !== 'undefined' ? opts.host : '127.0.0.1');
|
||||||
|
var port = (typeof opts.port !== 'undefined' ? opts.port : 23);
|
||||||
|
this.timeout = (typeof opts.timeout !== 'undefined' ? opts.timeout : 500);
|
||||||
|
this.shellPrompt = (typeof opts.shellPrompt !== 'undefined' ? opts.shellPrompt : /(?:\/ )?#\s/);
|
||||||
|
this.loginPrompt = (typeof opts.loginPrompt !== 'undefined' ? opts.loginPrompt : /login[: ]*$/i);
|
||||||
|
this.passwordPrompt = (typeof opts.passwordPrompt !== 'undefined' ? opts.passwordPrompt : /Password: /i);
|
||||||
|
this.username = (typeof opts.username !== 'undefined' ? opts.username : 'root');
|
||||||
|
this.password = (typeof opts.password !== 'undefined' ? opts.password : 'guest');
|
||||||
|
this.enable = (typeof opts.enable !== 'undefined' ? opts.enable : false);
|
||||||
|
this.enablePrompt = (typeof opts.enablePrompt !== 'undefined' ? opts.enablePrompt : /Password: /i);
|
||||||
|
this.enablePassword = (typeof opts.enablePassword !== 'undefined' ? opts.enablePassword : 'enablepass');
|
||||||
|
this.irs = (typeof opts.irs !== 'undefined' ? opts.irs : '\r\n');
|
||||||
|
this.ors = (typeof opts.ors !== 'undefined' ? opts.ors : '\n');
|
||||||
|
this.echoLines = (typeof opts.echoLines !== 'undefined' ? opts.echoLines : 1);
|
||||||
|
this.pageSeparator = (typeof opts.pageSeparator !== 'undefined' ? opts.pageSeparator : '---- More');
|
||||||
|
this.ignoreOutput = (typeof opts.ignoreOutput !== 'undefined' ? opts.ignoreOutput : false);
|
||||||
|
this.ignoreOutputTimeout = (typeof opts.ignoreOutputTimeout !== 'undefined' ? opts.ignoreOutputTimeout : 1000);
|
||||||
|
this.response = '';
|
||||||
|
this.telnetState = null;
|
||||||
|
|
||||||
|
this.telnetSocket = net.createConnection({
|
||||||
|
port: port,
|
||||||
|
host: host
|
||||||
|
}, function () {
|
||||||
|
self.telnetState = 'start';
|
||||||
|
self.stringData = '';
|
||||||
|
self.emit('connect');
|
||||||
|
});
|
||||||
|
|
||||||
|
this.telnetSocket.setTimeout(this.timeout, function () {
|
||||||
|
if (self.telnetSocket._connecting === true) {
|
||||||
|
// info: cannot connect; emit error and destroy
|
||||||
|
self.emit('error', 'Cannot connect');
|
||||||
|
|
||||||
|
self.telnetSocket.destroy();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
self.emit('timeout');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.telnetSocket.on('data', function (data) {
|
||||||
|
parseData(data, self);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.telnetSocket.on('error', function (error) {
|
||||||
|
self.emit('error', error);
|
||||||
|
});
|
||||||
|
|
||||||
|
this.telnetSocket.on('end', function () {
|
||||||
|
self.emit('end');
|
||||||
|
});
|
||||||
|
|
||||||
|
this.telnetSocket.on('close', function () {
|
||||||
|
self.emit('close');
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
Telnet.prototype.exec = function (cmd, opts, callback) {
|
||||||
|
var self = this;
|
||||||
|
cmd += this.ors;
|
||||||
|
|
||||||
|
if (opts && opts instanceof Function) {
|
||||||
|
callback = opts;
|
||||||
|
}
|
||||||
|
else if (opts && opts instanceof Object) {
|
||||||
|
self.shellPrompt = opts.shellPrompt || self.shellPrompt;
|
||||||
|
self.loginPrompt = opts.loginPrompt || self.loginPrompt;
|
||||||
|
self.timeout = opts.timeout || self.timeout;
|
||||||
|
self.irs = opts.irs || self.irs;
|
||||||
|
self.ors = opts.ors || self.ors;
|
||||||
|
self.echoLines = opts.echoLines || self.echoLines;
|
||||||
|
self.ignoreOutput = opts.ignoreOutput || self.ignoreOutput;
|
||||||
|
self.ignoreOutputTimeout = opts.ignoreOutputTimeout || self.ignoreOutputTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.telnetSocket.writable) {
|
||||||
|
this.telnetSocket.write(cmd, function () {
|
||||||
|
self.telnetState = 'response';
|
||||||
|
self.emit('writedone');
|
||||||
|
|
||||||
|
if (self.ignoreOutput === true) {
|
||||||
|
setTimeout(function () {
|
||||||
|
self.ignoreOutput = false;
|
||||||
|
callback(null);
|
||||||
|
}, self.ignoreOutputTimeout);
|
||||||
|
} else {
|
||||||
|
self.once('responseready', function () {
|
||||||
|
if (callback && self.cmdOutput !== undefined) {
|
||||||
|
callback(self.cmdOutput.join('\n'));
|
||||||
|
}
|
||||||
|
else if (callback && self.cmdOutput === undefined) {
|
||||||
|
callback(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset stored response
|
||||||
|
self.stringData = '';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
callback(new Error("Socket not writable"));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Telnet.prototype.end = function () {
|
||||||
|
this.telnetSocket.end();
|
||||||
|
};
|
||||||
|
|
||||||
|
Telnet.prototype.destroy = function () {
|
||||||
|
this.telnetSocket.destroy();
|
||||||
|
};
|
||||||
|
|
||||||
|
function parseData(chunk, telnetObj) {
|
||||||
|
var promptIndex = '';
|
||||||
|
var tempStringData = '';
|
||||||
|
|
||||||
|
if (chunk[0] === 255 && chunk[1] !== 255) {
|
||||||
|
telnetObj.stringData = '';
|
||||||
|
var negReturn = negotiate(telnetObj, chunk);
|
||||||
|
|
||||||
|
if (negReturn === undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
chunk = negReturn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (telnetObj.ignoreOutput === true) {
|
||||||
|
telnetObj.stringData = '';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (telnetObj.telnetState === 'start') {
|
||||||
|
telnetObj.telnetState = 'getprompt';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (telnetObj.telnetState === 'getprompt') {
|
||||||
|
tempStringData = chunk.toString();
|
||||||
|
promptIndex = tempStringData.search(telnetObj.shellPrompt);
|
||||||
|
|
||||||
|
if (promptIndex !== -1) {
|
||||||
|
telnetObj.shellPrompt = tempStringData.substring(promptIndex);
|
||||||
|
telnetObj.telnetState = 'sendcmd';
|
||||||
|
telnetObj.stringData = '';
|
||||||
|
telnetObj.emit('ready', telnetObj.shellPrompt);
|
||||||
|
}
|
||||||
|
else if (tempStringData.search(telnetObj.loginPrompt) !== -1) {
|
||||||
|
telnetObj.telnetState = 'login';
|
||||||
|
login(telnetObj, 'username');
|
||||||
|
}
|
||||||
|
else if (tempStringData.search(telnetObj.passwordPrompt) !== -1) {
|
||||||
|
telnetObj.telnetState = 'login';
|
||||||
|
login(telnetObj, 'password');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (telnetObj.telnetState === 'enable') {
|
||||||
|
tempStringData = chunk.toString();
|
||||||
|
|
||||||
|
if (tempStringData.search(telnetObj.enablePrompt) !== -1) {
|
||||||
|
telnetObj.telnetState = 'login';
|
||||||
|
login(telnetObj, 'enablePassword');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (telnetObj.telnetState === 'getenprompt') {
|
||||||
|
tempStringData = chunk.toString();
|
||||||
|
|
||||||
|
if (tempStringData.search(telnetObj.shellPrompt) !== -1) {
|
||||||
|
telnetObj.telnetState = 'login';
|
||||||
|
login(telnetObj, 'enable');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (telnetObj.telnetState === 'response') {
|
||||||
|
tempStringData = chunk.toString();
|
||||||
|
telnetObj.stringData += tempStringData;
|
||||||
|
promptIndex = tempStringData.search(telnetObj.shellPrompt);
|
||||||
|
|
||||||
|
if (promptIndex === -1 && tempStringData.length !== 0) {
|
||||||
|
if (tempStringData.search(telnetObj.pageSeparator) !== -1) {
|
||||||
|
telnetObj.telnetSocket.write(Buffer('20', 'hex'));
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
telnetObj.cmdOutput = telnetObj.stringData.split(telnetObj.irs);
|
||||||
|
|
||||||
|
for (var i = 0; i < telnetObj.cmdOutput.length; i++) {
|
||||||
|
if (telnetObj.cmdOutput[i].search(telnetObj.pageSeparator) !== -1) {
|
||||||
|
telnetObj.cmdOutput.splice(i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (telnetObj.echoLines === 1) {
|
||||||
|
telnetObj.cmdOutput.shift();
|
||||||
|
}
|
||||||
|
else if (telnetObj.echoLines > 1) {
|
||||||
|
telnetObj.cmdOutput.splice(0, telnetObj.echoLines);
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove prompt
|
||||||
|
telnetObj.cmdOutput.pop();
|
||||||
|
|
||||||
|
telnetObj.emit('responseready');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function login(telnetObj, handle) {
|
||||||
|
if (handle === 'username') {
|
||||||
|
if (telnetObj.telnetSocket.writable) {
|
||||||
|
telnetObj.telnetSocket.write(telnetObj.username + telnetObj.ors, function () {
|
||||||
|
telnetObj.telnetState = 'getprompt';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (handle === 'password') {
|
||||||
|
if (telnetObj.telnetSocket.writable) {
|
||||||
|
telnetObj.telnetSocket.write(telnetObj.password + telnetObj.ors, function () {
|
||||||
|
if (telnetObj.enable) {
|
||||||
|
telnetObj.telnetState = 'getenprompt';
|
||||||
|
} else {
|
||||||
|
telnetObj.telnetState = 'getprompt';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (handle === 'enable') {
|
||||||
|
if (telnetObj.telnetSocket.writable) {
|
||||||
|
telnetObj.telnetSocket.write("en" + telnetObj.ors, function () {
|
||||||
|
telnetObj.telnetState = 'enable';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (handle === 'enablePassword') {
|
||||||
|
if (telnetObj.telnetSocket.writable) {
|
||||||
|
telnetObj.telnetSocket.write(telnetObj.enablePassword + telnetObj.ors, function () {
|
||||||
|
telnetObj.telnetState = 'getprompt';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function negotiate(telnetObj, chunk) {
|
||||||
|
// info: http://tools.ietf.org/html/rfc1143#section-7
|
||||||
|
// refuse to start performing and ack the start of performance
|
||||||
|
// DO -> WONT; WILL -> DO
|
||||||
|
var packetLength = chunk.length, negData = chunk, cmdData, negResp;
|
||||||
|
|
||||||
|
for (var i = 0; i < packetLength; i += 3) {
|
||||||
|
if (chunk[i] !== 255) {
|
||||||
|
negData = chunk.slice(0, i);
|
||||||
|
cmdData = chunk.slice(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
negResp = negData.toString('hex').replace(/fd/g, 'fc').replace(/fb/g, 'fd');
|
||||||
|
|
||||||
|
if (telnetObj.telnetSocket.writable) {
|
||||||
|
telnetObj.telnetSocket.write(Buffer(negResp, 'hex'));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmdData !== undefined) {
|
||||||
|
return cmdData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = Telnet;
|
||||||
|
}());
|
1197
ios/CocoaAsyncSocket/GCDAsyncSocket.h
Normal file
1197
ios/CocoaAsyncSocket/GCDAsyncSocket.h
Normal file
File diff suppressed because it is too large
Load Diff
8239
ios/CocoaAsyncSocket/GCDAsyncSocket.m
Normal file
8239
ios/CocoaAsyncSocket/GCDAsyncSocket.m
Normal file
File diff suppressed because it is too large
Load Diff
79
ios/TcpSocketClient.h
Normal file
79
ios/TcpSocketClient.h
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
//
|
||||||
|
// TcpSocketClient.h
|
||||||
|
// react-native-tcp
|
||||||
|
//
|
||||||
|
// Created by Andy Prock on 12/14/15.
|
||||||
|
// Copyright (c) 2015 Peel, Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import "RCTBridgeModule.h"
|
||||||
|
|
||||||
|
extern NSString *const RCTUDPErrorDomain;
|
||||||
|
|
||||||
|
enum RCTUDPError
|
||||||
|
{
|
||||||
|
RCTUDPNoError = 0, // Never used
|
||||||
|
RCTUDPInvalidInvocationError,// Invalid method invocation
|
||||||
|
RCTUDPBadConfigError, // Invalid configuration
|
||||||
|
RCTUDPBadParamError, // Invalid parameter was passed
|
||||||
|
RCTUDPSendTimeoutError, // A send operation timed out
|
||||||
|
RCTUDPSendFailedError, // A send operation failed
|
||||||
|
RCTUDPClosedError, // The socket was closed
|
||||||
|
RCTUDPOtherError, // Description provided in userInfo
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum RCTUDPError RCTUDPError;
|
||||||
|
|
||||||
|
@class TcpSocketClient;
|
||||||
|
|
||||||
|
@protocol SocketClientDelegate <NSObject>
|
||||||
|
|
||||||
|
- (void)onData:(TcpSocketClient*) client data:(NSData *)data;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@interface TcpSocketClient : NSObject
|
||||||
|
|
||||||
|
@property (nonatomic, retain) NSString* id;
|
||||||
|
@property (nonatomic, retain) NSString* host;
|
||||||
|
@property (nonatomic) u_int16_t port;
|
||||||
|
|
||||||
|
///---------------------------------------------------------------------------------------
|
||||||
|
/// @name Class Methods
|
||||||
|
///---------------------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* Initializes a new RCTUDPClient
|
||||||
|
*
|
||||||
|
* @param delegate The object holding the callbacks, usually 'self'.
|
||||||
|
*
|
||||||
|
* @return New RCTUDPClient
|
||||||
|
*/
|
||||||
|
|
||||||
|
+ (id)socketClientWithConfig:(id<SocketClientDelegate>) delegate;
|
||||||
|
|
||||||
|
///---------------------------------------------------------------------------------------
|
||||||
|
/// @name Instance Methods
|
||||||
|
///---------------------------------------------------------------------------------------
|
||||||
|
/**
|
||||||
|
* Binds to a host and port
|
||||||
|
*
|
||||||
|
* @param port
|
||||||
|
* @param host ip address
|
||||||
|
* @return true if bound, false if there was an error
|
||||||
|
*/
|
||||||
|
- (BOOL)connect:(u_int16_t) port host:(NSString*) host error:(NSError**)error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* write data
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
- (void)writeData:(NSData*) data callback:(RCTResponseSenderBlock) callback;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* close client
|
||||||
|
*/
|
||||||
|
- (void)close;
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
143
ios/TcpSocketClient.m
Normal file
143
ios/TcpSocketClient.m
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
//
|
||||||
|
// TcpSocketClient.m
|
||||||
|
// react-native-tcp
|
||||||
|
//
|
||||||
|
// Created by Andy Prock on 12/14/15.
|
||||||
|
// Copyright (c) 2015 peel, Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <netinet/in.h>
|
||||||
|
#import <arpa/inet.h>
|
||||||
|
#import "TcpSocketClient.h"
|
||||||
|
#import "RCTBridgeModule.h"
|
||||||
|
#import "GCDAsyncSocket.h"
|
||||||
|
|
||||||
|
NSString *const RCTUDPErrorDomain = @"RCTUDPErrorDomain";
|
||||||
|
|
||||||
|
@interface TcpSocketClient()
|
||||||
|
{
|
||||||
|
@private
|
||||||
|
uint16_t _port;
|
||||||
|
NSString* _address;
|
||||||
|
GCDAsyncSocket *_tcpSocket;
|
||||||
|
id<SocketClientDelegate> _clientDelegate;
|
||||||
|
NSMutableDictionary* _pendingSends;
|
||||||
|
long tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)initWithConfig:(id<SocketClientDelegate>) aDelegate;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation TcpSocketClient
|
||||||
|
|
||||||
|
+ (id)socketClientWithConfig:(id<SocketClientDelegate>)delegate
|
||||||
|
{
|
||||||
|
return [[[self class] alloc] initWithConfig:delegate];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)initWithConfig:(id<SocketClientDelegate>) aDelegate
|
||||||
|
{
|
||||||
|
self = [super init];
|
||||||
|
if (self) {
|
||||||
|
_clientDelegate = aDelegate;
|
||||||
|
_pendingSends = [NSMutableDictionary dictionary];
|
||||||
|
}
|
||||||
|
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL) connect:(u_int16_t)port host:(NSString *)host error:(NSError **) error
|
||||||
|
{
|
||||||
|
|
||||||
|
if (_port) {
|
||||||
|
if (error) {
|
||||||
|
*error = [self badInvocationError:@"this client's socket is already connected"];
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_port = port;
|
||||||
|
_address = host;
|
||||||
|
|
||||||
|
_tcpSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:[self methodQueue]];
|
||||||
|
BOOL result;
|
||||||
|
if (host) {
|
||||||
|
result = [_tcpSocket connectToHost:host onPort:port error:error];
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)msgTag
|
||||||
|
{
|
||||||
|
NSNumber* tagNum = [NSNumber numberWithLong:msgTag];
|
||||||
|
RCTResponseSenderBlock callback = [_pendingSends objectForKey:tagNum];
|
||||||
|
if (callback) {
|
||||||
|
callback(@[]);
|
||||||
|
[_pendingSends removeObjectForKey:tagNum];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) writeData:(NSData *)data
|
||||||
|
callback:(RCTResponseSenderBlock)callback
|
||||||
|
{
|
||||||
|
[_tcpSocket writeData:data withTimeout:-1 tag:tag];
|
||||||
|
if (callback) {
|
||||||
|
[_pendingSends setObject:callback forKey:[NSNumber numberWithLong:tag]];
|
||||||
|
}
|
||||||
|
|
||||||
|
tag++;
|
||||||
|
[_tcpSocket readDataWithTimeout:-1 tag:-1];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) close
|
||||||
|
{
|
||||||
|
[_tcpSocket disconnectAfterReadingAndWriting];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
|
||||||
|
if (!_clientDelegate) return;
|
||||||
|
[_clientDelegate onData:self data:data];
|
||||||
|
[sock readDataWithTimeout:-1 tag:-1];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port
|
||||||
|
{
|
||||||
|
[sock readDataWithTimeout:-1 tag:-1];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSError *)badParamError:(NSString *)errMsg
|
||||||
|
{
|
||||||
|
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey];
|
||||||
|
|
||||||
|
return [NSError errorWithDomain:RCTUDPErrorDomain
|
||||||
|
code:RCTUDPBadParamError
|
||||||
|
userInfo:userInfo];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSError *)badInvocationError:(NSString *)errMsg
|
||||||
|
{
|
||||||
|
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey];
|
||||||
|
|
||||||
|
return [NSError errorWithDomain:RCTUDPErrorDomain
|
||||||
|
code:RCTUDPInvalidInvocationError
|
||||||
|
userInfo:userInfo];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSError *)sendFailedError:(NSString *)errMsg
|
||||||
|
{
|
||||||
|
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:errMsg forKey:NSLocalizedDescriptionKey];
|
||||||
|
|
||||||
|
return [NSError errorWithDomain:RCTUDPErrorDomain
|
||||||
|
code:RCTUDPSendFailedError
|
||||||
|
userInfo:userInfo];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (dispatch_queue_t)methodQueue
|
||||||
|
{
|
||||||
|
return dispatch_get_main_queue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
21
ios/TcpSockets.h
Normal file
21
ios/TcpSockets.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// TcpSockets.h
|
||||||
|
// react-native-tcp
|
||||||
|
//
|
||||||
|
// Created by Andy Prock on 12/14/15.
|
||||||
|
// Copyright (c) 2015 Peel, Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
#import <Availability.h>
|
||||||
|
#import "GCDAsyncSocket.h"
|
||||||
|
#import "TcpSocketClient.h"
|
||||||
|
#import "RCTBridgeModule.h"
|
||||||
|
#import "RCTBridge.h"
|
||||||
|
#import "RCTEventDispatcher.h"
|
||||||
|
|
||||||
|
@interface TcpSockets : NSObject<SocketClientDelegate, RCTBridgeModule>
|
||||||
|
|
||||||
|
+(NSMutableDictionary *)clients;
|
||||||
|
|
||||||
|
@end
|
151
ios/TcpSockets.m
Normal file
151
ios/TcpSockets.m
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
//
|
||||||
|
// TcpSockets.m
|
||||||
|
// react-native-tcp
|
||||||
|
//
|
||||||
|
// Created by Andy Prock on 12/14/15.
|
||||||
|
// Copyright (c) 2015 Peel, Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "RCTAssert.h"
|
||||||
|
#import "RCTBridge.h"
|
||||||
|
#import "RCTConvert.h"
|
||||||
|
#import "RCTEventDispatcher.h"
|
||||||
|
#import "RCTLog.h"
|
||||||
|
#import "TcpSockets.h"
|
||||||
|
#import "TcpSocketClient.h"
|
||||||
|
|
||||||
|
@implementation TcpSockets
|
||||||
|
|
||||||
|
RCT_EXPORT_MODULE()
|
||||||
|
|
||||||
|
@synthesize bridge = _bridge;
|
||||||
|
|
||||||
|
+ (void) initialize {
|
||||||
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||||
|
selector:@selector(closeAllSockets)
|
||||||
|
name:RCTReloadNotification
|
||||||
|
object:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
+(NSMutableDictionary*) clients
|
||||||
|
{
|
||||||
|
static NSMutableDictionary* c = nil;
|
||||||
|
|
||||||
|
static dispatch_once_t oncePredicate;
|
||||||
|
|
||||||
|
dispatch_once(&oncePredicate, ^{
|
||||||
|
c = [[NSMutableDictionary alloc] init];
|
||||||
|
});
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
RCT_EXPORT_METHOD(createSocket:(nonnull NSNumber*)cId withOptions:(NSDictionary*)options)
|
||||||
|
{
|
||||||
|
NSMutableDictionary* _clients = [TcpSockets clients];
|
||||||
|
if (!cId) {
|
||||||
|
RCTLogError(@"%@.createSocket called with nil id parameter.", [self class]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
TcpSocketClient *client = [_clients objectForKey:cId];
|
||||||
|
if (client) {
|
||||||
|
RCTLogError(@"%@.createSocket called twice with the same id.", [self class]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
client = [TcpSocketClient socketClientWithConfig:self];
|
||||||
|
[_clients setObject:client forKey:cId];
|
||||||
|
}
|
||||||
|
|
||||||
|
RCT_EXPORT_METHOD(connect:(nonnull NSNumber*)cId
|
||||||
|
port:(int)port
|
||||||
|
host:(NSString *)host
|
||||||
|
callback:(RCTResponseSenderBlock)callback)
|
||||||
|
{
|
||||||
|
TcpSocketClient* client = [TcpSockets findClient:cId callback:callback];
|
||||||
|
if (!client) return;
|
||||||
|
|
||||||
|
NSError *error = nil;
|
||||||
|
if (![client connect:port host:host error:&error])
|
||||||
|
{
|
||||||
|
NSString* msg = [[error userInfo] valueForKey:@"NSLocalizedFailureReason"];
|
||||||
|
callback(@[msg]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
callback(@[[NSNull null], [NSNull null]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
RCT_EXPORT_METHOD(write:(nonnull NSNumber*)cId
|
||||||
|
string:(NSString*)string
|
||||||
|
encoded:(BOOL)encoded
|
||||||
|
callback:(RCTResponseSenderBlock)callback) {
|
||||||
|
TcpSocketClient* client = [TcpSockets findClient:cId callback:callback];
|
||||||
|
if (!client) return;
|
||||||
|
|
||||||
|
NSData *data;
|
||||||
|
if (encoded) {
|
||||||
|
// iOS7+
|
||||||
|
// TODO: use https://github.com/nicklockwood/Base64 for compatibility with earlier iOS versions
|
||||||
|
data = [[NSData alloc] initWithBase64EncodedString:string options:0];
|
||||||
|
} else {
|
||||||
|
data = [string dataUsingEncoding:[NSString defaultCStringEncoding]];
|
||||||
|
}
|
||||||
|
|
||||||
|
[client writeData:data callback:callback];
|
||||||
|
}
|
||||||
|
|
||||||
|
RCT_EXPORT_METHOD(close:(nonnull NSNumber*)cId
|
||||||
|
callback:(RCTResponseSenderBlock)callback) {
|
||||||
|
[TcpSockets closeClient:cId callback:callback];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void) onData:(TcpSocketClient*) client data:(NSData *)data
|
||||||
|
{
|
||||||
|
NSMutableDictionary* _clients = [TcpSockets clients];
|
||||||
|
NSString *clientID = [[_clients allKeysForObject:client] objectAtIndex:0];
|
||||||
|
NSString *base64String = [data base64EncodedStringWithOptions:0];
|
||||||
|
[self.bridge.eventDispatcher sendDeviceEventWithName:[NSString stringWithFormat:@"tcp-%@-data", clientID]
|
||||||
|
body:@{ @"data": base64String }];
|
||||||
|
}
|
||||||
|
|
||||||
|
+(TcpSocketClient*)findClient:(nonnull NSNumber*)cId callback:(RCTResponseSenderBlock)callback
|
||||||
|
{
|
||||||
|
NSMutableDictionary* _clients = [TcpSockets clients];
|
||||||
|
TcpSocketClient *client = [_clients objectForKey:cId];
|
||||||
|
if (!client) {
|
||||||
|
if (!callback) {
|
||||||
|
RCTLogError(@"%@.missing callback parameter.", [self class]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
callback(@[[NSString stringWithFormat:@"no client found with id %@", cId]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
return client;
|
||||||
|
}
|
||||||
|
|
||||||
|
+(void) closeClient:(nonnull NSNumber*)cId
|
||||||
|
callback:(RCTResponseSenderBlock)callback
|
||||||
|
{
|
||||||
|
NSMutableDictionary* _clients = [TcpSockets clients];
|
||||||
|
TcpSocketClient* client = [TcpSockets findClient:cId callback:callback];
|
||||||
|
if (!client) return;
|
||||||
|
|
||||||
|
[client close];
|
||||||
|
[_clients removeObjectForKey:cId];
|
||||||
|
|
||||||
|
if (callback) callback(@[]);
|
||||||
|
}
|
||||||
|
|
||||||
|
+(void) closeAllSockets {
|
||||||
|
NSMutableDictionary* _clients = [TcpSockets clients];
|
||||||
|
for (NSNumber* cId in _clients) {
|
||||||
|
[TcpSockets closeClient:cId callback:nil];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
297
ios/TcpSockets.xcodeproj/project.pbxproj
Normal file
297
ios/TcpSockets.xcodeproj/project.pbxproj
Normal file
File diff suppressed because one or more lines are too long
24
ios/react-native-tcp.podspec
Normal file
24
ios/react-native-tcp.podspec
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
Pod::Spec.new do |s|
|
||||||
|
s.name = 'react-native-tcp'
|
||||||
|
s.version = '1.1.1'
|
||||||
|
s.summary = 'node\'s net API in React Native.'
|
||||||
|
s.description = <<-DESC
|
||||||
|
Enables accessing tcp sockets in React Native.
|
||||||
|
DESC
|
||||||
|
s.homepage = 'https://github.com/PeelTechnologies/react-native-tcp'
|
||||||
|
s.license = { :type => 'MIT' }
|
||||||
|
s.authors = { 'Andy Prock' => 'aprock@gmail.com' }
|
||||||
|
s.source = { :git => 'https://github.com/PeelTechnologies/react-native-tcp.git' }
|
||||||
|
s.default_subspec = 'Core'
|
||||||
|
s.requires_arc = true
|
||||||
|
s.platform = :ios, '7.0'
|
||||||
|
s.prepare_command = 'npm install --production'
|
||||||
|
s.preserve_paths = 'node_modules', '**/*.js', 'package.json'
|
||||||
|
s.header_mappings_dir = '.'
|
||||||
|
# s.dependency 'React'
|
||||||
|
|
||||||
|
s.subspec 'Core' do |ss|
|
||||||
|
ss.source_files = '*.{c,h,m}', 'CocoaAsyncSocket/*.{h,m}'
|
||||||
|
ss.preserve_paths = '*.js'
|
||||||
|
end
|
||||||
|
end
|
41
package.json
Normal file
41
package.json
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"name": "react-native-tcp",
|
||||||
|
"version": "1.1.1",
|
||||||
|
"description": "node's dgram API for react-native",
|
||||||
|
"main": "TcpSockets.js",
|
||||||
|
"scripts": {
|
||||||
|
"start": "exit 1"
|
||||||
|
},
|
||||||
|
"browser": {
|
||||||
|
"net": "./TcpSockets.js"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/PeelTechnologies/react-native-tcp"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"react-component",
|
||||||
|
"reactnative",
|
||||||
|
"react-native",
|
||||||
|
"net",
|
||||||
|
"tcp",
|
||||||
|
"sockets",
|
||||||
|
"ios",
|
||||||
|
"android"
|
||||||
|
],
|
||||||
|
"author": {
|
||||||
|
"name": "Andy Prock",
|
||||||
|
"email": "aprock@gmail.com"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/PeelTechnologies/react-native-tcp/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/PeelTechnologies/react-native-tcp",
|
||||||
|
"dependencies": {
|
||||||
|
"base64-js": "0.0.8",
|
||||||
|
"events": "^1.0.2",
|
||||||
|
"inherits": "^2.0.1",
|
||||||
|
"util": "^0.10.3"
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user