美文网首页iOS 的那些事儿
关于iOS 14 Local Network权限问题

关于iOS 14 Local Network权限问题

作者: godBlessMe__ | 来源:发表于2020-09-17 09:44 被阅读0次

    在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
    这种方案测试不会提示本地网络授权管理

    相关文章

      网友评论

        本文标题:关于iOS 14 Local Network权限问题

        本文链接:https://www.haomeiwen.com/subject/vyptlktx.html