【问题标题】:Objective C: iOS 14 How to do Network privacy permission checkObjective C: iOS 14 如何做网络隐私权限检查
【发布时间】: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 中的代码。请帮我解决这个问题

【问题讨论】:

    标签: 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 中。

    【讨论】:

      猜你喜欢
      • 2021-05-03
      • 2021-01-13
      • 2021-01-12
      • 2021-01-26
      • 1970-01-01
      • 2020-12-26
      • 2020-11-26
      • 2017-05-05
      • 1970-01-01
      相关资源
      最近更新 更多