Objective C: iOS 14 如何做网络隐私权限检查

Posted

技术标签:

【中文标题】Objective C: iOS 14 如何做网络隐私权限检查【英文标题】:Objective C: iOS 14 How to do Network privacy permission check 【发布时间】:2021-04-12 12:11:03 【问题描述】:

我正在使用通过 ios 应用与路由器连接的 IOT 天气连接显示器(使用本地网络)。显示器和 iOS 应用程序之间的连接是由本地网络完成的。连接时出现弹出窗口以允许本地网络隐私,但我想提前检查用户是否允许本地网络权限。我参考这个iOS 14 How to trigger Local Network dialog and check user answer? 和https://developer.apple.com/forums/thread/663858 但我正在寻找 Objecitve-C 中的代码。请帮我解决这个问题

【问题讨论】:

【参考方案1】:

这是我用 Swift 编写的原始答案 - iOS 14 How to trigger Local Network dialog and check user answer?,您也可以毫不费力地从 objc 中使用它。

但是,如果您有一个纯 ObjC 项目并且不想添加 swift 文件,则使用类似的方法可以实现相同的效果:

// LocalNetworkPrivacy.h

@interface LocalNetworkPrivacy : NSObject

- (void)checkAccessState:(void (^)(BOOL))completion;
    
@end

// LocalNetworkPrivacy.m

#import <UIKit/UIKit.h>
#import "LocalNetworkPrivacy.h"

@interface LocalNetworkPrivacy () <NSNetServiceDelegate>

@property (nonatomic) NSNetService *service;
@property (nonatomic) void (^completion)(BOOL);
@property (nonatomic) NSTimer *timer;
@property (nonatomic) BOOL publishing;

@end

@implementation LocalNetworkPrivacy

- (instancetype)init 
    if (self = [super init]) 
        self.service = [[NSNetService alloc] initWithDomain:@"local." type:@"_lnp._tcp." name:@"LocalNetworkPrivacy" port:1100];
    
    return self;


- (void)dealloc 
    [self.service stop];


- (void)checkAccessState:(void (^)(BOOL))completion 
    self.completion = completion;
    
    self.timer = [NSTimer scheduledTimerWithTimeInterval:2 repeats:YES block:^(NSTimer * _Nonnull timer) 
        if (UIApplication.sharedApplication.applicationState != UIApplicationStateActive) 
            return;
        
        
        if (self.publishing) 
            [self.timer invalidate];
            self.completion(NO);
        
        else 
            self.publishing = YES;
            self.service.delegate = self;
            [self.service publish];
        
    ];



#pragma mark - NSNetServiceDelegate

- (void)netServiceDidPublish:(NSNetService *)sender 
    [self.timer invalidate];
    self.completion(YES);


@end

使用方法:

LocalNetworkPrivacy* localNetworkPrivacy = [LocalNetworkPrivacy new];
[localNetworkPrivacy checkAccessState:^(BOOL granted) 
    NSLog(@"Granted: %@", granted ? @"YES" : @"NO");
];

注意:您必须设置NSLocalNetworkUsageDescription 并添加“_lnp._tcp”。 NSBonjourServices 到你的 Info.plist 中。

【讨论】:

以上是关于Objective C: iOS 14 如何做网络隐私权限检查的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Objective C 在 iOS 上本地下载和保存文件? [复制]

如何通过iOS Objective C中的appDelegate从另一个视图控制器重新加载表视图

如何通过NEHotspotHelper获取WiFi列表(IOS,objective-c)

如何在 iOS 上使用 Objective-C 触发按需 ***

iOS Objective C 覆盖属性设置器

使用objective-c从url获取网络摄像头图像