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
Reproducing the issue
- Initialize Firebase SDK
- 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!