From e89fd0511f2ec49d1d4528a4468c1560ce3799ba Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Fri, 30 Sep 2016 18:07:25 +0200 Subject: [PATCH 01/22] Remove Health variant and add build flags for all categories First step towards solving #74. --- ISHPermissionKit.xcodeproj/project.pbxproj | 454 ------------------ ISHPermissionKit/ISHPermissionCategory.h | 232 +++++++-- .../Private/ISHPermissionRequestAddressBook.h | 4 + .../Private/ISHPermissionRequestContacts.h | 6 +- .../Private/ISHPermissionRequestEventStore.h | 4 + .../Private/ISHPermissionRequestLocation.h | 4 + .../Private/ISHPermissionRequestMicrophone.h | 4 + .../ISHPermissionRequestModernPhotoLibrary.h | 4 + .../Private/ISHPermissionRequestMotion.h | 4 + .../Private/ISHPermissionRequestPhotoCamera.h | 4 + .../ISHPermissionRequestPhotoLibrary.h | 4 + .../Private/ISHPermissionRequestSiri.h | 6 +- .../ISHPermissionRequestSpeechRecognition.h | 6 +- .../Requests/ISHPermissionRequest+All.m | 44 +- .../Requests/ISHPermissionRequestAccount.h | 4 + .../Requests/ISHPermissionRequestAccount.m | 4 + .../ISHPermissionRequestAddressBook.m | 4 + .../Requests/ISHPermissionRequestContacts.m | 4 + .../Requests/ISHPermissionRequestEventStore.m | 19 +- .../Requests/ISHPermissionRequestHealth.h | 5 + .../Requests/ISHPermissionRequestHealth.m | 36 +- .../Requests/ISHPermissionRequestLocation.m | 4 + .../Requests/ISHPermissionRequestMicrophone.m | 4 + .../ISHPermissionRequestModernPhotoLibrary.m | 7 +- .../Requests/ISHPermissionRequestMotion.m | 4 + .../ISHPermissionRequestNotificationsLocal.h | 7 +- .../ISHPermissionRequestNotificationsLocal.m | 6 + .../ISHPermissionRequestNotificationsRemote.h | 4 + .../ISHPermissionRequestNotificationsRemote.m | 6 + .../ISHPermissionRequestPhotoCamera.m | 4 + .../ISHPermissionRequestPhotoLibrary.m | 4 + .../Requests/ISHPermissionRequestSiri.m | 8 +- .../ISHPermissionRequestSpeechRecognition.m | 7 +- .../ISHPermissionRequestUserNotification.h | 7 +- .../ISHPermissionRequestUserNotification.m | 8 +- 35 files changed, 400 insertions(+), 536 deletions(-) diff --git a/ISHPermissionKit.xcodeproj/project.pbxproj b/ISHPermissionKit.xcodeproj/project.pbxproj index bbd4504..c4599ca 100644 --- a/ISHPermissionKit.xcodeproj/project.pbxproj +++ b/ISHPermissionKit.xcodeproj/project.pbxproj @@ -7,56 +7,31 @@ objects = { /* Begin PBXBuildFile section */ - 1B06A05A1D70949A00C7F8ED /* ISHPermissionKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC6A46B119D712AC00B11E88 /* ISHPermissionKit.framework */; }; - 1B06A05B1D70949A00C7F8ED /* ISHPermissionKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DC6A46B119D712AC00B11E88 /* ISHPermissionKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 1B09324A1D7069C70095A74A /* ISHPermissionRequestContacts.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B0932481D7069C70095A74A /* ISHPermissionRequestContacts.m */; }; 1B09324C1D7069D90095A74A /* ISHPermissionRequestContacts.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B09324B1D7069D90095A74A /* ISHPermissionRequestContacts.h */; }; 1B09324D1D7069D90095A74A /* ISHPermissionRequestContacts.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B09324B1D7069D90095A74A /* ISHPermissionRequestContacts.h */; }; - 1B09324E1D7069D90095A74A /* ISHPermissionRequestContacts.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B09324B1D7069D90095A74A /* ISHPermissionRequestContacts.h */; }; - 1B09324F1D7069D90095A74A /* ISHPermissionRequestContacts.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B09324B1D7069D90095A74A /* ISHPermissionRequestContacts.h */; }; 1B0932501D7069DF0095A74A /* ISHPermissionRequestContacts.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B0932481D7069C70095A74A /* ISHPermissionRequestContacts.m */; }; - 1B0932511D7069E00095A74A /* ISHPermissionRequestContacts.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B0932481D7069C70095A74A /* ISHPermissionRequestContacts.m */; }; - 1B0932521D7069E10095A74A /* ISHPermissionRequestContacts.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B0932481D7069C70095A74A /* ISHPermissionRequestContacts.m */; }; 1B20492F1D007F830042FF2E /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1B20492E1D007F830042FF2E /* Launch Screen.storyboard */; }; 1B4513001D6DC01200D6E47C /* ISHPermissionRequestSiri.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B4512FB1D6DC01200D6E47C /* ISHPermissionRequestSiri.m */; }; 1B4513011D6DC01200D6E47C /* ISHPermissionRequestSiri.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B4512FB1D6DC01200D6E47C /* ISHPermissionRequestSiri.m */; }; - 1B4513021D6DC01200D6E47C /* ISHPermissionRequestSiri.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B4512FB1D6DC01200D6E47C /* ISHPermissionRequestSiri.m */; }; - 1B4513031D6DC01200D6E47C /* ISHPermissionRequestSiri.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B4512FB1D6DC01200D6E47C /* ISHPermissionRequestSiri.m */; }; 1B4513051D6DC02D00D6E47C /* ISHPermissionRequestSiri.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B4513041D6DC02D00D6E47C /* ISHPermissionRequestSiri.h */; }; 1B4513061D6DC02D00D6E47C /* ISHPermissionRequestSiri.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B4513041D6DC02D00D6E47C /* ISHPermissionRequestSiri.h */; }; - 1B4513071D6DC02D00D6E47C /* ISHPermissionRequestSiri.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B4513041D6DC02D00D6E47C /* ISHPermissionRequestSiri.h */; }; - 1B4513081D6DC02D00D6E47C /* ISHPermissionRequestSiri.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B4513041D6DC02D00D6E47C /* ISHPermissionRequestSiri.h */; }; 1B63F8981D6DF5F200B14122 /* ISHPermissionRequestModernPhotoLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B63F8931D6DF5F200B14122 /* ISHPermissionRequestModernPhotoLibrary.m */; }; 1B63F8991D6DF5F200B14122 /* ISHPermissionRequestModernPhotoLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B63F8931D6DF5F200B14122 /* ISHPermissionRequestModernPhotoLibrary.m */; }; - 1B63F89A1D6DF5F200B14122 /* ISHPermissionRequestModernPhotoLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B63F8931D6DF5F200B14122 /* ISHPermissionRequestModernPhotoLibrary.m */; }; - 1B63F89B1D6DF5F200B14122 /* ISHPermissionRequestModernPhotoLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B63F8931D6DF5F200B14122 /* ISHPermissionRequestModernPhotoLibrary.m */; }; 1B63F89D1D6DF60500B14122 /* ISHPermissionRequestModernPhotoLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B63F89C1D6DF60500B14122 /* ISHPermissionRequestModernPhotoLibrary.h */; }; 1B63F89E1D6DF60500B14122 /* ISHPermissionRequestModernPhotoLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B63F89C1D6DF60500B14122 /* ISHPermissionRequestModernPhotoLibrary.h */; }; - 1B63F89F1D6DF60500B14122 /* ISHPermissionRequestModernPhotoLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B63F89C1D6DF60500B14122 /* ISHPermissionRequestModernPhotoLibrary.h */; }; - 1B63F8A01D6DF60500B14122 /* ISHPermissionRequestModernPhotoLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B63F89C1D6DF60500B14122 /* ISHPermissionRequestModernPhotoLibrary.h */; }; 1B69884B1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B6988491D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.h */; }; 1B69884C1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B69884A1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.m */; }; 1B69884D1D6F57DD00C8EAB8 /* ISHPermissionRequestUserNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B69884A1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.m */; }; - 1B69884E1D6F57DF00C8EAB8 /* ISHPermissionRequestUserNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B69884A1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.m */; }; - 1B69884F1D6F57DF00C8EAB8 /* ISHPermissionRequestUserNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B69884A1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.m */; }; 1B96D5FB1D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B96D5F61D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m */; }; 1B96D5FC1D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B96D5F61D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m */; }; - 1B96D5FD1D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B96D5F61D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m */; }; - 1B96D5FE1D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B96D5F61D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m */; }; 1B96D6001D6F12CF0026A4FC /* ISHPermissionRequestSpeechRecognition.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B96D5FF1D6F12CF0026A4FC /* ISHPermissionRequestSpeechRecognition.h */; }; 1B96D6011D6F12CF0026A4FC /* ISHPermissionRequestSpeechRecognition.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B96D5FF1D6F12CF0026A4FC /* ISHPermissionRequestSpeechRecognition.h */; }; - 1B96D6021D6F12CF0026A4FC /* ISHPermissionRequestSpeechRecognition.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B96D5FF1D6F12CF0026A4FC /* ISHPermissionRequestSpeechRecognition.h */; }; - 1B96D6031D6F12CF0026A4FC /* ISHPermissionRequestSpeechRecognition.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B96D5FF1D6F12CF0026A4FC /* ISHPermissionRequestSpeechRecognition.h */; }; 1BAB47F01D6F36FD00872D79 /* Speech.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1BAB47C11D6F31F300872D79 /* Speech.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; - 1BAB47F11D6F370600872D79 /* Speech.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1BAB47C11D6F31F300872D79 /* Speech.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 1BC93E4E1D7063D20033B6E8 /* ISHPermissionRequestMusicLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BC93E491D7063D20033B6E8 /* ISHPermissionRequestMusicLibrary.m */; }; 1BC93E4F1D7063D20033B6E8 /* ISHPermissionRequestMusicLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BC93E491D7063D20033B6E8 /* ISHPermissionRequestMusicLibrary.m */; }; - 1BC93E501D7063D20033B6E8 /* ISHPermissionRequestMusicLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BC93E491D7063D20033B6E8 /* ISHPermissionRequestMusicLibrary.m */; }; - 1BC93E511D7063D20033B6E8 /* ISHPermissionRequestMusicLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BC93E491D7063D20033B6E8 /* ISHPermissionRequestMusicLibrary.m */; }; 1BC93E531D7063F10033B6E8 /* ISHPermissionRequestMusicLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BC93E521D7063F10033B6E8 /* ISHPermissionRequestMusicLibrary.h */; }; 1BC93E541D7063F10033B6E8 /* ISHPermissionRequestMusicLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BC93E521D7063F10033B6E8 /* ISHPermissionRequestMusicLibrary.h */; }; - 1BC93E551D7063F10033B6E8 /* ISHPermissionRequestMusicLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BC93E521D7063F10033B6E8 /* ISHPermissionRequestMusicLibrary.h */; }; - 1BC93E561D7063F10033B6E8 /* ISHPermissionRequestMusicLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BC93E521D7063F10033B6E8 /* ISHPermissionRequestMusicLibrary.h */; }; DC1A80A3195B21DC0069235F /* ISHPermissionsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = DC1A80A1195B21DC0069235F /* ISHPermissionsViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC1A80A4195B21DC0069235F /* ISHPermissionsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DC1A80A2195B21DC0069235F /* ISHPermissionsViewController.m */; }; DC1A80A9195B22A10069235F /* ISHPermissionCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = DC1A80A8195B22A10069235F /* ISHPermissionCategory.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -77,72 +52,6 @@ DC5E5BC4195DAD750092EAFD /* ISHPermissionRequestNotificationsLocal.m in Sources */ = {isa = PBXBuildFile; fileRef = DC5E5BC2195DAD750092EAFD /* ISHPermissionRequestNotificationsLocal.m */; }; DC5E5BC5195DAD770092EAFD /* ISHPermissionRequestNotificationsLocal.m in Sources */ = {isa = PBXBuildFile; fileRef = DC5E5BC2195DAD750092EAFD /* ISHPermissionRequestNotificationsLocal.m */; }; DC5E5BC7195DC1F50092EAFD /* ISHPermissionRequest+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = DC5E5BC6195DC1F30092EAFD /* ISHPermissionRequest+Private.h */; }; - DC6A466019D7125300B11E88 /* ISHPermissionRequestNotificationsLocal.m in Sources */ = {isa = PBXBuildFile; fileRef = DC5E5BC2195DAD750092EAFD /* ISHPermissionRequestNotificationsLocal.m */; }; - DC6A466119D7125300B11E88 /* ISHPermissionRequestAddressBook.m in Sources */ = {isa = PBXBuildFile; fileRef = DC6A8ACC19641549005AC5BD /* ISHPermissionRequestAddressBook.m */; }; - DC6A466219D7125300B11E88 /* ISHPermissionRequestPhotoCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = DC5E5BB7195D78800092EAFD /* ISHPermissionRequestPhotoCamera.m */; }; - DC6A466319D7125300B11E88 /* ISHPermissionRequestLocation.m in Sources */ = {isa = PBXBuildFile; fileRef = DC799EBE195C186100A0CA36 /* ISHPermissionRequestLocation.m */; }; - DC6A466419D7125300B11E88 /* ISHPermissionRequestHealth.m in Sources */ = {isa = PBXBuildFile; fileRef = DCD56C7C1962BB8600508F4A /* ISHPermissionRequestHealth.m */; }; - DC6A466519D7125300B11E88 /* ISHPermissionRequestViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DC1A80AF195B2C960069235F /* ISHPermissionRequestViewController.m */; }; - DC6A466619D7125300B11E88 /* ISHPermissionRequestPhotoLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = DC5E5BB2195D6E890092EAFD /* ISHPermissionRequestPhotoLibrary.m */; }; - DC6A466719D7125300B11E88 /* ISHPermissionRequestMotion.m in Sources */ = {isa = PBXBuildFile; fileRef = DCAEF7C0195C5B6B0074EB5B /* ISHPermissionRequestMotion.m */; }; - DC6A466819D7125300B11E88 /* ISHPermissionRequestMicrophone.m in Sources */ = {isa = PBXBuildFile; fileRef = DC5E5BAD195D67500092EAFD /* ISHPermissionRequestMicrophone.m */; }; - DC6A466919D7125300B11E88 /* ISHPermissionsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DC1A80A2195B21DC0069235F /* ISHPermissionsViewController.m */; }; - DC6A466A19D7125300B11E88 /* ISHPermissionRequestEventStore.m in Sources */ = {isa = PBXBuildFile; fileRef = DC6A8AD219642793005AC5BD /* ISHPermissionRequestEventStore.m */; }; - DC6A466B19D7125300B11E88 /* ISHPermissionRequest+All.m in Sources */ = {isa = PBXBuildFile; fileRef = DC799EC3195C19CD00A0CA36 /* ISHPermissionRequest+All.m */; }; - DC6A466C19D7125300B11E88 /* ISHPermissionRequestAccount.m in Sources */ = {isa = PBXBuildFile; fileRef = DCD56C771962AEDC00508F4A /* ISHPermissionRequestAccount.m */; }; - DC6A466D19D7125300B11E88 /* ISHPermissionRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = DC1A80AB195B23640069235F /* ISHPermissionRequest.m */; }; - DC6A467019D7125300B11E88 /* ISHPermissionRequestAddressBook.h in Headers */ = {isa = PBXBuildFile; fileRef = DC6A8ACB19641549005AC5BD /* ISHPermissionRequestAddressBook.h */; }; - DC6A467119D7125300B11E88 /* ISHPermissionKit.h in Headers */ = {isa = PBXBuildFile; fileRef = DCC1BFAA195B174200362559 /* ISHPermissionKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A467219D7125300B11E88 /* ISHPermissionRequest+All.h in Headers */ = {isa = PBXBuildFile; fileRef = DC799EC2195C19CD00A0CA36 /* ISHPermissionRequest+All.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A467319D7125300B11E88 /* ISHPermissionRequestViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = DC1A80AE195B2C960069235F /* ISHPermissionRequestViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A467419D7125300B11E88 /* ISHPermissionsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = DC1A80A1195B21DC0069235F /* ISHPermissionsViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A467519D7125300B11E88 /* ISHPermissionCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = DC1A80A8195B22A10069235F /* ISHPermissionCategory.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A467619D7125300B11E88 /* ISHPermissionRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = DC1A80AA195B23640069235F /* ISHPermissionRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A467719D7125300B11E88 /* ISHPermissionRequestAccount.h in Headers */ = {isa = PBXBuildFile; fileRef = DCD56C761962AEDC00508F4A /* ISHPermissionRequestAccount.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A467819D7125300B11E88 /* ISHPermissionRequestHealth.h in Headers */ = {isa = PBXBuildFile; fileRef = DCD56C7B1962BB8600508F4A /* ISHPermissionRequestHealth.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A467919D7125300B11E88 /* ISHPermissionRequestNotificationsLocal.h in Headers */ = {isa = PBXBuildFile; fileRef = DC5E5BC1195DAD750092EAFD /* ISHPermissionRequestNotificationsLocal.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A467A19D7125300B11E88 /* ISHPermissionRequestEventStore.h in Headers */ = {isa = PBXBuildFile; fileRef = DC6A8AD119642793005AC5BD /* ISHPermissionRequestEventStore.h */; }; - DC6A467B19D7125300B11E88 /* ISHPermissionRequestViewController+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = DC799EB3195C0CF300A0CA36 /* ISHPermissionRequestViewController+Private.h */; }; - DC6A467C19D7125300B11E88 /* ISHPermissionRequestViewControllerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = DC799EB5195C113900A0CA36 /* ISHPermissionRequestViewControllerDelegate.h */; }; - DC6A467D19D7125300B11E88 /* ISHPermissionRequest+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = DC5E5BC6195DC1F30092EAFD /* ISHPermissionRequest+Private.h */; }; - DC6A467E19D7125300B11E88 /* ISHPermissionRequestLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = DC799EBD195C186100A0CA36 /* ISHPermissionRequestLocation.h */; }; - DC6A467F19D7125300B11E88 /* ISHPermissionRequestMicrophone.h in Headers */ = {isa = PBXBuildFile; fileRef = DC5E5BAC195D67500092EAFD /* ISHPermissionRequestMicrophone.h */; }; - DC6A468019D7125300B11E88 /* ISHPermissionRequestMotion.h in Headers */ = {isa = PBXBuildFile; fileRef = DCAEF7BF195C5B6B0074EB5B /* ISHPermissionRequestMotion.h */; }; - DC6A468119D7125300B11E88 /* ISHPermissionRequestPhotoCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = DC5E5BB6195D78800092EAFD /* ISHPermissionRequestPhotoCamera.h */; }; - DC6A468219D7125300B11E88 /* ISHPermissionRequestPhotoLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = DC5E5BB1195D6E890092EAFD /* ISHPermissionRequestPhotoLibrary.h */; }; - DC6A468A19D712AC00B11E88 /* ISHPermissionRequestNotificationsLocal.m in Sources */ = {isa = PBXBuildFile; fileRef = DC5E5BC2195DAD750092EAFD /* ISHPermissionRequestNotificationsLocal.m */; }; - DC6A468B19D712AC00B11E88 /* ISHPermissionRequestAddressBook.m in Sources */ = {isa = PBXBuildFile; fileRef = DC6A8ACC19641549005AC5BD /* ISHPermissionRequestAddressBook.m */; }; - DC6A468C19D712AC00B11E88 /* ISHPermissionRequestPhotoCamera.m in Sources */ = {isa = PBXBuildFile; fileRef = DC5E5BB7195D78800092EAFD /* ISHPermissionRequestPhotoCamera.m */; }; - DC6A468D19D712AC00B11E88 /* ISHPermissionRequest+All.m in Sources */ = {isa = PBXBuildFile; fileRef = DC799EC3195C19CD00A0CA36 /* ISHPermissionRequest+All.m */; }; - DC6A468E19D712AC00B11E88 /* ISHPermissionRequestHealth.m in Sources */ = {isa = PBXBuildFile; fileRef = DCD56C7C1962BB8600508F4A /* ISHPermissionRequestHealth.m */; }; - DC6A468F19D712AC00B11E88 /* ISHPermissionRequestMotion.m in Sources */ = {isa = PBXBuildFile; fileRef = DCAEF7C0195C5B6B0074EB5B /* ISHPermissionRequestMotion.m */; }; - DC6A469019D712AC00B11E88 /* ISHPermissionRequestPhotoLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = DC5E5BB2195D6E890092EAFD /* ISHPermissionRequestPhotoLibrary.m */; }; - DC6A469119D712AC00B11E88 /* ISHPermissionRequestLocation.m in Sources */ = {isa = PBXBuildFile; fileRef = DC799EBE195C186100A0CA36 /* ISHPermissionRequestLocation.m */; }; - DC6A469219D712AC00B11E88 /* ISHPermissionRequestMicrophone.m in Sources */ = {isa = PBXBuildFile; fileRef = DC5E5BAD195D67500092EAFD /* ISHPermissionRequestMicrophone.m */; }; - DC6A469319D712AC00B11E88 /* ISHPermissionsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DC1A80A2195B21DC0069235F /* ISHPermissionsViewController.m */; }; - DC6A469419D712AC00B11E88 /* ISHPermissionRequestEventStore.m in Sources */ = {isa = PBXBuildFile; fileRef = DC6A8AD219642793005AC5BD /* ISHPermissionRequestEventStore.m */; }; - DC6A469519D712AC00B11E88 /* ISHPermissionRequestViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DC1A80AF195B2C960069235F /* ISHPermissionRequestViewController.m */; }; - DC6A469619D712AC00B11E88 /* ISHPermissionRequestAccount.m in Sources */ = {isa = PBXBuildFile; fileRef = DCD56C771962AEDC00508F4A /* ISHPermissionRequestAccount.m */; }; - DC6A469719D712AC00B11E88 /* ISHPermissionRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = DC1A80AB195B23640069235F /* ISHPermissionRequest.m */; }; - DC6A469A19D712AC00B11E88 /* ISHPermissionRequestAddressBook.h in Headers */ = {isa = PBXBuildFile; fileRef = DC6A8ACB19641549005AC5BD /* ISHPermissionRequestAddressBook.h */; }; - DC6A469B19D712AC00B11E88 /* ISHPermissionRequest+All.h in Headers */ = {isa = PBXBuildFile; fileRef = DC799EC2195C19CD00A0CA36 /* ISHPermissionRequest+All.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A469C19D712AC00B11E88 /* ISHPermissionKit.h in Headers */ = {isa = PBXBuildFile; fileRef = DCC1BFAA195B174200362559 /* ISHPermissionKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A469D19D712AC00B11E88 /* ISHPermissionsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = DC1A80A1195B21DC0069235F /* ISHPermissionsViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A469E19D712AC00B11E88 /* ISHPermissionRequestViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = DC1A80AE195B2C960069235F /* ISHPermissionRequestViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A469F19D712AC00B11E88 /* ISHPermissionRequestPhotoLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = DC5E5BB1195D6E890092EAFD /* ISHPermissionRequestPhotoLibrary.h */; }; - DC6A46A019D712AC00B11E88 /* ISHPermissionRequestMicrophone.h in Headers */ = {isa = PBXBuildFile; fileRef = DC5E5BAC195D67500092EAFD /* ISHPermissionRequestMicrophone.h */; }; - DC6A46A119D712AC00B11E88 /* ISHPermissionRequestAccount.h in Headers */ = {isa = PBXBuildFile; fileRef = DCD56C761962AEDC00508F4A /* ISHPermissionRequestAccount.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A46A219D712AC00B11E88 /* ISHPermissionRequestLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = DC799EBD195C186100A0CA36 /* ISHPermissionRequestLocation.h */; }; - DC6A46A319D712AC00B11E88 /* ISHPermissionRequestMotion.h in Headers */ = {isa = PBXBuildFile; fileRef = DCAEF7BF195C5B6B0074EB5B /* ISHPermissionRequestMotion.h */; }; - DC6A46A419D712AC00B11E88 /* ISHPermissionRequestEventStore.h in Headers */ = {isa = PBXBuildFile; fileRef = DC6A8AD119642793005AC5BD /* ISHPermissionRequestEventStore.h */; }; - DC6A46A519D712AC00B11E88 /* ISHPermissionRequestViewController+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = DC799EB3195C0CF300A0CA36 /* ISHPermissionRequestViewController+Private.h */; }; - DC6A46A619D712AC00B11E88 /* ISHPermissionRequestNotificationsLocal.h in Headers */ = {isa = PBXBuildFile; fileRef = DC5E5BC1195DAD750092EAFD /* ISHPermissionRequestNotificationsLocal.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A46A719D712AC00B11E88 /* ISHPermissionRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = DC1A80AA195B23640069235F /* ISHPermissionRequest.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A46A819D712AC00B11E88 /* ISHPermissionRequest+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = DC5E5BC6195DC1F30092EAFD /* ISHPermissionRequest+Private.h */; }; - DC6A46A919D712AC00B11E88 /* ISHPermissionCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = DC1A80A8195B22A10069235F /* ISHPermissionCategory.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC6A46AA19D712AC00B11E88 /* ISHPermissionRequestViewControllerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = DC799EB5195C113900A0CA36 /* ISHPermissionRequestViewControllerDelegate.h */; }; - DC6A46AB19D712AC00B11E88 /* ISHPermissionRequestPhotoCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = DC5E5BB6195D78800092EAFD /* ISHPermissionRequestPhotoCamera.h */; }; - DC6A46AC19D712AC00B11E88 /* ISHPermissionRequestHealth.h in Headers */ = {isa = PBXBuildFile; fileRef = DCD56C7B1962BB8600508F4A /* ISHPermissionRequestHealth.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC6A8A7D19633180005AC5BD /* ISHPermissionCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = DC1A80A8195B22A10069235F /* ISHPermissionCategory.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC6A8A7E19633180005AC5BD /* ISHPermissionKit.h in Headers */ = {isa = PBXBuildFile; fileRef = DCC1BFAA195B174200362559 /* ISHPermissionKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC6A8A7F19633180005AC5BD /* ISHPermissionRequestViewController+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = DC799EB3195C0CF300A0CA36 /* ISHPermissionRequestViewController+Private.h */; }; @@ -176,12 +85,8 @@ DC799EC5195C19CD00A0CA36 /* ISHPermissionRequest+All.m in Sources */ = {isa = PBXBuildFile; fileRef = DC799EC3195C19CD00A0CA36 /* ISHPermissionRequest+All.m */; }; DC96E8CE1B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.h in Headers */ = {isa = PBXBuildFile; fileRef = DC96E8CC1B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC96E8CF1B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.h in Headers */ = {isa = PBXBuildFile; fileRef = DC96E8CC1B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC96E8D01B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.h in Headers */ = {isa = PBXBuildFile; fileRef = DC96E8CC1B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DC96E8D11B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.h in Headers */ = {isa = PBXBuildFile; fileRef = DC96E8CC1B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC96E8D21B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.m in Sources */ = {isa = PBXBuildFile; fileRef = DC96E8CD1B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.m */; }; DC96E8D31B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.m in Sources */ = {isa = PBXBuildFile; fileRef = DC96E8CD1B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.m */; }; - DC96E8D41B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.m in Sources */ = {isa = PBXBuildFile; fileRef = DC96E8CD1B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.m */; }; - DC96E8D51B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.m in Sources */ = {isa = PBXBuildFile; fileRef = DC96E8CD1B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.m */; }; DCAEF7C1195C5B6B0074EB5B /* ISHPermissionRequestMotion.h in Headers */ = {isa = PBXBuildFile; fileRef = DCAEF7BF195C5B6B0074EB5B /* ISHPermissionRequestMotion.h */; }; DCAEF7C2195C5B6B0074EB5B /* ISHPermissionRequestMotion.m in Sources */ = {isa = PBXBuildFile; fileRef = DCAEF7C0195C5B6B0074EB5B /* ISHPermissionRequestMotion.m */; }; DCAEF7E1195C60250074EB5B /* ISHPermissionRequestViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DC1A80AF195B2C960069235F /* ISHPermissionRequestViewController.m */; }; @@ -203,43 +108,10 @@ DCD56C7F1962BB8600508F4A /* ISHPermissionRequestHealth.m in Sources */ = {isa = PBXBuildFile; fileRef = DCD56C7C1962BB8600508F4A /* ISHPermissionRequestHealth.m */; }; DCDB31081D0AC0B9005E9A71 /* GrantedPermissionsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DCDB31071D0AC0B9005E9A71 /* GrantedPermissionsViewController.m */; }; DCDB31091D0AFBBD005E9A71 /* ISHPermissionKitTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DCC1BFB7195B174200362559 /* ISHPermissionKitTests.m */; }; - DCDB310C1D0AFCB2005E9A71 /* ISHPermissionKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC6A46B119D712AC00B11E88 /* ISHPermissionKit.framework */; }; - DCDB310F1D0AFCC0005E9A71 /* libISHPermissionKitLib+HealthKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = DC6A468719D7125300B11E88 /* libISHPermissionKitLib+HealthKit.a */; }; DCF18617195C2B1B00CC155E /* SamplePermissionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DCF18615195C2B1B00CC155E /* SamplePermissionViewController.m */; }; DCF18618195C2B1B00CC155E /* SamplePermissionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = DCF18616195C2B1B00CC155E /* SamplePermissionViewController.xib */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - 1B06A05C1D70949A00C7F8ED /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DCC1BF9C195B174200362559 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DC6A468819D712AC00B11E88; - remoteInfo = "ISHPermissionKit+HealthKit"; - }; - DC6A46B319D94E2700B11E88 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DCC1BF9C195B174200362559 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DC6A465E19D7125300B11E88; - remoteInfo = "ISHPermissionKitLib+HealthKit"; - }; - DCDB310A1D0AFCA2005E9A71 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DCC1BF9C195B174200362559 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DC6A468819D712AC00B11E88; - remoteInfo = "ISHPermissionKit+HealthKit"; - }; - DCDB310D1D0AFCBD005E9A71 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DCC1BF9C195B174200362559 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DC6A465E19D7125300B11E88; - remoteInfo = "ISHPermissionKitLib+HealthKit"; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXCopyFilesBuildPhase section */ 1B06A05E1D70949A00C7F8ED /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; @@ -247,20 +119,10 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 1B06A05B1D70949A00C7F8ED /* ISHPermissionKit.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; - DC6A468319D7125300B11E88 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; DCAEF7C8195C60070074EB5B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -307,8 +169,6 @@ DC5E5BC1195DAD750092EAFD /* ISHPermissionRequestNotificationsLocal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ISHPermissionRequestNotificationsLocal.h; sourceTree = ""; }; DC5E5BC2195DAD750092EAFD /* ISHPermissionRequestNotificationsLocal.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionRequestNotificationsLocal.m; sourceTree = ""; }; DC5E5BC6195DC1F30092EAFD /* ISHPermissionRequest+Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "ISHPermissionRequest+Private.h"; path = "../Private/ISHPermissionRequest+Private.h"; sourceTree = ""; }; - DC6A468719D7125300B11E88 /* libISHPermissionKitLib+HealthKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libISHPermissionKitLib+HealthKit.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - DC6A46B119D712AC00B11E88 /* ISHPermissionKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ISHPermissionKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DC6A8ACB19641549005AC5BD /* ISHPermissionRequestAddressBook.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ISHPermissionRequestAddressBook.h; path = ../Private/ISHPermissionRequestAddressBook.h; sourceTree = ""; }; DC6A8ACC19641549005AC5BD /* ISHPermissionRequestAddressBook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionRequestAddressBook.m; sourceTree = ""; }; DC6A8AD119642793005AC5BD /* ISHPermissionRequestEventStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ISHPermissionRequestEventStore.h; path = ../Private/ISHPermissionRequestEventStore.h; sourceTree = ""; }; @@ -350,26 +210,10 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - DC6A466E19D7125300B11E88 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DC6A469819D712AC00B11E88 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1BAB47F11D6F370600872D79 /* Speech.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; DC7790B019617CD7007CB2BC /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DCDB310F1D0AFCC0005E9A71 /* libISHPermissionKitLib+HealthKit.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -392,7 +236,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DCDB310C1D0AFCB2005E9A71 /* ISHPermissionKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -400,7 +243,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1B06A05A1D70949A00C7F8ED /* ISHPermissionKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -501,8 +343,6 @@ DCC1BFC5195B176E00362559 /* PermissionsTestApp.app */, DCAEF7CA195C60070074EB5B /* libISHPermissionKitLib.a */, DC7790B319617CD7007CB2BC /* ISHPermissionKitLibTests.xctest */, - DC6A468719D7125300B11E88 /* libISHPermissionKitLib+HealthKit.a */, - DC6A46B119D712AC00B11E88 /* ISHPermissionKit.framework */, ); name = Products; sourceTree = ""; @@ -578,70 +418,6 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - DC6A466F19D7125300B11E88 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - DC6A467019D7125300B11E88 /* ISHPermissionRequestAddressBook.h in Headers */, - DC6A467119D7125300B11E88 /* ISHPermissionKit.h in Headers */, - DC6A467219D7125300B11E88 /* ISHPermissionRequest+All.h in Headers */, - 1B09324E1D7069D90095A74A /* ISHPermissionRequestContacts.h in Headers */, - DC6A467319D7125300B11E88 /* ISHPermissionRequestViewController.h in Headers */, - DC6A467419D7125300B11E88 /* ISHPermissionsViewController.h in Headers */, - DC6A467519D7125300B11E88 /* ISHPermissionCategory.h in Headers */, - DC6A467619D7125300B11E88 /* ISHPermissionRequest.h in Headers */, - DC6A467719D7125300B11E88 /* ISHPermissionRequestAccount.h in Headers */, - DC6A467819D7125300B11E88 /* ISHPermissionRequestHealth.h in Headers */, - 1B63F89F1D6DF60500B14122 /* ISHPermissionRequestModernPhotoLibrary.h in Headers */, - DC6A467919D7125300B11E88 /* ISHPermissionRequestNotificationsLocal.h in Headers */, - DC6A467A19D7125300B11E88 /* ISHPermissionRequestEventStore.h in Headers */, - DC96E8D01B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.h in Headers */, - DC6A467B19D7125300B11E88 /* ISHPermissionRequestViewController+Private.h in Headers */, - DC6A467C19D7125300B11E88 /* ISHPermissionRequestViewControllerDelegate.h in Headers */, - DC6A467D19D7125300B11E88 /* ISHPermissionRequest+Private.h in Headers */, - DC6A467E19D7125300B11E88 /* ISHPermissionRequestLocation.h in Headers */, - DC6A467F19D7125300B11E88 /* ISHPermissionRequestMicrophone.h in Headers */, - 1BC93E551D7063F10033B6E8 /* ISHPermissionRequestMusicLibrary.h in Headers */, - 1B4513071D6DC02D00D6E47C /* ISHPermissionRequestSiri.h in Headers */, - 1B96D6021D6F12CF0026A4FC /* ISHPermissionRequestSpeechRecognition.h in Headers */, - DC6A468019D7125300B11E88 /* ISHPermissionRequestMotion.h in Headers */, - DC6A468119D7125300B11E88 /* ISHPermissionRequestPhotoCamera.h in Headers */, - DC6A468219D7125300B11E88 /* ISHPermissionRequestPhotoLibrary.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DC6A469919D712AC00B11E88 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - DC6A469A19D712AC00B11E88 /* ISHPermissionRequestAddressBook.h in Headers */, - DC6A469B19D712AC00B11E88 /* ISHPermissionRequest+All.h in Headers */, - DC6A469C19D712AC00B11E88 /* ISHPermissionKit.h in Headers */, - 1B09324F1D7069D90095A74A /* ISHPermissionRequestContacts.h in Headers */, - DC6A469D19D712AC00B11E88 /* ISHPermissionsViewController.h in Headers */, - DC6A469E19D712AC00B11E88 /* ISHPermissionRequestViewController.h in Headers */, - DC6A469F19D712AC00B11E88 /* ISHPermissionRequestPhotoLibrary.h in Headers */, - DC6A46A019D712AC00B11E88 /* ISHPermissionRequestMicrophone.h in Headers */, - DC6A46A119D712AC00B11E88 /* ISHPermissionRequestAccount.h in Headers */, - DC6A46A219D712AC00B11E88 /* ISHPermissionRequestLocation.h in Headers */, - 1B63F8A01D6DF60500B14122 /* ISHPermissionRequestModernPhotoLibrary.h in Headers */, - DC6A46A319D712AC00B11E88 /* ISHPermissionRequestMotion.h in Headers */, - DC6A46A419D712AC00B11E88 /* ISHPermissionRequestEventStore.h in Headers */, - DC96E8D11B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.h in Headers */, - DC6A46A519D712AC00B11E88 /* ISHPermissionRequestViewController+Private.h in Headers */, - DC6A46A619D712AC00B11E88 /* ISHPermissionRequestNotificationsLocal.h in Headers */, - DC6A46A719D712AC00B11E88 /* ISHPermissionRequest.h in Headers */, - DC6A46A819D712AC00B11E88 /* ISHPermissionRequest+Private.h in Headers */, - DC6A46A919D712AC00B11E88 /* ISHPermissionCategory.h in Headers */, - 1BC93E561D7063F10033B6E8 /* ISHPermissionRequestMusicLibrary.h in Headers */, - 1B4513081D6DC02D00D6E47C /* ISHPermissionRequestSiri.h in Headers */, - 1B96D6031D6F12CF0026A4FC /* ISHPermissionRequestSpeechRecognition.h in Headers */, - DC6A46AA19D712AC00B11E88 /* ISHPermissionRequestViewControllerDelegate.h in Headers */, - DC6A46AB19D712AC00B11E88 /* ISHPermissionRequestPhotoCamera.h in Headers */, - DC6A46AC19D712AC00B11E88 /* ISHPermissionRequestHealth.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; DC6A8A7C19633164005AC5BD /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -710,42 +486,6 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - DC6A465E19D7125300B11E88 /* ISHPermissionKitLib+HealthKit */ = { - isa = PBXNativeTarget; - buildConfigurationList = DC6A468419D7125300B11E88 /* Build configuration list for PBXNativeTarget "ISHPermissionKitLib+HealthKit" */; - buildPhases = ( - DC6A465F19D7125300B11E88 /* Sources */, - DC6A466E19D7125300B11E88 /* Frameworks */, - DC6A466F19D7125300B11E88 /* Headers */, - DC6A468319D7125300B11E88 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "ISHPermissionKitLib+HealthKit"; - productName = ISHPermissionKitLib; - productReference = DC6A468719D7125300B11E88 /* libISHPermissionKitLib+HealthKit.a */; - productType = "com.apple.product-type.library.static"; - }; - DC6A468819D712AC00B11E88 /* ISHPermissionKit+HealthKit */ = { - isa = PBXNativeTarget; - buildConfigurationList = DC6A46AE19D712AC00B11E88 /* Build configuration list for PBXNativeTarget "ISHPermissionKit+HealthKit" */; - buildPhases = ( - DC6A468919D712AC00B11E88 /* Sources */, - DC6A469819D712AC00B11E88 /* Frameworks */, - DC6A469919D712AC00B11E88 /* Headers */, - DC6A46AD19D712AC00B11E88 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "ISHPermissionKit+HealthKit"; - productName = ISHPermissionKit; - productReference = DC6A46B119D712AC00B11E88 /* ISHPermissionKit.framework */; - productType = "com.apple.product-type.framework"; - }; DC7790B219617CD7007CB2BC /* ISHPermissionKitLibTests */ = { isa = PBXNativeTarget; buildConfigurationList = DC7790BE19617CD7007CB2BC /* Build configuration list for PBXNativeTarget "ISHPermissionKitLibTests" */; @@ -757,7 +497,6 @@ buildRules = ( ); dependencies = ( - DCDB310E1D0AFCBD005E9A71 /* PBXTargetDependency */, ); name = ISHPermissionKitLibTests; productName = ISHPermissionKitLibTests; @@ -811,7 +550,6 @@ buildRules = ( ); dependencies = ( - DCDB310B1D0AFCA2005E9A71 /* PBXTargetDependency */, ); name = ISHPermissionKitTests; productName = ISHPermissionKitTests; @@ -830,8 +568,6 @@ buildRules = ( ); dependencies = ( - DC6A46B419D94E2700B11E88 /* PBXTargetDependency */, - 1B06A05D1D70949A00C7F8ED /* PBXTargetDependency */, ); name = PermissionsTestApp; productName = PermissionsTestApp; @@ -879,9 +615,7 @@ projectRoot = ""; targets = ( DCC1BFA4195B174200362559 /* ISHPermissionKit */, - DC6A468819D712AC00B11E88 /* ISHPermissionKit+HealthKit */, DCAEF7C9195C60070074EB5B /* ISHPermissionKitLib */, - DC6A465E19D7125300B11E88 /* ISHPermissionKitLib+HealthKit */, DCC1BFC4195B176E00362559 /* PermissionsTestApp */, DCC1BFAF195B174200362559 /* ISHPermissionKitTests */, DC7790B219617CD7007CB2BC /* ISHPermissionKitLibTests */, @@ -890,13 +624,6 @@ /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - DC6A46AD19D712AC00B11E88 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; DC7790B119617CD7007CB2BC /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -931,62 +658,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - DC6A465F19D7125300B11E88 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DC6A466019D7125300B11E88 /* ISHPermissionRequestNotificationsLocal.m in Sources */, - DC6A466119D7125300B11E88 /* ISHPermissionRequestAddressBook.m in Sources */, - 1B4513021D6DC01200D6E47C /* ISHPermissionRequestSiri.m in Sources */, - DC6A466219D7125300B11E88 /* ISHPermissionRequestPhotoCamera.m in Sources */, - DC6A466319D7125300B11E88 /* ISHPermissionRequestLocation.m in Sources */, - 1B63F89A1D6DF5F200B14122 /* ISHPermissionRequestModernPhotoLibrary.m in Sources */, - DC6A466419D7125300B11E88 /* ISHPermissionRequestHealth.m in Sources */, - DC6A466519D7125300B11E88 /* ISHPermissionRequestViewController.m in Sources */, - DC6A466619D7125300B11E88 /* ISHPermissionRequestPhotoLibrary.m in Sources */, - 1BC93E501D7063D20033B6E8 /* ISHPermissionRequestMusicLibrary.m in Sources */, - DC6A466719D7125300B11E88 /* ISHPermissionRequestMotion.m in Sources */, - DC6A466819D7125300B11E88 /* ISHPermissionRequestMicrophone.m in Sources */, - 1B0932511D7069E00095A74A /* ISHPermissionRequestContacts.m in Sources */, - 1B96D5FD1D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m in Sources */, - DC6A466919D7125300B11E88 /* ISHPermissionsViewController.m in Sources */, - DC6A466A19D7125300B11E88 /* ISHPermissionRequestEventStore.m in Sources */, - DC96E8D41B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.m in Sources */, - DC6A466B19D7125300B11E88 /* ISHPermissionRequest+All.m in Sources */, - 1B69884E1D6F57DF00C8EAB8 /* ISHPermissionRequestUserNotification.m in Sources */, - DC6A466C19D7125300B11E88 /* ISHPermissionRequestAccount.m in Sources */, - DC6A466D19D7125300B11E88 /* ISHPermissionRequest.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DC6A468919D712AC00B11E88 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DC6A468A19D712AC00B11E88 /* ISHPermissionRequestNotificationsLocal.m in Sources */, - DC6A468B19D712AC00B11E88 /* ISHPermissionRequestAddressBook.m in Sources */, - 1B4513031D6DC01200D6E47C /* ISHPermissionRequestSiri.m in Sources */, - DC6A468C19D712AC00B11E88 /* ISHPermissionRequestPhotoCamera.m in Sources */, - DC6A468D19D712AC00B11E88 /* ISHPermissionRequest+All.m in Sources */, - 1B63F89B1D6DF5F200B14122 /* ISHPermissionRequestModernPhotoLibrary.m in Sources */, - DC6A468E19D712AC00B11E88 /* ISHPermissionRequestHealth.m in Sources */, - DC6A468F19D712AC00B11E88 /* ISHPermissionRequestMotion.m in Sources */, - DC6A469019D712AC00B11E88 /* ISHPermissionRequestPhotoLibrary.m in Sources */, - 1BC93E511D7063D20033B6E8 /* ISHPermissionRequestMusicLibrary.m in Sources */, - DC6A469119D712AC00B11E88 /* ISHPermissionRequestLocation.m in Sources */, - DC6A469219D712AC00B11E88 /* ISHPermissionRequestMicrophone.m in Sources */, - 1B0932521D7069E10095A74A /* ISHPermissionRequestContacts.m in Sources */, - 1B96D5FE1D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m in Sources */, - DC6A469319D712AC00B11E88 /* ISHPermissionsViewController.m in Sources */, - DC6A469419D712AC00B11E88 /* ISHPermissionRequestEventStore.m in Sources */, - DC96E8D51B95CAAD0019E958 /* ISHPermissionRequestNotificationsRemote.m in Sources */, - DC6A469519D712AC00B11E88 /* ISHPermissionRequestViewController.m in Sources */, - 1B69884F1D6F57DF00C8EAB8 /* ISHPermissionRequestUserNotification.m in Sources */, - DC6A469619D712AC00B11E88 /* ISHPermissionRequestAccount.m in Sources */, - DC6A469719D712AC00B11E88 /* ISHPermissionRequest.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; DC7790AF19617CD7007CB2BC /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1072,114 +743,7 @@ }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 1B06A05D1D70949A00C7F8ED /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DC6A468819D712AC00B11E88 /* ISHPermissionKit+HealthKit */; - targetProxy = 1B06A05C1D70949A00C7F8ED /* PBXContainerItemProxy */; - }; - DC6A46B419D94E2700B11E88 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DC6A465E19D7125300B11E88 /* ISHPermissionKitLib+HealthKit */; - targetProxy = DC6A46B319D94E2700B11E88 /* PBXContainerItemProxy */; - }; - DCDB310B1D0AFCA2005E9A71 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DC6A468819D712AC00B11E88 /* ISHPermissionKit+HealthKit */; - targetProxy = DCDB310A1D0AFCA2005E9A71 /* PBXContainerItemProxy */; - }; - DCDB310E1D0AFCBD005E9A71 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DC6A465E19D7125300B11E88 /* ISHPermissionKitLib+HealthKit */; - targetProxy = DCDB310D1D0AFCBD005E9A71 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin XCBuildConfiguration section */ - DC6A468519D7125300B11E88 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - DYLIB_COMPATIBILITY_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - DYLIB_CURRENT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - FRAMEWORK_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - ISHPermissionRequestHealthKitEnabled, - ); - METAL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "ISHPermissionKitLib+HealthKit"; - PUBLIC_HEADERS_FOLDER_PATH = "include/$(PROJECT_NAME)"; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - DC6A468619D7125300B11E88 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - DYLIB_COMPATIBILITY_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - DYLIB_CURRENT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - FRAMEWORK_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - ISHPermissionRequestHealthKitEnabled, - ); - METAL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "ISHPermissionKitLib+HealthKit"; - PUBLIC_HEADERS_FOLDER_PATH = "include/$(PROJECT_NAME)"; - SKIP_INSTALL = YES; - }; - name = Release; - }; - DC6A46AF19D712AC00B11E88 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - DYLIB_CURRENT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - ISHPermissionRequestHealthKitEnabled, - ); - INFOPLIST_FILE = ISHPermissionKit/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "de.iosphere.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = ISHPermissionKit; - SKIP_INSTALL = YES; - }; - name = Debug; - }; - DC6A46B019D712AC00B11E88 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - DYLIB_CURRENT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - ISHPermissionRequestHealthKitEnabled, - ); - INFOPLIST_FILE = ISHPermissionKit/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "de.iosphere.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = ISHPermissionKit; - SKIP_INSTALL = YES; - }; - name = Release; - }; DC7790BC19617CD7007CB2BC /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1432,24 +996,6 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - DC6A468419D7125300B11E88 /* Build configuration list for PBXNativeTarget "ISHPermissionKitLib+HealthKit" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DC6A468519D7125300B11E88 /* Debug */, - DC6A468619D7125300B11E88 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DC6A46AE19D712AC00B11E88 /* Build configuration list for PBXNativeTarget "ISHPermissionKit+HealthKit" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DC6A46AF19D712AC00B11E88 /* Debug */, - DC6A46B019D712AC00B11E88 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; DC7790BE19617CD7007CB2BC /* Build configuration list for PBXNativeTarget "ISHPermissionKitLibTests" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/ISHPermissionKit/ISHPermissionCategory.h b/ISHPermissionKit/ISHPermissionCategory.h index 26a03ab..96f5fe3 100644 --- a/ISHPermissionKit/ISHPermissionCategory.h +++ b/ISHPermissionKit/ISHPermissionCategory.h @@ -6,77 +6,112 @@ // Copyright (c) 2014 iosphere GmbH. All rights reserved. // - /** * Permission categories describe types of permissions on iOS. * Each is related to a specific PermissionRequest. - * @note Values assigned to each category must not be changed, as - * they may have been persisted on user devices. + * + * To prevent auto-linking frameworks that are not used, each + * category must be explicitly enabled by a build flag. Some + * frameworks have additional requirements. Please read the + * documentation for each category carefully to avoid App Store + * rejections. + * + * @note Values assigned to each category must not be changed, as + * they may have been persisted on user devices. */ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { + +#ifdef ISHPermissionRequestMotionEnabled /** - * Permission required for step counting and motion activity queries. + * Permission required for accessing the accelerometer, step + * counting and motion activity queries. * * The app must also provide a localized NSMotionUsageDescription - * in the Info PLIST. + * in the Info PLIST. Please consult the app review guidelines + * for special requirements for apps that access motion data, + * specifically section 5.1 (Privacy). * - * @sa Reference documentation for CoreMotion. + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestMotion. This will link CoreMotion. */ ISHPermissionCategoryActivity = 1000, - +#endif + +#ifdef ISHPermissionRequestHealthKitEnabled /** - * Permission required to use HealthKit data. - * - * Make sure to comply with section 5.1 of the review guidelines. - * Use the `ISHPermissionKitLib+HealthKit` static library or - * the `ISHPermissionKit+HealthKit` framework if you want to use - * this permission category. + * Permission required to use HealthKit data, incl. workouts, + * heart rates, and activity distances. * * The app must also provide a localized NSHealthShareUsageDescription * in the Info PLIST if you read HealthKit data, and - * NSHealthUpdateUsageDescription to write to HealthKit. + * NSHealthUpdateUsageDescription to write to HealthKit. Please consult + * the app review guidelines for special requirements for apps that + * access health data, specifically section 5.1 (Privacy). + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestHealthKitEnabled. This will link HealthKit. * * @note: The Health app and HealthKit are not available on iPad. * Using this category on iPad will fail gracefully by always * returning the state ISHPermissionStateUnsupported. - * - * @sa README.md for further reading on HealthKit integration. */ ISHPermissionCategoryHealth = 2000, +#endif +#ifdef ISHPermissionRequestLocationEnabled /** * Permission required to use the user's location at any time, - * including monitoring for regions, visits, or significant location changes. + * including monitoring for regions, visits, or significant location + * changes. * * If you want to request both Always and WhenInUse, you should ask for * WhenInUse first. You can do so by passing both categories to the * ISHPermissionsViewController with WhenInUse before Always. * * The app must also provide a localized NSLocationAlwaysUsageDescription - * in the Info PLIST. + * in the Info PLIST. Please consult the app review guidelines for special + * requirements for apps that access location data, specifically section + * 5.1 (Privacy). + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestLocationEnabled. This will link CoreLocation. * * @sa ISHPermissionCategoryLocationWhenInUse */ ISHPermissionCategoryLocationAlways = 3100, /** - * Permission required to use the user's location only when your app - * is visible to them. + * Permission required to start accessing the user's location only when + * your app is visible to them. Continued use in the background will + * display a blue status bar with a note that your app is still accessing + * the location. * * The app must also provide a localized NSLocationWhenInUseUsageDescription - * in the Info PLIST. + * in the Info PLIST. Please consult the app review guidelines for special + * requirements for apps that access location data, specifically section + * 5.1 (Privacy). + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestLocationEnabled. This will link CoreLocation. * * @sa ISHPermissionCategoryLocationAlways */ ISHPermissionCategoryLocationWhenInUse = 3200, - +#endif + +#ifdef ISHPermissionRequestMicrophoneEnabled /** * Permission required to record the user's microphone input. * * The app must also provide a localized NSMicrophoneUsageDescription * in the Info PLIST. + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestMicrophoneEnabled. This will link AVFoundation. */ ISHPermissionCategoryMicrophone = 4000, - +#endif + +#ifdef ISHPermissionRequestPhotoLibraryEnabled /** * Permission required to access the user's photo library. * @@ -86,6 +121,10 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * The app must also provide a localized NSPhotoLibraryUsageDescription * in the Info PLIST. * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestPhotoLibraryEnabled. This will link AssetsLibrary + * and Photos. + * * @sa ISHPermissionCategoryModernPhotoLibrary */ ISHPermissionCategoryPhotoLibrary NS_ENUM_DEPRECATED_IOS(7.0, 9.0, "Use ISHPermissionCategoryModernPhotoLibrary") = 5000, @@ -96,19 +135,35 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * * The app must also provide a localized NSPhotoLibraryUsageDescription * in the Info PLIST. + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestPhotoLibraryEnabled. This will link AssetsLibrary + * and Photos. */ ISHPermissionCategoryModernPhotoLibrary NS_ENUM_AVAILABLE_IOS(8_0) = 5050, +#endif + +#ifdef ISHPermissionRequestCameraEnabled /** * Permission required to access the user's camera. * * The app must also provide a localized NSCameraUsageDescription * in the Info PLIST. + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestCameraEnabled. This will link AVFoundation. */ ISHPermissionCategoryPhotoCamera = 5100, - +#endif + +#ifdef ISHPermissionRequestNotificationsEnabled /** * Permission required to schedule local notifications. * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestNotificationsEnabled. This will link UIKit and + * UserNotification. + * * @note Requests for this permission might require further * configuration via the ISHPermissionsViewControllerDataSource. * @@ -118,12 +173,17 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * ISHPermissionPostNotificationDidRegisterUserNotificationSettings(self); * } * @endcode + * + * @sa ISHPermissionCategoryUserNotification */ ISHPermissionCategoryNotificationLocal NS_ENUM_DEPRECATED_IOS(8.0, 10.0, "Use ISHPermissionCategoryUserNotification") = 6100, /** * Permission required to receive user-facing remote notifications. * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestNotificationsEnabled. This will link UserNotification. + * * @note Requests for this permission might require further * configuration via the ISHPermissionsViewControllerDataSource to notificationSettings. * By default this request asks for [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert categories:nil]; @@ -141,11 +201,19 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * ISHPermissionPostNotificationDidRegisterUserNotificationSettings(self); * } * @endcode + * + * @sa ISHPermissionCategoryUserNotification */ ISHPermissionCategoryNotificationRemote NS_ENUM_DEPRECATED_IOS(8.0, 10.0, "Use ISHPermissionCategoryUserNotification") = 6200, - +#endif + +#ifdef ISHPermissionRequestSocialAccountsEnabled /** * Permission required to access the user's Facebook accounts. + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestSocialAccountsEnabled. This will link Accounts. + * * @note Requests for this permission require further * configuration via the ISHPermissionsViewControllerDataSource. * The request will require an options dictionary including, e.g., ACFacebookAppIdKey. @@ -153,22 +221,41 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { ISHPermissionCategorySocialFacebook = 7100, /** * Permission required to access the user's Twitter accounts. + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestSocialAccountsEnabled. This will link Accounts. */ ISHPermissionCategorySocialTwitter = 7110, /** * Permission required to access the user's SinaWeibo accounts. + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestSocialAccountsEnabled. This will link Accounts. */ ISHPermissionCategorySocialSinaWeibo = 7120, /** * Permission required to access the user's TencentWeibo accounts. + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestSocialAccountsEnabled. This will link Accounts. */ ISHPermissionCategorySocialTencentWeibo = 7130, - +#endif + +#ifdef ISHPermissionRequestContactsEnabled /** * Permission required to access the user's contacts. * * The app must also provide a localized NSContactsUsageDescription - * in the Info PLIST. + * in the Info PLIST. Please consult the app review guidelines for + * special requirements for apps that access contacts, specifically + * section 5.1 (Privacy). + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestContactsEnabled. This will link Contacts + * and AddressBook. + * + * @sa ISHPermissionCategoryContacts */ ISHPermissionCategoryAddressBook NS_ENUM_DEPRECATED_IOS(7.0, 9.0, "Use ISHPermissionCategoryContacts") = 8100, /** @@ -176,26 +263,51 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * systems, using the Contacts framework. * * The app must also provide a localized NSContactsUsageDescription - * in the Info PLIST. + * in the Info PLIST. Please consult the app review guidelines for + * special requirements for apps that access contacts, specifically + * section 5.1 (Privacy). + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestContactsEnabled. This will link Contacts + * and AddressBook. */ ISHPermissionCategoryContacts NS_ENUM_AVAILABLE_IOS(9_0) = 8500, - +#endif + +#ifdef ISHPermissionRequestCalendarEnabled /** * Permission required to access the user's calendar. * * The app must also provide a localized NSCalendarsUsageDescription - * in the Info PLIST. + * in the Info PLIST. Please consult the app review guidelines for + * special requirements for apps that access calendar information, + * specifically section 5.1 (Privacy). + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestCalendarEnabled. This will link EventKit. */ ISHPermissionCategoryEvents = 8200, +#endif + +#ifdef ISHPermissionRequestRemindersEnabled /** * Permission required to access the user's reminders. * * The app must also provide a localized NSRemindersUsageDescription - * in the Info PLIST. + * in the Info PLIST. Please consult the app review guidelines for + * special requirements for apps that access reminders, specifically + * section 5.1 (Privacy). + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestRemindersEnabled. This will link EventKit. */ ISHPermissionCategoryReminders = 8250, +#endif +// These categories requires Xcode 8/iOS 10 SDK #ifdef NSFoundationVersionNumber_iOS_9_0 + +#ifdef ISHPermissionRequestSiriEnabled /** * Permission required for Siri to access your app's data. * @@ -204,18 +316,28 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * * The app must also provide a localized NSSiriUsageDescription * in the Info PLIST. + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestSiriEnabled. This will link Intents. */ ISHPermissionCategorySiri NS_ENUM_AVAILABLE_IOS(10_0) = 9000, +#endif +#ifdef ISHPermissionRequestSpeechEnabled /** * Permission required to perform speech recognition, which sends * user data to Apple's servers. * * The app must also provide a localized NSSpeechRecognitionUsageDescription * in the Info PLIST. + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestSpeechEnabled. This will link Speech. */ ISHPermissionCategorySpeechRecognition NS_ENUM_AVAILABLE_IOS(10_0) = 10000, +#endif +#ifdef ISHPermissionRequestNotificationsEnabled /** * Modern way to request permission to local and remote notifications. * @@ -230,9 +352,13 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * * Allows configuration by the data source. * - * @sa ISHPermissionRequestUserNotification + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestNotificationsEnabled. This will link UIKit and + * UserNotification. */ ISHPermissionCategoryUserNotification NS_ENUM_AVAILABLE_IOS(10_0) = 6500, +#endif + #endif /** @@ -253,26 +379,48 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { */ static inline NSString * _Nonnull ISHStringFromPermissionCategory(ISHPermissionCategory category) { switch (category) { +#ifdef ISHPermissionRequestMotionEnabled case ISHPermissionCategoryActivity: return @"ISHPermissionCategoryActivity"; +#endif + +#ifdef ISHPermissionRequestHealthKitEnabled case ISHPermissionCategoryHealth: return @"ISHPermissionCategoryHealth"; +#endif + +#ifdef ISHPermissionRequestLocationEnabled case ISHPermissionCategoryLocationAlways: return @"ISHPermissionCategoryLocationAlways"; case ISHPermissionCategoryLocationWhenInUse: return @"ISHPermissionCategoryLocationWhenInUse"; +#endif + +#ifdef ISHPermissionRequestMicrophoneEnabled case ISHPermissionCategoryMicrophone: return @"ISHPermissionCategoryMicrophone"; +#endif + +#ifdef ISHPermissionRequestPhotoLibraryEnabled case ISHPermissionCategoryPhotoLibrary: return @"ISHPermissionCategoryPhotoLibrary"; case ISHPermissionCategoryModernPhotoLibrary: return @"ISHPermissionCategoryModernPhotoLibrary"; +#endif + +#ifdef ISHPermissionRequestCameraEnabled case ISHPermissionCategoryPhotoCamera: return @"ISHPermissionCategoryPhotoCamera"; +#endif + +#ifdef ISHPermissionRequestNotificationsEnabled case ISHPermissionCategoryNotificationLocal: return @"ISHPermissionCategoryNotificationLocal"; case ISHPermissionCategoryNotificationRemote: return @"ISHPermissionCategoryNotificationRemote"; +#endif + +#ifdef ISHPermissionRequestSocialAccountsEnabled case ISHPermissionCategorySocialFacebook: return @"ISHPermissionCategorySocialFacebook"; case ISHPermissionCategorySocialTwitter: @@ -281,23 +429,43 @@ static inline NSString * _Nonnull ISHStringFromPermissionCategory(ISHPermissionC return @"ISHPermissionCategorySocialSinaWeibo"; case ISHPermissionCategorySocialTencentWeibo: return @"ISHPermissionCategorySocialTencentWeibo"; +#endif + +#ifdef ISHPermissionRequestContactsEnabled case ISHPermissionCategoryAddressBook: return @"ISHPermissionCategoryAddressBook"; case ISHPermissionCategoryContacts: return @"ISHPermissionCategoryContacts"; +#endif + +#ifdef ISHPermissionRequestCalendarEnabled case ISHPermissionCategoryEvents: return @"ISHPermissionCategoryEvents"; +#endif + +#ifdef ISHPermissionRequestRemindersEnabled case ISHPermissionCategoryReminders: return @"ISHPermissionCategoryReminders"; +#endif + case ISHPermissionCategoryMusicLibrary: return @"ISHPermissionCategoryMusicLibrary"; + #ifdef NSFoundationVersionNumber_iOS_9_0 +#ifdef ISHPermissionRequestSiriEnabled case ISHPermissionCategorySiri: return @"ISHPermissionCategorySiri"; +#endif + +#ifdef ISHPermissionRequestSpeechEnabled case ISHPermissionCategorySpeechRecognition: return @"ISHPermissionCategorySpeechRecognition"; +#endif + +#ifdef ISHPermissionRequestNotificationsEnabled case ISHPermissionCategoryUserNotification: return @"ISHPermissionCategoryUserNotification"; +#endif #endif } diff --git a/ISHPermissionKit/Private/ISHPermissionRequestAddressBook.h b/ISHPermissionKit/Private/ISHPermissionRequestAddressBook.h index 1fafa40..7b85435 100644 --- a/ISHPermissionKit/Private/ISHPermissionRequestAddressBook.h +++ b/ISHPermissionKit/Private/ISHPermissionRequestAddressBook.h @@ -8,6 +8,8 @@ #import "ISHPermissionRequest.h" +#ifdef ISHPermissionRequestContactsEnabled + /** * Permission request for the user's address book. * @@ -15,3 +17,5 @@ */ @interface ISHPermissionRequestAddressBook : ISHPermissionRequest @end + +#endif diff --git a/ISHPermissionKit/Private/ISHPermissionRequestContacts.h b/ISHPermissionKit/Private/ISHPermissionRequestContacts.h index fe30766..a48089d 100644 --- a/ISHPermissionKit/Private/ISHPermissionRequestContacts.h +++ b/ISHPermissionKit/Private/ISHPermissionRequestContacts.h @@ -6,7 +6,9 @@ // Copyright © 2016 iosphere GmbH. All rights reserved. // -#import +#import "ISHPermissionRequest.h" + +#ifdef ISHPermissionRequestContactsEnabled /** * Permission request for the user's contacts. @@ -16,3 +18,5 @@ @interface ISHPermissionRequestContacts : ISHPermissionRequest @end + +#endif diff --git a/ISHPermissionKit/Private/ISHPermissionRequestEventStore.h b/ISHPermissionKit/Private/ISHPermissionRequestEventStore.h index 48d4de5..423bff4 100644 --- a/ISHPermissionKit/Private/ISHPermissionRequestEventStore.h +++ b/ISHPermissionKit/Private/ISHPermissionRequestEventStore.h @@ -8,6 +8,8 @@ #import "ISHPermissionRequest.h" +#if defined(ISHPermissionRequestCalendarEnabled) || defined(ISHPermissionRequestRemindersEnabled) + /** * Permission request for calendar events and reminders. * @@ -15,3 +17,5 @@ */ @interface ISHPermissionRequestEventStore : ISHPermissionRequest @end + +#endif diff --git a/ISHPermissionKit/Private/ISHPermissionRequestLocation.h b/ISHPermissionKit/Private/ISHPermissionRequestLocation.h index cc8fb04..34d9e48 100644 --- a/ISHPermissionKit/Private/ISHPermissionRequestLocation.h +++ b/ISHPermissionKit/Private/ISHPermissionRequestLocation.h @@ -8,6 +8,8 @@ #import "ISHPermissionRequest.h" +#ifdef ISHPermissionRequestLocationEnabled + /** * Permission request for location information. * @@ -15,3 +17,5 @@ */ @interface ISHPermissionRequestLocation : ISHPermissionRequest @end + +#endif diff --git a/ISHPermissionKit/Private/ISHPermissionRequestMicrophone.h b/ISHPermissionKit/Private/ISHPermissionRequestMicrophone.h index 83eb6b9..63f7b6f 100644 --- a/ISHPermissionKit/Private/ISHPermissionRequestMicrophone.h +++ b/ISHPermissionKit/Private/ISHPermissionRequestMicrophone.h @@ -8,6 +8,8 @@ #import "ISHPermissionRequest.h" +#ifdef ISHPermissionRequestMicrophoneEnabled + /** * Permission request for the microphone. * @@ -15,3 +17,5 @@ */ @interface ISHPermissionRequestMicrophone : ISHPermissionRequest @end + +#endif diff --git a/ISHPermissionKit/Private/ISHPermissionRequestModernPhotoLibrary.h b/ISHPermissionKit/Private/ISHPermissionRequestModernPhotoLibrary.h index 6192e04..6a142d2 100644 --- a/ISHPermissionKit/Private/ISHPermissionRequestModernPhotoLibrary.h +++ b/ISHPermissionKit/Private/ISHPermissionRequestModernPhotoLibrary.h @@ -8,6 +8,8 @@ #import +#ifdef ISHPermissionRequestPhotoLibraryEnabled + /** * Permission request to acces the user's photo library using * PHPhotoLibrary APIs. @@ -17,3 +19,5 @@ @interface ISHPermissionRequestModernPhotoLibrary : ISHPermissionRequest @end + +#endif diff --git a/ISHPermissionKit/Private/ISHPermissionRequestMotion.h b/ISHPermissionKit/Private/ISHPermissionRequestMotion.h index 35c1506..820d700 100644 --- a/ISHPermissionKit/Private/ISHPermissionRequestMotion.h +++ b/ISHPermissionKit/Private/ISHPermissionRequestMotion.h @@ -8,6 +8,8 @@ #import "ISHPermissionRequest.h" +#ifdef ISHPermissionRequestMotionEnabled + /** * Permission request for motion/activity data. * @@ -15,3 +17,5 @@ */ @interface ISHPermissionRequestMotion : ISHPermissionRequest @end + +#endif diff --git a/ISHPermissionKit/Private/ISHPermissionRequestPhotoCamera.h b/ISHPermissionKit/Private/ISHPermissionRequestPhotoCamera.h index 20f3b86..abb2967 100644 --- a/ISHPermissionKit/Private/ISHPermissionRequestPhotoCamera.h +++ b/ISHPermissionKit/Private/ISHPermissionRequestPhotoCamera.h @@ -8,6 +8,8 @@ #import "ISHPermissionRequest.h" +#ifdef ISHPermissionRequestCameraEnabled + /** * Permission request to access the camera. * @@ -15,3 +17,5 @@ */ @interface ISHPermissionRequestPhotoCamera : ISHPermissionRequest @end + +#endif diff --git a/ISHPermissionKit/Private/ISHPermissionRequestPhotoLibrary.h b/ISHPermissionKit/Private/ISHPermissionRequestPhotoLibrary.h index 6d6af96..ca0c24c 100644 --- a/ISHPermissionKit/Private/ISHPermissionRequestPhotoLibrary.h +++ b/ISHPermissionKit/Private/ISHPermissionRequestPhotoLibrary.h @@ -8,6 +8,8 @@ #import "ISHPermissionRequest.h" +#ifdef ISHPermissionRequestPhotoLibraryEnabled + /** * Permission request to access the user's photo library. * @@ -15,3 +17,5 @@ */ @interface ISHPermissionRequestPhotoLibrary : ISHPermissionRequest @end + +#endif diff --git a/ISHPermissionKit/Private/ISHPermissionRequestSiri.h b/ISHPermissionKit/Private/ISHPermissionRequestSiri.h index ab4d0a1..904f56f 100644 --- a/ISHPermissionKit/Private/ISHPermissionRequestSiri.h +++ b/ISHPermissionKit/Private/ISHPermissionRequestSiri.h @@ -6,7 +6,9 @@ // Copyright © 2016 iosphere GmbH. All rights reserved. // -#import +#import "ISHPermissionRequest.h" + +#ifdef ISHPermissionRequestSiriEnabled #ifdef NSFoundationVersionNumber_iOS_9_0 /** @@ -17,4 +19,6 @@ @interface ISHPermissionRequestSiri : ISHPermissionRequest @end + +#endif #endif diff --git a/ISHPermissionKit/Private/ISHPermissionRequestSpeechRecognition.h b/ISHPermissionKit/Private/ISHPermissionRequestSpeechRecognition.h index 4b4f654..0113926 100644 --- a/ISHPermissionKit/Private/ISHPermissionRequestSpeechRecognition.h +++ b/ISHPermissionKit/Private/ISHPermissionRequestSpeechRecognition.h @@ -6,7 +6,9 @@ // Copyright © 2016 iosphere GmbH. All rights reserved. // -#import +#import "ISHPermissionRequest.h" + +#ifdef ISHPermissionRequestSpeechEnabled #ifdef NSFoundationVersionNumber_iOS_9_0 /** @@ -18,4 +20,6 @@ @interface ISHPermissionRequestSpeechRecognition : ISHPermissionRequest @end + +#endif #endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequest+All.m b/ISHPermissionKit/Requests/ISHPermissionRequest+All.m index 4d08e07..4446af0 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequest+All.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequest+All.m @@ -36,23 +36,32 @@ + (ISHPermissionRequest *)requestForCategory:(ISHPermissionCategory)category { ISHPermissionRequest *request = nil; switch (category) { +#ifdef ISHPermissionRequestLocationEnabled case ISHPermissionCategoryLocationAlways: case ISHPermissionCategoryLocationWhenInUse: request = [ISHPermissionRequestLocation new]; break; - +#endif + +#ifdef ISHPermissionRequestMotionEnabled case ISHPermissionCategoryActivity: request = [ISHPermissionRequestMotion new]; break; +#endif +#ifdef ISHPermissionRequestHealthKitEnabled case ISHPermissionCategoryHealth: request = [ISHPermissionRequestHealth new]; break; - +#endif + +#ifdef ISHPermissionRequestMicrophoneEnabled case ISHPermissionCategoryMicrophone: request = [ISHPermissionRequestMicrophone new]; break; - +#endif + +#ifdef ISHPermissionRequestPhotoLibraryEnabled case ISHPermissionCategoryPhotoLibrary: request = [ISHPermissionRequestPhotoLibrary new]; break; @@ -60,11 +69,15 @@ + (ISHPermissionRequest *)requestForCategory:(ISHPermissionCategory)category { case ISHPermissionCategoryModernPhotoLibrary: request = [ISHPermissionRequestModernPhotoLibrary new]; break; +#endif +#ifdef ISHPermissionRequestCameraEnabled case ISHPermissionCategoryPhotoCamera: request = [ISHPermissionRequestPhotoCamera new]; break; - +#endif + +#ifdef ISHPermissionRequestNotificationsEnabled case ISHPermissionCategoryNotificationLocal: request = [ISHPermissionRequestNotificationsLocal new]; break; @@ -72,41 +85,60 @@ + (ISHPermissionRequest *)requestForCategory:(ISHPermissionCategory)category { case ISHPermissionCategoryNotificationRemote: request = [ISHPermissionRequestNotificationsRemote new]; break; - +#endif + +#ifdef ISHPermissionRequestSocialAccountsEnabled case ISHPermissionCategorySocialFacebook: case ISHPermissionCategorySocialTwitter: case ISHPermissionCategorySocialSinaWeibo: case ISHPermissionCategorySocialTencentWeibo: request = [ISHPermissionRequestAccount new]; break; - +#endif + +#ifdef ISHPermissionRequestContactsEnabled case ISHPermissionCategoryAddressBook: request = [ISHPermissionRequestAddressBook new]; break; case ISHPermissionCategoryContacts: request = [ISHPermissionRequestContacts new]; break; +#endif +#ifdef ISHPermissionRequestCalendarEnabled case ISHPermissionCategoryEvents: + request = [ISHPermissionRequestEventStore new]; + break; +#endif + +#ifdef ISHPermissionRequestRemindersEnabled case ISHPermissionCategoryReminders: request = [ISHPermissionRequestEventStore new]; break; +#endif case ISHPermissionCategoryMusicLibrary: request = [ISHPermissionRequestMusicLibrary new]; break; #ifdef NSFoundationVersionNumber_iOS_9_0 +#ifdef ISHPermissionRequestSiriEnabled case ISHPermissionCategorySiri: request = [ISHPermissionRequestSiri new]; break; +#endif +#ifdef ISHPermissionRequestSiriEnabled case ISHPermissionCategorySpeechRecognition: request = [ISHPermissionRequestSpeechRecognition new]; break; +#endif + +#ifdef ISHPermissionRequestNotificationsEnabled case ISHPermissionCategoryUserNotification: request = [ISHPermissionRequestUserNotification new]; break; +#endif #endif } diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestAccount.h b/ISHPermissionKit/Requests/ISHPermissionRequestAccount.h index 10d7c48..a854ff8 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestAccount.h +++ b/ISHPermissionKit/Requests/ISHPermissionRequestAccount.h @@ -8,6 +8,8 @@ #import "ISHPermissionRequest.h" +#ifdef ISHPermissionRequestSocialAccountsEnabled + /** * Permission request for an account (social media). * @@ -32,3 +34,5 @@ @property (nonatomic, nullable) NSDictionary *options; @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestAccount.m b/ISHPermissionKit/Requests/ISHPermissionRequestAccount.m index 8598ee4..8148ad2 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestAccount.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestAccount.m @@ -9,6 +9,8 @@ #import "ISHPermissionRequestAccount.h" #import "ISHPermissionRequest+Private.h" +#ifdef ISHPermissionRequestSocialAccountsEnabled + @import Accounts; @interface ISHPermissionRequestAccount () @@ -110,3 +112,5 @@ - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletion } @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestAddressBook.m b/ISHPermissionKit/Requests/ISHPermissionRequestAddressBook.m index ab6957b..98d2f2d 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestAddressBook.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestAddressBook.m @@ -9,6 +9,8 @@ #import "ISHPermissionRequestAddressBook.h" #import "ISHPermissionRequest+Private.h" +#ifdef ISHPermissionRequestContactsEnabled + @import AddressBook; @implementation ISHPermissionRequestAddressBook { @@ -83,3 +85,5 @@ - (void)dealloc { #endif @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestContacts.m b/ISHPermissionKit/Requests/ISHPermissionRequestContacts.m index c856460..01ec119 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestContacts.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestContacts.m @@ -9,6 +9,8 @@ #import "ISHPermissionRequestContacts.h" #import "ISHPermissionRequest+Private.h" +#ifdef ISHPermissionRequestContactsEnabled + @import Contacts; @implementation ISHPermissionRequestContacts @@ -68,3 +70,5 @@ - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletion #endif @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestEventStore.m b/ISHPermissionKit/Requests/ISHPermissionRequestEventStore.m index 2103be5..a87d8cc 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestEventStore.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestEventStore.m @@ -9,6 +9,8 @@ #import "ISHPermissionRequestEventStore.h" #import "ISHPermissionRequest+Private.h" +#if defined(ISHPermissionRequestCalendarEnabled) || defined(ISHPermissionRequestRemindersEnabled) + @import EventKit; @interface ISHPermissionRequestEventStore () @@ -16,12 +18,23 @@ @interface ISHPermissionRequestEventStore () @end @implementation ISHPermissionRequestEventStore + - (EKEntityType)entityType { + +#ifdef ISHPermissionRequestRemindersEnabled if (self.permissionCategory == ISHPermissionCategoryReminders) { return EKEntityTypeReminder; } - - return EKEntityTypeEvent; +#endif + +#ifdef ISHPermissionRequestCalendarEnabled + if (self.permissionCategory == ISHPermissionCategoryReminders) { + return EKEntityTypeEvent; + } +#endif + + NSAssert(NO, @"Invalid permission category: %@", @(self.permissionCategory)); + return 0; } - (EKEventStore *)eventStore { @@ -72,3 +85,5 @@ - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletion #endif @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestHealth.h b/ISHPermissionKit/Requests/ISHPermissionRequestHealth.h index fec3090..8b144b8 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestHealth.h +++ b/ISHPermissionKit/Requests/ISHPermissionRequestHealth.h @@ -7,6 +7,9 @@ // #import "ISHPermissionRequest.h" + +#ifdef ISHPermissionRequestHealthKitEnabled + @class HKObjectType; @class HKSampleType; @@ -26,3 +29,5 @@ @property (nonatomic, nullable) NSSet *objectTypesWrite; @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestHealth.m b/ISHPermissionKit/Requests/ISHPermissionRequestHealth.m index d865e0c..d3832f6 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestHealth.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestHealth.m @@ -10,32 +10,19 @@ #import "ISHPermissionRequest+Private.h" #ifdef ISHPermissionRequestHealthKitEnabled -@import HealthKit; +@import HealthKit; @interface ISHPermissionRequestHealth () @property (nonatomic) HKHealthStore *store; @end -#endif @implementation ISHPermissionRequestHealth -- (instancetype)init { - self = [super init]; - #ifndef ISHPermissionRequestHealthKitEnabled - NSAssert(false, @"HealthKit permission requests require the use of the ISHPermissionKit+HealthKit framework " - @"or static library. This assertion was most likely triggered because your app links to the " - @"wrong target. Please check your project settings. If you use CocoaPods, you must use the" - @"ISHPermissionKit/Health pod in your Podfile."); - #endif - return self; -} - - (BOOL)allowsConfiguration { return YES; } -#ifdef ISHPermissionRequestHealthKitEnabled - (HKHealthStore *)store { if (!_store) { _store = [HKHealthStore new]; @@ -43,27 +30,16 @@ - (HKHealthStore *)store { return _store; } -#else -- (id)store { - return nil; -} -#endif + (BOOL)useFallBack { -#ifndef ISHPermissionRequestHealthKitEnabled - return YES; -#else return ![HKHealthStore isHealthDataAvailable]; -#endif } - (ISHPermissionState)permissionState { if ([ISHPermissionRequestHealth useFallBack]) { return ISHPermissionStateUnsupported; } -#ifndef ISHPermissionRequestHealthKitEnabled - return ISHPermissionStateUnsupported; // should already be covered by above Fallback -#else + NSMutableSet *allTypes = [NSMutableSet set]; NSSet *readableTypes = self.objectTypesRead; @@ -106,8 +82,8 @@ - (ISHPermissionState)permissionState { if (countDenied > countAuthorized) { return ISHPermissionStateDenied; } + return ISHPermissionStateAuthorized; -#endif // #ifndef ISHPermissionRequestHealthKitEnabled } - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletionBlock)completion { @@ -115,7 +91,6 @@ - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletion return; } -#ifdef ISHPermissionRequestHealthKitEnabled [self.store requestAuthorizationToShareTypes:self.objectTypesWrite readTypes:self.objectTypesRead completion:^(BOOL success, NSError *error) { @@ -130,9 +105,6 @@ - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletion completion(self, [self permissionState], externalError); }); }]; -#else - completion(self, ISHPermissionStateUnsupported, nil); -#endif } #if DEBUG @@ -152,3 +124,5 @@ - (NSString *)staticUsageDescriptionKeys { #endif @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestLocation.m b/ISHPermissionKit/Requests/ISHPermissionRequestLocation.m index 80deced..5c238e3 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestLocation.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestLocation.m @@ -9,6 +9,8 @@ #import "ISHPermissionRequestLocation.h" #import "ISHPermissionRequest+Private.h" +#ifdef ISHPermissionRequestLocationEnabled + @import CoreLocation; @import UIKit; @@ -183,3 +185,5 @@ - (void)UIApplicationDidBecomeActiveNotification:(NSNotification *)note {; #endif @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestMicrophone.m b/ISHPermissionKit/Requests/ISHPermissionRequestMicrophone.m index 582f577..efae4f5 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestMicrophone.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestMicrophone.m @@ -9,6 +9,8 @@ #import "ISHPermissionRequestMicrophone.h" #import "ISHPermissionRequest+Private.h" +#ifdef ISHPermissionRequestMicrophoneEnabled + @import AVFoundation; @implementation ISHPermissionRequestMicrophone @@ -75,3 +77,5 @@ - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletion #endif @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestModernPhotoLibrary.m b/ISHPermissionKit/Requests/ISHPermissionRequestModernPhotoLibrary.m index 3b505a6..b8a0720 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestModernPhotoLibrary.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestModernPhotoLibrary.m @@ -8,7 +8,10 @@ #import "ISHPermissionRequestModernPhotoLibrary.h" #import "ISHPermissionRequest+Private.h" -#import + +#ifdef ISHPermissionRequestPhotoLibraryEnabled + +@import Photos; @implementation ISHPermissionRequestModernPhotoLibrary @@ -64,3 +67,5 @@ - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletion #endif @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestMotion.m b/ISHPermissionKit/Requests/ISHPermissionRequestMotion.m index 887cf4f..6c14ce1 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestMotion.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestMotion.m @@ -9,6 +9,8 @@ #import "ISHPermissionRequestMotion.h" #import "ISHPermissionRequest+Private.h" +#ifdef ISHPermissionRequestMotionEnabled + @import CoreMotion; @interface ISHPermissionRequestMotion () @@ -61,3 +63,5 @@ - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletion #endif @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsLocal.h b/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsLocal.h index 4265766..9c496c5 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsLocal.h +++ b/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsLocal.h @@ -6,9 +6,12 @@ // Copyright (c) 2014 iosphere GmbH. All rights reserved. // -#import #import "ISHPermissionRequest.h" +#ifdef ISHPermissionRequestNotificationsEnabled + +@class UIUserNotificationSettings; + /** * Permission request for sending local notifications. * @@ -24,3 +27,5 @@ @property (nonatomic, nonnull) UIUserNotificationSettings *notificationSettings; @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsLocal.m b/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsLocal.m index e54080d..716420c 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsLocal.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsLocal.m @@ -10,6 +10,10 @@ #import "ISHPermissionRequest+Private.h" #import "ISHPermissionRequestUserNotification.h" +#ifdef ISHPermissionRequestNotificationsEnabled + +@import UIKit; + @interface ISHPermissionRequestNotificationsLocal () @property (copy) ISHPermissionRequestCompletionBlock completionBlock; @end @@ -91,3 +95,5 @@ - (void)ISHPermissionNotificationApplicationDidRegisterUserNotificationSettings: } @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsRemote.h b/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsRemote.h index f37ea1f..0371af1 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsRemote.h +++ b/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsRemote.h @@ -8,6 +8,8 @@ #import "ISHPermissionRequestNotificationsLocal.h" +#ifdef ISHPermissionRequestNotificationsEnabled + /** * Permission request for remote notifications. * @@ -15,3 +17,5 @@ */ @interface ISHPermissionRequestNotificationsRemote : ISHPermissionRequestNotificationsLocal @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsRemote.m b/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsRemote.m index b8012eb..15b6ab7 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsRemote.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestNotificationsRemote.m @@ -9,6 +9,10 @@ #import "ISHPermissionRequestNotificationsRemote.h" #import "ISHPermissionRequest+Private.h" +#ifdef ISHPermissionRequestNotificationsEnabled + +@import UIKit; + @implementation ISHPermissionRequestNotificationsRemote - (ISHPermissionState)permissionState { @@ -20,3 +24,5 @@ - (ISHPermissionState)permissionState { } @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestPhotoCamera.m b/ISHPermissionKit/Requests/ISHPermissionRequestPhotoCamera.m index 17982ab..a39e84c 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestPhotoCamera.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestPhotoCamera.m @@ -9,6 +9,8 @@ #import "ISHPermissionRequestPhotoCamera.h" #import "ISHPermissionRequest+Private.h" +#ifdef ISHPermissionRequestCameraEnabled + @import AVFoundation; @implementation ISHPermissionRequestPhotoCamera @@ -55,3 +57,5 @@ - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletion #endif @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestPhotoLibrary.m b/ISHPermissionKit/Requests/ISHPermissionRequestPhotoLibrary.m index 503e46f..f23869b 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestPhotoLibrary.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestPhotoLibrary.m @@ -9,6 +9,8 @@ #import "ISHPermissionRequestPhotoLibrary.h" #import "ISHPermissionRequest+Private.h" +#ifdef ISHPermissionRequestPhotoLibraryEnabled + @import AssetsLibrary; @implementation ISHPermissionRequestPhotoLibrary @@ -55,3 +57,5 @@ - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletion #endif @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestSiri.m b/ISHPermissionKit/Requests/ISHPermissionRequestSiri.m index f3588e8..df3e3a5 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestSiri.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestSiri.m @@ -7,10 +7,12 @@ // #import "ISHPermissionRequestSiri.h" +#import "ISHPermissionRequest+Private.h" + +#ifdef ISHPermissionRequestSiriEnabled #ifdef NSFoundationVersionNumber_iOS_9_0 -#import "ISHPermissionRequest+Private.h" -#import +@import Intents; @implementation ISHPermissionRequestSiri @@ -66,4 +68,6 @@ - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletion #endif @end + +#endif #endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestSpeechRecognition.m b/ISHPermissionKit/Requests/ISHPermissionRequestSpeechRecognition.m index cb49628..c38ae9d 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestSpeechRecognition.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestSpeechRecognition.m @@ -7,10 +7,11 @@ // #import "ISHPermissionRequestSpeechRecognition.h" -#ifdef NSFoundationVersionNumber_iOS_9_0 - #import "ISHPermissionRequest+Private.h" +#ifdef ISHPermissionRequestSpeechEnabled +#ifdef NSFoundationVersionNumber_iOS_9_0 + @import Speech; @implementation ISHPermissionRequestSpeechRecognition @@ -67,4 +68,6 @@ - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletion #endif @end + +#endif #endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestUserNotification.h b/ISHPermissionKit/Requests/ISHPermissionRequestUserNotification.h index d1cc961..7b2f0c1 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestUserNotification.h +++ b/ISHPermissionKit/Requests/ISHPermissionRequestUserNotification.h @@ -6,8 +6,11 @@ // Copyright © 2016 iosphere GmbH. All rights reserved. // -#import +#import "ISHPermissionRequest.h" + +#ifdef ISHPermissionRequestNotificationsEnabled #ifdef NSFoundationVersionNumber_iOS_9_0 + @import UserNotifications; /** @@ -39,4 +42,6 @@ @property (nonatomic) UNAuthorizationOptions desiredOptions; @end + +#endif #endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestUserNotification.m b/ISHPermissionKit/Requests/ISHPermissionRequestUserNotification.m index a9161ad..a16365d 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestUserNotification.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestUserNotification.m @@ -7,9 +7,13 @@ // #import "ISHPermissionRequestUserNotification.h" -#ifdef NSFoundationVersionNumber_iOS_9_0 #import "ISHPermissionRequest+Private.h" +#ifdef ISHPermissionRequestNotificationsEnabled +#ifdef NSFoundationVersionNumber_iOS_9_0 + +@import UIKit; + @implementation ISHPermissionRequestUserNotification - (instancetype)init { @@ -100,4 +104,6 @@ - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletion } @end + +#endif #endif From d13a816406c4ee7fffdd003e47c06900b5498380 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Tue, 4 Oct 2016 11:55:45 +0200 Subject: [PATCH 02/22] Remove Health variant schemes --- .../ISHPermissionKit+HealthKit.xcscheme | 99 ------------------- .../ISHPermissionKitLib+HealthKit.xcscheme | 99 ------------------- 2 files changed, 198 deletions(-) delete mode 100644 ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKit+HealthKit.xcscheme delete mode 100644 ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKitLib+HealthKit.xcscheme diff --git a/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKit+HealthKit.xcscheme b/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKit+HealthKit.xcscheme deleted file mode 100644 index 7a94c9e..0000000 --- a/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKit+HealthKit.xcscheme +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKitLib+HealthKit.xcscheme b/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKitLib+HealthKit.xcscheme deleted file mode 100644 index 6128ff0..0000000 --- a/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKitLib+HealthKit.xcscheme +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 387e940ed13d0623ad4529ad0e2a4d8d00cd1f43 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Tue, 4 Oct 2016 11:59:54 +0200 Subject: [PATCH 03/22] Update recommended Xcode settings Skip recommendation to drop iOS 7 deployment target --- ISHPermissionKit.xcodeproj/project.pbxproj | 8 +++++++- .../xcshareddata/xcschemes/ISHPermissionKit.xcscheme | 2 +- .../xcshareddata/xcschemes/ISHPermissionKitLib.xcscheme | 2 +- .../xcshareddata/xcschemes/PermissionsTestApp.xcscheme | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/ISHPermissionKit.xcodeproj/project.pbxproj b/ISHPermissionKit.xcodeproj/project.pbxproj index c4599ca..13a6303 100644 --- a/ISHPermissionKit.xcodeproj/project.pbxproj +++ b/ISHPermissionKit.xcodeproj/project.pbxproj @@ -580,7 +580,7 @@ DCC1BF9C195B174200362559 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0800; + LastUpgradeCheck = 0810; ORGANIZATIONNAME = "iosphere GmbH"; TargetAttributes = { DC7790B219617CD7007CB2BC = { @@ -814,9 +814,11 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -867,9 +869,11 @@ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -902,6 +906,7 @@ DCC1BFBC195B174200362559 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; @@ -921,6 +926,7 @@ DCC1BFBD195B174200362559 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; diff --git a/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKit.xcscheme b/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKit.xcscheme index 5974aee..ff40ea0 100644 --- a/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKit.xcscheme +++ b/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKit.xcscheme @@ -1,6 +1,6 @@ Date: Tue, 4 Oct 2016 14:17:02 +0200 Subject: [PATCH 04/22] Add configuration file to fix sample app --- ISHPermissionKit.xcodeproj/project.pbxproj | 41 ++++++++++++++++++- PermissionsTestApp/AppDelegate.m | 5 ++- .../PermissionKitFlags.xcconfig | 9 ++++ 3 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 PermissionsTestApp/PermissionKitFlags.xcconfig diff --git a/ISHPermissionKit.xcodeproj/project.pbxproj b/ISHPermissionKit.xcodeproj/project.pbxproj index 13a6303..7139a91 100644 --- a/ISHPermissionKit.xcodeproj/project.pbxproj +++ b/ISHPermissionKit.xcodeproj/project.pbxproj @@ -23,6 +23,8 @@ 1B69884B1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B6988491D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.h */; }; 1B69884C1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B69884A1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.m */; }; 1B69884D1D6F57DD00C8EAB8 /* ISHPermissionRequestUserNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B69884A1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.m */; }; + 1B72213E1DA3D31200B9266F /* ISHPermissionKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCC1BFA5195B174200362559 /* ISHPermissionKit.framework */; }; + 1B72213F1DA3D31200B9266F /* ISHPermissionKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DCC1BFA5195B174200362559 /* ISHPermissionKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 1B96D5FB1D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B96D5F61D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m */; }; 1B96D5FC1D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B96D5F61D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m */; }; 1B96D6001D6F12CF0026A4FC /* ISHPermissionRequestSpeechRecognition.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B96D5FF1D6F12CF0026A4FC /* ISHPermissionRequestSpeechRecognition.h */; }; @@ -112,13 +114,24 @@ DCF18618195C2B1B00CC155E /* SamplePermissionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = DCF18616195C2B1B00CC155E /* SamplePermissionViewController.xib */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 1B7221401DA3D31200B9266F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DCC1BF9C195B174200362559 /* Project object */; + proxyType = 1; + remoteGlobalIDString = DCC1BFA4195B174200362559; + remoteInfo = ISHPermissionKit; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXCopyFilesBuildPhase section */ - 1B06A05E1D70949A00C7F8ED /* Embed Frameworks */ = { + 1B7221421DA3D31200B9266F /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( + 1B72213F1DA3D31200B9266F /* ISHPermissionKit.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -145,6 +158,7 @@ 1B63F89C1D6DF60500B14122 /* ISHPermissionRequestModernPhotoLibrary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ISHPermissionRequestModernPhotoLibrary.h; path = ISHPermissionKit/Private/ISHPermissionRequestModernPhotoLibrary.h; sourceTree = SOURCE_ROOT; }; 1B6988491D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ISHPermissionRequestUserNotification.h; sourceTree = ""; }; 1B69884A1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionRequestUserNotification.m; sourceTree = ""; }; + 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = PermissionKitFlags.xcconfig; sourceTree = ""; }; 1B87C1BA1961AA5D001D85E7 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 1B87C1BB1961AA5D001D85E7 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 1B96D5F61D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionRequestSpeechRecognition.m; sourceTree = ""; }; @@ -243,6 +257,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 1B72213E1DA3D31200B9266F /* ISHPermissionKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -411,6 +426,7 @@ DCC1BFC8195B176E00362559 /* Info.plist */, DCC1BFC9195B176E00362559 /* main.m */, 1B20492E1D007F830042FF2E /* Launch Screen.storyboard */, + 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */, ); name = "Supporting Files"; sourceTree = ""; @@ -563,11 +579,12 @@ DCC1BFC1195B176E00362559 /* Sources */, DCC1BFC2195B176E00362559 /* Frameworks */, DCC1BFC3195B176E00362559 /* Resources */, - 1B06A05E1D70949A00C7F8ED /* Embed Frameworks */, + 1B7221421DA3D31200B9266F /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( + 1B7221411DA3D31200B9266F /* PBXTargetDependency */, ); name = PermissionsTestApp; productName = PermissionsTestApp; @@ -743,9 +760,18 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 1B7221411DA3D31200B9266F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DCC1BFA4195B174200362559 /* ISHPermissionKit */; + targetProxy = 1B7221401DA3D31200B9266F /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ DC7790BC19617CD7007CB2BC /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { INFOPLIST_FILE = ISHPermissionKitLibTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 7.0; @@ -759,6 +785,7 @@ }; DC7790BD19617CD7007CB2BC /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { INFOPLIST_FILE = ISHPermissionKitLibTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 7.0; @@ -772,6 +799,7 @@ }; DCAEF7DC195C60070074EB5B /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; DYLIB_COMPATIBILITY_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; @@ -787,6 +815,7 @@ }; DCAEF7DD195C60070074EB5B /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; DYLIB_COMPATIBILITY_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; @@ -802,6 +831,7 @@ }; DCC1BFB9195B174200362559 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -857,6 +887,7 @@ }; DCC1BFBA195B174200362559 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -905,6 +936,7 @@ }; DCC1BFBC195B174200362559 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; @@ -925,6 +957,7 @@ }; DCC1BFBD195B174200362559 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; @@ -945,6 +978,7 @@ }; DCC1BFBF195B174200362559 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { INFOPLIST_FILE = ISHPermissionKitTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -958,6 +992,7 @@ }; DCC1BFC0195B174200362559 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { INFOPLIST_FILE = ISHPermissionKitTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -971,6 +1006,7 @@ }; DCC1BFDD195B176E00362559 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; @@ -986,6 +1022,7 @@ }; DCC1BFDE195B176E00362559 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; diff --git a/PermissionsTestApp/AppDelegate.m b/PermissionsTestApp/AppDelegate.m index 1f5917e..d0b82cf 100644 --- a/PermissionsTestApp/AppDelegate.m +++ b/PermissionsTestApp/AppDelegate.m @@ -64,8 +64,9 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( @(ISHPermissionCategoryAddressBook), @(ISHPermissionCategoryContacts), - @(ISHPermissionCategoryEvents), - @(ISHPermissionCategoryReminders), + //@(ISHPermissionCategoryEvents), + // TODO: fix defines + //@(ISHPermissionCategoryReminders), @(ISHPermissionCategoryMusicLibrary), #ifdef NSFoundationVersionNumber_iOS_9_0 diff --git a/PermissionsTestApp/PermissionKitFlags.xcconfig b/PermissionsTestApp/PermissionKitFlags.xcconfig new file mode 100644 index 0000000..c63c3c7 --- /dev/null +++ b/PermissionsTestApp/PermissionKitFlags.xcconfig @@ -0,0 +1,9 @@ +// +// PermissionKitFlags.xcconfig +// ISHPermissionKit +// +// Created by Hagi on 04/10/16. +// Copyright © 2016 iosphere GmbH. All rights reserved. +// + +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) ISHPermissionRequestMotionEnabled ISHPermissionRequestHealthKitEnabled ISHPermissionRequestLocationEnabled ISHPermissionRequestMicrophoneEnabled ISHPermissionRequestPhotoLibraryEnabled ISHPermissionRequestCameraEnabled ISHPermissionRequestNotificationsEnabled ISHPermissionRequestSocialAccountsEnabled ISHPermissionRequestContactsEnabled ISHPermissionRequestCalendarEnabled ISHPermissionRequestRemindersEnabled ISHPermissionRequestSiriEnabled ISHPermissionRequestSpeechEnabled From 8461b55ad7e95e444d9adff06ece04445a6807c5 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Tue, 4 Oct 2016 18:30:20 +0200 Subject: [PATCH 05/22] Add xcconfig hook to framework Currently cannot be used by the sample app --- ISHPermissionKit.xcodeproj/project.pbxproj | 18 ++++-------------- .../ISHPermissionKitFlags.xcconfig | 10 ++++++++++ PermissionsTestApp/PermissionKitFlags.xcconfig | 9 --------- 3 files changed, 14 insertions(+), 23 deletions(-) create mode 100644 ISHPermissionKit/ISHPermissionKitFlags.xcconfig delete mode 100644 PermissionsTestApp/PermissionKitFlags.xcconfig diff --git a/ISHPermissionKit.xcodeproj/project.pbxproj b/ISHPermissionKit.xcodeproj/project.pbxproj index 7139a91..1dc7b2c 100644 --- a/ISHPermissionKit.xcodeproj/project.pbxproj +++ b/ISHPermissionKit.xcodeproj/project.pbxproj @@ -158,7 +158,7 @@ 1B63F89C1D6DF60500B14122 /* ISHPermissionRequestModernPhotoLibrary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ISHPermissionRequestModernPhotoLibrary.h; path = ISHPermissionKit/Private/ISHPermissionRequestModernPhotoLibrary.h; sourceTree = SOURCE_ROOT; }; 1B6988491D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ISHPermissionRequestUserNotification.h; sourceTree = ""; }; 1B69884A1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionRequestUserNotification.m; sourceTree = ""; }; - 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = PermissionKitFlags.xcconfig; sourceTree = ""; }; + 1B7221721DA3DD7B00B9266F /* ISHPermissionKitFlags.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ISHPermissionKitFlags.xcconfig; sourceTree = ""; }; 1B87C1BA1961AA5D001D85E7 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 1B87C1BB1961AA5D001D85E7 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 1B96D5F61D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionRequestSpeechRecognition.m; sourceTree = ""; }; @@ -383,6 +383,7 @@ isa = PBXGroup; children = ( DCC1BFA9195B174200362559 /* Info.plist */, + 1B7221721DA3DD7B00B9266F /* ISHPermissionKitFlags.xcconfig */, ); name = "Supporting Files"; sourceTree = ""; @@ -426,7 +427,6 @@ DCC1BFC8195B176E00362559 /* Info.plist */, DCC1BFC9195B176E00362559 /* main.m */, 1B20492E1D007F830042FF2E /* Launch Screen.storyboard */, - 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */, ); name = "Supporting Files"; sourceTree = ""; @@ -771,7 +771,6 @@ /* Begin XCBuildConfiguration section */ DC7790BC19617CD7007CB2BC /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { INFOPLIST_FILE = ISHPermissionKitLibTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 7.0; @@ -785,7 +784,6 @@ }; DC7790BD19617CD7007CB2BC /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { INFOPLIST_FILE = ISHPermissionKitLibTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 7.0; @@ -799,7 +797,6 @@ }; DCAEF7DC195C60070074EB5B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; DYLIB_COMPATIBILITY_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; @@ -815,7 +812,6 @@ }; DCAEF7DD195C60070074EB5B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; DYLIB_COMPATIBILITY_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; @@ -831,7 +827,7 @@ }; DCC1BFB9195B174200362559 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; + baseConfigurationReference = 1B7221721DA3DD7B00B9266F /* ISHPermissionKitFlags.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -887,7 +883,7 @@ }; DCC1BFBA195B174200362559 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; + baseConfigurationReference = 1B7221721DA3DD7B00B9266F /* ISHPermissionKitFlags.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -936,7 +932,6 @@ }; DCC1BFBC195B174200362559 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; @@ -957,7 +952,6 @@ }; DCC1BFBD195B174200362559 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; @@ -978,7 +972,6 @@ }; DCC1BFBF195B174200362559 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { INFOPLIST_FILE = ISHPermissionKitTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -992,7 +985,6 @@ }; DCC1BFC0195B174200362559 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { INFOPLIST_FILE = ISHPermissionKitTests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; @@ -1006,7 +998,6 @@ }; DCC1BFDD195B176E00362559 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; @@ -1022,7 +1013,6 @@ }; DCC1BFDE195B176E00362559 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 1B7221221DA3B5BA00B9266F /* PermissionKitFlags.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; diff --git a/ISHPermissionKit/ISHPermissionKitFlags.xcconfig b/ISHPermissionKit/ISHPermissionKitFlags.xcconfig new file mode 100644 index 0000000..bf21e74 --- /dev/null +++ b/ISHPermissionKit/ISHPermissionKitFlags.xcconfig @@ -0,0 +1,10 @@ +// +// ISHPermissionKitFlags.xcconfig +// ISHPermissionKit +// +// Created by Hagi on 04/10/16. +// Copyright © 2016 iosphere GmbH. All rights reserved. +// + +// This hook allows users of the framework to provide build flags without modifying any files within the ISHPermissionKit repository. See README.md for instructions. +#include? "../../ISHPermissionKitFlags.xcconfig" diff --git a/PermissionsTestApp/PermissionKitFlags.xcconfig b/PermissionsTestApp/PermissionKitFlags.xcconfig deleted file mode 100644 index c63c3c7..0000000 --- a/PermissionsTestApp/PermissionKitFlags.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -// -// PermissionKitFlags.xcconfig -// ISHPermissionKit -// -// Created by Hagi on 04/10/16. -// Copyright © 2016 iosphere GmbH. All rights reserved. -// - -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) ISHPermissionRequestMotionEnabled ISHPermissionRequestHealthKitEnabled ISHPermissionRequestLocationEnabled ISHPermissionRequestMicrophoneEnabled ISHPermissionRequestPhotoLibraryEnabled ISHPermissionRequestCameraEnabled ISHPermissionRequestNotificationsEnabled ISHPermissionRequestSocialAccountsEnabled ISHPermissionRequestContactsEnabled ISHPermissionRequestCalendarEnabled ISHPermissionRequestRemindersEnabled ISHPermissionRequestSiriEnabled ISHPermissionRequestSpeechEnabled From 26df0ba5667f2ef0637cda9ab3eca69794eb129f Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Tue, 4 Oct 2016 18:40:19 +0200 Subject: [PATCH 06/22] Fix Speech feature flag --- ISHPermissionKit/Requests/ISHPermissionRequest+All.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ISHPermissionKit/Requests/ISHPermissionRequest+All.m b/ISHPermissionKit/Requests/ISHPermissionRequest+All.m index 4446af0..4ffa4c0 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequest+All.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequest+All.m @@ -128,7 +128,7 @@ + (ISHPermissionRequest *)requestForCategory:(ISHPermissionCategory)category { break; #endif -#ifdef ISHPermissionRequestSiriEnabled +#ifdef ISHPermissionRequestSpeechEnabled case ISHPermissionCategorySpeechRecognition: request = [ISHPermissionRequestSpeechRecognition new]; break; From 5f0f52c4e252a3b155fa9a0622702baee0fc14f3 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Tue, 4 Oct 2016 19:16:02 +0200 Subject: [PATCH 07/22] Provide sample file for build configuration --- ISHPermissionKit.xcodeproj/project.pbxproj | 2 ++ .../ISHPermissionKitFlags.xcconfig | 2 +- ISHPermissionKitAppConfiguration.xcconfig | 26 +++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 ISHPermissionKitAppConfiguration.xcconfig diff --git a/ISHPermissionKit.xcodeproj/project.pbxproj b/ISHPermissionKit.xcodeproj/project.pbxproj index 1dc7b2c..adc6c50 100644 --- a/ISHPermissionKit.xcodeproj/project.pbxproj +++ b/ISHPermissionKit.xcodeproj/project.pbxproj @@ -151,6 +151,7 @@ 1B0932481D7069C70095A74A /* ISHPermissionRequestContacts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionRequestContacts.m; sourceTree = ""; }; 1B09324B1D7069D90095A74A /* ISHPermissionRequestContacts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ISHPermissionRequestContacts.h; path = ISHPermissionKit/Private/ISHPermissionRequestContacts.h; sourceTree = SOURCE_ROOT; }; 1B20492E1D007F830042FF2E /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; + 1B2450C51DA419F100F1EEF0 /* ISHPermissionKitAppConfiguration.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ISHPermissionKitAppConfiguration.xcconfig; sourceTree = ""; }; 1B2A265F1D07297C000FD12C /* ISHPermissionKit.podspec */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = text; path = ISHPermissionKit.podspec; sourceTree = ""; tabWidth = 2; }; 1B4512FB1D6DC01200D6E47C /* ISHPermissionRequestSiri.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionRequestSiri.m; sourceTree = ""; }; 1B4513041D6DC02D00D6E47C /* ISHPermissionRequestSiri.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ISHPermissionRequestSiri.h; path = ISHPermissionKit/Private/ISHPermissionRequestSiri.h; sourceTree = SOURCE_ROOT; }; @@ -341,6 +342,7 @@ 1B87C1BB1961AA5D001D85E7 /* README.md */, 1BBCCA7E1BFF367D00606D3D /* CHANGELOG.md */, 1B2A265F1D07297C000FD12C /* ISHPermissionKit.podspec */, + 1B2450C51DA419F100F1EEF0 /* ISHPermissionKitAppConfiguration.xcconfig */, DCC1BFA7195B174200362559 /* ISHPermissionKit */, DCC1BFB4195B174200362559 /* ISHPermissionKitTests */, DCC1BFC6195B176E00362559 /* PermissionsTestApp */, diff --git a/ISHPermissionKit/ISHPermissionKitFlags.xcconfig b/ISHPermissionKit/ISHPermissionKitFlags.xcconfig index bf21e74..968c4d3 100644 --- a/ISHPermissionKit/ISHPermissionKitFlags.xcconfig +++ b/ISHPermissionKit/ISHPermissionKitFlags.xcconfig @@ -7,4 +7,4 @@ // // This hook allows users of the framework to provide build flags without modifying any files within the ISHPermissionKit repository. See README.md for instructions. -#include? "../../ISHPermissionKitFlags.xcconfig" +#include? "../../ISHPermissionKitAppConfiguration.xcconfig" diff --git a/ISHPermissionKitAppConfiguration.xcconfig b/ISHPermissionKitAppConfiguration.xcconfig new file mode 100644 index 0000000..bfcf46b --- /dev/null +++ b/ISHPermissionKitAppConfiguration.xcconfig @@ -0,0 +1,26 @@ +// +// ISHPermissionKitAppConfiguration.xcconfig +// ISHPermissionKit +// +// Created by Hagi on 04/10/16. +// Copyright © 2016 iosphere GmbH. All rights reserved. +// + +// Apps using ISHPermissionKit without CocoaPods should copy this file and paste it in the same directory as ISHPermissionKit's root directory (not *in* the root directory). Please see README.md for further instructions. + +ISH_PERMISSION_FLAG_MOTION = //ISHPermissionRequestMotionEnabled +ISH_PERMISSION_FLAG_HEALTH = //ISHPermissionRequestHealthKitEnabled +ISH_PERMISSION_FLAG_LOCATION = //ISHPermissionRequestLocationEnabled +ISH_PERMISSION_FLAG_MIC = //ISHPermissionRequestMicrophoneEnabled +ISH_PERMISSION_FLAG_PHOTOS = //ISHPermissionRequestPhotoLibraryEnabled +ISH_PERMISSION_FLAG_CAMERA = //ISHPermissionRequestCameraEnabled +ISH_PERMISSION_FLAG_NOTIFICATIONS = //ISHPermissionRequestNotificationsEnabled +ISH_PERMISSION_FLAG_SOCIAL = //ISHPermissionRequestSocialAccountsEnabled +ISH_PERMISSION_FLAG_CONTACTS = //ISHPermissionRequestContactsEnabled +ISH_PERMISSION_FLAG_CALENDAR = //ISHPermissionRequestCalendarEnabled +ISH_PERMISSION_FLAG_REMINDERS = //ISHPermissionRequestRemindersEnabled +ISH_PERMISSION_FLAG_SIRI = //ISHPermissionRequestSiriEnabled +ISH_PERMISSION_FLAG_SPEECH = //ISHPermissionRequestSpeechEnabled + +// Do not modify this line. Instead, remove comments above as needed to enable the categories your app uses. Please see ISHPermissionCategory.h for implications and requirements of using certain permission categories. +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) $(ISH_PERMISSION_FLAG_MOTION) $(ISH_PERMISSION_FLAG_HEALTH) $(ISH_PERMISSION_FLAG_LOCATION) $(ISH_PERMISSION_FLAG_MIC) $(ISH_PERMISSION_FLAG_PHOTOS) $(ISH_PERMISSION_FLAG_CAMERA) $(ISH_PERMISSION_FLAG_NOTIFICATIONS) $(ISH_PERMISSION_FLAG_SOCIAL) $(ISH_PERMISSION_FLAG_CONTACTS) $(ISH_PERMISSION_FLAG_CALENDAR) $(ISH_PERMISSION_FLAG_REMINDERS) $(ISH_PERMISSION_FLAG_SIRI) $(ISH_PERMISSION_FLAG_SPEECH) From 70f95ed138c5214faf758083a125c950effda783 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Thu, 6 Oct 2016 17:27:07 +0200 Subject: [PATCH 08/22] Add feature flag for music permission and improve documentation --- ISHPermissionKit/ISHPermissionCategory.h | 76 ++++++++++++------- .../ISHPermissionRequestMusicLibrary.h | 6 +- .../Requests/ISHPermissionRequest+All.m | 5 ++ .../ISHPermissionRequestMusicLibrary.m | 4 + ISHPermissionKitAppConfiguration.xcconfig | 3 +- 5 files changed, 64 insertions(+), 30 deletions(-) diff --git a/ISHPermissionKit/ISHPermissionCategory.h b/ISHPermissionKit/ISHPermissionCategory.h index 96f5fe3..71af6d5 100644 --- a/ISHPermissionKit/ISHPermissionCategory.h +++ b/ISHPermissionKit/ISHPermissionCategory.h @@ -8,23 +8,27 @@ /** * Permission categories describe types of permissions on iOS. - * Each is related to a specific PermissionRequest. + * Each is related to a specific ISHPermissionRequest. * - * To prevent auto-linking frameworks that are not used, each - * category must be explicitly enabled by a build flag. Some - * frameworks have additional requirements. Please read the - * documentation for each category carefully to avoid App Store - * rejections. + * To prevent having unused auto-linked frameworks and privacy- + * sensitive APIS in your app, each category must be explicitly + * enabled by a build flag. Some frameworks have additional + * requirements. Please read the documentation for each category + * carefully to avoid App Store rejections. * * @note Values assigned to each category must not be changed, as * they may have been persisted on user devices. */ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { + /** + * Invalid category. Should be treated as error case. + */ + ISHPermissionCategoryInvalid = 0, #ifdef ISHPermissionRequestMotionEnabled /** * Permission required for accessing the accelerometer, step - * counting and motion activity queries. + * counting, and motion activity queries. * * The app must also provide a localized NSMotionUsageDescription * in the Info PLIST. Please consult the app review guidelines @@ -122,8 +126,8 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * in the Info PLIST. * * To enable this category, you must set the preprocessor flag - * ISHPermissionRequestPhotoLibraryEnabled. This will link AssetsLibrary - * and Photos. + * ISHPermissionRequestPhotoLibraryEnabled. This will link the + * AssetsLibrary and Photos frameworks. * * @sa ISHPermissionCategoryModernPhotoLibrary */ @@ -137,8 +141,8 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * in the Info PLIST. * * To enable this category, you must set the preprocessor flag - * ISHPermissionRequestPhotoLibraryEnabled. This will link AssetsLibrary - * and Photos. + * ISHPermissionRequestPhotoLibraryEnabled. This will link the + * AssetsLibrary and Photos frameworks. */ ISHPermissionCategoryModernPhotoLibrary NS_ENUM_AVAILABLE_IOS(8_0) = 5050, #endif @@ -162,7 +166,7 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * * To enable this category, you must set the preprocessor flag * ISHPermissionRequestNotificationsEnabled. This will link UIKit and - * UserNotification. + * the UserNotification framework. * * @note Requests for this permission might require further * configuration via the ISHPermissionsViewControllerDataSource. @@ -182,7 +186,8 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * Permission required to receive user-facing remote notifications. * * To enable this category, you must set the preprocessor flag - * ISHPermissionRequestNotificationsEnabled. This will link UserNotification. + * ISHPermissionRequestNotificationsEnabled. This will link UIKit and + * the UserNotification framework. * * @note Requests for this permission might require further * configuration via the ISHPermissionsViewControllerDataSource to notificationSettings. @@ -212,32 +217,37 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * Permission required to access the user's Facebook accounts. * * To enable this category, you must set the preprocessor flag - * ISHPermissionRequestSocialAccountsEnabled. This will link Accounts. + * ISHPermissionRequestSocialAccountsEnabled. This will link the + * Accounts framework. * * @note Requests for this permission require further * configuration via the ISHPermissionsViewControllerDataSource. - * The request will require an options dictionary including, e.g., ACFacebookAppIdKey. + * The request will require an options dictionary including, e.g., + * ACFacebookAppIdKey. */ ISHPermissionCategorySocialFacebook = 7100, /** * Permission required to access the user's Twitter accounts. * * To enable this category, you must set the preprocessor flag - * ISHPermissionRequestSocialAccountsEnabled. This will link Accounts. + * ISHPermissionRequestSocialAccountsEnabled. This will link the + * Accounts framework. */ ISHPermissionCategorySocialTwitter = 7110, /** * Permission required to access the user's SinaWeibo accounts. * * To enable this category, you must set the preprocessor flag - * ISHPermissionRequestSocialAccountsEnabled. This will link Accounts. + * ISHPermissionRequestSocialAccountsEnabled. This will link the + * Accounts framework. */ ISHPermissionCategorySocialSinaWeibo = 7120, /** * Permission required to access the user's TencentWeibo accounts. * * To enable this category, you must set the preprocessor flag - * ISHPermissionRequestSocialAccountsEnabled. This will link Accounts. + * ISHPermissionRequestSocialAccountsEnabled. This will link the + * Accounts framework. */ ISHPermissionCategorySocialTencentWeibo = 7130, #endif @@ -252,8 +262,8 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * section 5.1 (Privacy). * * To enable this category, you must set the preprocessor flag - * ISHPermissionRequestContactsEnabled. This will link Contacts - * and AddressBook. + * ISHPermissionRequestContactsEnabled. This will link the Contacts + * and AddressBook frameworks. * * @sa ISHPermissionCategoryContacts */ @@ -268,8 +278,8 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * section 5.1 (Privacy). * * To enable this category, you must set the preprocessor flag - * ISHPermissionRequestContactsEnabled. This will link Contacts - * and AddressBook. + * ISHPermissionRequestContactsEnabled. This will link the Contacts + * and AddressBook frameworks. */ ISHPermissionCategoryContacts NS_ENUM_AVAILABLE_IOS(9_0) = 8500, #endif @@ -306,7 +316,6 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { // These categories requires Xcode 8/iOS 10 SDK #ifdef NSFoundationVersionNumber_iOS_9_0 - #ifdef ISHPermissionRequestSiriEnabled /** * Permission required for Siri to access your app's data. @@ -318,7 +327,8 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * in the Info PLIST. * * To enable this category, you must set the preprocessor flag - * ISHPermissionRequestSiriEnabled. This will link Intents. + * ISHPermissionRequestSiriEnabled. This will link the Intents + * framework. */ ISHPermissionCategorySiri NS_ENUM_AVAILABLE_IOS(10_0) = 9000, #endif @@ -332,7 +342,8 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * in the Info PLIST. * * To enable this category, you must set the preprocessor flag - * ISHPermissionRequestSpeechEnabled. This will link Speech. + * ISHPermissionRequestSpeechEnabled. This will link the Speech + * framework. */ ISHPermissionCategorySpeechRecognition NS_ENUM_AVAILABLE_IOS(10_0) = 10000, #endif @@ -354,24 +365,28 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * * To enable this category, you must set the preprocessor flag * ISHPermissionRequestNotificationsEnabled. This will link UIKit and - * UserNotification. + * the UserNotification framework. */ ISHPermissionCategoryUserNotification NS_ENUM_AVAILABLE_IOS(10_0) = 6500, #endif - #endif +#ifdef ISHPermissionRequestMusicLibraryEnabled /** * Permission required to access the user's music library, including, * but not limited to the user's songs and lists from Apple Music. * * The app must also provide a localized NSAppleMusicUsageDescription * in the Info PLIST. + * + * To enable this category, you must set the preprocessor flag + * ISHPermissionRequestMusicLibraryEnabled. This will link the MediaPlayer + * framework. */ ISHPermissionCategoryMusicLibrary NS_ENUM_AVAILABLE_IOS(9.3) = 11000, +#endif }; - /** * @param category A value from the ISHPermissionCategory enum. * @@ -448,8 +463,10 @@ static inline NSString * _Nonnull ISHStringFromPermissionCategory(ISHPermissionC return @"ISHPermissionCategoryReminders"; #endif +#ifdef ISHPermissionRequestMusicLibraryEnabled case ISHPermissionCategoryMusicLibrary: return @"ISHPermissionCategoryMusicLibrary"; +#endif #ifdef NSFoundationVersionNumber_iOS_9_0 #ifdef ISHPermissionRequestSiriEnabled @@ -467,6 +484,9 @@ static inline NSString * _Nonnull ISHStringFromPermissionCategory(ISHPermissionC return @"ISHPermissionCategoryUserNotification"; #endif #endif + + case ISHPermissionCategoryInvalid: + break; } NSLog(@"Invalid category: %lu", (unsigned long)category); diff --git a/ISHPermissionKit/Private/ISHPermissionRequestMusicLibrary.h b/ISHPermissionKit/Private/ISHPermissionRequestMusicLibrary.h index 287e009..39717ff 100644 --- a/ISHPermissionKit/Private/ISHPermissionRequestMusicLibrary.h +++ b/ISHPermissionKit/Private/ISHPermissionRequestMusicLibrary.h @@ -6,7 +6,9 @@ // Copyright © 2016 iosphere GmbH. All rights reserved. // -#import +#import "ISHPermissionRequest.h" + +#ifdef ISHPermissionRequestMusicLibraryEnabled /** * Permission request to access the user's music library. @@ -16,3 +18,5 @@ @interface ISHPermissionRequestMusicLibrary : ISHPermissionRequest @end + +#endif diff --git a/ISHPermissionKit/Requests/ISHPermissionRequest+All.m b/ISHPermissionKit/Requests/ISHPermissionRequest+All.m index 4ffa4c0..5870d06 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequest+All.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequest+All.m @@ -117,9 +117,11 @@ + (ISHPermissionRequest *)requestForCategory:(ISHPermissionCategory)category { break; #endif +#ifdef ISHPermissionRequestMusicLibraryEnabled case ISHPermissionCategoryMusicLibrary: request = [ISHPermissionRequestMusicLibrary new]; break; +#endif #ifdef NSFoundationVersionNumber_iOS_9_0 #ifdef ISHPermissionRequestSiriEnabled @@ -140,6 +142,9 @@ + (ISHPermissionRequest *)requestForCategory:(ISHPermissionCategory)category { break; #endif #endif + + case ISHPermissionCategoryInvalid: + break; } [request setPermissionCategory:category]; diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestMusicLibrary.m b/ISHPermissionKit/Requests/ISHPermissionRequestMusicLibrary.m index c4b60bc..0653bee 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestMusicLibrary.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestMusicLibrary.m @@ -9,6 +9,8 @@ #import "ISHPermissionRequestMusicLibrary.h" #import "ISHPermissionRequest+Private.h" +#ifdef ISHPermissionRequestMusicLibraryEnabled + @import MediaPlayer; @implementation ISHPermissionRequestMusicLibrary @@ -66,3 +68,5 @@ - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletion #endif @end + +#endif diff --git a/ISHPermissionKitAppConfiguration.xcconfig b/ISHPermissionKitAppConfiguration.xcconfig index bfcf46b..b6d6619 100644 --- a/ISHPermissionKitAppConfiguration.xcconfig +++ b/ISHPermissionKitAppConfiguration.xcconfig @@ -21,6 +21,7 @@ ISH_PERMISSION_FLAG_CALENDAR = //ISHPermissionRequestCalendarEnabled ISH_PERMISSION_FLAG_REMINDERS = //ISHPermissionRequestRemindersEnabled ISH_PERMISSION_FLAG_SIRI = //ISHPermissionRequestSiriEnabled ISH_PERMISSION_FLAG_SPEECH = //ISHPermissionRequestSpeechEnabled +ISH_PERMISSION_FLAG_MUSIC = //ISHPermissionRequestMusicLibraryEnabled // Do not modify this line. Instead, remove comments above as needed to enable the categories your app uses. Please see ISHPermissionCategory.h for implications and requirements of using certain permission categories. -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) $(ISH_PERMISSION_FLAG_MOTION) $(ISH_PERMISSION_FLAG_HEALTH) $(ISH_PERMISSION_FLAG_LOCATION) $(ISH_PERMISSION_FLAG_MIC) $(ISH_PERMISSION_FLAG_PHOTOS) $(ISH_PERMISSION_FLAG_CAMERA) $(ISH_PERMISSION_FLAG_NOTIFICATIONS) $(ISH_PERMISSION_FLAG_SOCIAL) $(ISH_PERMISSION_FLAG_CONTACTS) $(ISH_PERMISSION_FLAG_CALENDAR) $(ISH_PERMISSION_FLAG_REMINDERS) $(ISH_PERMISSION_FLAG_SIRI) $(ISH_PERMISSION_FLAG_SPEECH) +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) $(ISH_PERMISSION_FLAG_MOTION) $(ISH_PERMISSION_FLAG_HEALTH) $(ISH_PERMISSION_FLAG_LOCATION) $(ISH_PERMISSION_FLAG_MIC) $(ISH_PERMISSION_FLAG_PHOTOS) $(ISH_PERMISSION_FLAG_CAMERA) $(ISH_PERMISSION_FLAG_NOTIFICATIONS) $(ISH_PERMISSION_FLAG_SOCIAL) $(ISH_PERMISSION_FLAG_CONTACTS) $(ISH_PERMISSION_FLAG_CALENDAR) $(ISH_PERMISSION_FLAG_REMINDERS) $(ISH_PERMISSION_FLAG_SIRI) $(ISH_PERMISSION_FLAG_SPEECH) $(ISH_PERMISSION_FLAG_MUSIC) From 99c59f564981b48c538b7a754b71095767e0d994 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Thu, 6 Oct 2016 17:38:25 +0200 Subject: [PATCH 09/22] Fix event store permissions --- .../Requests/ISHPermissionRequestEventStore.m | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ISHPermissionKit/Requests/ISHPermissionRequestEventStore.m b/ISHPermissionKit/Requests/ISHPermissionRequestEventStore.m index a87d8cc..49e5fa4 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequestEventStore.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequestEventStore.m @@ -28,7 +28,7 @@ - (EKEntityType)entityType { #endif #ifdef ISHPermissionRequestCalendarEnabled - if (self.permissionCategory == ISHPermissionCategoryReminders) { + if (self.permissionCategory == ISHPermissionCategoryEvents) { return EKEntityTypeEvent; } #endif @@ -76,11 +76,19 @@ - (void)requestUserPermissionWithCompletionBlock:(ISHPermissionRequestCompletion #if DEBUG - (NSArray *)staticUsageDescriptionKeys { +#ifdef ISHPermissionRequestRemindersEnabled if (self.permissionCategory == ISHPermissionCategoryReminders) { return @[@"NSRemindersUsageDescription"]; - } else { + } +#endif + +#ifdef ISHPermissionRequestCalendarEnabled + if (self.permissionCategory == ISHPermissionCategoryEvents) { return @[@"NSCalendarsUsageDescription"]; } +#endif + + return @[]; } #endif From 1d72bbdee09f54cd8cc1c55cc2dd420ef33ebf39 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Thu, 6 Oct 2016 17:43:26 +0200 Subject: [PATCH 10/22] Minor comments improvements in sample app --- PermissionsTestApp/AppDelegate.m | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/PermissionsTestApp/AppDelegate.m b/PermissionsTestApp/AppDelegate.m index d0b82cf..3501fa3 100644 --- a/PermissionsTestApp/AppDelegate.m +++ b/PermissionsTestApp/AppDelegate.m @@ -53,6 +53,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( @(ISHPermissionCategoryModernPhotoLibrary), @(ISHPermissionCategoryPhotoCamera), @(ISHPermissionCategoryNotificationLocal), + // requires Push capability & entitlements to actually work @(ISHPermissionCategoryNotificationRemote), @@ -64,14 +65,14 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( @(ISHPermissionCategoryAddressBook), @(ISHPermissionCategoryContacts), - //@(ISHPermissionCategoryEvents), - // TODO: fix defines - //@(ISHPermissionCategoryReminders), + @(ISHPermissionCategoryEvents), + @(ISHPermissionCategoryReminders), @(ISHPermissionCategoryMusicLibrary), #ifdef NSFoundationVersionNumber_iOS_9_0 // reqquires Siri capability & entitlements // @(ISHPermissionCategorySiri), + @(ISHPermissionCategorySpeechRecognition), @(ISHPermissionCategoryUserNotification), #endif From 093279af1518540679fa597722fe95386e34274b Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Fri, 7 Oct 2016 12:37:24 +0200 Subject: [PATCH 11/22] Remove sample app and duplicate test target --- ISHPermissionKit.xcodeproj/project.pbxproj | 251 ------------------ .../xcschemes/PermissionsTestApp.xcscheme | 91 ------- PermissionsTestApp/AppDelegate.h | 18 -- PermissionsTestApp/AppDelegate.m | 176 ------------ .../GrantedPermissionsViewController.h | 14 - .../GrantedPermissionsViewController.m | 103 ------- .../AppIcon.appiconset/AppIcon167x176@2x.png | Bin 33449 -> 0 bytes .../AppIcon.appiconset/AppIcon29x29.png | Bin 6528 -> 0 bytes .../AppIcon.appiconset/AppIcon29x29@2x.png | Bin 9808 -> 0 bytes .../AppIcon.appiconset/AppIcon40x40.png | Bin 7728 -> 0 bytes .../AppIcon.appiconset/AppIcon40x40@2x.png | Bin 12491 -> 0 bytes .../AppIcon.appiconset/AppIcon60x60@2x.png | Bin 16658 -> 0 bytes .../AppIcon.appiconset/AppIcon76x76.png | Bin 11292 -> 0 bytes .../AppIcon.appiconset/AppIcon76x76@2x.png | Bin 20832 -> 0 bytes .../AppIcon.appiconset/Contents.json | 106 -------- .../LaunchImage.launchimage/Contents.json | 25 -- .../Default-568@2x.png | Bin 18237 -> 0 bytes .../LaunchImage.launchimage/Default@2x.png | Bin 15938 -> 0 bytes PermissionsTestApp/Info.plist | 65 ----- PermissionsTestApp/Launch Screen.storyboard | 50 ---- .../SamplePermissionViewController.h | 13 - .../SamplePermissionViewController.m | 61 ----- .../SamplePermissionViewController.xib | 111 -------- PermissionsTestApp/main.m | 16 -- 24 files changed, 1100 deletions(-) delete mode 100644 ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/PermissionsTestApp.xcscheme delete mode 100644 PermissionsTestApp/AppDelegate.h delete mode 100644 PermissionsTestApp/AppDelegate.m delete mode 100644 PermissionsTestApp/GrantedPermissionsViewController.h delete mode 100644 PermissionsTestApp/GrantedPermissionsViewController.m delete mode 100644 PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon167x176@2x.png delete mode 100644 PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon29x29.png delete mode 100644 PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon29x29@2x.png delete mode 100644 PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon40x40.png delete mode 100644 PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon40x40@2x.png delete mode 100644 PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon60x60@2x.png delete mode 100644 PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon76x76.png delete mode 100644 PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon76x76@2x.png delete mode 100644 PermissionsTestApp/Images.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 PermissionsTestApp/Images.xcassets/LaunchImage.launchimage/Contents.json delete mode 100644 PermissionsTestApp/Images.xcassets/LaunchImage.launchimage/Default-568@2x.png delete mode 100644 PermissionsTestApp/Images.xcassets/LaunchImage.launchimage/Default@2x.png delete mode 100644 PermissionsTestApp/Info.plist delete mode 100644 PermissionsTestApp/Launch Screen.storyboard delete mode 100644 PermissionsTestApp/SamplePermissionViewController.h delete mode 100644 PermissionsTestApp/SamplePermissionViewController.m delete mode 100644 PermissionsTestApp/SamplePermissionViewController.xib delete mode 100644 PermissionsTestApp/main.m diff --git a/ISHPermissionKit.xcodeproj/project.pbxproj b/ISHPermissionKit.xcodeproj/project.pbxproj index adc6c50..e9c8aa9 100644 --- a/ISHPermissionKit.xcodeproj/project.pbxproj +++ b/ISHPermissionKit.xcodeproj/project.pbxproj @@ -11,7 +11,6 @@ 1B09324C1D7069D90095A74A /* ISHPermissionRequestContacts.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B09324B1D7069D90095A74A /* ISHPermissionRequestContacts.h */; }; 1B09324D1D7069D90095A74A /* ISHPermissionRequestContacts.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B09324B1D7069D90095A74A /* ISHPermissionRequestContacts.h */; }; 1B0932501D7069DF0095A74A /* ISHPermissionRequestContacts.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B0932481D7069C70095A74A /* ISHPermissionRequestContacts.m */; }; - 1B20492F1D007F830042FF2E /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1B20492E1D007F830042FF2E /* Launch Screen.storyboard */; }; 1B4513001D6DC01200D6E47C /* ISHPermissionRequestSiri.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B4512FB1D6DC01200D6E47C /* ISHPermissionRequestSiri.m */; }; 1B4513011D6DC01200D6E47C /* ISHPermissionRequestSiri.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B4512FB1D6DC01200D6E47C /* ISHPermissionRequestSiri.m */; }; 1B4513051D6DC02D00D6E47C /* ISHPermissionRequestSiri.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B4513041D6DC02D00D6E47C /* ISHPermissionRequestSiri.h */; }; @@ -23,8 +22,6 @@ 1B69884B1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B6988491D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.h */; }; 1B69884C1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B69884A1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.m */; }; 1B69884D1D6F57DD00C8EAB8 /* ISHPermissionRequestUserNotification.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B69884A1D6F40F400C8EAB8 /* ISHPermissionRequestUserNotification.m */; }; - 1B72213E1DA3D31200B9266F /* ISHPermissionKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCC1BFA5195B174200362559 /* ISHPermissionKit.framework */; }; - 1B72213F1DA3D31200B9266F /* ISHPermissionKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DCC1BFA5195B174200362559 /* ISHPermissionKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 1B96D5FB1D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B96D5F61D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m */; }; 1B96D5FC1D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B96D5F61D6F12C00026A4FC /* ISHPermissionRequestSpeechRecognition.m */; }; 1B96D6001D6F12CF0026A4FC /* ISHPermissionRequestSpeechRecognition.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B96D5FF1D6F12CF0026A4FC /* ISHPermissionRequestSpeechRecognition.h */; }; @@ -99,43 +96,15 @@ DCAEF7E6195C60250074EB5B /* ISHPermissionRequestMotion.m in Sources */ = {isa = PBXBuildFile; fileRef = DCAEF7C0195C5B6B0074EB5B /* ISHPermissionRequestMotion.m */; }; DCC1BFAB195B174200362559 /* ISHPermissionKit.h in Headers */ = {isa = PBXBuildFile; fileRef = DCC1BFAA195B174200362559 /* ISHPermissionKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; DCC1BFB8195B174200362559 /* ISHPermissionKitTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DCC1BFB7195B174200362559 /* ISHPermissionKitTests.m */; }; - DCC1BFCA195B176E00362559 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = DCC1BFC9195B176E00362559 /* main.m */; }; - DCC1BFCD195B176E00362559 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = DCC1BFCC195B176E00362559 /* AppDelegate.m */; }; - DCC1BFCF195B176E00362559 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DCC1BFCE195B176E00362559 /* Images.xcassets */; }; DCD56C781962AEDC00508F4A /* ISHPermissionRequestAccount.h in Headers */ = {isa = PBXBuildFile; fileRef = DCD56C761962AEDC00508F4A /* ISHPermissionRequestAccount.h */; settings = {ATTRIBUTES = (Public, ); }; }; DCD56C791962AEDC00508F4A /* ISHPermissionRequestAccount.m in Sources */ = {isa = PBXBuildFile; fileRef = DCD56C771962AEDC00508F4A /* ISHPermissionRequestAccount.m */; }; DCD56C7A1962AEDC00508F4A /* ISHPermissionRequestAccount.m in Sources */ = {isa = PBXBuildFile; fileRef = DCD56C771962AEDC00508F4A /* ISHPermissionRequestAccount.m */; }; DCD56C7D1962BB8600508F4A /* ISHPermissionRequestHealth.h in Headers */ = {isa = PBXBuildFile; fileRef = DCD56C7B1962BB8600508F4A /* ISHPermissionRequestHealth.h */; settings = {ATTRIBUTES = (Public, ); }; }; DCD56C7E1962BB8600508F4A /* ISHPermissionRequestHealth.m in Sources */ = {isa = PBXBuildFile; fileRef = DCD56C7C1962BB8600508F4A /* ISHPermissionRequestHealth.m */; }; DCD56C7F1962BB8600508F4A /* ISHPermissionRequestHealth.m in Sources */ = {isa = PBXBuildFile; fileRef = DCD56C7C1962BB8600508F4A /* ISHPermissionRequestHealth.m */; }; - DCDB31081D0AC0B9005E9A71 /* GrantedPermissionsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DCDB31071D0AC0B9005E9A71 /* GrantedPermissionsViewController.m */; }; - DCDB31091D0AFBBD005E9A71 /* ISHPermissionKitTests.m in Sources */ = {isa = PBXBuildFile; fileRef = DCC1BFB7195B174200362559 /* ISHPermissionKitTests.m */; }; - DCF18617195C2B1B00CC155E /* SamplePermissionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DCF18615195C2B1B00CC155E /* SamplePermissionViewController.m */; }; - DCF18618195C2B1B00CC155E /* SamplePermissionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = DCF18616195C2B1B00CC155E /* SamplePermissionViewController.xib */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - 1B7221401DA3D31200B9266F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = DCC1BF9C195B174200362559 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DCC1BFA4195B174200362559; - remoteInfo = ISHPermissionKit; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXCopyFilesBuildPhase section */ - 1B7221421DA3D31200B9266F /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 1B72213F1DA3D31200B9266F /* ISHPermissionKit.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; DCAEF7C8195C60070074EB5B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -150,7 +119,6 @@ /* Begin PBXFileReference section */ 1B0932481D7069C70095A74A /* ISHPermissionRequestContacts.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionRequestContacts.m; sourceTree = ""; }; 1B09324B1D7069D90095A74A /* ISHPermissionRequestContacts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ISHPermissionRequestContacts.h; path = ISHPermissionKit/Private/ISHPermissionRequestContacts.h; sourceTree = SOURCE_ROOT; }; - 1B20492E1D007F830042FF2E /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; 1B2450C51DA419F100F1EEF0 /* ISHPermissionKitAppConfiguration.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ISHPermissionKitAppConfiguration.xcconfig; sourceTree = ""; }; 1B2A265F1D07297C000FD12C /* ISHPermissionKit.podspec */ = {isa = PBXFileReference; indentWidth = 2; lastKnownFileType = text; path = ISHPermissionKit.podspec; sourceTree = ""; tabWidth = 2; }; 1B4512FB1D6DC01200D6E47C /* ISHPermissionRequestSiri.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionRequestSiri.m; sourceTree = ""; }; @@ -188,7 +156,6 @@ DC6A8ACC19641549005AC5BD /* ISHPermissionRequestAddressBook.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionRequestAddressBook.m; sourceTree = ""; }; DC6A8AD119642793005AC5BD /* ISHPermissionRequestEventStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ISHPermissionRequestEventStore.h; path = ../Private/ISHPermissionRequestEventStore.h; sourceTree = ""; }; DC6A8AD219642793005AC5BD /* ISHPermissionRequestEventStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionRequestEventStore.m; sourceTree = ""; }; - DC7790B319617CD7007CB2BC /* ISHPermissionKitLibTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ISHPermissionKitLibTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; DC7790B619617CD7007CB2BC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; DC799EB3195C0CF300A0CA36 /* ISHPermissionRequestViewController+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "ISHPermissionRequestViewController+Private.h"; path = "Private/ISHPermissionRequestViewController+Private.h"; sourceTree = ""; }; DC799EB5195C113900A0CA36 /* ISHPermissionRequestViewControllerDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ISHPermissionRequestViewControllerDelegate.h; path = Private/ISHPermissionRequestViewControllerDelegate.h; sourceTree = ""; }; @@ -207,31 +174,13 @@ DCC1BFB0195B174200362559 /* ISHPermissionKitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ISHPermissionKitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; DCC1BFB6195B174200362559 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; DCC1BFB7195B174200362559 /* ISHPermissionKitTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionKitTests.m; sourceTree = ""; }; - DCC1BFC5195B176E00362559 /* PermissionsTestApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PermissionsTestApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - DCC1BFC8195B176E00362559 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DCC1BFC9195B176E00362559 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - DCC1BFCB195B176E00362559 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - DCC1BFCC195B176E00362559 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - DCC1BFCE195B176E00362559 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; DCD56C761962AEDC00508F4A /* ISHPermissionRequestAccount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ISHPermissionRequestAccount.h; sourceTree = ""; }; DCD56C771962AEDC00508F4A /* ISHPermissionRequestAccount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionRequestAccount.m; sourceTree = ""; }; DCD56C7B1962BB8600508F4A /* ISHPermissionRequestHealth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ISHPermissionRequestHealth.h; sourceTree = ""; }; DCD56C7C1962BB8600508F4A /* ISHPermissionRequestHealth.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionRequestHealth.m; sourceTree = ""; }; - DCDB31061D0AC0B9005E9A71 /* GrantedPermissionsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GrantedPermissionsViewController.h; sourceTree = ""; }; - DCDB31071D0AC0B9005E9A71 /* GrantedPermissionsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GrantedPermissionsViewController.m; sourceTree = ""; }; - DCF18614195C2B1B00CC155E /* SamplePermissionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SamplePermissionViewController.h; sourceTree = ""; }; - DCF18615195C2B1B00CC155E /* SamplePermissionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SamplePermissionViewController.m; sourceTree = ""; }; - DCF18616195C2B1B00CC155E /* SamplePermissionViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SamplePermissionViewController.xib; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - DC7790B019617CD7007CB2BC /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; DCAEF7C7195C60070074EB5B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -254,14 +203,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - DCC1BFC2195B176E00362559 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1B72213E1DA3D31200B9266F /* ISHPermissionKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -345,7 +286,6 @@ 1B2450C51DA419F100F1EEF0 /* ISHPermissionKitAppConfiguration.xcconfig */, DCC1BFA7195B174200362559 /* ISHPermissionKit */, DCC1BFB4195B174200362559 /* ISHPermissionKitTests */, - DCC1BFC6195B176E00362559 /* PermissionsTestApp */, DC7790B419617CD7007CB2BC /* ISHPermissionKitLibTests */, DCC1BFA6195B174200362559 /* Products */, 1BAB47C01D6F31F300872D79 /* Frameworks */, @@ -357,9 +297,7 @@ children = ( DCC1BFA5195B174200362559 /* ISHPermissionKit.framework */, DCC1BFB0195B174200362559 /* ISHPermissionKitTests.xctest */, - DCC1BFC5195B176E00362559 /* PermissionsTestApp.app */, DCAEF7CA195C60070074EB5B /* libISHPermissionKitLib.a */, - DC7790B319617CD7007CB2BC /* ISHPermissionKitLibTests.xctest */, ); name = Products; sourceTree = ""; @@ -407,32 +345,6 @@ name = "Supporting Files"; sourceTree = ""; }; - DCC1BFC6195B176E00362559 /* PermissionsTestApp */ = { - isa = PBXGroup; - children = ( - DCC1BFCB195B176E00362559 /* AppDelegate.h */, - DCC1BFCC195B176E00362559 /* AppDelegate.m */, - DCC1BFCE195B176E00362559 /* Images.xcassets */, - DCC1BFC7195B176E00362559 /* Supporting Files */, - DCF18614195C2B1B00CC155E /* SamplePermissionViewController.h */, - DCF18615195C2B1B00CC155E /* SamplePermissionViewController.m */, - DCF18616195C2B1B00CC155E /* SamplePermissionViewController.xib */, - DCDB31061D0AC0B9005E9A71 /* GrantedPermissionsViewController.h */, - DCDB31071D0AC0B9005E9A71 /* GrantedPermissionsViewController.m */, - ); - path = PermissionsTestApp; - sourceTree = ""; - }; - DCC1BFC7195B176E00362559 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - DCC1BFC8195B176E00362559 /* Info.plist */, - DCC1BFC9195B176E00362559 /* main.m */, - 1B20492E1D007F830042FF2E /* Launch Screen.storyboard */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -504,23 +416,6 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - DC7790B219617CD7007CB2BC /* ISHPermissionKitLibTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = DC7790BE19617CD7007CB2BC /* Build configuration list for PBXNativeTarget "ISHPermissionKitLibTests" */; - buildPhases = ( - DC7790AF19617CD7007CB2BC /* Sources */, - DC7790B019617CD7007CB2BC /* Frameworks */, - DC7790B119617CD7007CB2BC /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ISHPermissionKitLibTests; - productName = ISHPermissionKitLibTests; - productReference = DC7790B319617CD7007CB2BC /* ISHPermissionKitLibTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; DCAEF7C9195C60070074EB5B /* ISHPermissionKitLib */ = { isa = PBXNativeTarget; buildConfigurationList = DCAEF7DB195C60070074EB5B /* Build configuration list for PBXNativeTarget "ISHPermissionKitLib" */; @@ -574,25 +469,6 @@ productReference = DCC1BFB0195B174200362559 /* ISHPermissionKitTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - DCC1BFC4195B176E00362559 /* PermissionsTestApp */ = { - isa = PBXNativeTarget; - buildConfigurationList = DCC1BFDC195B176E00362559 /* Build configuration list for PBXNativeTarget "PermissionsTestApp" */; - buildPhases = ( - DCC1BFC1195B176E00362559 /* Sources */, - DCC1BFC2195B176E00362559 /* Frameworks */, - DCC1BFC3195B176E00362559 /* Resources */, - 1B7221421DA3D31200B9266F /* Embed Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 1B7221411DA3D31200B9266F /* PBXTargetDependency */, - ); - name = PermissionsTestApp; - productName = PermissionsTestApp; - productReference = DCC1BFC5195B176E00362559 /* PermissionsTestApp.app */; - productType = "com.apple.product-type.application"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -602,10 +478,6 @@ LastUpgradeCheck = 0810; ORGANIZATIONNAME = "iosphere GmbH"; TargetAttributes = { - DC7790B219617CD7007CB2BC = { - CreatedOnToolsVersion = 6.0; - TestTargetID = DCAEF7C9195C60070074EB5B; - }; DCAEF7C9195C60070074EB5B = { CreatedOnToolsVersion = 6.0; }; @@ -616,9 +488,6 @@ CreatedOnToolsVersion = 6.0; TestTargetID = DCC1BFA4195B174200362559; }; - DCC1BFC4195B176E00362559 = { - CreatedOnToolsVersion = 6.0; - }; }; }; buildConfigurationList = DCC1BF9F195B174200362559 /* Build configuration list for PBXProject "ISHPermissionKit" */; @@ -635,21 +504,12 @@ targets = ( DCC1BFA4195B174200362559 /* ISHPermissionKit */, DCAEF7C9195C60070074EB5B /* ISHPermissionKitLib */, - DCC1BFC4195B176E00362559 /* PermissionsTestApp */, DCC1BFAF195B174200362559 /* ISHPermissionKitTests */, - DC7790B219617CD7007CB2BC /* ISHPermissionKitLibTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - DC7790B119617CD7007CB2BC /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; DCC1BFA3195B174200362559 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -664,27 +524,9 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - DCC1BFC3195B176E00362559 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 1B20492F1D007F830042FF2E /* Launch Screen.storyboard in Resources */, - DCF18618195C2B1B00CC155E /* SamplePermissionViewController.xib in Resources */, - DCC1BFCF195B176E00362559 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - DC7790AF19617CD7007CB2BC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DCDB31091D0AFBBD005E9A71 /* ISHPermissionKitTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; DCAEF7C6195C60070074EB5B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -749,54 +591,9 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - DCC1BFC1195B176E00362559 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DCC1BFCD195B176E00362559 /* AppDelegate.m in Sources */, - DCDB31081D0AC0B9005E9A71 /* GrantedPermissionsViewController.m in Sources */, - DCF18617195C2B1B00CC155E /* SamplePermissionViewController.m in Sources */, - DCC1BFCA195B176E00362559 /* main.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 1B7221411DA3D31200B9266F /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = DCC1BFA4195B174200362559 /* ISHPermissionKit */; - targetProxy = 1B7221401DA3D31200B9266F /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin XCBuildConfiguration section */ - DC7790BC19617CD7007CB2BC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = ISHPermissionKitLibTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_BUNDLE_IDENTIFIER = "de.iosphere.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - DC7790BD19617CD7007CB2BC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - INFOPLIST_FILE = ISHPermissionKitLibTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_BUNDLE_IDENTIFIER = "de.iosphere.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; DCAEF7DC195C60070074EB5B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -998,48 +795,9 @@ }; name = Release; }; - DCC1BFDD195B176E00362559 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - INFOPLIST_FILE = PermissionsTestApp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_BUNDLE_IDENTIFIER = "de.iosphere.${PRODUCT_NAME:rfc1034identifier}.25"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - DCC1BFDE195B176E00362559 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; - INFOPLIST_FILE = PermissionsTestApp/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - METAL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_BUNDLE_IDENTIFIER = "de.iosphere.${PRODUCT_NAME:rfc1034identifier}.25"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - DC7790BE19617CD7007CB2BC /* Build configuration list for PBXNativeTarget "ISHPermissionKitLibTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DC7790BC19617CD7007CB2BC /* Debug */, - DC7790BD19617CD7007CB2BC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; DCAEF7DB195C60070074EB5B /* Build configuration list for PBXNativeTarget "ISHPermissionKitLib" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1076,15 +834,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - DCC1BFDC195B176E00362559 /* Build configuration list for PBXNativeTarget "PermissionsTestApp" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DCC1BFDD195B176E00362559 /* Debug */, - DCC1BFDE195B176E00362559 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = DCC1BF9C195B174200362559 /* Project object */; diff --git a/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/PermissionsTestApp.xcscheme b/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/PermissionsTestApp.xcscheme deleted file mode 100644 index b18d347..0000000 --- a/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/PermissionsTestApp.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/PermissionsTestApp/AppDelegate.h b/PermissionsTestApp/AppDelegate.h deleted file mode 100644 index 91b27ce..0000000 --- a/PermissionsTestApp/AppDelegate.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// AppDelegate.h -// PermissionsTestApp -// -// Created by Felix Lamouroux on 25.06.14. -// Copyright (c) 2014 iosphere GmbH. All rights reserved. -// - -#import -#import - -@interface AppDelegate : UIResponder - -@property (nonatomic, nullable) UIWindow *window; - -+ (nonnull AppDelegate *)appDelegate; -+ (nonnull NSArray *)requiredPermissions; -@end diff --git a/PermissionsTestApp/AppDelegate.m b/PermissionsTestApp/AppDelegate.m deleted file mode 100644 index 3501fa3..0000000 --- a/PermissionsTestApp/AppDelegate.m +++ /dev/null @@ -1,176 +0,0 @@ -// -// AppDelegate.m -// PermissionsTestApp -// -// Created by Felix Lamouroux on 25.06.14. -// Copyright (c) 2014 iosphere GmbH. All rights reserved. -// - -#import "AppDelegate.h" -#import "SamplePermissionViewController.h" -#import "GrantedPermissionsViewController.h" - -@import Accounts; -@import HealthKit; - -@interface AppDelegate () -@property (nonatomic, weak) GrantedPermissionsViewController *rootViewController; -@end - -@implementation AppDelegate - -+ (AppDelegate *)appDelegate { - return (AppDelegate *)[[UIApplication sharedApplication] delegate]; -} - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [self setupWindow]; - - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self presentPermissionsIfNeeded]; - }); - - return YES; -} - -+ (NSArray *)requiredPermissions { - // The demo app requests all supported permissions. Those that - // require special capabilities have been commented out since - // they require additional configuration in Xcode. - return @[ - @(ISHPermissionCategoryActivity), - - // requires Health capability & entitlements - // @(ISHPermissionCategoryHealth), - - // If you want to request both, the order is important, - // as Always implies WhenInUse, too - @(ISHPermissionCategoryLocationWhenInUse), - @(ISHPermissionCategoryLocationAlways), - - @(ISHPermissionCategoryMicrophone), - @(ISHPermissionCategoryPhotoLibrary), - @(ISHPermissionCategoryModernPhotoLibrary), - @(ISHPermissionCategoryPhotoCamera), - @(ISHPermissionCategoryNotificationLocal), - - // requires Push capability & entitlements to actually work - @(ISHPermissionCategoryNotificationRemote), - - @(ISHPermissionCategorySocialFacebook), - @(ISHPermissionCategorySocialTwitter), - @(ISHPermissionCategorySocialSinaWeibo), - // TODO: alert cannot be presented - @(ISHPermissionCategorySocialTencentWeibo), - - @(ISHPermissionCategoryAddressBook), - @(ISHPermissionCategoryContacts), - @(ISHPermissionCategoryEvents), - @(ISHPermissionCategoryReminders), - @(ISHPermissionCategoryMusicLibrary), - -#ifdef NSFoundationVersionNumber_iOS_9_0 - // reqquires Siri capability & entitlements - // @(ISHPermissionCategorySiri), - - @(ISHPermissionCategorySpeechRecognition), - @(ISHPermissionCategoryUserNotification), -#endif - ]; -} - -- (void)presentPermissionsIfNeeded { - NSArray *permissions = [AppDelegate requiredPermissions]; - ISHPermissionsViewController *permissionsVC = [ISHPermissionsViewController permissionsViewControllerWithCategories:permissions dataSource:self]; - __weak GrantedPermissionsViewController *rootVC = self.rootViewController; - [permissionsVC setCompletionBlock:^{ - [rootVC reloadPermissionsUsingDataSource:self]; - }]; - - __weak ISHPermissionsViewController *weakPermissionsVC = permissionsVC; - [permissionsVC setErrorBlock:^(ISHPermissionCategory category, NSError *error) { - UIAlertController *alert = [UIAlertController alertControllerWithTitle:ISHStringFromPermissionCategory(category) - message:error.localizedDescription - preferredStyle:UIAlertControllerStyleAlert]; - [alert addAction:[UIAlertAction actionWithTitle:@"Too bad" style:UIAlertActionStyleCancel handler:nil]]; - // if weakPermissionsVC still has a parent, present from there else present from root - UIViewController *presentingVC = weakPermissionsVC.parentViewController ? weakPermissionsVC : rootVC; - [presentingVC presentViewController:alert animated:nil completion:nil]; - }]; - - if (permissionsVC) { - [self.window.rootViewController presentViewController:permissionsVC animated:YES completion:nil]; - } -} - -#pragma mark ISHPermissionsViewControllerDataSource - -- (ISHPermissionRequestViewController *)permissionsViewController:(ISHPermissionsViewController *)vc requestViewControllerForCategory:(ISHPermissionCategory)category { - return [SamplePermissionViewController new]; -} - -- (void)permissionsViewController:(ISHPermissionsViewController *)vc didConfigureRequest:(ISHPermissionRequest *)request { - switch (request.permissionCategory) { - case ISHPermissionCategoryHealth: { - ISHPermissionRequestHealth *healthRequest = (ISHPermissionRequestHealth *)([request isKindOfClass:[ISHPermissionRequestHealth class]] ? request : nil); - HKQuantityType *heartRate = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; - healthRequest.objectTypesRead = [NSSet setWithObjects:heartRate, nil]; - healthRequest.objectTypesWrite = [NSSet setWithObjects:heartRate, nil]; - break; - } - - case ISHPermissionCategoryNotificationLocal: { - // the demo app only requests permissions for badges - UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil]; - ISHPermissionRequestNotificationsLocal *localNotesRequest = (ISHPermissionRequestNotificationsLocal *)([request isKindOfClass:[ISHPermissionRequestNotificationsLocal class]] ? request : nil); - [localNotesRequest setNotificationSettings:setting]; - break; - } - - case ISHPermissionCategorySocialFacebook: - case ISHPermissionCategorySocialTencentWeibo: { - ISHPermissionRequestAccount *accountRequest = (ISHPermissionRequestAccount *)([request isKindOfClass:[ISHPermissionRequestAccount class]] ? request : nil); - - NSDictionary *options; - if ([accountRequest.accountTypeIdentifier isEqualToString:ACAccountTypeIdentifierFacebook]) { - options = @{ - ACFacebookAppIdKey: @"YOUR-API-KEY", - ACFacebookPermissionsKey: @[@"email", @"user_about_me"], - ACFacebookAudienceKey: ACFacebookAudienceFriends, - }; - } else if ([accountRequest.accountTypeIdentifier isEqualToString:ACAccountTypeIdentifierTencentWeibo]) { - options = @{ - ACTencentWeiboAppIdKey: @"YOUR-API-KEY", - }; - } - - [accountRequest setOptions:options]; - break; - } - - default: - break; - } -} - -#pragma mark Important for local Notifications - -- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { - [[NSNotificationCenter defaultCenter] postNotificationName:ISHPermissionNotificationApplicationDidRegisterUserNotificationSettings - object:self]; -} - -#pragma mark Boiler plate - -- (void)setupWindow { - self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; - // Override point for customization after application launch. - self.window.backgroundColor = [UIColor whiteColor]; - - GrantedPermissionsViewController *rootViewController = [GrantedPermissionsViewController new]; - [self.window setRootViewController:rootViewController]; - self.rootViewController = rootViewController; - [self.window makeKeyAndVisible]; -} - -@end diff --git a/PermissionsTestApp/GrantedPermissionsViewController.h b/PermissionsTestApp/GrantedPermissionsViewController.h deleted file mode 100644 index e79ad45..0000000 --- a/PermissionsTestApp/GrantedPermissionsViewController.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// GrantedPermissionsViewController.h -// ISHPermissionKit -// -// Created by Felix Lamouroux on 10.06.16. -// Copyright © 2016 iosphere GmbH. All rights reserved. -// - -#import -#import - -@interface GrantedPermissionsViewController : UITableViewController -- (void)reloadPermissionsUsingDataSource:(id)datasource; -@end diff --git a/PermissionsTestApp/GrantedPermissionsViewController.m b/PermissionsTestApp/GrantedPermissionsViewController.m deleted file mode 100644 index 79f405f..0000000 --- a/PermissionsTestApp/GrantedPermissionsViewController.m +++ /dev/null @@ -1,103 +0,0 @@ -// -// GrantedPermissionsViewController.m -// ISHPermissionKit -// -// Created by Felix Lamouroux on 10.06.16. -// Copyright © 2016 iosphere GmbH. All rights reserved. -// - -#import "GrantedPermissionsViewController.h" -#import "AppDelegate.h" -#import - -NSString * const GrantedPermissionsViewControllerCell = @"cell"; -NSInteger const RequestabalePermissionsSection = 1; - -@interface GrantedPermissionsViewController () -@property NSArray *permissionsNotRequestable; -@property NSArray *permissionsRequestable; -@end - -@implementation GrantedPermissionsViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - [self.view setBackgroundColor:[UIColor colorWithRed:0.400 green:0.800 blue:1.000 alpha:1.000]]; - [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:GrantedPermissionsViewControllerCell]; - [self reloadPermissionsUsingDataSource:[AppDelegate appDelegate]]; -} - -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0, self.bottomLayoutGuide.length, 0); -} - -- (void)reloadPermissionsUsingDataSource:(id)datasource { - NSArray *allPermissions = [AppDelegate requiredPermissions]; - ISHPermissionsViewController *viewControllerForStateQueries = [ISHPermissionsViewController permissionsViewControllerWithCategories:allPermissions - dataSource:datasource]; - - NSArray *requestablePermissions = [viewControllerForStateQueries permissionCategories] ?: @[]; - - self.permissionsRequestable = [requestablePermissions sortedArrayUsingSelector:@selector(compare:)]; - NSMutableSet *permissionsNotRequestable = [NSMutableSet setWithArray:allPermissions]; - [permissionsNotRequestable minusSet:[NSSet setWithArray:requestablePermissions]]; - self.permissionsNotRequestable = [[permissionsNotRequestable allObjects] sortedArrayUsingSelector:@selector(compare:)]; - [self.tableView reloadData]; -} - -- (NSArray *)permissionsForSection:(NSInteger)section { - if (section == RequestabalePermissionsSection) { - return self.permissionsRequestable; - } - - return self.permissionsNotRequestable; -} - -- (NSNumber *)permissionAtIndexPath:(NSIndexPath *)indexPath { - NSArray *permissions = [self permissionsForSection:indexPath.section]; - - if (indexPath.row >= permissions.count) { - return nil; - } - - return [permissions objectAtIndex:indexPath.row]; -} - -#pragma mark UITableViewDatasource -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 2; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [[self permissionsForSection:section] count]; -} - -- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { - if (section == RequestabalePermissionsSection) { - return @"Requestable"; - } - - return @"Not requestable"; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:GrantedPermissionsViewControllerCell forIndexPath:indexPath]; - cell.selectionStyle = UITableViewCellSelectionStyleNone; - - NSNumber *permission = [self permissionAtIndexPath:indexPath]; - - if (permission) { - cell.textLabel.text = ISHStringFromPermissionCategory(permission.unsignedIntegerValue); - } else { - cell.textLabel.text = nil; - } - - UIColor *color = (indexPath.section == RequestabalePermissionsSection) ? [UIColor darkTextColor] : [UIColor lightGrayColor]; - - cell.textLabel.textColor = color; - - return cell; -} - -@end diff --git a/PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon167x176@2x.png b/PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon167x176@2x.png deleted file mode 100644 index cdb3fb49bb4a2379aaadae48a71f2e8f1979c829..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33449 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 at9I&n(XwljQ?ZKw;W{(i>4&I6$^Qc?T(EQi diff --git a/PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon40x40@2x.png b/PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon40x40@2x.png deleted file mode 100644 index 21a87b528ab594b87da3bd14c5f6f69adec09409..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12491 zcmch82{@Gf_cw}=ovhKIWH&SRv6~@6_Q*cQU@(R;_H5bLM3D&DvxID+>`AuDPO?U* zNRrCZduw~1-}Bbb^MC)>^>$6n-1p~v&N<(6zTf+tGnZ(+b7!b2*(r&Lh^RF+5C*_+ zz5V~>B*0H%5A+w{7aKv%lwgRnCwL?AXd)FmoGlupiA6e~4bVtCU-!poc_Jc)U5t?_ z!Bj^ZhQeV*k^2}?AFLZ7O++NG+R*Qu5z5aQC2Pl{qzIDtfdK?qGyw_n!MeD5zXk9&iEEBL`Vm?SWF^DL5-=%LrJJc_n zn82P%P#SG9MI8QtZt>y)o$@|kA4}t;uul4*F;sE@cup11HM7zzV} zze9C!b{Ko#Ur-4VAUB}WMi2;qfI%hx0}3RZ9g=`N5NwBn+2in7B(PkV{XHV)=IZcG zn~n}l)7683bVZ>x5ehtjsiGK+9ZXh2RaO##fT~M@)gTZxaa9Bqsse$FOGwDT;ZktO zPgw*G<+&gGpR#s;$%-E&tBc0~`wr>yI}SA|xU__-x&&Ai3YL0nTfNVE$`-35vFbOZ4#+kbl_0Mf(wpk44lHu3zEb>D>lH7lMV z3T!(N9}?>(2U2l!!=P}kKW*H7BSJ^bhv_8Gn!_NeJ{W zO+adW`(Oy{3G^RS{TG3QbV0yS36KGr03^%*Oy|E4JV-Z24{7%YkG|bHNFE{y{b{-e z4vPjE0%?YJ{R874zz6A&mI58j{SVMVoDyJ=p&O3if^l#p{K4A)fE>gJl?5512|x%P zJpMrUcf>(#GT@(!dXSO7LmtE~Df5f{znlCU;6dCN;5p&?r#Ng?}$6WuzhMY7i+|HE9G~94;&KXGw&Llr&si1}p*oA*n6}RgsjDQ59F0k(5y!nGZFM+YS{$%MLPARIzevic0?!z*8eHbD6;hRygac|N)gkb|N9Ff<@w){0)(FBh zfO8jz_x%x1L$v#^$b!E0elR3zzo%8;`BA&`{J4zyO-FN3IDX1{JE8%?|I(s;*X;3Q z@Sx%VbU(lA0VP4dTEM>_-~Va12hs}-l$YNx{?2L@s4QeZwSh|Z_kGY0+5g*WV3Gi| zl(Ij&#s3GZe^3KQuB!tY7>kJgFZ@uI085HPWZ}|4s_gf3GC(^iBa1+&NWj6;U@57e zYw*htaiBXE0RvsH6iiYUCJz1|`tgqr{JZ!6@Z?)Ieorc~f9Biw&j>Ug0|ZDN4>V=p zrUkIy#pvJo28<41cE9PB56sH_)BT&Ff1Ba_yaWt}_TT=RNC6*y&9u<2K*aFC#A+U& zn@dE*X{U)$G4h${$av*#^s1(_@U~X&l$-_=agKK!#0Gf5$f)jxcRcPk+k%gD?Lro}t0zrG5psjKs@u1nW0XlWs`wr(yc;LCmNsCNd1f*TtjqZMY>vQf^?YR)Pz zFIVFv3w`Dy#TL(3HSV%jV-7E)@yBUt2|c0aqV>n&qK3OeQx@$xakY&J#dUR~t!Tfu zWTErnu!hFQMpz>__|bhOMMXt<`MCv$w;!MCy^hUf!D6vqjqOS;O8op|1H3?n;Z0*X);qiU9(U>lTghtarKB{iWsB#XAW!sv}bq69Z#o zriPZsn3*#Z6CJ_qeSFE5^#U?7{KCSe_4N-2CMNoQecQ7A{rq-zb{ZOBv9Vb;=6Jl5 zk&%(3Bmd~e`Z{E%k=9+5w)fENrB;-rvd`X*ua1tV)l}$*4@fdNzv#vmEjcYM&dG_d zh&iVt$drSDA@1~9EiFMoK_1>*TidyuoSe#$Wy}*5#%Uo7HfzrO*4ddL5n()$>bo|r zva&Ko#U`rYp&32q$LZFxRWXGhgQfilM+Dd=w-}Ag%`J^ST<FH;!))(d9vEUZ(%S1gBN{2MnX>qQU+q-ORY>*0=l4gHm z8t1;UywXPT;(peXFSkRtdNe-?>uQ2ZhMk~nn^X}@QI{`c9W{gnd<`rujnAJ?$;i+K zcR5%%5I1BbB&S?u3XOc0Ta}b-$XaLmdU36lHd2$bB`nVggVDz@9_Qd-EY(Pow1gCKcf?}nS2~E5-=`O@xVS~C5sx!5F)c;hY=xKY@=@3GXo&K6p}@<_ z%YtBa;`K^qYN`nnGxN2pS4T#lGceBEqEOCGPRHJOa?X&Z#3UpvxEm&y zRlI{}9wv6CmlDhg&+jsyw5f@(#k#mucVjK3Hr6}UIjpoaqI&xK`@7jSZ6bTMW%v~p z6S8g_o<`YOS+x!pKFM~BBFkHwqr zimEWZXl5p1-PwU~&L7C_Q}sE%ynK7GQ1>PnnQ?AtS)NrwDbLzcQr-vluj2r z1G3_B3%QDlio1K|kbDcr@eDe8dJ1J2Y{I7KQy607>g~avo~%#@ZW{FQ^mOyxyOdfjuY%w4)dq|x z){Wn&4DWqp{ghJE#N3?m7$>T~i}l&y;LRI1)aenD_l|kpS*xA8t`D9A^N%Mdmjq3_BhI}@xowVfMZZX z$a$#B0lg%M#_rmT2ws_oFQQ6ioqNYR!VqJZ*%v4=sd2*ft=--OIIYVaP znViI+ewpjkZf-y7VNCwj$(@}u_oz(#5+!U)FGqc9wHbW+RQc`Hec#YP^sCMiArsMd za0klTFg`TyiFWpVoJo|Y4>D<|D}F{;XOkR^08?H(nc>D`x{i1%N^^;^lEYMYuetLP2nHSW%0 zGsrhW?TCbpL2~}WN>Q(#*R3UeK7H=u8A}@?x8l)~;B4cPl(q4ytigt)J4ekhjeX3y z?oYdvM=QGCjEhIupH`cDmiy>%S#52Kdhvq?hkReYe$9K8IIpqMpHBItm#HbgRAE6u z-0?I`_Ko1IxVTvsQHuuuEycdxm0_Wl;!&Xl4(Y|kzUNOeubG!|huRfA%ds!eKD7Da z!KcukjTuj&BeK4mPBa}>7cM;he5)ibF77%j`@CD5h9#)&spPTn$%4RZKEA%68@+Zzs|VWc5agn)ZoN)q{U7i!*Om($$Df>zrpg_{ zVO>{4*P4|=sn3^OgHi0d6@3hN8X9<%m4!t~gx`m-JYehw3Ea6?H+4fxyvlvPAz+*4 z#e?+i%R$G3WtO+^do3c7NE?rqh%@PPm0R7VuY{`3?3_5R{pgLB*c}hshrYmJ^@Ic0 zdkH@OGHF%Z>hw|+<*#UZ*q8(Ed{@`X1G{maeQCha%3 z)|6!MFFzeQQMze?KvH7WWx;fmM&fo87B@T!s8J##dd>tw9#u~%C!bBPoJPQLdUp0N z4I9^DnMFVqz>zHrGBtRA)m_=dfTP;irIB;R7JNOv@A2bk-ZKfocNpjcqA7CK z<7I;O=5o)dO<%0q-rY*gIWc<2GW=Y`hCHDyfYFSbic90m_O|BZ1w50giaXXaUM+nj za9kO)VSu>)=8}ewHyqB%zU0|x5u@YhM;A?4om5*9%#6Sd3=G(!a(Q`qTTX_~#0=50 z_ujZ+)e5_|Y&*D% z;d~^g9IT;2bW2UGm z=6uWEMJc6f-h||6W6|T;Q5lV%n{rz%u*ISdqz6VAm&`|Q~p(l}8RCpcdJrlUYF zoLfI;Iw*+k)>QTKp@`Tun&UD%>yOfBW&10<*Fv;X@61RlypRbkpOkm6@MakI!A{HJ%7nVGB7Q`aBh z7w|5L$0*1t!Uj3A6QjX)Axm$v`MEjU!R=j)Fxkcx=es}LIcbj6OAk%44?jfKkMU27QCr581deg*@*6V71 z+Mf1)*SgS?8dGzYVy*9SeXAbP%P@+0&Cyh9 zUjldb_O?%ylsGesW{4?_ylC8dx@&Q{?GQzyWT&w)cw{&u!+iTAXI^Gs)>pnAM6(J@ zh~tHO@5+G8OqwDkC5>h7E9@kS6nE&Kzf$k9;;;B(G(c0 z^F8}KEZx8$NyEO2ilyi+mAkRAaen?2dC^Ij-8;TyRu^yQ_(@*jMv9CzeW5WwYDM=s zrfO}wp|hnowF{`N?)%V7rZrnN5YjTQn31|_&fL3qT{D@_z&=|3ep|Y3=8h;YidD&t zH6fQhStl)xjhq3&nv`64BIthj)sK3~SHmNkBx<*$eS*p5rcb^ZX!fEVnxj%dxbw3W0P4efb~&CRKmmZmmiDK1=E-ukYDPwH#%b(-8+pyXq-o|K&y35dygSe-0X;&P_k-Ra%c=2r3hcU@nw zr`^u6#|y5Ub_qGf8UbdSV%{Sfj-=sir>A4E%5Kfcu{n7~TT3fs0BpeS$KRkScVn3S zZmYPOVGAZ2eUxmBDJ(|qZb%n{ZB4iKCBb7iR-$5J7|LfzE(B}|F4zPm*1C-QAC586 zqo?JPe+kKbwH$sll}Kc)Kv+)c+D!!-DRrZTMa7O8WcvU(u3ytV@Z>2dNtszlST+su5vpV?LYasndn9CsEvIj!-*81%Oh;yM`b&PJN8gjG+F4)2AgmAsK-l~5b4wWLEDzQNoQLa8RtXDNIs(d$0pxQap7kyr&cE27d?|& zHukvD;HucZm)gqt+gX+kCJwSmE?@cOG-l$tvJzN_(b@dv8x$=gyEkC|?c>u8yO!PX7b z#(8YI2H-=O-+`oDA&Apm|6E30?PFw6fq8ChIA_nM$4vK9{7Y5Xqtu zs(F}>toidI$9u}oi`#DnSXo_qGCl$h*ez8X4w(zIjh4U4%gfW)KU*tvaxMvSa&ggI zhbW4QCKMzowFbqhyb4P(i}IB5?YD(&Wua<6WNn64XI$nMG40<#^IzjBd+kKYfcY=z;q@^KF%v$dKAvscM$F z$=8T8(*rIn&|hyYq7Bh0P?sg|o5#$oqKXhF|k-uRRFBn|#_VTj4?~}&7885vUwT|%l^zOrw zqotg1w&tZbE?nTeubHN?&wHavbqpE!sjqXgF3~nBTUxP1ZfqRg+j-S&Y-FTwBkf`; zG_v?|^5pf5L=!|9Cya1-mJ}h4n*!m2$1oA}kDW4?Tml0XOUdfiuVzxbinSQ@koP|? z$~X!&X}>NfCpS5w{-WVjhq_qP`o;#%c`(HxSV*2?+^>(v%p+UlbyeW5nQeYty-Eu) zn8cjNYq3`rAsL=J$+sBnyEe6(NQniHk)73W=F;%iWbxhps4%g6+put{vbOTsc?%1{ zsx}0<(-6Y8{Dnxo$SxxPkVUIB&n}^5IM_YcCqht3L?f`0n4^{-&sHhS% zNUYE1V75b_KR+@CcU)<{Dr%VWGCh&&rTg|r%bi!A@$k|GDA2(GbqmX@kbHilm`Jgp z&EaY8ThtsQnn%}1n**tBZ_UMXjB33rx2RWdV8DhyW?70~pRaQ0yKy@?YgSExaoW9BoL>LFOlbO;_Z=bzFLFqUOjk74tg3%@`p2O9VG> z-uSXa_7=*fd`-P5yQCJoebqIhC28e;6SCcJT#lw9Xd~Uar(aNk3?6^d&A{N&PfrRD)OYSSZP0M*wbnu@I-+=Q8}tpf+={H z>87KhSEv#A<$+VhuAI|#YoO8Hoeiv=oaSDn(hh~J=Fw9t-SwN=r%m)_+$EM0GegLe zTUg_`?}}>mF%B%`Of;o5-HaylG*2LI?lyz;^Nlz;hpF2?x}5dpO;uTDx)_nH(@@m< z{3A`2#^mZ`eb1&8cH+}wIy;V2-Y4vCoI}w2WZljL&UWLbPjfwOZ8@010`l5Ox8t&S zlBJxBL#jxzyrKz&zn)(9q&F{H;cOaT&h6V51VwPv)YKGIR0T&JjuQldu~L*`oC$|@ zoSUQ`(>nMb`Fg6LY8H{&yjbbPUG!kr72Z6O6H0*$Uu{KTR~fqe?^r#^OiNpjwca5( zj%3PuaK-4GFTS=x3y0MuI^Rv9N-xwn4Q~@gSG7LAYN5wF@}A3-G87oSeCV;>v(Uvo{i+<6 z3Cnj6iKBx7kBm=o=HW?pg`pY(RMkcP501Mk8%rb8+^H6kQW(D2C15~06WQu}9d;Gf zcjKDJtNw)O=qnczl=jxkfey4iB0u2c_@nW0u~ZuVbLO=dHQIRPBWy&3)w+Z2Ds?`# z8CnPmmE6?uN*^3LZ#2|9MWjlZ737PxOH`2 zlDw+8_-u`tnQOBD5t`$lUnci;SU;Iz7WNV1N35=|g8@Z394GyguAFdPoQqJDE3Ysa;AU~Ph;6_WIkdUyly2{<(=)KnL zCGzNb{bW*Xbh*vVN~dNcPxP;jRkENrzB-9uM`qg}DW?q_^CHu;p4PC` z(IFk1P~4vFUTDWR*A_ zCr#vE#XqT@G;4VToPEc~qo}$lJs3$rhq+TZ9jixRCYv z=-s0#Z)k{sa+9Dc{JSl9Ul;FQEMq zB@{JgZ0m-`4U84DG?EV4Z!gT1m!k#kGhmy$m8jEfL}of4nQyHcHx|B#iCeg;`AqH3 z2JwOZA+Ib%N z+;=TIEhi`G^Twkys78mIYpY|!wX4zAmv;^Uw26kKrqI4+hh+XvV0X2g zJG_*+hLCtQbu0VMoq{IC)@dc>1s zi;7qkG_vGzQ^&`7Hl2nsa=;iTo}*6lRPUhuN#Th-8OdGSB=dkgndSP*DzSbVFwa17 z)1I%TrN}I&qI~jdt32ktk>nP=g}#12sSUXq>57ay(7vr6vbMGJ^sF(99XQV)t!tBA zo6#rxdH2&gqXzjQ8Kq8*xoqvrT*DvNvZ;~048)>FhHev_2*fc@WaV`d5)ulNY3SWl zxXyG9O7IRa0RX=45f<`K$y7Y9WLps)m~`|$0-7#d>2 z$c5yM$Mq3&a}R{TG*mD7Zn=ss-IT&oa@G58j0_eoXs}<9Flw-Nof%jin|C3QcUTng zTWv}CZ(5Snfa>qwhuB9-hrD>9Io< zkZYANb7xi#-I9FHT#uTRFGn6_D(>=Px;X4Y8G~0)pfl4A_n*~cC}n2IFEBjAVS(MI z`8c_|`z)2FrX~irmhI$Z?bmYM@rDhDXi`Q-Tqy9IqEhJS=x7LZj~>M!?^=E}87z`J zT3yS0`{ib@GSRjCCKHv>2f;DPubrHoKT#_n%gn~tYR1iK9t#Z*I!}A6jK6gE^Mg@@ z;=0&O5nCpM8ar_T(^_`#YS$mx`S^-wk4pDQ@3FpQ)_Kz1yIF$KJHy77=7_M3tx3!u z*Zw+q=j|mmU&BBRu)F-l^lOsLONO`C8Jm1Idm=B|o$LL)0EahHcsNG7FcCh#=f?Jw zK2N0uzP5`94@Z?%vw-PI39@95Njy-ak7 aD1H0Jqp4S7-1~oCps98aaYxnW(*FVFc>6;D diff --git a/PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon60x60@2x.png b/PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon60x60@2x.png deleted file mode 100644 index 9115b1f81bf46f70dc6759cc8969fad52598853e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16658 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 diff --git a/PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon76x76.png b/PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon76x76.png deleted file mode 100644 index 428a65618378ab1aa29608b5d08768428e520691..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11292 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 diff --git a/PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon76x76@2x.png b/PermissionsTestApp/Images.xcassets/AppIcon.appiconset/AppIcon76x76@2x.png deleted file mode 100644 index 633ddb9f660364ff8c852760a8373f6054bc5901..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20832 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 - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - ${ISH_BUNDLE_VERSION_SHORT} - CFBundleSignature - ???? - CFBundleVersion - ${ISH_BUNDLE_VERSION} - LSRequiresIPhoneOS - - NSAppleMusicUsageDescription - Explain why you use the music library - NSCalendarsUsageDescription - Explain why you use the calendar - NSCameraUsageDescription - Explain why you use the camera - NSContactsUsageDescription - Explain why you use contacts - NSHealthShareUsageDescription - Explain why you read heart rates - NSHealthUpdateUsageDescription - Explain why you write heart rates - NSLocationAlwaysUsageDescription - Explain why you use the location (always) - NSLocationWhenInUseUsageDescription - Explain why you use the calendar (when in use) - NSMicrophoneUsageDescription - Explain why you use the microphone - NSMotionUsageDescription - Explain why you use motion data - NSPhotoLibraryUsageDescription - Explain why you use the photo library - NSRemindersUsageDescription - Explain why you use reminders - NSSpeechRecognitionUsageDescription - Explain why you use speech recognition - UILaunchStoryboardName - Launch Screen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - - diff --git a/PermissionsTestApp/Launch Screen.storyboard b/PermissionsTestApp/Launch Screen.storyboard deleted file mode 100644 index a8f3389..0000000 --- a/PermissionsTestApp/Launch Screen.storyboard +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/PermissionsTestApp/SamplePermissionViewController.h b/PermissionsTestApp/SamplePermissionViewController.h deleted file mode 100644 index 32b0290..0000000 --- a/PermissionsTestApp/SamplePermissionViewController.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// LocationPermissionViewController.h -// ISHPermissionKit -// -// Created by Felix Lamouroux on 26.06.14. -// Copyright (c) 2014 iosphere GmbH. All rights reserved. -// - -#import - -@interface SamplePermissionViewController : ISHPermissionRequestViewController - -@end diff --git a/PermissionsTestApp/SamplePermissionViewController.m b/PermissionsTestApp/SamplePermissionViewController.m deleted file mode 100644 index ab7e4b1..0000000 --- a/PermissionsTestApp/SamplePermissionViewController.m +++ /dev/null @@ -1,61 +0,0 @@ -// -// LocationPermissionViewController.m -// ISHPermissionKit -// -// Created by Felix Lamouroux on 26.06.14. -// Copyright (c) 2014 iosphere GmbH. All rights reserved. -// - -#import "SamplePermissionViewController.h" -#import - -@interface SamplePermissionViewController () -@property (weak, nonatomic) IBOutlet UILabel *titleLabel; -@property (weak, nonatomic) IBOutlet UILabel *textLabel; - -@end - -@implementation SamplePermissionViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - - NSString *title = nil; - NSString *text = nil; - switch (self.permissionCategory) { - case ISHPermissionCategoryLocationAlways: - case ISHPermissionCategoryLocationWhenInUse: - title = @"Location"; - text = @"We really need to know your location."; - break; - - case ISHPermissionCategoryPhotoCamera: - title = @"Camera"; - text = @"Smile and grant us access to your camera."; - break; - - case ISHPermissionCategoryPhotoLibrary: - title = @"Photos"; - text = @"We would love to save pictures to your camera roll. Please give us acccess to your photo library."; - break; - - case ISHPermissionCategoryMicrophone: - title = @"Microphone"; - text = @"Please give us permission to use your microphone. Otherwise we cannot record your voice memos for you."; - break; - - default: - title = ISHStringFromPermissionCategory(self.permissionCategory); - text = @"Yet another permission we need."; - break; - } - - [self.titleLabel setText:title]; - [self.textLabel setText:text]; -} - -- (NSString *)description { - return [[super description] stringByAppendingFormat:@" - %@", ISHStringFromPermissionCategory(self.permissionCategory)]; -} - -@end diff --git a/PermissionsTestApp/SamplePermissionViewController.xib b/PermissionsTestApp/SamplePermissionViewController.xib deleted file mode 100644 index b4a9f9e..0000000 --- a/PermissionsTestApp/SamplePermissionViewController.xib +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/PermissionsTestApp/main.m b/PermissionsTestApp/main.m deleted file mode 100644 index 7b3f726..0000000 --- a/PermissionsTestApp/main.m +++ /dev/null @@ -1,16 +0,0 @@ -// -// main.m -// PermissionsTestApp -// -// Created by Felix Lamouroux on 25.06.14. -// Copyright (c) 2014 iosphere GmbH. All rights reserved. -// - -#import -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} From ffebcd674474330570185b15cf09b23c514a1d50 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Fri, 7 Oct 2016 12:37:43 +0200 Subject: [PATCH 12/22] Clean up travis file --- .travis.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 113283d..8fc4c21 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,14 +5,11 @@ install: script: - set -o pipefail -# Build framework variants and clean all targets between builds - - xcodebuild -project ISHPermissionKit.xcodeproj -scheme ISHPermissionKit+HealthKit -destination 'platform=iOS Simulator,name=iPhone 6' -derivedDataPath build/ISHPermissionKitHealth clean build | xcpretty +# Build framework target and clean all targets between builds - xcodebuild -project ISHPermissionKit.xcodeproj -scheme ISHPermissionKit -destination 'platform=iOS Simulator,name=iPhone 6' -derivedDataPath build/ISHPermissionKit clean build | xcpretty -# Build static lib variants and clean all targets between builds +# Build static lib target and clean all targets between builds - xcodebuild -project ISHPermissionKit.xcodeproj -scheme ISHPermissionKitLib -destination 'platform=iOS Simulator,name=iPhone 6' -derivedDataPath build/ISHPermissionKitLib clean build | xcpretty - - xcodebuild -project ISHPermissionKit.xcodeproj -scheme 'ISHPermissionKitLib+HealthKit' -destination 'platform=iOS Simulator,name=iPhone 6' -derivedDataPath build/ISHPermissionKitLibHealth clean build | xcpretty # run tests - - xcodebuild -project ISHPermissionKit.xcodeproj -scheme 'ISHPermissionKitLib+HealthKit' -destination 'platform=iOS Simulator,name=iPhone 6' -derivedDataPath build/ISHPermissionKitLibHealth clean test | xcpretty - - xcodebuild -project ISHPermissionKit.xcodeproj -scheme 'ISHPermissionKit+HealthKit' -destination 'platform=iOS Simulator,name=iPhone 6' -derivedDataPath build/ISHPermissionKitHealth clean test | xcpretty + - xcodebuild -project ISHPermissionKit.xcodeproj -scheme 'ISHPermissionKit' -destination 'platform=iOS Simulator,name=iPhone 6' -derivedDataPath build/ISHPermissionKit clean test | xcpretty From 6fc85a5d932849288f0f8d4dda056e027dc42a75 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Fri, 7 Oct 2016 12:38:29 +0200 Subject: [PATCH 13/22] Add missing import Removes dependence on order of imports --- .../Private/ISHPermissionRequestViewController+Private.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ISHPermissionKit/Private/ISHPermissionRequestViewController+Private.h b/ISHPermissionKit/Private/ISHPermissionRequestViewController+Private.h index 4ccabf0..dbefe8d 100644 --- a/ISHPermissionKit/Private/ISHPermissionRequestViewController+Private.h +++ b/ISHPermissionKit/Private/ISHPermissionRequestViewController+Private.h @@ -6,6 +6,8 @@ // Copyright (c) 2014 iosphere GmbH. All rights reserved. // +#import "ISHPermissionRequestViewController.h" + @protocol ISHPermissionRequestViewControllerDelegate; @class ISHPermissionRequest; From 09358e297995227747b4068ec58ebf09dcb8fb0a Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Fri, 7 Oct 2016 14:06:38 +0200 Subject: [PATCH 14/22] Explain new build requirements in README.md --- ISHPermissionKitAppConfiguration.xcconfig | 2 +- README.md | 186 +++++++++++++--------- assets/config_file.png | Bin 0 -> 38669 bytes 3 files changed, 110 insertions(+), 78 deletions(-) create mode 100644 assets/config_file.png diff --git a/ISHPermissionKitAppConfiguration.xcconfig b/ISHPermissionKitAppConfiguration.xcconfig index b6d6619..0ef1bd9 100644 --- a/ISHPermissionKitAppConfiguration.xcconfig +++ b/ISHPermissionKitAppConfiguration.xcconfig @@ -6,7 +6,7 @@ // Copyright © 2016 iosphere GmbH. All rights reserved. // -// Apps using ISHPermissionKit without CocoaPods should copy this file and paste it in the same directory as ISHPermissionKit's root directory (not *in* the root directory). Please see README.md for further instructions. +// Apps using ISHPermissionKit without CocoaPods should copy this file and paste it in the same directory as ISHPermissionKit's root directory (not *within* the root directory). Please see README.md for further instructions. ISH_PERMISSION_FLAG_MOTION = //ISHPermissionRequestMotionEnabled ISH_PERMISSION_FLAG_HEALTH = //ISHPermissionRequestHealthKitEnabled diff --git a/README.md b/README.md index 215fa94..22470c5 100644 --- a/README.md +++ b/README.md @@ -20,11 +20,11 @@ where the system APIs only provide implicit methods of doing so. **Supported permission categories:** -* AddressBook * Calendar: Events and Reminders -* CoreLocation: Always and WhenInUse -* CoreMotion: Activity data (step counting, etc.) -* HealthKit *(requires `HealthKit` variants of the static library/framework/pod)* +* Contacts +* Location: Always and WhenInUse +* Motion: Activity data (step counting, etc.) +* HealthKit * Microphone * Music Library * Notifications: Local and Remote @@ -33,22 +33,28 @@ where the system APIs only provide implicit methods of doing so. * Siri * Speech Recognition -The library and sample app compile with the **iOS 9.3 SDK** and later. The library -deploys back to **iOS 7**, while the sample app makes use of dynamic frameworks and -therefore has a deployment target of iOS 8. Permission categories that were added -later than the deployment target will be skipped on unsupported versions. +The library compiles with the **iOS 9.3 SDK** and later and deploys back to +**iOS 7**. Permission categories that were added later than the deployment +target will be skipped on unsupported versions. -ISHPermissionKit verifies that the required usage descriptions are provided in your -apps `Info.plist`. If the `DEBUG` preprocessor macro is set, it will assert and -explains which keys need to be added. +All permission categories relate to **sensitive user information**. If your app +binary contains code to access this information, it has to comply with +special review guidelines and other requirements to pass binary validation +in iTunes Connect and app review. Therefore, you must specifically enable +the categories you need with build flags, everything else will not be included +in the framework. Please read the [installation instructions](#installation) +carefully. + +*ISHPermissionKit* verifies that the required usage descriptions are provided in your +app's `Info.plist`. If the `DEBUG` preprocessor macro is set, it will assert and +explain which keys need to be added. Other requirements for each permission +category are mentioned in the header documentation in `ISHPermissionCategory.h`. Sample App Demo -In contrast to other libraries (such as -[JLPermissions](https://github.com/jlaws/JLPermissions) and -[ClusterPrePermissions](https://github.com/clusterinc/ClusterPrePermissions)) -*ISHPermissionKit* allows you to present custom view controllers, ask for several -permissions in a sequence, and provides a unified API through subclasses. +In contrast to other libraries, *ISHPermissionKit* allows you to present custom +view controllers, ask for several permissions in a sequence, provides a unified +API through subclasses, and is **iOS 10 compatible**. Recommended reading: [The Right Way to Ask Users for Mobile Permissions](https://medium.com/@mulligan/the-right-way-to-ask-users-for-ios-permissions-96fa4eb54f2c "by Brenden Mulligan (@mulligan)") @@ -64,63 +70,45 @@ Please file an issue for missing permissions. # How to Use -## Installation - -### Required Frameworks +## Sample App -ISHPermissionKit uses system frameworks to accomplish its tasks. Most of -them will be linked automatically unless you have disabled "Enable Modules" -(`CLANG_ENABLE_MODULES`) and "Link Frameworks Automatically" -(`CLANG_MODULES_AUTOLINK`) in your app target's build settings. +A sample app will be provided in a separate repository. Coming (back) soon. -Unfortunately, some framework are not weakly linked automatically which -will cause your app to crash at launch on older systems that don't support -the respective framework. These frameworks must be explicitly linked in -your app, and set to "Optional". Feel free to duplicate rdar://28008958. - -![Weak-linking a framework in Xcode](assets/weak_linking.png) - -This is currently required for these frameworks: - -* Speech - -### Variants - -The library comes in two flavors, with or without HealthKit support. While -technically you can use the HealthKit-enabled variant even when not using -HealthKit in your current app, it may lead to issues during App Review, see -[Issue #15](https://github.com/iosphere/ISHPermissionKit/issues/15). +## Installation -Therefore, the default installation has HealthKit disabled. While the -public interface remains unchanged across both variants, all HealthKit-related -APIs are non-functional and will assert unless you explicitly use the -HealthKit variant. The HealthKit variant will weakly link the HealthKit -framework into your app. How you choose between the two variants depends -on the type of installation, see below. +### Build Flags -While HealthKit is not available on iPad, you can install the Health-enabled -variant of ISHPermissionKit in iPad or Universal apps. Health-related permission -requests will be skipped. +Your variant of *ISHPermissionKit* will only include the permission categories +you actually need. We use preprocessor macros to ensure any unused code is not +compiled to save you from suprising App Store rejections, as some privacy +guidelines apply to all apps that *contain* code to access user data, regardless +of whether or not the code is ever called in your app. How you enable the +categories you need depends on how you install *ISHPermissionKit* (see below). ### Static Library Add this Xcode project as a subproject of your app. Then link your app target -against the static library (`ISHPermissionKitLib.a`, or -`ISHPermissionKitLib+HealthKit.a` if you require HealthKit support). -You will also need to add the static library as a target dependency. -Both settings can be found in your app target's *Build Phases*. +against the static library (`ISHPermissionKitLib.a`). You will also need to add +the static library as a target dependency. Both settings can be found in your +app target's *Build Phases*. + +You must [provide a build configuration](#providing-a-build-configuration) manually. Use `#import ` to import all public headers. +The static library version is recommended when you need to support iOS 7 or +if you are concerned about app launch time, as a high number of dynamic libraries +could increase the latter. ### Dynamically-Linked Framework Add this Xcode project as a subproject of your app. Then add the framework -(`ISHPermissionKit.framework`, or `ISHPermissionKit+HealthKit.framework` if you -require HealthKit support) to the app's embedded binaries (on the *General* +(`ISHPermissionKit.framework`) to the app's embedded binaries (on the *General* tab of your app target's settings). On the *Build Phases* tab, verify that the framework has also been added to the *Target Dependencies* and *Link Binary with Libraries* phases, and that a new *Embed Frameworks* phase has been created. +You must [provide a build configuration](#providing-a-build-configuration) manually. + The framework can be used as a module, so you can use `@import ISHPermissionKit;` to import all public headers. Further reading on Modules: [Clang Documentation](http://clang.llvm.org/docs/Modules.html) @@ -128,38 +116,76 @@ Further reading on Modules: [Clang Documentation](http://clang.llvm.org/docs/Mod **Note:** To link against dynamic frameworks on iOS, a deployment target of at least iOS 8 is required. If you use Swift, you must use dynamic frameworks. +### Providing a Build Configuration + +When building the static or dynamic library, *ISHPermissionKit* will look for an +`.xcconfig` file in the same directory as *ISHPermissionKit*'s root directory +(not *within* the root directory). This file allows you to set preprocessor flags +that will be used when compiling the framework. + +We strongly recommend to start with a copy of the template config provided in this +repository, `ISHPermissionKitAppConfiguration.xcconfig`. It includes a list of +all supported flags, and you can easily specify which features you need by +commenting or uncommenting the respective lines. + +You will have to use the same configuration file to build your app, else the +category-specific symbols will not be available. In your project settings, you +can select a configuration file for each target: + +![Weak-linking a framework in Xcode](assets/config_file.png) + +If you already use a configuration file, you can pick one and include the other +in it. Ensure to always use `$(inherit)` when setting preprocessor macros. + ### CocoaPods -You can use CocoaPods to install ISHPermissionKit as a static library: +You can use CocoaPods to install *ISHPermissionKit* as a static or dynamic library. +Each permission category requires a separate (sub)pod. The following sample Podfile +includes all available pods – you should pick only those that you are actually +using in your app. ```ruby target 'MyApp' do - pod 'ISHPermissionKit' + use_frameworks! // remove this line if you want to link your pods statically + pod 'ISHPermissionKit/Motion' + pod 'ISHPermissionKit/Health' + pod 'ISHPermissionKit/Location' + pod 'ISHPermissionKit/Microphone' + pod 'ISHPermissionKit/PhotoLibrary' + pod 'ISHPermissionKit/Camera' + pod 'ISHPermissionKit/Notifications' + pod 'ISHPermissionKit/SocialAccounts' + pod 'ISHPermissionKit/Contacts' + pod 'ISHPermissionKit/Calendar' + pod 'ISHPermissionKit/Reminders' + pod 'ISHPermissionKit/Siri' + pod 'ISHPermissionKit/Speech' + pod 'ISHPermissionKit/Music' end ``` +[Providing a build configuration](#providing-a-build-configuration) manually is not +required when you use CocoaPods. + See the [official website](https://cocoapods.org/#get_started) to get started with CocoaPods. -The default pod does not include HealthKit support. If you need HealthKit, you need -to use the `ISHPermissionKit/Health` pod: +### Required Frameworks -```ruby -target 'MyApp' do - pod 'ISHPermissionKit/Health' -end -``` +*ISHPermissionKit* uses system frameworks to accomplish its tasks. Most of +them will be linked automatically unless you have disabled "Enable Modules" +(`CLANG_ENABLE_MODULES`) and "Link Frameworks Automatically" +(`CLANG_MODULES_AUTOLINK`) in your app target's build settings. -ISHPermissionKit can also be installed as a framework through CocoaPods: +Unfortunately, some framework are not weakly linked automatically which +will cause your app to crash at launch on older systems that don't support +the respective framework. These frameworks must be explicitly linked in +your app, and set to "Optional". Feel free to duplicate rdar://28008958. -```ruby -target 'MyApp' do - use_frameworks! - pod 'ISHPermissionKit' -end -``` -It requires at least iOS 8 at runtime and can be imported as a module, see -[Dynamically-Linked Framework](#dynamically-linked-framework). +![Weak-linking a framework in Xcode](assets/weak_linking.png) + +This is currently required for the *Speech* framework, and only if you +enable the speech permission category. ## ISHPermissionsViewController @@ -238,7 +264,7 @@ most rewarding, you can find a few hints on how to get started below. ## Adding Support for New Permissions -You will need to create a new subclass of `ISHPermissionRequest` and add a +You will need to create a new subclass of `ISHPermissionRequest` and add an `ISHPermissionCategory` (make sure to use explicit values as these may be persisted). Don't change existing values. Finally, wire it up in `ISHPermissionRequest+All` by returning your new subclass in @@ -258,18 +284,24 @@ first and return appropriate internal enum values from `ISHPermissionState` without resorting to the `internalPermissionState` as much as possible. - When requesting the permission state you should only store the result in `internalPermissionState` if the state cannot easily be retrieved from the system (as is the case, e.g., with activity monitoring from the designated co-processor). +Before a new permission can be added, you must introduce a new build flag and +ensure the library compiles with and without it. Please update this document +accordingly, add the new build flag to the template configuration file +(`ISHPermissionKitAppConfiguration.xcconfig`), and create a new CocoaPods +subspec. + +# Attribution -ISHPermissionKit icon designed by +*ISHPermissionKit* icon designed by [Jason Grube (CC BY 3.0)](http://thenounproject.com/term/fingerprint/23303/) from the [Noun Project](http://thenounproject.com) -# More OpenSource projects by iosphere +# More OpenSource Projects by iosphere [`ISHHoverBar`](https://github.com/iosphere/ISHHoverBar) - A floating UIToolBar replacement as seen in the iOS 10 Maps app, supporting both vertical and horizontal orientation diff --git a/assets/config_file.png b/assets/config_file.png new file mode 100644 index 0000000000000000000000000000000000000000..8646c25036b11c4dd123b12ae69dd988634b0161 GIT binary patch literal 38669 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 J#cH-;{{nN>*xdjC literal 0 HcmV?d00001 From 1bc4d9c3a952899228862f9b163af7cd9ce1ecbd Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Mon, 10 Oct 2016 12:08:25 +0200 Subject: [PATCH 15/22] Minor documentation improvements --- ISHPermissionKit/ISHPermissionCategory.h | 4 ++-- README.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ISHPermissionKit/ISHPermissionCategory.h b/ISHPermissionKit/ISHPermissionCategory.h index 71af6d5..21a1f59 100644 --- a/ISHPermissionKit/ISHPermissionCategory.h +++ b/ISHPermissionKit/ISHPermissionCategory.h @@ -11,7 +11,7 @@ * Each is related to a specific ISHPermissionRequest. * * To prevent having unused auto-linked frameworks and privacy- - * sensitive APIS in your app, each category must be explicitly + * sensitive APIs in your app, each category must be explicitly * enabled by a build flag. Some frameworks have additional * requirements. Please read the documentation for each category * carefully to avoid App Store rejections. @@ -36,7 +36,7 @@ typedef NS_ENUM(NSUInteger, ISHPermissionCategory) { * specifically section 5.1 (Privacy). * * To enable this category, you must set the preprocessor flag - * ISHPermissionRequestMotion. This will link CoreMotion. + * ISHPermissionRequestMotionEnabled. This will link CoreMotion. */ ISHPermissionCategoryActivity = 1000, #endif diff --git a/README.md b/README.md index 22470c5..01c37d1 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ Your variant of *ISHPermissionKit* will only include the permission categories you actually need. We use preprocessor macros to ensure any unused code is not compiled to save you from suprising App Store rejections, as some privacy guidelines apply to all apps that *contain* code to access user data, regardless -of whether or not the code is ever called in your app. How you enable the +of whether or not the code is ever called in your app. How to enable the categories you need depends on how you install *ISHPermissionKit* (see below). ### Static Library From 0eb08eb8c1d9a856651af979b524bef327509237 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Tue, 11 Oct 2016 18:38:21 +0200 Subject: [PATCH 16/22] Improve README * link template file * add open radar link * highlight important notes --- README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 01c37d1..47953a5 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ against the static library (`ISHPermissionKitLib.a`). You will also need to add the static library as a target dependency. Both settings can be found in your app target's *Build Phases*. -You must [provide a build configuration](#providing-a-build-configuration) manually. +**You must [provide a build configuration](#providing-a-build-configuration) manually.** Use `#import ` to import all public headers. The static library version is recommended when you need to support iOS 7 or @@ -107,7 +107,7 @@ tab of your app target's settings). On the *Build Phases* tab, verify that the framework has also been added to the *Target Dependencies* and *Link Binary with Libraries* phases, and that a new *Embed Frameworks* phase has been created. -You must [provide a build configuration](#providing-a-build-configuration) manually. +**You must [provide a build configuration](#providing-a-build-configuration) manually.** The framework can be used as a module, so you can use `@import ISHPermissionKit;` to import all public headers. @@ -124,9 +124,9 @@ When building the static or dynamic library, *ISHPermissionKit* will look for an that will be used when compiling the framework. We strongly recommend to start with a copy of the template config provided in this -repository, `ISHPermissionKitAppConfiguration.xcconfig`. It includes a list of -all supported flags, and you can easily specify which features you need by -commenting or uncommenting the respective lines. +repository, [`ISHPermissionKitAppConfiguration.xcconfig`](/ISHPermissionKitAppConfiguration.xcconfig). +It includes a list of all supported flags, and you can easily specify which features +you need by commenting or uncommenting the respective lines. You will have to use the same configuration file to build your app, else the category-specific symbols will not be available. In your project settings, you @@ -180,7 +180,8 @@ them will be linked automatically unless you have disabled "Enable Modules" Unfortunately, some framework are not weakly linked automatically which will cause your app to crash at launch on older systems that don't support the respective framework. These frameworks must be explicitly linked in -your app, and set to "Optional". Feel free to duplicate rdar://28008958. +your app, and set to "Optional". Feel free to duplicate rdar://28008958 +(https://openradar.appspot.com/search?query=28008958). ![Weak-linking a framework in Xcode](assets/weak_linking.png) @@ -292,8 +293,8 @@ co-processor). Before a new permission can be added, you must introduce a new build flag and ensure the library compiles with and without it. Please update this document accordingly, add the new build flag to the template configuration file -(`ISHPermissionKitAppConfiguration.xcconfig`), and create a new CocoaPods -subspec. +([`ISHPermissionKitAppConfiguration.xcconfig`](/ISHPermissionKitAppConfiguration.xcconfig)), +and create a new CocoaPods subspec. # Attribution From ba9fbffc96be17703d7e62615522806b570dafa7 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Tue, 11 Oct 2016 18:49:53 +0200 Subject: [PATCH 17/22] Add Coverage configuration based on Debug config Coverage is set as default config for tests. Tests can be run from the dynamic framework target. --- ISHPermissionKit.xcodeproj/project.pbxproj | 131 ++++++++++++++++++ .../xcschemes/ISHPermissionKit.xcscheme | 12 +- .../xcschemes/ISHPermissionKitLib.xcscheme | 2 +- .../ISHPermissionKitFlagsCoverage.xcconfig | 26 ++++ 4 files changed, 169 insertions(+), 2 deletions(-) create mode 100644 ISHPermissionKit/ISHPermissionKitFlagsCoverage.xcconfig diff --git a/ISHPermissionKit.xcodeproj/project.pbxproj b/ISHPermissionKit.xcodeproj/project.pbxproj index e9c8aa9..e740598 100644 --- a/ISHPermissionKit.xcodeproj/project.pbxproj +++ b/ISHPermissionKit.xcodeproj/project.pbxproj @@ -31,6 +31,7 @@ 1BC93E4F1D7063D20033B6E8 /* ISHPermissionRequestMusicLibrary.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BC93E491D7063D20033B6E8 /* ISHPermissionRequestMusicLibrary.m */; }; 1BC93E531D7063F10033B6E8 /* ISHPermissionRequestMusicLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BC93E521D7063F10033B6E8 /* ISHPermissionRequestMusicLibrary.h */; }; 1BC93E541D7063F10033B6E8 /* ISHPermissionRequestMusicLibrary.h in Headers */ = {isa = PBXBuildFile; fileRef = 1BC93E521D7063F10033B6E8 /* ISHPermissionRequestMusicLibrary.h */; }; + 1BDB4D911DAD4F1D0046E4E5 /* ISHPermissionKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCC1BFA5195B174200362559 /* ISHPermissionKit.framework */; }; DC1A80A3195B21DC0069235F /* ISHPermissionsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = DC1A80A1195B21DC0069235F /* ISHPermissionsViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC1A80A4195B21DC0069235F /* ISHPermissionsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DC1A80A2195B21DC0069235F /* ISHPermissionsViewController.m */; }; DC1A80A9195B22A10069235F /* ISHPermissionCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = DC1A80A8195B22A10069235F /* ISHPermissionCategory.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -104,6 +105,16 @@ DCD56C7F1962BB8600508F4A /* ISHPermissionRequestHealth.m in Sources */ = {isa = PBXBuildFile; fileRef = DCD56C7C1962BB8600508F4A /* ISHPermissionRequestHealth.m */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 1BDB4D8F1DAD4F1A0046E4E5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = DCC1BF9C195B174200362559 /* Project object */; + proxyType = 1; + remoteGlobalIDString = DCC1BFA4195B174200362559; + remoteInfo = ISHPermissionKit; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXCopyFilesBuildPhase section */ DCAEF7C8195C60070074EB5B /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; @@ -136,6 +147,7 @@ 1BBCCA7E1BFF367D00606D3D /* CHANGELOG.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = CHANGELOG.md; sourceTree = ""; }; 1BC93E491D7063D20033B6E8 /* ISHPermissionRequestMusicLibrary.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionRequestMusicLibrary.m; sourceTree = ""; }; 1BC93E521D7063F10033B6E8 /* ISHPermissionRequestMusicLibrary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ISHPermissionRequestMusicLibrary.h; path = ISHPermissionKit/Private/ISHPermissionRequestMusicLibrary.h; sourceTree = SOURCE_ROOT; }; + 1BDB4D881DAD4DB00046E4E5 /* ISHPermissionKitFlagsCoverage.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ISHPermissionKitFlagsCoverage.xcconfig; sourceTree = ""; }; DC1A80A1195B21DC0069235F /* ISHPermissionsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ISHPermissionsViewController.h; sourceTree = ""; }; DC1A80A2195B21DC0069235F /* ISHPermissionsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ISHPermissionsViewController.m; sourceTree = ""; }; DC1A80A8195B22A10069235F /* ISHPermissionCategory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ISHPermissionCategory.h; sourceTree = ""; }; @@ -200,6 +212,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 1BDB4D911DAD4F1D0046E4E5 /* ISHPermissionKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -324,6 +337,7 @@ children = ( DCC1BFA9195B174200362559 /* Info.plist */, 1B7221721DA3DD7B00B9266F /* ISHPermissionKitFlags.xcconfig */, + 1BDB4D881DAD4DB00046E4E5 /* ISHPermissionKitFlagsCoverage.xcconfig */, ); name = "Supporting Files"; sourceTree = ""; @@ -463,6 +477,7 @@ buildRules = ( ); dependencies = ( + 1BDB4D901DAD4F1A0046E4E5 /* PBXTargetDependency */, ); name = ISHPermissionKitTests; productName = ISHPermissionKitTests; @@ -593,7 +608,119 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 1BDB4D901DAD4F1A0046E4E5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = DCC1BFA4195B174200362559 /* ISHPermissionKit */; + targetProxy = 1BDB4D8F1DAD4F1A0046E4E5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ + 1BDB4D841DAD4D850046E4E5 /* Coverage */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1BDB4D881DAD4DB00046E4E5 /* ISHPermissionKitFlagsCoverage.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 2; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; + ISH_BUNDLE_VERSION = 0; + ISH_BUNDLE_VERSION_MAJOR = 1; + ISH_BUNDLE_VERSION_MINOR = 2; + ISH_BUNDLE_VERSION_SHORT = "${ISH_BUNDLE_VERSION_MAJOR}.${ISH_BUNDLE_VERSION_MINOR}.${ISH_BUNDLE_VERSION}"; + METAL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Coverage; + }; + 1BDB4D851DAD4D850046E4E5 /* Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; + DYLIB_CURRENT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; + INFOPLIST_FILE = ISHPermissionKit/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "de.iosphere.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + }; + name = Coverage; + }; + 1BDB4D861DAD4D850046E4E5 /* Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + CURRENT_PROJECT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; + DYLIB_COMPATIBILITY_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; + DYLIB_CURRENT_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; + FRAMEWORK_VERSION = "${ISH_BUNDLE_VERSION_SHORT}"; + METAL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PUBLIC_HEADERS_FOLDER_PATH = "include/$(PROJECT_NAME)"; + SKIP_INSTALL = YES; + }; + name = Coverage; + }; + 1BDB4D871DAD4D850046E4E5 /* Coverage */ = { + isa = XCBuildConfiguration; + buildSettings = { + INFOPLIST_FILE = ISHPermissionKitTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + METAL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_BUNDLE_IDENTIFIER = "de.iosphere.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Coverage; + }; DCAEF7DC195C60070074EB5B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -802,6 +929,7 @@ isa = XCConfigurationList; buildConfigurations = ( DCAEF7DC195C60070074EB5B /* Debug */, + 1BDB4D861DAD4D850046E4E5 /* Coverage */, DCAEF7DD195C60070074EB5B /* Release */, ); defaultConfigurationIsVisible = 0; @@ -811,6 +939,7 @@ isa = XCConfigurationList; buildConfigurations = ( DCC1BFB9195B174200362559 /* Debug */, + 1BDB4D841DAD4D850046E4E5 /* Coverage */, DCC1BFBA195B174200362559 /* Release */, ); defaultConfigurationIsVisible = 0; @@ -820,6 +949,7 @@ isa = XCConfigurationList; buildConfigurations = ( DCC1BFBC195B174200362559 /* Debug */, + 1BDB4D851DAD4D850046E4E5 /* Coverage */, DCC1BFBD195B174200362559 /* Release */, ); defaultConfigurationIsVisible = 0; @@ -829,6 +959,7 @@ isa = XCConfigurationList; buildConfigurations = ( DCC1BFBF195B174200362559 /* Debug */, + 1BDB4D871DAD4D850046E4E5 /* Coverage */, DCC1BFC0195B174200362559 /* Release */, ); defaultConfigurationIsVisible = 0; diff --git a/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKit.xcscheme b/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKit.xcscheme index ff40ea0..00e5624 100644 --- a/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKit.xcscheme +++ b/ISHPermissionKit.xcodeproj/xcshareddata/xcschemes/ISHPermissionKit.xcscheme @@ -23,11 +23,21 @@ + + + + diff --git a/ISHPermissionKit/ISHPermissionKitFlagsCoverage.xcconfig b/ISHPermissionKit/ISHPermissionKitFlagsCoverage.xcconfig new file mode 100644 index 0000000..83db43b --- /dev/null +++ b/ISHPermissionKit/ISHPermissionKitFlagsCoverage.xcconfig @@ -0,0 +1,26 @@ +// +// ISHPermissionKitFlags.xcconfig +// ISHPermissionKit +// +// Created by Hagi on 04/10/16. +// Copyright © 2016 iosphere GmbH. All rights reserved. +// + +// This file enables all feature flags for the Coverage configuration. Should not be used in production. + +ISH_PERMISSION_FLAG_MOTION = ISHPermissionRequestMotionEnabled +ISH_PERMISSION_FLAG_HEALTH = ISHPermissionRequestHealthKitEnabled +ISH_PERMISSION_FLAG_LOCATION = ISHPermissionRequestLocationEnabled +ISH_PERMISSION_FLAG_MIC = ISHPermissionRequestMicrophoneEnabled +ISH_PERMISSION_FLAG_PHOTOS = ISHPermissionRequestPhotoLibraryEnabled +ISH_PERMISSION_FLAG_CAMERA = ISHPermissionRequestCameraEnabled +ISH_PERMISSION_FLAG_NOTIFICATIONS = ISHPermissionRequestNotificationsEnabled +ISH_PERMISSION_FLAG_SOCIAL = ISHPermissionRequestSocialAccountsEnabled +ISH_PERMISSION_FLAG_CONTACTS = ISHPermissionRequestContactsEnabled +ISH_PERMISSION_FLAG_CALENDAR = ISHPermissionRequestCalendarEnabled +ISH_PERMISSION_FLAG_REMINDERS = ISHPermissionRequestRemindersEnabled +ISH_PERMISSION_FLAG_SIRI = ISHPermissionRequestSiriEnabled +ISH_PERMISSION_FLAG_SPEECH = ISHPermissionRequestSpeechEnabled +ISH_PERMISSION_FLAG_MUSIC = ISHPermissionRequestMusicLibraryEnabled + +GCC_PREPROCESSOR_DEFINITIONS[config=Coverage] = $(inherited) $(ISH_PERMISSION_FLAG_MOTION) $(ISH_PERMISSION_FLAG_HEALTH) $(ISH_PERMISSION_FLAG_LOCATION) $(ISH_PERMISSION_FLAG_MIC) $(ISH_PERMISSION_FLAG_PHOTOS) $(ISH_PERMISSION_FLAG_CAMERA) $(ISH_PERMISSION_FLAG_NOTIFICATIONS) $(ISH_PERMISSION_FLAG_SOCIAL) $(ISH_PERMISSION_FLAG_CONTACTS) $(ISH_PERMISSION_FLAG_CALENDAR) $(ISH_PERMISSION_FLAG_REMINDERS) $(ISH_PERMISSION_FLAG_SIRI) $(ISH_PERMISSION_FLAG_SPEECH) $(ISH_PERMISSION_FLAG_MUSIC) From b66754d26f76b752975623af04296600c163fea1 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Wed, 12 Oct 2016 13:55:18 +0200 Subject: [PATCH 18/22] Add subspecs for all permission categories --- ISHPermissionKit.podspec | 109 ++++++++++++++++++++++++++++++++++++++- README.md | 41 ++++++++------- 2 files changed, 128 insertions(+), 22 deletions(-) diff --git a/ISHPermissionKit.podspec b/ISHPermissionKit.podspec index 37f64fd..3c4f0fc 100644 --- a/ISHPermissionKit.podspec +++ b/ISHPermissionKit.podspec @@ -27,11 +27,116 @@ Pod::Spec.new do |s| core.requires_arc = true end + s.subspec 'Motion' do |motion| + motion.dependency 'ISHPermissionKit/Core' + motion.weak_framework = 'CoreMotion' + feature_flags = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ISHPermissionRequestMotionEnabled' } + motion.pod_target_xcconfig = feature_flags + motion.user_target_xcconfig = feature_flags + end + s.subspec 'Health' do |health| health.dependency 'ISHPermissionKit/Core' - health.weak_framework = 'HealthKit' - health.pod_target_xcconfig = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ISHPermissionRequestHealthKitEnabled' } + feature_flags = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ISHPermissionRequestHealthKitEnabled' } + health.pod_target_xcconfig = feature_flags + health.user_target_xcconfig = feature_flags + end + + s.subspec 'Location' do |location| + location.dependency 'ISHPermissionKit/Core' + location.weak_framework = 'CoreLocation' + feature_flags = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ISHPermissionRequestLocationEnabled' } + location.pod_target_xcconfig = feature_flags + location.user_target_xcconfig = feature_flags + end + + s.subspec 'Microphone' do |mic| + mic.dependency 'ISHPermissionKit/Core' + mic.weak_framework = 'AVFoundation' + feature_flags = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ISHPermissionRequestMicrophoneEnabled' } + mic.pod_target_xcconfig = feature_flags + mic.user_target_xcconfig = feature_flags + end + + s.subspec 'PhotoLibrary' do |photo| + photo.dependency 'ISHPermissionKit/Core' + photo.weak_framework = 'Photos', 'AssetsLibrary' + feature_flags = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ISHPermissionRequestPhotoLibraryEnabled' } + photo.pod_target_xcconfig = feature_flags + photo.user_target_xcconfig = feature_flags + end + + s.subspec 'Camera' do |cam| + cam.dependency 'ISHPermissionKit/Core' + cam.weak_framework = 'AVFoundation' + feature_flags = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ISHPermissionRequestCameraEnabled' } + cam.pod_target_xcconfig = feature_flags + cam.user_target_xcconfig = feature_flags + end + + s.subspec 'Notifications' do |note| + note.dependency 'ISHPermissionKit/Core' + note.weak_framework = 'UIKit', 'UserNotifications' + feature_flags = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ISHPermissionRequestNotificationsEnabled' } + note.pod_target_xcconfig = feature_flags + note.user_target_xcconfig = feature_flags + end + + s.subspec 'SocialAccounts' do |social| + social.dependency 'ISHPermissionKit/Core' + social.weak_framework = 'Accounts' + feature_flags = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ISHPermissionRequestSocialAccountsEnabled' } + social.pod_target_xcconfig = feature_flags + social.user_target_xcconfig = feature_flags + end + + s.subspec 'Contacts' do |contacts| + contacts.dependency 'ISHPermissionKit/Core' + contacts.weak_framework = 'Contacts', 'AddressBook' + feature_flags = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ISHPermissionRequestContactsEnabled' } + contacts.pod_target_xcconfig = feature_flags + contacts.user_target_xcconfig = feature_flags + end + + s.subspec 'Calendar' do |cal| + cal.dependency 'ISHPermissionKit/Core' + cal.weak_framework = 'EventKit' + feature_flags = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ISHPermissionRequestCalendarEnabled' } + cal.pod_target_xcconfig = feature_flags + cal.user_target_xcconfig = feature_flags + end + + s.subspec 'Reminders' do |rem| + rem.dependency 'ISHPermissionKit/Core' + rem.weak_framework = 'EventKit' + feature_flags = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ISHPermissionRequestRemindersEnabled' } + rem.pod_target_xcconfig = feature_flags + rem.user_target_xcconfig = feature_flags + end + + s.subspec 'Siri' do |siri| + siri.dependency 'ISHPermissionKit/Core' + siri.weak_framework = 'Intents' + feature_flags = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ISHPermissionRequestSiriEnabled' } + siri.pod_target_xcconfig = feature_flags + siri.user_target_xcconfig = feature_flags + end + + s.subspec 'Speech' do |speech| + speech.dependency 'ISHPermissionKit/Core' + speech.weak_framework = 'Speech' + feature_flags = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ISHPermissionRequestSpeechEnabled' } + speech.pod_target_xcconfig = feature_flags + speech.user_target_xcconfig = feature_flags + end + + s.subspec 'MusicLibrary' do |music| + music.dependency 'ISHPermissionKit/Core' + music.weak_framework = 'MediaPlayer' + feature_flags = { 'GCC_PREPROCESSOR_DEFINITIONS' => 'ISHPermissionRequestMusicLibraryEnabled' } + music.pod_target_xcconfig = feature_flags + music.user_target_xcconfig = feature_flags end end diff --git a/README.md b/README.md index 47953a5..68a0070 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,24 @@ can select a configuration file for each target: If you already use a configuration file, you can pick one and include the other in it. Ensure to always use `$(inherit)` when setting preprocessor macros. +### Required Frameworks + +*ISHPermissionKit* uses system frameworks to accomplish its tasks. Most of +them will be linked automatically unless you have disabled "Enable Modules" +(`CLANG_ENABLE_MODULES`) and "Link Frameworks Automatically" +(`CLANG_MODULES_AUTOLINK`) in your app target's build settings. + +Unfortunately, some framework are not weakly linked automatically which +will cause your app to crash at launch on older systems that don't support +the respective framework. These frameworks must be explicitly linked in +your app, and set to "Optional". Feel free to duplicate rdar://28008958 +(https://openradar.appspot.com/search?query=28008958). + +![Weak-linking a framework in Xcode](assets/weak_linking.png) + +This is currently required for the *Speech* framework, and only if you +enable the speech permission category. + ### CocoaPods You can use CocoaPods to install *ISHPermissionKit* as a static or dynamic library. @@ -160,34 +178,17 @@ target 'MyApp' do pod 'ISHPermissionKit/Reminders' pod 'ISHPermissionKit/Siri' pod 'ISHPermissionKit/Speech' - pod 'ISHPermissionKit/Music' + pod 'ISHPermissionKit/MusicLibrary' end ``` [Providing a build configuration](#providing-a-build-configuration) manually is not -required when you use CocoaPods. +required when you use CocoaPods, and you can also ignore the +[Required Frameworks](#required-frameworks) section. See the [official website](https://cocoapods.org/#get_started) to get started with CocoaPods. -### Required Frameworks - -*ISHPermissionKit* uses system frameworks to accomplish its tasks. Most of -them will be linked automatically unless you have disabled "Enable Modules" -(`CLANG_ENABLE_MODULES`) and "Link Frameworks Automatically" -(`CLANG_MODULES_AUTOLINK`) in your app target's build settings. - -Unfortunately, some framework are not weakly linked automatically which -will cause your app to crash at launch on older systems that don't support -the respective framework. These frameworks must be explicitly linked in -your app, and set to "Optional". Feel free to duplicate rdar://28008958 -(https://openradar.appspot.com/search?query=28008958). - -![Weak-linking a framework in Xcode](assets/weak_linking.png) - -This is currently required for the *Speech* framework, and only if you -enable the speech permission category. - ## ISHPermissionsViewController You can request permission for a single category or a sequence of categories. From 515d000a87b24e22f4c5749e9289e98624914a98 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Wed, 12 Oct 2016 17:08:26 +0200 Subject: [PATCH 19/22] Additional README fixes * Mention that the configuration file name must match exactly * Fix image alt title --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 68a0070..32d8138 100644 --- a/README.md +++ b/README.md @@ -118,10 +118,10 @@ least iOS 8 is required. If you use Swift, you must use dynamic frameworks. ### Providing a Build Configuration -When building the static or dynamic library, *ISHPermissionKit* will look for an -`.xcconfig` file in the same directory as *ISHPermissionKit*'s root directory -(not *within* the root directory). This file allows you to set preprocessor flags -that will be used when compiling the framework. +When building the static or dynamic library, *ISHPermissionKit* will look for a +file named `ISHPermissionKitAppConfiguration.xcconfig` in the same directory as +*ISHPermissionKit*'s root directory (not *within* the root directory). This file +allows you to set preprocessor flags that will be used when compiling the framework. We strongly recommend to start with a copy of the template config provided in this repository, [`ISHPermissionKitAppConfiguration.xcconfig`](/ISHPermissionKitAppConfiguration.xcconfig). @@ -132,7 +132,7 @@ You will have to use the same configuration file to build your app, else the category-specific symbols will not be available. In your project settings, you can select a configuration file for each target: -![Weak-linking a framework in Xcode](assets/config_file.png) +![Setting a configuration file](assets/config_file.png) If you already use a configuration file, you can pick one and include the other in it. Ensure to always use `$(inherit)` when setting preprocessor macros. From d2077be2108760d6fdce41b8ced95ff548d4d4b8 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Wed, 12 Oct 2016 17:59:01 +0200 Subject: [PATCH 20/22] Intentionally mis-spell CocoaPods to ensure the section stays in CocoaPods would otherwise strip the CP install section. Since it contains essential information, this seems to be the only fix. Discussion: https://github.com/CocoaPods/cocoadocs.org/issues/401 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 32d8138..2319e68 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,7 @@ your app, and set to "Optional". Feel free to duplicate rdar://28008958 This is currently required for the *Speech* framework, and only if you enable the speech permission category. -### CocoaPods +### Cocoa Pods You can use CocoaPods to install *ISHPermissionKit* as a static or dynamic library. Each permission category requires a separate (sub)pod. The following sample Podfile From c226dcae44b52fd04a9ad61787b67c9f0558edf6 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Wed, 12 Oct 2016 17:30:03 +0200 Subject: [PATCH 21/22] Link to sample app repository --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 2319e68..dda65b7 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,10 @@ Please file an issue for missing permissions. ## Sample App -A sample app will be provided in a separate repository. Coming (back) soon. +In order to demonstrate all steps that are required to use *ISHPermissionKit*, +the sample application has a [separate repository](https://github.com/iosphere/ISHPermissionKitSampleApp). + +The sample app uses the [dynamically-linked framework](#dynamically-linked-framework). ## Installation From 7deda9fbbff61946dc3bbc4c0600448773698318 Mon Sep 17 00:00:00 2001 From: Sebastian Hagedorn Date: Wed, 12 Oct 2016 19:08:19 +0200 Subject: [PATCH 22/22] Remove unnecessary imports --- ISHPermissionKit/Requests/ISHPermissionRequest.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ISHPermissionKit/Requests/ISHPermissionRequest.m b/ISHPermissionKit/Requests/ISHPermissionRequest.m index abff30d..29e8216 100644 --- a/ISHPermissionKit/Requests/ISHPermissionRequest.m +++ b/ISHPermissionKit/Requests/ISHPermissionRequest.m @@ -8,8 +8,10 @@ #import "ISHPermissionRequest.h" #import "ISHPermissionRequest+Private.h" -@import CoreLocation; + +#ifdef DEBUG @import UIKit; +#endif @interface ISHPermissionRequest () @property (nonatomic, readwrite) ISHPermissionCategory permissionCategory;