When using external NVMe devices on iOS / iPadOS I cannot tell how to access the disk SMART data.
On macOS I can use NVMeSMARTLibExternal.h to access this information but the same system does not seem to work on iPadOS (even with Thunderbolt NVMe devices).
When using M series iPads with professional Thunderbolt storage this woudlbe very useful.
Hardware
RSS for tagDelve into the physical components of Apple devices, including processors, memory, storage, and their interaction with the software.
Post
Replies
Boosts
Views
Activity
I have created a Flutter application to scan Mifare DESFire cards on Android and iOS. I have tried using both flutter_nfc_kit and nfc_manager which both use CoreNFC.
On both platforms, I can get the basic information on the card. However, only on Android, I can read data from the card by using Mifare commands. On iOS I am getting a 0B response.
I have the following configuration inside my Runner.entitlements:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
<string>TAG</string>
</array>
</dict>
</plist>
I have added the following keys inside my Info.plist file:
<dict>
<key>NFCReaderUsageDescription</key>
<string>Access NFC</string>
<key>com.apple.developer.nfc.readersession.iso7816.select-identifiers</key>
<array>
<string>D2760000850100</string>
</array>
...
</dict>
However, I have noticed that I will get a different response if I add the D2760000850100 key in the Info.plist file. When I have this key added I get an error when executing a Mifare command: PlatformException(500, Communication error, Tag response error, null)
So for that reason, I decided to remove the key altogether. Now everytime, I execute a Mifare command I end up with the response of 0B. Which does not tell me anything because it is not an official response.
The Mifare command I am using is the select application command: 5A123456 where 123456 is the application ID. As mentioned before this works perfectly on Android.
The only response I can get from the Mifare DESFire card is with an ISO7816 command: 00A4040006D2760000850100. Which is the select application command according to the ISO7816 standard. However, after executing this command I need to authenticate, which requires a complex algorithm.
Is it necessary on iOS to first execute ISO7816 commands, before you can execute Mifare commands?
I set up my app very similar to the sample app, putting the Service UUID in the plist and descriptor, I am able to see the picker but when my device is advertising, it doesn't seem to be responding to it. I see it stuck on "Discovering" and then it times out saying "Make sure the accessory is nearby and ready to connect". I also noticed that when I remove the ASK code but leave in the ASK fields in the info plist, my CBManagerAuthroization state is always "not determined". Can anyone help me troubleshoot these 2 issues? Perhaps they are related?
Hello,
I am experiencing an issue with background serial communication on my iPad Pro when using a Type-C connection to an external device. Specifically, when the app is inactive, in low power mode, or when the screen is locked (i.e., not active), the communication with the external device is interrupted.
However, this problem does not occur when using a Lightning cable on my iPad Mini. In that setup, the background serial communication works seamlessly under the same conditions.
Has anyone encountered a similar issue or have any insights into why the behavior differs between Type-C and Lightning connections? Any suggestions or workarounds would be greatly appreciated.
Thank you!
I was trying to use my MacBook Air M1's left USB port to connect to my USB hub setup (including a DisplayLink hub and regular powered USB hub), but they would only work on the right USB port (unless I have it plugged in from a cold boot). I also found out that I can plug my charger into the port and it would work correctly, and connect my iPhone to the port and have it charge out to the phone correctly (but cannot transfer data between devices). These issues seemed to have started happening when I did a clean restore of macOS Sequoia (so there is a chance that I might try reinstalling Sonoma instead to see if that fixes the issue). Has anyone else encountered this sort of issue?
Since moving up to IOS18 lat week I am getting an indication that there was a significant drop in IMU data being sent. Using the search capability, I can find very little information in the Developer Documentation that will tell me what the cause is and how to remedy it. Is there some documentation repository like Tech Notes that will tell me what I need to know to get going again? What additional sources of documentation are available for developers? The Search engine used for Developer documentation just does not cut it because it delivered a lot of useless entries that have no obvious relevance to my search terms.
"2024-06-20 19:27:00.669334-0500 RoomPlanExampleApp[902:299709] [Technique] ARWorldTrackingTechnique <0x104bf6d80>: SLAM error callback: Error Domain=Slam Error Code=7 "Non fatal error occurred due to significant drop in a IMU data" UserInfo={NSDescription=Non fatal error occurred due to significant drop in a IMU data, NSLocalizedFailureReason=SlamEngineNodeGroup Failure: IMU issue: gyro data stream verification failed [Significant data drop]. Failed on timestamp: 53902.785827, Last known timestamp: 53901.416828, Delta: 1.368999, System timestamp: 53902.786251, Delta between system and frame: 0.000423. }"
In iOS 18 I accidentally turn on switch controls and my iPhone screen disabled so I can't log in in my iPhone and can’t do anything so how I can turn of switch control
So I updated my phone to ios18 beta and ever since then my phone will always crash when I enter screen time but any other application nothing will happen, my phone has gotten so much slower and heats up faster. Lags so much! I dont know what else to do. I have 107gb and my max is 128gb so I don’t see that as the issue. Especially since I can’t enter into my screen time. I waited it out for almost two or one week. it hasn’t changed. restarted my phone and everything. please help asap!!!
We want to use AccessorySetupKit to pair our BLE accessories. However, currently all our products announce the same BLE service UUID. The manufacturer data is different for every product.
I try to pair our products with ASK and create the ASDiscoveryDescriptor with the expected manufacturer data:
let descriptorA = ASDiscoveryDescriptor()
descriptorA.bluetoothServiceUUID = CBUUID("CE1EB45C-1BD2-45BE-8163-ACC88BE94CB2") // same
descriptorA.bluetoothManufacturerDataBlob = Data([0xd2, 0x0a, 0x00, /* A */ 0x2a, 0x00, 0x00, 0x00]) // different
descriptorA.bluetoothManufacturerDataMask = Data([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff])
let descriptorB = ASDiscoveryDescriptor()
descriptorB.bluetoothServiceUUID = CBUUID("CE1EB45C-1BD2-45BE-8163-ACC88BE94CB2") // same
descriptorB.bluetoothManufacturerDataBlob = Data([0xd2, 0x0a, 0x00, /* B */ 0x2b, 0x00, 0x00, 0x00]) // different
descriptorB.bluetoothManufacturerDataMask = Data([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff])
However, it seems random which device is found, as if the service UUID is the primary key to handle things in ASK.
My questions are:
Is it possible to use only manufacturer data to distinguish between different products with the same service UUID?
How do I use bluetoothManufacturerDataMask properly? I assume that internally some filtering like this is done: DataBlob & DataMask == ReceivedManufacturerData & DataMask. Because of that I have set all bits of the mask to 1. Should this e done differently?
Since i updated to iOS 18, im losing battery when not using it.
Will AI be available for iPhone 14?
In my RequestHandler.swift, this is extension of MatterAddDeviceExtensionRequestHandler
After commission device is completion.
I call getBaseDevice method in the MTRDeviceController.
func controller(_ controller: MTRDeviceController, commissioningComplete error: Error?, nodeID: NSNumber?) {
if error != nil {
os_log(.default, "TrinhVM: commissioningComplete error -> \(error!.localizedDescription)")
} else {
os_log(.default, "TrinhVM: commissioningComplete ->\(nodeID)")
chipController.getBaseDevice(1, queue: DispatchQueue.main, completionHandler: { chipDevice, error in
if chipDevice == nil {
os_log(.debug, "Status: Failed to establish a connection with the device")
} else {
os_log(.error, "Status: Success to establish a connection with the device: \(chipDevice?.description ?? "")")
let onOff = MTRBaseClusterOnOff(device: chipDevice, endpointID: 1, queue: DispatchQueue.main)
// Send the "on" command to the device
onOff?.on { error in
let resultString: String
if let error = error {
resultString = String(format: "An error occurred: 0x%02lx", error._code)
} else {
resultString = "On command success"
}
debugPrint(resultString)
}
}
})
}
}
It's working well, the status is always "Status: Success to establish a connection with the device".
And I can control the lightbulb here with chipDevice (chipDevice is MTRBaseDevice).
But, after the commission device has finished in the extension, get back the application scheme.
I call method:
chipController.getBaseDevice(1, queue: DispatchQueue.main, completionHandler: { chipDevice, error in
if chipDevice == nil {
os_log(.debug, "Status: Failed to establish a connection with the device")
} else {
os_log(.error, "Status: Success to establish a connection with the device: \(chipDevice?.description ?? "")")
let onOff = MTRBaseClusterOnOff(device: chipDevice, endpointID: 1, queue: DispatchQueue.main)
// Send the "on" command to the device
onOff?.on { error in
let resultString: String
if let error = error {
resultString = String(format: "An error occurred: 0x%02lx", error._code)
} else {
resultString = "On command success"
}
debugPrint(resultString)
}
}
})
It's always show timeout error .
Mdns: Resolve failure (src/platform/Darwin/DnssdImpl.cpp:476: CHIP Error 0x00000074: The operation has been cancelled)
OperationalSessionSetup[1:0000000000000015]: operational discovery failed: src/lib/address_resolve/AddressResolve_DefaultImpl.cpp:119: CHIP Error 0x00000032: Timeout
Creating NSError from src/lib/address_resolve/AddressResolve_DefaultImpl.cpp:119: CHIP Error 0x00000032: Timeout (context: (null))
"Failed to establish a connection with the device Optional(Error Domain=MTRErrorDomain Code=9 \"Transaction timed out.\" UserInfo={NSLocalizedDescription=Transaction timed out.})"
I don't know why the same method, works in RequestHandler.swift but not in AppScheme.
Any support for this issue.
Thank and best regards.
I'm working on an app that uses HomeKit-enabled accessories such as wall plugs to control a photographic enlarger in a darkroom. This requires precise timing when toggling the power state of the plug. For example, the timer in my app might be set to 5 seconds, so I turn on the plug using writeValue() on the plugs power state characteristic, wait 5 seconds, then turn it off again.
I want to be able to measure if the plug actually responded to the command and if there was any delay in the plug actually turning on/off so I can display a warning to the user if network latency resulted in the plug being on for longer than the set time.
Does writeValue() (in my case, the async/await version) only return when the plug has been turned on, or does it return as soon as the command has been sent, regardless of if it has been received/acted on? Is there a way I can (a) quickly verify that the plug has been turned on/off, and (b) measure how long it took for the plug to act on the request, that is, the time elapsed between when writeValue() is called and when the plug actually updates to the corresponding value?
Tried to implement the code snippets based on : https://developer.apple.com/documentation/authenticationservices/public-private_key_authentication/supporting_security_key_authentication_using_physical_keys
security key. The Sign In UI did popup but after which is either it timed-out or i cancelled the operation. The performRequest function doesn't seems to trigger my external security key.
Not sure if FBSSystemApp / coreauthd are part of the logs i should be looking out to see where the issue(s) is/are?
We have observed a significant increase in download time from the sensors to the mobile device after recent OS updates. We are connected to the external sensors via the BLE interface using the following connection
parameters(15,15,0,6000)
https://mbientlab.com/tutorials/MetaMotionRL.html:
example 1.For 1 Meter with duration of 28 Seconds the IOS 17.1 taking 44 secs where as IOS 17.5.1 taking 82 secs .
2..For 1 Meter with duration of 45 Seconds the IOS 17.1 taking 74 secs where as IOS 17.5.1 taking 143 secs .
Even with the same connection parameters, download times were considerably lower in iOS 15 and below devices.
We are currently using the connection parameters 15, 15, 0, 6000.
I have learned from some documents that the minimum connection interval was changed to 20, but when I tried it, the download time increased further. I am seeking assistance on how to achieve the same download times as the older versions.
https://mbientlab.com/community/discussion/comment/11852#Comment_11852
Hi there,
I have 10 M1 Mac minis deployed in an exhibition. For 3 years they ran fine with exhibition power turning off at 6pm and on at 9pm. Suddenly 3 stopped booting after power loss. Now another one.
I have retrieved them here an no matter what I do it won't boot after power loss? Any ideas?
Have done full wipe and reinstall. Running latest OS. Replaced CMOS battery. Nothing helps.
Help!!!
Here is my write NDEF message code:
let readerWriter = NFCReaderWriter.sharedInstance()
let payloadData = NFCNDEFPayload(format: .nfcWellKnown, type: "U".data(using: .utf8)!, identifier: Data(), payload: "google.com".data(using: .utf8)!)
let message = NFCNDEFMessage(records: [payloadData])
readerWriter.write(message, to: tags.first!) { (error) in
if let err = error {
print("ERR:\(err)")
} else {
print("write success")
}
self.readerWriter.end()
}
First Issue:
When I want to read the NFC chip in the background without opening the app, I find the detection speed is not ideal. For example, this code writes "google.com" this time. When performing background reading, it does not successfully read every time the chip is near, and there seems to be a one-minute interval.
Second Issue:
When I implemented this method in the AppDelegate:
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
if (![userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
return NO;
}
NSLog(@"userActivity: %@", userActivity.ndefMessagePayload);
if (userActivity.ndefMessagePayload) {
return YES;
}
return NO;
}
I found that userActivity.ndefMessagePayload outputs null. At the same time, looking at its private variables, it seems to have values:
Printing description of userActivity->_internal->_payloadDataCache:
{
"com.apple.corenfc.useractivity.ndefmessagepayload" = {length = 546, bytes = 0x62706c69 73743030 d4010203 04050607 ... 00000000 0000019c };
}
If ndefMessagePayload is null, how can I determine that it is an NSUserActivity from an NFC scan?
I have a small application (already published to the Mac App Store) to monitor, and notify the user of some important state changes about thier computer. To display Wi-Fi informations, I listening on the "State:/Network/Interface/.*/AirPort" events of the System Configuration framework. Before 14.4, the returned dictionary had an "SSID_STR" property which was contained the connected network name, but from 14.4, if "SSID_STR" are presents, it's will be always an empty string ("").
My first idea was to put "NSLocationUsageDescription" into the Info.plist (and enable Location under App Sandbox in the Signing & Capabilities section) and try to request permission with the Core Locations requestWhenInUseAuthorization call, but even if i had the correct permission (.authorizedAlways), this will did not came to success.
There are any workaround or entitlement available to get back the access to this information?
I confirmed that I had successfully turned on the device and registered the callback method,
but the callback method was not successfully invoked when moving with Magic mouse.
What method does the Magic Mouse and Magic Trackpad need to use to get the input value of the device?
IOReturn ioReturn = IOHIDDeviceOpen(deviceRef, kIOHIDOptionsTypeNone);
if ( kIOReturnSuccess == ioReturn ) {
IOHIDDeviceRegisterInputValueCallback(deviceRef, mouseInputValueCallback, NULL);
}
static void mouseInputValueCallback(void *context, IOReturn result, void *sender, IOHIDValueRef value) {
NSLog(@"handle input value");
}
I passed the __IOHIDDeviceCopyMatchingInputElements get magic mouse input element
<__NSArrayM 0x6000012c4900>(
timestamp: 0 type: 1 usagePage: 1 usage: 48 reportID: 16 value: 0,
timestamp: 0 type: 1 usagePage: 1 usage: 49 reportID: 16 value: 0,
timestamp: 0 type: 2 usagePage: 9 usage: 1 reportID: 16 value: 0,
timestamp: 0 type: 2 usagePage: 9 usage: 2 reportID: 16 value: 0
)
(NSArray *)getHIDReprots {
if (!deviceRef) {
return nil;
}
NSMutableArray *reports = [[NSMutableArray alloc] init];
CFArrayRef elements;
CFIndex i;
elements = IOHIDDeviceCopyMatchingElements(deviceRef, NULL, kIOHIDOptionsTypeNone);
for (i = 0; i<CFArrayGetCount(elements); i++) {
const IOHIDElementRef element = (void*)CFArrayGetValueAtIndex(elements, i);
IOHIDElementType eleType = IOHIDElementGetType(element);
NSString *eleTypeStr = @"";
switch (eleType) {
case kIOHIDElementTypeInput_Misc:
eleTypeStr = @"kIOHIDElementTypeInput_Misc";
break;
case kIOHIDElementTypeInput_Button:
eleTypeStr = @"kIOHIDElementTypeInput_Button";
break;
case kIOHIDElementTypeInput_Axis:
eleTypeStr = @"kIOHIDElementTypeInput_Axis";
break;
case kIOHIDElementTypeInput_ScanCodes:
eleTypeStr = @"kIOHIDElementTypeInput_ScanCodes";
break;
case kIOHIDElementTypeInput_NULL:
eleTypeStr = @"kIOHIDElementTypeInput_NULL";
break;
case kIOHIDElementTypeOutput:
eleTypeStr = @"kIOHIDElementTypeOutput";
break;
case kIOHIDElementTypeFeature:
eleTypeStr = @"kIOHIDElementTypeFeature";
break;
case kIOHIDElementTypeCollection:
eleTypeStr = @"kIOHIDElementTypeCollection";
break;
default:
break;
}
uint32_t page = IOHIDElementGetUsagePage(element);
uint32_t usage = IOHIDElementGetUsage(element);
uint32_t reportID = IOHIDElementGetReportID(element);
uint32_t reportSize = IOHIDElementGetReportSize(element);
uint32_t reportCount = IOHIDElementGetReportCount(element);
NSString *elementStr = [[NSString alloc] initWithFormat:@" reportID:%d, reportSize:%d, type:%@, UsagePage:%d, usage:%d, reportCount:%d\n\n",reportID, reportSize, eleTypeStr, page, usage, reportCount];
[reports addObject:elementStr];
}
return reports;
}
reportID:0, reportSize:0, type:kIOHIDElementTypeCollection, UsagePage:1, usage:2, reportCount:1
reportID:0, reportSize:0, type:kIOHIDElementTypeCollection, UsagePage:1, usage:1, reportCount:1
reportID:16, reportSize:16, type:kIOHIDElementTypeInput_Misc, UsagePage:1, usage:48, reportCount:1
reportID:16, reportSize:16, type:kIOHIDElementTypeInput_Misc, UsagePage:1, usage:49, reportCount:1
reportID:16, reportSize:1, type:kIOHIDElementTypeInput_Button, UsagePage:9, usage:1, reportCount:1
reportID:16, reportSize:1, type:kIOHIDElementTypeInput_Button, UsagePage:9, usage:2, reportCount:1
reportID:71, reportSize:8, type:kIOHIDElementTypeFeature, UsagePage:6, usage:32, reportCount:1
reportID:85, reportSize:512, type:kIOHIDElementTypeFeature, UsagePage:65282, usage:85, reportCount:64
reportID:0, reportSize:0, type:kIOHIDElementTypeInput_NULL, UsagePage:0, usage:-1, reportCount:1
reportID:0, reportSize:1, type:kIOHIDElementTypeInput_NULL, UsagePage:0, usage:0, reportCount:1
reportID:16, reportSize:0, type:kIOHIDElementTypeInput_NULL, UsagePage:0, usage:-1, reportCount:1
reportID:16, reportSize:1, type:kIOHIDElementTypeInput_NULL, UsagePage:0, usage:0, reportCount:1
reportID:71, reportSize:0, type:kIOHIDElementTypeInput_NULL, UsagePage:0, usage:-1, reportCount:1
reportID:71, reportSize:1, type:kIOHIDElementTypeInput_NULL, UsagePage:0, usage:0, reportCount:1
reportID:85, reportSize:0, type:kIOHIDElementTypeInput_NULL, UsagePage:0, usage:-1, reportCount:1
reportID:85, reportSize:1, type:kIOHIDElementTypeInput_NULL, UsagePage:0, usage:0, reportCount:1
Devices:
VendorID ProductID LocationID UsagePage Usage RegistryID Transport Class Product UserClass Built-In
0x4c 0x265 0x3bab3ec3 1 2 0x100001ec4 Bluetooth AppleHSBluetoothHIDDriver Magic Trackpad (null) 0
0x4c 0x265 0x3bab3ec3 0 1 0x100001eb2 Bluetooth AppleHSBluetoothDevice Magic Trackpad (null) 0
0x5ac 0x30d 0x5abbb32b 1 2 0x100001221 Bluetooth BNBMouseDevice Magic Mouse (null) 0
0x4c 0x265 0x3bab3ec3 65280 3 0x100001ed2 Bluetooth AppleHSBluetoothHIDDriver Magic Trackpad (null) 0
0x4c 0x265 0x3bab3ec3 65280 13 0x100001ecc Bluetooth AppleHSBluetoothHIDDriver Magic Trackpad (null) 0
0x4c 0x265 0x3bab3ec3 65280 11 0x100001eba Bluetooth AppleHSBluetoothHIDDriver Magic Trackpad (null) 0
In our third party SDK we would like to use microphone (as optional feature) in case the hosting app allows it.
From the docs requestRecordPermission will crash if no NSMicrophoneUsageDescription exists in the hosting app info.plist.
Obviously I don't want to crash the app. I would like to check if the hosting app will allow me to call requestRecordPermission before calling it?
Is it possible