Construct and manage graphical, event-driven user interfaces for iOS or tvOS apps using UIKit.

UIKit Documentation

Posts under UIKit tag

723 Posts
Sort by:
Post not yet marked as solved
2 Replies
207 Views
Hi, community: I was trying to move from application(_:open:options:) (UIKit) to onOpenURL(perform:) (SwiftUI). Maybe there's something that I'm missing. In UIKit you can say to the system that you won't handle the URL then the app is not opened, but when I use onOpenURL(perform:) it is always opened. Is there any way to achieve the same behavior? Thanks in advance.
Posted
by JesusMG.
Last updated
.
Post not yet marked as solved
1 Replies
154 Views
Hi! I'm trying to port a feature from UIKit to SwiftUI. Pixel-perfection isn't a hard requirement, but it makes it easier to image-diff the two implementations to find places that need adjustment. I noticed that when using symbol images, even if the visual size of the opaque part of the symbol is the same, the frame (bounds? margin? extents? padding? Trying to find a word here for the transparent box around the symbol that's UI-framework-agnostic.) is different, which affects apparent whitespace when the symbol is placed in a view. I created a minimal example in a SwiftUI preview: struct MyCoolView_Previews: PreviewProvider { struct UIImageViewWrapper: UIViewRepresentable { var uiImage: UIImage func makeUIView(context: Context) -> UIImageView { let uiImageView = UIImageView() uiImageView.preferredSymbolConfiguration = UIImage.SymbolConfiguration( font: UIFont.systemFont(ofSize: 64) ) uiImageView.tintColor = UIColor.black return uiImageView } func updateUIView(_ uiView: UIImageView, context: Context) { uiView.image = uiImage } } static var previews: some View { VStack { UIImageViewWrapper(uiImage: UIImage(systemName: "exclamationmark.triangle.fill")!) .background(Color.pink) .fixedSize() Image(systemName: "exclamationmark.triangle.fill") .font(Font.system(size: 64)) .background(Color.pink) ZStack { UIImageViewWrapper(uiImage: UIImage(systemName: "exclamationmark.triangle.fill")!) .background(Color.blue) .fixedSize() Image(systemName: "exclamationmark.triangle.fill") .font(Font.system(size: 64)) .background(Color.pink) .opacity(0.5) } } } } From top to bottom, the screenshot shows the UIKit version, then the SwiftUI version, and finally the two versions overlaid to show where they don't overlap. Note that the blue regions above and below the third item represents where the frame of the UIKit version extends past the frame of the SwiftUI version. Does anyone know why these are different? Is there a property that I can set on the SwiftUI version to make it behave like UIKit, or vice-versa? Thanks! PS: The difference in frame appears to depend on the specific symbol being used. Here it is for "square.and.arrow.up":
Posted
by luisfors.
Last updated
.
Post not yet marked as solved
1 Replies
185 Views
I'm trying to implement full screenshots in an Application. It is working fine when in light mode but when turned to dark mode, the cell background is turning black in preview of full length screenshot for some reason (Attached the screenshot). The black cells are actually white in color. Below is the code snippet that I'm using to create the full screenshot. public func screenshotService(_ screenshotService: UIScreenshotService, generatePDFRepresentationWithCompletion completionHandler: @escaping (Data?, Int, CGRect) -> Void) { guard let topVC = UIApplication.topViewController(), let scrollerView = topVC.view as? OBAListView, scrollerView.contentSize.height != .zero else { completionHandler(nil, 0, .zero) return } let data = NSMutableData() UIGraphicsBeginPDFContextToData(data, .zero, nil) UIGraphicsBeginPDFPageWithInfo(.init(origin: .zero, size: scrollerView.contentSize), nil) if let context = UIGraphicsGetCurrentContext() { let frame = scrollerView.frame let contentOffset = scrollerView.contentOffset let contentInset = scrollerView.contentInset scrollerView.contentOffset = .zero scrollerView.contentInset = .zero scrollerView.frame = .init(origin: .zero, size: scrollerView.contentSize) scrollerView.layer.render(in: context) scrollerView.frame = frame scrollerView.contentOffset = contentOffset scrollerView.contentInset = contentInset } UIGraphicsEndPDFContext() let y = scrollerView.contentSize.height - scrollerView.contentOffset.y - scrollerView.frame.height completionHandler(data as Data, 0, .init(origin: CGPoint(x: 0, y: y), size: topVC.view.frame.size)) } } In above code, the OBAListView is actually a UICollectionView.
Posted Last updated
.
Post not yet marked as solved
2 Replies
170 Views
I am making existing UIKit application to SwiftUI. I have changed most of the screens to SwiftUI. But there are few screens that are still in UiKit, which I am still using in the app. Earlier there was particular functionality added when app goes to background. Now that particular functionality is not working now in migration to SwiftUI. Now what is happening is when app goes to background, viewWillDisappear is getting called and while coming to foreground viewWillAppear is getting called. Earlier in UiKit flow this was not happening. Because of this particular functionality is not working properly. Has anyone faced this type of issue, that view controller is getting destroyed when app goes to background and recreating again when app comes to foreground. I know in SwiftUI lifecycle management, it destroys the view when app goes to background and recreate it when app comes to foreground. But I don't want this for few screens which are still in UiKit.
Posted
by omgore2.
Last updated
.
Post not yet marked as solved
2 Replies
91 Views
When running an iOS app as designed for iPad on an m1 Mac mini the UIImagePickerController.isSourceTypeAvailable(.camera) api returns true leading to a crash (attached) if the camera is selected to upload an image to the app as my much loved Mac mini does not have a camera. For the moment have disabled camera if platform is Mac by adding the qualification: ProcessInfo().isiOSAppOnMac == false but this seems like a bug or does the crash also happen on Macs with cameras? Other image picker options work fine. Crash log
Posted
by ptclarke.
Last updated
.
Post not yet marked as solved
1 Replies
130 Views
I'm introducing some SwiftUI into a primarily UIKit app and have noticed that, as soon as a SwiftUI view is presented / pushed to the nav stack in its hosting view controller, the memory graph shows a number of Swift closure context (unknown layout) entries under an <unknown> header. These entries persist after the SwiftUI view has been popped from the navigation stack. Is this cause for concern? I don't think it represents a memory leak within my app, because the entries are grouped under <unknown> as opposed to my app name. But I'm not entirely sure why they exist (and crucially, why they persist). It's possible to observe this behaviour with a really simple demo app. Just push the following view: struct ViewController02: View { var body: some View { Text("Hello, world!") } } onto a navigation stack: self.navigationController?.pushViewController(UIHostingController(rootView: ViewController02()), animated: true) Any advice / guidance / reassurance would be much appreciated. There can be a considerable number of these entries but I can't see how I could be causing a retain cycle.
Posted Last updated
.
Post not yet marked as solved
0 Replies
66 Views
Hi everyone, We have been noticing since release iOS 17, that our code which renders PDFPage objects to images was randomly failing (while no error is logged) and produced full black images. This problem seems to mainly occurs on old devices (iPad Pro 2017 and 2018). I mention that this portion code has been running for several years in our app without any issue from iOS10 to iOS16. let renderFormat = UIGraphicsImageRendererFormat.default() renderFormat.opaque = true renderFormat.scale = CGFloat(scale) let renderer = UIGraphicsImageRenderer(size: pageRect.size, format: renderFormat) mainImage = renderer.image { context in // Setup drawing context context.cgContext.setShouldAntialias(false) context.cgContext.setShouldSmoothFonts(false) context.cgContext.setAllowsFontSmoothing(false) context.cgContext.setShouldSubpixelPositionFonts(true) context.cgContext.setShouldSubpixelQuantizeFonts(true) // Draw pdf page context.saveGState() UIColor.white.setFill() context.clip(to: rect) context.fill(rect) page.draw(with: .cropBox, to: context) context.restoreGState() } Did anyone encountered a similar issue? Is there any mean to get an error at least in such cases ? Thanks for any help or advice on this issue.
Posted Last updated
.
Post not yet marked as solved
1 Replies
103 Views
Hello everyone, I'm facing a problem that I can't connect the button to the unwind segue. I have made a simple application with three controllers. The unwind segue code is located in Table View Controller. @IBAction func unwindToTableViewController(_ unwindSegue: UIStoryboardSegue) { let sourceViewController = unwindSegue.source } A first segue has been implemented from the Add button on Table View Controller to the View controller. It is a Push type. There is a Save button as Bar Button Item in the View Controller. When I try to drag a connection from Save button to the Exit icon of the View Controller, the context menu does not open indicating the unwind segue. Instead, a context menu appears with different types of segues. At the same time, if I just click the Exit icon, a context menu appears where the unwind method is visible. Just in case, I re-read the documentation again and looked at examples of using the unwind method. There is no mention of this problem anywhere. The only hypothesis left is that this problem is related to the new version of Xcode. The example of application given here was created in XCode 15.3. I have tested the same application on another computer, where the version of Xcode is 13.4.1. There, when I try to drag a connection from the Save button to the Exit icon, a context menu appears with the name of the unwind method. But the problem didn't end there because after the connection is established, the button does not work and the View Controller does not dismiss. I can't understand why this is happens. It worked before. Is that one a bug or the feature? How to fix it? Any ideas would be greatly appreciated!
Posted
by John368.
Last updated
.
Post not yet marked as solved
0 Replies
100 Views
I encountered a runtime error in a project I'm working on, where I tapped a specific sentence to move the cursor position and then tried to insert a newline. When I pressed backspace to cancel the newline, the app crashed due to a runtime error. Believing that the issue might not be with our project, I attempted the same actions in Apple's default Notes app and encountered a crash there as well. This appears to be a UIKit bug... Can it be resolved? I will attach the video I tested this with and the text used for testing below. Test Text: https://shorturl.at/uISV7 Test Video: https://github.com/leeari95/leeari95/assets/75905803/1665fd8e-73ea-4be0-9c02-abc682f8552b
Posted
by AriLee.
Last updated
.
Post not yet marked as solved
0 Replies
120 Views
I developed an iOS application, and during the debugging process in Xcode, I can choose between a real device or my Mac (designed for iPad). When I select my Mac (designed for iPad), a window pops up on my Mac machine. I would like to change the resolution of this pop-up window to obtain a larger window so that I can display more debugging information in real time. Does anyone know how to do this?
Posted
by KHacker.
Last updated
.
Post not yet marked as solved
0 Replies
95 Views
We created the code using Flutter and Android Studio and converted it to XCode. When trying to open the application using XCode through the xc.workspace file that was generated when I was building the application on my Windows OS. When we tried to open the workspace, nothing was there but after we attempted to run the application, The Runner and Pods appeared in the workspace. We have gotten a build input file cannot be found error before. ( Here’s a link to that error https://forums.developer.apple.com/forums/thread/116142 ) so we removed the Main.storyboard and LaunchScreen.storyboard from the bundle and listed them as output files. The error went away. The app successfully built for the first time as of last week however, the screenshot above is what shows in the log. If we move the files back to the bundle then we get the input file error again. Right now we’re trying to figure out a solution for both the the input file error and the error in the log.
Posted
by atanner11.
Last updated
.
Post not yet marked as solved
0 Replies
51 Views
I am presenting a UIActivityViewController controller on button tap with print option in the UIActivityViewController. My app only supports portrait mode. when i tap the print option app crashes with following error. *** Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason: 'Supported orientations has no common orientation with the application, and [UIPrintPanelNavigationController shouldAutorotate] is returning YES' *** First throw call stack:
Posted Last updated
.
Post not yet marked as solved
0 Replies
139 Views
I have my GroupActivitySharingController implemented like this: import SwiftUI import UIKit struct ActivitySharingViewController<ActivityType: GroupActivity>: UIViewControllerRepresentable, Identifiable { let id = UUID() let type: () async throws -> ActivityType func makeUIViewController(context: Context) -> UIViewController { return GroupActivitySharingController(preparationHandler: type) } func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {} } And I present it like this in a sheet of VStack: .sheet(isPresented: $isSheetPresented) { ActivitySharingViewController { SharePlayActivity() } } It appears for a second, but then it immediately disappears The only clue as to why this might happen is hiding as a warning in the terminal, these messages get fired when I open up the controller as it closes immediately Calling -viewDidAppear: directly on a view controller is not supported, and may result in out-of-order callbacks and other inconsistent behavior. Use the -beginAppearanceTransition:animated: and -endAppearanceTransition APIs on UIViewController to manually drive appearance callbacks instead. Make a symbolic breakpoint at UIViewControllerAlertForAppearanceCallbackMisuse to catch this in the debugger. View controller: <_GroupActivities_UIKit.GroupActivitySharingController: 0x103a0feb0> Controller <_GroupActivities_UIKit.PeoplePickerController: 0x282d7a500> had extension's XPC disconnect Controller <_GroupActivities_UIKit.PeoplePickerController: 0x282d7a500> had extension's XPC disconnect VS terminated with error: Error Domain=_UIViewServiceErrorDomain Code=1 "(null)" UserInfo={Terminated=disconnect method} Any help would be greately apprechiated!
Posted
by MyelinDev.
Last updated
.
Post not yet marked as solved
0 Replies
75 Views
We have started seeing a bunch of crashes in my app with the following crash log: Seems to happen inconsistently in the app and we are not able to replicate the crash locally. Does anyone have any idea what the crash might be caused by? Is it a bug in iOS 17? Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000000 Exception Codes: 0x0000000000000001, 0x0000000000000000 VM Region Info: 0 is not in any region. Bytes before following region: 4343709696 REGION TYPE START - END [ VSIZE] PRT/MAX SHRMOD REGION DETAIL UNUSED SPACE AT START ---> __TEXT 102e7c000-102e8c000 [ 64K] r-x/r-x SM=COW ...ea.app/MyApp Termination Reason: SIGNAL 11 Segmentation fault: 11 Terminating Process: exc handler [71670] Triggered by Thread: 0 Thread 0 name: Thread 0 Crashed: 0 libsystem_platform.dylib 0x000000022147ced4 _platform_memmove + 52 1 QuartzCore 0x00000001b9a66864 CA::Render::InterpolatedFunction::encode(CA::Render::Encoder*) const + 248 (render-function.cpp:591) 2 QuartzCore 0x00000001b9a66684 CA::Render::GradientLayer::encode(CA::Render::Encoder*) const + 44 (render-gradient-layer.cpp:658) 3 QuartzCore 0x00000001b995eb6c CA::Render::Layer::encode(CA::Render::Encoder*) const + 284 (render-layer.cpp:5504) 4 QuartzCore 0x00000001b995ea0c CA::Render::encode_set_object(CA::Render::Encoder*, unsigned long, unsigned int, CA::Render::Object*, unsigned int) + 196 (render-coding.cpp:2822) 5 QuartzCore 0x00000001b995be3c invocation function for block in CA::Context::commit_transaction(CA::Transaction*, double, double*) + 244 (CAContextInternal.mm:3657) 6 QuartzCore 0x00000001b995bce4 CA::Layer::commit_if_needed(CA::Transaction*, void (CA::Layer*, unsigned int, unsigned int) block_pointer) + 368 (CALayer.mm:2786) 7 QuartzCore 0x00000001b995bc70 CA::Layer::commit_if_needed(CA::Transaction*, void (CA::Layer*, unsigned int, unsigned int) block_pointer) + 252 (CALayer.mm:2772) 8 QuartzCore 0x00000001b995bca4 CA::Layer::commit_if_needed(CA::Transaction*, void (CA::Layer*, unsigned int, unsigned int) block_pointer) + 304 (CALayer.mm:2779) 9 QuartzCore 0x00000001b995bc70 CA::Layer::commit_if_needed(CA::Transaction*, void (CA::Layer*, unsigned int, unsigned int) block_pointer) + 252 (CALayer.mm:2772) 10 QuartzCore 0x00000001b99a0334 CA::Context::commit_transaction(CA::Transaction*, double, double*) + 11192 (CAContextInternal.mm:3662) 11 QuartzCore 0x00000001b9996c3c CA::Transaction::commit() + 648 (CATransactionInternal.mm:432) 12 QuartzCore 0x00000001b99968e4 CA::Transaction::flush_as_runloop_observer(bool) + 88 (CATransactionInternal.mm:942) 13 UIKitCore 0x00000001ba5f7228 _UIApplicationFlushCATransaction + 52 (UIApplication.m:3158) 14 UIKitCore 0x00000001ba5f6d40 _UIUpdateSequenceRun + 84 (_UIUpdateSequence.mm:119) 15 UIKitCore 0x00000001ba5f6430 schedulerStepScheduledMainSection + 144 (_UIUpdateScheduler.m:1037) 16 UIKitCore 0x00000001ba5f64ec runloopSourceCallback + 92 (_UIUpdateScheduler.m:1186) 17 CoreFoundation 0x00000001b8370acc __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 28 (CFRunLoop.c:1957) 18 CoreFoundation 0x00000001b836fd48 __CFRunLoopDoSource0 + 176 (CFRunLoop.c:2001) 19 CoreFoundation 0x00000001b836e4fc __CFRunLoopDoSources0 + 244 (CFRunLoop.c:2038) 20 CoreFoundation 0x00000001b836d238 __CFRunLoopRun + 828 (CFRunLoop.c:2955) 21 CoreFoundation 0x00000001b836ce18 CFRunLoopRunSpecific + 608 (CFRunLoop.c:3420) 22 GraphicsServices 0x00000001fae315ec GSEventRunModal + 164 (GSEvent.c:2196) 23 UIKitCore 0x00000001ba77b2fc -[UIApplication _run] + 888 (UIApplication.m:3690) 24 UIKitCore 0x00000001ba77a938 UIApplicationMain + 340 (UIApplication.m:5275) 25 UIKitCore 0x00000001ba99e44c UIApplicationMain(_:_:_:_:) + 104 (UIKit.swift:539) 26 MyApp 0x0000000102e8da4c specialized static UIApplicationDelegate.main() + 28 (<compiler-generated>:27) 27 MyApp 0x0000000102e8da4c static AppDelegate.$main() + 28 (AppDelegate.swift:0) 28 MyApp 0x0000000102e8da4c main + 120 29 dyld 0x00000001dab57d44 start + 2104 (dyldMain.cpp:1269)
Posted Last updated
.
Post not yet marked as solved
0 Replies
72 Views
I'm facing an issue where the navigation bar title of a SwiftUI view does not display correctly on the first render. It only appears correctly after switching to another tab and then coming back. Alongside this issue, I'm receiving the following constraint error in the console: `[UIKitCore] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) ( "<NSAutoresizingMaskLayoutConstraint:0x6000021d2a30 h=-&- v=--& Test.minY == 0 (active, names: Test:0x11560c7c0, '|':UILayoutContainerView:0x11560e180 )>", "<NSAutoresizingMaskLayoutConstraint:0x6000021d08c0 h=-&- v=--& Test.height == 96 (active, names: Test:0x11560c7c0 )>", "<NSLayoutConstraint:0x6000021d70c0 V:[Test]-(0)-[UIFocusContainerGuide:0x600003deab20'UINavigationControllerContentFocusContainerGuide'] (active, names: Test:0x11560c7c0 )>", "<NSLayoutConstraint:0x6000021d61c0 UIFocusContainerGuide:0x600003deab20'UINavigationControllerContentFocusContainerGuide'.bottom == UILayoutContainerView:0x11560e180.bottom (active)>", "<NSLayoutConstraint:0x6000021c6bc0 'UIView-Encapsulated-Layout-Height' UILayoutContainerView:0x11560e180.height == 0 (active)>" ) Will attempt to recover by breaking constraint <NSLayoutConstraint:0x6000021d70c0 V:[Test]-(0)-[UIFocusContainerGuide:0x600003deab20'UINavigationControllerContentFocusContainerGuide'] (active, names: Test:0x11560c7c0 )> Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.` SwiftUI View struct ContentView: View { var body: some View { NavigationStack { ScrollView { VStack(spacing: 20) { ForEach(0..<10) { index in VStack { Text("Section \(index)").font(.headline).padding() ForEach(0..<5) { itemIndex in Text("Item \(itemIndex)").padding() } } .frame(maxWidth: .infinity) .background(Color.gray.opacity(0.2)) .cornerRadius(10) .padding(.horizontal) } } }.navigationTitle("Overview").navigationBarTitleDisplayMode(.automatic) } } } ExpoView extends ... extends UIView class ExpoContentView: ExpoView { required init(appContext: AppContext? = nil) { super.init(appContext: appContext) self.backgroundColor = .white // Init the view controller let contentView = ContentView() let hostingController = UIHostingController(rootView: contentView) setupHostingController(hostingController) func setupHostingController(_ hostingController: UIHostingController<some View>) { hostingController.view.translatesAutoresizingMaskIntoConstraints = false hostingController.view.backgroundColor = .clear addSubview(hostingController.view) NSLayoutConstraint.activate([ hostingController.view.topAnchor.constraint(equalTo: self.topAnchor), hostingController.view.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor), hostingController.view.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor), hostingController.view.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor) ]) } } How can I achieve that it is correctly shown at the first render?
Posted
by Flowco.
Last updated
.
Post not yet marked as solved
0 Replies
138 Views
I am new to using iOS Objective-C size classes like Regular, compact, Any. I found that Compact size classes are anything less than ~640 pts and Regular size classes are anything larger than ~640 pts . Is that correct for both iphone and ipad? How can I use size class to make an image full screen on all the iphone and ipad devices and on any orientation? How many images will I need? Any help and insight is greatly appreciated!
Posted
by m2024.
Last updated
.
Post not yet marked as solved
1 Replies
191 Views
Hi there In themeTableView override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if (indexPath.section == 0 && indexPath.row == 0) { HappyView().view.backgroundColor = UIColor.systemBlue } if (indexPath.section == 0 && indexPath.row == 1) { HappyView().view.backgroundColor = UIColor.systemGreen } } But the HappyView background color didn't change after I selected the cell and navigated to the HappView.
Posted
by koroboy.
Last updated
.
Post not yet marked as solved
0 Replies
165 Views
I recently updated to macOS Sonoma 14.4 and now UIDevice.current.batteryLevel is always 0. Code to reproduce: import SwiftUI struct ContentView: View { @State private var monitoringEnabled = UIDevice.current.isBatteryMonitoringEnabled; @State private var batteryLevel = UIDevice.current.batteryLevel; var body: some View { VStack { Text("Battery Monitoring Enabled: " + String(monitoringEnabled)) Text("Battery Level: " + String(batteryLevel)) Button("Toggle Monitoring") { monitoringEnabled = !monitoringEnabled; UIDevice.current.isBatteryMonitoringEnabled = monitoringEnabled; batteryLevel = UIDevice.current.batteryLevel; } } .padding() } } Run the above on a macOS 14.4 target, click "Toggle Monitoring", and you'll see battery level is reported as 0: I also see the following error in my app logs when running on macOS 14.4: Error retrieving battery status: result=-536870207 percent=0 hasExternalConnected=1 isCharging=0 isFullyCharged=0 This code displays the expected battery level when running on an actual iOS device:
Posted
by ckarcher.
Last updated
.
Post not yet marked as solved
3 Replies
215 Views
We are working on a screen that registers fonts using UIFontPickerViewController. Sometimes when I run UIFontPickerViewController I just get a black screen. Or, the font of the UI inside UIFontPickerViewController is broken and displayed as strange special characters. When displayed as a special character, screen scrolling becomes slow and the font is not displayed in the list when scrolling down. When this happens, the Xcode debug window shows “error received: connection invalidated.” This error message is displayed. This happened to me often while developing UIFontPickerViewController . Could you please advise how to resolve this issue? Or, I hope Apple resolves the issue quickly and updates. The development device where the issue occurs is iPhone SE3 iOS 17.4.
Posted Last updated
.