Posts under App & System Services topic

Post

Replies

Boosts

Views

Activity

Why do two content filters with the same name exist
​ I developed a Content Filter using the Network Extension, and when deployed to a batch of hosts (50 +), the installation worked for most of them, but there were six exceptions: five of them were macOS 10.15 and one of them was macOS 12.5. ​ The phenomenon of these 6 hosts is: in the System Settings->Network, two content filters with the same name appear. When one of the content filters with the same name is clicked, shows "Please use 'X Agent Extension' to control this content filter configuration" ('X Agent Extension' is the program I developed, this content filter can be deleted by clicking the minus sign in the lower left corner). Click on another content filter with the same name, shows 'Please use 'null' to control this content filter configuration', (but this content filter can't be removed by clicking the minus sign in the bottom left corner). ​ These systems are clean, use CLI 'systemextensionsctl list', and have only one systemextension in the output (this systemextension is my content filter). Online reference "https://forums.macrumors.com/threads/how-to-delete-custom-dns-profile-from-network-preference.2293322/" this paper, by closing the SIP, and delete file '/Library/Preferences/com.apple.networkextension.plist', then restart the system can remove the abnormal content filters with the same name. After restarting the system and reinstalling my content filter, the two content filters with the same name disappear (only the Content Filter I reinstalled) and the exception scenario cannot be repeated. ​ I would like to know, why do I have two content filters with the same name, how can I avoid this phenomenon, is there a way to remove the wrong content filter without closing SIP.
3
0
451
Jan ’25
DriverKit: Check that driver is enabled on iPadOS
Apple Docs mentions that driver should be approved(enabled) in Settings app. I wonder is there any API available to check that driver is not enabled? To my mind, App with driver should have a following flow: Run App Check that driver is(not) enabled Display message(alert) and ask to enable driver in Settings. Optionally: provide shortcut to exact Settings page Unfortunately, it's not obvious how to check that driver is enabled.
3
0
1.4k
Jan ’25
How to get the real app language code + variation?
Hello, I have the app localised to many languages and its variants, like English from Australia or Dutch from Belgium. My phone language is en_UK and the region is configured to ES. I cannot find a way to get the regional language code (ex: en_au, nl_be), it always gets simplified to the language (ex: en, nl), or adds my device region (ex: en-ES, nl-ES). Here I attach some examples while I have the app on en_au Locale.preferredLanguages ▿ 3 elements - 0 : "en-ES" - 1 : "ca-ES" - 2 : "es-ES" Bundle.main.preferredLocalizations ▿ 1 element - 0 : "en" NSLocale.current.languageCode ▿ Optional<String> - some : "en" Locale.current ▿ en_001@rg=eszzzz (fixed en_001@rg=eszzzz) - identifier : "en_001@rg=eszzzz" - locale : "fixed en_001@rg=eszzzz" Locale.autoupdatingCurrent.languageCode ▿ Optional<String> - some : "en" Locale.current.languageCode ▿ Optional<String> - some : "en" Locale.preferredLanguages[0] "en-ES"
2
0
1k
Jan ’25
Identify Apple Watch with non-Apple BLE
We would like to be able to distinguish between iPhones and Apple Watches when scanning for devices using a Laird BLE module. We know that we can identify an Apple device from the manufacturer data returned in the scan report. 0x004C is the registered identifier for Apple. In the remaining data returned is it possible identify the device type? We note that empirically, 4C001005 seems to correlate to an Apple Watch. How reliable is this? It is useful for us, because it means we do not need to connect to this device to see if it is advertising a service that we own. Connecting over BLE is of course an expensive operation. Here is a simple snippet of a Swift App doing a similar thing, to illustrate the question: func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { guard let manufData: Data = advertisementData[CBAdvertisementDataManufacturerDataKey] as? Data else { return } let hexEncodedManufData: String = manufData.map { String(format: "%02hhx", $0) }.joined() print("Manufacturer Data: \(hexEncodedManufData): ") // Manufacturer Data: 4c001007351ff9f9036238: Apple device // Manufacturer Data: 4c001006331ec0640f88: Apple device // Manufacturer Data: 4c0010052b18804eb1: Apple watch? // Manufacturer Data: 4c0010052b18804eb1: Apple watch? }
1
0
358
Jan ’25
Ping DNS to check internet connection
I want to check if the device has a internet connection or not by pinging DNS "8.8.8.8". connection.send(content: content, completion: .contentProcessed {[weak self] error in send function is not returning any error even if the host is unreachable. I am checking if I can receive the data or not but connection.receiveMessage function never returns. This is the complete code which I am following: private let networkMonitor = NWPathMonitor() private var connection: NWConnection @MainActor var isConnectedToInternet = false init(host: NWEndpoint.Host = "8.8.8.8", port: NWEndpoint.Port = 53) { let endpoint = NWEndpoint.hostPort(host: host, port: port) connection = NWConnection(to: endpoint, using: .udp) startMonitoring() } private func startMonitoring() { networkMonitor.pathUpdateHandler = { [weak self] path in guard let self else { return } ping(callback: { isSuccess in print("***** ping status:", isSuccess) Task { @MainActor in self.isConnectedToInternet = isSuccess } }) } let queue = DispatchQueue(label: QueueLabel.networkMonitor) networkMonitor.start(queue: queue) } func ping( host: NWEndpoint.Host = "8.8.8.8", port: NWEndpoint.Port = 53, callback: @escaping ((Bool) -> Void) ) { var didSendState = false connection.stateUpdateHandler = {[weak self] state in guard let self = self else { return } guard !didSendState else { if state != .cancelled { cancel(connection) } return } switch state { case .ready: // State is ready now send data let content = "Ping".data(using: .utf8) let startTime = Date() connection.send(content: content, completion: .contentProcessed {[weak self] error in guard let self = self else { return } if error != nil { callback(false) didSendState = true cancel(connection) } else { print("Ping sent, waiting for response...") connection.receiveMessage { [weak self] content, _, _, receiveError in guard let self = self else { return } if let receiveError { print("Error receiving ping: \(receiveError.localizedDescription)") callback(false) } else if let content = content, String(data: content, encoding: .utf8) == "Ping" { let roundTripTime = Date().timeIntervalSince(startTime) print("Ping received! Round-trip time: \(roundTripTime) seconds") callback(true) } else { print("Invalid response received") callback(true) } didSendState = true cancel(connection) } } }) case .failed( _), .waiting( _), .cancelled: didSendState = true callback(false) case .setup, .preparing: // No callback because the ping has not yet succeeded or failed break @unknown default: didSendState = true callback(false) // We don't know what this unknown default means, so cancel pings to be safe cancel(connection) } } connection.start(queue: .main) } func cancel(_ connection: NWConnection) { connection.cancel() } } Can anyone please help what I am doing wrong.
2
0
316
Jan ’25
New apple pay in PC chrome dosn't work with iOS 18
I've encountered an issue with Apple Pay in PC Chrome with iOS 18. Below is the scenario and code for reference: Issue Scenario: A button is clicked to initiate the Apple Pay process. A QR code window pops up, which I scan with my phone. As soon as the session is established, the window closes immediately, not allowing the user to select a payment card. No errors appear in the console. Here's the code snippet for handling the Apple Pay button click: const onApplePayButtonClicked = () => { if (!window.ApplePaySession) { return; } log('Apple Pay button clicked'); const request = { countryCode: 'UA', currencyCode: 'UAH', merchantCapabilities: ['supports3DS'], supportedNetworks: ['visa', 'masterCard'], total: { label: 'PoC Merchant Apple Pay', type: 'final', amount: amount.toString(), }, }; const session = new window.ApplePaySession(3, request); session.onvalidatemerchant = async (event) => { try { log('Creating ApplePaySession'); const response = await fetchAppleSessionAPI(event.validationURL, applePayMercantId, { deviceId, refreshToken }); log('validateMerchantResponse', response); session.completeMerchantValidation(response.applePaySessionData); } catch (error) { log('validateMerchantError', error); } }; session.onshippingmethodselected = () => { const newTotal = { label: 'PoC Merchant Apple Pay', type: 'final', amount: amount.toString(), }; session.completeShippingMethodSelection(window.ApplePaySession.STATUS_SUCCESS, {}, newTotal); }; session.onpaymentauthorized = async (event) => { log('onpaymentauthorized', event); const result = { status: window.ApplePaySession.STATUS_SUCCESS, }; session.completePayment(result); log('TOKEN', event.payment.token); }; session.begin(); }; Troubleshooting Steps Taken: Verified that window.ApplePaySession is available. Checked for any console errors—none found. Confirmed that the QR code scanning and session initiation work as expected. Expected Behavior: After scanning the QR code and establishing the session, the user should be able to select a payment card and proceed with the payment flow. Current Behavior: The window closes immediately after the session is established, preventing card selection. Has anyone else faced this issue or has insights on how to resolve it? Thanks in advance!
2
0
685
Jan ’25
NESMVPNSession disconnected
Hi, I have a problem with my OpenVPN connection on my app with iOS 14.4. I perform my VPN configuration from an oven file, with a NETunnelProviderManager protocol, but when I perform the startVPNTunnel, it starts connecting and immediately disconnects. The error I see in the logs is the following: NESMVPNSession[Primary Tunnel:OpenVPN Client: -----(null)]: status changed to disconnected, last stop reason Plugin was disabled This happens to me when running my app on a physical iPad. Regards import NetworkExtension import OpenVPNAdapter class VPNConnection {          var connectionStatus = "Disconnected"              var myProviderManager: NETunnelProviderManager?          func manageConnectionChanges( manager:NETunnelProviderManager ) - String {         NSLog("Waiting for changes");         var status = "Disconnected"                  NotificationCenter.default.addObserver(forName: NSNotification.Name.NEVPNStatusDidChange, object: manager.connection, queue: OperationQueue.main, using: { notification in                          let baseText = "VPN Status is "                          switch manager.connection.status {             case .connected:                 status = "Connected"             case .connecting:                 status = "Connecting"             case .disconnected:                 status = "Disconnected"             case .disconnecting:                 status = "Disconnecting"             case .invalid:                 status = "Invalid"             case .reasserting:                 status = "Reasserting"             default:                 status = "Connected"             }                          self.connectionStatus = status                          NSLog(baseText+status)                      });         return status     }          func createProtocolConfiguration() - NETunnelProviderProtocol {         guard             let configurationFileURL = Bundle.main.url(forResource: "app-vpn", withExtension: "ovpn"),             let configurationFileContent = try? Data(contentsOf: configurationFileURL)         else {             fatalError()         }                  let tunnelProtocol = NETunnelProviderProtocol()         tunnelProtocol.serverAddress = ""         tunnelProtocol.providerBundleIdentifier = "com.app.ios"                  tunnelProtocol.providerConfiguration = ["ovpn": String(data: configurationFileContent, encoding: .utf8)! as Any]         tunnelProtocol.disconnectOnSleep = false                  return tunnelProtocol     }          func startConnection(completion:@escaping () - Void){         self.myProviderManager?.loadFromPreferences(completionHandler: { (error) in             guard error == nil else {                 // Handle an occurred error                 return             }                          do {                 try self.myProviderManager?.connection.startVPNTunnel()                 print("Tunnel started")             } catch {                 fatalError()             }         })     }          func loadProviderManager(completion:@escaping () - Void) {                           NETunnelProviderManager.loadAllFromPreferences { (managers, error) in             guard error == nil else {                 fatalError()                 return             }                          self.myProviderManager = managers?.first ?? NETunnelProviderManager()             self.manageConnectionChanges(manager: self.myProviderManager!)                          self.myProviderManager?.loadFromPreferences(completionHandler: { (error) in                 guard error == nil else {                     fatalError()                     return                 }                                  let tunnelProtocol = self.createProtocolConfiguration()                                  self.myProviderManager?.protocolConfiguration = tunnelProtocol                 self.myProviderManager?.localizedDescription = "OpenVPN Client Ubic"                                  self.myProviderManager?.isEnabled = true                                  self.myProviderManager?.isOnDemandEnabled = false                                  self.myProviderManager?.saveToPreferences(completionHandler: { (error) in                     if error != nil  {                         // Handle an occurred error                         fatalError()                     }                     self.startConnection {                         print("VPN loaded")                     }                 })             })         }     } }
14
0
3.2k
Jan ’25
Granularity/Accuracy of delivered locations with live updates
First of all : Thanks for the great presentation (wwdc2023-10180), Siraj ! This new, simple API looks like what we've been looking for for easy manageable background location updates with 'automatic battery drain minimization' :-) There were two questions that came to my mind. As far as I understood, the CLLocationUpdate.LiveConfiguration is used to help the location services to improve the location fixes. Are there other options planned to specify the granularity of delivered locations e.g., how accurate the locations need to be (as the desiredAccuracy and distanceFilter settings for the olden CLLocationManager)? Does the Implementation switch between significant location changes and regular, more expensive ways (like GPS hardware) or just deliver the most feasible accuracy available at the time of notification? I'm just curious - if I get the most feasible granularity, everything is fine for me anyway :-) Thanks again, Michael
2
0
1.1k
Jan ’25
Puchases / subscriptions issues
Hi, I've some issues on my application about purchases. My app is available for iOS and tvOS. Some part of my code is the same on both target (my purchase code is one of them). The issue is: Some users can't do a purchase on Apple TV (but not all and I can't reproduce) Some users purchased on a device and are not considered as pro on the other device (logged with same apple account). Again it's not all. Here is my store code
1
0
318
Jan ’25
Apple Watch CMMotionManager acceleration direction
I'm working with the Apple Watch's acceleration data and have referred to the document Identify the coordinate axes of the device. According to this document, the X-axis points to the right side of the watch, the Y-axis points towards the top side, and the Z-axis points towards the user. However, when I place the watch on a flat surface and move it horizontally to the right, I observe that the X-axis acceleration is negative. Similarly, when I move the watch vertically upwards, the Y-axis acceleration also shows a negative value. Is this expected behavior, or am I misunderstanding something about the coordinate system or acceleration readings?
5
0
543
Jan ’25
Serial port speed limited to 3 Mbps
Six months ago I wrote FB14122473, detailing how the built-in CDC (or FTDI) VCP serial port driver is limited to 3 Mbps or less. Thing is, there are some FTDI devices that can do 12 Mbps (maybe more), and I have devices I need to communicate with at 4 Mbps. I had to use the FTDI SDK to be able to communicate with these. I was hoping this post might help draw attention to that bug report.
1
0
489
Jan ’25
Screen-time in Device Activity Report Extension vs In Phone Settings
Am showing daily screen-time of a user in my app in Device Activity Report Extension. The only way to get that is to sum up all the activityDuration of apps/categories/domains. But it differs a lot from phone's settings screen-time, why? I have debugged in details and counted manually the time spent on each app and it turned out that the calculation is appearing correctly in my app but Phone settings showing quite less time on top (Day).
0
0
398
Jan ’25
fileImporter modifier: Problem to get a positive App Store Connect Feedback
I have written an App with a fileIpmorter modifier. I used TestFlight to pass it to friend for a test. The App works fine until my friend uses the fileImporter function: He can select the file to import (simple csv file), the fileImporter closes without having read out the csv file! I was able to analyze that the do-catch-block within the fileImporter modifier throws an error at the mac of my friend. The App behaves totally different to my Mac: On my Mac it works perfectly: the csv file is read out and the data can be used within the APP. Why does it behave like this? Why does this happen to the mac of my friend but not on mine? More strange: The Apple team is not able to even use the csv-file I passed them in the App Store Connect process: They are not able to select the file in the downloads folder. All three used MAC´s with three different behaviors? - How comes?
1
0
305
Jan ’25
iPad Pro M4 Freezing and Restarting Daily Without Heavy Usage
I purchased an iPad Pro M4 in early December, and since day one, I’ve been experiencing a recurring issue. Almost every day, at random times, the device freezes for 1–5 minutes and then restarts itself. The tablet is not under heavy load when this happens — I mainly use it for light tasks such as watching videos in a player or Safari browser, web surfing, and reading books. The issue has even occurred while the iPad was idle and locked; it froze, displayed the Apple logo, and rebooted. I brought the device back to the store where I purchased it, and they sent it for a diagnostic check. However, the experts concluded that the device is fully functional, and no defects were found. After one of these crashes, I noticed that my Apple Pencil started lagging (see video file IMG_5688.MOV). However, after another reboot, the issue with the Apple Pencil resolved itself. I’ve documented the issue with several video recordings showing the freezing and rebooting behavior, as well as error logs generated after such incidents. Device Details: Model: iPad Pro M4 Usage: Light tasks only (video streaming, web browsing, reading) Environment: No overheating, no resource-heavy applications running What could be causing this issue, and how can I resolve it? Any help would be greatly appreciated. Thank you! P.S. I’ve uploaded all the device logs and videos demonstrating the issue to Google Drive. https://drive.google.com/drive/folders/1_R0i_iazADWo5EgStrPdgmf1XjgPP_RC?usp=sharing
0
0
541
Jan ’25
MapkitJS Snapshot
I am having issues loading in a mapkit snapshot. I get an error saying that https://domain.com and they're expecting domain.com. I have no idea what could be going wrong here. I set the domains properly in the mapkit tokens. When I click on the link it opens a new tab and loads what the data properly, but somehow in the application on production this error comes up.
0
0
356
Jan ’25
New CoreLocation APIs
Hi All, I am currently working on an app that has some navigation functionality, and since my minimum iOS is 18 wanted to incorporate the new APIs that yield a AsyncStream of locations. I have watched both WWDC sessions, the one where the new API is introduced to retrieve the location points, and also the other video where the new authorization process for location is simplified as well. I have an app currently working in its current state, but am noticing some weird quirks when using the CLBackgroundActivitySession to get the elevated background permission. What I am doing here is to create this stream and the background object is below: return AsyncThrowingStream { continuation in let task = Task { do { for try await update in CLLocationUpdate.liveUpdates(updateType) { if shouldStopUpdate { continuation.finish() break } continuation.yield(update) } } catch { continuation.finish(throwing: error) } } state = .started(locationTask: task, background: CLBackgroundActivitySession()) } When I have an active navigation session going and am strongly holding this object and the user force quits the app (or I stop the target through Xcode) the navigation activity indicator in the status bar (or dynamic island) remains present. Even if I relaunch the app, start navigation again, and then call the invalidate method on the CLBackgroundActivitySession I then am seeing that navigation indicator even if I delete my app, and often need to do a full restart to get out of this state. Is there a step I am missing, or do I not understand the way the new API works to run in the background?
1
0
651
Jan ’25
Get Transaction History
https://developer.apple.com/documentation/appstoreserverapi/get-v2-history-_transactionid I would like to inquire about the detailed triggers for updating receipts in this API specification. Recently, I was using this API with sort=DESCENDING&revoked=false to retrieve the expiration date of the most recent receipt and determine the subscription status. However, for some reason, an old receipt with an earlier expiration date appeared as the first receipt, and I would like to know the reason for this. Can you provide information on what specific events or actions trigger the updating of receipts in this API? Also, regarding https://developer.apple.com/documentation/appstoreserverapi/status, will statuses 3 and 4 not be returned in the response unless the billing grace period is enabled in the App Store?
0
0
315
Jan ’25