diff --git a/android/app/src/main/java/im/status/ethereum/MainActivity.java b/android/app/src/main/java/im/status/ethereum/MainActivity.java index 97ef701856..875ebe1979 100644 --- a/android/app/src/main/java/im/status/ethereum/MainActivity.java +++ b/android/app/src/main/java/im/status/ethereum/MainActivity.java @@ -27,7 +27,7 @@ public class MainActivity extends ReactActivity { protected void onCreate(Bundle savedInstanceState) { SplashScreen.show(this); super.onCreate(savedInstanceState); - TestFairy.begin(this, "33e4bd97daaaacf3b1b6425096fb65186248fe44"); + TestFairy.begin(this, "969f6c921cb435cea1d41d1ea3f5b247d6026d55"); if (!RootUtil.isDeviceRooted()) { configureStatus(); diff --git a/ios/StatusIm.xcodeproj/project.pbxproj b/ios/StatusIm.xcodeproj/project.pbxproj index 425dd5d257..141323187f 100644 --- a/ios/StatusIm.xcodeproj/project.pbxproj +++ b/ios/StatusIm.xcodeproj/project.pbxproj @@ -7,24 +7,24 @@ objects = { /* Begin PBXBuildFile section */ - 00C302E51ABCBA2D00DB3ED1 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; - 00C302E71ABCBA2D00DB3ED1 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; - 00C302E81ABCBA2D00DB3ED1 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; - 00C302E91ABCBA2D00DB3ED1 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; - 00C302EA1ABCBA2D00DB3ED1 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; + 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; + 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; + 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; + 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; + 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; 00E356F31AD99517003FC87E /* StatusImTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* StatusImTests.m */; }; 0F942CF509F74CCDB5CB35B0 /* MaterialIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 54E2B86FB12D4CC49DA05C69 /* MaterialIcons.ttf */; }; - 133E29F31AD74F7200F7D852 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; - 139105C61AF99C1200B5F7CC /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; - 139FDEF61B0652A700C62182 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 146834051AC3E58100842450 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; + 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 2028DFF91D4275B600227DCD /* SF-UI-Display-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2028DFF51D4275B600227DCD /* SF-UI-Display-Medium.otf */; }; 2028DFFA1D4275B600227DCD /* SF-UI-Display-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2028DFF61D4275B600227DCD /* SF-UI-Display-Regular.otf */; }; 2028DFFB1D4275B600227DCD /* SF-UI-Display-Semibold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2028DFF71D4275B600227DCD /* SF-UI-Display-Semibold.otf */; }; 2028DFFC1D4275B600227DCD /* SF-UI-Display-Thin.otf in Resources */ = {isa = PBXBuildFile; fileRef = 2028DFF81D4275B600227DCD /* SF-UI-Display-Thin.otf */; }; - 20AB9EC61D47CC0300E7FD9C /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 201067C41D4789F700FA83B6 /* libRCTStatus.a */; }; + 20AB9EC61D47CC0300E7FD9C /* libRCTStatus.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 201067C41D4789F700FA83B6 /* libRCTStatus.a */; }; 20B6B6841D92C42600CC5C6A /* RSKImageCropper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 20B6B6831D92C42600CC5C6A /* RSKImageCropper.framework */; }; 20B6B6851D92C42600CC5C6A /* RSKImageCropper.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 20B6B6831D92C42600CC5C6A /* RSKImageCropper.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 20B6B6871D92C42600CC5C6A /* QBImagePicker.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 20B6B6861D92C42600CC5C6A /* QBImagePicker.framework */; }; @@ -41,27 +41,29 @@ 74242ACAF37A48D0BFACDE82 /* Zocial.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 2756305FAFF144C4A6B0A039 /* Zocial.ttf */; }; 81C6E6AE0AA739BE9D87C1D0 /* libPods-StatusImTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FC1CBCFE6C906043D6CCEEE1 /* libPods-StatusImTests.a */; }; 82E689BAF9FB43C8AC6FF1CA /* EvilIcons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CEB0E2659D1A4F5FA842057A /* EvilIcons.ttf */; }; - 832341BD1AAA6AB300B99B32 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; + 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; 8E55E6877F950B81C8D711C5 /* libPods-StatusIm.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 101A4045637A2ADF57D28EF5 /* libPods-StatusIm.a */; }; 9E0B01A11DDC5DA7002B0359 /* SF-UI-Text-Light.otf in Resources */ = {isa = PBXBuildFile; fileRef = 9E0B01A01DDC5DA7002B0359 /* SF-UI-Text-Light.otf */; }; - 9E3AB6D01D87DB2B008846B4 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 9E3AB6C61D87DA2B008846B4 /* libReact-Native-Webview-Bridge.a */; }; - 9E7C64731E03FDDE004C7042 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 20B7D1151D3F74CD00B70F14 /* libRCTCamera.a */; }; - 9E7C64991E03FDE5004C7042 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 20B7D10A1D3F74CD00B70F14 /* libRCTContacts.a */; }; + 9E3AB6D01D87DB2B008846B4 /* libReact-Native-Webview-Bridge.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9E3AB6C61D87DA2B008846B4 /* libReact-Native-Webview-Bridge.a */; }; + 9E54D6001F17A5DB009F0C16 /* libTestFairy.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9E54D5FD1F17A5DB009F0C16 /* libTestFairy.a */; }; + 9E54D6011F17A5DB009F0C16 /* upload-dsym.sh in Resources */ = {isa = PBXBuildFile; fileRef = 9E54D5FF1F17A5DB009F0C16 /* upload-dsym.sh */; }; + 9E7C64731E03FDDE004C7042 /* libRCTCamera.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 20B7D1151D3F74CD00B70F14 /* libRCTCamera.a */; }; + 9E7C64991E03FDE5004C7042 /* libRCTContacts.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 20B7D10A1D3F74CD00B70F14 /* libRCTContacts.a */; }; 9ED2F45E1D9D535A00B36508 /* SF-UI-Text-Regular.otf in Resources */ = {isa = PBXBuildFile; fileRef = 9ED2F45D1D9D52DD00B36508 /* SF-UI-Text-Regular.otf */; }; 9ED2F45F1D9D535A00B36508 /* SF-UI-Text-Medium.otf in Resources */ = {isa = PBXBuildFile; fileRef = 9ED2F45C1D9D52C100B36508 /* SF-UI-Text-Medium.otf */; }; 9ED2F4611D9D579900B36508 /* SF-UI-Text-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 9ED2F4601D9D577B00B36508 /* SF-UI-Text-Bold.otf */; }; 9EE470511ED0079E0048FD10 /* Mapbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EE470501ED0079E0048FD10 /* Mapbox.framework */; }; 9EE470521ED0079E0048FD10 /* Mapbox.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9EE470501ED0079E0048FD10 /* Mapbox.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9EE470541ED007E10048FD10 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EE4702F1ED0071A0048FD10 /* libRCTMapboxGL.a */; }; - 9EE89E271E03FCB7007D3C25 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = B24FC7F21DE718EF00D694FF /* libSplashScreen.a */; }; - 9EE89E2D1E03FD9F007D3C25 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = 20A5C9531D927137002C4965 /* libimageCropPicker.a */; }; + 9EE470541ED007E10048FD10 /* libRCTMapboxGL.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9EE4702F1ED0071A0048FD10 /* libRCTMapboxGL.a */; }; + 9EE89E271E03FCB7007D3C25 /* libSplashScreen.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B24FC7F21DE718EF00D694FF /* libSplashScreen.a */; }; + 9EE89E2D1E03FD9F007D3C25 /* libimageCropPicker.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 20A5C9531D927137002C4965 /* libimageCropPicker.a */; }; A6AF670051B842249D520C7B /* Foundation.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7ED174A34D7D42358313368B /* Foundation.ttf */; }; AE97D4B08C9F4821B8E9C50B /* Ionicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 359B076A658B4FBAB5128B03 /* Ionicons.ttf */; }; B23B48FF1E76917B006D4535 /* RobotoMono-Medium.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B23B48FE1E76917B006D4535 /* RobotoMono-Medium.ttf */; }; B24FC7FD1DE7195700D694FF /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B24FC7FC1DE7195700D694FF /* Social.framework */; }; B24FC7FF1DE7195F00D694FF /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B24FC7FE1DE7195F00D694FF /* MessageUI.framework */; }; - B2A5F45C1DEC36BB00174F4D /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = B2A5F4381DEC36B200174F4D /* libRCTAnimation.a */; }; - B2DEA0D01E49E33300FA28D6 /* ReferenceProxy in Frameworks */ = {isa = PBXBuildFile; fileRef = B2DEA0B11E49E32000FA28D6 /* libRCTHttpServer.a */; }; + B2A5F45C1DEC36BB00174F4D /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B2A5F4381DEC36B200174F4D /* libRCTAnimation.a */; }; + B2DEA0D01E49E33300FA28D6 /* libRCTHttpServer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B2DEA0B11E49E32000FA28D6 /* libRCTHttpServer.a */; }; B2F2D1BC1D9D531B00B7B453 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B2F2D1BB1D9D531B00B7B453 /* Images.xcassets */; }; BA68A2377A20496EA737000D /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 4E586E1B0E544F64AA9F5BD1 /* libz.tbd */; }; C3EE9AEA6F77464588FBAA64 /* FontAwesome.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 7B5870D9ED504F32B6A09C35 /* FontAwesome.ttf */; }; @@ -481,6 +483,9 @@ 8B9A886A2CB448B1ABA0EB62 /* libc++.tbd */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; }; 9E0B01A01DDC5DA7002B0359 /* SF-UI-Text-Light.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SF-UI-Text-Light.otf"; sourceTree = ""; }; 9E3AB6B21D87DA2A008846B4 /* React-Native-Webview-Bridge.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "React-Native-Webview-Bridge.xcodeproj"; path = "../node_modules/react-native-webview-bridge/ios/React-Native-Webview-Bridge.xcodeproj"; sourceTree = ""; }; + 9E54D5FD1F17A5DB009F0C16 /* libTestFairy.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libTestFairy.a; sourceTree = ""; }; + 9E54D5FE1F17A5DB009F0C16 /* TestFairy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestFairy.h; sourceTree = ""; }; + 9E54D5FF1F17A5DB009F0C16 /* upload-dsym.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "upload-dsym.sh"; sourceTree = ""; }; 9EC0135C1E06FB1900155B5C /* RCTWKWebView.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWKWebView.xcodeproj; path = "../node_modules/react-native-wkwebview-reborn/ios/RCTWKWebView.xcodeproj"; sourceTree = ""; }; 9ED2F45C1D9D52C100B36508 /* SF-UI-Text-Medium.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SF-UI-Text-Medium.otf"; sourceTree = ""; }; 9ED2F45D1D9D52DD00B36508 /* SF-UI-Text-Regular.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SF-UI-Text-Regular.otf"; sourceTree = ""; }; @@ -521,29 +526,29 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B2DEA0D01E49E33300FA28D6 /* ReferenceProxy in Frameworks */, - 9EE89E271E03FCB7007D3C25 /* ReferenceProxy in Frameworks */, - B2A5F45C1DEC36BB00174F4D /* ReferenceProxy in Frameworks */, + B2DEA0D01E49E33300FA28D6 /* libRCTHttpServer.a in Frameworks */, + 9EE89E271E03FCB7007D3C25 /* libSplashScreen.a in Frameworks */, + B2A5F45C1DEC36BB00174F4D /* libRCTAnimation.a in Frameworks */, B24FC7FF1DE7195F00D694FF /* MessageUI.framework in Frameworks */, B24FC7FD1DE7195700D694FF /* Social.framework in Frameworks */, - 9EE89E2D1E03FD9F007D3C25 /* ReferenceProxy in Frameworks */, - 9E3AB6D01D87DB2B008846B4 /* ReferenceProxy in Frameworks */, + 9EE89E2D1E03FD9F007D3C25 /* libimageCropPicker.a in Frameworks */, + 9E3AB6D01D87DB2B008846B4 /* libReact-Native-Webview-Bridge.a in Frameworks */, 20B6B6841D92C42600CC5C6A /* RSKImageCropper.framework in Frameworks */, CE4E31B31D8695250033ED64 /* Statusgo.framework in Frameworks */, - 20AB9EC61D47CC0300E7FD9C /* ReferenceProxy in Frameworks */, + 20AB9EC61D47CC0300E7FD9C /* libRCTStatus.a in Frameworks */, 20B6B6871D92C42600CC5C6A /* QBImagePicker.framework in Frameworks */, - 146834051AC3E58100842450 /* ReferenceProxy in Frameworks */, - 00C302E51ABCBA2D00DB3ED1 /* ReferenceProxy in Frameworks */, - 00C302E71ABCBA2D00DB3ED1 /* ReferenceProxy in Frameworks */, - 00C302E81ABCBA2D00DB3ED1 /* ReferenceProxy in Frameworks */, - 133E29F31AD74F7200F7D852 /* ReferenceProxy in Frameworks */, - 00C302E91ABCBA2D00DB3ED1 /* ReferenceProxy in Frameworks */, - 139105C61AF99C1200B5F7CC /* ReferenceProxy in Frameworks */, - 832341BD1AAA6AB300B99B32 /* ReferenceProxy in Frameworks */, - 00C302EA1ABCBA2D00DB3ED1 /* ReferenceProxy in Frameworks */, - 139FDEF61B0652A700C62182 /* ReferenceProxy in Frameworks */, - 9E7C64731E03FDDE004C7042 /* ReferenceProxy in Frameworks */, - 9E7C64991E03FDE5004C7042 /* ReferenceProxy in Frameworks */, + 146834051AC3E58100842450 /* libReact.a in Frameworks */, + 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, + 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, + 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, + 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, + 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, + 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, + 9E7C64731E03FDDE004C7042 /* libRCTCamera.a in Frameworks */, + 9E7C64991E03FDE5004C7042 /* libRCTContacts.a in Frameworks */, FD4F213C3873473CB703B1D2 /* libRNFS.a in Frameworks */, 213311F38CA74CE280FD09AD /* libRNI18n.a in Frameworks */, 4D3D740D5EFA4F8592B048D7 /* libBVLinearGradient.a in Frameworks */, @@ -555,11 +560,11 @@ BA68A2377A20496EA737000D /* libz.tbd in Frameworks */, 3E15DFEC1F6F4D7CAE088F49 /* libTcpSockets.a in Frameworks */, E0AD9E8F495A4907B65104BF /* libRCTImageResizer.a in Frameworks */, + 9E54D6001F17A5DB009F0C16 /* libTestFairy.a in Frameworks */, 5F8585D411844E5981B94F40 /* libRNInstabug.a in Frameworks */, 8E55E6877F950B81C8D711C5 /* libPods-StatusIm.a in Frameworks */, - EC8998BFE2C04023A860C065 /* libRNNetworkInfo.a in Frameworks */, 9EE470511ED0079E0048FD10 /* Mapbox.framework in Frameworks */, - 9EE470541ED007E10048FD10 /* ReferenceProxy in Frameworks */, + 9EE470541ED007E10048FD10 /* libRCTMapboxGL.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -646,6 +651,9 @@ 13B07FAE1A68108700A75B9A /* StatusIm */ = { isa = PBXGroup; children = ( + 9E54D5FD1F17A5DB009F0C16 /* libTestFairy.a */, + 9E54D5FE1F17A5DB009F0C16 /* TestFairy.h */, + 9E54D5FF1F17A5DB009F0C16 /* upload-dsym.sh */, B2F2D1BB1D9D531B00B7B453 /* Images.xcassets */, 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 13B07FAF1A68108700A75B9A /* AppDelegate.h */, @@ -1536,6 +1544,7 @@ 82E689BAF9FB43C8AC6FF1CA /* EvilIcons.ttf in Resources */, C3EE9AEA6F77464588FBAA64 /* FontAwesome.ttf in Resources */, A6AF670051B842249D520C7B /* Foundation.ttf in Resources */, + 9E54D6011F17A5DB009F0C16 /* upload-dsym.sh in Resources */, B2F2D1BC1D9D531B00B7B453 /* Images.xcassets in Resources */, AE97D4B08C9F4821B8E9C50B /* Ionicons.ttf in Resources */, 0F942CF509F74CCDB5CB35B0 /* MaterialIcons.ttf in Resources */, @@ -1826,6 +1835,10 @@ INFOPLIST_FILE = StatusIm/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); OTHER_LDFLAGS = ( "$(inherited)", "-lc++", @@ -1875,6 +1888,10 @@ INFOPLIST_FILE = StatusIm/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); OTHER_LDFLAGS = ( "$(inherited)", "-lc++", diff --git a/ios/StatusIm/AppDelegate.m b/ios/StatusIm/AppDelegate.m index 69c764727a..472bcb859e 100644 --- a/ios/StatusIm/AppDelegate.m +++ b/ios/StatusIm/AppDelegate.m @@ -12,6 +12,8 @@ #import "RCTBundleURLProvider.h" #import "RCTRootView.h" #import "SplashScreen.h" +#import "TestFairy.h" +#define NSLog(s, ...) do { NSLog(s, ##__VA_ARGS__); TFLog(s, ##__VA_ARGS__); } while (0) @import Instabug; @implementation AppDelegate @@ -36,7 +38,8 @@ [self.window makeKeyAndVisible]; [SplashScreen show]; #ifndef DEBUG - [Instabug startWithToken:@"5534212f4a44f477c9ab270ab5cd2062" invocationEvent:IBGInvocationEventShake]; + [TestFairy begin:@"969f6c921cb435cea1d41d1ea3f5b247d6026d55"]; + //[Instabug startWithToken:@"5534212f4a44f477c9ab270ab5cd2062" invocationEvent:IBGInvocationEventShake]; #endif return YES; } diff --git a/ios/TestFairy.h b/ios/TestFairy.h new file mode 100644 index 0000000000..96555a1c89 --- /dev/null +++ b/ios/TestFairy.h @@ -0,0 +1,228 @@ +#import +#import + +#define TF_DEPRECATED(x) __attribute__ ((deprecated(x))) + +@interface TestFairy: NSObject + +/** + * Initialize a TestFairy session. + * + * @param appToken Your key as given to you in your TestFairy account + */ ++ (void)begin:(NSString *)appToken; + +/** + * Initialize a TestFairy session with options. + * + * @param appToken Your key as given to you in your TestFairy account + * @param options A dictionary of options controlling the current session + */ ++ (void)begin:(NSString *)appToken withOptions:(NSDictionary *)options; + +/** + * Change the server endpoint for use with on-premise hosting. Please + * contact support or sales for more information. Must be called before begin + * + * @param serverOverride server address for use with TestFairy + */ ++ (void)setServerEndpoint:(NSString *)serverOverride; + +/** + * Returns SDK version (x.x.x) string + * + * @return version + */ ++ (NSString *)version; + +/** + * Hides a specific view from appearing in the video generated. + * + * @param view The specific view you wish to hide from screenshots + * + */ ++ (void)hideView:(UIView *)view; + +/** + * Hides a specific html element from appearing in your UIWebView + * + * @param selector The specific selector you wish to hide from screenshots. Multiple selectors can be comma separated + */ ++ (void)hideWebViewElements:(NSString *)selector; + +/** + * Pushes the feedback view controller. Hook a button + * to this method to allow users to provide feedback about the current + * session. All feedback will appear in your build report page, and in + * the recorded session page. + * + */ ++ (void)pushFeedbackController; + +/** + * Send a feedback on behalf of the user. Call when using a in-house + * feedback view controller with a custom design and feel. Feedback will + * be associated with the current session. + * + * @param feedbackString Feedback text + */ ++ (void)sendUserFeedback:(NSString *)feedbackString; + +/** + * Proxy didUpdateLocation delegate values and these + * locations will appear in the recorded sessions. Useful for debugging + * actual long/lat values against what the user sees on screen. + * + * @param locations Array of CLLocation. The first object of the array will determine the user location + */ ++ (void)updateLocation:(NSArray *)locations; + +/** + * Marks a checkpoint in session. Use this text to tag a session + * with a checkpoint name. Later you can filter sessions where your + * user passed through this checkpoint, for bettering understanding + * user experience and behavior. + * + * @param name The checkpoint name + */ ++ (void)checkpoint:(NSString *)name; + +/** + * Sets a correlation identifier for this session. This value can + * be looked up via web dashboard. For example, setting correlation + * to the value of the user-id after they logged in. Can be called + * only once per session (subsequent calls will be ignored.) + * + * @param correlationId Id for the current session + */ ++ (void)setCorrelationId:(NSString *)correlationId TF_DEPRECATED("Please refer to setUser:"); + +/** + * Sets a correlation identifier for this session. This value can + * be looked up via web dashboard. For example, setting correlation + * to the value of the user-id after they logged in. Can be called + * only once per session (subsequent calls will be ignored.) + * + * @param correlationId Id for the current session + */ ++ (void)identify:(NSString *)correlationId TF_DEPRECATED("Please refer to setAttribute: and setUser:"); + +/** + * Sets a correlation identifier for this session. This value can + * be looked up via web dashboard. For example, setting correlation + * to the value of the user-id after they logged in. Can be called + * only once per session (subsequent calls will be ignored.) + * + * @param correlationId Id for the current session + * @param traits Attributes and custom attributes to be associated with this session + */ ++ (void)identify:(NSString *)correlationId traits:(NSDictionary *)traits TF_DEPRECATED("Please refer to setAttribute:"); + +/** + * Pauses the current session. This method stops recoding of + * the current session until resume has been called. + * + * @see resume + */ ++ (void)pause; + +/** + * Resumes the recording of the current session. This method + * resumes a session after it was paused. + * + * @see pause + */ ++ (void)resume; + +/** + * Returns the address of the recorded session on testfairy's + * developer portal. Will return nil if recording not yet started. + * + * @return session URL + */ ++ (NSString *)sessionUrl; + +/** + * Takes a screenshot. + * + */ ++ (void)takeScreenshot; + +/** + * Set the name of the current screen. Useful for single page + * applications which use a single UIViewController. + * + * @param name logic name of current screen + */ ++ (void)setScreenName:(NSString *)name; + +/** + * Stops the current session recording. Unlike 'pause', when + * calling 'resume', a new session will be created and will be + * linked to the previous recording. Useful if you want short + * session recordings of specific use-cases of the app. Hidden + * views and user identity will be applied to the new session + * as well, if started. + */ ++ (void)stop; + +/** + * Records a session level attribute which can be looked up via web dashboard. + * + * @param name The name of the attribute. Cannot be nil. + * @param value The value associated with the attribute. Cannot be nil. + * @return YES if successfully set attribute value, NO if failed with error in log. + * + * @note The SDK limits you to storing 64 named attributes. Adding more than 64 will fail and return NO. + */ ++ (BOOL)setAttribute:(NSString *)key withValue:(NSString *)value; + +/** + * Records a user identified as an attribute. We recommend passing values such as + * email, phone number, or user id that your app may use. + * + * @param userId The identifying user. Cannot be nil. + * + */ ++ (void)setUserId:(NSString *)userId; + +@end + +#if __cplusplus +extern "C" { +#endif + +/** + * Remote logging, use TFLog as you would use printf. These logs will be sent to the server, + * but will not appear in the console. + * + * @param format sprintf-like format for the arguments that follow + */ +void TFLog(NSString *format, ...) __attribute__((format(__NSString__, 1, 2))); + +/** + * Remote logging, use TFLogv as you would use printfv. These logs will be sent to the server, + * but will not appear in the console. + * + * @param format sprintf-like format for the arguments that follow + * @param arg_list list of arguments + */ +void TFLogv(NSString *format, va_list arg_list); + +#if __cplusplus +} +#endif + +extern NSString *const TFSDKIdentityTraitNameKey; +extern NSString *const TFSDKIdentityTraitEmailAddressKey; +extern NSString *const TFSDKIdentityTraitBirthdayKey; +extern NSString *const TFSDKIdentityTraitGenderKey; +extern NSString *const TFSDKIdentityTraitPhoneNumberKey; +extern NSString *const TFSDKIdentityTraitWebsiteAddressKey; +extern NSString *const TFSDKIdentityTraitAgeKey; +extern NSString *const TFSDKIdentityTraitSignupDateKey; +extern NSString *const TFSDKEnableCrashReporterKey; +extern NSString *const TestFairyDidShakeDevice; +extern NSString *const TestFairyWillProvideFeedback; +extern NSString *const TestFairyDidCancelFeedback; +extern NSString *const TestFairyDidSendFeedback; diff --git a/ios/libTestFairy.a b/ios/libTestFairy.a new file mode 100644 index 0000000000..d0410490bd Binary files /dev/null and b/ios/libTestFairy.a differ diff --git a/ios/upload-dsym.sh b/ios/upload-dsym.sh new file mode 100644 index 0000000000..d5e4b43f34 --- /dev/null +++ b/ios/upload-dsym.sh @@ -0,0 +1,101 @@ +#!/bin/sh + +TESTFAIRY_ENDPOINT="https://app.testfairy.com/upload/dsym/" + +ZIP=zip +CURL=curl +STAT=stat +DATE=date + +log() { + NOW=$($DATE +"%Y-%m-%d %H:%M:%S") + echo "${NOW} ${1}" +} + +help() { + echo "Usage: ${0} [-f] TESTFAIRY_API_KEY [-p DSYM_PATH] [-u TESTFAIRY_ENDPOINT]" + exit 1 +} + +DAEMON=1 +if [ "${1}" == "-f" ]; then + DAEMON=0 + shift +elif [ "${1}" == "-d" ]; then + # backward compatible when -f was the default + shift +fi + + +API_KEY="${1}" +if [ ! "${API_KEY}" ]; then + echo "Fatal: No Upload API key provided." + help +fi + +DSYM_PATH=${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME} + +shift +while [[ $# -gt 1 ]] +do +key="$1" +case $key in + -u) + TESTFAIRY_ENDPOINT="${2}" + shift + ;; + -p) + DSYM_PATH="${2}" + shift + ;; + *) + help + ;; +esac +shift +done + +if [ "${DSYM_PATH}" == "" ] || [ "${DSYM_PATH}" == "/" ] || [ ! -d "${DSYM_PATH}" ]; then + echo "Fatal: No .dSYM folder found at path [${DSYM_PATH}]." + help +fi + +if [[ ${TESTFAIRY_ENDPOINT} == "" ]]; then + echo "Fatal: No upload endpoint given." + help +fi + +NOW=$($DATE +%s) +TMP_FILENAME="/tmp/${NOW}-${DWARF_DSYM_FILE_NAME}.zip" + +# Compress the .dSYM folder into a zip file +log "Compressing .dSYM folder ${DSYM_PATH}" +$ZIP -qrp9 "${TMP_FILENAME}" "${DSYM_PATH}" +FILE_SIZE=$($STAT -f "%z" "${TMP_FILENAME}") + +foreground_upload() { + # Upload zipped .dSYM file to TestFairy's servers + STARTED=$($DATE +"%s") + $CURL -s -F api_key="${API_KEY}" -F dsym=@"${1}" -o /dev/null "${TESTFAIRY_ENDPOINT}" + ENDED=$($DATE +"%s") + DIFF=$(expr ${ENDED} - ${STARTED}) + log "Symbols uploaded in ${DIFF} seconds" + + # Clean up behind + rm -f ${TMP_FILENAME} +} + +background_upload() { + sh -c "$CURL -F api_key=\"${API_KEY}\" -F dsym=@\"${1}\" -s -o /dev/null \"${TESTFAIRY_ENDPOINT}\"; rm -f ${TMP_FILENAME};" /dev/null 2>&1 & +} + +if [ "$DAEMON" == "0" ]; then + log "Uploading ${FILE_SIZE} bytes to dsym server in foreground" + foreground_upload "${TMP_FILENAME}" +else + log "Uploading ${FILE_SIZE} bytes to dsym server in background" + background_upload "${TMP_FILENAME}" +fi + +log "TestFairy .dSYM upload script ends" +