AppRTCDemo: builds using ninja on iOS for simulator and device!
Things included in this CL: - updated READMEs to provide an exact/reproable set of steps for getting the app running. - gyp changes to build the iOS AppRTCDemo sample app using gyp+ninja instead of the hand-crafted Xcode project (which has never worked in its checked-in form), including a gyp action to sign the sample app for deployment to an iOS device (the app can also be used in the simulator) - deleted the busted hand-crafted Xcode project for the sample app - updated the sample app to match the PeerConnection API that ended up landing (in a surprising twist of fate, the API landed quite a bit later than the sample app and this is the first time the CR-time changes in the API are reflected in the sample app) - updated the sample app to reflect apprtc.appspot.com HTML/JS changes (equiv to the AppRTCClient.java changes in http://s10/47299162) - picked up the iossim DEPS to enable launching the sample app in the simulator from the command-line. - renamed some files to match capitalization of the classes they contain (Ice -> ICE) per ObjC naming guidelines. - ran the files involved in this CL through clang-format to deal with xcode formatting craxy. BUG=2106 RISK=P2 TESTED=unittest builds with ninja and passes on OS=mac; sample app builds with ninja and runs on simulator and device, though no audio flows from simulator/device (will fix in a follow-up CL) R=andrew@webrtc.org, justincohen@google.com, wu@webrtc.org Review URL: https://webrtc-codereview.appspot.com/1874005 git-svn-id: http://webrtc.googlecode.com/svn/trunk@4466 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
parent
6abb750993
commit
1bc1954174
1
.gitignore
vendored
1
.gitignore
vendored
@ -38,6 +38,7 @@
|
|||||||
/chromium_deps
|
/chromium_deps
|
||||||
/google_apis/build
|
/google_apis/build
|
||||||
/gyp-mac-tool
|
/gyp-mac-tool
|
||||||
|
/net/third_party/nss/
|
||||||
/out
|
/out
|
||||||
/resources
|
/resources
|
||||||
/talk/examples/android/bin
|
/talk/examples/android/bin
|
||||||
|
17
DEPS
17
DEPS
@ -131,12 +131,29 @@ deps_os = {
|
|||||||
# NSS, for SSLClientSocketNSS.
|
# NSS, for SSLClientSocketNSS.
|
||||||
"third_party/nss":
|
"third_party/nss":
|
||||||
From("chromium_deps", "src/third_party/nss"),
|
From("chromium_deps", "src/third_party/nss"),
|
||||||
|
|
||||||
|
# TODO(fischman): delete this in favor of the copy in "ios" below, once the
|
||||||
|
# webrtc iOS bots are fixed to target_os=['ios'] in their .gclient
|
||||||
|
# https://code.google.com/p/webrtc/issues/detail?id=2152
|
||||||
|
"net/third_party/nss":
|
||||||
|
Var("chromium_trunk") + "/src/net/third_party/nss@" + Var("chromium_revision"),
|
||||||
},
|
},
|
||||||
|
|
||||||
"ios": {
|
"ios": {
|
||||||
# NSS, for SSLClientSocketNSS.
|
# NSS, for SSLClientSocketNSS.
|
||||||
"third_party/nss":
|
"third_party/nss":
|
||||||
From("chromium_deps", "src/third_party/nss"),
|
From("chromium_deps", "src/third_party/nss"),
|
||||||
|
|
||||||
|
"net/third_party/nss":
|
||||||
|
Var("chromium_trunk") + "/src/net/third_party/nss@" + Var("chromium_revision"),
|
||||||
|
|
||||||
|
# class-dump utility to generate header files for undocumented SDKs.
|
||||||
|
"testing/iossim/third_party/class-dump":
|
||||||
|
From("chromium_deps", "src/testing/iossim/third_party/class-dump"),
|
||||||
|
|
||||||
|
# Helper for running under the simulator.
|
||||||
|
"testing/iossim":
|
||||||
|
Var("chromium_trunk") + "/src/testing/iossim@" + Var("chromium_revision"),
|
||||||
},
|
},
|
||||||
|
|
||||||
"unix": {
|
"unix": {
|
||||||
|
5
all.gyp
5
all.gyp
@ -7,6 +7,7 @@
|
|||||||
# be found in the AUTHORS file in the root of the source tree.
|
# be found in the AUTHORS file in the root of the source tree.
|
||||||
|
|
||||||
{
|
{
|
||||||
|
'includes': ['talk/build/common.gypi'],
|
||||||
'targets': [
|
'targets': [
|
||||||
{
|
{
|
||||||
'target_name': 'All',
|
'target_name': 'All',
|
||||||
@ -15,9 +16,9 @@
|
|||||||
'webrtc/webrtc.gyp:*',
|
'webrtc/webrtc.gyp:*',
|
||||||
],
|
],
|
||||||
# TODO(henrike): fix build errors on 64 bit Mac for libjingle. See issue
|
# TODO(henrike): fix build errors on 64 bit Mac for libjingle. See issue
|
||||||
# 2124
|
# 2124. Once done the entire conditional below can be removed.
|
||||||
'conditions': [
|
'conditions': [
|
||||||
['OS!="mac" or target_arch!="x64"', {
|
['OS!="mac" or target_arch!="x64" or libjingle_objc==1', {
|
||||||
'dependencies': [
|
'dependencies': [
|
||||||
'talk/libjingle.gyp:*',
|
'talk/libjingle.gyp:*',
|
||||||
'talk/libjingle_examples.gyp:*',
|
'talk/libjingle_examples.gyp:*',
|
||||||
|
@ -1,45 +1,79 @@
|
|||||||
This directory contains the ObjectiveC implementation of the
|
This directory contains the ObjectiveC implementation of the
|
||||||
webrtc::PeerConnection API. This can be built for Mac or iOS.
|
webrtc::PeerConnection API. This can be built for Mac or iOS. This
|
||||||
|
file describes building the API, unit test, and AppRTCDemo sample app.
|
||||||
|
|
||||||
Prerequisites:
|
Prerequisites:
|
||||||
- Make sure gclient is checking out tools necessary to target iOS: your
|
- Make sure gclient is checking out tools necessary to target iOS: your
|
||||||
.gclient file should contain a line like:
|
.gclient file should contain a line like:
|
||||||
target_os = ['ios', 'mac']
|
target_os = ['ios', 'mac']
|
||||||
Make sure to re-run gclient sync after adding this to download the tools.
|
Make sure to re-run gclient sync after adding this to download the tools.
|
||||||
- Set up webrtc-related GYP variables:
|
|
||||||
- For Mac:
|
|
||||||
export GYP_DEFINES="build_with_libjingle=1 build_with_chromium=0 OS=mac
|
|
||||||
target_arch=x64 libjingle_objc=1 libpeer_target_type=static_library
|
|
||||||
$GYP_DEFINES"
|
|
||||||
- For iOS:
|
|
||||||
export GYP_DEFINES="build_with_libjingle=1 build_with_chromium=0 OS=ios
|
|
||||||
libjingle_enable_video=0 libjingle_objc=1 enable_video=0 $GYP_DEFINES"
|
|
||||||
- Finally, run "gclient runhooks" to generate iOS or Mac targeting Xcode
|
|
||||||
projects.
|
|
||||||
|
|
||||||
Example of building & using the app:
|
- Set up webrtc-related $GYP_DEFINES; example shell functions that set
|
||||||
|
up for building for iOS-device, iOS-simulator, and Mac (resp) are:
|
||||||
|
function wrbase() {
|
||||||
|
cd /path/to/libjingle/trunk
|
||||||
|
export GYP_DEFINES="build_with_libjingle=1 build_with_chromium=0 libjingle_objc=1"
|
||||||
|
export GYP_GENERATORS="ninja"
|
||||||
|
}
|
||||||
|
|
||||||
cd <path/to/libjingle>/trunk/talk
|
function wrios() {
|
||||||
- Open libjingle.xcproj. Select iPhone or iPad simulator and build everything.
|
wrbase
|
||||||
Then switch to iOS device and build everything. This creates x86 and ARM
|
export GYP_DEFINES="$GYP_DEFINES OS=ios target_arch=armv7"
|
||||||
archives.
|
export GYP_GENERATOR_FLAGS="$GYP_GENERATOR_FLAGS output_dir=out_ios"
|
||||||
cd examples/ios
|
export GYP_CROSSCOMPILE=1
|
||||||
./makeLibs.sh
|
}
|
||||||
- This will generate fat archives containing both targets and copy them to
|
|
||||||
./libs.
|
|
||||||
- This step must be rerun every time you run gclient sync or build the API
|
|
||||||
libraries.
|
|
||||||
- Open AppRTCDemo.xcodeproj, select your device or simulator and run.
|
|
||||||
- If you have any problems deploying for the first time, check the project
|
|
||||||
properties to ensure that the Bundle Identifier matches your phone
|
|
||||||
provisioning profile. Or use the simulator as it doesn't require a profile.
|
|
||||||
|
|
||||||
- In desktop chrome, navigate to http://apprtc.appspot.com and note the r=<NNN>
|
function wrsim() {
|
||||||
room number in the resulting URL.
|
wrbase
|
||||||
|
export GYP_DEFINES="$GYP_DEFINES OS=ios target_arch=ia32"
|
||||||
|
export GYP_GENERATOR_FLAGS="$GYP_GENERATOR_FLAGS output_dir=out_sim"
|
||||||
|
export GYP_CROSSCOMPILE=1
|
||||||
|
}
|
||||||
|
|
||||||
- Enter that number into the text field on the phone.
|
function wrmac() {
|
||||||
|
wrbase
|
||||||
|
export GYP_DEFINES="$GYP_DEFINES OS=mac target_arch=x64"
|
||||||
|
export GYP_GENERATOR_FLAGS="$GYP_GENERATOR_FLAGS output_dir=out_mac"
|
||||||
|
}
|
||||||
|
|
||||||
- Alternatively, you can background the app and launch Safari. In Safari, open
|
- Finally, run "gclient runhooks" to generate ninja files.
|
||||||
the url apprtc://apprtc.appspot.com/?r=<NNN> where <NNN> is the room name.
|
|
||||||
Other options are to put the link in an email and send it to your self.
|
Example of building & using the unittest & app:
|
||||||
Clicking on it will launch AppRTCDemo and navigate to the room.
|
|
||||||
|
- To build & run the unittest (must target mac):
|
||||||
|
wrmac && gclient runhooks && \
|
||||||
|
ninja -C out_mac/Debug libjingle_peerconnection_objc_test && \
|
||||||
|
./out_mac/Debug/libjingle_peerconnection_objc_test.app/Contents/MacOS/libjingle_peerconnection_objc_test
|
||||||
|
|
||||||
|
- To build & launch the sample app on the iOS simulator:
|
||||||
|
wrsim && gclient runhooks && ninja -C out_sim/Debug iossim AppRTCDemo && \
|
||||||
|
./out_sim/Debug/iossim out_sim/Debug/AppRTCDemo.app
|
||||||
|
|
||||||
|
- To build & sign the sample app for an iOS device:
|
||||||
|
wrios && gclient runhooks && ninja -C out_ios/Debug AppRTCDemo
|
||||||
|
|
||||||
|
- To install the sample app on an iOS device:
|
||||||
|
ideviceinstaller -i out_ios/Debug/AppRTCDemo.app
|
||||||
|
(if installing ideviceinstaller from brew, use --HEAD to get support
|
||||||
|
for .app directories)
|
||||||
|
- Alternatively, use iPhone Configuration Utility:
|
||||||
|
- Open "iPhone Configuration Utility" (http://support.apple.com/kb/DL1465)
|
||||||
|
- Click the "Add" icon (command-o)
|
||||||
|
- Open the app under out_ios/Debug/AppRTCDemo (should be added to the Applications tab)
|
||||||
|
- Click the device's name in the left-hand panel and select the Applications tab
|
||||||
|
- Click Install on the AppRTCDemo line.
|
||||||
|
(If you have any problems deploying for the first time, check
|
||||||
|
the Info.plist file to ensure that the Bundle Identifier matches
|
||||||
|
your phone provisioning profile, or use a development wildcard
|
||||||
|
provisioning profile.)
|
||||||
|
|
||||||
|
- Once installed:
|
||||||
|
- Tap AppRTCDemo on the iOS device's home screen (might have to scroll to find it).
|
||||||
|
- In desktop chrome, navigate to http://apprtc.appspot.com and note
|
||||||
|
the r=<NNN> room number in the resulting URL; enter that number
|
||||||
|
into the text field on the phone.
|
||||||
|
- Alternatively, background the app and launch Safari. In Safari,
|
||||||
|
open the url apprtc://apprtc.appspot.com/?r=<NNN> where <NNN> is
|
||||||
|
the room name. Other options are to put the link in an email/chat
|
||||||
|
and send it to yourself. Clicking on it will launch AppRTCDemo
|
||||||
|
and navigate to the room.
|
||||||
|
@ -32,8 +32,8 @@
|
|||||||
@interface RTCICECandidate (Internal)
|
@interface RTCICECandidate (Internal)
|
||||||
|
|
||||||
@property(nonatomic, assign, readonly) const
|
@property(nonatomic, assign, readonly) const
|
||||||
webrtc::IceCandidateInterface *candidate;
|
webrtc::IceCandidateInterface* candidate;
|
||||||
|
|
||||||
- (id)initWithCandidate:(const webrtc::IceCandidateInterface *)candidate;
|
- (id)initWithCandidate:(const webrtc::IceCandidateInterface*)candidate;
|
||||||
|
|
||||||
@end
|
@end
|
@ -78,7 +78,7 @@
|
|||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (const webrtc::IceCandidateInterface *)candidate {
|
- (const webrtc::IceCandidateInterface*)candidate {
|
||||||
return webrtc::CreateIceCandidate(
|
return webrtc::CreateIceCandidate(
|
||||||
[self.sdpMid UTF8String], self.sdpMLineIndex, [self.sdp UTF8String]);
|
[self.sdpMid UTF8String], self.sdpMLineIndex, [self.sdp UTF8String]);
|
||||||
}
|
}
|
@ -31,7 +31,8 @@
|
|||||||
|
|
||||||
@interface RTCICEServer (Internal)
|
@interface RTCICEServer (Internal)
|
||||||
|
|
||||||
@property(nonatomic, assign, readonly)
|
@property(nonatomic,
|
||||||
webrtc::PeerConnectionInterface::IceServer iceServer;
|
assign,
|
||||||
|
readonly) webrtc::PeerConnectionInterface::IceServer iceServer;
|
||||||
|
|
||||||
@end
|
@end
|
@ -53,6 +53,7 @@
|
|||||||
#include "talk/app/webrtc/videosourceinterface.h"
|
#include "talk/app/webrtc/videosourceinterface.h"
|
||||||
#include "talk/app/webrtc/videotrack.h"
|
#include "talk/app/webrtc/videotrack.h"
|
||||||
#include "talk/base/logging.h"
|
#include "talk/base/logging.h"
|
||||||
|
#include "talk/base/ssladapter.h"
|
||||||
|
|
||||||
@interface RTCPeerConnectionFactory ()
|
@interface RTCPeerConnectionFactory ()
|
||||||
|
|
||||||
@ -63,6 +64,16 @@
|
|||||||
|
|
||||||
@implementation RTCPeerConnectionFactory
|
@implementation RTCPeerConnectionFactory
|
||||||
|
|
||||||
|
+ (void)initializeSSL {
|
||||||
|
BOOL initialized = talk_base::InitializeSSL();
|
||||||
|
NSAssert(initialized, @"Failed to initialize SSL library");
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (void)deinitializeSSL {
|
||||||
|
BOOL deinitialized = talk_base::CleanupSSL();
|
||||||
|
NSAssert(deinitialized, @"Failed to deinitialize SSL library");
|
||||||
|
}
|
||||||
|
|
||||||
- (id)init {
|
- (id)init {
|
||||||
if ((self = [super init])) {
|
if ((self = [super init])) {
|
||||||
_nativeFactory = webrtc::CreatePeerConnectionFactory();
|
_nativeFactory = webrtc::CreatePeerConnectionFactory();
|
||||||
|
@ -33,24 +33,24 @@
|
|||||||
// If present, this contains the identifier of the "media stream
|
// If present, this contains the identifier of the "media stream
|
||||||
// identification" as defined in [RFC 3388] for m-line this candidate is
|
// identification" as defined in [RFC 3388] for m-line this candidate is
|
||||||
// associated with.
|
// associated with.
|
||||||
@property(nonatomic, copy, readonly) NSString *sdpMid;
|
@property(nonatomic, copy, readonly) NSString* sdpMid;
|
||||||
|
|
||||||
// This indicates the index (starting at zero) of m-line in the SDP this
|
// This indicates the index (starting at zero) of m-line in the SDP this
|
||||||
// candidate is associated with.
|
// candidate is associated with.
|
||||||
@property(nonatomic, assign, readonly) NSInteger sdpMLineIndex;
|
@property(nonatomic, assign, readonly) NSInteger sdpMLineIndex;
|
||||||
|
|
||||||
// Creates an SDP-ized form of this candidate.
|
// Creates an SDP-ized form of this candidate.
|
||||||
@property(nonatomic, copy, readonly) NSString *sdp;
|
@property(nonatomic, copy, readonly) NSString* sdp;
|
||||||
|
|
||||||
// Creates an ICECandidateInterface based on SDP string.
|
// Creates an ICECandidateInterface based on SDP string.
|
||||||
- (id)initWithMid:(NSString *)sdpMid
|
- (id)initWithMid:(NSString*)sdpMid
|
||||||
index:(NSInteger)sdpMLineIndex
|
index:(NSInteger)sdpMLineIndex
|
||||||
sdp:(NSString *)sdp;
|
sdp:(NSString*)sdp;
|
||||||
|
|
||||||
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||||||
// Disallow init and don't add to documentation
|
// Disallow init and don't add to documentation
|
||||||
- (id)init __attribute__(
|
- (id)init __attribute__((
|
||||||
(unavailable("init is not a supported initializer for this class.")));
|
unavailable("init is not a supported initializer for this class.")));
|
||||||
#endif /* DOXYGEN_SHOULD_SKIP_THIS */
|
#endif /* DOXYGEN_SHOULD_SKIP_THIS */
|
||||||
|
|
||||||
@end
|
@end
|
@ -31,18 +31,18 @@
|
|||||||
@interface RTCICEServer : NSObject
|
@interface RTCICEServer : NSObject
|
||||||
|
|
||||||
// The server URI.
|
// The server URI.
|
||||||
@property(nonatomic, strong, readonly) NSURL *URI;
|
@property(nonatomic, strong, readonly) NSURL* URI;
|
||||||
|
|
||||||
// The server password.
|
// The server password.
|
||||||
@property(nonatomic, copy, readonly) NSString *password;
|
@property(nonatomic, copy, readonly) NSString* password;
|
||||||
|
|
||||||
// Initializer for RTCICEServer taking uri and password.
|
// Initializer for RTCICEServer taking uri and password.
|
||||||
- (id)initWithURI:(NSString *)URI password:(NSString *)password;
|
- (id)initWithURI:(NSString*)URI password:(NSString*)password;
|
||||||
|
|
||||||
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
#ifndef DOXYGEN_SHOULD_SKIP_THIS
|
||||||
// Disallow init and don't add to documentation
|
// Disallow init and don't add to documentation
|
||||||
- (id)init __attribute__(
|
- (id)init __attribute__((
|
||||||
(unavailable("init is not a supported initializer for this class.")));
|
unavailable("init is not a supported initializer for this class.")));
|
||||||
#endif /* DOXYGEN_SHOULD_SKIP_THIS */
|
#endif /* DOXYGEN_SHOULD_SKIP_THIS */
|
||||||
|
|
||||||
@end
|
@end
|
@ -40,6 +40,10 @@
|
|||||||
// It is the main entry point to the PeerConnection API for clients.
|
// It is the main entry point to the PeerConnection API for clients.
|
||||||
@interface RTCPeerConnectionFactory : NSObject
|
@interface RTCPeerConnectionFactory : NSObject
|
||||||
|
|
||||||
|
// Initialize & de-initialize the SSL subsystem. Failure is fatal.
|
||||||
|
+ (void)initializeSSL;
|
||||||
|
+ (void)deinitializeSSL;
|
||||||
|
|
||||||
// Create an RTCPeerConnection object. RTCPeerConnectionFactory will create
|
// Create an RTCPeerConnection object. RTCPeerConnectionFactory will create
|
||||||
// required libjingle threads, socket and network manager factory classes for
|
// required libjingle threads, socket and network manager factory classes for
|
||||||
// networking.
|
// networking.
|
||||||
|
1
talk/app/webrtc/objctests/README
Normal file
1
talk/app/webrtc/objctests/README
Normal file
@ -0,0 +1 @@
|
|||||||
|
See ../objc/README for information on what this is and how to use it.
|
@ -99,12 +99,12 @@
|
|||||||
['OS=="ios"', {
|
['OS=="ios"', {
|
||||||
'defines': [
|
'defines': [
|
||||||
'IOS',
|
'IOS',
|
||||||
'SSL_USE_NSS',
|
'HAVE_NSS_SSL_H=1',
|
||||||
'SSL_USE_NSS_RNG',
|
'SSL_USE_NSS_RNG',
|
||||||
],
|
],
|
||||||
'variables': {
|
'defines!': [
|
||||||
'use_nss%': 1,
|
'HAVE_OPENSSL_SSL_H=1',
|
||||||
},
|
],
|
||||||
}],
|
}],
|
||||||
['libjingle_objc==1', {
|
['libjingle_objc==1', {
|
||||||
'defines': [
|
'defines': [
|
||||||
|
@ -1,570 +0,0 @@
|
|||||||
// !$*UTF8*$!
|
|
||||||
{
|
|
||||||
archiveVersion = 1;
|
|
||||||
classes = {
|
|
||||||
};
|
|
||||||
objectVersion = 46;
|
|
||||||
objects = {
|
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
|
||||||
4F995B31173B6937007F179A /* libaudio_coding_module.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B01173B6937007F179A /* libaudio_coding_module.a */; };
|
|
||||||
4F995B32173B6937007F179A /* libaudio_conference_mixer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B02173B6937007F179A /* libaudio_conference_mixer.a */; };
|
|
||||||
4F995B33173B6937007F179A /* libaudio_device.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B03173B6937007F179A /* libaudio_device.a */; };
|
|
||||||
4F995B34173B6938007F179A /* libaudio_processing.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B04173B6937007F179A /* libaudio_processing.a */; };
|
|
||||||
4F995B35173B6938007F179A /* libaudioproc_debug_proto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B05173B6937007F179A /* libaudioproc_debug_proto.a */; };
|
|
||||||
4F995B36173B6938007F179A /* libbitrate_controller.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B06173B6937007F179A /* libbitrate_controller.a */; };
|
|
||||||
4F995B37173B6938007F179A /* libCNG.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B07173B6937007F179A /* libCNG.a */; };
|
|
||||||
4F995B38173B6938007F179A /* libcommon_video.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B08173B6937007F179A /* libcommon_video.a */; };
|
|
||||||
4F995B39173B6938007F179A /* libexpat.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B09173B6937007F179A /* libexpat.a */; };
|
|
||||||
4F995B3A173B6938007F179A /* libG711.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B0A173B6937007F179A /* libG711.a */; };
|
|
||||||
4F995B3B173B6938007F179A /* libG722.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B0B173B6937007F179A /* libG722.a */; };
|
|
||||||
4F995B3C173B6938007F179A /* libgunit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B0C173B6937007F179A /* libgunit.a */; };
|
|
||||||
4F995B3D173B6938007F179A /* libiLBC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B0D173B6937007F179A /* libiLBC.a */; };
|
|
||||||
4F995B3E173B6938007F179A /* libiSAC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B0E173B6937007F179A /* libiSAC.a */; };
|
|
||||||
4F995B3F173B6938007F179A /* libiSACFix.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B0F173B6937007F179A /* libiSACFix.a */; };
|
|
||||||
4F995B40173B6938007F179A /* libjingle_media.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B10173B6937007F179A /* libjingle_media.a */; };
|
|
||||||
4F995B41173B6938007F179A /* libjingle_p2p.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B11173B6937007F179A /* libjingle_p2p.a */; };
|
|
||||||
4F995B42173B6938007F179A /* libjingle_peerconnection_objc.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B12173B6937007F179A /* libjingle_peerconnection_objc.a */; };
|
|
||||||
4F995B43173B6938007F179A /* libjingle_peerconnection.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B13173B6937007F179A /* libjingle_peerconnection.a */; };
|
|
||||||
4F995B44173B6938007F179A /* libjingle_sound.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B14173B6937007F179A /* libjingle_sound.a */; };
|
|
||||||
4F995B45173B6938007F179A /* libjingle.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B15173B6937007F179A /* libjingle.a */; };
|
|
||||||
4F995B46173B6938007F179A /* libjsoncpp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B16173B6937007F179A /* libjsoncpp.a */; };
|
|
||||||
4F995B47173B6938007F179A /* libmedia_file.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B17173B6937007F179A /* libmedia_file.a */; };
|
|
||||||
4F995B48173B6938007F179A /* libNetEq.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B18173B6937007F179A /* libNetEq.a */; };
|
|
||||||
4F995B49173B6938007F179A /* libopenssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B19173B6937007F179A /* libopenssl.a */; };
|
|
||||||
4F995B4A173B6938007F179A /* libopus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B1A173B6937007F179A /* libopus.a */; };
|
|
||||||
4F995B4B173B6938007F179A /* libpaced_sender.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B1B173B6937007F179A /* libpaced_sender.a */; };
|
|
||||||
4F995B4C173B6938007F179A /* libPCM16B.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B1C173B6937007F179A /* libPCM16B.a */; };
|
|
||||||
4F995B4D173B6938007F179A /* libprotobuf_lite.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B1D173B6937007F179A /* libprotobuf_lite.a */; };
|
|
||||||
4F995B4E173B6938007F179A /* libremote_bitrate_estimator.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B1E173B6937007F179A /* libremote_bitrate_estimator.a */; };
|
|
||||||
4F995B4F173B6938007F179A /* libresampler.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B1F173B6937007F179A /* libresampler.a */; };
|
|
||||||
4F995B50173B6938007F179A /* librtp_rtcp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B20173B6937007F179A /* librtp_rtcp.a */; };
|
|
||||||
4F995B51173B6938007F179A /* libsignal_processing.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B21173B6937007F179A /* libsignal_processing.a */; };
|
|
||||||
4F995B52173B6938007F179A /* libsrtp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B22173B6937007F179A /* libsrtp.a */; };
|
|
||||||
4F995B53173B6938007F179A /* libsystem_wrappers.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B23173B6937007F179A /* libsystem_wrappers.a */; };
|
|
||||||
4F995B54173B6938007F179A /* libudp_transport.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B24173B6937007F179A /* libudp_transport.a */; };
|
|
||||||
4F995B55173B6938007F179A /* libvad.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B25173B6937007F179A /* libvad.a */; };
|
|
||||||
4F995B56173B6938007F179A /* libvideo_capture_module.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B26173B6937007F179A /* libvideo_capture_module.a */; };
|
|
||||||
4F995B57173B6938007F179A /* libvideo_coding_utility.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B27173B6937007F179A /* libvideo_coding_utility.a */; };
|
|
||||||
4F995B58173B6938007F179A /* libvideo_engine_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B28173B6937007F179A /* libvideo_engine_core.a */; };
|
|
||||||
4F995B59173B6938007F179A /* libvideo_processing.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B29173B6937007F179A /* libvideo_processing.a */; };
|
|
||||||
4F995B5A173B6938007F179A /* libvideo_render_module.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B2A173B6937007F179A /* libvideo_render_module.a */; };
|
|
||||||
4F995B5B173B6938007F179A /* libvoice_engine_core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B2B173B6937007F179A /* libvoice_engine_core.a */; };
|
|
||||||
4F995B5C173B6938007F179A /* libwebrtc_i420.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B2C173B6937007F179A /* libwebrtc_i420.a */; };
|
|
||||||
4F995B5D173B6938007F179A /* libwebrtc_opus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B2D173B6937007F179A /* libwebrtc_opus.a */; };
|
|
||||||
4F995B5E173B6938007F179A /* libwebrtc_utility.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B2E173B6937007F179A /* libwebrtc_utility.a */; };
|
|
||||||
4F995B5F173B6938007F179A /* libwebrtc_video_coding.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B2F173B6937007F179A /* libwebrtc_video_coding.a */; };
|
|
||||||
4F995B60173B6938007F179A /* libwebrtc_vp8.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B30173B6937007F179A /* libwebrtc_vp8.a */; };
|
|
||||||
4F995B62173B694B007F179A /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B61173B694B007F179A /* AVFoundation.framework */; };
|
|
||||||
4F995B64173B6956007F179A /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B63173B6956007F179A /* CoreMedia.framework */; };
|
|
||||||
4F995B66173B695C007F179A /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B65173B695C007F179A /* CoreVideo.framework */; };
|
|
||||||
4F995B68173B6970007F179A /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B67173B6970007F179A /* CoreAudio.framework */; };
|
|
||||||
4F995B91173C03A1007F179A /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4F995B90173C03A1007F179A /* AudioToolbox.framework */; };
|
|
||||||
4F995B94173C0B82007F179A /* shim.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4F995B92173C0819007F179A /* shim.mm */; };
|
|
||||||
4FBCC04F1728E929004C8C0B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FBCC04E1728E929004C8C0B /* UIKit.framework */; };
|
|
||||||
4FBCC0511728E929004C8C0B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FBCC0501728E929004C8C0B /* Foundation.framework */; };
|
|
||||||
4FBCC0531728E929004C8C0B /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FBCC0521728E929004C8C0B /* CoreGraphics.framework */; };
|
|
||||||
4FBCC05B1728E929004C8C0B /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FBCC05A1728E929004C8C0B /* main.m */; };
|
|
||||||
4FBCC05F1728E929004C8C0B /* APPRTCAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FBCC05E1728E929004C8C0B /* APPRTCAppDelegate.m */; };
|
|
||||||
4FBCC0611728E929004C8C0B /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 4FBCC0601728E929004C8C0B /* Default.png */; };
|
|
||||||
4FBCC0681728E929004C8C0B /* APPRTCViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FBCC0671728E929004C8C0B /* APPRTCViewController.m */; };
|
|
||||||
4FBCC06B1728E929004C8C0B /* APPRTCViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4FBCC0691728E929004C8C0B /* APPRTCViewController.xib */; };
|
|
||||||
4FBCC0731729B780004C8C0B /* GAEChannelClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FBCC0721729B780004C8C0B /* GAEChannelClient.m */; };
|
|
||||||
4FD7F5011732E1C2009295E5 /* APPRTCAppClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FD7F5001732E1C2009295E5 /* APPRTCAppClient.m */; };
|
|
||||||
4FEE3E531743C94D0005814A /* ios_channel.html in Resources */ = {isa = PBXBuildFile; fileRef = 4FEE3E511743C92D0005814A /* ios_channel.html */; };
|
|
||||||
4FEE3EB71746A3810005814A /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 4FEE3EB61746A3810005814A /* Icon.png */; };
|
|
||||||
/* End PBXBuildFile section */
|
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
|
||||||
4F995B01173B6937007F179A /* libaudio_coding_module.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libaudio_coding_module.a; path = libs/libaudio_coding_module.a; sourceTree = "<group>"; };
|
|
||||||
4F995B02173B6937007F179A /* libaudio_conference_mixer.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libaudio_conference_mixer.a; path = libs/libaudio_conference_mixer.a; sourceTree = "<group>"; };
|
|
||||||
4F995B03173B6937007F179A /* libaudio_device.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libaudio_device.a; path = libs/libaudio_device.a; sourceTree = "<group>"; };
|
|
||||||
4F995B04173B6937007F179A /* libaudio_processing.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libaudio_processing.a; path = libs/libaudio_processing.a; sourceTree = "<group>"; };
|
|
||||||
4F995B05173B6937007F179A /* libaudioproc_debug_proto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libaudioproc_debug_proto.a; path = libs/libaudioproc_debug_proto.a; sourceTree = "<group>"; };
|
|
||||||
4F995B06173B6937007F179A /* libbitrate_controller.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libbitrate_controller.a; path = libs/libbitrate_controller.a; sourceTree = "<group>"; };
|
|
||||||
4F995B07173B6937007F179A /* libCNG.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libCNG.a; path = libs/libCNG.a; sourceTree = "<group>"; };
|
|
||||||
4F995B08173B6937007F179A /* libcommon_video.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcommon_video.a; path = libs/libcommon_video.a; sourceTree = "<group>"; };
|
|
||||||
4F995B09173B6937007F179A /* libexpat.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libexpat.a; path = libs/libexpat.a; sourceTree = "<group>"; };
|
|
||||||
4F995B0A173B6937007F179A /* libG711.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libG711.a; path = libs/libG711.a; sourceTree = "<group>"; };
|
|
||||||
4F995B0B173B6937007F179A /* libG722.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libG722.a; path = libs/libG722.a; sourceTree = "<group>"; };
|
|
||||||
4F995B0C173B6937007F179A /* libgunit.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgunit.a; path = libs/libgunit.a; sourceTree = "<group>"; };
|
|
||||||
4F995B0D173B6937007F179A /* libiLBC.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libiLBC.a; path = libs/libiLBC.a; sourceTree = "<group>"; };
|
|
||||||
4F995B0E173B6937007F179A /* libiSAC.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libiSAC.a; path = libs/libiSAC.a; sourceTree = "<group>"; };
|
|
||||||
4F995B0F173B6937007F179A /* libiSACFix.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libiSACFix.a; path = libs/libiSACFix.a; sourceTree = "<group>"; };
|
|
||||||
4F995B10173B6937007F179A /* libjingle_media.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjingle_media.a; path = libs/libjingle_media.a; sourceTree = "<group>"; };
|
|
||||||
4F995B11173B6937007F179A /* libjingle_p2p.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjingle_p2p.a; path = libs/libjingle_p2p.a; sourceTree = "<group>"; };
|
|
||||||
4F995B12173B6937007F179A /* libjingle_peerconnection_objc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjingle_peerconnection_objc.a; path = libs/libjingle_peerconnection_objc.a; sourceTree = "<group>"; };
|
|
||||||
4F995B13173B6937007F179A /* libjingle_peerconnection.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjingle_peerconnection.a; path = libs/libjingle_peerconnection.a; sourceTree = "<group>"; };
|
|
||||||
4F995B14173B6937007F179A /* libjingle_sound.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjingle_sound.a; path = libs/libjingle_sound.a; sourceTree = "<group>"; };
|
|
||||||
4F995B15173B6937007F179A /* libjingle.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjingle.a; path = libs/libjingle.a; sourceTree = "<group>"; };
|
|
||||||
4F995B16173B6937007F179A /* libjsoncpp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjsoncpp.a; path = libs/libjsoncpp.a; sourceTree = "<group>"; };
|
|
||||||
4F995B17173B6937007F179A /* libmedia_file.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmedia_file.a; path = libs/libmedia_file.a; sourceTree = "<group>"; };
|
|
||||||
4F995B18173B6937007F179A /* libNetEq.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libNetEq.a; path = libs/libNetEq.a; sourceTree = "<group>"; };
|
|
||||||
4F995B19173B6937007F179A /* libopenssl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopenssl.a; path = libs/libopenssl.a; sourceTree = "<group>"; };
|
|
||||||
4F995B1A173B6937007F179A /* libopus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopus.a; path = libs/libopus.a; sourceTree = "<group>"; };
|
|
||||||
4F995B1B173B6937007F179A /* libpaced_sender.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libpaced_sender.a; path = libs/libpaced_sender.a; sourceTree = "<group>"; };
|
|
||||||
4F995B1C173B6937007F179A /* libPCM16B.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libPCM16B.a; path = libs/libPCM16B.a; sourceTree = "<group>"; };
|
|
||||||
4F995B1D173B6937007F179A /* libprotobuf_lite.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libprotobuf_lite.a; path = libs/libprotobuf_lite.a; sourceTree = "<group>"; };
|
|
||||||
4F995B1E173B6937007F179A /* libremote_bitrate_estimator.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libremote_bitrate_estimator.a; path = libs/libremote_bitrate_estimator.a; sourceTree = "<group>"; };
|
|
||||||
4F995B1F173B6937007F179A /* libresampler.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libresampler.a; path = libs/libresampler.a; sourceTree = "<group>"; };
|
|
||||||
4F995B20173B6937007F179A /* librtp_rtcp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = librtp_rtcp.a; path = libs/librtp_rtcp.a; sourceTree = "<group>"; };
|
|
||||||
4F995B21173B6937007F179A /* libsignal_processing.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsignal_processing.a; path = libs/libsignal_processing.a; sourceTree = "<group>"; };
|
|
||||||
4F995B22173B6937007F179A /* libsrtp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsrtp.a; path = libs/libsrtp.a; sourceTree = "<group>"; };
|
|
||||||
4F995B23173B6937007F179A /* libsystem_wrappers.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsystem_wrappers.a; path = libs/libsystem_wrappers.a; sourceTree = "<group>"; };
|
|
||||||
4F995B24173B6937007F179A /* libudp_transport.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libudp_transport.a; path = libs/libudp_transport.a; sourceTree = "<group>"; };
|
|
||||||
4F995B25173B6937007F179A /* libvad.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvad.a; path = libs/libvad.a; sourceTree = "<group>"; };
|
|
||||||
4F995B26173B6937007F179A /* libvideo_capture_module.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvideo_capture_module.a; path = libs/libvideo_capture_module.a; sourceTree = "<group>"; };
|
|
||||||
4F995B27173B6937007F179A /* libvideo_coding_utility.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvideo_coding_utility.a; path = libs/libvideo_coding_utility.a; sourceTree = "<group>"; };
|
|
||||||
4F995B28173B6937007F179A /* libvideo_engine_core.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvideo_engine_core.a; path = libs/libvideo_engine_core.a; sourceTree = "<group>"; };
|
|
||||||
4F995B29173B6937007F179A /* libvideo_processing.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvideo_processing.a; path = libs/libvideo_processing.a; sourceTree = "<group>"; };
|
|
||||||
4F995B2A173B6937007F179A /* libvideo_render_module.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvideo_render_module.a; path = libs/libvideo_render_module.a; sourceTree = "<group>"; };
|
|
||||||
4F995B2B173B6937007F179A /* libvoice_engine_core.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvoice_engine_core.a; path = libs/libvoice_engine_core.a; sourceTree = "<group>"; };
|
|
||||||
4F995B2C173B6937007F179A /* libwebrtc_i420.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libwebrtc_i420.a; path = libs/libwebrtc_i420.a; sourceTree = "<group>"; };
|
|
||||||
4F995B2D173B6937007F179A /* libwebrtc_opus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libwebrtc_opus.a; path = libs/libwebrtc_opus.a; sourceTree = "<group>"; };
|
|
||||||
4F995B2E173B6937007F179A /* libwebrtc_utility.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libwebrtc_utility.a; path = libs/libwebrtc_utility.a; sourceTree = "<group>"; };
|
|
||||||
4F995B2F173B6937007F179A /* libwebrtc_video_coding.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libwebrtc_video_coding.a; path = libs/libwebrtc_video_coding.a; sourceTree = "<group>"; };
|
|
||||||
4F995B30173B6937007F179A /* libwebrtc_vp8.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libwebrtc_vp8.a; path = libs/libwebrtc_vp8.a; sourceTree = "<group>"; };
|
|
||||||
4F995B61173B694B007F179A /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; };
|
|
||||||
4F995B63173B6956007F179A /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; };
|
|
||||||
4F995B65173B695C007F179A /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; };
|
|
||||||
4F995B67173B6970007F179A /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; };
|
|
||||||
4F995B90173C03A1007F179A /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
|
|
||||||
4F995B92173C0819007F179A /* shim.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = shim.mm; path = ../../../app/webrtc/objctests/ios/shim.mm; sourceTree = "<group>"; };
|
|
||||||
4FBCC04B1728E929004C8C0B /* AppRTCDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AppRTCDemo.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
4FBCC04E1728E929004C8C0B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
|
|
||||||
4FBCC0501728E929004C8C0B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
|
|
||||||
4FBCC0521728E929004C8C0B /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
|
|
||||||
4FBCC0561728E929004C8C0B /* AppRTCDemo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "AppRTCDemo-Info.plist"; sourceTree = "<group>"; };
|
|
||||||
4FBCC05A1728E929004C8C0B /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
|
|
||||||
4FBCC05C1728E929004C8C0B /* AppRTCDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AppRTCDemo-Prefix.pch"; sourceTree = "<group>"; };
|
|
||||||
4FBCC05D1728E929004C8C0B /* APPRTCAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = APPRTCAppDelegate.h; sourceTree = "<group>"; };
|
|
||||||
4FBCC05E1728E929004C8C0B /* APPRTCAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = APPRTCAppDelegate.m; sourceTree = "<group>"; };
|
|
||||||
4FBCC0601728E929004C8C0B /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = "<group>"; };
|
|
||||||
4FBCC0661728E929004C8C0B /* APPRTCViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = APPRTCViewController.h; sourceTree = "<group>"; };
|
|
||||||
4FBCC0671728E929004C8C0B /* APPRTCViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = APPRTCViewController.m; sourceTree = "<group>"; };
|
|
||||||
4FBCC06A1728E929004C8C0B /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/APPRTCViewController.xib; sourceTree = "<group>"; };
|
|
||||||
4FBCC0711729B780004C8C0B /* GAEChannelClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GAEChannelClient.h; sourceTree = "<group>"; };
|
|
||||||
4FBCC0721729B780004C8C0B /* GAEChannelClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GAEChannelClient.m; sourceTree = "<group>"; };
|
|
||||||
4FD7F4FF1732E1C1009295E5 /* APPRTCAppClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APPRTCAppClient.h; sourceTree = "<group>"; };
|
|
||||||
4FD7F5001732E1C2009295E5 /* APPRTCAppClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APPRTCAppClient.m; sourceTree = "<group>"; };
|
|
||||||
4FEE3E511743C92D0005814A /* ios_channel.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = ios_channel.html; sourceTree = "<group>"; };
|
|
||||||
4FEE3EB61746A3810005814A /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../Icon.png; sourceTree = "<group>"; };
|
|
||||||
/* End PBXFileReference section */
|
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
|
||||||
4FBCC0481728E929004C8C0B /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
4F995B91173C03A1007F179A /* AudioToolbox.framework in Frameworks */,
|
|
||||||
4F995B62173B694B007F179A /* AVFoundation.framework in Frameworks */,
|
|
||||||
4F995B68173B6970007F179A /* CoreAudio.framework in Frameworks */,
|
|
||||||
4FBCC0531728E929004C8C0B /* CoreGraphics.framework in Frameworks */,
|
|
||||||
4F995B64173B6956007F179A /* CoreMedia.framework in Frameworks */,
|
|
||||||
4F995B66173B695C007F179A /* CoreVideo.framework in Frameworks */,
|
|
||||||
4FBCC0511728E929004C8C0B /* Foundation.framework in Frameworks */,
|
|
||||||
4FBCC04F1728E929004C8C0B /* UIKit.framework in Frameworks */,
|
|
||||||
4F995B31173B6937007F179A /* libaudio_coding_module.a in Frameworks */,
|
|
||||||
4F995B32173B6937007F179A /* libaudio_conference_mixer.a in Frameworks */,
|
|
||||||
4F995B33173B6937007F179A /* libaudio_device.a in Frameworks */,
|
|
||||||
4F995B34173B6938007F179A /* libaudio_processing.a in Frameworks */,
|
|
||||||
4F995B35173B6938007F179A /* libaudioproc_debug_proto.a in Frameworks */,
|
|
||||||
4F995B36173B6938007F179A /* libbitrate_controller.a in Frameworks */,
|
|
||||||
4F995B37173B6938007F179A /* libCNG.a in Frameworks */,
|
|
||||||
4F995B38173B6938007F179A /* libcommon_video.a in Frameworks */,
|
|
||||||
4F995B39173B6938007F179A /* libexpat.a in Frameworks */,
|
|
||||||
4F995B3A173B6938007F179A /* libG711.a in Frameworks */,
|
|
||||||
4F995B3B173B6938007F179A /* libG722.a in Frameworks */,
|
|
||||||
4F995B3C173B6938007F179A /* libgunit.a in Frameworks */,
|
|
||||||
4F995B3D173B6938007F179A /* libiLBC.a in Frameworks */,
|
|
||||||
4F995B3E173B6938007F179A /* libiSAC.a in Frameworks */,
|
|
||||||
4F995B40173B6938007F179A /* libjingle_media.a in Frameworks */,
|
|
||||||
4F995B41173B6938007F179A /* libjingle_p2p.a in Frameworks */,
|
|
||||||
4F995B42173B6938007F179A /* libjingle_peerconnection_objc.a in Frameworks */,
|
|
||||||
4F995B43173B6938007F179A /* libjingle_peerconnection.a in Frameworks */,
|
|
||||||
4F995B44173B6938007F179A /* libjingle_sound.a in Frameworks */,
|
|
||||||
4F995B45173B6938007F179A /* libjingle.a in Frameworks */,
|
|
||||||
4F995B46173B6938007F179A /* libjsoncpp.a in Frameworks */,
|
|
||||||
4F995B47173B6938007F179A /* libmedia_file.a in Frameworks */,
|
|
||||||
4F995B48173B6938007F179A /* libNetEq.a in Frameworks */,
|
|
||||||
4F995B49173B6938007F179A /* libopenssl.a in Frameworks */,
|
|
||||||
4F995B4A173B6938007F179A /* libopus.a in Frameworks */,
|
|
||||||
4F995B4B173B6938007F179A /* libpaced_sender.a in Frameworks */,
|
|
||||||
4F995B4C173B6938007F179A /* libPCM16B.a in Frameworks */,
|
|
||||||
4F995B4D173B6938007F179A /* libprotobuf_lite.a in Frameworks */,
|
|
||||||
4F995B4E173B6938007F179A /* libremote_bitrate_estimator.a in Frameworks */,
|
|
||||||
4F995B4F173B6938007F179A /* libresampler.a in Frameworks */,
|
|
||||||
4F995B50173B6938007F179A /* librtp_rtcp.a in Frameworks */,
|
|
||||||
4F995B51173B6938007F179A /* libsignal_processing.a in Frameworks */,
|
|
||||||
4F995B52173B6938007F179A /* libsrtp.a in Frameworks */,
|
|
||||||
4F995B53173B6938007F179A /* libsystem_wrappers.a in Frameworks */,
|
|
||||||
4F995B54173B6938007F179A /* libudp_transport.a in Frameworks */,
|
|
||||||
4F995B55173B6938007F179A /* libvad.a in Frameworks */,
|
|
||||||
4F995B56173B6938007F179A /* libvideo_capture_module.a in Frameworks */,
|
|
||||||
4F995B57173B6938007F179A /* libvideo_coding_utility.a in Frameworks */,
|
|
||||||
4F995B58173B6938007F179A /* libvideo_engine_core.a in Frameworks */,
|
|
||||||
4F995B59173B6938007F179A /* libvideo_processing.a in Frameworks */,
|
|
||||||
4F995B5A173B6938007F179A /* libvideo_render_module.a in Frameworks */,
|
|
||||||
4F995B5B173B6938007F179A /* libvoice_engine_core.a in Frameworks */,
|
|
||||||
4F995B5C173B6938007F179A /* libwebrtc_i420.a in Frameworks */,
|
|
||||||
4F995B5D173B6938007F179A /* libwebrtc_opus.a in Frameworks */,
|
|
||||||
4F995B5E173B6938007F179A /* libwebrtc_utility.a in Frameworks */,
|
|
||||||
4F995B5F173B6938007F179A /* libwebrtc_video_coding.a in Frameworks */,
|
|
||||||
4F995B60173B6938007F179A /* libwebrtc_vp8.a in Frameworks */,
|
|
||||||
4F995B3F173B6938007F179A /* libiSACFix.a in Frameworks */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXFrameworksBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
|
||||||
4F1CC122172F52E50090479F /* libs */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
4F995B01173B6937007F179A /* libaudio_coding_module.a */,
|
|
||||||
4F995B02173B6937007F179A /* libaudio_conference_mixer.a */,
|
|
||||||
4F995B03173B6937007F179A /* libaudio_device.a */,
|
|
||||||
4F995B04173B6937007F179A /* libaudio_processing.a */,
|
|
||||||
4F995B05173B6937007F179A /* libaudioproc_debug_proto.a */,
|
|
||||||
4F995B06173B6937007F179A /* libbitrate_controller.a */,
|
|
||||||
4F995B07173B6937007F179A /* libCNG.a */,
|
|
||||||
4F995B08173B6937007F179A /* libcommon_video.a */,
|
|
||||||
4F995B09173B6937007F179A /* libexpat.a */,
|
|
||||||
4F995B0A173B6937007F179A /* libG711.a */,
|
|
||||||
4F995B0B173B6937007F179A /* libG722.a */,
|
|
||||||
4F995B0C173B6937007F179A /* libgunit.a */,
|
|
||||||
4F995B0D173B6937007F179A /* libiLBC.a */,
|
|
||||||
4F995B0E173B6937007F179A /* libiSAC.a */,
|
|
||||||
4F995B0F173B6937007F179A /* libiSACFix.a */,
|
|
||||||
4F995B10173B6937007F179A /* libjingle_media.a */,
|
|
||||||
4F995B11173B6937007F179A /* libjingle_p2p.a */,
|
|
||||||
4F995B12173B6937007F179A /* libjingle_peerconnection_objc.a */,
|
|
||||||
4F995B13173B6937007F179A /* libjingle_peerconnection.a */,
|
|
||||||
4F995B14173B6937007F179A /* libjingle_sound.a */,
|
|
||||||
4F995B15173B6937007F179A /* libjingle.a */,
|
|
||||||
4F995B16173B6937007F179A /* libjsoncpp.a */,
|
|
||||||
4F995B17173B6937007F179A /* libmedia_file.a */,
|
|
||||||
4F995B18173B6937007F179A /* libNetEq.a */,
|
|
||||||
4F995B19173B6937007F179A /* libopenssl.a */,
|
|
||||||
4F995B1A173B6937007F179A /* libopus.a */,
|
|
||||||
4F995B1B173B6937007F179A /* libpaced_sender.a */,
|
|
||||||
4F995B1C173B6937007F179A /* libPCM16B.a */,
|
|
||||||
4F995B1D173B6937007F179A /* libprotobuf_lite.a */,
|
|
||||||
4F995B1E173B6937007F179A /* libremote_bitrate_estimator.a */,
|
|
||||||
4F995B1F173B6937007F179A /* libresampler.a */,
|
|
||||||
4F995B20173B6937007F179A /* librtp_rtcp.a */,
|
|
||||||
4F995B21173B6937007F179A /* libsignal_processing.a */,
|
|
||||||
4F995B22173B6937007F179A /* libsrtp.a */,
|
|
||||||
4F995B23173B6937007F179A /* libsystem_wrappers.a */,
|
|
||||||
4F995B24173B6937007F179A /* libudp_transport.a */,
|
|
||||||
4F995B25173B6937007F179A /* libvad.a */,
|
|
||||||
4F995B26173B6937007F179A /* libvideo_capture_module.a */,
|
|
||||||
4F995B27173B6937007F179A /* libvideo_coding_utility.a */,
|
|
||||||
4F995B28173B6937007F179A /* libvideo_engine_core.a */,
|
|
||||||
4F995B29173B6937007F179A /* libvideo_processing.a */,
|
|
||||||
4F995B2A173B6937007F179A /* libvideo_render_module.a */,
|
|
||||||
4F995B2B173B6937007F179A /* libvoice_engine_core.a */,
|
|
||||||
4F995B2C173B6937007F179A /* libwebrtc_i420.a */,
|
|
||||||
4F995B2D173B6937007F179A /* libwebrtc_opus.a */,
|
|
||||||
4F995B2E173B6937007F179A /* libwebrtc_utility.a */,
|
|
||||||
4F995B2F173B6937007F179A /* libwebrtc_video_coding.a */,
|
|
||||||
4F995B30173B6937007F179A /* libwebrtc_vp8.a */,
|
|
||||||
);
|
|
||||||
name = libs;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
4FBCC0421728E929004C8C0B = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
4FBCC0541728E929004C8C0B /* AppRTCDemo */,
|
|
||||||
4FBCC04D1728E929004C8C0B /* Frameworks */,
|
|
||||||
4F1CC122172F52E50090479F /* libs */,
|
|
||||||
4FBCC04C1728E929004C8C0B /* Products */,
|
|
||||||
);
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
4FBCC04C1728E929004C8C0B /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
4FBCC04B1728E929004C8C0B /* AppRTCDemo.app */,
|
|
||||||
);
|
|
||||||
name = Products;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
4FBCC04D1728E929004C8C0B /* Frameworks */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
4F995B90173C03A1007F179A /* AudioToolbox.framework */,
|
|
||||||
4F995B61173B694B007F179A /* AVFoundation.framework */,
|
|
||||||
4F995B67173B6970007F179A /* CoreAudio.framework */,
|
|
||||||
4FBCC0521728E929004C8C0B /* CoreGraphics.framework */,
|
|
||||||
4F995B63173B6956007F179A /* CoreMedia.framework */,
|
|
||||||
4F995B65173B695C007F179A /* CoreVideo.framework */,
|
|
||||||
4FBCC0501728E929004C8C0B /* Foundation.framework */,
|
|
||||||
4FBCC04E1728E929004C8C0B /* UIKit.framework */,
|
|
||||||
);
|
|
||||||
name = Frameworks;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
4FBCC0541728E929004C8C0B /* AppRTCDemo */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
4FBCC0711729B780004C8C0B /* GAEChannelClient.h */,
|
|
||||||
4FBCC0721729B780004C8C0B /* GAEChannelClient.m */,
|
|
||||||
4FD7F4FF1732E1C1009295E5 /* APPRTCAppClient.h */,
|
|
||||||
4FD7F5001732E1C2009295E5 /* APPRTCAppClient.m */,
|
|
||||||
4FBCC05D1728E929004C8C0B /* APPRTCAppDelegate.h */,
|
|
||||||
4FBCC05E1728E929004C8C0B /* APPRTCAppDelegate.m */,
|
|
||||||
4FBCC0661728E929004C8C0B /* APPRTCViewController.h */,
|
|
||||||
4FBCC0671728E929004C8C0B /* APPRTCViewController.m */,
|
|
||||||
4FBCC0691728E929004C8C0B /* APPRTCViewController.xib */,
|
|
||||||
4FBCC0551728E929004C8C0B /* Supporting Files */,
|
|
||||||
);
|
|
||||||
path = AppRTCDemo;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
4FBCC0551728E929004C8C0B /* Supporting Files */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
4FBCC0561728E929004C8C0B /* AppRTCDemo-Info.plist */,
|
|
||||||
4FBCC05C1728E929004C8C0B /* AppRTCDemo-Prefix.pch */,
|
|
||||||
4FBCC0601728E929004C8C0B /* Default.png */,
|
|
||||||
4FEE3EB61746A3810005814A /* Icon.png */,
|
|
||||||
4FEE3E511743C92D0005814A /* ios_channel.html */,
|
|
||||||
4FBCC05A1728E929004C8C0B /* main.m */,
|
|
||||||
4F995B92173C0819007F179A /* shim.mm */,
|
|
||||||
);
|
|
||||||
name = "Supporting Files";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXGroup section */
|
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
|
||||||
4FBCC04A1728E929004C8C0B /* AppRTCDemo */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = 4FBCC06E1728E929004C8C0B /* Build configuration list for PBXNativeTarget "AppRTCDemo" */;
|
|
||||||
buildPhases = (
|
|
||||||
4FBCC0471728E929004C8C0B /* Sources */,
|
|
||||||
4FBCC0481728E929004C8C0B /* Frameworks */,
|
|
||||||
4FBCC0491728E929004C8C0B /* Resources */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = AppRTCDemo;
|
|
||||||
productName = AppRTCDemo;
|
|
||||||
productReference = 4FBCC04B1728E929004C8C0B /* AppRTCDemo.app */;
|
|
||||||
productType = "com.apple.product-type.application";
|
|
||||||
};
|
|
||||||
/* End PBXNativeTarget section */
|
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
|
||||||
4FBCC0431728E929004C8C0B /* Project object */ = {
|
|
||||||
isa = PBXProject;
|
|
||||||
attributes = {
|
|
||||||
CLASSPREFIX = RTC;
|
|
||||||
LastUpgradeCheck = 0460;
|
|
||||||
ORGANIZATIONNAME = Google;
|
|
||||||
};
|
|
||||||
buildConfigurationList = 4FBCC0461728E929004C8C0B /* Build configuration list for PBXProject "AppRTCDemo" */;
|
|
||||||
compatibilityVersion = "Xcode 3.2";
|
|
||||||
developmentRegion = English;
|
|
||||||
hasScannedForEncodings = 0;
|
|
||||||
knownRegions = (
|
|
||||||
en,
|
|
||||||
);
|
|
||||||
mainGroup = 4FBCC0421728E929004C8C0B;
|
|
||||||
productRefGroup = 4FBCC04C1728E929004C8C0B /* Products */;
|
|
||||||
projectDirPath = "";
|
|
||||||
projectRoot = "";
|
|
||||||
targets = (
|
|
||||||
4FBCC04A1728E929004C8C0B /* AppRTCDemo */,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
/* End PBXProject section */
|
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
|
||||||
4FBCC0491728E929004C8C0B /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
4FEE3E531743C94D0005814A /* ios_channel.html in Resources */,
|
|
||||||
4FBCC0611728E929004C8C0B /* Default.png in Resources */,
|
|
||||||
4FBCC06B1728E929004C8C0B /* APPRTCViewController.xib in Resources */,
|
|
||||||
4FEE3EB71746A3810005814A /* Icon.png in Resources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXResourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
|
||||||
4FBCC0471728E929004C8C0B /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
4FBCC05B1728E929004C8C0B /* main.m in Sources */,
|
|
||||||
4FBCC05F1728E929004C8C0B /* APPRTCAppDelegate.m in Sources */,
|
|
||||||
4FBCC0681728E929004C8C0B /* APPRTCViewController.m in Sources */,
|
|
||||||
4FBCC0731729B780004C8C0B /* GAEChannelClient.m in Sources */,
|
|
||||||
4FD7F5011732E1C2009295E5 /* APPRTCAppClient.m in Sources */,
|
|
||||||
4F995B94173C0B82007F179A /* shim.mm in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXSourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXVariantGroup section */
|
|
||||||
4FBCC0691728E929004C8C0B /* APPRTCViewController.xib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
4FBCC06A1728E929004C8C0B /* en */,
|
|
||||||
);
|
|
||||||
name = APPRTCViewController.xib;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXVariantGroup section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
|
||||||
4FBCC06C1728E929004C8C0B /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
|
||||||
COPY_PHASE_STRIP = NO;
|
|
||||||
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_ABOUT_RETURN_TYPE = YES;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 6.1;
|
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
4FBCC06D1728E929004C8C0B /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
|
||||||
CLANG_CXX_LIBRARY = "libc++";
|
|
||||||
CLANG_ENABLE_OBJC_ARC = YES;
|
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
|
||||||
COPY_PHASE_STRIP = YES;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
|
||||||
GCC_WARN_UNINITIALIZED_AUTOS = YES;
|
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 6.1;
|
|
||||||
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
VALIDATE_PRODUCT = YES;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
4FBCC06F1728E929004C8C0B /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)";
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "compiler-default";
|
|
||||||
CLANG_CXX_LIBRARY = "compiler-default";
|
|
||||||
GCC_CW_ASM_SYNTAX = NO;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = c99;
|
|
||||||
GCC_ENABLE_CPP_EXCEPTIONS = NO;
|
|
||||||
GCC_ENABLE_CPP_RTTI = NO;
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "AppRTCDemo/AppRTCDemo-Prefix.pch";
|
|
||||||
GCC_THREADSAFE_STATICS = NO;
|
|
||||||
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
|
|
||||||
HEADER_SEARCH_PATHS = (
|
|
||||||
../../app/webrtc/objc/public,
|
|
||||||
../../..,
|
|
||||||
);
|
|
||||||
INFOPLIST_FILE = "AppRTCDemo/AppRTCDemo-Info.plist";
|
|
||||||
LIBRARY_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"\"$(SRCROOT)/libs\"",
|
|
||||||
);
|
|
||||||
ONLY_ACTIVE_ARCH = NO;
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
VALID_ARCHS = "armv7 i386";
|
|
||||||
WRAPPER_EXTENSION = app;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
4FBCC0701728E929004C8C0B /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ARCHS = "$(ARCHS_UNIVERSAL_IPHONE_OS)";
|
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "compiler-default";
|
|
||||||
CLANG_CXX_LIBRARY = "compiler-default";
|
|
||||||
GCC_CW_ASM_SYNTAX = NO;
|
|
||||||
GCC_C_LANGUAGE_STANDARD = c99;
|
|
||||||
GCC_ENABLE_CPP_EXCEPTIONS = NO;
|
|
||||||
GCC_ENABLE_CPP_RTTI = NO;
|
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = YES;
|
|
||||||
GCC_PREFIX_HEADER = "AppRTCDemo/AppRTCDemo-Prefix.pch";
|
|
||||||
GCC_THREADSAFE_STATICS = NO;
|
|
||||||
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
|
|
||||||
HEADER_SEARCH_PATHS = (
|
|
||||||
../../app/webrtc/objc/public,
|
|
||||||
../../..,
|
|
||||||
);
|
|
||||||
INFOPLIST_FILE = "AppRTCDemo/AppRTCDemo-Info.plist";
|
|
||||||
LIBRARY_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"\"$(SRCROOT)/libs\"",
|
|
||||||
);
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
VALID_ARCHS = "armv7 i386";
|
|
||||||
WRAPPER_EXTENSION = app;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
/* End XCBuildConfiguration section */
|
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
|
||||||
4FBCC0461728E929004C8C0B /* Build configuration list for PBXProject "AppRTCDemo" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
4FBCC06C1728E929004C8C0B /* Debug */,
|
|
||||||
4FBCC06D1728E929004C8C0B /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
4FBCC06E1728E929004C8C0B /* Build configuration list for PBXNativeTarget "AppRTCDemo" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
4FBCC06F1728E929004C8C0B /* Debug */,
|
|
||||||
4FBCC0701728E929004C8C0B /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
/* End XCConfigurationList section */
|
|
||||||
};
|
|
||||||
rootObject = 4FBCC0431728E929004C8C0B /* Project object */;
|
|
||||||
}
|
|
@ -29,10 +29,10 @@
|
|||||||
|
|
||||||
#import "GAEChannelClient.h"
|
#import "GAEChannelClient.h"
|
||||||
|
|
||||||
// Called when there are RTCIceServers.
|
// Called when there are RTCICEServers.
|
||||||
@protocol IceServerDelegate <NSObject>
|
@protocol ICEServerDelegate<NSObject>
|
||||||
|
|
||||||
- (void)onIceServers:(NSArray *)servers;
|
- (void)onICEServers:(NSArray*)servers;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@ -45,8 +45,8 @@
|
|||||||
// for the registered handler to be called with received messages.
|
// for the registered handler to be called with received messages.
|
||||||
@interface APPRTCAppClient : NSObject<NSURLConnectionDataDelegate>
|
@interface APPRTCAppClient : NSObject<NSURLConnectionDataDelegate>
|
||||||
|
|
||||||
@property(nonatomic, assign) id<IceServerDelegate>iceServerDelegate;
|
@property(nonatomic, assign) id<ICEServerDelegate> ICEServerDelegate;
|
||||||
@property(nonatomic, assign) id<GAEMessageHandler>messageHandler;
|
@property(nonatomic, assign) id<GAEMessageHandler> messageHandler;
|
||||||
|
|
||||||
- (void)connectToRoom:(NSURL *)room;
|
- (void)connectToRoom:(NSURL *)room;
|
||||||
- (void)sendData:(NSData *)data;
|
- (void)sendData:(NSData *)data;
|
||||||
|
@ -30,16 +30,16 @@
|
|||||||
#import <dispatch/dispatch.h>
|
#import <dispatch/dispatch.h>
|
||||||
|
|
||||||
#import "GAEChannelClient.h"
|
#import "GAEChannelClient.h"
|
||||||
#import "RTCIceServer.h"
|
#import "RTCICEServer.h"
|
||||||
|
|
||||||
@interface APPRTCAppClient ()
|
@interface APPRTCAppClient ()
|
||||||
|
|
||||||
@property(nonatomic, strong) dispatch_queue_t backgroundQueue;
|
@property(nonatomic, assign) dispatch_queue_t backgroundQueue;
|
||||||
@property(nonatomic, copy) NSString *baseURL;
|
@property(nonatomic, copy) NSString *baseURL;
|
||||||
@property(nonatomic, strong) GAEChannelClient *gaeChannel;
|
@property(nonatomic, strong) GAEChannelClient *gaeChannel;
|
||||||
@property(nonatomic, copy) NSString *postMessageUrl;
|
@property(nonatomic, copy) NSString *postMessageUrl;
|
||||||
@property(nonatomic, copy) NSString *pcConfig;
|
@property(nonatomic, copy) NSString *pcConfig;
|
||||||
@property(nonatomic, strong) NSMutableString *receivedData;
|
@property(nonatomic, strong) NSMutableString *roomHtml;
|
||||||
@property(atomic, strong) NSMutableArray *sendQueue;
|
@property(atomic, strong) NSMutableArray *sendQueue;
|
||||||
@property(nonatomic, copy) NSString *token;
|
@property(nonatomic, copy) NSString *token;
|
||||||
|
|
||||||
@ -52,13 +52,18 @@
|
|||||||
- (id)init {
|
- (id)init {
|
||||||
if (self = [super init]) {
|
if (self = [super init]) {
|
||||||
_backgroundQueue = dispatch_queue_create("RTCBackgroundQueue", NULL);
|
_backgroundQueue = dispatch_queue_create("RTCBackgroundQueue", NULL);
|
||||||
|
dispatch_retain(_backgroundQueue);
|
||||||
_sendQueue = [NSMutableArray array];
|
_sendQueue = [NSMutableArray array];
|
||||||
// Uncomment to see Request/Response logging.
|
// Uncomment to see Request/Response logging.
|
||||||
//_verboseLogging = YES;
|
// _verboseLogging = YES;
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)dealloc {
|
||||||
|
dispatch_release(_backgroundQueue);
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark - Public methods
|
#pragma mark - Public methods
|
||||||
|
|
||||||
- (void)connectToRoom:(NSURL *)url {
|
- (void)connectToRoom:(NSURL *)url {
|
||||||
@ -76,42 +81,41 @@
|
|||||||
|
|
||||||
#pragma mark - Internal methods
|
#pragma mark - Internal methods
|
||||||
|
|
||||||
- (NSTextCheckingResult *)findMatch:(NSString *)regexpPattern
|
- (NSString*)findVar:(NSString*)name
|
||||||
withString:(NSString *)string
|
strippingQuotes:(BOOL)strippingQuotes {
|
||||||
errorMessage:(NSString *)errorMessage {
|
NSError* error;
|
||||||
NSError *error;
|
NSString* pattern =
|
||||||
|
[NSString stringWithFormat:@".*\n *var %@ = ([^\n]*);\n.*", name];
|
||||||
NSRegularExpression *regexp =
|
NSRegularExpression *regexp =
|
||||||
[NSRegularExpression regularExpressionWithPattern:regexpPattern
|
[NSRegularExpression regularExpressionWithPattern:pattern
|
||||||
options:0
|
options:0
|
||||||
error:&error];
|
error:&error];
|
||||||
if (error) {
|
NSAssert(!error, @"Unexpected error compiling regex: ",
|
||||||
[self maybeLogMessage:
|
error.localizedDescription);
|
||||||
[NSString stringWithFormat:@"Failed to create regexp - %@",
|
|
||||||
[error description]]];
|
NSRange fullRange = NSMakeRange(0, [self.roomHtml length]);
|
||||||
|
NSArray *matches =
|
||||||
|
[regexp matchesInString:self.roomHtml options:0 range:fullRange];
|
||||||
|
if ([matches count] != 1) {
|
||||||
|
[self showMessage:[NSString stringWithFormat:@"%d matches for %@ in %@",
|
||||||
|
[matches count], name, self.roomHtml]];
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
NSRange fullRange = NSMakeRange(0, [string length]);
|
NSRange matchRange = [matches[0] rangeAtIndex:1];
|
||||||
NSArray *matches = [regexp matchesInString:string options:0 range:fullRange];
|
NSString* value = [self.roomHtml substringWithRange:matchRange];
|
||||||
if ([matches count] == 0) {
|
if (strippingQuotes) {
|
||||||
if ([errorMessage length] > 0) {
|
NSAssert([value length] > 2,
|
||||||
[self maybeLogMessage:string];
|
@"Can't strip quotes from short string: [%@]", value);
|
||||||
[self showMessage:
|
NSAssert(([value characterAtIndex:0] == '\'' &&
|
||||||
[NSString stringWithFormat:@"Missing %@ in HTML.", errorMessage]];
|
[value characterAtIndex:[value length] - 1] == '\''),
|
||||||
}
|
@"Can't strip quotes from unquoted string: [%@]", value);
|
||||||
return nil;
|
value = [value substringWithRange:NSMakeRange(1, [value length] - 2)];
|
||||||
} else if ([matches count] > 1) {
|
|
||||||
if ([errorMessage length] > 0) {
|
|
||||||
[self maybeLogMessage:string];
|
|
||||||
[self showMessage:[NSString stringWithFormat:@"Too many %@s in HTML.",
|
|
||||||
errorMessage]];
|
|
||||||
}
|
|
||||||
return nil;
|
|
||||||
}
|
}
|
||||||
return matches[0];
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSURLRequest *)getRequestFromUrl:(NSURL *)url {
|
- (NSURLRequest *)getRequestFromUrl:(NSURL *)url {
|
||||||
self.receivedData = [NSMutableString stringWithCapacity:20000];
|
self.roomHtml = [NSMutableString stringWithCapacity:20000];
|
||||||
NSString *path =
|
NSString *path =
|
||||||
[NSString stringWithFormat:@"https:%@", [url resourceSpecifier]];
|
[NSString stringWithFormat:@"https:%@", [url resourceSpecifier]];
|
||||||
NSURLRequest *request =
|
NSURLRequest *request =
|
||||||
@ -172,10 +176,10 @@
|
|||||||
[alertView show];
|
[alertView show];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)updateIceServers:(NSMutableArray *)iceServers
|
- (void)updateICEServers:(NSMutableArray *)ICEServers
|
||||||
withTurnServer:(NSString *)turnServerUrl {
|
withTurnServer:(NSString *)turnServerUrl {
|
||||||
if ([turnServerUrl length] < 1) {
|
if ([turnServerUrl length] < 1) {
|
||||||
[self.iceServerDelegate onIceServers:iceServers];
|
[self.ICEServerDelegate onICEServers:ICEServers];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
dispatch_async(self.backgroundQueue, ^(void) {
|
dispatch_async(self.backgroundQueue, ^(void) {
|
||||||
@ -199,16 +203,16 @@
|
|||||||
NSString *password = json[@"password"];
|
NSString *password = json[@"password"];
|
||||||
NSString *fullUrl =
|
NSString *fullUrl =
|
||||||
[NSString stringWithFormat:@"turn:%@@%@", username, turnServer];
|
[NSString stringWithFormat:@"turn:%@@%@", username, turnServer];
|
||||||
RTCIceServer *iceServer =
|
RTCICEServer *ICEServer =
|
||||||
[[RTCIceServer alloc] initWithUri:[NSURL URLWithString:fullUrl]
|
[[RTCICEServer alloc] initWithURI:[NSURL URLWithString:fullUrl]
|
||||||
password:password];
|
password:password];
|
||||||
[iceServers addObject:iceServer];
|
[ICEServers addObject:ICEServer];
|
||||||
} else {
|
} else {
|
||||||
NSLog(@"Unable to get TURN server. Error: %@", error.description);
|
NSLog(@"Unable to get TURN server. Error: %@", error.description);
|
||||||
}
|
}
|
||||||
|
|
||||||
dispatch_async(dispatch_get_main_queue(), ^(void) {
|
dispatch_async(dispatch_get_main_queue(), ^(void) {
|
||||||
[self.iceServerDelegate onIceServers:iceServers];
|
[self.ICEServerDelegate onICEServers:ICEServers];
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -219,7 +223,7 @@
|
|||||||
NSString *roomHtml = [NSString stringWithUTF8String:[data bytes]];
|
NSString *roomHtml = [NSString stringWithUTF8String:[data bytes]];
|
||||||
[self maybeLogMessage:
|
[self maybeLogMessage:
|
||||||
[NSString stringWithFormat:@"Received %d chars", [roomHtml length]]];
|
[NSString stringWithFormat:@"Received %d chars", [roomHtml length]]];
|
||||||
[self.receivedData appendString:roomHtml];
|
[self.roomHtml appendString:roomHtml];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)connection:(NSURLConnection *)connection
|
- (void)connection:(NSURLConnection *)connection
|
||||||
@ -237,64 +241,48 @@
|
|||||||
|
|
||||||
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
|
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
|
||||||
[self maybeLogMessage:[NSString stringWithFormat:@"finished loading %d chars",
|
[self maybeLogMessage:[NSString stringWithFormat:@"finished loading %d chars",
|
||||||
[self.receivedData length]]];
|
[self.roomHtml length]]];
|
||||||
NSTextCheckingResult *result =
|
NSRegularExpression* fullRegex =
|
||||||
[self findMatch:@".*\n *Sorry, this room is full\\..*"
|
[NSRegularExpression regularExpressionWithPattern:@"room is full"
|
||||||
withString:self.receivedData
|
options:0
|
||||||
errorMessage:nil];
|
error:nil];
|
||||||
if (result) {
|
if ([fullRegex numberOfMatchesInString:self.roomHtml
|
||||||
|
options:0
|
||||||
|
range:NSMakeRange(0, [self.roomHtml length])]) {
|
||||||
[self showMessage:@"Room full"];
|
[self showMessage:@"Room full"];
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
NSString *fullUrl = [[[connection originalRequest] URL] absoluteString];
|
NSString *fullUrl = [[[connection originalRequest] URL] absoluteString];
|
||||||
NSRange queryRange = [fullUrl rangeOfString:@"?"];
|
NSRange queryRange = [fullUrl rangeOfString:@"?"];
|
||||||
self.baseURL = [fullUrl substringToIndex:queryRange.location];
|
self.baseURL = [fullUrl substringToIndex:queryRange.location];
|
||||||
[self maybeLogMessage:[NSString stringWithFormat:@"URL\n%@", self.baseURL]];
|
[self maybeLogMessage:[NSString stringWithFormat:@"Base URL: %@", self.baseURL]];
|
||||||
|
|
||||||
result = [self findMatch:@".*\n *openChannel\\('([^']*)'\\);\n.*"
|
self.token = [self findVar:@"channelToken" strippingQuotes:YES];
|
||||||
withString:self.receivedData
|
if (!self.token)
|
||||||
errorMessage:@"channel token"];
|
|
||||||
if (!result) {
|
|
||||||
return;
|
return;
|
||||||
}
|
[self maybeLogMessage:[NSString stringWithFormat:@"Token: %@", self.token]];
|
||||||
self.token = [self.receivedData substringWithRange:[result rangeAtIndex:1]];
|
|
||||||
[self maybeLogMessage:[NSString stringWithFormat:@"Token\n%@", self.token]];
|
|
||||||
|
|
||||||
result =
|
NSString* roomKey = [self findVar:@"roomKey" strippingQuotes:YES];
|
||||||
[self findMatch:@".*\n *path = '/(message\\?r=.+)' \\+ '(&u=[0-9]+)';\n.*"
|
NSString* me = [self findVar:@"me" strippingQuotes:YES];
|
||||||
withString:self.receivedData
|
if (!roomKey || !me)
|
||||||
errorMessage:@"postMessage URL"];
|
|
||||||
if (!result) {
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
self.postMessageUrl =
|
self.postMessageUrl =
|
||||||
[NSString stringWithFormat:@"%@%@",
|
[NSString stringWithFormat:@"/message?r=%@&u=%@", roomKey, me];
|
||||||
[self.receivedData substringWithRange:[result rangeAtIndex:1]],
|
[self maybeLogMessage:[NSString stringWithFormat:@"POST message URL: %@",
|
||||||
[self.receivedData substringWithRange:[result rangeAtIndex:2]]];
|
self.postMessageUrl]];
|
||||||
[self maybeLogMessage:[NSString stringWithFormat:@"POST message URL\n%@",
|
|
||||||
self.postMessageUrl]];
|
|
||||||
|
|
||||||
result = [self findMatch:@".*\n *var pc_config = (\\{[^\n]*\\});\n.*"
|
NSString* pcConfig = [self findVar:@"pcConfig" strippingQuotes:NO];
|
||||||
withString:self.receivedData
|
if (!pcConfig)
|
||||||
errorMessage:@"pc_config"];
|
|
||||||
if (!result) {
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
NSString *pcConfig =
|
|
||||||
[self.receivedData substringWithRange:[result rangeAtIndex:1]];
|
|
||||||
[self maybeLogMessage:
|
[self maybeLogMessage:
|
||||||
[NSString stringWithFormat:@"PC Config JSON\n%@", pcConfig]];
|
[NSString stringWithFormat:@"PC Config JSON: %@", pcConfig]];
|
||||||
|
|
||||||
result = [self findMatch:@".*\n *requestTurn\\('([^\n]*)'\\);\n.*"
|
NSString *turnServerUrl = [self findVar:@"turnUrl" strippingQuotes:YES];
|
||||||
withString:self.receivedData
|
if (turnServerUrl) {
|
||||||
errorMessage:@"channel token"];
|
|
||||||
NSString *turnServerUrl;
|
|
||||||
if (result) {
|
|
||||||
turnServerUrl =
|
|
||||||
[self.receivedData substringWithRange:[result rangeAtIndex:1]];
|
|
||||||
[self maybeLogMessage:
|
[self maybeLogMessage:
|
||||||
[NSString stringWithFormat:@"TURN server request URL\n%@",
|
[NSString stringWithFormat:@"TURN server request URL: %@",
|
||||||
turnServerUrl]];
|
turnServerUrl]];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -303,8 +291,8 @@
|
|||||||
NSDictionary *json =
|
NSDictionary *json =
|
||||||
[NSJSONSerialization JSONObjectWithData:pcData options:0 error:&error];
|
[NSJSONSerialization JSONObjectWithData:pcData options:0 error:&error];
|
||||||
NSAssert(!error, @"Unable to parse. %@", error.localizedDescription);
|
NSAssert(!error, @"Unable to parse. %@", error.localizedDescription);
|
||||||
NSArray *servers = [json objectForKey:@"iceServers"];
|
NSArray *servers = [json objectForKey:@"ICEServers"];
|
||||||
NSMutableArray *iceServers = [NSMutableArray array];
|
NSMutableArray *ICEServers = [NSMutableArray array];
|
||||||
for (NSDictionary *server in servers) {
|
for (NSDictionary *server in servers) {
|
||||||
NSString *url = [server objectForKey:@"url"];
|
NSString *url = [server objectForKey:@"url"];
|
||||||
NSString *credential = [server objectForKey:@"credential"];
|
NSString *credential = [server objectForKey:@"credential"];
|
||||||
@ -315,12 +303,12 @@
|
|||||||
[NSString stringWithFormat:@"url [%@] - credential [%@]",
|
[NSString stringWithFormat:@"url [%@] - credential [%@]",
|
||||||
url,
|
url,
|
||||||
credential]];
|
credential]];
|
||||||
RTCIceServer *iceServer =
|
RTCICEServer *ICEServer =
|
||||||
[[RTCIceServer alloc] initWithUri:[NSURL URLWithString:url]
|
[[RTCICEServer alloc] initWithURI:[NSURL URLWithString:url]
|
||||||
password:credential];
|
password:credential];
|
||||||
[iceServers addObject:iceServer];
|
[ICEServers addObject:ICEServer];
|
||||||
}
|
}
|
||||||
[self updateIceServers:iceServers withTurnServer:turnServerUrl];
|
[self updateICEServers:ICEServers withTurnServer:turnServerUrl];
|
||||||
|
|
||||||
[self maybeLogMessage:
|
[self maybeLogMessage:
|
||||||
[NSString stringWithFormat:@"About to open GAE with token: %@",
|
[NSString stringWithFormat:@"About to open GAE with token: %@",
|
||||||
|
@ -43,9 +43,11 @@
|
|||||||
// The main application class of the AppRTCDemo iOS app demonstrating
|
// The main application class of the AppRTCDemo iOS app demonstrating
|
||||||
// interoperability between the Objcective C implementation of PeerConnection
|
// interoperability between the Objcective C implementation of PeerConnection
|
||||||
// and the apprtc.appspot.com demo webapp.
|
// and the apprtc.appspot.com demo webapp.
|
||||||
@interface APPRTCAppDelegate : UIResponder<IceServerDelegate,
|
@interface APPRTCAppDelegate : UIResponder<ICEServerDelegate,
|
||||||
GAEMessageHandler, APPRTCSendMessage, RTCSessionDescriptonDelegate,
|
GAEMessageHandler,
|
||||||
UIApplicationDelegate>
|
APPRTCSendMessage,
|
||||||
|
RTCSessionDescriptonDelegate,
|
||||||
|
UIApplicationDelegate>
|
||||||
|
|
||||||
@property (strong, nonatomic) UIWindow *window;
|
@property (strong, nonatomic) UIWindow *window;
|
||||||
@property (strong, nonatomic) APPRTCViewController *viewController;
|
@property (strong, nonatomic) APPRTCViewController *viewController;
|
||||||
|
@ -28,8 +28,8 @@
|
|||||||
#import "APPRTCAppDelegate.h"
|
#import "APPRTCAppDelegate.h"
|
||||||
|
|
||||||
#import "APPRTCViewController.h"
|
#import "APPRTCViewController.h"
|
||||||
#import "RTCIceCandidate.h"
|
#import "RTCICECandidate.h"
|
||||||
#import "RTCIceServer.h"
|
#import "RTCICEServer.h"
|
||||||
#import "RTCMediaConstraints.h"
|
#import "RTCMediaConstraints.h"
|
||||||
#import "RTCMediaStream.h"
|
#import "RTCMediaStream.h"
|
||||||
#import "RTCPair.h"
|
#import "RTCPair.h"
|
||||||
@ -61,12 +61,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
||||||
onSignalingStateChange:(RTCSignalingState)stateChanged {
|
signalingStateChanged:(RTCSignalingState)stateChanged {
|
||||||
NSLog(@"PCO onSignalingStateChange.");
|
NSLog(@"PCO onSignalingStateChange.");
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
||||||
onAddStream:(RTCMediaStream *)stream {
|
addedStream:(RTCMediaStream *)stream {
|
||||||
NSLog(@"PCO onAddStream.");
|
NSLog(@"PCO onAddStream.");
|
||||||
dispatch_async(dispatch_get_main_queue(), ^(void) {
|
dispatch_async(dispatch_get_main_queue(), ^(void) {
|
||||||
NSAssert([stream.audioTracks count] >= 1,
|
NSAssert([stream.audioTracks count] >= 1,
|
||||||
@ -78,7 +78,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
||||||
onRemoveStream:(RTCMediaStream *)stream {
|
removedStream:(RTCMediaStream *)stream {
|
||||||
NSLog(@"PCO onRemoveStream.");
|
NSLog(@"PCO onRemoveStream.");
|
||||||
// TODO(hughv): Remove video track.
|
// TODO(hughv): Remove video track.
|
||||||
}
|
}
|
||||||
@ -90,8 +90,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
||||||
onIceCandidate:(RTCIceCandidate *)candidate {
|
gotICECandidate:(RTCICECandidate *)candidate {
|
||||||
NSLog(@"PCO onIceCandidate.\n Mid[%@] Index[%d] Sdp[%@]",
|
NSLog(@"PCO onICECandidate.\n Mid[%@] Index[%d] Sdp[%@]",
|
||||||
candidate.sdpMid,
|
candidate.sdpMid,
|
||||||
candidate.sdpMLineIndex,
|
candidate.sdpMLineIndex,
|
||||||
candidate.sdp);
|
candidate.sdp);
|
||||||
@ -112,12 +112,12 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
||||||
onIceGatheringChange:(RTCIceGatheringState)newState {
|
iceGatheringChanged:(RTCICEGatheringState)newState {
|
||||||
NSLog(@"PCO onIceGatheringChange. %d", newState);
|
NSLog(@"PCO onIceGatheringChange. %d", newState);
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
||||||
onIceConnectionChange:(RTCIceConnectionState)newState {
|
iceConnectionChanged:(RTCICEConnectionState)newState {
|
||||||
NSLog(@"PCO onIceConnectionChange. %d", newState);
|
NSLog(@"PCO onIceConnectionChange. %d", newState);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,9 +139,10 @@
|
|||||||
|
|
||||||
- (BOOL)application:(UIApplication *)application
|
- (BOOL)application:(UIApplication *)application
|
||||||
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
||||||
|
[RTCPeerConnectionFactory initializeSSL];
|
||||||
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
|
||||||
self.viewController =
|
self.viewController =
|
||||||
[[APPRTCViewController alloc] initWithNibName:@"RTCViewController"
|
[[APPRTCViewController alloc] initWithNibName:@"APPRTCViewController"
|
||||||
bundle:nil];
|
bundle:nil];
|
||||||
self.window.rootViewController = self.viewController;
|
self.window.rootViewController = self.viewController;
|
||||||
[self.window makeKeyAndVisible];
|
[self.window makeKeyAndVisible];
|
||||||
@ -174,7 +175,7 @@
|
|||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
self.client = [[APPRTCAppClient alloc] init];
|
self.client = [[APPRTCAppClient alloc] init];
|
||||||
self.client.iceServerDelegate = self;
|
self.client.ICEServerDelegate = self;
|
||||||
self.client.messageHandler = self;
|
self.client.messageHandler = self;
|
||||||
[self.client connectToRoom:url];
|
[self.client connectToRoom:url];
|
||||||
return YES;
|
return YES;
|
||||||
@ -191,23 +192,23 @@
|
|||||||
[self.client sendData:data];
|
[self.client sendData:data];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - IceServerDelegate method
|
#pragma mark - ICEServerDelegate method
|
||||||
|
|
||||||
- (void)onIceServers:(NSArray *)servers {
|
- (void)onICEServers:(NSArray *)servers {
|
||||||
self.queuedRemoteCandidates = [NSMutableArray array];
|
self.queuedRemoteCandidates = [NSMutableArray array];
|
||||||
self.peerConnectionFactory = [[RTCPeerConnectionFactory alloc] init];
|
self.peerConnectionFactory = [[RTCPeerConnectionFactory alloc] init];
|
||||||
RTCMediaConstraints *constraints = [[RTCMediaConstraints alloc] init];
|
RTCMediaConstraints *constraints = [[RTCMediaConstraints alloc] init];
|
||||||
self.pcObserver = [[PCObserver alloc] initWithDelegate:self];
|
self.pcObserver = [[PCObserver alloc] initWithDelegate:self];
|
||||||
self.peerConnection =
|
self.peerConnection =
|
||||||
[self.peerConnectionFactory peerConnectionWithIceServers:servers
|
[self.peerConnectionFactory peerConnectionWithICEServers:servers
|
||||||
constraints:constraints
|
constraints:constraints
|
||||||
delegate:self.pcObserver];
|
delegate:self.pcObserver];
|
||||||
RTCMediaStream *lms =
|
RTCMediaStream *lms =
|
||||||
[self.peerConnectionFactory mediaStreamWithLabel:@"ARDAMS"];
|
[self.peerConnectionFactory mediaStreamWithLabel:@"ARDAMS"];
|
||||||
// TODO(hughv): Add video.
|
// TODO(hughv): Add video.
|
||||||
[lms addAudioTrack:[self.peerConnectionFactory audioTrackWithId:@"ARDAMSa0"]];
|
[lms addAudioTrack:[self.peerConnectionFactory audioTrackWithID:@"ARDAMSa0"]];
|
||||||
[self.peerConnection addStream:lms withConstraints:constraints];
|
[self.peerConnection addStream:lms constraints:constraints];
|
||||||
[self displayLogMessage:@"onIceServers - add local stream."];
|
[self displayLogMessage:@"onICEServers - add local stream."];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - GAEMessageHandler methods
|
#pragma mark - GAEMessageHandler methods
|
||||||
@ -245,14 +246,14 @@
|
|||||||
NSString *mid = [objects objectForKey:@"id"];
|
NSString *mid = [objects objectForKey:@"id"];
|
||||||
NSNumber *sdpLineIndex = [objects objectForKey:@"label"];
|
NSNumber *sdpLineIndex = [objects objectForKey:@"label"];
|
||||||
NSString *sdp = [objects objectForKey:@"candidate"];
|
NSString *sdp = [objects objectForKey:@"candidate"];
|
||||||
RTCIceCandidate *candidate =
|
RTCICECandidate *candidate =
|
||||||
[[RTCIceCandidate alloc] initWithMid:mid
|
[[RTCICECandidate alloc] initWithMid:mid
|
||||||
index:sdpLineIndex.intValue
|
index:sdpLineIndex.intValue
|
||||||
sdp:sdp];
|
sdp:sdp];
|
||||||
if (self.queuedRemoteCandidates) {
|
if (self.queuedRemoteCandidates) {
|
||||||
[self.queuedRemoteCandidates addObject:candidate];
|
[self.queuedRemoteCandidates addObject:candidate];
|
||||||
} else {
|
} else {
|
||||||
[self.peerConnection addIceCandidate:candidate];
|
[self.peerConnection addICECandidate:candidate];
|
||||||
}
|
}
|
||||||
} else if (([value compare:@"offer"] == NSOrderedSame) ||
|
} else if (([value compare:@"offer"] == NSOrderedSame) ||
|
||||||
([value compare:@"answer"] == NSOrderedSame)) {
|
([value compare:@"answer"] == NSOrderedSame)) {
|
||||||
@ -283,8 +284,8 @@
|
|||||||
#pragma mark - RTCSessionDescriptonDelegate methods
|
#pragma mark - RTCSessionDescriptonDelegate methods
|
||||||
|
|
||||||
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
||||||
createSessionDescriptionCompleted:(RTCSessionDescription *)sdp
|
didCreateSessionDescription:(RTCSessionDescription *)sdp
|
||||||
withError:(NSError *)error {
|
error:(NSError *)error {
|
||||||
if (error) {
|
if (error) {
|
||||||
[self displayLogMessage:@"SDP onFailure."];
|
[self displayLogMessage:@"SDP onFailure."];
|
||||||
NSAssert(NO, error.description);
|
NSAssert(NO, error.description);
|
||||||
@ -308,7 +309,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
- (void)peerConnection:(RTCPeerConnection *)peerConnection
|
||||||
setSessionDescriptionCompletedWithError:(NSError *)error {
|
didSetSessionDescriptionWithError:(NSError *)error {
|
||||||
if (error) {
|
if (error) {
|
||||||
[self displayLogMessage:@"SDP onFailure."];
|
[self displayLogMessage:@"SDP onFailure."];
|
||||||
NSAssert(NO, error.description);
|
NSAssert(NO, error.description);
|
||||||
@ -333,14 +334,15 @@
|
|||||||
self.peerConnection = nil;
|
self.peerConnection = nil;
|
||||||
self.peerConnectionFactory = nil;
|
self.peerConnectionFactory = nil;
|
||||||
self.pcObserver = nil;
|
self.pcObserver = nil;
|
||||||
self.client.iceServerDelegate = nil;
|
self.client.ICEServerDelegate = nil;
|
||||||
self.client.messageHandler = nil;
|
self.client.messageHandler = nil;
|
||||||
self.client = nil;
|
self.client = nil;
|
||||||
|
[RTCPeerConnectionFactory deinitializeSSL];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)drainRemoteCandidates {
|
- (void)drainRemoteCandidates {
|
||||||
for (RTCIceCandidate *candidate in self.queuedRemoteCandidates) {
|
for (RTCICECandidate *candidate in self.queuedRemoteCandidates) {
|
||||||
[self.peerConnection addIceCandidate:candidate];
|
[self.peerConnection addICECandidate:candidate];
|
||||||
}
|
}
|
||||||
self.queuedRemoteCandidates = nil;
|
self.queuedRemoteCandidates = nil;
|
||||||
}
|
}
|
||||||
|
@ -1,71 +0,0 @@
|
|||||||
<?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>CFBundleDisplayName</key>
|
|
||||||
<string>${PRODUCT_NAME}</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>${EXECUTABLE_NAME}</string>
|
|
||||||
<key>CFBundleIcons</key>
|
|
||||||
<dict>
|
|
||||||
<key>CFBundlePrimaryIcon</key>
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleIconFiles</key>
|
|
||||||
<array>
|
|
||||||
<string>Icon.png</string>
|
|
||||||
</array>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>com.Google.${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>CFBundleURLTypes</key>
|
|
||||||
<array>
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleTypeRole</key>
|
|
||||||
<string>Editor</string>
|
|
||||||
<key>CFBundleURLName</key>
|
|
||||||
<string>com.google.apprtcdemo</string>
|
|
||||||
<key>CFBundleURLSchemes</key>
|
|
||||||
<array>
|
|
||||||
<string>apprtc</string>
|
|
||||||
</array>
|
|
||||||
</dict>
|
|
||||||
</array>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>1.0</string>
|
|
||||||
<key>LSRequiresIPhoneOS</key>
|
|
||||||
<true/>
|
|
||||||
<key>UIRequiredDeviceCapabilities</key>
|
|
||||||
<array>
|
|
||||||
<string>armv7</string>
|
|
||||||
</array>
|
|
||||||
<key>UIStatusBarTintParameters</key>
|
|
||||||
<dict>
|
|
||||||
<key>UINavigationBar</key>
|
|
||||||
<dict>
|
|
||||||
<key>Style</key>
|
|
||||||
<string>UIBarStyleDefault</string>
|
|
||||||
<key>Translucent</key>
|
|
||||||
<false/>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
<key>UISupportedInterfaceOrientations</key>
|
|
||||||
<array>
|
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
||||||
</array>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
77
talk/examples/ios/AppRTCDemo/Info.plist
Normal file
77
talk/examples/ios/AppRTCDemo/Info.plist
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
<?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>BuildMachineOSBuild</key>
|
||||||
|
<string>12E55</string>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>en</string>
|
||||||
|
<key>CFBundleDisplayName</key>
|
||||||
|
<string>AppRTCDemo</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>AppRTCDemo</string>
|
||||||
|
<key>CFBundleIcons</key>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundlePrimaryIcon</key>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleIconFiles</key>
|
||||||
|
<array>
|
||||||
|
<string>Icon.png</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>com.google.AppRTCDemo</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>AppRTCDemo</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>APPL</string>
|
||||||
|
<key>CFBundleResourceSpecification</key>
|
||||||
|
<string>ResourceRules.plist</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleSupportedPlatforms</key>
|
||||||
|
<array>
|
||||||
|
<string>iPhoneOS</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleURLTypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Editor</string>
|
||||||
|
<key>CFBundleURLName</key>
|
||||||
|
<string>com.google.apprtcdemo</string>
|
||||||
|
<key>CFBundleURLSchemes</key>
|
||||||
|
<array>
|
||||||
|
<string>apprtc</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>1.0</string>
|
||||||
|
<key>UIRequiredDeviceCapabilities</key>
|
||||||
|
<array>
|
||||||
|
<string>armv7</string>
|
||||||
|
</array>
|
||||||
|
<key>UIStatusBarTintParameters</key>
|
||||||
|
<dict>
|
||||||
|
<key>UINavigationBar</key>
|
||||||
|
<dict>
|
||||||
|
<key>Style</key>
|
||||||
|
<string>UIBarStyleDefault</string>
|
||||||
|
<key>Translucent</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>UISupportedInterfaceOrientations</key>
|
||||||
|
<array>
|
||||||
|
<string>UIInterfaceOrientationPortrait</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeLeft</string>
|
||||||
|
<string>UIInterfaceOrientationLandscapeRight</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
25
talk/examples/ios/AppRTCDemo/ResourceRules.plist
Normal file
25
talk/examples/ios/AppRTCDemo/ResourceRules.plist
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
<?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>rules</key>
|
||||||
|
<dict>
|
||||||
|
<key>.*</key>
|
||||||
|
<true/>
|
||||||
|
<key>Info.plist</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>10</real>
|
||||||
|
</dict>
|
||||||
|
<key>ResourceRules.plist</key>
|
||||||
|
<dict>
|
||||||
|
<key>omit</key>
|
||||||
|
<true/>
|
||||||
|
<key>weight</key>
|
||||||
|
<real>100</real>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
@ -1,28 +1,3 @@
|
|||||||
This directory contains an example iOS client for http://apprtc.appspot.com
|
This directory contains an example iOS client for http://apprtc.appspot.com
|
||||||
|
|
||||||
Example of building & using the app:
|
See ../../app/webrtc/objc/README for information on how to use it.
|
||||||
|
|
||||||
cd <path/to/libjingle>/trunk/talk
|
|
||||||
- Open libjingle.xcproj. Select iPhone or iPad simulator and build everything.
|
|
||||||
Then switch to iOS device and build everything. This creates x86 and ARM
|
|
||||||
archives.
|
|
||||||
cd examples/ios
|
|
||||||
./makeLibs.sh
|
|
||||||
- This will generate fat archives containing both targets and copy them to
|
|
||||||
./libs.
|
|
||||||
- This step must be rerun every time you run gclient sync or build the API
|
|
||||||
libraries.
|
|
||||||
- Open AppRTCDemo.xcodeproj, select your device or simulator and run.
|
|
||||||
- If you have any problems deploying for the first time, check the project
|
|
||||||
properties to ensure that the Bundle Identifier matches your phone
|
|
||||||
provisioning profile. Or use the simulator as it doesn't require a profile.
|
|
||||||
|
|
||||||
- In desktop chrome, navigate to http://apprtc.appspot.com and note the r=<NNN>
|
|
||||||
room number in the resulting URL.
|
|
||||||
|
|
||||||
- Enter that number into the text field on the phone.
|
|
||||||
|
|
||||||
- Alternatively, you can background the app and launch Safari. In Safari, open
|
|
||||||
the url apprtc://apprtc.appspot.com/?r=<NNN> where <NNN> is the room name.
|
|
||||||
Other options are to put the link in an email and send it to your self.
|
|
||||||
Clicking on it will launch AppRTCDemo and navigate to the room.
|
|
||||||
|
@ -1,30 +0,0 @@
|
|||||||
#!/bin/bash -e
|
|
||||||
|
|
||||||
if [ "$(dirname $0)" != "." ]; then
|
|
||||||
echo "$(basename $0) must be run from talk/examples/ios as ./$(basename $0)"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm -rf libs
|
|
||||||
mkdir libs
|
|
||||||
|
|
||||||
cd ../../../xcodebuild/Debug-iphoneos
|
|
||||||
for f in *.a; do
|
|
||||||
if [ -f "../Debug-iphonesimulator/$f" ]; then
|
|
||||||
echo "creating fat static library $f"
|
|
||||||
lipo -create "$f" "../Debug-iphonesimulator/$f" -output "../../talk/examples/ios/libs/$f"
|
|
||||||
else
|
|
||||||
echo ""
|
|
||||||
echo "$f was not built for the simulator."
|
|
||||||
echo ""
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
cd ../Debug-iphonesimulator
|
|
||||||
for f in *.a; do
|
|
||||||
if [ ! -f "../Debug-iphoneos/$f" ]; then
|
|
||||||
echo ""
|
|
||||||
echo "$f was not built for the iPhone."
|
|
||||||
echo ""
|
|
||||||
fi
|
|
||||||
done
|
|
@ -163,10 +163,10 @@
|
|||||||
'app/webrtc/objc/RTCEnumConverter.h',
|
'app/webrtc/objc/RTCEnumConverter.h',
|
||||||
'app/webrtc/objc/RTCEnumConverter.mm',
|
'app/webrtc/objc/RTCEnumConverter.mm',
|
||||||
'app/webrtc/objc/RTCI420Frame.mm',
|
'app/webrtc/objc/RTCI420Frame.mm',
|
||||||
'app/webrtc/objc/RTCIceCandidate+Internal.h',
|
'app/webrtc/objc/RTCICECandidate+Internal.h',
|
||||||
'app/webrtc/objc/RTCIceCandidate.mm',
|
'app/webrtc/objc/RTCICECandidate.mm',
|
||||||
'app/webrtc/objc/RTCIceServer+Internal.h',
|
'app/webrtc/objc/RTCICEServer+Internal.h',
|
||||||
'app/webrtc/objc/RTCIceServer.mm',
|
'app/webrtc/objc/RTCICEServer.mm',
|
||||||
'app/webrtc/objc/RTCMediaConstraints+Internal.h',
|
'app/webrtc/objc/RTCMediaConstraints+Internal.h',
|
||||||
'app/webrtc/objc/RTCMediaConstraints.mm',
|
'app/webrtc/objc/RTCMediaConstraints.mm',
|
||||||
'app/webrtc/objc/RTCMediaConstraintsNative.cc',
|
'app/webrtc/objc/RTCMediaConstraintsNative.cc',
|
||||||
@ -196,8 +196,8 @@
|
|||||||
'app/webrtc/objc/public/RTCAudioSource.h',
|
'app/webrtc/objc/public/RTCAudioSource.h',
|
||||||
'app/webrtc/objc/public/RTCAudioTrack.h',
|
'app/webrtc/objc/public/RTCAudioTrack.h',
|
||||||
'app/webrtc/objc/public/RTCI420Frame.h',
|
'app/webrtc/objc/public/RTCI420Frame.h',
|
||||||
'app/webrtc/objc/public/RTCIceCandidate.h',
|
'app/webrtc/objc/public/RTCICECandidate.h',
|
||||||
'app/webrtc/objc/public/RTCIceServer.h',
|
'app/webrtc/objc/public/RTCICEServer.h',
|
||||||
'app/webrtc/objc/public/RTCMediaConstraints.h',
|
'app/webrtc/objc/public/RTCMediaConstraints.h',
|
||||||
'app/webrtc/objc/public/RTCMediaSource.h',
|
'app/webrtc/objc/public/RTCMediaSource.h',
|
||||||
'app/webrtc/objc/public/RTCMediaStream.h',
|
'app/webrtc/objc/public/RTCMediaStream.h',
|
||||||
@ -215,6 +215,11 @@
|
|||||||
'app/webrtc/objc/public/RTCVideoSource.h',
|
'app/webrtc/objc/public/RTCVideoSource.h',
|
||||||
'app/webrtc/objc/public/RTCVideoTrack.h',
|
'app/webrtc/objc/public/RTCVideoTrack.h',
|
||||||
],
|
],
|
||||||
|
'direct_dependent_settings': {
|
||||||
|
'include_dirs': [
|
||||||
|
'<(DEPTH)/talk/app/webrtc/objc/public',
|
||||||
|
],
|
||||||
|
},
|
||||||
'include_dirs': [
|
'include_dirs': [
|
||||||
'<(DEPTH)/talk/app/webrtc',
|
'<(DEPTH)/talk/app/webrtc',
|
||||||
'<(DEPTH)/talk/app/webrtc/objc',
|
'<(DEPTH)/talk/app/webrtc/objc',
|
||||||
@ -227,8 +232,6 @@
|
|||||||
},
|
},
|
||||||
'xcode_settings': {
|
'xcode_settings': {
|
||||||
'CLANG_ENABLE_OBJC_ARC': 'YES',
|
'CLANG_ENABLE_OBJC_ARC': 'YES',
|
||||||
'CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS': 'NO',
|
|
||||||
'CLANG_LINK_OBJC_RUNTIME': 'YES',
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -629,15 +632,12 @@
|
|||||||
},
|
},
|
||||||
}],
|
}],
|
||||||
['OS=="ios"', {
|
['OS=="ios"', {
|
||||||
# 'dependencies': [
|
|
||||||
# '<(DEPTH)/third_party/openssl/openssl.gyp:openssl',
|
|
||||||
# ],
|
|
||||||
# 'include_dirs': [
|
|
||||||
# '<(DEPTH)/third_party/openssl/openssl/include',
|
|
||||||
# ],
|
|
||||||
'sources': [
|
'sources': [
|
||||||
'base/scoped_autorelease_pool.mm',
|
'base/scoped_autorelease_pool.mm',
|
||||||
],
|
],
|
||||||
|
'dependencies': [
|
||||||
|
'../net/third_party/nss/ssl.gyp:libssl',
|
||||||
|
],
|
||||||
'xcode_settings': {
|
'xcode_settings': {
|
||||||
'OTHER_LDFLAGS': [
|
'OTHER_LDFLAGS': [
|
||||||
'-framework IOKit',
|
'-framework IOKit',
|
||||||
@ -646,9 +646,6 @@
|
|||||||
'-framework UIKit',
|
'-framework UIKit',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
'defines': [
|
|
||||||
'SSL_USE_NSS',
|
|
||||||
],
|
|
||||||
}],
|
}],
|
||||||
['OS=="win"', {
|
['OS=="win"', {
|
||||||
'sources': [
|
'sources': [
|
||||||
|
@ -218,6 +218,65 @@
|
|||||||
], # targets
|
], # targets
|
||||||
}], # OS=="linux" or OS=="win"
|
}], # OS=="linux" or OS=="win"
|
||||||
|
|
||||||
|
['libjingle_objc==1 and OS=="ios"', {
|
||||||
|
'targets': [
|
||||||
|
{
|
||||||
|
'target_name': 'AppRTCDemo',
|
||||||
|
'type': 'executable',
|
||||||
|
'product_name': 'AppRTCDemo',
|
||||||
|
'mac_bundle': 1,
|
||||||
|
'mac_bundle_resources': [
|
||||||
|
'examples/ios/AppRTCDemo/ResourceRules.plist',
|
||||||
|
'examples/ios/AppRTCDemo/en.lproj/APPRTCViewController.xib',
|
||||||
|
'examples/ios/AppRTCDemo/ios_channel.html',
|
||||||
|
'examples/ios/Icon.png',
|
||||||
|
],
|
||||||
|
'dependencies': [
|
||||||
|
'libjingle.gyp:libjingle_peerconnection_objc',
|
||||||
|
],
|
||||||
|
'conditions': [
|
||||||
|
['target_arch=="ia32"', {
|
||||||
|
'dependencies' : [
|
||||||
|
'<(DEPTH)/testing/iossim/iossim.gyp:iossim#host',
|
||||||
|
],
|
||||||
|
}],
|
||||||
|
],
|
||||||
|
'sources': [
|
||||||
|
'examples/ios/AppRTCDemo/APPRTCAppClient.h',
|
||||||
|
'examples/ios/AppRTCDemo/APPRTCAppClient.m',
|
||||||
|
'examples/ios/AppRTCDemo/APPRTCAppDelegate.h',
|
||||||
|
'examples/ios/AppRTCDemo/APPRTCAppDelegate.m',
|
||||||
|
'examples/ios/AppRTCDemo/APPRTCViewController.h',
|
||||||
|
'examples/ios/AppRTCDemo/APPRTCViewController.m',
|
||||||
|
'examples/ios/AppRTCDemo/AppRTCDemo-Prefix.pch',
|
||||||
|
'examples/ios/AppRTCDemo/GAEChannelClient.h',
|
||||||
|
'examples/ios/AppRTCDemo/GAEChannelClient.m',
|
||||||
|
'examples/ios/AppRTCDemo/main.m',
|
||||||
|
],
|
||||||
|
'xcode_settings': {
|
||||||
|
'CLANG_ENABLE_OBJC_ARC': 'YES',
|
||||||
|
'INFOPLIST_FILE': 'examples/ios/AppRTCDemo/Info.plist',
|
||||||
|
'OTHER_LDFLAGS': [
|
||||||
|
'-framework Foundation',
|
||||||
|
'-framework UIKit',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
'postbuilds': [
|
||||||
|
{
|
||||||
|
# Ideally app signing would be a part of gyp.
|
||||||
|
# Delete if/when that comes to pass.
|
||||||
|
'postbuild_name': 'Sign AppRTCDemo',
|
||||||
|
'action': [
|
||||||
|
'/usr/bin/codesign', '-v', '--force', '--sign',
|
||||||
|
'<!(security find-identity -p codesigning -v | grep "iPhone Developer" | awk \'{print $2}\')',
|
||||||
|
'${BUILT_PRODUCTS_DIR}/AppRTCDemo.app',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}, # target AppRTCDemo
|
||||||
|
], # targets
|
||||||
|
}], # libjingle_objc==1
|
||||||
|
|
||||||
['OS=="android"', {
|
['OS=="android"', {
|
||||||
'targets': [
|
'targets': [
|
||||||
{
|
{
|
||||||
|
@ -480,6 +480,7 @@
|
|||||||
'<(infoplist_file)',
|
'<(infoplist_file)',
|
||||||
],
|
],
|
||||||
'xcode_settings': {
|
'xcode_settings': {
|
||||||
|
'CLANG_ENABLE_OBJC_ARC': 'YES',
|
||||||
'INFOPLIST_FILE': '<(infoplist_file)',
|
'INFOPLIST_FILE': '<(infoplist_file)',
|
||||||
},
|
},
|
||||||
'dependencies': [
|
'dependencies': [
|
||||||
@ -498,27 +499,13 @@
|
|||||||
'app/webrtc/objctests/RTCSessionDescriptionSyncObserver.h',
|
'app/webrtc/objctests/RTCSessionDescriptionSyncObserver.h',
|
||||||
'app/webrtc/objctests/RTCSessionDescriptionSyncObserver.m',
|
'app/webrtc/objctests/RTCSessionDescriptionSyncObserver.m',
|
||||||
],
|
],
|
||||||
'include_dirs': [
|
|
||||||
'<(DEPTH)/talk/app/webrtc/objc/public',
|
|
||||||
],
|
|
||||||
'conditions': [
|
'conditions': [
|
||||||
[ 'OS=="mac"', {
|
['OS=="mac" or OS=="ios"', {
|
||||||
'sources': [
|
'sources': [
|
||||||
|
# TODO(fischman): figure out if this works for ios or if it
|
||||||
|
# needs a GUI driver.
|
||||||
'app/webrtc/objctests/mac/main.mm',
|
'app/webrtc/objctests/mac/main.mm',
|
||||||
],
|
],
|
||||||
'xcode_settings': {
|
|
||||||
'CLANG_ENABLE_OBJC_ARC': 'YES',
|
|
||||||
'CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS': 'NO',
|
|
||||||
'CLANG_LINK_OBJC_RUNTIME': 'YES',
|
|
||||||
# build/common.gypi disables ARC by default for back-compat
|
|
||||||
# reasons with OSX 10.6. Enabling OBJC runtime and clearing
|
|
||||||
# LDPLUSPLUS and CC re-enables it. Setting deployment target to
|
|
||||||
# 10.7 as there are no back-compat issues with ARC.
|
|
||||||
# https://code.google.com/p/chromium/issues/detail?id=156530
|
|
||||||
'CC': '',
|
|
||||||
'LDPLUSPLUS': '',
|
|
||||||
'macosx_deployment_target': '10.7',
|
|
||||||
},
|
|
||||||
}],
|
}],
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user