Skip to content

App crashes on launch (inconsistently) #10393

Closed
@tsahi-deri

Description

Description

As part of our app launch sequence we use Firestore in order to fetch some app configuration/settings, followed by some other API calls to our backend (fetch user information etc.)

Many times the app crashes instantly after tapping the app icon.
While debugging it, some of the crashes just stops on UIApplicaiotnMain(), and others stops on a random Firebase SDK code (see screenshot below) and the thread that crashed is related to Firebase.

Since all the crashes are EXC_BAD_ACCESS, and it inconsistently I suspect it a race data issue. Recently I enabled Thread Sanitizer on Diagnostics settings in order to audit threading issues in the code (see output below).

The issue reproduce using Firebase SDK versions 9.3.0, 9.4.*, 9.5.0, 9.6.0 and 10.0.0.

Exception
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: UNKNOWN_0xD at 0x0000000000000000

Screen Shot 2022-10-23 at 23 53 55

Reproducing the issue

  1. Initialize Firebase SDK
  2. Fetch some document using Firestore SDK right after the first screen appears

Firebase SDK Version

10.0.0

Xcode Version

13.3.1

Installation Method

Swift Package Manager

Firebase Product(s)

Analytics, Authentication, Crashlytics, DynamicLinks, Firestore, Performance

Targeted Platforms

iOS

Relevant Log Output

ThreadSanitizer output

