diff --git a/.gitignore b/.gitignore index 85ebf7300..a4f580755 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,7 @@ buck-out/ fastlane/report.xml fastlane/Preview.html fastlane/screenshots + +# CocoaPods +Pods/ +Podfile.lock diff --git a/ios/Jitsi Meet SDK.xcodeproj/project.pbxproj b/ios/Jitsi Meet SDK.xcodeproj/project.pbxproj new file mode 100644 index 000000000..679872058 --- /dev/null +++ b/ios/Jitsi Meet SDK.xcodeproj/project.pbxproj @@ -0,0 +1,445 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0B412F181EDEC65D00B1A0A6 /* JitsiMeetView.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B412F161EDEC65D00B1A0A6 /* JitsiMeetView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0B412F191EDEC65D00B1A0A6 /* JitsiMeetView.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B412F171EDEC65D00B1A0A6 /* JitsiMeetView.m */; }; + 0B412F221EDEF6EA00B1A0A6 /* JitsiMeetViewDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B412F1B1EDEC80100B1A0A6 /* JitsiMeetViewDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0B93EF7B1EC608550030D24D /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B93EF7A1EC608550030D24D /* CoreText.framework */; }; + 0B93EF7E1EC9DDCD0030D24D /* JitsiRCTBridgeWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B93EF7C1EC9DDCD0030D24D /* JitsiRCTBridgeWrapper.h */; }; + 0B93EF7F1EC9DDCD0030D24D /* JitsiRTCBridgeWrapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B93EF7D1EC9DDCD0030D24D /* JitsiRTCBridgeWrapper.m */; }; + 0BCA495F1EC4B6C600B793EE /* AudioMode.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BCA495C1EC4B6C600B793EE /* AudioMode.m */; }; + 0BCA49601EC4B6C600B793EE /* POSIX.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BCA495D1EC4B6C600B793EE /* POSIX.m */; }; + 0BCA49611EC4B6C600B793EE /* Proximity.m in Sources */ = {isa = PBXBuildFile; fileRef = 0BCA495E1EC4B6C600B793EE /* Proximity.m */; }; + 0BCA49641EC4B76D00B793EE /* WebRTC.framework in Copy embedded WebRTC framework */ = {isa = PBXBuildFile; fileRef = 0BCA49631EC4B76D00B793EE /* WebRTC.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 0BCA496C1EC4BBF900B793EE /* jitsi.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 0BCA496B1EC4BBF900B793EE /* jitsi.ttf */; }; + 0BD906EA1EC0C00300C8C18E /* JitsiMeet.h in Headers */ = {isa = PBXBuildFile; fileRef = 0BD906E81EC0C00300C8C18E /* JitsiMeet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 399E84404A63DA0F3B34EB9C /* libPods-JitsiMeet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F102AB2F4BCDCF220A512816 /* libPods-JitsiMeet.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 0BCA49621EC4B74500B793EE /* Copy embedded WebRTC framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 0BCA49641EC4B76D00B793EE /* WebRTC.framework in Copy embedded WebRTC framework */, + ); + name = "Copy embedded WebRTC framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 062651321278D27A9BAEFAD4 /* Pods-JitsiMeet.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeet.debug.xcconfig"; path = "Pods/Target Support Files/Pods-JitsiMeet/Pods-JitsiMeet.debug.xcconfig"; sourceTree = ""; }; + 0B412F161EDEC65D00B1A0A6 /* JitsiMeetView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JitsiMeetView.h; sourceTree = ""; }; + 0B412F171EDEC65D00B1A0A6 /* JitsiMeetView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JitsiMeetView.m; sourceTree = ""; }; + 0B412F1B1EDEC80100B1A0A6 /* JitsiMeetViewDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JitsiMeetViewDelegate.h; sourceTree = ""; }; + 0B93EF7A1EC608550030D24D /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; + 0B93EF7C1EC9DDCD0030D24D /* JitsiRCTBridgeWrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JitsiRCTBridgeWrapper.h; sourceTree = ""; }; + 0B93EF7D1EC9DDCD0030D24D /* JitsiRTCBridgeWrapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = JitsiRTCBridgeWrapper.m; sourceTree = ""; }; + 0BCA495C1EC4B6C600B793EE /* AudioMode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AudioMode.m; sourceTree = ""; }; + 0BCA495D1EC4B6C600B793EE /* POSIX.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = POSIX.m; sourceTree = ""; }; + 0BCA495E1EC4B6C600B793EE /* Proximity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Proximity.m; sourceTree = ""; }; + 0BCA49631EC4B76D00B793EE /* WebRTC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebRTC.framework; path = "../node_modules/react-native-webrtc/ios/WebRTC.framework"; sourceTree = ""; }; + 0BCA496B1EC4BBF900B793EE /* jitsi.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = jitsi.ttf; path = ../fonts/jitsi.ttf; sourceTree = ""; }; + 0BD906E51EC0C00300C8C18E /* JitsiMeet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = JitsiMeet.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0BD906E81EC0C00300C8C18E /* JitsiMeet.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JitsiMeet.h; sourceTree = ""; }; + 0BD906E91EC0C00300C8C18E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E358F7AEFCB4033712107DF5 /* Pods-JitsiMeet.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-JitsiMeet.release.xcconfig"; path = "Pods/Target Support Files/Pods-JitsiMeet/Pods-JitsiMeet.release.xcconfig"; sourceTree = ""; }; + F102AB2F4BCDCF220A512816 /* libPods-JitsiMeet.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-JitsiMeet.a"; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 0BD906E11EC0C00300C8C18E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 0B93EF7B1EC608550030D24D /* CoreText.framework in Frameworks */, + 399E84404A63DA0F3B34EB9C /* libPods-JitsiMeet.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0BCA49681EC4BBE500B793EE /* Resources */ = { + isa = PBXGroup; + children = ( + 0BCA496B1EC4BBF900B793EE /* jitsi.ttf */, + ); + name = Resources; + sourceTree = ""; + }; + 0BD906DB1EC0C00300C8C18E = { + isa = PBXGroup; + children = ( + 0BCA49681EC4BBE500B793EE /* Resources */, + 0BD906E71EC0C00300C8C18E /* sdk */, + 0BD906E61EC0C00300C8C18E /* Products */, + C2471A7E156487CC2009E5E0 /* Pods */, + 9C3C6FA2341729836589B856 /* Frameworks */, + ); + sourceTree = ""; + }; + 0BD906E61EC0C00300C8C18E /* Products */ = { + isa = PBXGroup; + children = ( + 0BD906E51EC0C00300C8C18E /* JitsiMeet.framework */, + ); + name = Products; + sourceTree = ""; + }; + 0BD906E71EC0C00300C8C18E /* sdk */ = { + isa = PBXGroup; + children = ( + 0BD906E81EC0C00300C8C18E /* JitsiMeet.h */, + 0BCA495C1EC4B6C600B793EE /* AudioMode.m */, + 0BCA495D1EC4B6C600B793EE /* POSIX.m */, + 0BCA495E1EC4B6C600B793EE /* Proximity.m */, + 0BD906E91EC0C00300C8C18E /* Info.plist */, + 0B93EF7C1EC9DDCD0030D24D /* JitsiRCTBridgeWrapper.h */, + 0B93EF7D1EC9DDCD0030D24D /* JitsiRTCBridgeWrapper.m */, + 0B412F1B1EDEC80100B1A0A6 /* JitsiMeetViewDelegate.h */, + 0B412F161EDEC65D00B1A0A6 /* JitsiMeetView.h */, + 0B412F171EDEC65D00B1A0A6 /* JitsiMeetView.m */, + ); + path = sdk; + sourceTree = ""; + }; + 9C3C6FA2341729836589B856 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 0B93EF7A1EC608550030D24D /* CoreText.framework */, + 0BCA49631EC4B76D00B793EE /* WebRTC.framework */, + F102AB2F4BCDCF220A512816 /* libPods-JitsiMeet.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + C2471A7E156487CC2009E5E0 /* Pods */ = { + isa = PBXGroup; + children = ( + 062651321278D27A9BAEFAD4 /* Pods-JitsiMeet.debug.xcconfig */, + E358F7AEFCB4033712107DF5 /* Pods-JitsiMeet.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 0BD906E21EC0C00300C8C18E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 0B412F181EDEC65D00B1A0A6 /* JitsiMeetView.h in Headers */, + 0B93EF7E1EC9DDCD0030D24D /* JitsiRCTBridgeWrapper.h in Headers */, + 0B412F221EDEF6EA00B1A0A6 /* JitsiMeetViewDelegate.h in Headers */, + 0BD906EA1EC0C00300C8C18E /* JitsiMeet.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 0BD906E41EC0C00300C8C18E /* JitsiMeet */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0BD906ED1EC0C00300C8C18E /* Build configuration list for PBXNativeTarget "JitsiMeet" */; + buildPhases = ( + 8203CAE533C18CEC8284C979 /* [CP] Check Pods Manifest.lock */, + 0BD906E01EC0C00300C8C18E /* Sources */, + 0BD906E11EC0C00300C8C18E /* Frameworks */, + 0BD906E21EC0C00300C8C18E /* Headers */, + 0BD906E31EC0C00300C8C18E /* Resources */, + 512A060342EDB080C9BBD5BA /* [CP] Copy Pods Resources */, + 0BCA49621EC4B74500B793EE /* Copy embedded WebRTC framework */, + 0BCA49651EC4B77500B793EE /* Package React bundle */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = JitsiMeet; + productName = "Jitsi Meet SDK"; + productReference = 0BD906E51EC0C00300C8C18E /* JitsiMeet.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0BD906DC1EC0C00300C8C18E /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = Jitsi; + TargetAttributes = { + 0BD906E41EC0C00300C8C18E = { + CreatedOnToolsVersion = 8.3.2; + DevelopmentTeam = BQNXB4G3KQ; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 0BD906DF1EC0C00300C8C18E /* Build configuration list for PBXProject "Jitsi Meet SDK" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 0BD906DB1EC0C00300C8C18E; + productRefGroup = 0BD906E61EC0C00300C8C18E /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 0BD906E41EC0C00300C8C18E /* JitsiMeet */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 0BD906E31EC0C00300C8C18E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0BCA496C1EC4BBF900B793EE /* jitsi.ttf in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 0BCA49651EC4B77500B793EE /* Package React bundle */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Package React bundle"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; + }; + 512A060342EDB080C9BBD5BA /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-JitsiMeet/Pods-JitsiMeet-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + 8203CAE533C18CEC8284C979 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 0BD906E01EC0C00300C8C18E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0B93EF7F1EC9DDCD0030D24D /* JitsiRTCBridgeWrapper.m in Sources */, + 0BCA49601EC4B6C600B793EE /* POSIX.m in Sources */, + 0BCA495F1EC4B6C600B793EE /* AudioMode.m in Sources */, + 0BCA49611EC4B6C600B793EE /* Proximity.m in Sources */, + 0B412F191EDEC65D00B1A0A6 /* JitsiMeetView.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 0BD906EB1EC0C00300C8C18E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_BITCODE = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 0BD906EC1EC0C00300C8C18E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_BITCODE = NO; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 0BD906EE1EC0C00300C8C18E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 062651321278D27A9BAEFAD4 /* Pods-JitsiMeet.debug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = BQNXB4G3KQ; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = sdk/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Debug; + }; + 0BD906EF1EC0C00300C8C18E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E358F7AEFCB4033712107DF5 /* Pods-JitsiMeet.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = "iPhone Developer"; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = BQNXB4G3KQ; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = sdk/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = org.jitsi.JitsiKit; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0BD906DF1EC0C00300C8C18E /* Build configuration list for PBXProject "Jitsi Meet SDK" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0BD906EB1EC0C00300C8C18E /* Debug */, + 0BD906EC1EC0C00300C8C18E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 0BD906ED1EC0C00300C8C18E /* Build configuration list for PBXNativeTarget "JitsiMeet" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0BD906EE1EC0C00300C8C18E /* Debug */, + 0BD906EF1EC0C00300C8C18E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0BD906DC1EC0C00300C8C18E /* Project object */; +} diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 000000000..dd606e4eb --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,32 @@ +platform :ios, '9.0' + +workspace 'jitsi-meet' +project 'Jitsi Meet SDK.xcodeproj' + +target 'JitsiMeet' do + pod 'React', :path => '../node_modules/react-native', :subspecs => [ + 'Core', + 'RCTActionSheet', + 'RCTAnimation', + 'RCTImage', + 'RCTLinkingIOS', + 'RCTNetwork', + 'RCTText', + 'RCTWebSocket', + ] + pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga' + + pod 'react-native-background-timer', :path => '../node_modules/react-native-background-timer' + pod 'react-native-keep-awake', :path => '../node_modules/react-native-keep-awake' + pod 'react-native-webrtc', :path => '../node_modules/react-native-webrtc' + pod 'RNVectorIcons', :path => '../node_modules/react-native-vector-icons' + +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['ENABLE_BITCODE'] = 'NO' + end + end +end diff --git a/ios/README.md b/ios/README.md new file mode 100644 index 000000000..ba671d011 --- /dev/null +++ b/ios/README.md @@ -0,0 +1,68 @@ +# Jitsi Meet SDK for iOS + +This directory contains the source code for Jitsi Meet for iOS (the application) +and the Jitsi Meet SDK. + +## Jitsi Meet SDK + +JitsiMeet is an iOS framework which embodies the Jitsi Meet experience, +gift-wrapped so other applications can use it. Using it is very simple. Use +a Storyboard or Interface Builder to add a `JitsiMeetView` to your +application. + +Then, once the view has loaded, set the delegate in your controller and load the +desired URL: + +```objc +- (void)viewDidLoad { + [super viewDidLoad]; + + JitsiMeetView *meetView = (JitsiMeetView*) self.view; + meetView.delegate = self; + [meetView loadURL:nil]; +} +``` + +### JitsiMeetView class + +The `JitsiMeetView` class is the entrypoint to the SDK. It a subclass of +`UIView` which renders a full conference in the designated area. + +```objc +[meetView loadURL:[NSURL URLWithString:@"https://meet.jit.si/test123"]]; +``` + +Loads the given URL and joins the room. If `null` is specified the welcome page +is displayed instead. + +#### Universal / deep linking + +In order to support universal / deep linking, `JitsiMeetView` offers 2 class +methods that you application's delegate should call in order for the application +to follow those links. Example: + +```objc +- (BOOL)application:(UIApplication *)application +continueUserActivity:(NSUserActivity *)userActivity + restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler +{ + return [JitsiMeetView application:application + continueUserActivity:userActivity + restorationHandler:restorationHandler]; + } + +- (BOOL)application:(UIApplication *)application + openURL:(NSURL *)url + sourceApplication:(NSString *)sourceApplication + annotation:(id)annotation +{ + return [JitsiMeetView application:application + openURL:url + sourceApplication:sourceApplication + annotation:annotation]; +} +``` + +### JitsiMeetViewDelegate + +TODO. diff --git a/ios/app/AppDelegate.h b/ios/app/AppDelegate.h index a9654d5e0..24f760427 100644 --- a/ios/app/AppDelegate.h +++ b/ios/app/AppDelegate.h @@ -1,14 +1,22 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. +/* + * Copyright @ 2017-present Atlassian Pty Ltd * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ #import + @interface AppDelegate : UIResponder @property (nonatomic, strong) UIWindow *window; diff --git a/ios/app/AppDelegate.m b/ios/app/AppDelegate.m index 077ea011e..372351214 100644 --- a/ios/app/AppDelegate.m +++ b/ios/app/AppDelegate.m @@ -1,101 +1,51 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. +/* + * Copyright @ 2017-present Atlassian Pty Ltd * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ #import "AppDelegate.h" -#import -#import -#import -#import +#import -/** - * A RCTFatalHandler implementation which swallows JavaScript errors. - * In the Release configuration, React Native will (intentionally) raise an - * unhandled NSException for an unhandled JavaScript error. This will - * effectively kill the application. _RCTFatal is suitable to be in - * accord with the Web i.e. not kill the application. - */ -RCTFatalHandler _RCTFatal = ^(NSError *error) { - id jsStackTrace = error.userInfo[RCTJSStackTraceKey]; - @try { - NSString *name - = [NSString stringWithFormat:@"%@: %@", - RCTFatalExceptionName, - error.localizedDescription]; - NSString *message - = RCTFormatError(error.localizedDescription, jsStackTrace, 75); - [NSException raise:name format:@"%@", message]; - } @catch (NSException *e) { - if (!jsStackTrace) { - @throw; - } - } -}; @implementation AppDelegate -// https://facebook.github.io/react-native/docs/linking.html +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + return YES; +} + +#pragma mark linking delegate methods + - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler { - return [RCTLinkingManager application:application - continueUserActivity:userActivity - restorationHandler:restorationHandler]; -} + return [JitsiMeetView application:application + continueUserActivity:userActivity + restorationHandler:restorationHandler]; + } -- (BOOL)application:(UIApplication *)application -didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ -#if !DEBUG - // In the Release configuration, React Native will (intentionally) raise an - // unhandled NSException for an unhandled JavaScript error. This will - // effectively kill the application. In accord with the Web, do not kill the - // application. - if (!RCTGetFatalHandler()) { - RCTSetFatalHandler(_RCTFatal); - } -#endif - - NSURL *jsCodeLocation - = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" - fallbackResource:nil]; - RCTRootView *rootView - = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation - moduleName:@"App" - initialProperties:nil - launchOptions:launchOptions]; - - // Set a background color which is in accord with the JavaScript and Android - // parts of the application and causes less perceived visual flicker than the - // default background color. - rootView.backgroundColor - = [[UIColor alloc] initWithRed:.07f green:.07f blue:.07f alpha:1]; - - self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - UIViewController *rootViewController = [UIViewController new]; - rootViewController.view = rootView; - self.window.rootViewController = rootViewController; - [self.window makeKeyAndVisible]; - return YES; -} - -// https://facebook.github.io/react-native/docs/linking.html - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { - return [RCTLinkingManager application:application - openURL:url - sourceApplication:sourceApplication - annotation:annotation]; + return [JitsiMeetView application:application + openURL:url + sourceApplication:sourceApplication + annotation:annotation]; } @end diff --git a/ios/app/Base.lproj/Main.storyboard b/ios/app/Base.lproj/Main.storyboard new file mode 100644 index 000000000..51e552fa0 --- /dev/null +++ b/ios/app/Base.lproj/Main.storyboard @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/app/Info.plist b/ios/app/Info.plist index 9247b0bf5..e38efe636 100644 --- a/ios/app/Info.plist +++ b/ios/app/Info.plist @@ -61,17 +61,14 @@ NSMicrophoneUsageDescription Participate in conferences with audio. - UIAppFonts - - jitsi.ttf - FontAwesome.ttf - UIBackgroundModes audio fetch voip + UIMainStoryboardFile + Main UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities diff --git a/ios/app/Proximity.m b/ios/app/Proximity.m deleted file mode 100644 index bae26f334..000000000 --- a/ios/app/Proximity.m +++ /dev/null @@ -1,24 +0,0 @@ -#import "RCTBridgeModule.h" - -#import - -@interface Proximity : NSObject -@end - -@implementation Proximity - -RCT_EXPORT_MODULE(); - -/** - * Enables / disables the proximity sensor monitoring. On iOS enabling the - * proximity sensor automatically dims the screen and disables touch controls, - * so there is nothing else to do (unlike on Android)! - * - * @param enabled {@code YES} to enable proximity (sensor) monitoring; - * {@code NO}, otherwise. - */ -RCT_EXPORT_METHOD(setEnabled:(BOOL)enabled) { - [[UIDevice currentDevice] setProximityMonitoringEnabled:enabled]; -} - -@end diff --git a/ios/app/ViewController.h b/ios/app/ViewController.h new file mode 100644 index 000000000..0e89dcc63 --- /dev/null +++ b/ios/app/ViewController.h @@ -0,0 +1,24 @@ +/* + * Copyright @ 2017-present Atlassian Pty Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import + + +@interface ViewController : UIViewController + +@end diff --git a/ios/app/ViewController.m b/ios/app/ViewController.m new file mode 100644 index 000000000..54983d6e5 --- /dev/null +++ b/ios/app/ViewController.m @@ -0,0 +1,37 @@ +/* + * Copyright @ 2017-present Atlassian Pty Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "ViewController.h" + +@interface ViewController () + +@end + +@implementation ViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + JitsiMeetView *meetView = (JitsiMeetView*) self.view; + meetView.delegate = self; + [meetView loadURL:nil]; +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; +} + +@end diff --git a/ios/app/main.m b/ios/app/main.m index 3d767fcbb..b52792902 100644 --- a/ios/app/main.m +++ b/ios/app/main.m @@ -1,10 +1,17 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. +/* + * Copyright @ 2017-present Atlassian Pty Ltd * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ #import diff --git a/ios/jitsi-meet.xcodeproj/project.pbxproj b/ios/jitsi-meet.xcodeproj/project.pbxproj index d478da05d..1b5cbe5fd 100644 --- a/ios/jitsi-meet.xcodeproj/project.pbxproj +++ b/ios/jitsi-meet.xcodeproj/project.pbxproj @@ -7,265 +7,24 @@ objects = { /* Begin PBXBuildFile section */ - 002AF788986B412780935607 /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B96AF9B6FBC0453798399985 /* FontAwesome.ttf */; }; - 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; - 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; - 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; - 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; - 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; - 0B42DFAE1E2FD90700111B12 /* AudioMode.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B42DFAD1E2FD90700111B12 /* AudioMode.m */; }; - 0B96CAF11E8CF0E8005F348C /* Proximity.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B96CAF01E8CF0E8005F348C /* Proximity.m */; }; - 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; - 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; - 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; + 0B26BE6E1EC5BC3C00EEFB41 /* JitsiMeet.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B26BE6D1EC5BC3C00EEFB41 /* JitsiMeet.framework */; }; + 0B26BE6F1EC5BC3C00EEFB41 /* JitsiMeet.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0B26BE6D1EC5BC3C00EEFB41 /* JitsiMeet.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 0B412F1F1EDEE6E800B1A0A6 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0B412F1E1EDEE6E800B1A0A6 /* ViewController.m */; }; + 0B412F211EDEE95300B1A0A6 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0B412F201EDEE95300B1A0A6 /* Main.storyboard */; }; 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; - 2602576C1D0A7703001E3363 /* jitsi.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2602576B1D0A7703001E3363 /* jitsi.ttf */; }; - 3847F11906B4479A9162628F /* libRNVectorIcons.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 821D8ABD506944B4BDBB069B /* libRNVectorIcons.a */; }; - 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; - 7FAD39BE09A84D6AB0ABACA8 /* libRNBackgroundTimer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 27A0018BBB2C4FD5A4F9CE71 /* libRNBackgroundTimer.a */; }; - 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; - 901FE90FA5744B5B94DCDC41 /* libKCKeepAwake.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0EA8C046B2BF46279796F07D /* libKCKeepAwake.a */; }; - B30EF2311DC0ED7C00690F45 /* WebRTC.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B30EF2301DC0ED7C00690F45 /* WebRTC.framework */; }; - B30EF2331DC0EEA500690F45 /* WebRTC.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = B30EF2301DC0ED7C00690F45 /* WebRTC.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - B3A9D0251E0481E10009343D /* POSIX.m in Sources */ = {isa = PBXBuildFile; fileRef = B3A9D0241E0481E10009343D /* POSIX.m */; }; - BF9643821C34FBB300B0BBDF /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9643811C34FBB300B0BBDF /* AVFoundation.framework */; }; - BF9643841C34FBBB00B0BBDF /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9643831C34FBBB00B0BBDF /* AudioToolbox.framework */; }; - BF9643861C34FBC100B0BBDF /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9643851C34FBC100B0BBDF /* CoreGraphics.framework */; }; - BF9643881C34FBC800B0BBDF /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9643871C34FBC800B0BBDF /* GLKit.framework */; }; - BF96438A1C34FBD100B0BBDF /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9643891C34FBD100B0BBDF /* CoreAudio.framework */; }; - BF96438C1C34FBD700B0BBDF /* CoreVideo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF96438B1C34FBD700B0BBDF /* CoreVideo.framework */; }; - BF96438E1C34FBE100B0BBDF /* VideoToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BF96438D1C34FBE100B0BBDF /* VideoToolbox.framework */; }; - BF9643901C34FBEB00B0BBDF /* libc.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BF96438F1C34FBEB00B0BBDF /* libc.tbd */; }; - BF9643921C34FBF100B0BBDF /* libsqlite3.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9643911C34FBF100B0BBDF /* libsqlite3.tbd */; }; - BF9643941C34FBF900B0BBDF /* libstdc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = BF9643931C34FBF900B0BBDF /* libstdc++.tbd */; }; - BFC745141CB829B300673F38 /* libRCTWebRTC.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BFC745131CB829A700673F38 /* libRCTWebRTC.a */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTActionSheet; - }; - 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTGeolocation; - }; - 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 58B5115D1A9E6B3D00147676; - remoteInfo = RCTImage; - }; - 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 58B511DB1A9E6C8500147676; - remoteInfo = RCTNetwork; - }; - 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; - remoteInfo = RCTVibration; - }; - 0B50D60B1EA7891100B34818 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5B09C20C78C74A548AAAC1FA /* KCKeepAwake.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 325F5AB71E6763EC00E6CDE4; - remoteInfo = "KCKeepAwake-tvOS"; - }; - 0B8752851E26E54A004C5CAB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5B09C20C78C74A548AAAC1FA /* KCKeepAwake.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = KCKeepAwake; - }; - 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTSettings; - }; - 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3C86DF461ADF2C930047B81A; - remoteInfo = RCTWebSocket; - }; - 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; - remoteInfo = React; - }; - 26D58A061D0B42EE00FC396B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 22418656B14845609F953A42 /* RNVectorIcons.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 5DBEB1501B18CEA900B34395; - remoteInfo = RNVectorIcons; - }; - 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3C059A1DE3340900C268FA; - remoteInfo = yoga; - }; - 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3C06751DE3340C00C268FA; - remoteInfo = "yoga-tvOS"; - }; - 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD9251DE5FBEC00167DC4; - remoteInfo = cxxreact; - }; - 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD9321DE5FBEE00167DC4; - remoteInfo = "cxxreact-tvOS"; - }; - 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD90B1DE5FBD600167DC4; - remoteInfo = jschelpers; - }; - 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3D3CD9181DE5FBD800167DC4; - remoteInfo = "jschelpers-tvOS"; - }; - 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTAnimation; - }; - 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28201D9B03D100D4039D; - remoteInfo = "RCTAnimation-tvOS"; - }; - 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RCTLinking; - }; - 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 58B5119B1A9E6C1200147676; - remoteInfo = RCTText; - }; - B332D04E1E54E3170086EA16 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0965153BB98645B4A8B6AA10 /* RNBackgroundTimer.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 134814201AA4EA6300B7C361; - remoteInfo = RNBackgroundTimer; - }; - B3BA19D41DC6B37B00BCD481 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; - remoteInfo = "RCTImage-tvOS"; - }; - B3BA19D81DC6B37B00BCD481 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28471D9B043800D4039D; - remoteInfo = "RCTLinking-tvOS"; - }; - B3BA19DC1DC6B37B00BCD481 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28541D9B044C00D4039D; - remoteInfo = "RCTNetwork-tvOS"; - }; - B3BA19E01DC6B37B00BCD481 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28611D9B046600D4039D; - remoteInfo = "RCTSettings-tvOS"; - }; - B3BA19E41DC6B37B00BCD481 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A287B1D9B048500D4039D; - remoteInfo = "RCTText-tvOS"; - }; - B3BA19EA1DC6B37B00BCD481 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28881D9B049200D4039D; - remoteInfo = "RCTWebSocket-tvOS"; - }; - B3BA19EE1DC6B37B00BCD481 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 2D2A28131D9B038B00D4039D; - remoteInfo = "React-tvOS"; - }; - BFC745121CB829A700673F38 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFC7450D1CB829A700673F38 /* RCTWebRTC.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 35A2221F1CB493700015FD5C; - remoteInfo = RCTWebRTC; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXCopyFilesBuildPhase section */ - B30EF2341DC0EEA500690F45 /* Embed Frameworks */ = { + 0B26BE701EC5BC3C00EEFB41 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - B30EF2331DC0EEA500690F45 /* WebRTC.framework in Embed Frameworks */, + 0B26BE6F1EC5BC3C00EEFB41 /* JitsiMeet.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -273,18 +32,10 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; - 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; - 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; - 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; - 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; - 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; - 0965153BB98645B4A8B6AA10 /* RNBackgroundTimer.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNBackgroundTimer.xcodeproj; path = "../node_modules/react-native-background-timer/ios/RNBackgroundTimer.xcodeproj"; sourceTree = ""; }; - 0B42DFAD1E2FD90700111B12 /* AudioMode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AudioMode.m; path = app/AudioMode.m; sourceTree = ""; }; - 0B96CAF01E8CF0E8005F348C /* Proximity.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Proximity.m; path = app/Proximity.m; sourceTree = ""; }; - 0EA8C046B2BF46279796F07D /* libKCKeepAwake.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libKCKeepAwake.a; sourceTree = ""; }; - 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; - 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; + 0B26BE6D1EC5BC3C00EEFB41 /* JitsiMeet.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = JitsiMeet.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0B412F1D1EDEE6E800B1A0A6 /* ViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ViewController.h; path = app/ViewController.h; sourceTree = ""; }; + 0B412F1E1EDEE6E800B1A0A6 /* ViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ViewController.m; path = app/ViewController.m; sourceTree = ""; }; + 0B412F201EDEE95300B1A0A6 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Main.storyboard; path = app/Base.lproj/Main.storyboard; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* jitsi-meet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "jitsi-meet.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = app/AppDelegate.h; sourceTree = ""; }; 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = app/AppDelegate.m; sourceTree = ""; }; @@ -292,30 +43,7 @@ 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = app/Images.xcassets; sourceTree = ""; }; 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = app/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = app/main.m; sourceTree = ""; }; - 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; - 22418656B14845609F953A42 /* RNVectorIcons.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNVectorIcons.xcodeproj; path = "../node_modules/react-native-vector-icons/RNVectorIcons.xcodeproj"; sourceTree = ""; }; - 2602576B1D0A7703001E3363 /* jitsi.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = jitsi.ttf; path = ../android/app/src/main/assets/fonts/jitsi.ttf; sourceTree = ""; }; - 27A0018BBB2C4FD5A4F9CE71 /* libRNBackgroundTimer.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNBackgroundTimer.a; sourceTree = ""; }; - 5B09C20C78C74A548AAAC1FA /* KCKeepAwake.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = KCKeepAwake.xcodeproj; path = "../node_modules/react-native-keep-awake/ios/KCKeepAwake.xcodeproj"; sourceTree = ""; }; - 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; - 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; - 821D8ABD506944B4BDBB069B /* libRNVectorIcons.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNVectorIcons.a; sourceTree = ""; }; - 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; - B30EF2301DC0ED7C00690F45 /* WebRTC.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebRTC.framework; path = "../node_modules/react-native-webrtc/ios/WebRTC.framework"; sourceTree = ""; }; - B3A9D0241E0481E10009343D /* POSIX.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = POSIX.m; path = app/POSIX.m; sourceTree = ""; }; B3B083EB1D4955FF0069CEE7 /* jitsi-meet.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "jitsi-meet.entitlements"; sourceTree = ""; }; - B96AF9B6FBC0453798399985 /* FontAwesome.ttf */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = unknown; name = FontAwesome.ttf; path = "../node_modules/react-native-vector-icons/Fonts/FontAwesome.ttf"; sourceTree = ""; }; - BF9643811C34FBB300B0BBDF /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; - BF9643831C34FBBB00B0BBDF /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; - BF9643851C34FBC100B0BBDF /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; - BF9643871C34FBC800B0BBDF /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = System/Library/Frameworks/GLKit.framework; sourceTree = SDKROOT; }; - BF9643891C34FBD100B0BBDF /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = System/Library/Frameworks/CoreAudio.framework; sourceTree = SDKROOT; }; - BF96438B1C34FBD700B0BBDF /* CoreVideo.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreVideo.framework; path = System/Library/Frameworks/CoreVideo.framework; sourceTree = SDKROOT; }; - BF96438D1C34FBE100B0BBDF /* VideoToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VideoToolbox.framework; path = System/Library/Frameworks/VideoToolbox.framework; sourceTree = SDKROOT; }; - BF96438F1C34FBEB00B0BBDF /* libc.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libc.tbd; path = usr/lib/libc.tbd; sourceTree = SDKROOT; }; - BF9643911C34FBF100B0BBDF /* libsqlite3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.tbd; path = usr/lib/libsqlite3.tbd; sourceTree = SDKROOT; }; - BF9643931C34FBF900B0BBDF /* libstdc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libstdc++.tbd"; path = "usr/lib/libstdc++.tbd"; sourceTree = SDKROOT; }; - BFC7450D1CB829A700673F38 /* RCTWebRTC.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebRTC.xcodeproj; path = "../node_modules/react-native-webrtc/ios/RCTWebRTC.xcodeproj"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -323,217 +51,44 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - BF9643901C34FBEB00B0BBDF /* libc.tbd in Frameworks */, - BF9643921C34FBF100B0BBDF /* libsqlite3.tbd in Frameworks */, - BF9643941C34FBF900B0BBDF /* libstdc++.tbd in Frameworks */, - BF9643841C34FBBB00B0BBDF /* AudioToolbox.framework in Frameworks */, - BF9643821C34FBB300B0BBDF /* AVFoundation.framework in Frameworks */, - BF96438A1C34FBD100B0BBDF /* CoreAudio.framework in Frameworks */, - BF9643861C34FBC100B0BBDF /* CoreGraphics.framework in Frameworks */, - BF96438C1C34FBD700B0BBDF /* CoreVideo.framework in Frameworks */, - BF9643881C34FBC800B0BBDF /* GLKit.framework in Frameworks */, - B30EF2311DC0ED7C00690F45 /* WebRTC.framework in Frameworks */, - BF96438E1C34FBE100B0BBDF /* VideoToolbox.framework in Frameworks */, - 901FE90FA5744B5B94DCDC41 /* libKCKeepAwake.a in Frameworks */, - 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, - 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, - 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, - 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, - 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, - 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, - 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, - 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, - 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, - BFC745141CB829B300673F38 /* libRCTWebRTC.a in Frameworks */, - 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, - 146834051AC3E58100842450 /* libReact.a in Frameworks */, - 7FAD39BE09A84D6AB0ABACA8 /* libRNBackgroundTimer.a in Frameworks */, - 3847F11906B4479A9162628F /* libRNVectorIcons.a in Frameworks */, + 0B26BE6E1EC5BC3C00EEFB41 /* JitsiMeet.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 00C302A81ABCB8CE00DB3ED1 /* Products */ = { + 0B26BE711EC5BC4D00EEFB41 /* Frameworks */ = { isa = PBXGroup; children = ( - 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, + 0B26BE6D1EC5BC3C00EEFB41 /* JitsiMeet.framework */, ); - name = Products; - sourceTree = ""; - }; - 00C302B61ABCB90400DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302BC1ABCB91800DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, - B3BA19D51DC6B37B00BCD481 /* libRCTImage-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302D41ABCB9D200DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, - B3BA19DD1DC6B37B00BCD481 /* libRCTNetwork-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 00C302E01ABCB9EE00DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, - ); - name = Products; - sourceTree = ""; - }; - 0B8752821E26E54A004C5CAB /* Products */ = { - isa = PBXGroup; - children = ( - 0B8752861E26E54A004C5CAB /* libKCKeepAwake.a */, - 0B50D60C1EA7891100B34818 /* libKCKeepAwake-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 139105B71AF99BAD00B5F7CC /* Products */ = { - isa = PBXGroup; - children = ( - 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, - B3BA19E11DC6B37B00BCD481 /* libRCTSettings-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 139FDEE71B06529A00C62182 /* Products */ = { - isa = PBXGroup; - children = ( - 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, - B3BA19EB1DC6B37B00BCD481 /* libRCTWebSocket-tvOS.a */, - ); - name = Products; + name = Frameworks; sourceTree = ""; }; 13B07FAE1A68108700A75B9A /* app */ = { isa = PBXGroup; children = ( + 13B07FB71A68108700A75B9A /* main.m */, 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 13B07FB01A68108700A75B9A /* AppDelegate.m */, - 0B42DFAD1E2FD90700111B12 /* AudioMode.m */, + 0B412F1D1EDEE6E800B1A0A6 /* ViewController.h */, + 0B412F1E1EDEE6E800B1A0A6 /* ViewController.m */, + 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, + 0B412F201EDEE95300B1A0A6 /* Main.storyboard */, 13B07FB51A68108700A75B9A /* Images.xcassets */, 13B07FB61A68108700A75B9A /* Info.plist */, - 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, - 008F07F21AC5B25A0029DE68 /* main.jsbundle */, - 13B07FB71A68108700A75B9A /* main.m */, - B3A9D0241E0481E10009343D /* POSIX.m */, - 0B96CAF01E8CF0E8005F348C /* Proximity.m */, ); name = app; sourceTree = ""; }; - 146834001AC3E56700842450 /* Products */ = { - isa = PBXGroup; - children = ( - 146834041AC3E56700842450 /* libReact.a */, - B3BA19EF1DC6B37B00BCD481 /* libReact.a */, - 3DAD3EA51DF850E9000B6D8A /* libyoga.a */, - 3DAD3EA71DF850E9000B6D8A /* libyoga.a */, - 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */, - 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */, - 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */, - 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */, - ); - name = Products; - sourceTree = ""; - }; - 26D589F81D0B42EE00FC396B /* Products */ = { - isa = PBXGroup; - children = ( - 26D58A071D0B42EE00FC396B /* libRNVectorIcons.a */, - ); - name = Products; - sourceTree = ""; - }; - 5E91572E1DD0AC6500FF2AA8 /* Products */ = { - isa = PBXGroup; - children = ( - 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, - 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 6956B374CC3C453DB7B8E82D /* Resources */ = { - isa = PBXGroup; - children = ( - B96AF9B6FBC0453798399985 /* FontAwesome.ttf */, - 2602576B1D0A7703001E3363 /* jitsi.ttf */, - ); - name = Resources; - sourceTree = ""; - }; - 78C398B11ACF4ADC00677621 /* Products */ = { - isa = PBXGroup; - children = ( - 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, - B3BA19D91DC6B37B00BCD481 /* libRCTLinking-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; - 832341AE1AAA6A7D00B99B32 /* Libraries */ = { - isa = PBXGroup; - children = ( - 5B09C20C78C74A548AAAC1FA /* KCKeepAwake.xcodeproj */, - BF96438F1C34FBEB00B0BBDF /* libc.tbd */, - BF9643911C34FBF100B0BBDF /* libsqlite3.tbd */, - BF9643931C34FBF900B0BBDF /* libstdc++.tbd */, - 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, - 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, - 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, - 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, - 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, - 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, - 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, - 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, - 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, - BFC7450D1CB829A700673F38 /* RCTWebRTC.xcodeproj */, - 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, - 146833FF1AC3E56700842450 /* React.xcodeproj */, - 0965153BB98645B4A8B6AA10 /* RNBackgroundTimer.xcodeproj */, - 22418656B14845609F953A42 /* RNVectorIcons.xcodeproj */, - ); - name = Libraries; - sourceTree = ""; - }; - 832341B11AAA6A8300B99B32 /* Products */ = { - isa = PBXGroup; - children = ( - 832341B51AAA6A8300B99B32 /* libRCTText.a */, - B3BA19E51DC6B37B00BCD481 /* libRCTText-tvOS.a */, - ); - name = Products; - sourceTree = ""; - }; 83CBB9F61A601CBA00E9B192 = { isa = PBXGroup; children = ( + 0B26BE711EC5BC4D00EEFB41 /* Frameworks */, 13B07FAE1A68108700A75B9A /* app */, - B3BA19B71DC6B02F00BCD481 /* Frameworks */, B3B083EB1D4955FF0069CEE7 /* jitsi-meet.entitlements */, - 832341AE1AAA6A7D00B99B32 /* Libraries */, 83CBBA001A601CBA00E9B192 /* Products */, - 6956B374CC3C453DB7B8E82D /* Resources */, ); indentWidth = 2; sourceTree = ""; @@ -547,37 +102,6 @@ name = Products; sourceTree = ""; }; - B332D0301E54E3170086EA16 /* Products */ = { - isa = PBXGroup; - children = ( - B332D04F1E54E3170086EA16 /* libRNBackgroundTimer.a */, - ); - name = Products; - sourceTree = ""; - }; - B3BA19B71DC6B02F00BCD481 /* Frameworks */ = { - isa = PBXGroup; - children = ( - BF9643831C34FBBB00B0BBDF /* AudioToolbox.framework */, - BF9643811C34FBB300B0BBDF /* AVFoundation.framework */, - BF9643891C34FBD100B0BBDF /* CoreAudio.framework */, - BF9643851C34FBC100B0BBDF /* CoreGraphics.framework */, - BF96438B1C34FBD700B0BBDF /* CoreVideo.framework */, - BF9643871C34FBC800B0BBDF /* GLKit.framework */, - BF96438D1C34FBE100B0BBDF /* VideoToolbox.framework */, - B30EF2301DC0ED7C00690F45 /* WebRTC.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - BFC7450E1CB829A700673F38 /* Products */ = { - isa = PBXGroup; - children = ( - BFC745131CB829A700673F38 /* libRCTWebRTC.a */, - ); - name = Products; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -585,19 +109,20 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "jitsi-meet" */; buildPhases = ( + 0BBA83C41EC9F7600075A103 /* Run React packager */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, - B30EF2341DC0EEA500690F45 /* Embed Frameworks */, - B35383AD1DDA0083008F406A /* ShellScript */, + 0B26BE701EC5BC3C00EEFB41 /* Embed Frameworks */, + B35383AD1DDA0083008F406A /* Adjust embedded framework architectures */, + 0BB7DA181EC9E695007AAE98 /* Adjust ATS */, ); buildRules = ( ); dependencies = ( ); name = "jitsi-meet"; - productName = "Hello World"; + productName = "Jitsi Meet"; productReference = 13B07F961A680F5B00A75B9A /* jitsi-meet.app */; productType = "com.apple.product-type.application"; }; @@ -631,68 +156,6 @@ mainGroup = 83CBB9F61A601CBA00E9B192; productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; projectDirPath = ""; - projectReferences = ( - { - ProductGroup = 0B8752821E26E54A004C5CAB /* Products */; - ProjectRef = 5B09C20C78C74A548AAAC1FA /* KCKeepAwake.xcodeproj */; - }, - { - ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; - ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; - }, - { - ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; - ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; - }, - { - ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; - ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; - }, - { - ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; - ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; - }, - { - ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; - ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; - }, - { - ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; - ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; - }, - { - ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; - ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; - }, - { - ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; - ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; - }, - { - ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; - ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; - }, - { - ProductGroup = BFC7450E1CB829A700673F38 /* Products */; - ProjectRef = BFC7450D1CB829A700673F38 /* RCTWebRTC.xcodeproj */; - }, - { - ProductGroup = 139FDEE71B06529A00C62182 /* Products */; - ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; - }, - { - ProductGroup = 146834001AC3E56700842450 /* Products */; - ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; - }, - { - ProductGroup = B332D0301E54E3170086EA16 /* Products */; - ProjectRef = 0965153BB98645B4A8B6AA10 /* RNBackgroundTimer.xcodeproj */; - }, - { - ProductGroup = 26D589F81D0B42EE00FC396B /* Products */; - ProjectRef = 22418656B14845609F953A42 /* RNVectorIcons.xcodeproj */; - }, - ); projectRoot = ""; targets = ( 13B07F861A680F5B00A75B9A /* jitsi-meet */, @@ -700,260 +163,61 @@ }; /* End PBXProject section */ -/* Begin PBXReferenceProxy section */ - 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTActionSheet.a; - remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTGeolocation.a; - remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTImage.a; - remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTNetwork.a; - remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTVibration.a; - remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 0B50D60C1EA7891100B34818 /* libKCKeepAwake-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libKCKeepAwake-tvOS.a"; - remoteRef = 0B50D60B1EA7891100B34818 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 0B8752861E26E54A004C5CAB /* libKCKeepAwake.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libKCKeepAwake.a; - remoteRef = 0B8752851E26E54A004C5CAB /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTSettings.a; - remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTWebSocket.a; - remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 146834041AC3E56700842450 /* libReact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libReact.a; - remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 26D58A071D0B42EE00FC396B /* libRNVectorIcons.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRNVectorIcons.a; - remoteRef = 26D58A061D0B42EE00FC396B /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EA51DF850E9000B6D8A /* libyoga.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libyoga.a; - remoteRef = 3DAD3EA41DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EA71DF850E9000B6D8A /* libyoga.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libyoga.a; - remoteRef = 3DAD3EA61DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EA91DF850E9000B6D8A /* libcxxreact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libcxxreact.a; - remoteRef = 3DAD3EA81DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EAB1DF850E9000B6D8A /* libcxxreact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libcxxreact.a; - remoteRef = 3DAD3EAA1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EAD1DF850E9000B6D8A /* libjschelpers.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libjschelpers.a; - remoteRef = 3DAD3EAC1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 3DAD3EAF1DF850E9000B6D8A /* libjschelpers.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libjschelpers.a; - remoteRef = 3DAD3EAE1DF850E9000B6D8A /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTAnimation.a; - remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTAnimation-tvOS.a"; - remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTLinking.a; - remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTText.a; - remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - B332D04F1E54E3170086EA16 /* libRNBackgroundTimer.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRNBackgroundTimer.a; - remoteRef = B332D04E1E54E3170086EA16 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - B3BA19D51DC6B37B00BCD481 /* libRCTImage-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTImage-tvOS.a"; - remoteRef = B3BA19D41DC6B37B00BCD481 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - B3BA19D91DC6B37B00BCD481 /* libRCTLinking-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTLinking-tvOS.a"; - remoteRef = B3BA19D81DC6B37B00BCD481 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - B3BA19DD1DC6B37B00BCD481 /* libRCTNetwork-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTNetwork-tvOS.a"; - remoteRef = B3BA19DC1DC6B37B00BCD481 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - B3BA19E11DC6B37B00BCD481 /* libRCTSettings-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTSettings-tvOS.a"; - remoteRef = B3BA19E01DC6B37B00BCD481 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - B3BA19E51DC6B37B00BCD481 /* libRCTText-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTText-tvOS.a"; - remoteRef = B3BA19E41DC6B37B00BCD481 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - B3BA19EB1DC6B37B00BCD481 /* libRCTWebSocket-tvOS.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libRCTWebSocket-tvOS.a"; - remoteRef = B3BA19EA1DC6B37B00BCD481 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - B3BA19EF1DC6B37B00BCD481 /* libReact.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libReact.a; - remoteRef = B3BA19EE1DC6B37B00BCD481 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - BFC745131CB829A700673F38 /* libRCTWebRTC.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTWebRTC.a; - remoteRef = BFC745121CB829A700673F38 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; -/* End PBXReferenceProxy section */ - /* Begin PBXResourcesBuildPhase section */ 13B07F8E1A680F5B00A75B9A /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 0B412F211EDEE95300B1A0A6 /* Main.storyboard in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, - 2602576C1D0A7703001E3363 /* jitsi.ttf in Resources */, - 002AF788986B412780935607 /* FontAwesome.ttf in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + 0BB7DA181EC9E695007AAE98 /* Adjust ATS */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Bundle React Native code and images"; + name = "Adjust ATS"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; + shellScript = "utils/fixup-ats.sh"; }; - B35383AD1DDA0083008F406A /* ShellScript */ = { + 0BBA83C41EC9F7600075A103 /* Run React packager */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); + name = "Run React packager"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "APP_PATH=\"${TARGET_BUILD_DIR}/${WRAPPER_NAME}\"\n\n# This script loops through the frameworks embedded in the application and\n# removes unused architectures.\nfind \"$APP_PATH\" -name '*.framework' -type d | while read -r FRAMEWORK\ndo\nFRAMEWORK_EXECUTABLE_NAME=$(defaults read \"$FRAMEWORK/Info.plist\" CFBundleExecutable)\nFRAMEWORK_EXECUTABLE_PATH=\"$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME\"\necho \"Executable is $FRAMEWORK_EXECUTABLE_PATH\"\n\nEXTRACTED_ARCHS=()\n\nfor ARCH in $ARCHS\ndo\necho \"Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME\"\nlipo -extract \"$ARCH\" \"$FRAMEWORK_EXECUTABLE_PATH\" -o \"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\"\nEXTRACTED_ARCHS+=(\"$FRAMEWORK_EXECUTABLE_PATH-$ARCH\")\ndone\n\necho \"Merging extracted architectures: ${ARCHS}\"\nlipo -o \"$FRAMEWORK_EXECUTABLE_PATH-merged\" -create \"${EXTRACTED_ARCHS[@]}\"\nrm \"${EXTRACTED_ARCHS[@]}\"\n\necho \"Replacing original executable with thinned version\"\nrm \"$FRAMEWORK_EXECUTABLE_PATH\"\nmv \"$FRAMEWORK_EXECUTABLE_PATH-merged\" \"$FRAMEWORK_EXECUTABLE_PATH\"\n\ndone"; + shellScript = "utils/run-packager.sh"; + }; + B35383AD1DDA0083008F406A /* Adjust embedded framework architectures */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Adjust embedded framework architectures"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "utils/fixup-frameworks.sh"; }; /* End PBXShellScriptBuildPhase section */ @@ -962,9 +226,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - B3A9D0251E0481E10009343D /* POSIX.m in Sources */, - 0B96CAF11E8CF0E8005F348C /* Proximity.m in Sources */, - 0B42DFAE1E2FD90700111B12 /* AudioMode.m in Sources */, + 0B412F1F1EDEE6E800B1A0A6 /* ViewController.m in Sources */, 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 13B07FC11A68108700A75B9A /* main.m in Sources */, ); @@ -993,26 +255,15 @@ CURRENT_PROJECT_VERSION = 1; DEAD_CODE_STRIPPING = NO; ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-webrtc/**", - ); + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../node_modules/react-native/React/**", - "$(SRCROOT)/../node_modules/react-native/Libraries/LinkingIOS/**", - "$(SRCROOT)/../node_modules/react-native-background-timer/ios", - "$(SRCROOT)/../node_modules/react-native-keep-awake/ios", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", ); INFOPLIST_FILE = app/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-webrtc/**", - ); + LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1031,26 +282,15 @@ CODE_SIGN_ENTITLEMENTS = "jitsi-meet.entitlements"; CURRENT_PROJECT_VERSION = 1; ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-webrtc/**", - ); + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../node_modules/react-native/React/**", - "$(SRCROOT)/../node_modules/react-native/Libraries/LinkingIOS/**", - "$(SRCROOT)/../node_modules/react-native-background-timer/ios", - "$(SRCROOT)/../node_modules/react-native-keep-awake/ios", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", ); INFOPLIST_FILE = app/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(SRCROOT)/../node_modules/react-native-webrtc/**", - ); + LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = ( "$(inherited)", "-ObjC", @@ -1083,6 +323,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1103,12 +344,8 @@ HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../node_modules/react-native/React/**", - "$(SRCROOT)/../node_modules/react-native-background-timer/ios", - "$(SRCROOT)/../node_modules/react-native-keep-awake/ios", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", ); - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -1136,6 +373,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; + ENABLE_BITCODE = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; @@ -1149,12 +387,8 @@ HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/../node_modules/react-native/React/**", - "$(SRCROOT)/../node_modules/react-native-background-timer/ios", - "$(SRCROOT)/../node_modules/react-native-keep-awake/ios", - "$(SRCROOT)/../node_modules/react-native-vector-icons/RNVectorIconsManager", ); - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; diff --git a/ios/jitsi-meet.xcodeproj/xcshareddata/xcschemes/jitsi-meet.xcscheme b/ios/jitsi-meet.xcodeproj/xcshareddata/xcschemes/jitsi-meet.xcscheme index 930da39e6..89510fcb1 100644 --- a/ios/jitsi-meet.xcodeproj/xcshareddata/xcschemes/jitsi-meet.xcscheme +++ b/ios/jitsi-meet.xcodeproj/xcshareddata/xcschemes/jitsi-meet.xcscheme @@ -14,10 +14,10 @@ buildForAnalyzing = "YES"> + BlueprintIdentifier = "0BD906E41EC0C00300C8C18E" + BuildableName = "JitsiMeet.framework" + BlueprintName = "JitsiMeet" + ReferencedContainer = "container:Jitsi Meet SDK.xcodeproj"> + + + + diff --git a/ios/app/AudioMode.m b/ios/sdk/AudioMode.m similarity index 86% rename from ios/app/AudioMode.m rename to ios/sdk/AudioMode.m index 4acec567a..96f96cb1b 100644 --- a/ios/app/AudioMode.m +++ b/ios/sdk/AudioMode.m @@ -1,3 +1,19 @@ +/* + * Copyright @ 2017-present Atlassian Pty Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #import "RCTBridgeModule.h" #import "RCTLog.h" diff --git a/ios/sdk/Info.plist b/ios/sdk/Info.plist new file mode 100644 index 000000000..90fa3558b --- /dev/null +++ b/ios/sdk/Info.plist @@ -0,0 +1,29 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + JitsiKitFonts + + jitsi.ttf + FontAwesome.ttf + + + diff --git a/ios/sdk/JitsiMeet.h b/ios/sdk/JitsiMeet.h new file mode 100644 index 000000000..e1b00906d --- /dev/null +++ b/ios/sdk/JitsiMeet.h @@ -0,0 +1,18 @@ +/* + * Copyright @ 2017-present Atlassian Pty Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import diff --git a/ios/sdk/JitsiMeetView.h b/ios/sdk/JitsiMeetView.h new file mode 100644 index 000000000..3c744e57b --- /dev/null +++ b/ios/sdk/JitsiMeetView.h @@ -0,0 +1,38 @@ +/* + * Copyright @ 2017-present Atlassian Pty Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import +#import + +#import "JitsiMeetViewDelegate.h" + + +@interface JitsiMeetView : UIView + +@property (nonatomic, weak, nullable) id delegate; + ++ (BOOL)application:(UIApplication *)application +continueUserActivity:(NSUserActivity *)userActivity + restorationHandler:(void (^)(NSArray *))restorationHandler; + ++ (BOOL)application:(UIApplication *)application + openURL:(NSURL *)URL + sourceApplication:(NSString *)sourceApplication + annotation:(id)annotation; + +- (void)loadURL:(nullable NSURL *)url; + +@end diff --git a/ios/sdk/JitsiMeetView.m b/ios/sdk/JitsiMeetView.m new file mode 100644 index 000000000..1abdfedf1 --- /dev/null +++ b/ios/sdk/JitsiMeetView.m @@ -0,0 +1,212 @@ +/* + * Copyright @ 2017-present Atlassian Pty Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import +#import +#import + +#import "JitsiMeetView.h" +#import "JitsiRCTBridgeWrapper.h" + + +/** + * A RCTFatalHandler implementation which swallows JavaScript errors. + * In the Release configuration, React Native will (intentionally) raise an + * unhandled NSException for an unhandled JavaScript error. This will + * effectively kill the application. _RCTFatal is suitable to be in + * accord with the Web i.e. not kill the application. + */ +RCTFatalHandler _RCTFatal = ^(NSError *error) +{ + id jsStackTrace = error.userInfo[RCTJSStackTraceKey]; + @try { + NSString *name + = [NSString stringWithFormat:@"%@: %@", + RCTFatalExceptionName, error.localizedDescription]; + NSString *message + = RCTFormatError(error.localizedDescription, jsStackTrace, 75); + [NSException raise:name format:@"%@", message]; + } @catch (NSException *e) { + if (!jsStackTrace) { + @throw; + } + } +}; + + +@interface JitsiMeetView() { + RCTRootView *rootView; +} + +@end + + +@implementation JitsiMeetView + +static JitsiRCTBridgeWrapper *jitsiBridge; + + +#pragma mark linking delegate helpers +// https://facebook.github.io/react-native/docs/linking.html + ++ (BOOL)application:(UIApplication *)application +continueUserActivity:(NSUserActivity *)userActivity + restorationHandler:(void (^)(NSArray *restorableObjects))restorationHandler +{ + return [RCTLinkingManager application:application + continueUserActivity:userActivity + restorationHandler:restorationHandler]; +} + ++ (BOOL)application:(UIApplication *)application + openURL:(NSURL *)url + sourceApplication:(NSString *)sourceApplication + annotation:(id)annotation +{ + return [RCTLinkingManager application:application + openURL:url + sourceApplication:sourceApplication + annotation:annotation]; +} + +#pragma mark initializers + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self) { + [self initialize]; + } + + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder +{ + self = [super initWithCoder:aDecoder]; + if (self) { + [self initialize]; + } + + return self; +} + +#pragma mark API + +/* + * Loads the given URL and joins the specified conference. If the specified URL + * is null, the welcome page is shown. + */ +- (void)loadURL:(NSURL *)url +{ + NSDictionary *props = url ? @{ url : url.absoluteString } : nil; + if (rootView == nil) { + rootView + = [[RCTRootView alloc] initWithBridge:jitsiBridge.bridge + moduleName:@"App" + initialProperties:props]; + rootView.backgroundColor = self.backgroundColor; + + // Add React's root view as a subview which completely covers this one. + [rootView setFrame:[self bounds]]; + [self addSubview:rootView]; + } else { + // Update props with the new URL + rootView.appProperties = props; + } +} + +#pragma mark private methods + +/* + * Internal initialization: + * + * - sets the backgroudn color + * - creates the React bridge + * - loads the necessary custom fonts + * - registers a custom fatal error error handler for React + */ +- (void)initialize +{ + static dispatch_once_t onceToken; + + dispatch_once(&onceToken, ^{ + // Set a background color which is in accord with the JavaScript and + // Android parts of the application and causes less perceived visual + // flicker than the default background color. + self.backgroundColor + = [UIColor colorWithRed:.07f green:.07f blue:.07f alpha:1]; + + // Initialize the React bridge. + jitsiBridge = [[JitsiRCTBridgeWrapper alloc] init]; + + // Dynamically load custom bundled fonts. + [self loadCustomFonts]; + + // Register a fatal error handler for React. + [self registerFatalErrorHandler]; + }); +} + +/* + * Helper function to dynamically load custom fonts. The UIAppFonts key in the + * plist file doesn't work for frameworks, so fonts have to be manually loaded. + */ +- (void)loadCustomFonts +{ + NSBundle *bundle = [NSBundle bundleForClass:self.class]; + NSArray *fonts = [bundle objectForInfoDictionaryKey:@"JitsiKitFonts"]; + + for (NSString *item in fonts) { + NSString *fontName = [item stringByDeletingPathExtension]; + NSString *fontExt = [item pathExtension]; + NSString *fontPath = [bundle pathForResource:fontName ofType:fontExt]; + NSData *inData = [NSData dataWithContentsOfFile:fontPath]; + CFErrorRef error; + CGDataProviderRef provider + = CGDataProviderCreateWithCFData((__bridge CFDataRef)inData); + CGFontRef font = CGFontCreateWithDataProvider(provider); + if (!CTFontManagerRegisterGraphicsFont(font, &error)) { + CFStringRef errorDescription = CFErrorCopyDescription(error); + NSLog(@"Failed to load font: %@", errorDescription); + CFRelease(errorDescription); + } + CFRelease(font); + CFRelease(provider); + } +} + +/* + * Helper function to register a fatal error handler for React. Our handler + * won't kill the process, it will swallow JS errors and print stack traces + * instead. + */ +- (void)registerFatalErrorHandler +{ +#if !DEBUG + // In the Release configuration, React Native will (intentionally) raise + // an unhandled NSException for an unhandled JavaScript error. This will + // effectively kill the application. In accord with the Web, do not kill + // the application. + if (!RCTGetFatalHandler()) { + RCTSetFatalHandler(_RCTFatal); + } +#endif +} + +@end diff --git a/ios/sdk/JitsiMeetViewDelegate.h b/ios/sdk/JitsiMeetViewDelegate.h new file mode 100644 index 000000000..90a460c70 --- /dev/null +++ b/ios/sdk/JitsiMeetViewDelegate.h @@ -0,0 +1,21 @@ +/* + * Copyright @ 2017-present Atlassian Pty Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@protocol JitsiMeetViewDelegate + +// TODO: add delegate methods + +@end diff --git a/ios/sdk/JitsiRCTBridgeWrapper.h b/ios/sdk/JitsiRCTBridgeWrapper.h new file mode 100644 index 000000000..2932db203 --- /dev/null +++ b/ios/sdk/JitsiRCTBridgeWrapper.h @@ -0,0 +1,37 @@ +/* + * Copyright @ 2017-present Atlassian Pty Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import + +#import +#import + +/** + * A wrapper around the RCTBridge which implements the delegate methods + * that allow us to serve the JS bundle from within the framework's resources + * directory. This is the recommended way for those cases where the builtin API + * doesn't cut it, as is the case. + * + * In addition, we will create a single bridge and then create all root views + * off it, thus only loading the JS bundle a single time. This class is not a + * singleton, however, so it's possible for us to create multiple instances of + * it, though that's not currently used. + */ +@interface JitsiRCTBridgeWrapper : NSObject + +@property (nonatomic, readonly, strong) RCTBridge *bridge; + +@end diff --git a/ios/sdk/JitsiRTCBridgeWrapper.m b/ios/sdk/JitsiRTCBridgeWrapper.m new file mode 100644 index 000000000..3e936c290 --- /dev/null +++ b/ios/sdk/JitsiRTCBridgeWrapper.m @@ -0,0 +1,119 @@ +/* + * Copyright @ 2017-present Atlassian Pty Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "JitsiRCTBridgeWrapper.h" + +/* + * Wrapper around RCTBridge which also implements the RCTBridgeDelegate methods, + * allowing us to specify where the bundles are loaded from. + */ +@implementation JitsiRCTBridgeWrapper + +- (instancetype)init +{ + self = [super init]; + + if (self) { + _bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:nil]; + } + + return self; +} + +#pragma mark helper methods for getting the packager URL + +#if DEBUG +static NSURL *serverRootWithHost(NSString *host) +{ + return [NSURL URLWithString: + [NSString stringWithFormat:@"http://%@:8081/", host]]; +} + +- (BOOL)isPackagerRunning:(NSString *)host +{ + NSURL *url = [serverRootWithHost(host) + URLByAppendingPathComponent:@"status"]; + NSURLRequest *request = [NSURLRequest requestWithURL:url]; + NSURLResponse *response; + NSData *data = [NSURLConnection sendSynchronousRequest:request + returningResponse:&response + error:NULL]; + NSString *status = [[NSString alloc] initWithData:data + encoding:NSUTF8StringEncoding]; + return [status isEqualToString:@"packager-status:running"]; +} + +- (NSString *)guessPackagerHost +{ + static NSString *ipGuess; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSString *ipPath = [[NSBundle bundleForClass:self.class] + pathForResource:@"ip" ofType:@"txt"]; + ipGuess = [[NSString stringWithContentsOfFile:ipPath + encoding:NSUTF8StringEncoding + error:nil] + stringByTrimmingCharactersInSet: + [NSCharacterSet newlineCharacterSet]]; + }); + + NSString *host = ipGuess ?: @"localhost"; + if ([self isPackagerRunning:host]) { + return host; + } + + return nil; +} +#endif + +#pragma mark RCTBridgeDelegate methods + +- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge +{ +#if DEBUG + /* + * In debug mode, try to fetch the bundle from the packager, or fallback to + * the one inside the framework. The IP address for the packager host is + * fetched from the ip.txt file inside the framework. + * + * This duplicates some functionality present in RCTBundleURLProvider, but + * that mode is not designed to work inside a framework, because all + * resources are loaded from the main bundle. + */ + NSString *host = [self guessPackagerHost]; + if (host != nil) { + NSString *path = @"/index.ios.bundle"; + NSString *query = @"platform=ios&dev=true&minify=false"; + NSURLComponents *components + = [NSURLComponents componentsWithURL:serverRootWithHost(host) + resolvingAgainstBaseURL:NO]; + components.path = path; + components.query = query; + + return components.URL; + } +#endif + + return [self fallbackSourceURLForBridge:bridge]; +} + +- (NSURL *)fallbackSourceURLForBridge:(RCTBridge *)bridge +{ + return [[NSBundle bundleForClass:self.class] URLForResource:@"main" + withExtension:@"jsbundle"]; +} + +@end diff --git a/ios/app/POSIX.m b/ios/sdk/POSIX.m similarity index 73% rename from ios/app/POSIX.m rename to ios/sdk/POSIX.m index 19a5a3713..d3dc0d3a6 100644 --- a/ios/app/POSIX.m +++ b/ios/sdk/POSIX.m @@ -1,3 +1,19 @@ +/* + * Copyright @ 2017-present Atlassian Pty Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #import "RCTBridgeModule.h" #include diff --git a/ios/sdk/Proximity.m b/ios/sdk/Proximity.m new file mode 100644 index 000000000..c38489edb --- /dev/null +++ b/ios/sdk/Proximity.m @@ -0,0 +1,40 @@ +/* + * Copyright @ 2017-present Atlassian Pty Ltd + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#import "RCTBridgeModule.h" + +#import + +@interface Proximity : NSObject +@end + +@implementation Proximity + +RCT_EXPORT_MODULE(); + +/** + * Enables / disables the proximity sensor monitoring. On iOS enabling the + * proximity sensor automatically dims the screen and disables touch controls, + * so there is nothing else to do (unlike on Android)! + * + * @param enabled {@code YES} to enable proximity (sensor) monitoring; + * {@code NO}, otherwise. + */ +RCT_EXPORT_METHOD(setEnabled:(BOOL)enabled) { + [[UIDevice currentDevice] setProximityMonitoringEnabled:enabled]; +} + +@end diff --git a/ios/utils/fixup-ats.sh b/ios/utils/fixup-ats.sh new file mode 100755 index 000000000..081618857 --- /dev/null +++ b/ios/utils/fixup-ats.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# This script gets executed from Xcode to disable ATS (App Transport Security) +# on Debug builds. Doing this allows loading resources over HTTP, such as the +# JS bundle. + + +set -x + +case "$CONFIGURATION" in + Debug) + # Speed up build times by skipping the creation of the offline package for debug + # builds on the simulator since the packager is supposed to be running anyways. + if [[ "$PLATFORM_NAME" == *simulator ]]; then + echo "Skipping bundling for Simulator platform" + exit 0; + fi + + DEV=true + ;; + "") + echo "$0 must be invoked by Xcode" + exit 1 + ;; + *) + DEV=false + ;; +esac + +DEST=$CONFIGURATION_BUILD_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH + +if [[ "$CONFIGURATION" = "Debug" && ! "$PLATFORM_NAME" == *simulator ]]; then + PLISTBUDDY='/usr/libexec/PlistBuddy' + PLIST=$TARGET_BUILD_DIR/$INFOPLIST_PATH + `$PLISTBUDDY -c "Add NSAppTransportSecurity:NSAllowsArbitraryLoads bool true" "$PLIST"` || true +fi diff --git a/ios/utils/fixup-frameworks.sh b/ios/utils/fixup-frameworks.sh new file mode 100755 index 000000000..c8b43d049 --- /dev/null +++ b/ios/utils/fixup-frameworks.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# This script gets executed from Xcode to fixup the embedded frameworks and +# bundle the necessary architectures. + + +APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}" + +# This script loops through the frameworks embedded in the application and +# removes unused architectures. +find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK +do + FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable) + FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME" + echo "Executable is $FRAMEWORK_EXECUTABLE_PATH" + + EXTRACTED_ARCHS=() + + for ARCH in $ARCHS + do + if lipo -info "$FRAMEWORK_EXECUTABLE_PATH" | grep -q -v "^Non-fat" + then + echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME" + lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH" + EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH") + fi + done + + if [ -n "$EXTRACTED_ARCHS" ] + then + echo "Merging extracted architectures: ${ARCHS}" + lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}" + rm "${EXTRACTED_ARCHS[@]}" + + echo "Replacing original executable with thinned version" + rm "$FRAMEWORK_EXECUTABLE_PATH" + mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH" + fi +done diff --git a/ios/utils/run-packager.sh b/ios/utils/run-packager.sh new file mode 100755 index 000000000..00b7830b9 --- /dev/null +++ b/ios/utils/run-packager.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# This script is executed from Xcode to start the React packager for Debug +# targets. + + +if [[ "$CONFIGURATION" = "Debug" ]]; then + if nc -w 5 -z localhost 8081 ; then + if ! curl -s "http://localhost:8081/status" | grep -q "packager-status:running" ; then + echo "Port 8081 already in use, packager is either not running or not running correctly" + exit 2 + fi + else + open "$SRCROOT/../node_modules/react-native/packager/launchPackager.command" || echo "Can't start packager automatically" + fi +fi