Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FIREBASE_FIRESTORE]: Running Transactions crashed the app on iOS real device #16872

Open
1 task done
faheem-riaz opened this issue Dec 13, 2024 · 3 comments
Open
1 task done
Labels
blocked: customer-response Waiting for customer response, e.g. more information was requested. platform: ios Issues / PRs which are specifically for iOS. plugin: cloud_firestore type: bug Something isn't working

Comments

@faheem-riaz
Copy link

Is there an existing issue for this?

  • I have searched the existing issues.

Which plugins are affected?

Database

Which platforms are affected?

iOS

Description

When i run transaction on iOS simulator it works but fails on real device.

Reproducing the issue

Future trackSearch(String serviceName, String category) async {
try {
print('Starting trackSearch...');
print('Service Name: $serviceName');
print('Category: $category');

  // Create a unique document ID based on category and service name
  final docId = '${category}_$serviceName'.replaceAll(' ', '_').toLowerCase();
  
  final searchRef = FirebaseFirestore.instance
      .collection('serviceSearches')
      .doc(docId);
  
  print('Document path: ${searchRef.path}');

  try {
    await FirebaseFirestore.instance.runTransaction((transaction) async {
      print('Starting transaction...');
      final doc = await transaction.get(searchRef);
      print('Document exists: ${doc.exists}');

      if (doc.exists) {
        print('Current search count: ${doc.data()?['searchCount']}');
        transaction.update(searchRef, {
          'searchCount': FieldValue.increment(1),
          'lastSearched': FieldValue.serverTimestamp(),
        });
      } else {
        print('Creating new document...');
        final newData = {
          'category': category,
          'serviceName': serviceName,
          'searchCount': 1,
          'lastSearched': FieldValue.serverTimestamp(),
          'isServiceSearch': true,
        };
        transaction.set(searchRef, newData);
      }
    });

    // Verify the document after transaction
    final verifyDoc = await searchRef.get();
    if (verifyDoc.exists) {
      print('After transaction - Search count: ${verifyDoc.data()?['searchCount']}');
    }

  } catch (transactionError) {
    print('Transaction error: $transactionError');
  }

} catch (e) {
  print('Error in trackSearch: $e');
}

}

Firebase Core version

11.4.0

Flutter Version

3.27.0

Relevant Log Output

Runner(516,0x17398f000) malloc: double free for ptr 0x143bf8800
Runner(516,0x17398f000) malloc: *** set a breakpoint in malloc_error_break to debug
* thread #101, queue = 'com.google.firebase.firestore.transaction', stop reason = signal SIGABRT
    frame #0: 0x00000001d2ac9578 libsystem_kernel.dylib`__pthread_kill + 8
