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

Objective C: iOS 14 How to do Network privacy permission check

我正在使用 IOT 天气连接显示器(使用本地网络),它使用 iOS 应用程序与路由器连接。显示和 iOS 应用程序之间的连接由本地 network.popup 在连接时出现以允许本地网络隐私,但我想提前检查用户是否允许本地网络权限。我参考这个 and https://developer.apple.com/forums/thread/663858 但我正在寻找 Objecitve-C 中的代码。请帮助我

这是我写在 Swift - 中的原始答案,您也可以毫不费力地从 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");
}];

NOTE: You must set NSLocalNetworkUsageDescription and add "_lnp._tcp." to NSBonjourServices into your Info.plist.