==================
WARNING: ThreadSanitizer: data race (pid=98911)
  Read of size 1 at 0x7b2000058060 by thread T12:
    #0 firebase::firestore::credentials::FirebaseAuthCredentialsProvider::GetToken(std::__1::function<void (firebase::firestore::util::StatusOr<firebase::firestore::credentials::AuthToken>)>) <null>:2 (YSelfie:x86_64+0x100dbc2a7)
    #1 firebase::firestore::remote::Stream::RequestCredentials() <null>:2 (YSelfie:x86_64+0x100ecb758)
    #2 firebase::firestore::remote::Stream::Start() <null>:2 (YSelfie:x86_64+0x100ecb165)
    #3 firebase::firestore::remote::RemoteStore::StartWatchStream() <null>:2 (YSelfie:x86_64+0x100eb925f)
    #4 firebase::firestore::remote::RemoteStore::EnableNetwork() <null>:2 (YSelfie:x86_64+0x100eb910d)
    #5 firebase::firestore::remote::RemoteStore::RestartNetwork() <null>:2 (YSelfie:x86_64+0x100ebd365)
    #6 firebase::firestore::remote::RemoteStore::HandleCredentialChange() <null>:2 (YSelfie:x86_64+0x100ebd3fc)
    #7 firebase::firestore::core::SyncEngine::HandleCredentialChange(firebase::firestore::credentials::User const&) <null>:2 (YSelfie:x86_64+0x100d8974b)
    #8 std::__1::__function::__func<firebase::firestore::core::FirestoreClient::Create(firebase::firestore::core::DatabaseInfo const&, firebase::firestore::api::Settings const&, std::__1::shared_ptr<firebase::firestore::credentials::CredentialsProvider<firebase::firestore::credentials::AuthToken, firebase::firestore::credentials::User> >, std::__1::shared_ptr<firebase::firestore::credentials::CredentialsProvider<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >, std::__1::shared_ptr<firebase::firestore::util::Executor>, std::__1::shared_ptr<firebase::firestore::util::AsyncQueue>, std::__1::unique_ptr<firebase::firestore::remote::FirebaseMetadataProvider, std::__1::default_delete<firebase::firestore::remote::FirebaseMetadataProvider> >)::$_3::operator()(firebase::firestore::credentials::User)::'lambda0'(), std::__1::allocator<firebase::firestore::core::FirestoreClient::Create(firebase::firestore::core::DatabaseInfo const&, firebase::firestore::api::Settings const&, std::__1::shared_ptr<firebase::firestore::credentials::CredentialsProvider<firebase::firestore::credentials::AuthToken, firebase::firestore::credentials::User> >, std::__1::shared_ptr<firebase::firestore::credentials::CredentialsProvider<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >, std::__1::shared_ptr<firebase::firestore::util::Executor>, std::__1::shared_ptr<firebase::firestore::util::AsyncQueue>, std::__1::unique_ptr<firebase::firestore::remote::FirebaseMetadataProvider, std::__1::default_delete<firebase::firestore::remote::FirebaseMetadataProvider> >)::$_3::operator()(firebase::firestore::credentials::User)::'lambda0'()>, void ()>::operator()() <null>:2 (YSelfie:x86_64+0x100d685f4)
    #9 firebase::firestore::util::AsyncQueue::ExecuteBlocking(std::__1::function<void ()> const&) <null>:2 (YSelfie:x86_64+0x100ed1f06)
    #10 std::__1::__function::__func<firebase::firestore::util::AsyncQueue::Wrap(std::__1::function<void ()> const&)::$_0, std::__1::allocator<firebase::firestore::util::AsyncQueue::Wrap(std::__1::function<void ()> const&)::$_0>, void ()>::operator()() <null>:2 (YSelfie:x86_64+0x100ed2d07)
    #11 firebase::firestore::util::Task::ExecuteAndRelease() <null>:2 (YSelfie:x86_64+0x100ee0a10)
    #12 firebase::firestore::util::ExecutorLibdispatch::InvokeAsync(void*) <null>:2 (YSelfie:x86_64+0x100ed61b5)
    #13 __tsan::dispatch_callback_wrap(void*) <null>:2 (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x77d95)
    #14 _dispatch_client_callout <null>:2 (libdispatch.dylib:x86_64+0x4a5a)

  Previous write of size 1 at 0x7b2000058060 by main thread (mutexes: write M382659887898899168):
    #0 firebase::firestore::credentials::FirebaseAuthCredentialsProvider::GetToken(std::__1::function<void (firebase::firestore::util::StatusOr<firebase::firestore::credentials::AuthToken>)>) <null>:2 (YSelfie:x86_64+0x100dbc2f1)
    #1 invocation function for block in firebase::firestore::credentials::FirebaseAuthCredentialsProvider::GetToken(std::__1::function<void (firebase::firestore::util::StatusOr<firebase::firestore::credentials::AuthToken>)>) <null>:2 (YSelfie:x86_64+0x100dbc6d1)
    #2 __47-[FIRAuth getTokenForcingRefresh:withCallback:]_block_invoke_6 <null>:2 (YSelfie:x86_64+0x1005d6756)
    #3 __tsan::invoke_and_release_block(void*) <null>:2 (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x7803b)
    #4 _dispatch_client_callout <null>:2 (libdispatch.dylib:x86_64+0x4a5a)
    #5 start_sim <null>:2 (dyld_sim:x86_64+0x1f20)

  Location is heap block of size 128 at 0x7b2000058000 allocated by main thread:
    #0 operator new(unsigned long) <null>:2 (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x7bb3d)
    #1 -[FSTFirestoreComponent firestoreForDatabase:] <null>:2 (YSelfie:x86_64+0x100d14d25)
    #2 +[FIRFirestore firestoreForApp:database:] <null>:2 (YSelfie:x86_64+0x100cf8186)
    #3 +[FIRFirestore firestore] <null>:2 (YSelfie:x86_64+0x100cf7ed4)
    #4 specialized InitialNetworkService.__allocating_init(resourcesManager:contentProvider:) InitialNetworkService.swift:31 (YSelfie:x86_64+0x10007c5a9)
    #5 AppContext.sessionManager.getter AppContext.swift:40 (YSelfie:x86_64+0x100078df0)
    #6 AppContext.startApp(from:) AppContext.swift:164 (YSelfie:x86_64+0x10007ae30)
    #7 AppContext.startApp(with:) AppContext.swift:150 (YSelfie:x86_64+0x10007a980)
    #8 AppContext.application(_:didFinishLaunchingWithOptions:) AppContext.swift:74 (YSelfie:x86_64+0x1000795e6)
    #9 @objc AppDelegate.application(_:didFinishLaunchingWithOptions:) <compiler-generated>:20 (YSelfie:x86_64+0x10024b47c)
    #10 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] <null>:2 (UIKitCore:x86_64+0xcd6846)
    #11 start_sim <null>:2 (dyld_sim:x86_64+0x1f20)

  Mutex M382659887898899168 is already destroyed.

  Thread T12 (tid=935625, running) is a GCD worker thread

SUMMARY: ThreadSanitizer: data race (YSelfie:x86_64+0x100dbc2a7) in firebase::firestore::credentials::FirebaseAuthCredentialsProvider::GetToken(std::__1::function<void (firebase::firestore::util::StatusOr<firebase::firestore::credentials::AuthToken>)>)+0x137
==================
ThreadSanitizer report breakpoint hit. Use 'thread info -s' to get extended information about the report.
==================
WARNING: ThreadSanitizer: data race (pid=98911)
  Write of size 4 at 0x7b24000132d8 by main thread (mutexes: write M382659887898899168):
    #0 invocation function for block in firebase::firestore::credentials::FirebaseAuthCredentialsProvider::FirebaseAuthCredentialsProvider(FIRApp*, id<FIRAuthInterop>) <null>:2 (YSelfie:x86_64+0x100dbbbc7)
    #1 -[__NSObserver _doit:] <null>:2 (Foundation:x86_64+0xd75c0)
    #2 __tsan::invoke_and_release_block(void*) <null>:2 (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x7803b)
    #3 _dispatch_client_callout <null>:2 (libdispatch.dylib:x86_64+0x4a5a)
    #4 start_sim <null>:2 (dyld_sim:x86_64+0x1f20)

  Previous read of size 4 at 0x7b24000132d8 by thread T12:
    #0 firebase::firestore::credentials::FirebaseAuthCredentialsProvider::GetToken(std::__1::function<void (firebase::firestore::util::StatusOr<firebase::firestore::credentials::AuthToken>)>) <null>:2 (YSelfie:x86_64+0x100dbc1ce)
    #1 firebase::firestore::remote::Stream::RequestCredentials() <null>:2 (YSelfie:x86_64+0x100ecb758)
    #2 firebase::firestore::remote::Stream::Start() <null>:2 (YSelfie:x86_64+0x100ecb165)
    #3 firebase::firestore::remote::RemoteStore::StartWatchStream() <null>:2 (YSelfie:x86_64+0x100eb925f)
    #4 firebase::firestore::remote::RemoteStore::EnableNetwork() <null>:2 (YSelfie:x86_64+0x100eb910d)
    #5 firebase::firestore::remote::RemoteStore::RestartNetwork() <null>:2 (YSelfie:x86_64+0x100ebd365)
    #6 firebase::firestore::remote::RemoteStore::HandleCredentialChange() <null>:2 (YSelfie:x86_64+0x100ebd3fc)
    #7 firebase::firestore::core::SyncEngine::HandleCredentialChange(firebase::firestore::credentials::User const&) <null>:2 (YSelfie:x86_64+0x100d8974b)
    #8 std::__1::__function::__func<firebase::firestore::core::FirestoreClient::Create(firebase::firestore::core::DatabaseInfo const&, firebase::firestore::api::Settings const&, std::__1::shared_ptr<firebase::firestore::credentials::CredentialsProvider<firebase::firestore::credentials::AuthToken, firebase::firestore::credentials::User> >, std::__1::shared_ptr<firebase::firestore::credentials::CredentialsProvider<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >, std::__1::shared_ptr<firebase::firestore::util::Executor>, std::__1::shared_ptr<firebase::firestore::util::AsyncQueue>, std::__1::unique_ptr<firebase::firestore::remote::FirebaseMetadataProvider, std::__1::default_delete<firebase::firestore::remote::FirebaseMetadataProvider> >)::$_3::operator()(firebase::firestore::credentials::User)::'lambda0'(), std::__1::allocator<firebase::firestore::core::FirestoreClient::Create(firebase::firestore::core::DatabaseInfo const&, firebase::firestore::api::Settings const&, std::__1::shared_ptr<firebase::firestore::credentials::CredentialsProvider<firebase::firestore::credentials::AuthToken, firebase::firestore::credentials::User> >, std::__1::shared_ptr<firebase::firestore::credentials::CredentialsProvider<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >, std::__1::shared_ptr<firebase::firestore::util::Executor>, std::__1::shared_ptr<firebase::firestore::util::AsyncQueue>, std::__1::unique_ptr<firebase::firestore::remote::FirebaseMetadataProvider, std::__1::default_delete<firebase::firestore::remote::FirebaseMetadataProvider> >)::$_3::operator()(firebase::firestore::credentials::User)::'lambda0'()>, void ()>::operator()() <null>:2 (YSelfie:x86_64+0x100d685f4)
    #9 firebase::firestore::util::AsyncQueue::ExecuteBlocking(std::__1::function<void ()> const&) <null>:2 (YSelfie:x86_64+0x100ed1f06)
    #10 std::__1::__function::__func<firebase::firestore::util::AsyncQueue::Wrap(std::__1::function<void ()> const&)::$_0, std::__1::allocator<firebase::firestore::util::AsyncQueue::Wrap(std::__1::function<void ()> const&)::$_0>, void ()>::operator()() <null>:2 (YSelfie:x86_64+0x100ed2d07)
    #11 firebase::firestore::util::Task::ExecuteAndRelease() <null>:2 (YSelfie:x86_64+0x100ee0a10)
    #12 firebase::firestore::util::ExecutorLibdispatch::InvokeAsync(void*) <null>:2 (YSelfie:x86_64+0x100ed61b5)
    #13 __tsan::dispatch_callback_wrap(void*) <null>:2 (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x77d95)
    #14 _dispatch_client_callout <null>:2 (libdispatch.dylib:x86_64+0x4a5a)

  Location is heap block of size 144 at 0x7b2400013290 allocated by main thread:
    #0 operator new(unsigned long) <null>:2 (libclang_rt.tsan_iossim_dynamic.dylib:x86_64+0x7bb3d)
    #1 firebase::firestore::credentials::FirebaseAuthCredentialsProvider::FirebaseAuthCredentialsProvider(FIRApp*, id<FIRAuthInterop>) <null>:2 (YSelfie:x86_64+0x100dbb5e8)
    #2 firebase::firestore::credentials::FirebaseAuthCredentialsProvider::FirebaseAuthCredentialsProvider(FIRApp*, id<FIRAuthInterop>) <null>:2 (YSelfie:x86_64+0x100dbbf6d)
    #3 -[FSTFirestoreComponent firestoreForDatabase:] <null>:2 (YSelfie:x86_64+0x100d14d6b)
    #4 +[FIRFirestore firestoreForApp:database:] <null>:2 (YSelfie:x86_64+0x100cf8186)
    #5 +[FIRFirestore firestore] <null>:2 (YSelfie:x86_64+0x100cf7ed4)
    #6 specialized InitialNetworkService.__allocating_init(resourcesManager:contentProvider:) InitialNetworkService.swift:31 (YSelfie:x86_64+0x10007c5a9)
    #7 AppContext.sessionManager.getter AppContext.swift:40 (YSelfie:x86_64+0x100078df0)
    #8 AppContext.startApp(from:) AppContext.swift:164 (YSelfie:x86_64+0x10007ae30)
    #9 AppContext.startApp(with:) AppContext.swift:150 (YSelfie:x86_64+0x10007a980)
    #10 AppContext.application(_:didFinishLaunchingWithOptions:) AppContext.swift:74 (YSelfie:x86_64+0x1000795e6)
    #11 @objc AppDelegate.application(_:didFinishLaunchingWithOptions:) <compiler-generated>:20 (YSelfie:x86_64+0x10024b47c)
    #12 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] <null>:2 (UIKitCore:x86_64+0xcd6846)
    #13 start_sim <null>:2 (dyld_sim:x86_64+0x1f20)

  Mutex M382659887898899168 is already destroyed.

  Thread T12 (tid=935625, running) is a GCD worker thread

