我已经用了2天的时间来用目标C找到文件共享的状态。我们可以使用SharingPreferences使用系统首选项来启用文件共享。文件共享首选项窗格存储在/System/Library/PreferencePanes位置。我们可以从PreferencePanes类检索文件共享状态信息吗?如果那样的话,我们怎样才能找回呢?
我们能否从系统存储的plist文件中获取文件共享状态,在哪个plist文件状态中维护?
或者任何其他API的目标C,通过我们可以获得文件共享状态?
发布于 2016-02-18 09:34:50
您可以通过检查适当的ServiceManagement.framework守护进程的状态来实现这一点。
@import ServiceManagement;
NSArray *allJobs = (NSArray *)CFBridgingRelease(SMCopyAllJobDictionaries(kSMDomainSystemLaunchd));
NSArray *labels = [allJobs valueForKey:@"Label"];
BOOL AFPSharingIsEnabled = [labels containsObject:@"com.apple.AppleFileServer"];
BOOL SMBSharingIsEnabled = [labels containsObject:@"com.apple.smbd"];
NSLog(@"AFPSharingIsEnabled: %d - SMBSharingIsEnabled: %d", AFPSharingIsEnabled, SMBSharingIsEnabled);SMCopyAllJobDictionaries传递kSMDomainSystemLaunchd与shell中的sudo launchctl list类似。
虽然SMCopyAllJobDictionaries是不推荐的,但是没有替换,该API在El Capitan中工作。
发布于 2016-02-18 08:52:18
我不认为有一个直接的api来获得这种状态,但它可以通过其他方式获得。
发布于 2018-03-29 20:59:44
我以上建议的快速而肮脏的实施。基本上,我想要快速确定(在1秒或更短的时间内)哪一个尝试先挂载,法新社或smb。
注意,这些对象/类是特定于我的实现的:
// my specific server implementation details
MboxObject *mbox = [RemoteFileManager mboxForHostString: [aNetService name]];task.targetServerName
NSString *挂载NSString
static BOOL hasAfp;
static BOOL hasSmb;
// delegate callback
- (void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing
{
MboxObject *mbox = [RemoteFileManager mboxForHostString: [aNetService name]];
if ( mbox && netServiceMboxName && [[mbox name] isEqualToString:netServiceMboxName] )
{
if ( [[aNetService type] rangeOfString:@"_afpovertcp"].length )
hasAfp = YES;
if ( [[aNetService type] rangeOfString:@"_smb"].length )
hasSmb = YES;
}
}开始服务..。
/////////////////////////// AFP or SMB? //////////////////////////////////
// quickly determine if afp or smb is enabled
if ( !mountedBasePath && task.targetServerName )
{
netServiceMboxName = [task.targetServerName copy];
if ( !netServiceBrowserAfp )
{
netServiceBrowserAfp = [[NSNetServiceBrowser alloc] init];
if ( !netServices )
netServices = [[NSMutableArray alloc] init];
[netServiceBrowserAfp setDelegate:self];
netServiceBrowserSmb = [[NSNetServiceBrowser alloc] init];
if ( !netServices )
netServices = [[NSMutableArray alloc] init];
[netServiceBrowserSmb setDelegate:self];
}
hasAfp = hasSmb = NO;
[netServiceBrowserAfp searchForServicesOfType:@"_afpovertcp._tcp." inDomain:@""];
[netServiceBrowserSmb searchForServicesOfType:@"_smb._tcp." inDomain:@""];
for (int i = 0; i < 10; i++ ) // afp is preferred over smb because it is less restrictive (no date/clock restriction)
{
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
if (hasAfp) break;
}
NSLog( @"hasAfp %d hasSmb %d", hasAfp, hasSmb );
if ( hasSmb && !hasAfp )
tryingAfp = NO; // don't bother trying afp if only smb found
[netServiceBrowserAfp stop];
[netServiceBrowserSmb stop];
/////////////////////////// AFP or SMB? ///////////////////////////////
}https://stackoverflow.com/questions/35475988
复制相似问题