libsystem_kernel.dylib`:
->  0x1d2ac9578 <+8>:  b.lo   0x1d2ac9598               ; <+40>
    0x1d2ac957c <+12>: pacibsp 
    0x1d2ac9580 <+16>: stp    x29, x30, [sp, #-0x10]!
    0x1d2ac9584 <+20>: mov    x29, sp
Target 0: (Runner) stopped.
Lost connection to device.

Exited.

Flutter dependencies

Expand Flutter dependencies snippet name: acumacum description: "A new Flutter project." # The following line prevents the package from being accidentally published to # pub.dev using `flutter pub publish`. This is preferred for private packages. publish_to: "none" # Remove this line if you wish to publish to pub.dev

The following defines the version and build number for your application.

A version number is three numbers separated by dots, like 1.2.43

followed by an optional build number separated by a +.

Both the version and the builder number may be overridden in flutter

build by specifying --build-name and --build-number, respectively.

In Android, build-name is used as versionName while build-number used as versionCode.

Read more about Android versioning at https://developer.android.com/studio/publish/versioning

In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion.

Read more about iOS versioning at

https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html

In Windows, build-name is used as the major, minor, and patch parts

of the product and file versions while build-number is used as the build suffix.

version: 1.0.2+5

environment:
sdk: ">=3.4.0-282.1.beta <4.0.0"

Dependencies specify other packages that your package needs in order to work.

To automatically upgrade your package dependencies to the latest versions

consider running flutter pub upgrade --major-versions. Alternatively,

dependencies can be manually updated by changing the version numbers below to

the latest version available on pub.dev. To see which dependencies have newer

versions available, run flutter pub outdated.

dependencies:
flutter:
sdk: flutter

firebase_core: 3.8.1
firebase_analytics: ^11.2.1
cloud_firestore: ^5.2.0
firebase_auth: ^5.1.3
google_sign_in: ^6.2.1
geolocator: ^12.0.0
image_picker: ^1.0.7
firebase_storage: ^12.1.2
path: ^1.9.0
easy_pdf_viewer: ^1.0.8
firebase_messaging: ^15.0.4
flutter_local_notifications: ^17.0.0
bubble_bottom_bar: ^2.0.0
pull_to_refresh: ^2.0.0
qr_flutter: ^4.1.0
google_fonts: ^6.2.1
carousel_slider: ^5.0.0
shared_preferences: ^2.2.2
cached_network_image: ^3.3.1
video_player: ^2.8.5
font_awesome_flutter: ^9.0.0
fl_geocoder: ^0.1.0+1
direct_select: ^2.0.0
timeago: ^3.6.1
sliding_up_panel: ^2.0.0+1
rflutter_alert: ^2.0.7
url_launcher: ^6.2.5
share_plus: ^10.0.0
algolia: ^1.1.2
translator: ^1.0.0
flutter_localizations:
sdk: flutter
http: ^1.2.1
flutter_staggered_grid_view: ^0.7.0
logger: ^2.2.0
permission_handler: ^11.3.1
mobile_scanner: 6.0.2
table_calendar: ^3.0.9
intl: ^0.19.0
geocoding: ^3.0.0
add_2_calendar: ^3.0.1
flutter_stripe: ^11.3.0
liquid_pull_to_refresh: ^3.0.0
onesignal_flutter: ^5.2.8

dev_dependencies:
flutter_test:
sdk: flutter
flutter_launcher_icons: "^0.13.1"

The "flutter_lints" package below contains a set of recommended lints to

encourage good coding practices. The lint set provided by the package is

activated in the analysis_options.yaml file located at the root of your

package. See that file for information about deactivating specific lint

rules and activating additional ones.

flutter_lints: ^4.0.0

flutter_icons:
android: true
ios: true
image_path: "assets/images/applogo.png"

dependency_overrides:
http: ^1.0.0

For information on the generic Dart part of this file, see the

following page: https://dart.dev/tools/pub/pubspec

The following section is specific to Flutter packages.

flutter:

The following line ensures that the Material Icons font is

included with your application, so that you can use the icons in

the material Icons class.

uses-material-design: true

To add assets to your application, add an assets section, like this:

assets:
- assets/images/

An image asset can refer to one or more resolution-specific "variants", see

https://flutter.dev/assets-and-images/#resolution-aware.

For details regarding adding assets from package dependencies, see

https://flutter.dev/assets-and-images/#from-packages

To add custom fonts to your application, add a fonts section here,

in this "flutter" section. Each entry in this list should have a

"family" key with the font family name, and a "fonts" key with a

list giving the asset and other descriptors for the font. For

example:

- family: Trajan Pro

fonts:

- asset: assets/fonts/Marg.ttf

For details regarding fonts from package dependencies,

see https://flutter.dev/custom-fonts/#from-packages


Replace this line with the contents of your `flutter pub deps -- --style=compact`.
Doctor summary (to see all details, run flutter doctor -v): [✓] Flutter (Channel stable, 3.27.0, on macOS 14.3 23D56 darwin-arm64, locale en-DE) [✓] Android toolchain - develop for Android devices (Android SDK version 33.0.2) [✓] Xcode - develop for iOS and macOS (Xcode 15.4) [✓] Chrome - develop for the web [✓] Android Studio (version 2022.3) [✓] VS Code (version 1.95.3) [✓] Connected device (4 available) [✓] Network resources

• No issues found!
➜ ~

Additional context and comments

No response

@faheem-riaz faheem-riaz added Needs Attention This issue needs maintainer attention. type: bug Something isn't working labels Dec 13, 2024
@faheem-riaz faheem-riaz changed the title [FIREBASE_FIRESTORE]: <Running Transactions crashed the app on iOS real device> [FIREBASE_FIRESTORE]: Running Transactions crashed the app on iOS real device Dec 13, 2024
@SelaseKay SelaseKay added plugin: cloud_firestore platform: ios Issues / PRs which are specifically for iOS. labels Dec 13, 2024
@SelaseKay
Copy link
Contributor

Hi @faheem-riaz, thanks for the report. I'm unable to reproduce this issue. Can you provide a complete minimal code reproducing this issue?

@SelaseKay SelaseKay added blocked: customer-response Waiting for customer response, e.g. more information was requested. and removed Needs Attention This issue needs maintainer attention. labels Dec 13, 2024
@faheem-riaz
Copy link
Author

I already provided the code. but here you go again.
`
Future trackSearch(String serviceName, String category) async {
try {
print('Starting trackSearch...');
print('Service Name: $serviceName');
print('Category: $category');

// Create a unique document ID based on category and service name
final docId = '${category}$serviceName'.replaceAll(' ', '').toLowerCase();

final searchRef = FirebaseFirestore.instance
.collection('serviceSearches')
.doc(docId);

print('Document path: ${searchRef.path}');

try {
await FirebaseFirestore.instance.runTransaction((transaction) async {
print('Starting transaction...');
final doc = await transaction.get(searchRef);
print('Document exists: ${doc.exists}');

  if (doc.exists) {
    print('Current search count: ${doc.data()?['searchCount']}');
    transaction.update(searchRef, {
      'searchCount': FieldValue.increment(1),
      'lastSearched': FieldValue.serverTimestamp(),
    });
  } else {
    print('Creating new document...');
    final newData = {
      'category': category,
      'serviceName': serviceName,
      'searchCount': 1,
      'lastSearched': FieldValue.serverTimestamp(),
      'isServiceSearch': true,
    };
    transaction.set(searchRef, newData);
  }
});

// Verify the document after transaction
final verifyDoc = await searchRef.get();
if (verifyDoc.exists) {
  print('After transaction - Search count: ${verifyDoc.data()?['searchCount']}');
}

} catch (transactionError) {
print('Transaction error: $transactionError');
}

} catch (e) {
print('Error in trackSearch: $e');
}
}

`

@google-oss-bot google-oss-bot added Needs Attention This issue needs maintainer attention. and removed blocked: customer-response Waiting for customer response, e.g. more information was requested. labels Dec 16, 2024
@SelaseKay
Copy link
Contributor

Hi @faheem-riaz, thank you for sharing your sample code. However, I was unable to reproduce the issue using it. To better understand and resolve the problem, could you provide a complete minimal reproducible example? This includes all the necessary code and configurations to replicate the issue from scratch. You can refer to this guide for tips on creating one. You could create a new repository with the minimal code and share the link here. Thank you!

@SelaseKay SelaseKay added blocked: customer-response Waiting for customer response, e.g. more information was requested. and removed Needs Attention This issue needs maintainer attention. labels Dec 16, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
blocked: customer-response Waiting for customer response, e.g. more information was requested. platform: ios Issues / PRs which are specifically for iOS. plugin: cloud_firestore type: bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants