【问题标题】:Objective C: iOS 14 How to do Network privacy permission checkObjective C: iOS 14 如何做网络隐私权限检查
【发布时间】:2021-04-12 12:11:03
【问题描述】:
【问题讨论】:
标签:
ios
objective-c
xcode
【解决方案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 中。