-
Notifications
You must be signed in to change notification settings - Fork 121
[Local catalog] Hide cellular toggle on non-cellular devices #16412
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
[Local catalog] Hide cellular toggle on non-cellular devices #16412
Conversation
Many iPads don’t have a cellular connection. It’s a little confusing to show the cellular toggle when it doesn’t apply. Unfortunately, there’s no good (undeprecated) API for checking this. I’ve used an approach of listing the network interfaces and looking for the cellular one, but it’s undocumented and might not always work. OTOH, this isn’t a critical feature, so we can keep an eye on it.
Generated by 🚫 Danger |
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM! I did not see the button in iPad, but I was unable to test on an iPhone after removing the .pad constraint. It's unrelated to this PR so I'll approve to unblock it.
For the issue I saw, it seems to have a problem with GRDB sync not finding statusKey, and I saw the error on screen that I cannot sync and to retry. The only thing I've changed on my end is the MARKETING_VERSION = 23.8;, then attempted to run in a iPhone 16 Plus, iOS 18.3 in landscape due to the unsupported screen width case.
🔵 Tracked pos_splash_screen_retry_tapped, properties: [store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f, was_ecommerce_trial: false, is_wpcom_store: false, site_url: https://indiemelon.mystagingwebsite.com, blog_id: -1, plan: ]
🔄 POSCatalogSyncCoordinator: Performing full sync for site -1 (last full sync: 1970-01-01T00:00:00Z UTC)
📋 POSCatalogSyncCoordinator: Site -1 eligible (no first sync date recorded)
📋 POSCatalogSyncCoordinator: Site -1 not found in database, sync needed
CoreData: debug: PostSaveMaintenance: incremental_vacuum with freelist_count - 13 and pages_to_free 6
🔵 Tracked pos_local_catalog_sync_started, properties: [sync_type: full, connection_type: wifi]
🔄 POSCatalogSyncCoordinator starting full sync for site -1
🔄 Starting full catalog sync for site ID: -1 with regenerateCatalog: false and allowCellular: true
🔵 Tracked pos_local_catalog_downloading_screen_shown, properties: [was_ecommerce_trial: false, site_url: https://indiemelon.mystagingwebsite.com, blog_id: -1, plan: , is_wpcom_store: false, store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f]
✅ Loaded 86 products and 105 variations for siteID -1
💾 Persisting catalog with 86 products and 105 variations
🗑️ Clearing catalog data for site -1
table product has no column named statusKey in "INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
❌ Failed to sync and persist catalog: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
⛔️ POSCatalogSyncCoordinator failed to complete sync for site -1: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
🔵 Tracked pos_local_catalog_sync_failed, properties: [sync_type: full, error_code: 1, error_description: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, error_domain: GRDB.DatabaseError, error_type: database_error]
🔵 Tracked pos_splash_screen_error_shown, properties: [plan: , store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f, is_wpcom_store: false, blog_id: -1, site_url: https://indiemelon.mystagingwebsite.com, was_ecommerce_trial: false]
no such column: statusKey in "SELECT * FROM "product" WHERE ("siteID" = ?) AND ("productTypeKey" IN (?, ?)) AND ("downloadable" = ?) AND ("statusKey" NOT IN (?, ?, ?)) ORDER BY "name" COLLATE swiftLocalizedCaseInsensitiveCompare LIMIT 20"
After this, on a second run, these are the logs:
CoreData: annotation: Core Data multi-threading assertions enabled.
👀 Push Notifications are not supported in the Simulator!
Zendesk Enabled: true
⚠️ No processor found for AccountAction!
⚠️ No processor found for AccountAction!
nw_connection_copy_connected_local_endpoint_block_invoke [C1] Connection has no local endpoint
nw_connection_copy_connected_local_endpoint_block_invoke [C1] Connection has no local endpoint
📜 Resumed encrypted log upload queue due to app entering foreground
CoreData: debug: PostSaveMaintenance: incremental_vacuum with freelist_count - 9 and pages_to_free 1
-[WCSession onqueue_handleUpdateSessionState:]_block_invoke dropping as pairingIDs no longer match. pairingID (null), client pairingID: (null)
🔵 Tracked dashboard_loaded, properties: [store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f]
WCSession is not paired
nw_connection_copy_connected_local_endpoint_block_invoke [C1] Connection has no local endpoint
Warning once only: UITableView was told to layout its visible cells and other contents without being in the view hierarchy (the table view or one of its superviews has not been added to a window). This may cause bugs by forcing views inside the table view to load and perform layout without accurate information (e.g. table view bounds, trait collection, layout margins, safe area insets, etc), and will also cause unnecessary performance overhead due to extra layout passes. Make a symbolic breakpoint at UITableViewAlertForLayoutOutsideViewHierarchy to catch this in the debugger and see what caused this to occur, so you can avoid this action altogether if possible, or defer it until the table view has been added to a window. Table view: <UITableView: 0x10888aa00; frame = (0 44; 414 818); clipsToBounds = YES; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x600000d39e00>; backgroundColor = <UIDynamicProviderColor: 0x60000031ea20; provider = <__NSMallocBlock__: 0x600000d2c360>>; layer = <CALayer: 0x600000314a60>; contentOffset: {0, 0}; contentSize: {414, 80}; adjustedContentInset: {0, 0, 0, 0}; dataSource: <_TtGC5UIKit29UITableViewDiffableDataSourceSSCSo17NSManagedObjectID_: 0x6000000131d0>>
It was not possible to sync local orders settings: noOrdersSettings
Failed to send CA Event for app launch measurements for ca_event_type: 0 event_name: com.apple.app_launch_measurement.FirstFramePresentationMetric
🔵 Tracked app_feedback_prompt, properties: [action: shown, store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f]
⚠️ Cannot check WC version on default store — default siteID is nil or 0.
checkAppleIDCredentialState: No Apple ID found.
🔵 Tracked application_opened, properties: [widgets: , store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f]
Blaze: Store not eligible for Blaze. Don't schedule local notification.
🔵 Tracked dynamic_dashboard_card_data_loading_started, properties: [type: store_setup, store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f]
Class CKBrowserSwitcherViewController overrides the -traitCollection getter, which is not supported. If you're trying to override traits, you must use the appropriate API.
📣 Announcements synced, but nothing received.
📣 There are no announcements to show!
nw_connection_copy_connected_local_endpoint_block_invoke [C12] Connection has no local endpoint
nw_connection_copy_connected_local_endpoint_block_invoke [C12] Connection has no local endpoint
⛔️ Failed to sync add-on groups for siteID: -1. Error: Sorry, we couldn't find what you were looking for. Please try again. Response: {"code":"rest_no_route","message":"No route was found matching the URL and request method.","data":{"status":404}}
nw_connection_copy_connected_local_endpoint_block_invoke [C12] Connection has no local endpoint
🎛 Site settings sync completed for siteID -1
already in progress or activated
AX Safe category class 'SLHighlightDisambiguationPillViewAccessibility' was not found!
🔵 Tracked dynamic_dashboard_card_data_loading_completed, properties: [was_ecommerce_trial: false, plan: , is_wpcom_store: false, blog_id: -1, site_url: https://indiemelon.mystagingwebsite.com, type: store_setup, store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f]
Message: Tag aztec.htmltag.rootnode invalid
🔵 Tracked watch_syncing_failed, properties: [error_description: WooCommerce.WatchDependenciesSynchronizer.SyncError.watchSessionInactiveOrNotPaired, watch_app_installed: false, error_domain: WooCommerce.WatchDependenciesSynchronizer.SyncError, blog_id: -1, session_active: true, session_paired: false, is_wpcom_store: false, plan: , site_url: https://indiemelon.mystagingwebsite.com, store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f, error_code: 0, was_ecommerce_trial: false]
⛔️ Error checking Google ads connection: Sorry, we couldn't find what you were looking for. Please try again. Response: {"code":"rest_no_route","message":"No route was found matching the URL and request method.","data":{"status":404}}
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Message: Tag aztec.htmltag.rootnode invalid
Failed to send CA Event for app launch measurements for ca_event_type: 1 event_name: com.apple.app_launch_measurement.ExtendedLaunchMetrics
🟢 Successfully synced system information
🟢 Loaded Store UUID: Optional("c5bd46cc-1804-4f7b-badb-bb98c449127f")
🔵 Tracked pos_tab_visibility_checked, properties: [is_visible: true, blog_id: -1, was_ecommerce_trial: false, is_wpcom_store: false, site_url: https://indiemelon.mystagingwebsite.com, plan: , store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f]
🔵 Tracked pos_tab_visibility_checked, properties: [blog_id: -1, was_ecommerce_trial: false, is_wpcom_store: false, site_url: https://indiemelon.mystagingwebsite.com, store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f, is_visible: true, plan: ]
⛔️ Error checking Google ads connection: Sorry, we couldn't find what you were looking for. Please try again. Response: {"code":"rest_no_route","message":"No route was found matching the URL and request method.","data":{"status":404}}
⛔️ Error checking Google ads connection: Sorry, we couldn't find what you were looking for. Please try again. Response: {"code":"rest_no_route","message":"No route was found matching the URL and request method.","data":{"status":404}}
📋 POSLocalCatalogEligibilityService: WooCommerce version 10.3.4 meets minimum requirement for site -1
📋 POSLocalCatalogEligibilityService: WooCommerce version 10.3.4 meets minimum requirement for site -1
📋 POSLocalCatalogEligibilityService: Site -1 catalog size 191 is within limit 1000
🔄 ForegroundPOSCatalogSyncDispatcher: Starting foreground sync dispatcher for site -1
⏱️ ForegroundPOSCatalogSyncDispatcher: Starting timer (interval: 3600s
🔄 ForegroundPOSCatalogSyncDispatcher: Starting sync for site -1
🔄 POSCatalogSyncCoordinator: Performing full sync for site -1 (last full sync: 1970-01-01T00:00:00Z UTC)
📋 POSCatalogSyncCoordinator: Site -1 eligible (no first sync date recorded)
📋 POSCatalogSyncCoordinator: Site -1 not found in database, sync needed
🔵 Tracked pos_local_catalog_sync_started, properties: [sync_type: full, connection_type: wifi]
🔄 POSCatalogSyncCoordinator starting full sync for site -1
🔄 Starting full catalog sync for site ID: -1 with regenerateCatalog: false and allowCellular: true
📋 POSLocalCatalogEligibilityService: Site -1 catalog size 191 is within limit 1000
✅ Loaded 86 products and 105 variations for siteID -1
💾 Persisting catalog with 86 products and 105 variations
🗑️ Clearing catalog data for site -1
table product has no column named statusKey in "INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
❌ Failed to sync and persist catalog: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
⛔️ POSCatalogSyncCoordinator failed to complete sync for site -1: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
🔵 Tracked pos_local_catalog_sync_failed, properties: [error_code: 1, error_type: database_error, error_domain: GRDB.DatabaseError, sync_type: full, error_description: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`]
⛔️ ForegroundPOSCatalogSyncDispatcher: Sync failed for site -1: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
*** A Tracks logging delegate has not been configured, so Tracks will log to the console. If you would like to redirect logging to an existing logging system, assign a logging delegate to TracksLogging.delegate. (You may need to import AutomatticTracksModel, depending on what else you have imported.)
Tracks <V>: TracksService sendQueuedEvents completed. Sent 11 events.
I was able to load POS momentarily, but then stopped showing the products, neither the Local Catalog option does not appear in settings. Logs:
CoreData: debug: PostSaveMaintenance: incremental_vacuum with freelist_count - 8 and pages_to_free 1
🔵 Tracked main_tab_pos_selected, properties: [is_wpcom_store: false, plan: , site_url: https://indiemelon.mystagingwebsite.com, store_id: c5bd46cc-1804-4f7b-badb-bb98c449127f, was_ecommerce_trial: false, blog_id: -1]
no such column: statusKey in "SELECT COUNT(*) FROM "product" WHERE ("siteID" = ?) AND ("productTypeKey" IN (?, ?)) AND ("downloadable" = ?) AND ("statusKey" NOT IN (?, ?, ?))"
🔄 POSCatalogSyncCoordinator: Performing full sync for site -1 (last full sync: 1970-01-01T00:00:00Z UTC)
📋 POSCatalogSyncCoordinator: Site -1 eligible (no first sync date recorded)
📋 POSCatalogSyncCoordinator: Site -1 not found in database, sync needed
🔵 Tracked pos_local_catalog_sync_started, properties: [connection_type: wifi, sync_type: full]
🔄 POSCatalogSyncCoordinator starting full sync for site -1
🔄 Starting full catalog sync for site ID: -1 with regenerateCatalog: false and allowCellular: true
Update NavigationRequestObserver tried to update multiple times per frame.
no such column: statusKey in "SELECT * FROM "product" WHERE ("siteID" = ?) AND ("productTypeKey" IN (?, ?)) AND ("downloadable" = ?) AND ("statusKey" NOT IN (?, ?, ?)) ORDER BY "name" COLLATE swiftLocalizedCaseInsensitiveCompare LIMIT 20"
📋 POSCatalogSyncCoordinator: Site -1 eligible (no first sync date recorded)
📋 POSCatalogSyncCoordinator: No full sync performed yet for site -1, skipping incremental sync
🔵 Tracked pos_local_catalog_sync_skipped, properties: [reason: no_full_sync, sync_type: incremental]
no such column: statusKey in "SELECT * FROM "product" WHERE ("siteID" = ?) AND ("productTypeKey" IN (?, ?)) AND ("downloadable" = ?) AND ("statusKey" NOT IN (?, ?, ?)) ORDER BY "name" COLLATE swiftLocalizedCaseInsensitiveCompare LIMIT 20"
⛔️ POSCatalogSyncCoordinator: Error loading site -1 for full sync date: CancellationError()
✅ Loaded 86 products and 105 variations for siteID -1
💾 Persisting catalog with 86 products and 105 variations
🗑️ Clearing catalog data for site -1
table product has no column named statusKey in "INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
❌ Failed to sync and persist catalog: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
⛔️ POSCatalogSyncCoordinator failed to complete sync for site -1: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
🔵 Tracked pos_local_catalog_sync_failed, properties: [error_type: database_error, error_domain: GRDB.DatabaseError, sync_type: full, error_code: 1, error_description: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`]
Tracks <V>: TracksService sendQueuedEvents completed. Sent 4 events.
🔄 POSCatalogSyncCoordinator: Performing full sync for site -1 (last full sync: 1970-01-01T00:00:00Z UTC)
📋 POSCatalogSyncCoordinator: Site -1 eligible (no first sync date recorded)
📋 POSCatalogSyncCoordinator: Site -1 not found in database, sync needed
🔵 Tracked pos_local_catalog_sync_started, properties: [sync_type: full, connection_type: wifi]
🔄 POSCatalogSyncCoordinator starting full sync for site -1
🔄 Starting full catalog sync for site ID: -1 with regenerateCatalog: false and allowCellular: true
✅ Loaded 86 products and 105 variations for siteID -1
💾 Persisting catalog with 86 products and 105 variations
🗑️ Clearing catalog data for site -1
table product has no column named statusKey in "INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"
❌ Failed to sync and persist catalog: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
⛔️ POSCatalogSyncCoordinator failed to complete sync for site -1: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
🔵 Tracked pos_local_catalog_sync_failed, properties: [sync_type: full, error_type: database_error, error_code: 1, error_domain: GRDB.DatabaseError, error_description: SQLite error 1: table product has no column named statusKey - while executing `INSERT OR REPLACE INTO "product" ("id", "siteID", "name", "productTypeKey", "fullDescription", "shortDescription", "sku", "globalUniqueID", "price", "downloadable", "parentID", "manageStock", "stockQuantity", "stockStatusKey", "statusKey") VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`]
no such column: statusKey in "SELECT * FROM "product" WHERE ("siteID" = ?) AND ("productTypeKey" IN (?, ?)) AND ("downloadable" = ?) AND ("statusKey" NOT IN (?, ?, ?)) ORDER BY "name" COLLATE swiftLocalizedCaseInsensitiveCompare LIMIT 20"
This is the problem – you've got a previous version of the app installed, which didn't have the This is fine, because we've never allowed the GRDB code to run on production builds, so real users won't run in to this problem. I tested it fine though, so thanks for the review! |
Ahhh perfect, thanks for clarifying. |

Description
Many iPads don’t have a cellular connection. It’s a little confusing to show the cellular toggle when it doesn’t apply.
Unfortunately, there’s no good (undeprecated) API for checking this. I’ve used an approach of listing the network interfaces and looking for the cellular one, but it’s undocumented and might not always work.
OTOH, this isn’t a critical feature, so we can keep an eye on it.
Test Steps
Launch the app on a non-cellular iPad
Open POS > Settings > Local catalog
Observe that the cellular toggle isn't shown
Repeat with a cellular iPad, or a phone after commenting out this code in
POSTabVisibilityCheckerRELEASE-NOTES.txtif necessary.