SUMMARY: ThreadSanitizer: data race (YSelfie:x86_64+0x100dbbbc7) in invocation function for block in firebase::firestore::credentials::FirebaseAuthCredentialsProvider::FirebaseAuthCredentialsProvider(FIRApp*, id<FIRAuthInterop>)+0x1c1
==================
ThreadSanitizer report breakpoint hit. Use 'thread info -s' to get extended information about the report.

If using Swift Package Manager, the project's Package.resolved

Expand Package.resolved snippet
{
  "pins" : [
    {
      "identity" : "abseil-cpp-swiftpm",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/firebase/abseil-cpp-SwiftPM.git",
      "state" : {
        "revision" : "d302de612e3d57c6f4afaf087da18fba8eac72a7",
        "version" : "0.20220203.1"
      }
    },
    {
      "identity" : "alamofire",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/Alamofire/Alamofire.git",
      "state" : {
        "revision" : "f82c23a8a7ef8dc1a49a8bfc6a96883e79121864",
        "version" : "5.5.0"
      }
    },
    {
      "identity" : "appauth-ios",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/openid/AppAuth-iOS.git",
      "state" : {
        "revision" : "3d36a58a2b736f7bc499453e996a704929b25080",
        "version" : "1.6.0"
      }
    },
    {
      "identity" : "boringssl-swiftpm",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/firebase/boringssl-SwiftPM.git",
      "state" : {
        "revision" : "79db6516894a932d0ddaff3b05b9da1e4f6c4069",
        "version" : "0.9.0"
      }
    },
    {
      "identity" : "braintree-ios-drop-in",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/braintree/braintree-ios-drop-in",
      "state" : {
        "revision" : "d4ee6799c70ab70545054acf60475315c5fd6196",
        "version" : "9.5.0"
      }
    },
    {
      "identity" : "braintree_ios",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/braintree/braintree_ios",
      "state" : {
        "revision" : "5013d5bc515ddbe8b50465f10fd7545430d7c86f",
        "version" : "5.12.0"
      }
    },
    {
      "identity" : "eventsource",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/inaka/EventSource",
      "state" : {
        "branch" : "master",
        "revision" : "78934b361891c7d0fa3d399d128e959f0c94d267"
      }
    },
    {
      "identity" : "facebook-ios-sdk",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/facebook/facebook-ios-sdk",
      "state" : {
        "revision" : "c19607d535864533523d1f437c84035e5fb101cf",
        "version" : "14.1.0"
      }
    },
    {
      "identity" : "firebase-ios-sdk",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/firebase/firebase-ios-sdk.git",
      "state" : {
        "revision" : "5c4893c55f9d6114e2bb7c691d7ffd81208ac713",
        "version" : "10.0.0"
      }
    },
    {
      "identity" : "fittedsheets",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/gordontucker/FittedSheets",
      "state" : {
        "revision" : "65f9c93718f96c6de234d38c9976e67a0d9e2b28",
        "version" : "2.4.2"
      }
    },
    {
      "identity" : "googleappmeasurement",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/GoogleAppMeasurement.git",
      "state" : {
        "revision" : "e3dd02f390cae79a7073b46dfb0cb6b60c48401b",
        "version" : "10.0.0"
      }
    },
    {
      "identity" : "googledatatransport",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/GoogleDataTransport.git",
      "state" : {
        "revision" : "5056b15c5acbb90cd214fe4d6138bdf5a740e5a8",
        "version" : "9.2.0"
      }
    },
    {
      "identity" : "googlesignin-ios",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/GoogleSignIn-iOS",
      "state" : {
        "revision" : "9c9b36af86a4dd3da16048a36cf37351e63ccfe1",
        "version" : "6.2.4"
      }
    },
    {
      "identity" : "googleutilities",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/GoogleUtilities.git",
      "state" : {
        "revision" : "68ea347bdb1a69e2d2ae2e25cd085b6ef92f64cb",
        "version" : "7.9.0"
      }
    },
    {
      "identity" : "grpc-ios",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/grpc/grpc-ios.git",
      "state" : {
        "revision" : "abd2d5a4347efa0454606a788678a5d8ec223738",
        "version" : "1.44.0-grpc"
      }
    },
    {
      "identity" : "gtm-session-fetcher",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/gtm-session-fetcher.git",
      "state" : {
        "revision" : "d4289da23e978f37c344ea6a386e5546e2466294",
        "version" : "2.1.0"
      }
    },
    {
      "identity" : "gtmappauth",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/GTMAppAuth.git",
      "state" : {
        "revision" : "6dee0cde8a1b223737a5159e55e6b4ec16bbbdd9",
        "version" : "1.3.1"
      }
    },
    {
      "identity" : "haishinkit.swift",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/shogo4405/HaishinKit.swift",
      "state" : {
        "revision" : "8fc3f3b1a52778dc42ebe64b26e67b4a6b9027e0",
        "version" : "1.2.3"
      }
    },
    {
      "identity" : "keychainaccess",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/kishikawakatsumi/KeychainAccess.git",
      "state" : {
        "revision" : "84e546727d66f1adc5439debad16270d0fdd04e7",
        "version" : "4.2.2"
      }
    },
    {
      "identity" : "leveldb",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/firebase/leveldb.git",
      "state" : {
        "revision" : "0706abcc6b0bd9cedfbb015ba840e4a780b5159b",
        "version" : "1.22.2"
      }
    },
    {
      "identity" : "logboard",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/shogo4405/Logboard.git",
      "state" : {
        "revision" : "8cc7656b07e4d327fae42e1320e2e48b8868e3f6",
        "version" : "2.2.2"
      }
    },
    {
      "identity" : "moya",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/Moya/Moya.git",
      "state" : {
        "revision" : "9b906860e3c3c09032879465c471e6375829593f",
        "version" : "15.0.0"
      }
    },
    {
      "identity" : "nanopb",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/firebase/nanopb.git",
      "state" : {
        "revision" : "819d0a2173aff699fb8c364b6fb906f7cdb1a692",
        "version" : "2.30909.0"
      }
    },
    {
      "identity" : "nuke",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/kean/Nuke.git",
      "state" : {
        "revision" : "a002b7fd786f2df2ed4333fe73a9727499fd9d97",
        "version" : "10.11.2"
      }
    },
    {
      "identity" : "paypalcheckout-ios",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/paypal/paypalcheckout-ios",
      "state" : {
        "revision" : "122a8a67f30b55768321e3cb3d30ce6792585063",
        "version" : "0.100.0"
      }
    },
    {
      "identity" : "promises",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/google/promises.git",
      "state" : {
        "revision" : "46c1e6b5ac09d8f82c991061c659f67e573d425d",
        "version" : "2.1.0"
      }
    },
    {
      "identity" : "prynttrimmerview",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/HHK1/PryntTrimmerView",
      "state" : {
        "revision" : "ac1b60a22c7e6a6514de7a66d2f3d5b537c956d5",
        "version" : "4.0.2"
      }
    },
    {
      "identity" : "reactiveswift",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/ReactiveCocoa/ReactiveSwift.git",
      "state" : {
        "revision" : "c43bae3dac73fdd3cb906bd5a1914686ca71ed3c",
        "version" : "6.7.0"
      }
    },
    {
      "identity" : "rxswift",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/ReactiveX/RxSwift.git",
      "state" : {
        "revision" : "b4307ba0b6425c0ba4178e138799946c3da594f8",
        "version" : "6.5.0"
      }
    },
    {
      "identity" : "skeletonview",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/Juanpe/SkeletonView",
      "state" : {
        "revision" : "ca7d2edceee613e47b7857029fc82de633460e6f",
        "version" : "1.30.2"
      }
    },
    {
      "identity" : "stevia",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/freshOS/Stevia",
      "state" : {
        "revision" : "87dd17a86240f16788239a78dd8be11c4b013150",
        "version" : "4.8.0"
      }
    },
    {
      "identity" : "swift-protobuf",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/apple/swift-protobuf.git",
      "state" : {
        "revision" : "e1499bc69b9040b29184f7f2996f7bab467c1639",
        "version" : "1.19.0"
      }
    },
    {
      "identity" : "swiftdate",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/malcommac/SwiftDate.git",
      "state" : {
        "revision" : "6190d0cefff3013e77ed567e6b074f324e5c5bf5",
        "version" : "6.3.1"
      }
    },
    {
      "identity" : "ypimagepicker",
      "kind" : "remoteSourceControl",
      "location" : "https://github.com/Yummypets/YPImagePicker.git",
      "state" : {
        "revision" : "4dbae7a1f69db3d65c47f4106d0ca09f678edeaf",
        "version" : "5.2.1"
      }
    }
  ],
  "version" : 2
}

If using CocoaPods, the project's Podfile.lock

Expand Podfile.lock snippet
Replace this line with the contents of your Podfile.lock!

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions