瀏覽代碼

发布TODO

jeremy 5 年之前
父節點
當前提交
7d9eca57ff
共有 21 個文件被更改,包括 909 次插入32 次删除
  1. 80 0
      RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj
  2. 14 0
      RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate+Window.swift
  3. 2 2
      RainbowPlanet/RainbowPlanet/Base/BaseTabbarViewController/BaseTabbarViewController.swift
  4. 3 3
      RainbowPlanet/RainbowPlanet/Modules/PublishNewModule/PublishNew/View/PublishNewAuthorizationView.swift
  5. 25 23
      RainbowPlanet/RainbowPlanet/Modules/PublishNewModule/PublishNew/View/PublishNewVideoPhotoView.swift
  6. 10 0
      RainbowPlanet/RainbowPlanet/Modules/PublishNewModule/PublishNew/ViewController/PublishNewViewController.swift
  7. 4 4
      RainbowPlanet/RainbowPlanet/Supporting Files/Info.plist
  8. 98 0
      RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermission/NXLPermission.swift
  9. 130 0
      RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermission/NXLPermissionAlwaysAuthorizationLocationHandler.swift
  10. 84 0
      RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermission/NXLPermissionType.swift
  11. 34 0
      RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionCalendar.swift
  12. 33 0
      RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionCamera.swift
  13. 52 0
      RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionContacts.swift
  14. 76 0
      RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionLocation.swift
  15. 32 0
      RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionMediaLibrary.swift
  16. 33 0
      RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionMicrophone.swift
  17. 40 0
      RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionMotion.swift
  18. 59 0
      RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionNotification.swift
  19. 34 0
      RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionPhotoLibrary.swift
  20. 34 0
      RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionReminders.swift
  21. 32 0
      RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionSpeech.swift

+ 80 - 0
RainbowPlanet/RainbowPlanet.xcodeproj/project.pbxproj

@@ -225,6 +225,20 @@
 		A7778CD522460D8E00C7C47A /* PhoneCountryAreaTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7778CD422460D8E00C7C47A /* PhoneCountryAreaTableViewCell.swift */; };
 		A7778CDD2246121500C7C47A /* PhoneCountryAreaListMdoel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7778CDC2246121500C7C47A /* PhoneCountryAreaListMdoel.swift */; };
 		A7778CDF22461BAD00C7C47A /* PhoneCountryAreaSectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7778CDE22461BAD00C7C47A /* PhoneCountryAreaSectionHeaderView.swift */; };
+		A77BB4542329EBAA00DCAE32 /* NXLPermission.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77BB4532329EBAA00DCAE32 /* NXLPermission.swift */; };
+		A77BB4562329EBD800DCAE32 /* NXLPermissionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77BB4552329EBD800DCAE32 /* NXLPermissionType.swift */; };
+		A77BB4592329ECF900DCAE32 /* NXLPermissionAlwaysAuthorizationLocationHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77BB4582329ECF900DCAE32 /* NXLPermissionAlwaysAuthorizationLocationHandler.swift */; };
+		A77BB45B2329EDEF00DCAE32 /* NXLPermissionPhotoLibrary.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77BB45A2329EDEF00DCAE32 /* NXLPermissionPhotoLibrary.swift */; };
+		A77BB45F2329EE3500DCAE32 /* NXLPermissionLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77BB45E2329EE3500DCAE32 /* NXLPermissionLocation.swift */; };
+		A77BB4612329EEDF00DCAE32 /* NXLPermissionMediaLibrary.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77BB4602329EEDF00DCAE32 /* NXLPermissionMediaLibrary.swift */; };
+		A77BB4632329EF1200DCAE32 /* NXLPermissionNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77BB4622329EF1200DCAE32 /* NXLPermissionNotification.swift */; };
+		A77BB4652329EF5A00DCAE32 /* NXLPermissionCamera.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77BB4642329EF5A00DCAE32 /* NXLPermissionCamera.swift */; };
+		A77BB4672329EF7300DCAE32 /* NXLPermissionContacts.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77BB4662329EF7300DCAE32 /* NXLPermissionContacts.swift */; };
+		A77BB4692329EFB500DCAE32 /* NXLPermissionMicrophone.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77BB4682329EFB500DCAE32 /* NXLPermissionMicrophone.swift */; };
+		A77BB46B2329EFDB00DCAE32 /* NXLPermissionMotion.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77BB46A2329EFDB00DCAE32 /* NXLPermissionMotion.swift */; };
+		A77BB46D2329F01C00DCAE32 /* NXLPermissionReminders.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77BB46C2329F01C00DCAE32 /* NXLPermissionReminders.swift */; };
+		A77BB46F2329F05500DCAE32 /* NXLPermissionSpeech.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77BB46E2329F05500DCAE32 /* NXLPermissionSpeech.swift */; };
+		A77BB4712329F08900DCAE32 /* NXLPermissionCalendar.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77BB4702329F08900DCAE32 /* NXLPermissionCalendar.swift */; };
 		A77F2C612231FB49001BD3F6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77F2C602231FB49001BD3F6 /* AppDelegate.swift */; };
 		A77F2C682231FB4A001BD3F6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A77F2C672231FB4A001BD3F6 /* Assets.xcassets */; };
 		A77F2C762231FB4A001BD3F6 /* RainbowPlanetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A77F2C752231FB4A001BD3F6 /* RainbowPlanetTests.swift */; };
@@ -858,6 +872,20 @@
 		A7778CD422460D8E00C7C47A /* PhoneCountryAreaTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneCountryAreaTableViewCell.swift; sourceTree = "<group>"; };
 		A7778CDC2246121500C7C47A /* PhoneCountryAreaListMdoel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhoneCountryAreaListMdoel.swift; sourceTree = "<group>"; };
 		A7778CDE22461BAD00C7C47A /* PhoneCountryAreaSectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhoneCountryAreaSectionHeaderView.swift; sourceTree = "<group>"; };
+		A77BB4532329EBAA00DCAE32 /* NXLPermission.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NXLPermission.swift; sourceTree = "<group>"; };
+		A77BB4552329EBD800DCAE32 /* NXLPermissionType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NXLPermissionType.swift; sourceTree = "<group>"; };
+		A77BB4582329ECF900DCAE32 /* NXLPermissionAlwaysAuthorizationLocationHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NXLPermissionAlwaysAuthorizationLocationHandler.swift; sourceTree = "<group>"; };
+		A77BB45A2329EDEF00DCAE32 /* NXLPermissionPhotoLibrary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NXLPermissionPhotoLibrary.swift; sourceTree = "<group>"; };
+		A77BB45E2329EE3500DCAE32 /* NXLPermissionLocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NXLPermissionLocation.swift; sourceTree = "<group>"; };
+		A77BB4602329EEDF00DCAE32 /* NXLPermissionMediaLibrary.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NXLPermissionMediaLibrary.swift; sourceTree = "<group>"; };
+		A77BB4622329EF1200DCAE32 /* NXLPermissionNotification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NXLPermissionNotification.swift; sourceTree = "<group>"; };
+		A77BB4642329EF5A00DCAE32 /* NXLPermissionCamera.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NXLPermissionCamera.swift; sourceTree = "<group>"; };
+		A77BB4662329EF7300DCAE32 /* NXLPermissionContacts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NXLPermissionContacts.swift; sourceTree = "<group>"; };
+		A77BB4682329EFB500DCAE32 /* NXLPermissionMicrophone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NXLPermissionMicrophone.swift; sourceTree = "<group>"; };
+		A77BB46A2329EFDB00DCAE32 /* NXLPermissionMotion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NXLPermissionMotion.swift; sourceTree = "<group>"; };
+		A77BB46C2329F01C00DCAE32 /* NXLPermissionReminders.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NXLPermissionReminders.swift; sourceTree = "<group>"; };
+		A77BB46E2329F05500DCAE32 /* NXLPermissionSpeech.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NXLPermissionSpeech.swift; sourceTree = "<group>"; };
+		A77BB4702329F08900DCAE32 /* NXLPermissionCalendar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NXLPermissionCalendar.swift; sourceTree = "<group>"; };
 		A77F2C5D2231FB49001BD3F6 /* RainbowPlanet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RainbowPlanet.app; sourceTree = BUILT_PRODUCTS_DIR; };
 		A77F2C602231FB49001BD3F6 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
 		A77F2C672231FB4A001BD3F6 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
@@ -2628,6 +2656,43 @@
 			path = Model;
 			sourceTree = "<group>";
 		};
+		A77BB4512329EADA00DCAE32 /* Permission */ = {
+			isa = PBXGroup;
+			children = (
+				A77BB4572329EC5200DCAE32 /* NXLPermissions */,
+				A77BB4522329EAF700DCAE32 /* NXLPermission */,
+			);
+			path = Permission;
+			sourceTree = "<group>";
+		};
+		A77BB4522329EAF700DCAE32 /* NXLPermission */ = {
+			isa = PBXGroup;
+			children = (
+				A77BB4532329EBAA00DCAE32 /* NXLPermission.swift */,
+				A77BB4552329EBD800DCAE32 /* NXLPermissionType.swift */,
+				A77BB4582329ECF900DCAE32 /* NXLPermissionAlwaysAuthorizationLocationHandler.swift */,
+			);
+			path = NXLPermission;
+			sourceTree = "<group>";
+		};
+		A77BB4572329EC5200DCAE32 /* NXLPermissions */ = {
+			isa = PBXGroup;
+			children = (
+				A77BB45A2329EDEF00DCAE32 /* NXLPermissionPhotoLibrary.swift */,
+				A77BB45E2329EE3500DCAE32 /* NXLPermissionLocation.swift */,
+				A77BB4602329EEDF00DCAE32 /* NXLPermissionMediaLibrary.swift */,
+				A77BB4622329EF1200DCAE32 /* NXLPermissionNotification.swift */,
+				A77BB4642329EF5A00DCAE32 /* NXLPermissionCamera.swift */,
+				A77BB4662329EF7300DCAE32 /* NXLPermissionContacts.swift */,
+				A77BB4682329EFB500DCAE32 /* NXLPermissionMicrophone.swift */,
+				A77BB46A2329EFDB00DCAE32 /* NXLPermissionMotion.swift */,
+				A77BB46C2329F01C00DCAE32 /* NXLPermissionReminders.swift */,
+				A77BB46E2329F05500DCAE32 /* NXLPermissionSpeech.swift */,
+				A77BB4702329F08900DCAE32 /* NXLPermissionCalendar.swift */,
+			);
+			path = NXLPermissions;
+			sourceTree = "<group>";
+		};
 		A77F2C542231FB49001BD3F6 = {
 			isa = PBXGroup;
 			children = (
@@ -2829,6 +2894,7 @@
 		A77F2CBC2232022A001BD3F6 /* Tools */ = {
 			isa = PBXGroup;
 			children = (
+				A77BB4512329EADA00DCAE32 /* Permission */,
 				A7811CC82323A6D300C2D8DE /* YPDouYinLikeAnimation */,
 				A7AD2793231365250099B3E0 /* QRCode */,
 				A7EE6E1323055A6000628D39 /* MemoryManager */,
@@ -5310,6 +5376,7 @@
 				A72A72B722321DE000B21995 /* Extension+NSMutableAttributedString.swift in Sources */,
 				A7931E0D22AF874600297D0A /* GenderSelectionViewController.swift in Sources */,
 				A7F577D122FECE8700E2D757 /* AliyunVodUpToYoPublishModel.swift in Sources */,
+				A77BB46B2329EFDB00DCAE32 /* NXLPermissionMotion.swift in Sources */,
 				A7C0FDF522B65FE000BC1E86 /* FeaturedTopicsCollectionViewCell.swift in Sources */,
 				A7BB6857226965C100AB07A2 /* SelfRecommendationHeaderCollectionReusableView.swift in Sources */,
 				BDE3045F228554CA001D050F /* ProductCartAmountModel.swift in Sources */,
@@ -5357,6 +5424,7 @@
 				A72A7386223396CB00B21995 /* SwiftMoyaNetWorkManager.swift in Sources */,
 				BD10121122DEBAF0008DF528 /* CommunityRecommendMusicListModel.swift in Sources */,
 				A7E19FAA22BA2CF1009BCCE1 /* SearchUserListViewController.swift in Sources */,
+				A77BB46F2329F05500DCAE32 /* NXLPermissionSpeech.swift in Sources */,
 				A7D07CCD22B77D2E00186014 /* UserPersonalCenterOrderView.swift in Sources */,
 				A70B2C252286C03800B2449F /* NXLPageControl.swift in Sources */,
 				BDF7C5DB22D72405007F3B79 /* CommunityVideoSubCommentController.swift in Sources */,
@@ -5406,6 +5474,7 @@
 				BDE376E522C22D2B0055E2EA /* AlivcImage.m in Sources */,
 				A71CAB3722C9A40A00D908A8 /* TotalBeanModel.swift in Sources */,
 				A743229B22B8C1510017C367 /* AppStoreManager.swift in Sources */,
+				A77BB45B2329EDEF00DCAE32 /* NXLPermissionPhotoLibrary.swift in Sources */,
 				A7EE6E1223055A5A00628D39 /* MemoryManager.swift in Sources */,
 				BD61225422C355C800D3F513 /* AliyunMagicCameraViewController.m in Sources */,
 				BDAF83A222B330540004BCC3 /* RecommendSimilarCell.swift in Sources */,
@@ -5472,6 +5541,7 @@
 				BDE8AD1622CC59EE00E03C65 /* CommunityVideoListModel.swift in Sources */,
 				A7284401224DBB7700F82F30 /* SwiftMoyaNetWorkServiceUser.swift in Sources */,
 				A7C0FDE922B4BC5600BC1E86 /* CardContentCommentListContentTableViewCell.swift in Sources */,
+				A77BB4632329EF1200DCAE32 /* NXLPermissionNotification.swift in Sources */,
 				A7EF3E0C23013EDE001E4D26 /* CommunityImageAuthModel.swift in Sources */,
 				A7811C8C231AD26300C2D8DE /* OtherPersonalCenterReportSureView.swift in Sources */,
 				BD12B67C22B4EE6D00AEB10B /* KSMediaPickerAlbumModel.swift in Sources */,
@@ -5497,7 +5567,9 @@
 				A7D77DE722DDBE4D0048D5F6 /* RedemptionAreaBannerCollectionViewCell.swift in Sources */,
 				A7D5F24D22BC720000F8E9AF /* WVJBModel.swift in Sources */,
 				A74322A222B8D5A90017C367 /* SearchUserLitTableViewCell.swift in Sources */,
+				A77BB4592329ECF900DCAE32 /* NXLPermissionAlwaysAuthorizationLocationHandler.swift in Sources */,
 				A7F577CD22FECD7C00E2D757 /* AliyunVodupToyoPublishManager.swift in Sources */,
+				A77BB4612329EEDF00DCAE32 /* NXLPermissionMediaLibrary.swift in Sources */,
 				A72623E522C39C7000AEF875 /* FMLinkLabel.m in Sources */,
 				A7CC75432271E038003C4F38 /* SelfMentionContactsListViewController.swift in Sources */,
 				A72E685622F2D80F0063D967 /* ATAuthSDKModel.swift in Sources */,
@@ -5520,6 +5592,7 @@
 				A70B2C102286A3BC00B2449F /* ProductDetailModel.swift in Sources */,
 				A7A17E5F22A0CEF200B7A77E /* SwiftMoyaNetWorkManagerTools.swift in Sources */,
 				A72A72A922321DE000B21995 /* NumberKeyboard.swift in Sources */,
+				A77BB4652329EF5A00DCAE32 /* NXLPermissionCamera.swift in Sources */,
 				BD108C9422A60C2100837DAB /* HGImageCollectionViewController.swift in Sources */,
 				A72A72AA22321DE000B21995 /* Log.swift in Sources */,
 				BD61226A22C3595B00D3F513 /* AlivcEditUIConfig.m in Sources */,
@@ -5540,6 +5613,7 @@
 				A7E19FA822BA2CDF009BCCE1 /* SearchProductListViewController.swift in Sources */,
 				BD4B50AE22BC815F0073B516 /* PublishFilterCollectionCell.swift in Sources */,
 				A7D5F23322BB9BE600F8E9AF /* H5CommonViewController.swift in Sources */,
+				A77BB46D2329F01C00DCAE32 /* NXLPermissionReminders.swift in Sources */,
 				BD13B6C522BA034D008BB323 /* PublishEditAddAddressCell.swift in Sources */,
 				BD37E38722CE200E003A14A2 /* CommunityAllCommentView.swift in Sources */,
 				BD377DA422DEC2CA00D5B903 /* CommunityMusicCategoryListModel.swift in Sources */,
@@ -5617,6 +5691,7 @@
 				BDBC0AF422DDE9BC00CA788E /* PublishRouterModuleType.swift in Sources */,
 				A7D5F25022BC7B3700F8E9AF /* WebViewJavascriptBridgeManager.swift in Sources */,
 				A7F2D6D922B250EF0093000B /* CardContentPicVideoTableViewCell.swift in Sources */,
+				A77BB45F2329EE3500DCAE32 /* NXLPermissionLocation.swift in Sources */,
 				BDBC0AF622DDEA4E00CA788E /* PublishRecommendMusicController.swift in Sources */,
 				A7C2568022CD9D8E00420828 /* RecommendSimilarHeaderView.swift in Sources */,
 				A7CC7516227161D5003C4F38 /* SetViewController.swift in Sources */,
@@ -5639,11 +5714,13 @@
 				A7EE6E1723055B1900628D39 /* MemoryManagerRetainCycleLoggerPlugin.swift in Sources */,
 				BD61227522C35A9500D3F513 /* AliyunIConfig.m in Sources */,
 				A770E5E922D383E500CBD0A4 /* CommunityCustomCommnetModel.swift in Sources */,
+				A77BB4562329EBD800DCAE32 /* NXLPermissionType.swift in Sources */,
 				A7D07CC722B774D600186014 /* RainbowBeanPhysicalView.swift in Sources */,
 				A71CAB4122CB32C700D908A8 /* VirusViewModel.swift in Sources */,
 				BD61226122C3561C00D3F513 /* MagicCameraPressCircleView.m in Sources */,
 				A7AA9F5822C5F6150086498B /* SwiftMoyaServiceVirusApi.swift in Sources */,
 				A7284A542252FB5C000BAEC4 /* PaginationModel.swift in Sources */,
+				A77BB4672329EF7300DCAE32 /* NXLPermissionContacts.swift in Sources */,
 				A7C2567622CCB38D00420828 /* HeightModel.swift in Sources */,
 				A7D5F26122C0C2F300F8E9AF /* UserFollowsModel.swift in Sources */,
 				A72A72D022321E2700B21995 /* FontMacro.swift in Sources */,
@@ -5691,6 +5768,7 @@
 				A71738A622897892000AEA6A /* SwiftMoyaServiceShopApi.swift in Sources */,
 				A72A726722321DBD00B21995 /* LocationModel.swift in Sources */,
 				A7F2D6C622B0DC7B0093000B /* CommunityCommonSectionHeaderView.swift in Sources */,
+				A77BB4692329EFB500DCAE32 /* NXLPermissionMicrophone.swift in Sources */,
 				A770E61622D6625700CBD0A4 /* ShareCollectionViewCell.swift in Sources */,
 				BD01B1FA22BC673900CE9F36 /* PublishConfirmPhotoController.swift in Sources */,
 				BD10CD0C22BFCC7C0040796E /* PublishMusicView.swift in Sources */,
@@ -5712,6 +5790,7 @@
 				BD12B69422B4F68400AEB10B /* KSMediaPickerCollectionView.m in Sources */,
 				BD12204122AF8E320051C7C2 /* MessagePlanetNotiTableCell.swift in Sources */,
 				A79057062276EA3D0037F823 /* OpenCityListModel.swift in Sources */,
+				A77BB4712329F08900DCAE32 /* NXLPermissionCalendar.swift in Sources */,
 				A7824B002271F0DD00ABA381 /* EditSelfMentionContactsViewController.swift in Sources */,
 				A7E19FAE22BA2D16009BCCE1 /* SearchContentListViewController.swift in Sources */,
 				BD6122BA22C3639E00D3F513 /* AliyunEffectFilterView.m in Sources */,
@@ -5732,6 +5811,7 @@
 				A7C0FDE722B4A38500BC1E86 /* CardContentCommentListTableViewCell.swift in Sources */,
 				A757C92E22744ACE00226355 /* AddressManagerListModel.swift in Sources */,
 				A7274C59228EE636000E3A07 /* LBXScanNetAnimation.swift in Sources */,
+				A77BB4542329EBAA00DCAE32 /* NXLPermission.swift in Sources */,
 				BD13B6E422BA0546008BB323 /* PublishAddressPOICell.swift in Sources */,
 				BDE376E922C22D4E0055E2EA /* AlivcUIConfig.m in Sources */,
 				A7C2567C22CD8EEE00420828 /* CommunityPostCommentsModel.swift in Sources */,

+ 14 - 0
RainbowPlanet/RainbowPlanet/AppDelegate/AppDelegate+Window.swift

@@ -34,6 +34,8 @@ extension AppDelegate {
             self?.setTableViewAppearance()
             /// 城市转换
             self?.setBaiduToCityFactory()
+            /// 授权处理
+            self?.setPermission()
             /// 设置默认为快递
             let deliveryMethodTypeModel = DeliveryMethodTypeModel.shared()
             deliveryMethodTypeModel.deliveryMethodType = "2"
@@ -138,4 +140,16 @@ extension AppDelegate {
         GuidePageView.guidePageView(images: ["guide_1","guide_2","guide_3","guide_4"])
     }
     
+    
+    /// 授权
+    func setPermission() {
+        NXLPermission.request(NXLPermissionType.locationAlwaysAndWhenInUse) {}
+        NXLPermission.request(NXLPermissionType.notification) {}
+        NXLPermission.request(NXLPermissionType.photoLibrary) {}
+        NXLPermission.request(NXLPermissionType.camera) {}
+        NXLPermission.request(NXLPermissionType.microphone) {}
+    }
+    
+
+    
 }

+ 2 - 2
RainbowPlanet/RainbowPlanet/Base/BaseTabbarViewController/BaseTabbarViewController.swift

@@ -159,8 +159,8 @@ class BaseTabbarViewController: NSObject {
     /// 跳转到VC
     func pushPublishVC() {
         if BaseTabbarViewController.shared.v1.navigationBarbgView.isHidden {
-            let pickVc = PublishViewController()
-//            let  pickVc = PublishNewViewController()
+//            let pickVc = PublishViewController()
+            let  pickVc = PublishNewViewController()
             let nav = BaseNavigationViewController.init(rootViewController: pickVc)
             BaseTabbarViewController.shared.esTabBarController.present(nav, animated: true, completion: nil)
         } else {

+ 3 - 3
RainbowPlanet/RainbowPlanet/Modules/PublishNewModule/PublishNew/View/PublishNewAuthorizationView.swift

@@ -64,17 +64,17 @@ class PublishNewAuthorizationView: BaseView {
         }).disposed(by: disposeBag)
         //跳转到相机权限
         cameraButton.rx.tap.subscribe(onNext: { [weak vc] _ in
-            LBXPermissions.jumpToSystemPrivacySetting()
+            NXLPermission.openSettingsURL()
             vc?.dismiss(animated: true, completion: nil)
         }).disposed(by: disposeBag)
         // 跳转到麦克风权限
         microphoneButton.rx.tap.subscribe(onNext: { [weak vc] _ in
-            LBXPermissions.jumpToSystemPrivacySetting()
+            NXLPermission.openSettingsURL()
             vc?.dismiss(animated: true, completion: nil)
         }).disposed(by: disposeBag)
         // 跳转到相册权限
         albumButton.rx.tap.subscribe(onNext: { [weak vc] _ in
-            LBXPermissions.jumpToSystemPrivacySetting()
+            NXLPermission.openSettingsURL()
             vc?.dismiss(animated: true, completion: nil)
         }).disposed(by: disposeBag)
     }

+ 25 - 23
RainbowPlanet/RainbowPlanet/Modules/PublishNewModule/PublishNew/View/PublishNewVideoPhotoView.swift

@@ -20,17 +20,32 @@ class PublishNewVideoPhotoView: BaseView {
     
     override func setupData() {
         /// 开始预览
-        recorder?.startPreview()
+//        recorder?.startPreview()
         /// 开始预览前置/后置摄像头
 //        recorder.startPreview(withPositon: AliyunIRecorderCameraPosition.back)
         /// 停止预览
-        recorder?.stopPreview()
+//        recorder?.stopPreview()
     }
     
     // SDK录制类
     lazy var recorder: AliyunIRecorder? = {
         let recorder = AliyunIRecorder.init(delegate: self, videoSize: CGSize(width: 720, height: 1280))
+        // 预览View
         recorder?.preview = self
+        // 美颜状态
+        recorder?.beautifyStatus = true;
+        // 设置美颜度 [0,100]
+        recorder?.beautifyValue = 50
+        // 后置摄像头采集分辨率 默认:AVCaptureSessionPreset1280x720
+        recorder?.backCaptureSessionPreset = AVCaptureSession.Preset.hd1280x720.rawValue
+        // 前置摄像头采集分辨率 默认:AVCaptureSessionPreset1280x720
+        recorder?.frontCaptureSessionPreset = AVCaptureSession.Preset.hd1280x720.rawValue
+        // 设置视频最大时长 默认8
+        recorder?.clipManager.maxDuration = 60
+        
+        // 设置视频最小时长 默认8
+        recorder?.clipManager.maxDuration = 3
+        
 
         /*
          视频的输出路径
@@ -47,30 +62,17 @@ class PublishNewVideoPhotoView: BaseView {
          */
 //        recorder?.taskPath = taskPath;
         
-        // 美颜状态
-//        recorder?.beautifyStatus = true;
-        
-        // 设置美颜度 [0,100]
-//        recorder?.beautifyValue = 50
-        
-        
-        // 后置摄像头采集分辨率 默认:AVCaptureSessionPreset640x480
-//        recorder?.backCaptureSessionPreset = AVCaptureSession.Preset.hd1280x720.rawValue
-        
-        // 前置摄像头采集分辨率 默认:AVCaptureSessionPreset640x480
-//        recorder?.frontCaptureSessionPreset = AVCaptureSession.Preset.hd1280x720.rawValue
         
-        // 设置视频最大时长 默认8
-//        recorder?.clipManager.maxDuration = self.maxDuration
+
         
         return recorder!
     }()
     
-    /// 显示授权View
-    func showAuthorizationView() {
-        PublishNewViewModel.shared.scrollView?.isHidden = true
-        PublishNewViewModel.shared.publishNewAuthorizationView?.isHidden = false
-    }
+//    /// 显示授权View
+//    func showAuthorizationView() {
+//        PublishNewViewModel.shared.scrollView?.isHidden = true
+//        PublishNewViewModel.shared.publishNewAuthorizationView?.isHidden = false
+//    }
     
 
 }
@@ -83,11 +85,11 @@ extension PublishNewVideoPhotoView : AliyunIRecorderDelegate {
             break
         // 音频授权被拒绝
         case .audioDenied:
-            showAuthorizationView()
+//            showAuthorizationView()
             break
         // 视频授权被拒绝
         case .videoDenied:
-            showAuthorizationView()
+//            showAuthorizationView()
             break
         default:
             break

+ 10 - 0
RainbowPlanet/RainbowPlanet/Modules/PublishNewModule/PublishNew/ViewController/PublishNewViewController.swift

@@ -67,6 +67,16 @@ class PublishNewViewController: BaseViewController {
         publishNewViewModel?.scrollView = scrollView
         publishNewViewModel?.publishNewAuthorizationView = publishNewAuthorizationView
         
+        /// 授权
+        if NXLPermission.isDenied(.photoLibrary) ||
+           NXLPermission.isDenied(.camera) ||
+           NXLPermission.isDenied(.microphone)
+        {
+            PublishNewViewModel.shared.scrollView?.isHidden = true
+            PublishNewViewModel.shared.publishNewAuthorizationView?.isHidden = false
+        }
+        
+        
     }
     /// 授权View
     private lazy var publishNewAuthorizationView: PublishNewAuthorizationView = {

+ 4 - 4
RainbowPlanet/RainbowPlanet/Supporting Files/Info.plist

@@ -214,13 +214,13 @@
 	<key>NSContactsUsageDescription</key>
 	<string>App需要您的同意,才能访问通信录</string>
 	<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
-	<string>你的位置信息将帮助彩虹星球展示离你最近的门店</string>
+	<string>App需要您的同意,才能访问定位</string>
 	<key>NSLocationAlwaysUsageDescription</key>
-	<string>你的位置信息将帮助彩虹星球展示离你最近的门店</string>
+	<string>App需要您的同意,才能访问定位</string>
 	<key>NSLocationUsageDescription</key>
-	<string>你的位置信息将帮助彩虹星球展示离你最近的门店</string>
+	<string>App需要您的同意,才能访问定位</string>
 	<key>NSLocationWhenInUseUsageDescription</key>
-	<string>你的位置信息将帮助彩虹星球展示离你最近的门店</string>
+	<string>App需要您的同意,才能访问定位</string>
 	<key>NSMicrophoneUsageDescription</key>
 	<string>App需要您的同意,才能访问麦克风</string>
 	<key>NSPhotoLibraryAddUsageDescription</key>

+ 98 - 0
RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermission/NXLPermission.swift

@@ -0,0 +1,98 @@
+//
+//  NXLPermission.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/9/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import AVFoundation
+import UserNotifications
+import Photos
+import MapKit
+import EventKit
+import Contacts
+import Speech
+import MediaPlayer
+import HealthKit
+import CoreMotion
+
+public enum NXLPermission {
+    
+    public static func isAllowed(_ permission: NXLPermissionType) -> Bool {
+        let manager = self.getManagerForPermission(permission)
+        return manager.isAuthorized
+    }
+    
+    public static func isDenied(_ permission: NXLPermissionType) -> Bool {
+        let manager = self.getManagerForPermission(permission)
+        return manager.isDenied
+    }
+    
+    public static func request(_ permission: NXLPermissionType, with сompletionHandler: @escaping ()->()) {
+        let manager = self.getManagerForPermission(permission)
+        if let usageDescriptionKey = permission.usageDescriptionKey {
+            guard let _ = Bundle.main.object(forInfoDictionaryKey: usageDescriptionKey) else {
+                print("NXLPermission Warning - \(usageDescriptionKey) for \(permission.name) not found in Info.plist")
+                return
+            }
+        }
+        manager.request(withCompletionHandler: {
+            сompletionHandler()
+        })
+    }
+    
+    public static func openSettingsURL() {
+        let appSetting = URL(string: UIApplication.openSettingsURLString)
+        if appSetting != nil {
+            if #available(iOS 10, *) {
+                UIApplication.shared.open(appSetting!, options: [:], completionHandler: nil)
+            } else {
+                UIApplication.shared.openURL(appSetting!)
+            }
+        }
+    }
+}
+
+protocol NXLPermissionInterface {
+    
+    var isAuthorized: Bool { get }
+    
+    var isDenied: Bool { get }
+    
+    func request(withCompletionHandler сompletionHandler: @escaping ()->()?)
+}
+
+extension NXLPermission {
+    
+    fileprivate static func getManagerForPermission(_ permission: NXLPermissionType) -> NXLPermissionInterface {
+        switch permission {
+        case .camera:
+            return NXLCameraPermission()
+        case .photoLibrary:
+            return NXLPhotoLibraryPermission()
+        case .notification:
+            return NXLNotificationPermission()
+        case .microphone:
+            return NXLMicrophonePermission()
+        case .calendar:
+            return NXLCalendarPermission()
+        case .contacts:
+            return NXLContactsPermission()
+        case .reminders:
+            return NXLRemindersPermission()
+        case .speech:
+            return NXLSpeechPermission()
+        case .locationWhenInUse:
+            return NXLLocationPermission(type: NXLLocationPermission.NXLLocationType.WhenInUse)
+        case .locationAlwaysAndWhenInUse:
+            return NXLLocationPermission(type: NXLLocationPermission.NXLLocationType.AlwaysAndWhenInUse)
+        case .motion:
+            return NXLMotionPermission()
+        case .mediaLibrary:
+            return NXLMediaLibraryPermission()
+        }
+    }
+}
+

+ 130 - 0
RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermission/NXLPermissionAlwaysAuthorizationLocationHandler.swift

@@ -0,0 +1,130 @@
+//
+//  NXLPermissionAlwaysAuthorizationLocationHandler.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/9/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import Foundation
+import MapKit
+
+class NXLPermissionAlwaysAuthorizationLocationHandler: NSObject, CLLocationManagerDelegate {
+    
+    static var shared: NXLPermissionAlwaysAuthorizationLocationHandler?
+    
+    lazy var locationManager: CLLocationManager =  {
+        return CLLocationManager()
+    }()
+    
+    var completionHandler: NXLPermissionAuthorizationHandlerCompletionBlock?
+    
+    override init() {
+        super.init()
+    }
+    
+    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
+        print("locationManager \(status)")
+        
+        if status == .notDetermined {
+            print("2")
+            return
+        }
+        
+        if let completionHandler = completionHandler {
+            completionHandler(self.isAuthorized)
+        }
+    }
+    
+    private var whenInUseNotRealChangeStatus: Bool = false
+    
+    func requestPermission(_ completionHandler: @escaping NXLPermissionAuthorizationHandlerCompletionBlock) {
+        self.completionHandler = completionHandler
+        
+        let status = CLLocationManager.authorizationStatus()
+        
+        switch status {
+        case .notDetermined:
+            locationManager.delegate = self
+            locationManager.requestAlwaysAuthorization()
+        case .authorizedWhenInUse:
+            locationManager.delegate = self
+            locationManager.requestAlwaysAuthorization()
+            self.whenInUseNotRealChangeStatus = true
+        default:
+            completionHandler(self.isAuthorized)
+        }
+    }
+    
+    var isAuthorized: Bool {
+        let status = CLLocationManager.authorizationStatus()
+        if status == .authorizedAlways {
+            return true
+        }
+        return false
+    }
+    
+    deinit {
+        locationManager.delegate = nil
+    }
+}
+
+class NXLPermissionWhenInUseAuthorizationLocationHandler: NSObject, CLLocationManagerDelegate {
+    
+    static var shared: NXLPermissionWhenInUseAuthorizationLocationHandler?
+    
+    lazy var locationManager: CLLocationManager =  {
+        return CLLocationManager()
+    }()
+    
+    var completionHandler: NXLPermissionAuthorizationHandlerCompletionBlock?
+    
+    override init() {
+        super.init()
+    }
+    
+    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
+        if status == .notDetermined {
+            return
+        }
+        
+        if let completionHandler = completionHandler {
+            completionHandler(self.isAuthorized)
+        }
+    }
+    
+    func requestPermission(_ completionHandler: @escaping NXLPermissionAuthorizationHandlerCompletionBlock) {
+        self.completionHandler = completionHandler
+        
+        let status = CLLocationManager.authorizationStatus()
+        if (status == .notDetermined) || (status == .authorizedAlways) {
+            locationManager.delegate = self
+            locationManager.requestWhenInUseAuthorization()
+        } else {
+            completionHandler(self.isAuthorized)
+        }
+    }
+    
+    var isAuthorized: Bool {
+        let status = CLLocationManager.authorizationStatus()
+        if status == .authorizedWhenInUse {
+            return true
+        }
+        return false
+    }
+    
+    deinit {
+        locationManager.delegate = nil
+    }
+}
+
+extension NXLPermissionAlwaysAuthorizationLocationHandler {
+    
+    typealias NXLPermissionAuthorizationHandlerCompletionBlock = (Bool) -> Void
+}
+
+extension NXLPermissionWhenInUseAuthorizationLocationHandler {
+    
+    typealias NXLPermissionAuthorizationHandlerCompletionBlock = (Bool) -> Void
+}
+

+ 84 - 0
RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermission/NXLPermissionType.swift

@@ -0,0 +1,84 @@
+//
+//  NXLPermissionType.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/9/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+
+@objc public enum NXLPermissionType: Int {
+    
+    case camera = 0
+    case photoLibrary = 1
+    case notification = 2
+    case microphone = 3
+    case calendar = 4
+    case contacts = 5
+    case reminders = 6
+    case speech = 7
+    case locationWhenInUse = 9
+    case locationAlwaysAndWhenInUse = 10
+    case motion = 11
+    case mediaLibrary = 12
+    
+    var name: String {
+        switch self {
+        case .camera:
+            return "Camera"
+        case .photoLibrary:
+            return "Photo Library"
+        case .notification:
+            return "Notification"
+        case .microphone:
+            return "Microphone"
+        case .calendar:
+            return "Calendar"
+        case .contacts:
+            return "Contacts"
+        case .reminders:
+            return "Reminders"
+        case .speech:
+            return "Speech"
+        case .locationWhenInUse:
+            return "Location When Use"
+        case .locationAlwaysAndWhenInUse:
+            return "Location Always"
+        case .motion:
+            return "Motion"
+        case .mediaLibrary:
+            return "Media Library"
+        }
+    }
+    
+    var usageDescriptionKey: String? {
+        switch self {
+        case .camera:
+            return "NSCameraUsageDescription"
+        case .photoLibrary:
+            return "NSPhotoLibraryUsageDescription"
+        case .notification:
+            return nil
+        case .microphone:
+            return "NSMicrophoneUsageDescription"
+        case .calendar:
+            return "NSCalendarsUsageDescription"
+        case .contacts:
+            return "NSContactsUsageDescription"
+        case .reminders:
+            return "NSRemindersUsageDescription"
+        case .speech:
+            return "NSSpeechRecognitionUsageDescription"
+        case .locationWhenInUse:
+            return "NSLocationWhenInUseUsageDescription"
+        case .locationAlwaysAndWhenInUse:
+            return "NSLocationAlwaysAndWhenInUseUsageDescription"
+        case .motion:
+            return "NSMotionUsageDescription"
+        case .mediaLibrary:
+            return "NSAppleMusicUsageDescription"
+        }
+    }
+}
+

+ 34 - 0
RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionCalendar.swift

@@ -0,0 +1,34 @@
+//
+//  NXLPermissionCalendar.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/9/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import EventKit
+
+extension NXLPermission {
+    
+    struct NXLCalendarPermission: NXLPermissionInterface {
+        
+        var isAuthorized: Bool {
+            return EKEventStore.authorizationStatus(for: EKEntityType.event) == .authorized
+        }
+        
+        var isDenied: Bool {
+            return EKEventStore.authorizationStatus(for: EKEntityType.event) == .denied
+        }
+        
+        func request(withCompletionHandler сompletionHandler: @escaping ()->()?) {
+            let eventStore = EKEventStore()
+            eventStore.requestAccess(to: EKEntityType.event, completion: {
+                (accessGranted: Bool, error: Error?) in
+                DispatchQueue.main.async {
+                    сompletionHandler()
+                }
+            })
+        }
+    }
+}

+ 33 - 0
RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionCamera.swift

@@ -0,0 +1,33 @@
+//
+//  NXLPermissionCamera.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/9/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import AVFoundation
+
+extension NXLPermission {
+    
+    struct NXLCameraPermission: NXLPermissionInterface {
+        
+        var isAuthorized: Bool {
+            return AVCaptureDevice.authorizationStatus(for: AVMediaType.video) == AVAuthorizationStatus.authorized
+        }
+        
+        var isDenied: Bool {
+            return AVCaptureDevice.authorizationStatus(for: AVMediaType.video) == AVAuthorizationStatus.denied
+        }
+        
+        func request(withCompletionHandler сompletionHandler: @escaping ()->()?) {
+            AVCaptureDevice.requestAccess(for: AVMediaType.video, completionHandler: {
+                finished in
+                DispatchQueue.main.async {
+                    сompletionHandler()
+                }
+            })
+        }
+    }
+}

+ 52 - 0
RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionContacts.swift

@@ -0,0 +1,52 @@
+//
+//  NXLPermissionContacts.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/9/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import Contacts
+import AddressBook
+
+extension NXLPermission {
+    
+    struct NXLContactsPermission: NXLPermissionInterface {
+        
+        var isAuthorized: Bool {
+            if #available(iOS 9.0, *) {
+                return CNContactStore.authorizationStatus(for: .contacts) == .authorized
+            } else {
+                return ABAddressBookGetAuthorizationStatus() == .authorized
+            }
+        }
+        
+        var isDenied: Bool {
+            if #available(iOS 9.0, *) {
+                return CNContactStore.authorizationStatus(for: .contacts) == .denied
+            } else {
+                return ABAddressBookGetAuthorizationStatus() == .denied
+            }
+        }
+        
+        func request(withCompletionHandler сompletionHandler: @escaping ()->()?) {
+            if #available(iOS 9.0, *) {
+                let store = CNContactStore()
+                store.requestAccess(for: .contacts, completionHandler: { (granted, error) in
+                    DispatchQueue.main.async {
+                        сompletionHandler()
+                    }
+                })
+            } else {
+                let addressBookRef: ABAddressBook = ABAddressBookCreateWithOptions(nil, nil).takeRetainedValue()
+                ABAddressBookRequestAccessWithCompletion(addressBookRef) {
+                    (granted: Bool, error: CFError?) in
+                    DispatchQueue.main.async() {
+                        сompletionHandler()
+                    }
+                }
+            }
+        }
+    }
+}

+ 76 - 0
RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionLocation.swift

@@ -0,0 +1,76 @@
+//
+//  NXLPermissionLocation.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/9/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import MapKit
+
+extension NXLPermission {
+    
+    struct NXLLocationPermission: NXLPermissionInterface {
+        
+        var type: NXLLocationType
+        
+        enum NXLLocationType {
+            case WhenInUse
+            case AlwaysAndWhenInUse
+        }
+        
+        init(type: NXLLocationType) {
+            self.type = type
+        }
+        
+        var isAuthorized: Bool {
+            
+            let status = CLLocationManager.authorizationStatus()
+            
+            if status == .authorizedAlways {
+                return true
+            } else {
+                if type == .WhenInUse {
+                    return status == .authorizedWhenInUse
+                } else {
+                    return false
+                }
+            }
+        }
+        
+        var isDenied: Bool {
+            return CLLocationManager.authorizationStatus() == .denied
+        }
+        
+        func request(withCompletionHandler сompletionHandler: @escaping ()->()?) {
+            
+            switch self.type {
+            case .AlwaysAndWhenInUse:
+                if NXLPermissionAlwaysAuthorizationLocationHandler.shared == nil {
+                    NXLPermissionAlwaysAuthorizationLocationHandler.shared = NXLPermissionAlwaysAuthorizationLocationHandler()
+                }
+                
+                NXLPermissionAlwaysAuthorizationLocationHandler.shared!.requestPermission { (authorized) in
+                    DispatchQueue.main.async {
+                        сompletionHandler()
+                        NXLPermissionAlwaysAuthorizationLocationHandler.shared = nil
+                    }
+                }
+                break
+            case .WhenInUse:
+                if NXLPermissionWhenInUseAuthorizationLocationHandler.shared == nil {
+                    NXLPermissionWhenInUseAuthorizationLocationHandler.shared = NXLPermissionWhenInUseAuthorizationLocationHandler()
+                }
+                
+                NXLPermissionWhenInUseAuthorizationLocationHandler.shared!.requestPermission { (authorized) in
+                    DispatchQueue.main.async {
+                        сompletionHandler()
+                        NXLPermissionWhenInUseAuthorizationLocationHandler.shared = nil
+                    }
+                }
+                break
+            }
+        }
+    }
+}

+ 32 - 0
RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionMediaLibrary.swift

@@ -0,0 +1,32 @@
+//
+//  NXLPermissionMediaLibrary.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/9/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import MediaPlayer
+
+extension NXLPermission {
+    
+    struct NXLMediaLibraryPermission: NXLPermissionInterface {
+        
+        var isAuthorized: Bool {
+            return MPMediaLibrary.authorizationStatus() == .authorized
+        }
+        
+        var isDenied: Bool {
+            return MPMediaLibrary.authorizationStatus() == .denied
+        }
+        
+        func request(withCompletionHandler сompletionHandler: @escaping ()->()?) {
+            MPMediaLibrary.requestAuthorization() { status in
+                DispatchQueue.main.async {
+                    сompletionHandler()
+                }
+            }
+        }
+    }
+}

+ 33 - 0
RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionMicrophone.swift

@@ -0,0 +1,33 @@
+//
+//  NXLPermissionMicrophone.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/9/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import AVFoundation
+
+extension NXLPermission {
+    
+    struct NXLMicrophonePermission: NXLPermissionInterface {
+        
+        var isAuthorized: Bool {
+            return AVAudioSession.sharedInstance().recordPermission == .granted
+        }
+        
+        var isDenied: Bool {
+            return AVAudioSession.sharedInstance().recordPermission == .denied
+        }
+        
+        func request(withCompletionHandler сompletionHandler: @escaping ()->()?) {
+            AVAudioSession.sharedInstance().requestRecordPermission {
+                granted in
+                DispatchQueue.main.async {
+                    сompletionHandler()
+                }
+            }
+        }
+    }
+}

+ 40 - 0
RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionMotion.swift

@@ -0,0 +1,40 @@
+//
+//  NXLPermissionMotion.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/9/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import CoreMotion
+
+extension NXLPermission {
+    
+    struct NXLMotionPermission: NXLPermissionInterface {
+        
+        var isAuthorized: Bool {
+            if #available(iOS 11.0, *) {
+                return CMMotionActivityManager.authorizationStatus() == .authorized
+            }
+            return false
+        }
+        
+        var isDenied: Bool {
+            if #available(iOS 11.0, *) {
+                return CMMotionActivityManager.authorizationStatus() == .denied
+            }
+            return false
+        }
+        
+        func request(withCompletionHandler сompletionHandler: @escaping ()->()?) {
+            let manager = CMMotionActivityManager()
+            let today = Date()
+            
+            manager.queryActivityStarting(from: today, to: today, to: OperationQueue.main, withHandler: { (activities: [CMMotionActivity]?, error: Error?) -> () in
+                сompletionHandler()
+                manager.stopActivityUpdates()
+            })
+        }
+    }
+}

+ 59 - 0
RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionNotification.swift

@@ -0,0 +1,59 @@
+//
+//  NXLPermissionNotification.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/9/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import UserNotifications
+
+extension NXLPermission {
+    
+    struct NXLNotificationPermission: NXLPermissionInterface {
+        
+        var isAuthorized: Bool {
+            guard let authorizationStatus = fetchAuthorizationStatus() else { return false }
+            return authorizationStatus == .authorized
+        }
+        
+        var isDenied: Bool {
+            guard let authorizationStatus = fetchAuthorizationStatus() else { return false }
+            return authorizationStatus == .denied
+        }
+        
+        private func fetchAuthorizationStatus() -> UNAuthorizationStatus? {
+            var notificationSettings: UNNotificationSettings?
+            let semaphore = DispatchSemaphore(value: 0)
+            
+            DispatchQueue.global().async {
+                UNUserNotificationCenter.current().getNotificationSettings { setttings in
+                    notificationSettings = setttings
+                    semaphore.signal()
+                }
+            }
+            
+            semaphore.wait()
+            return notificationSettings?.authorizationStatus
+        }
+        
+        func request(withCompletionHandler сompletionHandler: @escaping ()->()?) {
+            if #available(iOS 10.0, *) {
+                let center = UNUserNotificationCenter.current()
+                center.requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in
+                    DispatchQueue.main.async {
+                        сompletionHandler()
+                    }
+                }
+            } else {
+                UIApplication.shared.registerUserNotificationSettings(UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil))
+                DispatchQueue.main.async {
+                    сompletionHandler()
+                }
+            }
+            
+            UIApplication.shared.registerForRemoteNotifications()
+        }
+    }
+}

+ 34 - 0
RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionPhotoLibrary.swift

@@ -0,0 +1,34 @@
+//
+//  NXLPermissionPhotoLibrary.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/9/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import Photos
+
+extension NXLPermission {
+    
+    struct NXLPhotoLibraryPermission: NXLPermissionInterface {
+        
+        var isAuthorized: Bool {
+            return PHPhotoLibrary.authorizationStatus() == PHAuthorizationStatus.authorized
+        }
+        
+        var isDenied: Bool {
+            return PHPhotoLibrary.authorizationStatus() == PHAuthorizationStatus.denied
+        }
+        
+        func request(withCompletionHandler сompletionHandler: @escaping ()->()?) {
+            PHPhotoLibrary.requestAuthorization({
+                finished in
+                DispatchQueue.main.async {
+                    сompletionHandler()
+                }
+            })
+        }
+    }
+}
+

+ 34 - 0
RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionReminders.swift

@@ -0,0 +1,34 @@
+//
+//  NXLPermissionReminders.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/9/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import EventKit
+
+extension NXLPermission {
+    
+    struct NXLRemindersPermission: NXLPermissionInterface {
+        
+        var isAuthorized: Bool {
+            return EKEventStore.authorizationStatus(for: EKEntityType.reminder) == .authorized
+        }
+        
+        var isDenied: Bool {
+            return EKEventStore.authorizationStatus(for: EKEntityType.reminder) == .denied
+        }
+        
+        func request(withCompletionHandler сompletionHandler: @escaping ()->()?) {
+            let eventStore = EKEventStore()
+            eventStore.requestAccess(to: EKEntityType.reminder, completion: {
+                (accessGranted: Bool, error: Error?) in
+                DispatchQueue.main.async {
+                    сompletionHandler()
+                }
+            })
+        }
+    }
+}

+ 32 - 0
RainbowPlanet/RainbowPlanet/Tools/Permission/NXLPermissions/NXLPermissionSpeech.swift

@@ -0,0 +1,32 @@
+//
+//  NXLPermissionSpeech.swift
+//  RainbowPlanet
+//
+//  Created by 南鑫林 on 2019/9/12.
+//  Copyright © 2019 RainbowPlanet. All rights reserved.
+//
+
+import UIKit
+import Speech
+
+extension NXLPermission {
+    
+    struct NXLSpeechPermission: NXLPermissionInterface {
+        
+        var isAuthorized: Bool {
+            return SFSpeechRecognizer.authorizationStatus() == .authorized
+        }
+        
+        var isDenied: Bool {
+            return SFSpeechRecognizer.authorizationStatus() == .denied
+        }
+        
+        func request(withCompletionHandler сompletionHandler: @escaping ()->()?) {
+            SFSpeechRecognizer.requestAuthorization { status in
+                DispatchQueue.main.async {
+                    сompletionHandler()
+                }
+            }
+        }
+    }
+}