diff --git a/.gitignore b/.gitignore index 062d754c84..301e7ee48d 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,7 @@ /chromium_deps /google_apis/build /gyp-mac-tool +/net/third_party/nss/ /out /resources /talk/examples/android/bin diff --git a/DEPS b/DEPS index d961311cbf..feee1356be 100644 --- a/DEPS +++ b/DEPS @@ -131,12 +131,29 @@ deps_os = { # NSS, for SSLClientSocketNSS. "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": { # NSS, for SSLClientSocketNSS. "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": { diff --git a/all.gyp b/all.gyp index 8d22edfdb5..e67ee61fba 100644 --- a/all.gyp +++ b/all.gyp @@ -7,6 +7,7 @@ # be found in the AUTHORS file in the root of the source tree. { + 'includes': ['talk/build/common.gypi'], 'targets': [ { 'target_name': 'All', @@ -15,9 +16,9 @@ 'webrtc/webrtc.gyp:*', ], # 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': [ - ['OS!="mac" or target_arch!="x64"', { + ['OS!="mac" or target_arch!="x64" or libjingle_objc==1', { 'dependencies': [ 'talk/libjingle.gyp:*', 'talk/libjingle_examples.gyp:*', diff --git a/talk/app/webrtc/objc/README b/talk/app/webrtc/objc/README index cea2aae6af..39b0931d97 100644 --- a/talk/app/webrtc/objc/README +++ b/talk/app/webrtc/objc/README @@ -1,45 +1,79 @@ 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: - Make sure gclient is checking out tools necessary to target iOS: your .gclient file should contain a line like: target_os = ['ios', 'mac'] 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 /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. +function wrios() { + wrbase + export GYP_DEFINES="$GYP_DEFINES OS=ios target_arch=armv7" + export GYP_GENERATOR_FLAGS="$GYP_GENERATOR_FLAGS output_dir=out_ios" + export GYP_CROSSCOMPILE=1 +} -- In desktop chrome, navigate to http://apprtc.appspot.com and note the r= - room number in the resulting URL. +function wrsim() { + 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 - the url apprtc://apprtc.appspot.com/?r= where 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. +- Finally, run "gclient runhooks" to generate ninja files. + +Example of building & using the unittest & app: + +- 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= 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= where 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. diff --git a/talk/app/webrtc/objc/RTCIceCandidate+Internal.h b/talk/app/webrtc/objc/RTCICECandidate+Internal.h similarity index 93% rename from talk/app/webrtc/objc/RTCIceCandidate+Internal.h rename to talk/app/webrtc/objc/RTCICECandidate+Internal.h index e4964d4d11..741728aee6 100644 --- a/talk/app/webrtc/objc/RTCIceCandidate+Internal.h +++ b/talk/app/webrtc/objc/RTCICECandidate+Internal.h @@ -32,8 +32,8 @@ @interface RTCICECandidate (Internal) @property(nonatomic, assign, readonly) const - webrtc::IceCandidateInterface *candidate; + webrtc::IceCandidateInterface* candidate; -- (id)initWithCandidate:(const webrtc::IceCandidateInterface *)candidate; +- (id)initWithCandidate:(const webrtc::IceCandidateInterface*)candidate; @end diff --git a/talk/app/webrtc/objc/RTCIceCandidate.mm b/talk/app/webrtc/objc/RTCICECandidate.mm similarity index 98% rename from talk/app/webrtc/objc/RTCIceCandidate.mm rename to talk/app/webrtc/objc/RTCICECandidate.mm index 63eac1dc0a..a6d7935491 100644 --- a/talk/app/webrtc/objc/RTCIceCandidate.mm +++ b/talk/app/webrtc/objc/RTCICECandidate.mm @@ -78,7 +78,7 @@ return self; } -- (const webrtc::IceCandidateInterface *)candidate { +- (const webrtc::IceCandidateInterface*)candidate { return webrtc::CreateIceCandidate( [self.sdpMid UTF8String], self.sdpMLineIndex, [self.sdp UTF8String]); } diff --git a/talk/app/webrtc/objc/RTCIceServer+Internal.h b/talk/app/webrtc/objc/RTCICEServer+Internal.h similarity index 93% rename from talk/app/webrtc/objc/RTCIceServer+Internal.h rename to talk/app/webrtc/objc/RTCICEServer+Internal.h index c074294b4b..8aff42f923 100644 --- a/talk/app/webrtc/objc/RTCIceServer+Internal.h +++ b/talk/app/webrtc/objc/RTCICEServer+Internal.h @@ -31,7 +31,8 @@ @interface RTCICEServer (Internal) -@property(nonatomic, assign, readonly) - webrtc::PeerConnectionInterface::IceServer iceServer; +@property(nonatomic, + assign, + readonly) webrtc::PeerConnectionInterface::IceServer iceServer; @end diff --git a/talk/app/webrtc/objc/RTCIceServer.mm b/talk/app/webrtc/objc/RTCICEServer.mm similarity index 100% rename from talk/app/webrtc/objc/RTCIceServer.mm rename to talk/app/webrtc/objc/RTCICEServer.mm diff --git a/talk/app/webrtc/objc/RTCPeerConnectionFactory.mm b/talk/app/webrtc/objc/RTCPeerConnectionFactory.mm index 84e8c5eeee..1c6e7e7bc0 100644 --- a/talk/app/webrtc/objc/RTCPeerConnectionFactory.mm +++ b/talk/app/webrtc/objc/RTCPeerConnectionFactory.mm @@ -53,6 +53,7 @@ #include "talk/app/webrtc/videosourceinterface.h" #include "talk/app/webrtc/videotrack.h" #include "talk/base/logging.h" +#include "talk/base/ssladapter.h" @interface RTCPeerConnectionFactory () @@ -63,6 +64,16 @@ @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 { if ((self = [super init])) { _nativeFactory = webrtc::CreatePeerConnectionFactory(); diff --git a/talk/app/webrtc/objc/public/RTCIceCandidate.h b/talk/app/webrtc/objc/public/RTCICECandidate.h similarity index 88% rename from talk/app/webrtc/objc/public/RTCIceCandidate.h rename to talk/app/webrtc/objc/public/RTCICECandidate.h index f3f2c161c9..8d10545eb2 100644 --- a/talk/app/webrtc/objc/public/RTCIceCandidate.h +++ b/talk/app/webrtc/objc/public/RTCICECandidate.h @@ -33,24 +33,24 @@ // If present, this contains the identifier of the "media stream // identification" as defined in [RFC 3388] for m-line this candidate is // 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 // candidate is associated with. @property(nonatomic, assign, readonly) NSInteger sdpMLineIndex; // 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. -- (id)initWithMid:(NSString *)sdpMid +- (id)initWithMid:(NSString*)sdpMid index:(NSInteger)sdpMLineIndex - sdp:(NSString *)sdp; + sdp:(NSString*)sdp; #ifndef DOXYGEN_SHOULD_SKIP_THIS // Disallow init and don't add to documentation -- (id)init __attribute__( - (unavailable("init is not a supported initializer for this class."))); +- (id)init __attribute__(( + unavailable("init is not a supported initializer for this class."))); #endif /* DOXYGEN_SHOULD_SKIP_THIS */ @end diff --git a/talk/app/webrtc/objc/public/RTCIceServer.h b/talk/app/webrtc/objc/public/RTCICEServer.h similarity index 86% rename from talk/app/webrtc/objc/public/RTCIceServer.h rename to talk/app/webrtc/objc/public/RTCICEServer.h index 01ad9b54d6..717d042f78 100644 --- a/talk/app/webrtc/objc/public/RTCIceServer.h +++ b/talk/app/webrtc/objc/public/RTCICEServer.h @@ -31,18 +31,18 @@ @interface RTCICEServer : NSObject // The server URI. -@property(nonatomic, strong, readonly) NSURL *URI; +@property(nonatomic, strong, readonly) NSURL* URI; // The server password. -@property(nonatomic, copy, readonly) NSString *password; +@property(nonatomic, copy, readonly) NSString* 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 // Disallow init and don't add to documentation -- (id)init __attribute__( - (unavailable("init is not a supported initializer for this class."))); +- (id)init __attribute__(( + unavailable("init is not a supported initializer for this class."))); #endif /* DOXYGEN_SHOULD_SKIP_THIS */ @end diff --git a/talk/app/webrtc/objc/public/RTCPeerConnectionFactory.h b/talk/app/webrtc/objc/public/RTCPeerConnectionFactory.h index 0f48299b04..5e2f6b6f4c 100644 --- a/talk/app/webrtc/objc/public/RTCPeerConnectionFactory.h +++ b/talk/app/webrtc/objc/public/RTCPeerConnectionFactory.h @@ -40,6 +40,10 @@ // It is the main entry point to the PeerConnection API for clients. @interface RTCPeerConnectionFactory : NSObject +// Initialize & de-initialize the SSL subsystem. Failure is fatal. ++ (void)initializeSSL; ++ (void)deinitializeSSL; + // Create an RTCPeerConnection object. RTCPeerConnectionFactory will create // required libjingle threads, socket and network manager factory classes for // networking. diff --git a/talk/app/webrtc/objctests/README b/talk/app/webrtc/objctests/README new file mode 100644 index 0000000000..ebbb2c2603 --- /dev/null +++ b/talk/app/webrtc/objctests/README @@ -0,0 +1 @@ +See ../objc/README for information on what this is and how to use it. diff --git a/talk/build/common.gypi b/talk/build/common.gypi index 1e9df348b2..edbf0f3caf 100644 --- a/talk/build/common.gypi +++ b/talk/build/common.gypi @@ -99,12 +99,12 @@ ['OS=="ios"', { 'defines': [ 'IOS', - 'SSL_USE_NSS', + 'HAVE_NSS_SSL_H=1', 'SSL_USE_NSS_RNG', ], - 'variables': { - 'use_nss%': 1, - }, + 'defines!': [ + 'HAVE_OPENSSL_SSL_H=1', + ], }], ['libjingle_objc==1', { 'defines': [ diff --git a/talk/examples/ios/AppRTCDemo.xcodeproj/project.pbxproj b/talk/examples/ios/AppRTCDemo.xcodeproj/project.pbxproj deleted file mode 100644 index 72de3b4946..0000000000 --- a/talk/examples/ios/AppRTCDemo.xcodeproj/project.pbxproj +++ /dev/null @@ -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 = ""; }; - 4F995B02173B6937007F179A /* libaudio_conference_mixer.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libaudio_conference_mixer.a; path = libs/libaudio_conference_mixer.a; sourceTree = ""; }; - 4F995B03173B6937007F179A /* libaudio_device.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libaudio_device.a; path = libs/libaudio_device.a; sourceTree = ""; }; - 4F995B04173B6937007F179A /* libaudio_processing.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libaudio_processing.a; path = libs/libaudio_processing.a; sourceTree = ""; }; - 4F995B05173B6937007F179A /* libaudioproc_debug_proto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libaudioproc_debug_proto.a; path = libs/libaudioproc_debug_proto.a; sourceTree = ""; }; - 4F995B06173B6937007F179A /* libbitrate_controller.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libbitrate_controller.a; path = libs/libbitrate_controller.a; sourceTree = ""; }; - 4F995B07173B6937007F179A /* libCNG.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libCNG.a; path = libs/libCNG.a; sourceTree = ""; }; - 4F995B08173B6937007F179A /* libcommon_video.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libcommon_video.a; path = libs/libcommon_video.a; sourceTree = ""; }; - 4F995B09173B6937007F179A /* libexpat.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libexpat.a; path = libs/libexpat.a; sourceTree = ""; }; - 4F995B0A173B6937007F179A /* libG711.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libG711.a; path = libs/libG711.a; sourceTree = ""; }; - 4F995B0B173B6937007F179A /* libG722.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libG722.a; path = libs/libG722.a; sourceTree = ""; }; - 4F995B0C173B6937007F179A /* libgunit.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgunit.a; path = libs/libgunit.a; sourceTree = ""; }; - 4F995B0D173B6937007F179A /* libiLBC.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libiLBC.a; path = libs/libiLBC.a; sourceTree = ""; }; - 4F995B0E173B6937007F179A /* libiSAC.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libiSAC.a; path = libs/libiSAC.a; sourceTree = ""; }; - 4F995B0F173B6937007F179A /* libiSACFix.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libiSACFix.a; path = libs/libiSACFix.a; sourceTree = ""; }; - 4F995B10173B6937007F179A /* libjingle_media.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjingle_media.a; path = libs/libjingle_media.a; sourceTree = ""; }; - 4F995B11173B6937007F179A /* libjingle_p2p.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjingle_p2p.a; path = libs/libjingle_p2p.a; sourceTree = ""; }; - 4F995B12173B6937007F179A /* libjingle_peerconnection_objc.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjingle_peerconnection_objc.a; path = libs/libjingle_peerconnection_objc.a; sourceTree = ""; }; - 4F995B13173B6937007F179A /* libjingle_peerconnection.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjingle_peerconnection.a; path = libs/libjingle_peerconnection.a; sourceTree = ""; }; - 4F995B14173B6937007F179A /* libjingle_sound.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjingle_sound.a; path = libs/libjingle_sound.a; sourceTree = ""; }; - 4F995B15173B6937007F179A /* libjingle.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjingle.a; path = libs/libjingle.a; sourceTree = ""; }; - 4F995B16173B6937007F179A /* libjsoncpp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libjsoncpp.a; path = libs/libjsoncpp.a; sourceTree = ""; }; - 4F995B17173B6937007F179A /* libmedia_file.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmedia_file.a; path = libs/libmedia_file.a; sourceTree = ""; }; - 4F995B18173B6937007F179A /* libNetEq.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libNetEq.a; path = libs/libNetEq.a; sourceTree = ""; }; - 4F995B19173B6937007F179A /* libopenssl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopenssl.a; path = libs/libopenssl.a; sourceTree = ""; }; - 4F995B1A173B6937007F179A /* libopus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libopus.a; path = libs/libopus.a; sourceTree = ""; }; - 4F995B1B173B6937007F179A /* libpaced_sender.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libpaced_sender.a; path = libs/libpaced_sender.a; sourceTree = ""; }; - 4F995B1C173B6937007F179A /* libPCM16B.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libPCM16B.a; path = libs/libPCM16B.a; sourceTree = ""; }; - 4F995B1D173B6937007F179A /* libprotobuf_lite.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libprotobuf_lite.a; path = libs/libprotobuf_lite.a; sourceTree = ""; }; - 4F995B1E173B6937007F179A /* libremote_bitrate_estimator.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libremote_bitrate_estimator.a; path = libs/libremote_bitrate_estimator.a; sourceTree = ""; }; - 4F995B1F173B6937007F179A /* libresampler.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libresampler.a; path = libs/libresampler.a; sourceTree = ""; }; - 4F995B20173B6937007F179A /* librtp_rtcp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = librtp_rtcp.a; path = libs/librtp_rtcp.a; sourceTree = ""; }; - 4F995B21173B6937007F179A /* libsignal_processing.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsignal_processing.a; path = libs/libsignal_processing.a; sourceTree = ""; }; - 4F995B22173B6937007F179A /* libsrtp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsrtp.a; path = libs/libsrtp.a; sourceTree = ""; }; - 4F995B23173B6937007F179A /* libsystem_wrappers.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libsystem_wrappers.a; path = libs/libsystem_wrappers.a; sourceTree = ""; }; - 4F995B24173B6937007F179A /* libudp_transport.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libudp_transport.a; path = libs/libudp_transport.a; sourceTree = ""; }; - 4F995B25173B6937007F179A /* libvad.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvad.a; path = libs/libvad.a; sourceTree = ""; }; - 4F995B26173B6937007F179A /* libvideo_capture_module.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvideo_capture_module.a; path = libs/libvideo_capture_module.a; sourceTree = ""; }; - 4F995B27173B6937007F179A /* libvideo_coding_utility.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvideo_coding_utility.a; path = libs/libvideo_coding_utility.a; sourceTree = ""; }; - 4F995B28173B6937007F179A /* libvideo_engine_core.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvideo_engine_core.a; path = libs/libvideo_engine_core.a; sourceTree = ""; }; - 4F995B29173B6937007F179A /* libvideo_processing.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvideo_processing.a; path = libs/libvideo_processing.a; sourceTree = ""; }; - 4F995B2A173B6937007F179A /* libvideo_render_module.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvideo_render_module.a; path = libs/libvideo_render_module.a; sourceTree = ""; }; - 4F995B2B173B6937007F179A /* libvoice_engine_core.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libvoice_engine_core.a; path = libs/libvoice_engine_core.a; sourceTree = ""; }; - 4F995B2C173B6937007F179A /* libwebrtc_i420.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libwebrtc_i420.a; path = libs/libwebrtc_i420.a; sourceTree = ""; }; - 4F995B2D173B6937007F179A /* libwebrtc_opus.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libwebrtc_opus.a; path = libs/libwebrtc_opus.a; sourceTree = ""; }; - 4F995B2E173B6937007F179A /* libwebrtc_utility.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libwebrtc_utility.a; path = libs/libwebrtc_utility.a; sourceTree = ""; }; - 4F995B2F173B6937007F179A /* libwebrtc_video_coding.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libwebrtc_video_coding.a; path = libs/libwebrtc_video_coding.a; sourceTree = ""; }; - 4F995B30173B6937007F179A /* libwebrtc_vp8.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libwebrtc_vp8.a; path = libs/libwebrtc_vp8.a; sourceTree = ""; }; - 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 = ""; }; - 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 = ""; }; - 4FBCC05A1728E929004C8C0B /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 4FBCC05C1728E929004C8C0B /* AppRTCDemo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AppRTCDemo-Prefix.pch"; sourceTree = ""; }; - 4FBCC05D1728E929004C8C0B /* APPRTCAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = APPRTCAppDelegate.h; sourceTree = ""; }; - 4FBCC05E1728E929004C8C0B /* APPRTCAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = APPRTCAppDelegate.m; sourceTree = ""; }; - 4FBCC0601728E929004C8C0B /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; - 4FBCC0661728E929004C8C0B /* APPRTCViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = APPRTCViewController.h; sourceTree = ""; }; - 4FBCC0671728E929004C8C0B /* APPRTCViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = APPRTCViewController.m; sourceTree = ""; }; - 4FBCC06A1728E929004C8C0B /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/APPRTCViewController.xib; sourceTree = ""; }; - 4FBCC0711729B780004C8C0B /* GAEChannelClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GAEChannelClient.h; sourceTree = ""; }; - 4FBCC0721729B780004C8C0B /* GAEChannelClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GAEChannelClient.m; sourceTree = ""; }; - 4FD7F4FF1732E1C1009295E5 /* APPRTCAppClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APPRTCAppClient.h; sourceTree = ""; }; - 4FD7F5001732E1C2009295E5 /* APPRTCAppClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = APPRTCAppClient.m; sourceTree = ""; }; - 4FEE3E511743C92D0005814A /* ios_channel.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = ios_channel.html; sourceTree = ""; }; - 4FEE3EB61746A3810005814A /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../Icon.png; sourceTree = ""; }; -/* 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 = ""; - }; - 4FBCC0421728E929004C8C0B = { - isa = PBXGroup; - children = ( - 4FBCC0541728E929004C8C0B /* AppRTCDemo */, - 4FBCC04D1728E929004C8C0B /* Frameworks */, - 4F1CC122172F52E50090479F /* libs */, - 4FBCC04C1728E929004C8C0B /* Products */, - ); - sourceTree = ""; - }; - 4FBCC04C1728E929004C8C0B /* Products */ = { - isa = PBXGroup; - children = ( - 4FBCC04B1728E929004C8C0B /* AppRTCDemo.app */, - ); - name = Products; - sourceTree = ""; - }; - 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 = ""; - }; - 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 = ""; - }; - 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 = ""; - }; -/* 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 = ""; - }; -/* 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 */; -} diff --git a/talk/examples/ios/AppRTCDemo/APPRTCAppClient.h b/talk/examples/ios/AppRTCDemo/APPRTCAppClient.h index cac2f17b45..c737beaa99 100644 --- a/talk/examples/ios/AppRTCDemo/APPRTCAppClient.h +++ b/talk/examples/ios/AppRTCDemo/APPRTCAppClient.h @@ -29,10 +29,10 @@ #import "GAEChannelClient.h" -// Called when there are RTCIceServers. -@protocol IceServerDelegate +// Called when there are RTCICEServers. +@protocol ICEServerDelegate -- (void)onIceServers:(NSArray *)servers; +- (void)onICEServers:(NSArray*)servers; @end @@ -45,8 +45,8 @@ // for the registered handler to be called with received messages. @interface APPRTCAppClient : NSObject -@property(nonatomic, assign) idiceServerDelegate; -@property(nonatomic, assign) idmessageHandler; +@property(nonatomic, assign) id ICEServerDelegate; +@property(nonatomic, assign) id messageHandler; - (void)connectToRoom:(NSURL *)room; - (void)sendData:(NSData *)data; diff --git a/talk/examples/ios/AppRTCDemo/APPRTCAppClient.m b/talk/examples/ios/AppRTCDemo/APPRTCAppClient.m index bcc2329b26..93f0d36a31 100644 --- a/talk/examples/ios/AppRTCDemo/APPRTCAppClient.m +++ b/talk/examples/ios/AppRTCDemo/APPRTCAppClient.m @@ -30,16 +30,16 @@ #import #import "GAEChannelClient.h" -#import "RTCIceServer.h" +#import "RTCICEServer.h" @interface APPRTCAppClient () -@property(nonatomic, strong) dispatch_queue_t backgroundQueue; +@property(nonatomic, assign) dispatch_queue_t backgroundQueue; @property(nonatomic, copy) NSString *baseURL; @property(nonatomic, strong) GAEChannelClient *gaeChannel; @property(nonatomic, copy) NSString *postMessageUrl; @property(nonatomic, copy) NSString *pcConfig; -@property(nonatomic, strong) NSMutableString *receivedData; +@property(nonatomic, strong) NSMutableString *roomHtml; @property(atomic, strong) NSMutableArray *sendQueue; @property(nonatomic, copy) NSString *token; @@ -52,13 +52,18 @@ - (id)init { if (self = [super init]) { _backgroundQueue = dispatch_queue_create("RTCBackgroundQueue", NULL); + dispatch_retain(_backgroundQueue); _sendQueue = [NSMutableArray array]; // Uncomment to see Request/Response logging. - //_verboseLogging = YES; + // _verboseLogging = YES; } return self; } +- (void)dealloc { + dispatch_release(_backgroundQueue); +} + #pragma mark - Public methods - (void)connectToRoom:(NSURL *)url { @@ -76,42 +81,41 @@ #pragma mark - Internal methods -- (NSTextCheckingResult *)findMatch:(NSString *)regexpPattern - withString:(NSString *)string - errorMessage:(NSString *)errorMessage { - NSError *error; +- (NSString*)findVar:(NSString*)name + strippingQuotes:(BOOL)strippingQuotes { + NSError* error; + NSString* pattern = + [NSString stringWithFormat:@".*\n *var %@ = ([^\n]*);\n.*", name]; NSRegularExpression *regexp = - [NSRegularExpression regularExpressionWithPattern:regexpPattern + [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error]; - if (error) { - [self maybeLogMessage: - [NSString stringWithFormat:@"Failed to create regexp - %@", - [error description]]]; + NSAssert(!error, @"Unexpected error compiling regex: ", + error.localizedDescription); + + 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; } - NSRange fullRange = NSMakeRange(0, [string length]); - NSArray *matches = [regexp matchesInString:string options:0 range:fullRange]; - if ([matches count] == 0) { - if ([errorMessage length] > 0) { - [self maybeLogMessage:string]; - [self showMessage: - [NSString stringWithFormat:@"Missing %@ in HTML.", errorMessage]]; - } - return nil; - } else if ([matches count] > 1) { - if ([errorMessage length] > 0) { - [self maybeLogMessage:string]; - [self showMessage:[NSString stringWithFormat:@"Too many %@s in HTML.", - errorMessage]]; - } - return nil; + NSRange matchRange = [matches[0] rangeAtIndex:1]; + NSString* value = [self.roomHtml substringWithRange:matchRange]; + if (strippingQuotes) { + NSAssert([value length] > 2, + @"Can't strip quotes from short string: [%@]", value); + NSAssert(([value characterAtIndex:0] == '\'' && + [value characterAtIndex:[value length] - 1] == '\''), + @"Can't strip quotes from unquoted string: [%@]", value); + value = [value substringWithRange:NSMakeRange(1, [value length] - 2)]; } - return matches[0]; + return value; } - (NSURLRequest *)getRequestFromUrl:(NSURL *)url { - self.receivedData = [NSMutableString stringWithCapacity:20000]; + self.roomHtml = [NSMutableString stringWithCapacity:20000]; NSString *path = [NSString stringWithFormat:@"https:%@", [url resourceSpecifier]]; NSURLRequest *request = @@ -172,10 +176,10 @@ [alertView show]; } -- (void)updateIceServers:(NSMutableArray *)iceServers +- (void)updateICEServers:(NSMutableArray *)ICEServers withTurnServer:(NSString *)turnServerUrl { if ([turnServerUrl length] < 1) { - [self.iceServerDelegate onIceServers:iceServers]; + [self.ICEServerDelegate onICEServers:ICEServers]; return; } dispatch_async(self.backgroundQueue, ^(void) { @@ -199,16 +203,16 @@ NSString *password = json[@"password"]; NSString *fullUrl = [NSString stringWithFormat:@"turn:%@@%@", username, turnServer]; - RTCIceServer *iceServer = - [[RTCIceServer alloc] initWithUri:[NSURL URLWithString:fullUrl] + RTCICEServer *ICEServer = + [[RTCICEServer alloc] initWithURI:[NSURL URLWithString:fullUrl] password:password]; - [iceServers addObject:iceServer]; + [ICEServers addObject:ICEServer]; } else { NSLog(@"Unable to get TURN server. Error: %@", error.description); } 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]]; [self maybeLogMessage: [NSString stringWithFormat:@"Received %d chars", [roomHtml length]]]; - [self.receivedData appendString:roomHtml]; + [self.roomHtml appendString:roomHtml]; } - (void)connection:(NSURLConnection *)connection @@ -237,64 +241,48 @@ - (void)connectionDidFinishLoading:(NSURLConnection *)connection { [self maybeLogMessage:[NSString stringWithFormat:@"finished loading %d chars", - [self.receivedData length]]]; - NSTextCheckingResult *result = - [self findMatch:@".*\n *Sorry, this room is full\\..*" - withString:self.receivedData - errorMessage:nil]; - if (result) { + [self.roomHtml length]]]; + NSRegularExpression* fullRegex = + [NSRegularExpression regularExpressionWithPattern:@"room is full" + options:0 + error:nil]; + if ([fullRegex numberOfMatchesInString:self.roomHtml + options:0 + range:NSMakeRange(0, [self.roomHtml length])]) { [self showMessage:@"Room full"]; return; } + NSString *fullUrl = [[[connection originalRequest] URL] absoluteString]; NSRange queryRange = [fullUrl rangeOfString:@"?"]; 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.*" - withString:self.receivedData - errorMessage:@"channel token"]; - if (!result) { + self.token = [self findVar:@"channelToken" strippingQuotes:YES]; + if (!self.token) return; - } - self.token = [self.receivedData substringWithRange:[result rangeAtIndex:1]]; - [self maybeLogMessage:[NSString stringWithFormat:@"Token\n%@", self.token]]; + [self maybeLogMessage:[NSString stringWithFormat:@"Token: %@", self.token]]; - result = - [self findMatch:@".*\n *path = '/(message\\?r=.+)' \\+ '(&u=[0-9]+)';\n.*" - withString:self.receivedData - errorMessage:@"postMessage URL"]; - if (!result) { + NSString* roomKey = [self findVar:@"roomKey" strippingQuotes:YES]; + NSString* me = [self findVar:@"me" strippingQuotes:YES]; + if (!roomKey || !me) return; - } self.postMessageUrl = - [NSString stringWithFormat:@"%@%@", - [self.receivedData substringWithRange:[result rangeAtIndex:1]], - [self.receivedData substringWithRange:[result rangeAtIndex:2]]]; - [self maybeLogMessage:[NSString stringWithFormat:@"POST message URL\n%@", - self.postMessageUrl]]; + [NSString stringWithFormat:@"/message?r=%@&u=%@", roomKey, me]; + [self maybeLogMessage:[NSString stringWithFormat:@"POST message URL: %@", + self.postMessageUrl]]; - result = [self findMatch:@".*\n *var pc_config = (\\{[^\n]*\\});\n.*" - withString:self.receivedData - errorMessage:@"pc_config"]; - if (!result) { + NSString* pcConfig = [self findVar:@"pcConfig" strippingQuotes:NO]; + if (!pcConfig) return; - } - NSString *pcConfig = - [self.receivedData substringWithRange:[result rangeAtIndex:1]]; [self maybeLogMessage: - [NSString stringWithFormat:@"PC Config JSON\n%@", pcConfig]]; + [NSString stringWithFormat:@"PC Config JSON: %@", pcConfig]]; - result = [self findMatch:@".*\n *requestTurn\\('([^\n]*)'\\);\n.*" - withString:self.receivedData - errorMessage:@"channel token"]; - NSString *turnServerUrl; - if (result) { - turnServerUrl = - [self.receivedData substringWithRange:[result rangeAtIndex:1]]; + NSString *turnServerUrl = [self findVar:@"turnUrl" strippingQuotes:YES]; + if (turnServerUrl) { [self maybeLogMessage: - [NSString stringWithFormat:@"TURN server request URL\n%@", + [NSString stringWithFormat:@"TURN server request URL: %@", turnServerUrl]]; } @@ -303,8 +291,8 @@ NSDictionary *json = [NSJSONSerialization JSONObjectWithData:pcData options:0 error:&error]; NSAssert(!error, @"Unable to parse. %@", error.localizedDescription); - NSArray *servers = [json objectForKey:@"iceServers"]; - NSMutableArray *iceServers = [NSMutableArray array]; + NSArray *servers = [json objectForKey:@"ICEServers"]; + NSMutableArray *ICEServers = [NSMutableArray array]; for (NSDictionary *server in servers) { NSString *url = [server objectForKey:@"url"]; NSString *credential = [server objectForKey:@"credential"]; @@ -315,12 +303,12 @@ [NSString stringWithFormat:@"url [%@] - credential [%@]", url, credential]]; - RTCIceServer *iceServer = - [[RTCIceServer alloc] initWithUri:[NSURL URLWithString:url] + RTCICEServer *ICEServer = + [[RTCICEServer alloc] initWithURI:[NSURL URLWithString:url] password:credential]; - [iceServers addObject:iceServer]; + [ICEServers addObject:ICEServer]; } - [self updateIceServers:iceServers withTurnServer:turnServerUrl]; + [self updateICEServers:ICEServers withTurnServer:turnServerUrl]; [self maybeLogMessage: [NSString stringWithFormat:@"About to open GAE with token: %@", diff --git a/talk/examples/ios/AppRTCDemo/APPRTCAppDelegate.h b/talk/examples/ios/AppRTCDemo/APPRTCAppDelegate.h index 82b07f0441..ad1c512760 100644 --- a/talk/examples/ios/AppRTCDemo/APPRTCAppDelegate.h +++ b/talk/examples/ios/AppRTCDemo/APPRTCAppDelegate.h @@ -43,9 +43,11 @@ // The main application class of the AppRTCDemo iOS app demonstrating // interoperability between the Objcective C implementation of PeerConnection // and the apprtc.appspot.com demo webapp. -@interface APPRTCAppDelegate : UIResponder +@interface APPRTCAppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) APPRTCViewController *viewController; diff --git a/talk/examples/ios/AppRTCDemo/APPRTCAppDelegate.m b/talk/examples/ios/AppRTCDemo/APPRTCAppDelegate.m index 0c429a0780..710f4ad5ec 100644 --- a/talk/examples/ios/AppRTCDemo/APPRTCAppDelegate.m +++ b/talk/examples/ios/AppRTCDemo/APPRTCAppDelegate.m @@ -28,8 +28,8 @@ #import "APPRTCAppDelegate.h" #import "APPRTCViewController.h" -#import "RTCIceCandidate.h" -#import "RTCIceServer.h" +#import "RTCICECandidate.h" +#import "RTCICEServer.h" #import "RTCMediaConstraints.h" #import "RTCMediaStream.h" #import "RTCPair.h" @@ -61,12 +61,12 @@ } - (void)peerConnection:(RTCPeerConnection *)peerConnection - onSignalingStateChange:(RTCSignalingState)stateChanged { + signalingStateChanged:(RTCSignalingState)stateChanged { NSLog(@"PCO onSignalingStateChange."); } - (void)peerConnection:(RTCPeerConnection *)peerConnection - onAddStream:(RTCMediaStream *)stream { + addedStream:(RTCMediaStream *)stream { NSLog(@"PCO onAddStream."); dispatch_async(dispatch_get_main_queue(), ^(void) { NSAssert([stream.audioTracks count] >= 1, @@ -78,7 +78,7 @@ } - (void)peerConnection:(RTCPeerConnection *)peerConnection - onRemoveStream:(RTCMediaStream *)stream { + removedStream:(RTCMediaStream *)stream { NSLog(@"PCO onRemoveStream."); // TODO(hughv): Remove video track. } @@ -90,8 +90,8 @@ } - (void)peerConnection:(RTCPeerConnection *)peerConnection - onIceCandidate:(RTCIceCandidate *)candidate { - NSLog(@"PCO onIceCandidate.\n Mid[%@] Index[%d] Sdp[%@]", + gotICECandidate:(RTCICECandidate *)candidate { + NSLog(@"PCO onICECandidate.\n Mid[%@] Index[%d] Sdp[%@]", candidate.sdpMid, candidate.sdpMLineIndex, candidate.sdp); @@ -112,12 +112,12 @@ } - (void)peerConnection:(RTCPeerConnection *)peerConnection - onIceGatheringChange:(RTCIceGatheringState)newState { + iceGatheringChanged:(RTCICEGatheringState)newState { NSLog(@"PCO onIceGatheringChange. %d", newState); } - (void)peerConnection:(RTCPeerConnection *)peerConnection - onIceConnectionChange:(RTCIceConnectionState)newState { + iceConnectionChanged:(RTCICEConnectionState)newState { NSLog(@"PCO onIceConnectionChange. %d", newState); } @@ -139,9 +139,10 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [RTCPeerConnectionFactory initializeSSL]; self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.viewController = - [[APPRTCViewController alloc] initWithNibName:@"RTCViewController" + [[APPRTCViewController alloc] initWithNibName:@"APPRTCViewController" bundle:nil]; self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; @@ -174,7 +175,7 @@ return NO; } self.client = [[APPRTCAppClient alloc] init]; - self.client.iceServerDelegate = self; + self.client.ICEServerDelegate = self; self.client.messageHandler = self; [self.client connectToRoom:url]; return YES; @@ -191,23 +192,23 @@ [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.peerConnectionFactory = [[RTCPeerConnectionFactory alloc] init]; RTCMediaConstraints *constraints = [[RTCMediaConstraints alloc] init]; self.pcObserver = [[PCObserver alloc] initWithDelegate:self]; self.peerConnection = - [self.peerConnectionFactory peerConnectionWithIceServers:servers + [self.peerConnectionFactory peerConnectionWithICEServers:servers constraints:constraints delegate:self.pcObserver]; RTCMediaStream *lms = [self.peerConnectionFactory mediaStreamWithLabel:@"ARDAMS"]; // TODO(hughv): Add video. - [lms addAudioTrack:[self.peerConnectionFactory audioTrackWithId:@"ARDAMSa0"]]; - [self.peerConnection addStream:lms withConstraints:constraints]; - [self displayLogMessage:@"onIceServers - add local stream."]; + [lms addAudioTrack:[self.peerConnectionFactory audioTrackWithID:@"ARDAMSa0"]]; + [self.peerConnection addStream:lms constraints:constraints]; + [self displayLogMessage:@"onICEServers - add local stream."]; } #pragma mark - GAEMessageHandler methods @@ -245,14 +246,14 @@ NSString *mid = [objects objectForKey:@"id"]; NSNumber *sdpLineIndex = [objects objectForKey:@"label"]; NSString *sdp = [objects objectForKey:@"candidate"]; - RTCIceCandidate *candidate = - [[RTCIceCandidate alloc] initWithMid:mid + RTCICECandidate *candidate = + [[RTCICECandidate alloc] initWithMid:mid index:sdpLineIndex.intValue sdp:sdp]; if (self.queuedRemoteCandidates) { [self.queuedRemoteCandidates addObject:candidate]; } else { - [self.peerConnection addIceCandidate:candidate]; + [self.peerConnection addICECandidate:candidate]; } } else if (([value compare:@"offer"] == NSOrderedSame) || ([value compare:@"answer"] == NSOrderedSame)) { @@ -283,8 +284,8 @@ #pragma mark - RTCSessionDescriptonDelegate methods - (void)peerConnection:(RTCPeerConnection *)peerConnection - createSessionDescriptionCompleted:(RTCSessionDescription *)sdp - withError:(NSError *)error { + didCreateSessionDescription:(RTCSessionDescription *)sdp + error:(NSError *)error { if (error) { [self displayLogMessage:@"SDP onFailure."]; NSAssert(NO, error.description); @@ -308,7 +309,7 @@ } - (void)peerConnection:(RTCPeerConnection *)peerConnection - setSessionDescriptionCompletedWithError:(NSError *)error { + didSetSessionDescriptionWithError:(NSError *)error { if (error) { [self displayLogMessage:@"SDP onFailure."]; NSAssert(NO, error.description); @@ -333,14 +334,15 @@ self.peerConnection = nil; self.peerConnectionFactory = nil; self.pcObserver = nil; - self.client.iceServerDelegate = nil; + self.client.ICEServerDelegate = nil; self.client.messageHandler = nil; self.client = nil; + [RTCPeerConnectionFactory deinitializeSSL]; } - (void)drainRemoteCandidates { - for (RTCIceCandidate *candidate in self.queuedRemoteCandidates) { - [self.peerConnection addIceCandidate:candidate]; + for (RTCICECandidate *candidate in self.queuedRemoteCandidates) { + [self.peerConnection addICECandidate:candidate]; } self.queuedRemoteCandidates = nil; } diff --git a/talk/examples/ios/AppRTCDemo/AppRTCDemo-Info.plist b/talk/examples/ios/AppRTCDemo/AppRTCDemo-Info.plist deleted file mode 100644 index 3ab57ed5f6..0000000000 --- a/talk/examples/ios/AppRTCDemo/AppRTCDemo-Info.plist +++ /dev/null @@ -1,71 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIcons - - CFBundlePrimaryIcon - - CFBundleIconFiles - - Icon.png - - - - CFBundleIdentifier - com.Google.${PRODUCT_NAME:rfc1034identifier} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLName - com.google.apprtcdemo - CFBundleURLSchemes - - apprtc - - - - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - UIRequiredDeviceCapabilities - - armv7 - - UIStatusBarTintParameters - - UINavigationBar - - Style - UIBarStyleDefault - Translucent - - - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/talk/examples/ios/AppRTCDemo/Info.plist b/talk/examples/ios/AppRTCDemo/Info.plist new file mode 100644 index 0000000000..72504aa5c8 --- /dev/null +++ b/talk/examples/ios/AppRTCDemo/Info.plist @@ -0,0 +1,77 @@ + + + + + BuildMachineOSBuild + 12E55 + CFBundleDevelopmentRegion + en + CFBundleDisplayName + AppRTCDemo + CFBundleExecutable + AppRTCDemo + CFBundleIcons + + CFBundlePrimaryIcon + + CFBundleIconFiles + + Icon.png + + + + CFBundleIdentifier + com.google.AppRTCDemo + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + AppRTCDemo + CFBundlePackageType + APPL + CFBundleResourceSpecification + ResourceRules.plist + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + iPhoneOS + + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + com.google.apprtcdemo + CFBundleURLSchemes + + apprtc + + + + CFBundleVersion + 1.0 + UIRequiredDeviceCapabilities + + armv7 + + UIStatusBarTintParameters + + UINavigationBar + + Style + UIBarStyleDefault + Translucent + + + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/talk/examples/ios/AppRTCDemo/ResourceRules.plist b/talk/examples/ios/AppRTCDemo/ResourceRules.plist new file mode 100644 index 0000000000..e7ec329dcc --- /dev/null +++ b/talk/examples/ios/AppRTCDemo/ResourceRules.plist @@ -0,0 +1,25 @@ + + + + + rules + + .* + + Info.plist + + omit + + weight + 10 + + ResourceRules.plist + + omit + + weight + 100 + + + + diff --git a/talk/examples/ios/README b/talk/examples/ios/README index 9dbbd3fe0e..9c0d134171 100644 --- a/talk/examples/ios/README +++ b/talk/examples/ios/README @@ -1,28 +1,3 @@ This directory contains an example iOS client for http://apprtc.appspot.com -Example of building & using the app: - -cd /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= - 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= where 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. +See ../../app/webrtc/objc/README for information on how to use it. diff --git a/talk/examples/ios/makeLibs.sh b/talk/examples/ios/makeLibs.sh deleted file mode 100755 index b5bf3cda76..0000000000 --- a/talk/examples/ios/makeLibs.sh +++ /dev/null @@ -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 diff --git a/talk/libjingle.gyp b/talk/libjingle.gyp index 0944f76b53..8317150fbc 100755 --- a/talk/libjingle.gyp +++ b/talk/libjingle.gyp @@ -163,10 +163,10 @@ 'app/webrtc/objc/RTCEnumConverter.h', 'app/webrtc/objc/RTCEnumConverter.mm', 'app/webrtc/objc/RTCI420Frame.mm', - 'app/webrtc/objc/RTCIceCandidate+Internal.h', - 'app/webrtc/objc/RTCIceCandidate.mm', - 'app/webrtc/objc/RTCIceServer+Internal.h', - 'app/webrtc/objc/RTCIceServer.mm', + 'app/webrtc/objc/RTCICECandidate+Internal.h', + 'app/webrtc/objc/RTCICECandidate.mm', + 'app/webrtc/objc/RTCICEServer+Internal.h', + 'app/webrtc/objc/RTCICEServer.mm', 'app/webrtc/objc/RTCMediaConstraints+Internal.h', 'app/webrtc/objc/RTCMediaConstraints.mm', 'app/webrtc/objc/RTCMediaConstraintsNative.cc', @@ -196,8 +196,8 @@ 'app/webrtc/objc/public/RTCAudioSource.h', 'app/webrtc/objc/public/RTCAudioTrack.h', 'app/webrtc/objc/public/RTCI420Frame.h', - 'app/webrtc/objc/public/RTCIceCandidate.h', - 'app/webrtc/objc/public/RTCIceServer.h', + 'app/webrtc/objc/public/RTCICECandidate.h', + 'app/webrtc/objc/public/RTCICEServer.h', 'app/webrtc/objc/public/RTCMediaConstraints.h', 'app/webrtc/objc/public/RTCMediaSource.h', 'app/webrtc/objc/public/RTCMediaStream.h', @@ -215,6 +215,11 @@ 'app/webrtc/objc/public/RTCVideoSource.h', 'app/webrtc/objc/public/RTCVideoTrack.h', ], + 'direct_dependent_settings': { + 'include_dirs': [ + '<(DEPTH)/talk/app/webrtc/objc/public', + ], + }, 'include_dirs': [ '<(DEPTH)/talk/app/webrtc', '<(DEPTH)/talk/app/webrtc/objc', @@ -227,8 +232,6 @@ }, 'xcode_settings': { 'CLANG_ENABLE_OBJC_ARC': 'YES', - 'CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS': 'NO', - 'CLANG_LINK_OBJC_RUNTIME': 'YES', }, } ] @@ -629,15 +632,12 @@ }, }], ['OS=="ios"', { - # 'dependencies': [ - # '<(DEPTH)/third_party/openssl/openssl.gyp:openssl', - # ], - # 'include_dirs': [ - # '<(DEPTH)/third_party/openssl/openssl/include', - # ], 'sources': [ 'base/scoped_autorelease_pool.mm', ], + 'dependencies': [ + '../net/third_party/nss/ssl.gyp:libssl', + ], 'xcode_settings': { 'OTHER_LDFLAGS': [ '-framework IOKit', @@ -646,9 +646,6 @@ '-framework UIKit', ], }, - 'defines': [ - 'SSL_USE_NSS', - ], }], ['OS=="win"', { 'sources': [ diff --git a/talk/libjingle_examples.gyp b/talk/libjingle_examples.gyp index 9170ba04b5..cc252b2a9c 100755 --- a/talk/libjingle_examples.gyp +++ b/talk/libjingle_examples.gyp @@ -218,6 +218,65 @@ ], # targets }], # 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', + '