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.
我正在使用 IOT 天气连接显示器(使用本地网络),它使用 iOS 应用程序与路由器连接。显示和 iOS 应用程序之间的连接由本地 network.popup 在连接时出现以允许本地网络隐私,但我想提前检查用户是否允许本地网络权限。我参考这个
这是我写在 Swift -
但是如果你有一个纯 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." toNSBonjourServices
into your Info.plist.