关于iOS 14 Local Network权限问题
在iOS 14系统中苹果新增加了本地网络的授权,本地网络(Local Network)是在当app使用Bonjour服务或者访问本地局域网时需要用户授权,如:
Network.framework(NWBrowser,NWListener.Service)
Foundation(NetService)
MultipeerConnectivity(蓝牙)
Dnssd(发现,发布和解析局域网或广域网上的网络服务)
Bonjour主要做本地通信和只能交互的。
通常我们是通过 NSNetService 和 NSNetServiceBrowser 来使用 Bonjour 的,前者用于建立与发布 service,后者用于监听查询网络上的 service。
在我们的项目中因为使用了第三方KTVCocoaHTTPServer,在查看其中源码发现这个库中使用了NSNetService:
#pragma mark Bonjour
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- (void)publishBonjour {
HTTPLogTrace();
NSAssert(dispatch_get_specific(IsOnServerQueueKey) != NULL, @"Must be on serverQueue");
if (type) {
netService = [[NSNetService alloc] initWithDomain:domain type:type name:name port:[asyncSocket localPort]];
[netService setDelegate:self];
NSNetService *theNetService = netService;
NSData *txtRecordData = nil;
if (txtRecordDictionary)
txtRecordData = [NSNetService dataFromTXTRecordDictionary:txtRecordDictionary];
dispatch_block_t bonjourBlock = ^{
[theNetService removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[theNetService scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
[theNetService publish];
// Do not set the txtRecordDictionary prior to publishing!!!
// This will cause the OS to crash!!!
if (txtRecordData) {
[theNetService setTXTRecordData:txtRecordData];
}
};
[[self class] startBonjourThreadIfNeeded];
[[self class] performBonjourBlock:bonjourBlock];
}
}
因此在用户第一次启动项目是会弹出本地网络授权的提示。
验证环境:
iPad iOS 14
Xcode 11
通过把本地网路权限关闭去验证是否对项目有影响:
1、我们项目之所以会提示本地网络授权是因为KTVHTTPCache依赖于KTVCocoaHTTPServer,是因为KTVHTTPCache使用的音视频缓存方案:本地实现http service。
在iOS本地开启Local Server服务,然后使用播放控件请求本地Local Server服务,本地的服务再不断请求视频地址获取视频流,本地服务请求的过程中把视频缓存到本地,大体的思路是这样的。而实现loacl Service要基于Bonjour库,通过 Bonjour,一个应用程序 publish 一个网络服务 service,然后网络中的其他程序就能自动发现这个 service,从而可以向这个 service 查询其 ip 和 port,然后通过获得的 ip 和 port 建立 socket 链接进行通信。通常我们是通过 NSNetService 和 NSNetServiceBrowser 来使用 Bonjour 的,前者用于建立与发布 service,后者用于监听查询网络上的 service,因此在iOS14设备上边提示了本地网路授权。
2、为了验证关闭本地网络授权是否会对项目有所影响,先找到KTVHTTPCache库在ClassIn中的缓存目录:tmp->KTVHTTPCache,最新安装的app并没有任何缓存,然后运行app,播放视频再次查看缓存目录下有了视频缓存,目前调研结果是关闭本地网络权限并不会对我们项目产生影响。
使用另外一种方案:
使用IOS原生API ,使用 AVAssetResourceLoader,在不改变 AVPlayer API 的情况下,对播放的音视频进行缓存。
这种方案只能是使用AVPlayer才可以,使用第三方播放器除非它也暴露出了类似于AVAssetResourceLoader这样的协议。
相关三方很多 VIMediaCache https://github.com/vitoziv/VIMediaCache
这种方案测试不会提示本地网络授权管理