Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// swift-tools-version: 5.9
import PackageDescription

let package = Package(
name: "permission_handler_apple",
platforms: [
.iOS("12.0")
],
products: [
.library(name: "permission-handler-apple", targets: ["permission_handler_apple"])
],
dependencies: [],
targets: [
.target(
name: "permission_handler_apple",
dependencies: [],
resources: [
.process("PrivacyInfo.xcprivacy"),
],
publicHeadersPath: "",
cSettings: [
.define("PERMISSION_EVENTS", to: "1"),
.define("PERMISSION_REMINDERS", to: "1"),
.define("PERMISSION_CONTACTS", to: "1"),
.define("PERMISSION_CAMERA", to: "1"),
.define("PERMISSION_MICROPHONE", to: "1"),
.define("PERMISSION_SPEECH_RECOGNIZER", to: "1"),
.define("PERMISSION_PHOTOS", to: "1"),
.define("PERMISSION_LOCATION", to: "1"),
.define("PERMISSION_NOTIFICATIONS", to: "1"),
.define("PERMISSION_MEDIA_LIBRARY", to: "1"),
.define("PERMISSION_SENSORS", to: "1"),
.define("PERMISSION_BLUETOOTH", to: "1"),
.define("PERMISSION_APP_TRACKING_TRANSPARENCY", to: "1"),
.define("PERMISSION_CRITICAL_ALERTS", to: "1"),
]
)
]
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//
// AppTrackingTransparency.h
// permission_handler
//
// Created by Jan-Derk on 21/05/2021.
//

#import <Foundation/Foundation.h>
#import "PermissionStrategy.h"

#if PERMISSION_APP_TRACKING_TRANSPARENCY

#import <AppTrackingTransparency/AppTrackingTransparency.h>

@interface AppTrackingTransparencyPermissionStrategy : NSObject <PermissionStrategy>
@end

#else

#import "UnknownPermissionStrategy.h"

@interface AppTrackingTransparencyPermissionStrategy : UnknownPermissionStrategy
@end

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
//
// AppTrackingTransparency.m
// permission_handler
//
// Created by Jan-Derk on 21/05/2021.
//

#import "AppTrackingTransparencyPermissionStrategy.h"
#import <UIKit/UIKit.h>

#if PERMISSION_APP_TRACKING_TRANSPARENCY

@implementation AppTrackingTransparencyPermissionStrategy

- (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission {
if (@available(iOS 14, *)) {
ATTrackingManagerAuthorizationStatus attPermission = [ATTrackingManager trackingAuthorizationStatus];
return [AppTrackingTransparencyPermissionStrategy parsePermission:attPermission];
}

return PermissionStatusGranted;
}

- (void)checkServiceStatus:(PermissionGroup)permission completionHandler:(ServiceStatusHandler)completionHandler {
completionHandler(ServiceStatusNotApplicable);
}

- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler errorHandler:(PermissionErrorHandler)errorHandler{
PermissionStatus status = [self checkPermissionStatus:permission];
if (status != PermissionStatusDenied) {
completionHandler(status);
return;
}

if (@available(iOS 14, *)){
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
PermissionStatus permissionStatus = [AppTrackingTransparencyPermissionStrategy parsePermission:status];
completionHandler(permissionStatus);
}];
} else {
completionHandler(PermissionStatusGranted);
}
}

+ (PermissionStatus)parsePermission:(ATTrackingManagerAuthorizationStatus)attPermission API_AVAILABLE(ios(14)){
switch(attPermission){
case ATTrackingManagerAuthorizationStatusAuthorized:
return PermissionStatusGranted;
case ATTrackingManagerAuthorizationStatusRestricted:
return PermissionStatusRestricted;
case ATTrackingManagerAuthorizationStatusDenied:
return PermissionStatusPermanentlyDenied;
case ATTrackingManagerAuthorizationStatusNotDetermined:
return PermissionStatusDenied;
}
}
@end

#else

@implementation AppTrackingTransparencyPermissionStrategy
@end

#endif

Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
//
// Created by Baptiste Dupuch(dupuchba) on 2023-09-04.
// Copyright (c) 2019 The Chromium Authors. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "PermissionStrategy.h"

#if PERMISSION_ASSISTANT

#import <Intents/Intents.h>

@interface AssistantPermissionStrategy : NSObject <PermissionStrategy>
@end

#else

#import "UnknownPermissionStrategy.h"
@interface AssistantPermissionStrategy : UnknownPermissionStrategy
@end

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
//
// Assistant.m
// permission_handler
//
// Created by Baptiste Dupuch (dupuchba) on Tue Sep 5 08:50:04 2023
//

#import "AssistantPermissionStrategy.h"
#import <UIKit/UIKit.h>

#if PERMISSION_ASSISTANT

@implementation AssistantPermissionStrategy

