请不要CFRunLoopRun();
单独使用调用方法,也请不要释放会话CFRelease(session);
,因为您以后不会收到任何回调。
如何与 DiskArbitration 建立会话并通过回调进行侦听?
创建 DA 会话和调度会话运行循环:
// Disk Arbitration Session
DASessionRef session = DASessionCreate(kCFAllocatorDefault);
if (!session) {
[NSException raise:NSGenericException format:@"Unable to create Disk Arbitration session."];
return;
}
NSLog(@"Disk Arbitration Session created");
// schedule DA session run loop
DASessionScheduleWithRunLoop(session, CFRunLoopGetMain(), kCFRunLoopCommonModes);
如果您想监听所有磁盘事件,包括内部事件。然后NULL
在注册回调时通过。
否则为您的回调创建一个matching condition
。例如:外接硬盘的以下条件,存储盘通过USB连接。
// Matching Conditions
CFMutableDictionaryRef match = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
// Device matching criteria
// 1. Of-course it shouldn't be internal device since
CFDictionaryAddValue(match, kDADiskDescriptionDeviceInternalKey, kCFBooleanFalse);
// Volume matching criteria
// It should statisfy following
CFDictionaryAddValue(match, kDADiskDescriptionVolumeMountableKey, kCFBooleanTrue);
CFDictionaryAddValue(match, kDADiskDescriptionVolumeNetworkKey, kCFBooleanFalse);
看DADisk.h
,我们为您的需要添加更多条件。
使用 DiskArbitration 注册回调,这里有更多关于回调的信息-
NSString * const AppName = @"DAApp";
// Registring callbacks
DARegisterDiskAppearedCallback(session, match, DiskAppearedCallback, (__bridge void *)AppName);
DARegisterDiskDisappearedCallback(session, match, DiskDisappearedCallback, (__bridge void *)AppName);
DARegisterDiskDescriptionChangedCallback(session, match, NULL, DiskDescriptionChangedCallback, (__bridge void *)AppName);
// And now release match
CFRelease(match);
...应用程序的事情发生了...**
最后注销并释放所有内容。典型的地方是应用程序终止或释放。
// DA Session
if (session) {
DAUnregisterCallback(session, DiskAppearedCallback, (__bridge void *)AppName);
DAUnregisterCallback(session, DiskDisappearedCallback, (__bridge void *)AppName);
DASessionUnscheduleFromRunLoop(session, CFRunLoopGetMain(), kCFRunLoopCommonModes);
CFRelease(session);
NSLog(@"Disk Arbitration Session destoryed");
}
我希望它有帮助!
顺便说一句,对于像这样的 DA 批准会议
// Disk Arbitration Approval Session
DASessionRef approvalSession = DAApprovalSessionCreate(kCFAllocatorDefault);
if (!approvalSession) {
NSLog(@"Unable to create Disk Arbitration approval session.");
return;
}
NSLog(@"Disk Arbitration Approval Session created");
DAApprovalSessionScheduleWithRunLoop(approvalSession, CFRunLoopGetMain(), kCFRunLoopCommonModes);
// Same match condition for Approval session too
DARegisterDiskMountApprovalCallback(approvalSession, match, DiskMountApprovalCallback, (__bridge void *)AppName);
// may need CFRelease(match); based code sequence!
最后注销并释放。
// DA Approval Session
if (approvalSession) {
DAUnregisterApprovalCallback(approvalSession, DiskMountApprovalCallback, (__bridge void *)AppName);
DAApprovalSessionUnscheduleFromRunLoop(approvalSession, CFRunLoopGetMain(), kCFRunLoopCommonModes);
CFRelease(approvalSession);
NSLog(@"Disk Arbitration Approval Session destoryed");
}
有关上述代码片段的更多信息,请点击此处。