Skip to content

Commit 26d2550

Browse files
alexeyxodelba
authored andcommitted
Siri permissions (delba#89)
1 parent ec0c1bf commit 26d2550

File tree

7 files changed

+83
-1
lines changed

7 files changed

+83
-1
lines changed

Permission.xcodeproj/project.pbxproj

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
/* Begin PBXBuildFile section */
1010
3D42A7DB1D5F66B300236ABA /* SpeechRecognizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D42A7DA1D5F66B300236ABA /* SpeechRecognizer.swift */; };
1111
3DC217D31D6EFD4A00600DFE /* MediaLibrary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DC217D21D6EFD4A00600DFE /* MediaLibrary.swift */; };
12+
3F21DC7E1E30E0B900B3EF65 /* Siri.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F21DC7C1E30B6DB00B3EF65 /* Siri.swift */; };
1213
6C04FAF61CCA8F3A00B3F361 /* AddressBook.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C04FAF51CCA8F3A00B3F361 /* AddressBook.swift */; };
1314
6D0069B41C1868E8002FDB42 /* PermissionSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D0069B31C1868E8002FDB42 /* PermissionSet.swift */; };
1415
6D0EBDBD1BFCF8B700C35F8E /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D0EBDBC1BFCF8B700C35F8E /* Utilities.swift */; };
@@ -47,6 +48,7 @@
4748
/* Begin PBXFileReference section */
4849
3D42A7DA1D5F66B300236ABA /* SpeechRecognizer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpeechRecognizer.swift; sourceTree = "<group>"; };
4950
3DC217D21D6EFD4A00600DFE /* MediaLibrary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MediaLibrary.swift; sourceTree = "<group>"; };
51+
3F21DC7C1E30B6DB00B3EF65 /* Siri.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Siri.swift; sourceTree = "<group>"; };
5052
6C04FAF51CCA8F3A00B3F361 /* AddressBook.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddressBook.swift; sourceTree = "<group>"; };
5153
6D0069B31C1868E8002FDB42 /* PermissionSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PermissionSet.swift; sourceTree = "<group>"; };
5254
6D0EBDBC1BFCF8B700C35F8E /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = "<group>"; };
@@ -154,6 +156,7 @@
154156
6DF9C2B71C8F4F8F000710C1 /* Notifications.swift */,
155157
6DF9C2BD1C8F4FE5000710C1 /* Photos.swift */,
156158
6DF9C2B51C8F4F69000710C1 /* Reminders.swift */,
159+
3F21DC7C1E30B6DB00B3EF65 /* Siri.swift */,
157160
3D42A7DA1D5F66B300236ABA /* SpeechRecognizer.swift */,
158161
);
159162
path = PermissionTypes;
@@ -300,6 +303,7 @@
300303
6DF9C2B61C8F4F69000710C1 /* Reminders.swift in Sources */,
301304
6DF9C2AF1C8F4F2A000710C1 /* Contacts.swift in Sources */,
302305
6DF9C2C61C8F5B4C000710C1 /* Location.swift in Sources */,
306+
3F21DC7E1E30E0B900B3EF65 /* Siri.swift in Sources */,
303307
6DA8B4B21BFB8AD8007A94FC /* PermissionAlert.swift in Sources */,
304308
6C04FAF61CCA8F3A00B3F361 /* AddressBook.swift in Sources */,
305309
3D42A7DB1D5F66B300236ABA /* SpeechRecognizer.swift in Sources */,

PermissionConfiguration.xcconfig

+2-1
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ PERMISSION_PHOTOS = PERMISSION_PHOTOS
3535
PERMISSION_REMINDERS = PERMISSION_REMINDERS
3636
PERMISSION_SPEECH_RECOGNIZER = PERMISSION_SPEECH_RECOGNIZER
3737
PERMISSION_MEDIA_LIBRARY = PERMISSION_MEDIA_LIBRARY
38+
PERMISSION_SIRI = PERMISSION_SIRI
3839

3940
// Do not modify this line. Instead, remove comments above as needed to enable the categories your app uses.
40-
PERMISSION_FLAGS = $(PERMISSION_ADDRESS_BOOK) $(PERMISSION_BLUETOOTH) $(PERMISSION_CAMERA) $(PERMISSION_CONTACTS) $(PERMISSION_EVENTS) $(PERMISSION_LOCATION) $(PERMISSION_MICROPHONE) $(PERMISSION_MOTION) $(PERMISSION_NOTIFICATIONS) $(PERMISSION_PHOTOS) $(PERMISSION_REMINDERS) $(PERMISSION_SPEECH_RECOGNIZER) $(PERMISSION_MEDIA_LIBRARY)
41+
PERMISSION_FLAGS = $(PERMISSION_ADDRESS_BOOK) $(PERMISSION_BLUETOOTH) $(PERMISSION_CAMERA) $(PERMISSION_CONTACTS) $(PERMISSION_EVENTS) $(PERMISSION_LOCATION) $(PERMISSION_MICROPHONE) $(PERMISSION_MOTION) $(PERMISSION_NOTIFICATIONS) $(PERMISSION_PHOTOS) $(PERMISSION_REMINDERS) $(PERMISSION_SPEECH_RECOGNIZER) $(PERMISSION_MEDIA_LIBRARY) $(PERMISSION_SIRI)
4142

4243
SWIFT_ACTIVE_COMPILATION_CONDITIONS= $(inherited) $(PERMISSION_FLAGS)

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ permission.request { status in
5555
- [`LocationWhenInUse`](https://github.com/delba/Permission/blob/master/Source/PermissionTypes/LocationWhenInUse.swift)
5656
- [`MediaLibrary`](https://github.com/delba/Permission/blob/master/Source/PermissionTypes/MediaLibrary.swift)
5757
- [`SpeechRecognizer`](https://github.com/delba/Permission/blob/master/Source/PermissionTypes/SpeechRecognizer.swift)
58+
- [`Siri`](https://github.com/delba/Permission/blob/master/Source/PermissionTypes/Siri.swift)
5859

5960
#### PermissionAlert
6061

Source/Permission.swift

+17
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ open class Permission: NSObject {
9090
@available(iOS 9.3, *)
9191
open static let mediaLibrary = Permission(type: .mediaLibrary)
9292
#endif
93+
94+
#if PERMISSION_SIRI
95+
/// The permission to access the user's Siri.
96+
@available(iOS 10.0, *)
97+
open static let siri = Permission(type: .siri)
98+
#endif
9399

94100
#if PERMISSION_NOTIFICATIONS
95101
/// The permission to send notifications.
@@ -184,6 +190,10 @@ open class Permission: NSObject {
184190
if case .mediaLibrary = type { return statusMediaLibrary }
185191
#endif
186192

193+
#if PERMISSION_SIRI
194+
if case .siri = type { return statusSiri }
195+
#endif
196+
187197
fatalError()
188198
}
189199

@@ -345,6 +355,13 @@ open class Permission: NSObject {
345355
}
346356
#endif
347357

358+
#if PERMISSION_SIRI
359+
if case .siri = type {
360+
requestSiri(callback)
361+
return
362+
}
363+
#endif
364+
348365
fatalError()
349366
}
350367

Source/PermissionType.swift

+8
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ public enum PermissionType {
7575
#if PERMISSION_MEDIA_LIBRARY
7676
@available(iOS 9.3, *) case mediaLibrary
7777
#endif
78+
79+
#if PERMISSION_SIRI
80+
@available(iOS 10.0, *) case siri
81+
#endif
7882
}
7983

8084
extension PermissionType: CustomStringConvertible {
@@ -128,6 +132,10 @@ extension PermissionType: CustomStringConvertible {
128132
if case .speechRecognizer = self { return "Speech Recognizer" }
129133
#endif
130134

135+
#if PERMISSION_SIRI
136+
if case .siri = self { return "SiriKit" }
137+
#endif
138+
131139
#if PERMISSION_MEDIA_LIBRARY
132140
if case .mediaLibrary = self { return "Media Library" }
133141
#endif

Source/PermissionTypes/Siri.swift

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
//
2+
// Siri.swift
3+
//
4+
// Copyright (c) 2015-2017 Damien (http://delba.io)
5+
//
6+
// Permission is hereby granted, free of charge, to any person obtaining a copy
7+
// of this software and associated documentation files (the "Software"), to deal
8+
// in the Software without restriction, including without limitation the rights
9+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10+
// copies of the Software, and to permit persons to whom the Software is
11+
// furnished to do so, subject to the following conditions:
12+
//
13+
// The above copyright notice and this permission notice shall be included in all
14+
// copies or substantial portions of the Software.
15+
//
16+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22+
// SOFTWARE.
23+
//
24+
25+
#if PERMISSION_SIRI
26+
import Intents
27+
28+
internal extension Permission {
29+
var statusSiri: PermissionStatus {
30+
guard #available(iOS 10.0, *) else { fatalError() }
31+
let status = INPreferences.siriAuthorizationStatus()
32+
switch status {
33+
case .authorized: return .authorized
34+
case .restricted, .denied: return .denied
35+
case .notDetermined: return .notDetermined
36+
}
37+
}
38+
func requestSiri(_ callback: @escaping Callback) {
39+
guard #available(iOS 10.0, *) else { fatalError() }
40+
guard let _ = Bundle.main.object(forInfoDictionaryKey: .siriUsageDescription) else {
41+
print("WARNING: \(.siriUsageDescription) not found in Info.plist")
42+
return
43+
}
44+
INPreferences.requestSiriAuthorization({ (status) in
45+
callback(self.statusSiri)
46+
})
47+
}
48+
}
49+
#endif

Source/Supporting Files/Utilities.swift

+2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ internal extension String {
5656
static let photoLibraryUsageDescription = "NSPhotoLibraryUsageDescription"
5757
static let cameraUsageDescription = "NSCameraUsageDescription"
5858
static let mediaLibraryUsageDescription = "NSAppleMusicUsageDescription"
59+
static let siriUsageDescription = "NSSiriUsageDescription"
60+
5961

6062
static let requestedNotifications = "permission.requestedNotifications"
6163
static let requestedLocationAlwaysWithWhenInUse = "permission.requestedLocationAlwaysWithWhenInUse"

0 commit comments

Comments
 (0)