- (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission {
INSiriAuthorizationStatus assistantPermission = [INPreferences siriAuthorizationStatus];
return [AssistantPermissionStrategy parsePermission:assistantPermission];
}

- (void)checkServiceStatus:(PermissionGroup)permission completionHandler:(ServiceStatusHandler)completionHandler {
completionHandler(ServiceStatusNotApplicable);
}

- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler errorHandler:(PermissionErrorHandler)errorHandler {
PermissionStatus status = [self checkPermissionStatus:permission];
if (status != PermissionStatusDenied) {
completionHandler(status);
return;
}

[INPreferences requestSiriAuthorization:^(INSiriAuthorizationStatus status) {
PermissionStatus permissionStatus = [AssistantPermissionStrategy parsePermission:status];
completionHandler(permissionStatus);
}];
}

+ (PermissionStatus)parsePermission:(INSiriAuthorizationStatus)assistantPermission API_AVAILABLE(ios(10)){
switch(assistantPermission){
case INSiriAuthorizationStatusAuthorized:
return PermissionStatusGranted;
case INSiriAuthorizationStatusRestricted:
return PermissionStatusRestricted;
case INSiriAuthorizationStatusDenied:
return PermissionStatusPermanentlyDenied;
case INSiriAuthorizationStatusNotDetermined:
return PermissionStatusDenied;
}
}
@end

#else

@implementation AssistantPermissionStrategy
@end

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
//
// Created by Razvan Lung(long1eu) on 2019-02-15.
// Copyright (c) 2019 The Chromium Authors. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "PermissionStrategy.h"

#if PERMISSION_CAMERA | PERMISSION_MICROPHONE
#import <AVFoundation/AVFoundation.h>

@interface AudioVideoPermissionStrategy : NSObject <PermissionStrategy>
@end

#else

#import "UnknownPermissionStrategy.h"
@interface AudioVideoPermissionStrategy : UnknownPermissionStrategy
@end

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
//
// Created by Razvan Lung(long1eu) on 2019-02-15.
// Copyright (c) 2019 The Chromium Authors. All rights reserved.
//

#import "AudioVideoPermissionStrategy.h"
#import <UIKit/UIKit.h>

#if PERMISSION_CAMERA | PERMISSION_MICROPHONE

@implementation AudioVideoPermissionStrategy

- (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission {
if (permission == PermissionGroupCamera) {
#if PERMISSION_CAMERA
return [AudioVideoPermissionStrategy permissionStatus:AVMediaTypeVideo];
#endif
} else if (permission == PermissionGroupMicrophone) {
#if PERMISSION_MICROPHONE
return [AudioVideoPermissionStrategy permissionStatus:AVMediaTypeAudio];
#endif
}
return PermissionStatusDenied;
}

- (void)checkServiceStatus:(PermissionGroup)permission completionHandler:(ServiceStatusHandler)completionHandler {
completionHandler(ServiceStatusNotApplicable);
}

- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler errorHandler:(PermissionErrorHandler)errorHandler {
PermissionStatus status = [self checkPermissionStatus:permission];

if (status != PermissionStatusDenied) {
completionHandler(status);
return;
}

AVMediaType mediaType;

if (permission == PermissionGroupCamera) {
#if PERMISSION_CAMERA
mediaType = AVMediaTypeVideo;
#else
completionHandler(PermissionStatusDenied);
return;
#endif
} else if (permission == PermissionGroupMicrophone) {
#if PERMISSION_MICROPHONE
mediaType = AVMediaTypeAudio;
#else
completionHandler(PermissionStatusDenied);
return;
#endif
} else {
completionHandler(PermissionStatusDenied);
return;
}

[AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) {
if (granted) {
completionHandler(PermissionStatusGranted);
} else {
completionHandler(PermissionStatusPermanentlyDenied);
}
}];
}

+ (PermissionStatus)permissionStatus:(AVMediaType const)mediaType {
AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:mediaType];

switch (status) {
case AVAuthorizationStatusNotDetermined:
return PermissionStatusDenied;
case AVAuthorizationStatusRestricted:
return PermissionStatusRestricted;
case AVAuthorizationStatusDenied:
return PermissionStatusPermanentlyDenied;
case AVAuthorizationStatusAuthorized:
return PermissionStatusGranted;
}

return PermissionStatusDenied;
}

@end

#else

@implementation AudioVideoPermissionStrategy
@end

#endif
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//
// BackgroundRefreshStrategy.h
// permission_handler_apple
//
// Created by Sebastian Roth on 28/09/2023.
//

#import <Foundation/Foundation.h>
#import "PermissionStrategy.h"

NS_ASSUME_NONNULL_BEGIN

@interface BackgroundRefreshStrategy : NSObject<PermissionStrategy>

@end

NS_ASSUME_NONNULL_END
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
//
// BackgroundRefreshStrategy.m
// permission_handler_apple
//
// Created by Sebastian Roth on 28/09/2023.
//

#import "BackgroundRefreshStrategy.h"
#import <UIKit/UIKit.h>

@implementation BackgroundRefreshStrategy

- (PermissionStatus)checkPermissionStatus:(PermissionGroup)permission {
return [BackgroundRefreshStrategy permissionStatus];
}

- (void)checkServiceStatus:(PermissionGroup)permission completionHandler:(ServiceStatusHandler)completionHandler {
completionHandler(ServiceStatusNotApplicable);
}

- (void)requestPermission:(PermissionGroup)permission completionHandler:(PermissionStatusHandler)completionHandler errorHandler:(PermissionErrorHandler)errorHandler {
completionHandler([BackgroundRefreshStrategy permissionStatus]);
}

+ (PermissionStatus) permissionStatus {
UIBackgroundRefreshStatus status = UIApplication.sharedApplication.backgroundRefreshStatus;
switch (status) {
case UIBackgroundRefreshStatusDenied:
return PermissionStatusDenied;
case UIBackgroundRefreshStatusRestricted:
return PermissionStatusRestricted;
case UIBackgroundRefreshStatusAvailable:
return PermissionStatusGranted;
default:
return PermissionStatusDenied;
}
}

@end
Loading
Loading