Skip to content

Commit 002d5e2

Browse files
author
Geraint White
committed
Add support for iOS Local Network permission
1 parent e656bee commit 002d5e2

File tree

10 files changed

+156
-0
lines changed

10 files changed

+156
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ _📌  Note that these commands must be re-executed each time you update this
5050
"Camera",
5151
"Contacts",
5252
"FaceID",
53+
"LocalNetworkPrivacy",
5354
"LocationAccuracy",
5455
"LocationAlways",
5556
"LocationWhenInUse",
@@ -488,6 +489,7 @@ PERMISSIONS.IOS.CALENDARS;
488489
PERMISSIONS.IOS.CAMERA;
489490
PERMISSIONS.IOS.CONTACTS;
490491
PERMISSIONS.IOS.FACE_ID;
492+
PERMISSIONS.IOS.LOCAL_NETWORK_PRIVACY;
491493
PERMISSIONS.IOS.LOCATION_ALWAYS;
492494
PERMISSIONS.IOS.LOCATION_WHEN_IN_USE;
493495
PERMISSIONS.IOS.MEDIA_LIBRARY;

example/ios/RNPermissionsExample/Info.plist

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@
3535
</dict>
3636
</dict>
3737
</dict>
38+
<key>NSBonjourServices</key>
39+
<array>
40+
<string>_lnp._tcp.</string>
41+
</array>
3842
<key>NSAppleMusicUsageDescription</key>
3943
<string>Let me use your media library</string>
4044
<key>NSBluetoothAlwaysUsageDescription</key>
@@ -49,6 +53,8 @@
4953
<string>Let me use your contacts</string>
5054
<key>NSFaceIDUsageDescription</key>
5155
<string>Let me use FaceID</string>
56+
<key>NSLocalNetworkUsageDescription</key>
57+
<string>Let me use your local network</string>
5258
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
5359
<string>Let me use your location, even in background</string>
5460
<key>NSLocationAlwaysUsageDescription</key>

example/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"Camera",
1818
"Contacts",
1919
"FaceID",
20+
"LocalNetworkPrivacy",
2021
"LocationAccuracy",
2122
"LocationAlways",
2223
"LocationWhenInUse",
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
//
2+
// LocalNetworkPrivacy.swift
3+
// CloudVoiceExpress
4+
//
5+
// Created by Geraint White on 29/04/2022.
6+
//
7+
8+
import Foundation
9+
import UIKit
10+
11+
@objc public enum OptionalBool: Int {
12+
case none
13+
case yes
14+
case no
15+
}
16+
17+
@objc open class LocalNetworkPrivacy : NSObject {
18+
let service: NetService
19+
20+
var completion: ((Bool) -> Void)?
21+
var timer: Timer?
22+
var publishing = false
23+
24+
static var granted: OptionalBool = OptionalBool.none
25+
26+
@objc public override init() {
27+
service = .init(domain: "local.", type:"_lnp._tcp.", name: "LocalNetworkPrivacy", port: 1100)
28+
super.init()
29+
}
30+
31+
@objc public static
32+
func authorizationStatus() -> OptionalBool {
33+
return LocalNetworkPrivacy.granted
34+
}
35+
36+
@objc public
37+
func checkAccessState(completion: @escaping (Bool) -> Void) {
38+
self.completion = completion
39+
40+
timer = .scheduledTimer(withTimeInterval: 2, repeats: true, block: { timer in
41+
guard UIApplication.shared.applicationState == .active else {
42+
return
43+
}
44+
45+
if self.publishing {
46+
LocalNetworkPrivacy.granted = OptionalBool.no
47+
self.timer?.invalidate()
48+
self.completion?(false)
49+
}
50+
else {
51+
self.publishing = true
52+
self.service.delegate = self
53+
self.service.publish()
54+
55+
}
56+
})
57+
}
58+
59+
deinit {
60+
service.stop()
61+
}
62+
}
63+
64+
extension LocalNetworkPrivacy : NetServiceDelegate {
65+
public func netServiceDidPublish(_ sender: NetService) {
66+
LocalNetworkPrivacy.granted = OptionalBool.yes
67+
timer?.invalidate()
68+
completion?(true)
69+
}
70+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
require 'json'
2+
package = JSON.parse(File.read('../../package.json'))
3+
4+
Pod::Spec.new do |s|
5+
s.name = "Permission-LocalNetworkPrivacy"
6+
s.dependency "RNPermissions"
7+
8+
s.version = package["version"]
9+
s.license = package["license"]
10+
s.summary = package["description"]
11+
s.authors = package["author"]
12+
s.homepage = package["homepage"]
13+
14+
s.ios.deployment_target = "10.0"
15+
s.tvos.deployment_target = "11.0"
16+
s.requires_arc = true
17+
18+
s.source = { :git => package["repository"]["url"], :tag => s.version }
19+
s.source_files = "*.{h,m,swift}"
20+
end
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#import "RNPermissions.h"
2+
3+
@interface RNPermissionHandlerLocalNetworkPrivacy : NSObject<RNPermissionHandler>
4+
5+
@end
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#import "RNPermissionHandlerLocalNetworkPrivacy.h"
2+
#import "Permission_LocalNetworkPrivacy-Swift.h"
3+
4+
@implementation RNPermissionHandlerLocalNetworkPrivacy
5+
6+
+ (NSArray<NSString *> * _Nonnull)usageDescriptionKeys {
7+
return @[@"NSLocalNetworkUsageDescription"];
8+
}
9+
10+
+ (NSString * _Nonnull)handlerUniqueId {
11+
return @"ios.permission.LOCAL_NETWORK_PRIVACY";
12+
}
13+
14+
- (void)checkWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
15+
rejecter:(void (__unused ^ _Nonnull)(NSError * _Nonnull))reject {
16+
switch ([LocalNetworkPrivacy authorizationStatus]) {
17+
case OptionalBoolNone:
18+
return resolve(RNPermissionStatusNotDetermined);
19+
case OptionalBoolNo:
20+
return resolve(RNPermissionStatusDenied);
21+
case OptionalBoolYes:
22+
return resolve(RNPermissionStatusAuthorized);
23+
}
24+
}
25+
26+
- (void)requestWithResolver:(void (^ _Nonnull)(RNPermissionStatus))resolve
27+
rejecter:(void (^ _Nonnull)(NSError * _Nonnull))reject {
28+
LocalNetworkPrivacy *local = [LocalNetworkPrivacy new];
29+
[local checkAccessStateWithCompletion:^(BOOL granted) {
30+
[self checkWithResolver:resolve rejecter:reject];
31+
}];
32+
}
33+
34+
@end

ios/RNPermissionsHelper.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ typedef NS_ENUM(NSInteger, RNPermission) {
5353
#if __has_include("RNPermissionHandlerPhotoLibraryAddOnly.h")
5454
RNPermissionPhotoLibraryAddOnly = 17,
5555
#endif
56+
#if __has_include("RNPermissionHandlerLocalNetworkPrivacy.h")
57+
RNPermissionLocalNetworkPrivacy = 18,
58+
#endif
5659
};
5760

5861
typedef enum {

ios/RNPermissionsModule.mm

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@
5858
#if __has_include("RNPermissionHandlerLocationAccuracy.h")
5959
#import "RNPermissionHandlerLocationAccuracy.h"
6060
#endif
61+
#if __has_include("RNPermissionHandlerLocalNetworkPrivacy.h")
62+
#import "RNPermissionHandlerLocalNetworkPrivacy.h"
63+
#endif
6164

6265
@implementation RCTConvert(RNPermission)
6366

@@ -113,6 +116,9 @@ @implementation RCTConvert(RNPermission)
113116
#if __has_include("RNPermissionHandlerPhotoLibraryAddOnly.h")
114117
[RNPermissionHandlerPhotoLibraryAddOnly handlerUniqueId]: @(RNPermissionPhotoLibraryAddOnly),
115118
#endif
119+
#if __has_include("RNPermissionHandlerLocalNetworkPrivacy.h")
120+
[RNPermissionHandlerLocalNetworkPrivacy handlerUniqueId]: @(RNPermissionLocalNetworkPrivacy),
121+
#endif
116122
}), RNPermissionUnknown, integerValue);
117123

118124
@end
@@ -195,6 +201,9 @@ - (NSDictionary *)constantsToExport {
195201
#if __has_include("RNPermissionHandlerLocationAccuracy.h")
196202
[available addObject:[RNPermissionHandlerLocationAccuracy handlerUniqueId]];
197203
#endif
204+
#if __has_include("RNPermissionHandlerLocalNetworkPrivacy.h")
205+
[available addObject:[RNPermissionHandlerLocalNetworkPrivacy handlerUniqueId]];
206+
#endif
198207

199208
#if RCT_DEV
200209
if ([available count] == 0) {
@@ -310,6 +319,11 @@ - (void)checkUsageDescriptionKeys:(NSArray<NSString *> * _Nonnull)keys {
310319
case RNPermissionPhotoLibraryAddOnly:
311320
handler = [RNPermissionHandlerPhotoLibraryAddOnly new];
312321
break;
322+
#endif
323+
#if __has_include("RNPermissionHandlerLocalNetworkPrivacy.h")
324+
case RNPermissionLocalNetworkPrivacy:
325+
handler = [RNPermissionHandlerLocalNetworkPrivacy new];
326+
break;
313327
#endif
314328
case RNPermissionUnknown:
315329
break; // RCTConvert prevents this case

src/permissions.ios.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const IOS = Object.freeze({
88
CAMERA: 'ios.permission.CAMERA',
99
CONTACTS: 'ios.permission.CONTACTS',
1010
FACE_ID: 'ios.permission.FACE_ID',
11+
LOCAL_NETWORK_PRIVACY: 'ios.permission.LOCAL_NETWORK_PRIVACY',
1112
LOCATION_ALWAYS: 'ios.permission.LOCATION_ALWAYS',
1213
LOCATION_WHEN_IN_USE: 'ios.permission.LOCATION_WHEN_IN_USE',
1314
MEDIA_LIBRARY: 'ios.permission.MEDIA_LIBRARY',

0 commit comments

Comments
 (0)