diff --git a/.github/workflows/benchmarking.yml b/.github/workflows/benchmarking.yml index 4b30f8975b1..a53bb9e35ee 100644 --- a/.github/workflows/benchmarking.yml +++ b/.github/workflows/benchmarking.yml @@ -93,7 +93,7 @@ jobs: - uses: actions/download-artifact@v4 with: name: DerivedData-Xcode - - run: npm install -g saucectl@0.171.0 + - run: npm install -g saucectl@0.173.2 - name: Run Benchmarks in SauceLab env: SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }} diff --git a/.github/workflows/saucelabs-UI-tests.yml b/.github/workflows/saucelabs-UI-tests.yml deleted file mode 100644 index 927ccfbe8f8..00000000000 --- a/.github/workflows/saucelabs-UI-tests.yml +++ /dev/null @@ -1,132 +0,0 @@ -name: Sauce Labs UI Tests -on: - push: - branches: - - main - - pull_request: - paths: - - 'Sources/**' - - 'Tests/**' - - '.github/workflows/saucelabs-UI-tests.yml' - - 'fastlane/**' - - '.sauce/config.yml' - - 'scripts/ci-select-xcode.sh' - - # run the workflow any time an Xcode scheme changes for one of the sample apps with a UI test suite we run in saucelabs - - 'Samples/iOS-Swift/iOS-Swift.xcodeproj/xcshareddata/xcschemes/iOS-SwiftUITests.xcscheme' - - 'Samples/iOS-Swift/iOS-Swift.xcodeproj/xcshareddata/xcschemes/iOS-Swift.xcscheme' - -# https://docs.github.com/en/actions/using-jobs/using-concurrency#example-using-a-fallback-value -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - build-ui-tests: - name: Build UITests - runs-on: ${{ matrix.runs-on }} - - strategy: - matrix: - include: - - runs-on: macos-12 - xcode: '13.4.1' - - - runs-on: macos-13 - xcode: '14.3' - - steps: - - uses: actions/checkout@v4 - - run: ./scripts/ci-select-xcode.sh ${{matrix.xcode}} - - uses: ruby/setup-ruby@v1 - with: - bundler-cache: true - - name: Install SentryCli - run: brew install getsentry/tools/sentry-cli - - name: Cache iOS-Swift App and dSYM build products - id: ios-swift-cache - uses: actions/cache@v4 - with: - path: | - DerivedData/Build/Products/Test-iphoneos/iOS-Swift.app.dSYM - DerivedData/Build/Products/Test-iphoneos/iOS-Swift.app - key: ios-swift-for-ui-testing-cache-key-${{ hashFiles('Samples/iOS-Swift/iOS-Swift/**') }}-Xcode-${{ matrix.xcode }}-${{ hashFiles('Sources/Sentry/**') }} - - name: Cache iOS-Swift UI Test Runner App build product - id: ios-swift-uitest-runner-cache - uses: actions/cache@v4 - with: - path: | - DerivedData/Build/Products/Test-iphoneos/iOS-SwiftUITests-Runner.app - key: ios-swift-for-ui-testing-cache-key-${{ hashFiles('Samples/iOS-Swift/iOS-SwiftUITests/**') }}-Xcode-${{ matrix.xcode }} - - run: bundle exec fastlane build_ios_swift_for_tests - env: - APP_STORE_CONNECT_KEY_ID: ${{ secrets.APP_STORE_CONNECT_KEY_ID }} - APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_ISSUER_ID }} - APP_STORE_CONNECT_KEY: ${{ secrets.APP_STORE_CONNECT_KEY }} - FASTLANE_KEYCHAIN_PASSWORD: ${{ secrets.FASTLANE_KEYCHAIN_PASSWORD }} - MATCH_GIT_PRIVATE_KEY: ${{ secrets.MATCH_GIT_PRIVATE_KEY }} - MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} - MATCH_USERNAME: ${{ secrets.MATCH_USERNAME }} - - run: bundle exec fastlane build_ios_swift_ui_test - env: - APP_STORE_CONNECT_KEY_ID: ${{ secrets.APP_STORE_CONNECT_KEY_ID }} - APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_ISSUER_ID }} - APP_STORE_CONNECT_KEY: ${{ secrets.APP_STORE_CONNECT_KEY }} - FASTLANE_KEYCHAIN_PASSWORD: ${{ secrets.FASTLANE_KEYCHAIN_PASSWORD }} - MATCH_GIT_PRIVATE_KEY: ${{ secrets.MATCH_GIT_PRIVATE_KEY }} - MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} - MATCH_USERNAME: ${{ secrets.MATCH_USERNAME }} - - name: Upload dSYMs - run: | - sentry-cli --auth-token ${{ secrets.SENTRY_AUTH_TOKEN }} upload-dif --org sentry-sdks --project sentry-cocoa DerivedData/Build/Products/Test-iphoneos/iOS-Swift.app.dSYM - - name: Archiving DerivedData - uses: actions/upload-artifact@v4 - with: - name: DerivedData-Xcode-${{matrix.xcode}} - path: | - **/Test-iphoneos/iOS-Swift.app - **/Test-iphoneos/iOS-SwiftUITests-Runner.app - - run-ui-tests-with-sauce: - name: Run UI Tests for ${{ matrix.suite }} on Sauce Labs - runs-on: ubuntu-latest - needs: build-ui-tests - strategy: - fail-fast: false - matrix: - include: - - xcode: '14.3' - suite: 'iOS-16' - - - xcode: '14.3' - suite: 'iOS-15' - - # We want to test the frame tracker at 120 fps - - xcode: '14.3' - suite: 'iPhone-Pro' - - - xcode: '14.3' - suite: 'iOS-14' - - - xcode: '13.4.1' - suite: 'iOS-13' - - - xcode: '13.4.1' - suite: 'iOS-12' - - steps: - - uses: actions/checkout@v4 - - - uses: actions/download-artifact@v4 - with: - name: DerivedData-Xcode-${{ matrix.xcode }} - - - run: npm install -g saucectl@0.171.0 - - # As Sauce Labs is a bit flaky we retry 5 times - - name: Run Tests in SauceLab - env: - SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }} - SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }} - run: for i in {1..5}; do saucectl run --select-suite ${{ matrix.suite }} && break ; done diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2e2cce41de5..9ddd0652dfa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -310,84 +310,3 @@ jobs: with: name: thread-sanitizer path: thread-sanitizer.log - - ui-tests: - name: UI Tests for ${{matrix.target}} on Simulators - runs-on: macos-13 - strategy: - matrix: - target: ["ios_objc", "tvos_swift"] - - steps: - - uses: actions/checkout@v4 - - run: ./scripts/ci-select-xcode.sh - - # GitHub Actions sometimes fail to launch the UI tests. Therefore we retry - - name: Run Fastlane - run: for i in {1..2}; do fastlane ui_tests_${{matrix.target}} && break ; done - shell: sh - - - name: Archiving Raw Test Logs - uses: actions/upload-artifact@v4 - if: ${{ failure() || cancelled() }} - with: - name: raw-uitest-output-${{matrix.target}} - path: | - ~/Library/Logs/scan/*.log - ./fastlane/test_output/** - - # SwiftUI only supports iOS 14+ so we run it in a separate matrix here - ui-tests-swift-ui: - name: UI Tests for SwiftUI on ${{matrix.device}} Simulator - runs-on: ${{matrix.runs-on}} - strategy: - fail-fast: false - matrix: - include: - - runs-on: macos-12 - xcode: "13.4.1" - device: "iPhone 8 (15.2)" - - - runs-on: macos-13 - xcode: "14.3" - device: "iPhone 8 (16.1)" - - steps: - - uses: actions/checkout@v4 - - run: ./scripts/ci-select-xcode.sh ${{matrix.xcode}} - - # GitHub Actions sometimes fail to launch the UI tests. Therefore we retry - - name: Run Fastlane - run: for i in {1..2}; do fastlane ui_tests_ios_swiftui device:"${{matrix.device}}" && break ; done - shell: sh - - - name: Archiving Raw Test Logs - uses: actions/upload-artifact@v4 - if: ${{ failure() || cancelled() }} - with: - name: raw-swiftui-test-output-${{matrix.platform}}-xcode-${{matrix.xcode}}-os-${{matrix.test-destination-os}} - path: | - ~/Library/Logs/scan/*.log - ./fastlane/test_output/** - - ui-tests-address-sanitizer: - name: UI Tests with Address Sanitizer - runs-on: macos-13-xlarge - - steps: - - uses: actions/checkout@v4 - - run: ./scripts/ci-select-xcode.sh 15.2 - - # GitHub Actions sometimes fail to launch the UI tests. Therefore we retry - - name: Run Fastlane - run: for i in {1..2}; do fastlane ui_tests_ios_swift device:"iPhone 14 (17.2)" address_sanitizer:true && break ; done - shell: sh - - - name: Archiving Raw Test Logs - uses: actions/upload-artifact@v4 - if: ${{ failure() || cancelled() }} - with: - name: raw-uitest-output-asan - path: | - ~/Library/Logs/scan/*.log - ./fastlane/test_output/** diff --git a/.github/workflows/testflight.yml b/.github/workflows/testflight.yml index 372d8d486de..fbc46498492 100644 --- a/.github/workflows/testflight.yml +++ b/.github/workflows/testflight.yml @@ -21,7 +21,7 @@ jobs: runs-on: macos-13 steps: - uses: actions/checkout@v4 - - run: ./scripts/ci-select-xcode.sh + - run: ./scripts/ci-select-xcode.sh 15.2 - uses: ruby/setup-ruby@v1 with: bundler-cache: true diff --git a/.github/workflows/ui-tests.yml b/.github/workflows/ui-tests.yml new file mode 100644 index 00000000000..21f169443a9 --- /dev/null +++ b/.github/workflows/ui-tests.yml @@ -0,0 +1,154 @@ +name: UI Tests +on: + push: + branches: + - main + + pull_request: + paths: + - 'Sources/**' + - 'Tests/**' + - '.github/workflows/ui-tests.yml' + - 'fastlane/**' + - '.sauce/config.yml' + - 'scripts/ci-select-xcode.sh' + + # run the workflow any time an Xcode scheme changes for one of the sample apps with a UI test suite we run in saucelabs + - 'Samples/iOS-Swift/iOS-Swift.xcodeproj/xcshareddata/xcschemes/iOS-SwiftUITests.xcscheme' + - 'Samples/iOS-Swift/iOS-Swift.xcodeproj/xcshareddata/xcschemes/iOS-Swift.xcscheme' + + +# https://docs.github.com/en/actions/using-jobs/using-concurrency#example-using-a-fallback-value +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + ui-tests: + name: UI Tests for ${{matrix.target}} on Simulators + runs-on: macos-13 + strategy: + matrix: + target: ["ios_objc", "tvos_swift"] + + steps: + - uses: actions/checkout@v4 + - run: ./scripts/ci-select-xcode.sh + + # GitHub Actions sometimes fail to launch the UI tests. Therefore we retry + - name: Run Fastlane + run: for i in {1..2}; do fastlane ui_tests_${{matrix.target}} && break ; done + shell: sh + + - name: Archiving Raw Test Logs + uses: actions/upload-artifact@v4 + if: ${{ failure() || cancelled() }} + with: + name: raw-uitest-output-${{matrix.target}} + path: | + ~/Library/Logs/scan/*.log + ./fastlane/test_output/** + + # SwiftUI only supports iOS 14+ so we run it in a separate matrix here + ui-tests-swift-ui: + name: UI Tests for SwiftUI on ${{matrix.device}} Simulator + runs-on: ${{matrix.runs-on}} + strategy: + fail-fast: false + matrix: + include: + - runs-on: macos-12 + xcode: "13.4.1" + device: "iPhone 8 (15.2)" + + - runs-on: macos-13 + xcode: "14.3" + device: "iPhone 8 (16.1)" + + steps: + - uses: actions/checkout@v4 + - run: ./scripts/ci-select-xcode.sh ${{matrix.xcode}} + + # GitHub Actions sometimes fail to launch the UI tests. Therefore we retry + - name: Run Fastlane + run: for i in {1..2}; do fastlane ui_tests_ios_swiftui device:"${{matrix.device}}" && break ; done + shell: sh + + - name: Archiving Raw Test Logs + uses: actions/upload-artifact@v4 + if: ${{ failure() || cancelled() }} + with: + name: raw-swiftui-test-output-${{matrix.platform}}-xcode-${{matrix.xcode}}-os-${{matrix.test-destination-os}} + path: | + ~/Library/Logs/scan/*.log + ./fastlane/test_output/** + + ui-tests-address-sanitizer: + name: UI Tests with Address Sanitizer + runs-on: macos-13 + + steps: + - uses: actions/checkout@v4 + - run: ./scripts/ci-select-xcode.sh 15.2 + + # GitHub Actions sometimes fail to launch the UI tests. Therefore we retry + - name: Run Fastlane + run: for i in {1..2}; do fastlane ui_tests_ios_swift device:"iPhone 14 (17.2)" address_sanitizer:true && break ; done + shell: sh + + - name: Archiving Raw Test Logs + uses: actions/upload-artifact@v4 + if: ${{ failure() || cancelled() }} + with: + name: raw-uitest-output-asan + path: | + ~/Library/Logs/scan/*.log + ./fastlane/test_output/** + + + ios-swift-ui-tests: + name: iOS SwiftUI Tests ${{matrix.device}} + runs-on: ${{matrix.runs-on}} + strategy: + fail-fast: false + matrix: + include: + - runs-on: macos-11 + xcode: "13.2.1" + device: "iPhone 8 (13.7)" + + - runs-on: macos-12 + xcode: "13.4.1" + device: "iPhone 8 (15.5)" + + - runs-on: macos-13 + xcode: "15.2" + device: "iPhone 14 (16.4)" + + - runs-on: macos-14 + xcode: "15.2" + device: "iPhone 15 (17.2)" + + steps: + - uses: actions/checkout@v4 + - run: ./scripts/ci-select-xcode.sh ${{matrix.xcode}} + + - name: Create iOS 13.7 simulator + if: ${{ matrix.device == 'iPhone 8 (13.7)' }} + run: ./scripts/create-simulator.sh 11.7 13.7 13-7 + + - name: Create iOS 16.4 simulator + if: ${{ matrix.device == 'iPhone 14 (16.4)' }} + run: ./scripts/create-simulator.sh 14.3.1 16.4 16-4 + + - name: Run Fastlane + run: fastlane ui_tests_ios_swift device:"${{matrix.device}}" + + - name: Archiving Raw Test Logs + uses: actions/upload-artifact@v4 + if: ${{ failure() || cancelled() }} + with: + name: raw-uitest-output-asan + path: | + ~/Library/Logs/scan/*.log + ./fastlane/test_output/** diff --git a/.sauce/benchmarking-config.yml b/.sauce/benchmarking-config.yml index deb4049363e..affe3e7083d 100644 --- a/.sauce/benchmarking-config.yml +++ b/.sauce/benchmarking-config.yml @@ -2,10 +2,10 @@ apiVersion: v1alpha kind: xcuitest sauce: region: us-west-1 - concurrency: 2 + concurrency: 4 defaults: - timeout: 20m + timeout: 60m xcuitest: app: ./DerivedData/Build/Products/Debug-iphoneos/iOS-Swift.app diff --git a/.sauce/config.yml b/.sauce/config.yml deleted file mode 100644 index 27dd6f6a6bc..00000000000 --- a/.sauce/config.yml +++ /dev/null @@ -1,56 +0,0 @@ -apiVersion: v1alpha -kind: xcuitest -sauce: - region: us-west-1 - concurrency: 2 - -defaults: - timeout: 20m - -xcuitest: - app: ./DerivedData/Build/Products/Test-iphoneos/iOS-Swift.app - testApp: ./DerivedData/Build/Products/Test-iphoneos/iOS-SwiftUITests-Runner.app - -suites: - - - name: "iOS-16" - devices: - - name: "iPhone.*" - platformVersion: "16" - - - name: "iOS-15" - devices: - - name: "iPhone.*" - platformVersion: "15" - - - name: "iPhone-Pro" - devices: - - name: "iPhone 13 Pro.*" - platformVersion: "15" - - - name: "iOS-14" - devices: - - name: "iPhone.*" - platformVersion: "14" - - - name: "iOS-13" - devices: - - name: "iPhone.*" - platformVersion: "13" - - - name: "iOS-12" - devices: - - name: "iPhone.*" - platformVersion: "12" - - - name: "iOS-11" - devices: - - name: "iPhone.*" - platformVersion: "11" - -artifacts: - download: - when: always - match: - - "*.junit.xml" - directory: ./artifacts/ diff --git a/CHANGELOG.md b/CHANGELOG.md index c87c2536df5..348fb30f0eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ ### Features - Add Session Replay (#3625) +- Add support for Sentry [Spotlight](https://spotlightjs.com/) (#3642), which is basically Sentry +for development. Read our [blog post](https://blog.sentry.io/sentry-for-development/) to find out more. +- Add field `SentrySDK.detectedStartUpCrash` (#3644) +- Automatically profile app launches (#3529) +- Use CocoaPods resource_bundles for PrivacyInfo (#3651) +- Make tags of SentryScope public (#3650) ### Improvements @@ -14,7 +20,11 @@ ### Fixes - Finish TTID span when transaction finishes (#3610) +- Don't take screenshot and view hierarchy for app hanging (#3620) - Dont take screenshot and view hierarchy for app hanging (#3620) +- Remove `free_storage` and `storage_size` from the device context (#3627), because Apple forbids sending +information retrieved via `NSFileSystemFreeSize` and `NSFileSystemSize` off a device; see +[Apple docs](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files/describing_use_of_required_reason_api?language=objc). ## 8.20.0 diff --git a/Gemfile.lock b/Gemfile.lock index 4ed725fcd8a..ef1bcddb331 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -41,10 +41,10 @@ GEM bigdecimal (3.1.6) claide (1.1.0) clamp (1.3.2) - cocoapods (1.15.0) + cocoapods (1.15.2) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.15.0) + cocoapods-core (= 1.15.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) cocoapods-downloader (>= 2.1, < 3.0) cocoapods-plugins (>= 1.0.0, < 2.0) @@ -59,7 +59,7 @@ GEM nap (~> 1.0) ruby-macho (>= 2.3.0, < 3.0) xcodeproj (>= 1.23.0, < 2.0) - cocoapods-core (1.15.0) + cocoapods-core (1.15.2) activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) @@ -225,7 +225,7 @@ GEM mini_magick (4.12.0) mini_mime (1.1.5) mini_portile2 (2.8.5) - minitest (5.21.2) + minitest (5.22.2) molinillo (0.8.0) multi_json (1.15.0) multipart-post (2.3.0) diff --git a/Samples/iOS-Swift/PerformanceBenchmarks/SentrySDKPerformanceBenchmarkTests.m b/Samples/iOS-Swift/PerformanceBenchmarks/SentrySDKPerformanceBenchmarkTests.m index bb14d6b2349..59edcc1a259 100644 --- a/Samples/iOS-Swift/PerformanceBenchmarks/SentrySDKPerformanceBenchmarkTests.m +++ b/Samples/iOS-Swift/PerformanceBenchmarks/SentrySDKPerformanceBenchmarkTests.m @@ -8,6 +8,13 @@ @interface SentrySDKPerformanceBenchmarkTests : XCTestCase @implementation SentrySDKPerformanceBenchmarkTests +- (void)setUp +{ + [super setUp]; + + [[XCUIDevice sharedDevice] setOrientation:UIDeviceOrientationPortrait]; +} + - (void)testCPUBenchmark { XCTSkipIf(isSimulator() && !isDebugging()); diff --git a/Samples/iOS-Swift/iOS-Swift.xcodeproj/project.pbxproj b/Samples/iOS-Swift/iOS-Swift.xcodeproj/project.pbxproj index b722db68955..0b2fc7e7a32 100644 --- a/Samples/iOS-Swift/iOS-Swift.xcodeproj/project.pbxproj +++ b/Samples/iOS-Swift/iOS-Swift.xcodeproj/project.pbxproj @@ -1219,6 +1219,7 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; diff --git a/Samples/iOS-Swift/iOS-Swift.xcodeproj/xcshareddata/xcschemes/iOS-Swift.xcscheme b/Samples/iOS-Swift/iOS-Swift.xcodeproj/xcshareddata/xcschemes/iOS-Swift.xcscheme index fa07f21b626..574c2dfb969 100644 --- a/Samples/iOS-Swift/iOS-Swift.xcodeproj/xcshareddata/xcschemes/iOS-Swift.xcscheme +++ b/Samples/iOS-Swift/iOS-Swift.xcodeproj/xcshareddata/xcschemes/iOS-Swift.xcscheme @@ -23,7 +23,7 @@ @@ -38,6 +38,12 @@ ReferencedContainer = "container:iOS-Swift.xcodeproj"> + + + + @@ -73,6 +79,26 @@ argument = "--disable-file-io-tracing" isEnabled = "NO"> + + + + + + + + + + diff --git a/Samples/iOS-Swift/iOS-Swift.xcodeproj/xcshareddata/xcschemes/iOS-SwiftUITests.xcscheme b/Samples/iOS-Swift/iOS-Swift.xcodeproj/xcshareddata/xcschemes/iOS-SwiftUITests.xcscheme index 55e1974867d..37a4ca1e81a 100644 --- a/Samples/iOS-Swift/iOS-Swift.xcodeproj/xcshareddata/xcschemes/iOS-SwiftUITests.xcscheme +++ b/Samples/iOS-Swift/iOS-Swift.xcodeproj/xcshareddata/xcschemes/iOS-SwiftUITests.xcscheme @@ -25,7 +25,7 @@ Bool { - print("[iOS-Swift] launch arguments: \(ProcessInfo.processInfo.arguments)") - print("[iOS-Swift] environment: \(ProcessInfo.processInfo.environment)") + print("[iOS-Swift] [debug] launch arguments: \(ProcessInfo.processInfo.arguments)") + print("[iOS-Swift] [debug] environment: \(ProcessInfo.processInfo.environment)") maybeWipeData() AppDelegate.startSentry() @@ -161,9 +167,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate { } private extension AppDelegate { + // previously tried putting this in an AppDelegate.load override in ObjC, but it wouldn't run until after a launch profiler would have an opportunity to run, since SentryProfiler.load would always run first due to being dynamically linked in a framework module. it is sufficient to do it before calling SentrySDK.startWithOptions to clear state for testProfiledAppLaunches because we don't make any assertions on a launch profile the first launch of the app in that test func maybeWipeData() { if ProcessInfo.processInfo.arguments.contains("--io.sentry.wipe-data") { - print("[iOS-Swift] removing app data") + print("[iOS-Swift] [debug] removing app data") let appSupport = NSSearchPathForDirectoriesInDomains(.applicationSupportDirectory, .userDomainMask, true).first! let cache = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true).first! for path in [appSupport, cache] { diff --git a/Samples/iOS-Swift/iOS-Swift/Base.lproj/Main.storyboard b/Samples/iOS-Swift/iOS-Swift/Base.lproj/Main.storyboard index 094218d85bd..6820618844c 100644 --- a/Samples/iOS-Swift/iOS-Swift/Base.lproj/Main.storyboard +++ b/Samples/iOS-Swift/iOS-Swift/Base.lproj/Main.storyboard @@ -1,9 +1,9 @@ - + - + @@ -172,7 +172,7 @@ - + @@ -223,8 +223,57 @@ + + + + + + + + + + + + + + + - +