Mac Catalyst

RSS for tag

Start building a native Mac app from your current iPad app using Mac Catalyst.

Mac Catalyst Documentation

Posts under Mac Catalyst tag

111 Posts
Sort by:
Post not yet marked as solved
0 Replies
100 Views
I am trying to load an auxiliary window from an AppKit bundle that loads a NSViewController from a storyboard. This NSViewController displays a MKMapView. I want to avoid supporting multiple windows from my Catalyst app so I do not want to load this window via a SceneDelegate, and that is why I have chosen to go the AppKit bundle route. If I load a similar view controller which contains a single label, then all works as expected. However, if I try to load a view controller with the MKMapView, I get the following error after crashing: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MKMapView nsli_piercingToken]: unrecognized selector sent to instance 0x15410f600' DropBox link to sample app with buttons on a view to select either the "Map View" (crashing) or the "Label View" (working): https://www.dropbox.com/scl/fi/q9daurhzqvil9o2ry6k1t/CatalystMap.zip?rlkey=yjbqfn6uxfrfh1jgsdavagta7&dl=0
Posted
by
Post not yet marked as solved
0 Replies
73 Views
I am using a Mac Catalyst app and saving the content of the app in core data. After uninstalling the app the saved core data file is not getting deleted. Due to this I am having major bugs during launch of the app. My requirement is core data contents should be removed once the app is uninstalled. Anybody with solutions for this?
Posted
by
Post not yet marked as solved
0 Replies
108 Views
I have a Catalyst app that I'm adding a sidebar to via UISplitViewController. I have a toolbar on the window with buttons that I want to be enabled or disabled based on the state of the view controller in the split view's secondary column. But it seems to want to check the primary view controller instead. In the Catalyst tutorial Adding a Toolbar, this exact approach is demonstrated. The RecipeDetailViewController has methods for toggleFavorite and editRecipe, and the toolbar items are set up to reference those selectors in the ToolbarDelegate class. In the screenshots in the tutorial, the buttons are shown as enabled based on RecipeDetailViewController.canPerformAction. But when I download and run the complete project on my computer (macOS 14.4.1), the toolbar items are disabled. And if I add the methods to the RecipeListViewController (which is in the primary column of the UISplitViewController, the toolbar items get enabled. Is there a way to make the system ask the correct split view column for canPerformAction? Or is this a bug?
Posted
by
Post not yet marked as solved
1 Replies
116 Views
I'm working to make my iOS app available via Catalyst, and I'm adding a leading-edge sidebar via UISplitViewController and putting a toggle button in the window toolbar to control it. I'd like that sidebar toggle button to go on the leading side of the toolbar, before the window title. In the Adding a Toolbar Catalyst tutorial, there are screenshots of this behavior: But when I download the finished project and run it on my machine (macOS 14.4), the toolbar buttons are clustered on the trailing edge: How do I achieve the behavior shown in the tutorial's screenshot, where the toggle sidebar button (or, ideally any custom toolbar item I choose) shows up on the leading edge? Even more ideally, is there a way I can make the sidebar toggle button show up in the header section for the sidebar, like it does in Xcode - right next to the stoplight buttons?
Posted
by
Post not yet marked as solved
2 Replies
303 Views
New versions of AppKit/Mac Catalyst apps that use Google's Sign In framework are being rejected by App Store Review for the past two weeks. Reason shared was: The user is taken to the default web browser to sign in or register for an account, which provides a poor user experience. And also citing: Data Collection & Storage guidelines -> https://developer.apple.com/app-store/review/guidelines/#data-collection-and-storage Opening macOS' default web browser has been a native behavior of Mac apps when using SFSafariViewController with ASWebAuthenticationSession, which is required, since iOS 13, for securely/privately logging in users. As far as I could investigate, there hasn't been any updates to the guidelines that would indicate any required changes to developers in regards to how login works for macOS apps. Are there any steps developers need to take to get updates approved while still providing users with Google's Sign in? As reference, there is an on-going discussion on GoogleSignIn repo about this issue affecting multiple developers and apps: https://github.com/google/GoogleSignIn-iOS/issues/388
Posted
by
Post not yet marked as solved
0 Replies
127 Views
extension UIView { func takeSnapshot(rect : CGRect? = CGRect.zero) -> UIImage? { let renderer = UIGraphicsImageRenderer(size: frame.size) var image = renderer.image { _ in drawHierarchy(in: bounds, afterScreenUpdates: true) } if let imageRect = rect, imageRect != CGRect.zero { let screenshotFrame = CGRect(x: imageRect.origin.x * UIScreen.main.scale, y: imageRect.origin.y * UIScreen.main.scale, width: imageRect.size.width * UIScreen.main.scale, height: imageRect.size.height * UIScreen.main.scale) let imageRef = image.cgImage!.cropping(to: screenshotFrame) image = UIImage.init(cgImage: imageRef!, scale: image.scale, orientation: image.imageOrientation) } UIGraphicsEndImageContext() return image } } which was working fine until I updated to macOS 14.4.1 from 14.2.1 and to Xcode 15.3 from 15.0. issue From my Mac Catalyst app, if I try to take screenshot of imageView, the screenshot is brighter. If I try this method it seems working: func takeSnapshotWithoutScale() -> UIImage? { UIGraphicsBeginImageContextWithOptions(self.frame.size, false, 0) if let currentContext = UIGraphicsGetCurrentContext() { self.layer.render(in: currentContext) } let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage }
Posted
by
Post not yet marked as solved
0 Replies
191 Views
I am really stuck. I uploaded my Mac Catalyst app. The binary passes validation beforehand. I submit for review. After being in "waiting for review" for a couple of minutes it is rejected with "invalid binary" and comes back with an email saying "ITMS-90053: This bundle is invalid - The bundle identifier is already in use by a different software package." The only app that is using the same bundle is the IOS version where I added the Mac platform.
Posted
by
Post not yet marked as solved
1 Replies
183 Views
My app uses CGEventTapCreateForPid to monitor keyboard events of a corresponding process. My app has already enabled the Accessibility permission, and AXIsProcessTrustedWithOptions returns true. However, CGEventTapCreateForPid returns null. What could be the problem? Does anyone know? I tested and found that if CGEventTapCreateForPid returns null, I can reset the Accessibility permission using tccutil reset Accessibility myapp_bundleid without restarting my app. But my app can still get the permission through AXIsProcessTrustedWithOptions
Posted
by
Post marked as solved
1 Replies
287 Views
Hey, I am trying to use Family Controls in Mac Catalyst. On the iOS app it works fine. On macOs using Mac Catalyst it builds fine but I get following console output. Failed to get service proxy: Error Domain=NSCocoaErrorDomain Code=4099 "The connection to service named com.apple.FamilyControlsAgent was invalidated: failed at lookup with error 159 - Sandbox restriction." UserInfo={NSDebugDescription=The connection to service named com.apple.FamilyControlsAgent was invalidated: failed at lookup with error 159 - Sandbox restriction.}` When i try to open the FamilyActivityPicker on the macOs app following error is displayed in the GUI. The operation could not be completed. (FamilyControls.ActivityPickerRemoteView Error error 2.) Do I need a familyControls capability for macOs? If yes, I only find it for iOS. Thanks for hints and help :)
Posted
by
Post not yet marked as solved
0 Replies
199 Views
Starting with the macOS version 14.x.x and TextKit1, selecting multiple lines of text triggers a text replacement bug: some of the text on one of the selected lines inadvertently replaces a portion of the selected text. For example, the bug is exhibited when selecting the following lines: Carnaroli, Maratelli, or Vialone Nano are best Vialone Nano cooks quickly – watch it! It also absorbs condiments nicely. Avoid Baldo, Originario, Ribe and Roma To trigger the bug, select the three line paragraph using either the cursor or shift with arrow keys. Notice that a portion of the selected text was replaced. Command-Z to undo will allow you to repeat the undesired behavior. In this case, "e Nano cooks quickly - " is replaced by "Baldo, Originario, Ribe." This does not occur with all strings or selected strings, but in cases where it does occur, it is perfectly reproducible. It does not occur on iOS. Pasteboard contents are irrelevant. After triggering the bug repeatedly, at some point it stops occurring. Why does this bug occur? How can it be fixed? Here is some sample code to reproduce the issue. @end @implementation TestNoteViewController - (void)viewDidLoad { [super viewDidLoad]; [self createTextView]; } - (void)createTextView { NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:self.note.text attributes:nil]; NSTextStorage *textStorage = [NSTextStorage new]; [textStorage appendAttributedString:attrString]; CGRect newTextViewRect = self.view.bounds; // Create the layout manager NSLayoutManager *layoutManager = [NSLayoutManager new]; [textStorage addLayoutManager:layoutManager]; // Create a text container NSTextContainer *container = [[NSTextContainer alloc] initWithSize:CGSizeMake(newTextViewRect.size.width, CGFLOAT_MAX)]; [layoutManager addTextContainer:container]; // Create and place a text view UITextView *textView = [[UITextView alloc] initWithFrame:newTextViewRect textContainer:container]; [self.view addSubview:textView]; textView.translatesAutoresizingMaskIntoConstraints = NO; UILayoutGuide *safeArea = textView.superview.safeAreaLayoutGuide; [textView.leadingAnchor constraintEqualToAnchor:safeArea.leadingAnchor].active = YES; [textView.trailingAnchor constraintEqualToAnchor:safeArea.trailingAnchor].active = YES; [textView.topAnchor constraintEqualToAnchor:safeArea.topAnchor].active = YES; [textView.bottomAnchor constraintEqualToAnchor:textView.superview.bottomAnchor].active = YES; } @end
Posted
by
Post not yet marked as solved
0 Replies
242 Views
Hello, We've an iOS application that can be launched on macOS (with the "designed for iPhone" available with Catalyst). This application request authorization on MPMediaLibrary and play MPMediaItem with an audio player. After accepted, the authorization status is well flagged as .authorized I can browse all MPMediaItem without issue and display them in my app. But, when it comes the time to convert the MPMediaItem file's URL in AVAudioFile with: AVAudioFile(forReading: fileURL) We got 2 warnings in the console: ExtAudioFile.cpp:211 about to throw -54: open audio file AVAEInternal.h:109 [AVAudioFile.mm:135:AVAudioFileImpl: (ExtAudioFileOpenURL((CFURLRef)fileURL, &_extAudioFile)): error -54 We finally get an exception with this error: Error Domain=com.apple.coreaudio.avfaudio Code=-54 "(null)" UserInfo={failed call=ExtAudioFileOpenURL((CFURLRef)fileURL, &_extAudioFile)} This working perfectly on iOS and iPadOS, but with Catalyst we always got this error whatever the audio (from iTunes library) we try to play. Why do we have this permission issue only on macOS ? There is something different to do to get permission on macOS ? thanks !
Posted
by
JHW
Post not yet marked as solved
1 Replies
459 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
Post marked as solved
3 Replies
420 Views
I have an iOS app that uses os_signpost API for instrumentation. When I profile it from Xcode on real iOS device, it works as expected. When I profile its macCatalyst variant (using the identical code) on the same Mac where Xcode is running, the os_signpost Instrument does not show anything, not even the Apple provided signposts that are otherwise visible on the iOS. How do I make it work?
Posted
by
Post not yet marked as solved
0 Replies
254 Views
I am adding Group Activities integration with a MacCatalyst app. I have added the Group Activities entitlement in Xcode. I also checked the entitlements with : codesign --display --entitlements :- I can see the entitlement : <key>com.apple.developer.group-session</key><true/><key> The feature work fine on iPadOS but when I run it on MacOS, the GroupActivitySharingController is not loading properly. I get the following error messages: Cannot run query EXQuery: extension point com.apple.groupactivities platforms: 6 with error: (null) Failed to lookup extension with query EXQuery: extension point com.apple.groupactivities platforms: 6 on <_GroupActivities_UIKit.PeoplePickerController: 0x600005020980> Failed to fetch config for hostViewController <_GroupActivities_UIKit.PeoplePickerController: 0x600005020980> Failed to build remote hostViewController for <_GroupActivities_UIKit.GroupActivitySharingController: 0x1417f1250> Failed to fetch extensionViewController 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: 0x1417f1250> I got a similar error on iPadOS when the entitlement was not added. Now that I have the entitlement, the error appears only on MacOS. Does MacOS/MacCatalyst use a different entitlements file? What could be cuasing this?
Posted
by
Post not yet marked as solved
0 Replies
263 Views
Preparing an iPad App for native MacOS experience using Mac Catalyst (and AppKit when needed) and using SwiftUI. We observe that Horizontal Scroll is tricky using a Mouse! Most users have the habit of click+drag to scroll horizontally. This does not seem to be default behavior on ScrollView. Strange: Same App when compiled on "Mac (Designed for iPad)" [aka Silicon only] scrolls horizontally with click drag. But not if compiled with Mac Catalyst. Question: How can we enable general click-drag for horizontal scrolling using SwiftUI on Mac Catalyst? I wouldn't mind using specific AppKit framework if needed. Thanks in advance.
Posted
by
Post not yet marked as solved
0 Replies
217 Views
Hi, I have an imagePickerController where .allowsEditing is set to true after picking an image. I can move/scale it in iPhone/iPad simulators, but running on my Mac the scaling part of it doesn't work and I don't know how I could go about making the scaling work. Any suggestions much appreciated. Update: I am using a Magic Mouse. No Trackpad or Touchscreeen Mac.
Posted
by
Post not yet marked as solved
0 Replies
303 Views
I experience an issue with SceneKit that is driving me crazy ;( I have severe hangs when I disable Metal API Validation (which is default when you don't run from Xcode). So is there any way to force enable Metal API Validation for AppStore binary? (run MTL_DEBUG_LAYER=1 for Testflight or App Store) Hangs happen on Catalyst but also on iOS if I use lightingEnvironment...
Posted
by
Gil
Post not yet marked as solved
1 Replies
345 Views
We have an iOS app with a web View. To develop and debug, we inspect the web view using Safari Dev Tools (Developer menu). This Works: We are able to inspect the web view when the application is run on physical devices as well as on simulated devices (iPhone and iPad). This Does NOT Work: We are not able to inspect the web view of the same app running, unmodified, on same Mac. Safari’s Developer menu says “No Inspectable Applications” against the Mac. Requesting guidance or leads on ways to inspect and debug the app under these conditions. Many thanks!
Posted
by
Post not yet marked as solved
0 Replies
387 Views
In our mac catalyst app we access AppKit api's by using MacOS bundle(plugin). when using CGDisplayCreateImage(_: CGDirectDisplayID, rect: CGRect) method the plugin crashes. Implementation: @objc func windowMoved(_ notification: NSNotification) { guard let win = self.window else { return } let displayId = CGMainDisplayID() let winRect = win.contentView?.convert(qrRect, from: self) var rect = win.convertToScreen(winRect ?? self.bounds) if let screenFrame = NSScreen.main?.visibleFrame { rect.origin.y = screenFrame.height - rect.maxY rect.origin.y += screenFrame.minY + win.titlebarHeight } guard let image = CGDisplayCreateImage( displayId, rect: rect) else { return } guard let qrString = image.detectQRCode().first else { return } // ... } Crash report in printed in console: -[RPDaemonProxy proxyCoreGraphicsWithMethodType:config:machPort:completionHandler:]: unrecognized selector sent to instance 0x600000500960 ( 0 CoreFoundation 0x00000001931deccc __exceptionPreprocess + 176 1 libobjc.A.dylib 0x0000000192cc6788 objc_exception_throw + 60 2 CoreFoundation 0x000000019329102c -[NSObject(NSObject) __retain_OA] + 0 3 CoreFoundation 0x0000000193148a80 ___forwarding___ + 976 4 CoreFoundation 0x00000001931485f0 _CF_forwarding_prep_0 + 96 5 ScreenCaptureKit 0x0000000227d9d95c SLSHWCaptureDesktopProxying + 692 6 SkyLight 0x0000000198b370a8 SLSHWCaptureDesktop + 488 7 SkyLight 0x0000000198b3b1ac SLSDisplayCreateImage + 252 8 MacPlugin 0x0000000112e0d374 $s9MacPlugin14MZMacQrScannerC11windowMovedyySo14NSNotificationCF + 1500 9 MacPlugin 0x0000000112e0d714 $s9MacPlugin14MZMacQrScannerC11windowMovedyySo14NSNotificationCFTo + 52 10 CoreFoundation 0x000000019315eb1c __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 148 11 CoreFoundation 0x00000001931f2db8 ___CFXRegistrationPost_block_invoke + 88 12 CoreFoundation 0x00000001931f2d00 _CFXRegistrationPost + 440 13 CoreFoundation 0x000000019312d648 _CFXNotificationPost + 768 14 Foundation 0x0000000194249434 -[NSNotificationCenter postNotificationName:object:userInfo:] + 88 15 AppKit 0x00000001969ffbfc -[NSWindow _setFrameCommon:display:fromServer:] + 2056 16 AppKit 0x0000000197475080 -[NSWindow _windowMovedToRect:dueToMoveEvent:] + 184 17 AppKit 0x0000000196ae8630 -[NSWindow _windowMoved:] + 832 18 AppKit 0x0000000196ae82a4 -[NSWindow _internalHandleAppKitDefinedEvent:] + 152 19 AppKit 0x0000000196ae8074 -[NSWindow(NSEventRouting) _reallySendEvent:isDelayedEvent:] + 528 20 AppKit 0x0000000196ae7c90 -[NSWindow(NSEventRouting) sendEvent:] + 284 21 AppKit 0x00000001971adda8 -[NSApplication(NSEventRouting) sendEvent:] + 1800 22 UIKitMacHelper 0x00000001acb964f8 -[NSApplication(UINSApplicationSwizzling) _uinsSwizzledSendEvent:] + 252 23 AppKit 0x0000000196dfb954 -[NSApplication _handleEvent:] + 60 24 AppKit 0x00000001969afd24 -[NSApplication run] + 512 25 AppKit 0x0000000196986fa4 NSApplicationMain + 880 26 AppKit 0x0000000196bd9798 +[NSWindow _savedFrameFromString:] + 0 27 UIKitMacHelper 0x00000001acb82198 UINSApplicationMain + 972 28 UIKitCore 0x00000001c2ea2924 UIApplicationMain + 148 29 MyApp-DEBUG 0x00000001049d2d04 main + 64 30 dyld 0x0000000192d020e0 start + 2360 This is working fine in all previous version but crashing in macOS beta 14.4 and 14.4.1.
Posted
by