我花了2天时间使用Objective C以编程方式查找文件共享的状态。我们可以使用SharingPreferences使用系统首选项启用文件共享。文件共享首选项窗格存储在/ System / Library / PreferencePanes位置。我们可以从PreferencePanes类中检索文件共享状态信息吗?如果那么我们如何检索?。
我们可以从系统存储的plist文件中获取文件共享状态,plist文件状态是否保持?
OR Objective C的任何其他API我们可以通过获取文件共享状态吗?
答案 0 :(得分:1)
我认为没有直接的api来获得这种状态,但可以通过其他方式获得。
答案 1 :(得分:0)
您可以通过检查相应的launchd守护进程的状态,使用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
的{p> kSMDomainSystemLaunchd
与shell中的sudo launchctl list
类似。
虽然不推荐使用SMCopyAllJobDictionaries
,但没有替换,而且API在El Capitan中有效。
答案 2 :(得分:0)
我上面快速而肮脏地实施了Pradeeps的建议。 基本上我想快速确定(1秒或更短)哪个 尝试安装第一个,afp或smb。
请注意,这些对象/类特定于我的实现:
// my specific server implementation details
MboxObject *mbox = [RemoteFileManager mboxForHostString: [aNetService name]];
task.targetServerName
NSString * mountedBasePath
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? ///////////////////////////////
}