Swift is a powerful and intuitive programming language for Apple platforms and beyond.

Posts under Swift tag

200 Posts
Sort by:

Post

Replies

Boosts

Views

Activity

Seeking Advice on Real-Time Heartbeat Data from Apple Watch: Heart Rate vs. HKElectrocardiogram
Hello, I am developing an Apple Watch app in Swift and SwiftUI that needs to receive real-time heartbeat data to visualize the time intervals between heartbeats. The app draws circles on the screen where the size and position of each circle are based on the time interval between consecutive heartbeats. I am currently using the HKQuantityType for .heartRate from HealthKit to get heart rate data and calculate the intervals. However, I am wondering if this is the best approach for my requirement. I came across the HKElectrocardiogram class, and I am not sure if it would be a better fit for obtaining real-time heartbeat intervals. My questions are: Real-Time Heartbeats: Is HKQuantityType for .heartRate the most appropriate way to get real-time heartbeat data for calculating intervals between beats? Can HKElectrocardiogram provide real-time heartbeat intervals, or is it more suited for detailed ECG recordings rather than instantaneous heartbeats? Accuracy and Performance: Which method provides the most accurate and real-time data for heartbeat intervals? Are there any other APIs or services in the Apple Watch ecosystem that I should consider for this purpose? Best Practices: What are the best practices for implementing real-time heartbeat monitoring in an Apple Watch app? Are there any sample projects or documentation that could help me understand the optimal way to achieve this? Here is a brief overview of my current implementation using HKQuantityType for .heartRate: import Foundation import HealthKit class HeartRateMonitor: NSObject, ObservableObject { @Published var heartRate: Double = 0.0 @Published var intervals: [TimeInterval] = [] private var lastHeartRateTimestamp: Date? private var healthStore: HKHealthStore? private let heartRateQuantityType = HKObjectType.quantityType(forIdentifier: .heartRate) private let appStartTime: Date override init() { self.appStartTime = Date() super.init() if HKHealthStore.isHealthDataAvailable() { self.healthStore = HKHealthStore() self.requestAuthorization() } } private func requestAuthorization() { guard let heartRateQuantityType = self.heartRateQuantityType else { return } healthStore?.requestAuthorization(toShare: nil, read: [heartRateQuantityType]) { success, error in if success { self.startMonitoring() } } } func startMonitoring() { guard let heartRateQuantityType = self.heartRateQuantityType else { return } let query = HKAnchoredObjectQuery( type: heartRateQuantityType, predicate: nil, anchor: nil, limit: HKObjectQueryNoLimit) { (query, samples, deletedObjects, newAnchor, error) in guard let samples = samples as? [HKQuantitySample] else { return } self.process(samples: samples) } query.updateHandler = { (query, samples, deletedObjects, newAnchor, error) in guard let samples = samples as? [HKQuantitySample] else { return } self.process(samples: samples) } healthStore?.execute(query) } private func process(samples: [HKQuantitySample]) { for sample in samples { if sample.endDate > appStartTime { let heartRateUnit = HKUnit.count().unitDivided(by: HKUnit.minute()) let heartRate = sample.quantity.doubleValue(for: heartRateUnit) DispatchQueue.main.async { self.heartRate = heartRate if let lastTimestamp = self.lastHeartRateTimestamp { let interval = sample.endDate.timeIntervalSince(lastTimestamp) self.intervals.append(interval) } self.lastHeartRateTimestamp = sample.endDate } } } } } Thank you for your guidance and suggestions!
1
0
226
1w
MKLocalSearch missing Music Venues from response
I have created an MKLocalSearch request as follows: let reqVenue = MKLocalSearch.Request() reqVenue.naturalLanguageQuery = "Music Venue" reqVenue.resultTypes = .pointOfInterest reqVenue.region = .init(center: mockCoord, latitudinalMeters: 150, longitudinalMeters: 150) I have made sure mockCoord is the exact location coordinate of the example music venue I want to get back in the response. I have noticed that all Music Venues I can find on Apple Maps do not come back as results in MKLocalSearch. I would love an explanation as to why and what I can do to make them appear in MKLocalSearch results please! best, nick
1
0
173
4d
Issues with playing 3D videos and adding additional views in VisionOs AvplayerViewController
I want to add additional UI to places outside of AVPlayerViewController, such as adding likes and comments, but I found that once AVPlayerViewController is wrapped in other views, it becomes inline mode and cannot play 3D effects, instead becoming 2D effects. 3D effects can only be played when it is full screen. I want to know if there is any way to meet my needs like this? On the premise of being able to play 3D videos, add additional layouts outside the AVPlayerViewController, or use AVPlayerViewController to achieve the method of both playing 3D videos and adding additional layouts outside the player. If anyone knows, could you give me some guidance? Thank you.
0
1
194
2w
Vision OS - How to detect when digital crown is PRESSED in an immersive space?
Have a bug I'm trying to resolve on an app review through the store. The basic flow is this: User presses a button and enters a fully immersive space While in the the fully immersive space, user presses the digital crown button to exit fully immersive mode and return to shared space (Note: this is not rotating the digital crown to control immersion level) At this point I need an event or onchange (or similar) to know when a user is in immersive mode so I can reset a flag I've been manually setting to track whether or not the user is currently viewing an immersive space. I have an onchange watching the scenePhase changes and printing to console the old/new values however this is never triggered. Seems like it might be an edge case but curious if there's another way to detect whether or not a user is in an immersive scene.
1
0
251
1w
SwiftUI Picker Label
I have set up a "Picker" which works well, EXCEPT that the Label won't appear, I have struggled around this and I am sure the solution is very simple, here's what I have. import SwiftUI import SwiftData struct iPadReadingsEntry: View { @State private var whatOccasion: String = "" let occassions = ["Misc", "Breakfast", "Mid Day Meal", "Evening Meal", "Bed Time"] var body: some View { . . . HStack{ Picker("Before What Occasion :", selection: $whatOccasion ){ ForEach(occassions, id: \.self) { Text($0) } }.pickerStyle(MenuPickerStyle()) .background(Color(red: 255, green: 253, blue: 208)) Spacer() }.padding(.leading, 80) .padding(.bottom, 30) . . .
1
0
215
2w
SwiftUI does not manage two NavigationLinks in a single list row
There seems to be a problem with placing multiple NavigationLinks on a List item row in SwiftUI. If I have two links on the same row and tap one of them, SwiftUI seems to create a path using both links. Irrespective of which of the two is tapped, the view specified by the first (left-hand) appears. Tapping Back reveals the view specified by the second (right-hand) link. Tapping again returns to the list. This problem has been mentioned before in relation to Buttons. The solution offered was to use button styles, and make sure the button areas do not overlap (how could they overlap?). This does not work ChatGPT gave me a clear example, which it claimed would work, but just demonstrates the problem import SwiftUI struct ContentView: View { var body: some View { NavigationView { List { ForEach(0..<10) { index in HStack { NavigationLink(destination: DestinationView1(item: index)) { Text("Navigate to View 1") .padding() .background(Color.blue) .foregroundColor(.white) .cornerRadius(8) } .buttonStyle(PlainButtonStyle()) // Ensure the link only activates on its area Spacer() NavigationLink(destination: DestinationView2(item: index)) { Text("Navigate to View 2") .padding() .background(Color.green) .foregroundColor(.white) .cornerRadius(8) } .buttonStyle(PlainButtonStyle()) // Ensure the link only activates on its area } .padding(.vertical, 5) } } .navigationBarTitle("Navigation Links") } } } struct DestinationView1: View { var item: Int var body: some View { Text("Destination View 1 for item \(item)") .navigationBarTitle("View 1", displayMode: .inline) } } struct DestinationView2: View { var item: Int var body: some View { Text("Destination View 2 for item \(item)") .navigationBarTitle("View 2", displayMode: .inline)
6
0
256
1w
Start live activity with push notification problem
Hey there, i implemented live activity in my app and iam trying to start the live activity from push notification, updates works fine even when the app is in background but starting the activity creating issue mostly on background and kill mode when i check the delivery of live activity on cloudkit console it says stored for device power considerations. anyone having the same issue ?
0
0
199
2w
How to set timeFormat of DatePicker in swift
DatePicker always get timeFormat from device setting, but i need to show time in datePicker based on My app setting not device setting. any solution for this problem I tried to set locale "us_POSIX" locale for 12 hour and "us_GB" for 24 hour format this way is work in gregorian calendar , but in japanese calendar not showing year properly like (picker showing " 6 " instead of " Reiwa 6 " )
4
0
222
1w
Swift: Navigation link not working.
I have obviously missed some subtle bit of code but I can't see what I am missing. I am getting a warning about my NavigationLink. Result of 'NavigationLink<Label, Destination>' initializer is unused Below I have included the code that has caused the warning and the code of the target of the Navigation link. The link does not work, though the button does, as proved by the print statement (see below). Here is the code that caused the warning: import SwiftUI import SwiftData struct Main_Menu_iPad: View { @Environment(\.modelContext) private var context @Query private var readings: [Readings] var body: some View { ZStack { Image("iPad Background 810 X 1060") .resizable() .scaledToFill() .ignoresSafeArea() VStack { HStack{ Image("Diabetes Control Logo 1024X1024") .resizable() .frame(width: 100, height: 100, alignment: .leading) .padding(.leading, 40) Text("Diabetes Control") .font(Font.custom("SnellRoundhand-Black", size: 40)) .background(Color(red: 255, green: 253, blue: 208)) .shadow(color: Color(red: 128, green: 128, blue: 128), radius: 3) .padding(.leading, 150) Spacer() }.padding(.bottom, 35) HStack { Text("What would you like to do : ") .font(Font.custom("SnellRoundhand-Black", size: 30)) .background(Color(red: 128, green: 128, blue: 128)) .shadow(color: Color(red: 126, green: 128, blue: 128), radius: 3) Spacer() }.padding(.leading, 35) .padding(.bottom,35) NavigationStack { HStack { Button { print("I have been pressed") NavigationLink { iPadReadingsEntry() } label: { Text("Enter a BLOOD Glucose reading") } } label: { Text("Enter a Blood Glucose Reading") }.background(Color(red: 255, green: 253, blue: 208)) .foregroundColor(.black) .font(Font.custom("SnellRoundhand", size: 24)) Spacer() }.padding(.leading, 60) .padding(.bottom, 25) Spacer() }.background(.blue) Spacer() } } } } #Preview { Main_Menu_iPad() } And this is the code of the target view: import SwiftUI struct iPadReadingsEntry: View { var body: some View { ZStack { Image("iPad Background 810 X 1060") .resizable() .scaledToFill() .ignoresSafeArea() VStack { HStack{ Image("Diabetes Control Logo 1024X1024") .resizable() .frame(width: 100, height: 100, alignment: .leading) .padding(.leading, 40) Text("Diabetes Control") .font(Font.custom("SnellRoundhand-Black", size: 40)) .background(Color(red: 255, green: 253, blue: 208)) .shadow(color: Color(red: 128, green: 128, blue: 128), radius: 3) .padding(.leading, 150) Spacer() }.padding(.bottom, 35) Spacer() } } } } #Preview { iPadReadingsEntry() } Finally is there a way of switching View without using a NavigationStack/NamigastinLink as it covers my background image?
1
0
218
2w
ios 17.5.1 keyboard glitch on some batches on iphone 14+models(not all)
We are using Material Textfield iOS component (as directed by our client), https://github.com/material-components/material-components-ios/blob/develop/components/TextControls/README.md , after ios 17.5.1 update, for all the material textfield on some iphone 14+ models there is a keyboard appearance issue, the keyboard starts to appear but dismisses immediately on tap of any textfeild,i.e material textfield component, apple's uitextfield works properly, we have an iphone 14+ with ios 17.5.1, for us it works without any issues, our app was uploaded using xcode 14.2, not sure how to fix this issue as we are not able to reproduce it, couple of users have reported this issue, it however works on all other iphone models!!! Any help would be greatly appreciated , i understand this is a third party SDK, but how to simulate this bug, if it is happening only on some devices and on the same device models we have, are working.
1
0
308
3d
Xcode - Verify App button is buggy. Nothing happens when I tap it and app says it's not verified.
I'm new to SwiftUI and Xcode. I built and installed an app to test on my iPhone 15 Pro. On the Apple Development screen for my profile, I tapped Verify App and a dialog pops up with a Cancel and Verify button. It also tells me my internet connection will be used to do the verification. After tapping the Verify button "Apple Development" on the top of the screen quickly flashes one time and the app is still in the Not Verified state. No error message is ever displayed. It looks like I came across a bug in Apples verification process. Please show me a detailed step by step work-around to this bug. I'm using Xcode 15.4 Thanks in advance.
1
0
202
2w
SwiftData: Application crash when trying to save (and fetch) a Model with unique attribute a second time
The context is to create a model instance in SwitfData and return it. This model as a unique attribute (defined by @Attribute(.unique)). The application runs fine the first time but on the second run, it fails with EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP). What the reason behind this crash? Here is my sample application to duplicate the issue. The issue is reproducible on MacOS and iOS: import SwiftUI import SwiftData @available(iOS 17, *) @available(macOS 11, *) @Model public final class MyModel : CustomStringConvertible { @Attribute(.unique) var uuid: UUID init(uuid: UUID) throws { self.uuid = uuid } public var description: String { return self.uuid.uuidString } } @available(iOS 17, *) @available(macOS 11, *) @ModelActor public actor LocalDatabaseService { public static let shared = LocalDatabaseService() let schema = Schema([MyModel.self]) public init() { self.modelContainer = try! ModelContainer(for: self.schema) let context = ModelContext(modelContainer) self.modelExecutor = DefaultSerialModelExecutor(modelContext: context) } public func createMyModel(uuid: UUID) throws -> MyModel { let myModel = try MyModel(uuid: uuid) let modelContext = self.modelContext modelContext.insert(myModel) try modelContext.save() return myModel } } struct ContentView: View { var body: some View { Task { let id = UUID(uuidString: "9C66CA5B-D91C-480F-B02C-2D14EEB49902")! let myModel = try await LocalDatabaseService.shared.createMyModel(uuid: id) print("myModel:\(myModel)") print("DONE") } return VStack { Image(systemName: "globe") .imageScale(.large) .foregroundStyle(.tint) Text("Hello, world!") } .padding() } } #Preview { return ContentView() } Note: a workaround is to returned the fetched model instance return try self.getMyModel(uuid: uuid): func getMyModel(uuid: UUID) throws -> MyModel { let fetchDescriptor = FetchDescriptor<MyModel>(predicate: #Predicate { $0.uuid == uuid }) let serverList = try modelContext.fetch(fetchDescriptor) if !serverList.isEmpty { if let first = serverList.first { return first } } fatalError("Could not find MyModel with uuid \(uuid)") } ... but it does not explain the crash.
1
0
189
2w
Passkey AutoFill won't show the "passkey" prompt above the native keyboard
We implemented passkeys Autofill feature in iOS 16.6. Later verified in iOS 17.0 as well. But when we upgraded to iOS 17.5, the available passkeys autofill prompt is disappeared now. No code changes were done from our side. Also upgraded to iOS 17.5.1 and checked, still doesn’t show the prompt on the keyboard. For autofill we are calling 'performAutoFillAssistedRequests()' API on our ASAuthorizationController after fetching assertion options response from our Relying-Party. Our textFields content type is set to ‘username’. Additional Info: Before making the performAutoFillAssistedRequests() API call, when we click on the ‘Passwords’ icon on keyboard, it only shows the passwords saved on iPhone. But after making the call, we can see available passkeys as well in the list. We are making the fetch assertion options response call on textField delegate after typing more than two characters. I already raised a bug in Feedback Assistant on this - FB13809196. I attached a video and sysdiag file there.
0
0
243
2w
Make my SwiftData code concurrency proof (sendable model, singleton)
Here is my current code: @Model final public class ServerModel { @Attribute(.unique) var serverUrl: URL init(serverUrl: URL) { self.serverUrl = serverUrl } } @ModelActor public actor MyDatabaseService { public static var shared = MyDatabaseService() public init() { self.modelContainer = try! ModelContainer(for: ServerModel.self) let context = ModelContext(modelContainer) self.modelExecutor = DefaultSerialModelExecutor(modelContext: context) } public func listServers() throws -> [ServerModel] { let descriptor = FetchDescriptor<ServerModel>() return try modelContext.fetch(descriptor) } } When try to call try await MyDatabaseService.shared.listServers() There are two problems: ServerModel is not Sendable "Reference to static property 'shared' is not concurrency-safe because it involves shared mutable state; this is an error in Swift 6" For the first one, I can solve it by doing: public struct Server { let serverUrl: URL; } @Model final public class ServerModel { @Attribute(.unique) var serverUrl: URL init(serverUrl: URL) { self.serverUrl = serverUrl } func getSendable() -> Server { return Server(serverUrl: self.serverUrl) } } @ModelActor public actor MyDatabaseService { (...) public func listServers() throws -> [Server] { let descriptor = FetchDescriptor<ServerModel>() return try modelContext.fetch(descriptor).map { $0.getSendable() } } } I am wondering if there is a smarter solution to this first issue. SwiftData already require to define the model with basic/codable types, so if there was a magic way to get a sendable from the model. I try to make my model 'Codable' but 'Codable' is not compatible with 'Sendable'. For my second issue, the singleton issue. I do not really know how to fix it.
1
0
170
2w
HELP ME!!
I'm studying Swift programing with using Apple official document "Develop in Swift Tutorial" https://developer.apple.com/tutorials/develop-in-swift/. When I do that, I faced to some problems which I cannot resolve myself. So, could you help or advise me about it. Problem:I can't implement this program which this below text say. How do I write the code?? (This section is that "Wrap-up: Lists and Text fields, Develop in Swift Tutorials") Here's my current states... import SwiftUI struct ContentView: View { @State private var names: [String] = [] @State private var nameToAdd = "" @State private var pickedName = "" @State private var shouldRemovePickedName = false var body: some View { VStack { VStack(spacing: 8) { Image(systemName: "person.3.sequence.fill") .foregroundStyle(.tint) .symbolRenderingMode(.hierarchical) Text("Pick-a-Pal") } .font(.title) .bold() //3項条件演算子 Text(pickedName.isEmpty ? "" : pickedName) .font(.title2) .bold() .foregroundStyle(.tint) List { ForEach(names, id: \.self) { name in Text(name) } } .clipShape(RoundedRectangle(cornerRadius: 8)) TextField("Add Name", text: $nameToAdd) //単語の自動修正をオフにする .autocorrectionDisabled() .onSubmit { if !nameToAdd.isEmpty { names.append(nameToAdd) nameToAdd = "" } } Divider() Toggle("Remove when picked", isOn: $shouldRemovePickedName) Button { if let randomName = names.randomElement() { pickedName = randomName if shouldRemovePickedName { names.removeAll() { name in return (name == randomName) } } } else { pickedName = "" } } label: { Text("Pick Random Name") .padding(.vertical, 8) .padding(.horizontal, 16) } .buttonStyle(.borderedProminent) .font(.title2) } .padding() } } #Preview { ContentView() }
3
0
273
2w