@momo-kits/native-kits 0.0.1-beta.4 → 0.0.1-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/example/ios/Example/ComponentModel.swift +7 -2
  2. package/example/ios/Example/ContentView.swift +0 -14
  3. package/example/ios/Example/Foundation/ImageDemo.swift +43 -0
  4. package/example/ios/Example/Foundation/Popup/Popups.swift +2 -52
  5. package/example/ios/Example/Foundation/PopupDemo.swift +44 -21
  6. package/example/ios/Example/Foundation/TextInputDemo.swift +13 -8
  7. package/example/ios/Example/Library/CheckboxDemo.swift +19 -0
  8. package/example/ios/Example/Library/SwitchDemo.swift +19 -0
  9. package/example/ios/Example/Main.swift +17 -1
  10. package/example/ios/Example/Resource/foundation.json +2 -2
  11. package/example/ios/Example/Resource/library.json +10 -0
  12. package/example/ios/Example.xcodeproj/project.pbxproj +12 -1
  13. package/example/ios/Example.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +1 -1
  14. package/example/ios/Example.xcworkspace/xcuserdata/wem.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  15. package/example/ios/Podfile +2 -1
  16. package/example/ios/Podfile.lock +22 -3
  17. package/example/ios/Pods/Local Podspecs/MoMoUIKits.podspec.json +8 -0
  18. package/example/ios/Pods/Manifest.lock +22 -3
  19. package/example/ios/Pods/Pods.xcodeproj/project.pbxproj +1551 -165
  20. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SDWebImage.xcscheme +58 -0
  21. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +58 -0
  22. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SkeletonUI.xcscheme +58 -0
  23. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +21 -0
  24. package/example/ios/Pods/SDWebImage/LICENSE +20 -0
  25. package/example/ios/Pods/SDWebImage/README.md +352 -0
  26. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSButton+WebCache.h +340 -0
  27. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSButton+WebCache.m +172 -0
  28. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSData+ImageContentType.h +63 -0
  29. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSData+ImageContentType.m +165 -0
  30. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSImage+Compatibility.h +67 -0
  31. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSImage+Compatibility.m +120 -0
  32. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.h +114 -0
  33. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.m +392 -0
  34. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.h +112 -0
  35. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.m +420 -0
  36. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageRep.h +23 -0
  37. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageRep.m +133 -0
  38. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView+WebCache.h +168 -0
  39. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView+WebCache.m +79 -0
  40. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView.h +110 -0
  41. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView.m +540 -0
  42. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.h +145 -0
  43. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.m +326 -0
  44. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.h +73 -0
  45. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.m +256 -0
  46. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAPNGCoder.h +19 -0
  47. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAPNGCoder.m +58 -0
  48. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAWebPCoder.h +23 -0
  49. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAWebPCoder.m +98 -0
  50. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.h +450 -0
  51. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.m +1030 -0
  52. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheConfig.h +153 -0
  53. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheConfig.m +68 -0
  54. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.h +156 -0
  55. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.m +138 -0
  56. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCachesManager.h +81 -0
  57. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCachesManager.m +556 -0
  58. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.h +297 -0
  59. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.m +26 -0
  60. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.h +153 -0
  61. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m +822 -0
  62. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCodersManager.h +58 -0
  63. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCodersManager.m +130 -0
  64. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageFrame.h +36 -0
  65. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageFrame.m +28 -0
  66. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGIFCoder.h +22 -0
  67. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGIFCoder.m +58 -0
  68. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.h +28 -0
  69. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.m +127 -0
  70. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageHEICCoder.h +25 -0
  71. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageHEICCoder.m +101 -0
  72. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.h +58 -0
  73. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.m +807 -0
  74. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.h +30 -0
  75. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.m +420 -0
  76. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.h +146 -0
  77. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.m +170 -0
  78. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoadersManager.h +40 -0
  79. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoadersManager.m +123 -0
  80. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageTransformer.h +241 -0
  81. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageTransformer.m +331 -0
  82. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDMemoryCache.h +78 -0
  83. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDMemoryCache.m +158 -0
  84. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheKeyFilter.h +32 -0
  85. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheKeyFilter.m +39 -0
  86. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.h +36 -0
  87. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.m +39 -0
  88. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCompat.h +95 -0
  89. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCompat.m +17 -0
  90. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDefine.h +352 -0
  91. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDefine.m +149 -0
  92. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.h +314 -0
  93. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.m +658 -0
  94. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.h +113 -0
  95. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.m +60 -0
  96. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderDecryptor.h +49 -0
  97. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderDecryptor.m +55 -0
  98. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.h +191 -0
  99. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.m +722 -0
  100. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.h +69 -0
  101. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.m +71 -0
  102. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderResponseModifier.h +69 -0
  103. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderResponseModifier.m +73 -0
  104. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.h +32 -0
  105. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.m +16 -0
  106. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageIndicator.h +115 -0
  107. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageIndicator.m +275 -0
  108. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageManager.h +290 -0
  109. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageManager.m +775 -0
  110. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOperation.h +27 -0
  111. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOperation.m +14 -0
  112. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOptionsProcessor.h +72 -0
  113. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOptionsProcessor.m +59 -0
  114. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImagePrefetcher.h +143 -0
  115. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImagePrefetcher.m +303 -0
  116. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageTransition.h +131 -0
  117. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageTransition.m +194 -0
  118. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIButton+WebCache.h +387 -0
  119. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIButton+WebCache.m +234 -0
  120. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ExtendedCacheData.h +24 -0
  121. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ExtendedCacheData.m +23 -0
  122. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.h +46 -0
  123. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.m +60 -0
  124. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+GIF.h +26 -0
  125. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+GIF.m +22 -0
  126. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MemoryCacheCost.h +27 -0
  127. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MemoryCacheCost.m +47 -0
  128. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Metadata.h +89 -0
  129. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Metadata.m +221 -0
  130. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MultiFormat.h +80 -0
  131. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MultiFormat.m +47 -0
  132. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.h +146 -0
  133. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.m +824 -0
  134. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+HighlightedWebCache.h +129 -0
  135. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+HighlightedWebCache.m +76 -0
  136. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+WebCache.h +194 -0
  137. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+WebCache.m +67 -0
  138. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCache.h +110 -0
  139. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCache.m +446 -0
  140. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.h +48 -0
  141. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.m +82 -0
  142. package/example/ios/Pods/SDWebImage/SDWebImage/Private/NSBezierPath+SDRoundedCorners.h +24 -0
  143. package/example/ios/Pods/SDWebImage/SDWebImage/Private/NSBezierPath+SDRoundedCorners.m +42 -0
  144. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAssociatedObject.h +14 -0
  145. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAssociatedObject.m +29 -0
  146. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.h +21 -0
  147. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.m +92 -0
  148. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.h +18 -0
  149. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.m +32 -0
  150. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.h +29 -0
  151. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.m +227 -0
  152. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDFileAttributeHelper.h +19 -0
  153. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDFileAttributeHelper.m +127 -0
  154. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.h +23 -0
  155. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.m +164 -0
  156. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageCachesManagerOperation.h +21 -0
  157. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageCachesManagerOperation.m +83 -0
  158. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageIOAnimatedCoderInternal.h +39 -0
  159. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDInternalMacros.h +122 -0
  160. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDInternalMacros.m +13 -0
  161. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWeakProxy.h +20 -0
  162. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWeakProxy.m +79 -0
  163. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWebImageTransitionInternal.h +19 -0
  164. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDmetamacros.h +667 -0
  165. package/example/ios/Pods/SDWebImage/SDWebImage/Private/UIColor+SDHexString.h +18 -0
  166. package/example/ios/Pods/SDWebImage/SDWebImage/Private/UIColor+SDHexString.m +42 -0
  167. package/example/ios/Pods/SDWebImage/WebImage/SDWebImage.h +89 -0
  168. package/example/ios/Pods/SDWebImageSwiftUI/LICENSE +19 -0
  169. package/example/ios/Pods/SDWebImageSwiftUI/README.md +690 -0
  170. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/AnimatedImage.swift +870 -0
  171. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/Backport.swift +59 -0
  172. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/OnChange.swift +52 -0
  173. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/Overlay.swift +124 -0
  174. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/StateObject.swift +151 -0
  175. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Image.swift +78 -0
  176. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImageManager.swift +132 -0
  177. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImagePlayer.swift +122 -0
  178. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImageViewWrapper.swift +133 -0
  179. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/ActivityIndicator.swift +82 -0
  180. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/Indicator.swift +97 -0
  181. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/ProgressIndicator.swift +114 -0
  182. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/SDWebImageSwiftUI.swift +64 -0
  183. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/SwiftUICompatibility.swift +92 -0
  184. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Transition/Transition.swift +93 -0
  185. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/WebImage.swift +509 -0
  186. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Module/SDWebImageSwiftUI.h +15 -0
  187. package/example/ios/Pods/SkeletonUI/LICENSE +21 -0
  188. package/example/ios/Pods/SkeletonUI/README.md +137 -0
  189. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Angle/AngleInteractor.swift +29 -0
  190. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Angle/AnglePresenter.swift +7 -0
  191. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Animation/AnimationInteractor.swift +56 -0
  192. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Appearance/AppearanceInteractor.swift +58 -0
  193. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Appearance/AppearancePresenter.swift +5 -0
  194. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/ClosedRange+Normalize.swift +16 -0
  195. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Image+OptionalType.swift +102 -0
  196. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/ModifiedContent+SkeletonModifier.swift +26 -0
  197. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Optional+OptionalType.swift +5 -0
  198. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/SecureField+OptionalType.swift +19 -0
  199. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Text+OptionalType.swift +27 -0
  200. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/TextField+OptionalType.swift +35 -0
  201. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Toggle+OptionalType.swift +29 -0
  202. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/UnitPoint+Angle.swift +8 -0
  203. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/View+SkeletonModifier.swift +8 -0
  204. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Modifiers/SkeletonModifier.swift +52 -0
  205. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Multiline/MultilineInteractor.swift +41 -0
  206. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Multiline/MultilinePresenter.swift +9 -0
  207. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Opacity/OpacityInteractor.swift +29 -0
  208. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Opacity/OpacityPresenter.swift +7 -0
  209. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Position/PositionInteractor.swift +29 -0
  210. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Position/PositionPresenter.swift +7 -0
  211. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Protocols/OptionalType.swift +4 -0
  212. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Radius/RadiusInteractor.swift +29 -0
  213. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Radius/RadiusPresenter.swift +7 -0
  214. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Shape/ShapeInteractor.swift +33 -0
  215. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Shape/ShapePresenter.swift +5 -0
  216. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonForEach.swift +20 -0
  217. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonInteractor.swift +27 -0
  218. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonList.swift +20 -0
  219. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonPresenter.swift +15 -0
  220. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonShape.swift +64 -0
  221. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonView.swift +25 -0
  222. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.debug.xcconfig +4 -1
  223. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.release.xcconfig +4 -1
  224. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown +72 -0
  225. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist +90 -0
  226. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig +6 -5
  227. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig +6 -5
  228. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m +5 -0
  229. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch +12 -0
  230. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h +75 -0
  231. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.debug.xcconfig +14 -0
  232. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap +6 -0
  233. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.release.xcconfig +14 -0
  234. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-dummy.m +5 -0
  235. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-prefix.pch +12 -0
  236. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-umbrella.h +17 -0
  237. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.debug.xcconfig +17 -0
  238. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.modulemap +6 -0
  239. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.release.xcconfig +17 -0
  240. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-dummy.m +5 -0
  241. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-prefix.pch +12 -0
  242. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-umbrella.h +16 -0
  243. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.debug.xcconfig +12 -0
  244. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.modulemap +6 -0
  245. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.release.xcconfig +12 -0
  246. package/ios/Checkbox/Checkbox.swift +38 -0
  247. package/ios/{Colors+Spacing → Colors+Radius+Spacing}/Colors.swift +0 -0
  248. package/ios/Colors+Radius+Spacing/Radius.swift +22 -0
  249. package/ios/{Colors+Spacing → Colors+Radius+Spacing}/Spacing.swift +0 -0
  250. package/ios/Extensions/View++.swift +9 -0
  251. package/ios/Image/Image.swift +60 -0
  252. package/ios/Input/Input.swift +88 -38
  253. package/ios/OTPKeyboard/OTPKeyboard.swift +1 -1
  254. package/ios/Popup/PopupDisplay.swift +178 -0
  255. package/ios/PopupView/FullscreenPopup.swift +251 -0
  256. package/ios/{Popup → PopupView}/Modifiers.swift +6 -20
  257. package/ios/{Popup → PopupView}/PopupView.swift +38 -146
  258. package/ios/PopupView/Utils++.swift +281 -0
  259. package/ios/Switch/Switch.swift +44 -0
  260. package/ios/native-kits.podspec +2 -0
  261. package/package.json +1 -1
  262. package/ios/Colors+Spacing/Radius.swift +0 -11
  263. package/ios/Popup/Utils++.swift +0 -163
@@ -0,0 +1,722 @@
1
+ /*
2
+ * This file is part of the SDWebImage package.
3
+ * (c) Olivier Poitrey <rs@dailymotion.com>
4
+ *
5
+ * For the full copyright and license information, please view the LICENSE
6
+ * file that was distributed with this source code.
7
+ */
8
+
9
+ #import "SDWebImageDownloaderOperation.h"
10
+ #import "SDWebImageError.h"
11
+ #import "SDInternalMacros.h"
12
+ #import "SDWebImageDownloaderResponseModifier.h"
13
+ #import "SDWebImageDownloaderDecryptor.h"
14
+ #import "SDImageCacheDefine.h"
15
+
16
+ // A handler to represent individual request
17
+ @interface SDWebImageDownloaderOperationToken : NSObject
18
+
19
+ @property (nonatomic, copy, nullable) SDWebImageDownloaderCompletedBlock completedBlock;
20
+ @property (nonatomic, copy, nullable) SDWebImageDownloaderProgressBlock progressBlock;
21
+ @property (nonatomic, copy, nullable) SDImageCoderOptions *decodeOptions;
22
+
23
+ @end
24
+
25
+ @implementation SDWebImageDownloaderOperationToken
26
+
27
+ - (BOOL)isEqual:(id)other {
28
+ if (nil == other) {
29
+ return NO;
30
+ }
31
+ if (self == other) {
32
+ return YES;
33
+ }
34
+ if (![other isKindOfClass:[self class]]) {
35
+ return NO;
36
+ }
37
+ SDWebImageDownloaderOperationToken *object = (SDWebImageDownloaderOperationToken *)other;
38
+ // warn: only compare decodeOptions, ignore pointer, use `removeObjectIdenticalTo`
39
+ BOOL result = [self.decodeOptions isEqualToDictionary:object.decodeOptions];
40
+ return result;
41
+ }
42
+
43
+ @end
44
+
45
+ @interface SDWebImageDownloaderOperation ()
46
+
47
+ @property (strong, nonatomic, nonnull) NSMutableArray<SDWebImageDownloaderOperationToken *> *callbackTokens;
48
+
49
+ @property (assign, nonatomic, readwrite) SDWebImageDownloaderOptions options;
50
+ @property (copy, nonatomic, readwrite, nullable) SDWebImageContext *context;
51
+
52
+ @property (assign, nonatomic, getter = isExecuting) BOOL executing;
53
+ @property (assign, nonatomic, getter = isFinished) BOOL finished;
54
+ @property (strong, nonatomic, nullable) NSMutableData *imageData;
55
+ @property (copy, nonatomic, nullable) NSData *cachedData; // for `SDWebImageDownloaderIgnoreCachedResponse`
56
+ @property (assign, nonatomic) NSUInteger expectedSize; // may be 0
57
+ @property (assign, nonatomic) NSUInteger receivedSize;
58
+ @property (strong, nonatomic, nullable, readwrite) NSURLResponse *response;
59
+ @property (strong, nonatomic, nullable) NSError *responseError;
60
+ @property (assign, nonatomic) double previousProgress; // previous progress percent
61
+
62
+ @property (strong, nonatomic, nullable) id<SDWebImageDownloaderResponseModifier> responseModifier; // modify original URLResponse
63
+ @property (strong, nonatomic, nullable) id<SDWebImageDownloaderDecryptor> decryptor; // decrypt image data
64
+
65
+ // This is weak because it is injected by whoever manages this session. If this gets nil-ed out, we won't be able to run
66
+ // the task associated with this operation
67
+ @property (weak, nonatomic, nullable) NSURLSession *unownedSession;
68
+ // This is set if we're using not using an injected NSURLSession. We're responsible of invalidating this one
69
+ @property (strong, nonatomic, nullable) NSURLSession *ownedSession;
70
+
71
+ @property (strong, nonatomic, readwrite, nullable) NSURLSessionTask *dataTask;
72
+
73
+ @property (strong, nonatomic, readwrite, nullable) NSURLSessionTaskMetrics *metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0));
74
+
75
+ @property (strong, nonatomic, nonnull) NSOperationQueue *coderQueue; // the serial operation queue to do image decoding
76
+
77
+ @property (strong, nonatomic, nonnull) NSMapTable<SDImageCoderOptions *, UIImage *> *imageMap; // each variant of image is weak-referenced to avoid too many re-decode during downloading
78
+ #if SD_UIKIT
79
+ @property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundTaskId;
80
+ #endif
81
+
82
+ @end
83
+
84
+ @implementation SDWebImageDownloaderOperation
85
+
86
+ @synthesize executing = _executing;
87
+ @synthesize finished = _finished;
88
+
89
+ - (nonnull instancetype)init {
90
+ return [self initWithRequest:nil inSession:nil options:0];
91
+ }
92
+
93
+ - (instancetype)initWithRequest:(NSURLRequest *)request inSession:(NSURLSession *)session options:(SDWebImageDownloaderOptions)options {
94
+ return [self initWithRequest:request inSession:session options:options context:nil];
95
+ }
96
+
97
+ - (nonnull instancetype)initWithRequest:(nullable NSURLRequest *)request
98
+ inSession:(nullable NSURLSession *)session
99
+ options:(SDWebImageDownloaderOptions)options
100
+ context:(nullable SDWebImageContext *)context {
101
+ if ((self = [super init])) {
102
+ _request = [request copy];
103
+ _options = options;
104
+ _context = [context copy];
105
+ _callbackTokens = [NSMutableArray new];
106
+ _responseModifier = context[SDWebImageContextDownloadResponseModifier];
107
+ _decryptor = context[SDWebImageContextDownloadDecryptor];
108
+ _executing = NO;
109
+ _finished = NO;
110
+ _expectedSize = 0;
111
+ _unownedSession = session;
112
+ _coderQueue = [NSOperationQueue new];
113
+ _coderQueue.maxConcurrentOperationCount = 1;
114
+ _imageMap = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsStrongMemory valueOptions:NSPointerFunctionsWeakMemory capacity:1];
115
+ #if SD_UIKIT
116
+ _backgroundTaskId = UIBackgroundTaskInvalid;
117
+ #endif
118
+ }
119
+ return self;
120
+ }
121
+
122
+ - (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock
123
+ completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock {
124
+ return [self addHandlersForProgress:progressBlock completed:completedBlock decodeOptions:nil];
125
+ }
126
+
127
+ - (nullable id)addHandlersForProgress:(nullable SDWebImageDownloaderProgressBlock)progressBlock
128
+ completed:(nullable SDWebImageDownloaderCompletedBlock)completedBlock
129
+ decodeOptions:(nullable SDImageCoderOptions *)decodeOptions {
130
+ if (!completedBlock && !progressBlock && !decodeOptions) return nil;
131
+ SDWebImageDownloaderOperationToken *token = [SDWebImageDownloaderOperationToken new];
132
+ token.completedBlock = completedBlock;
133
+ token.progressBlock = progressBlock;
134
+ token.decodeOptions = decodeOptions;
135
+ @synchronized (self) {
136
+ [self.callbackTokens addObject:token];
137
+ }
138
+
139
+ return token;
140
+ }
141
+
142
+ - (BOOL)cancel:(nullable id)token {
143
+ if (![token isKindOfClass:SDWebImageDownloaderOperationToken.class]) return NO;
144
+
145
+ BOOL shouldCancel = NO;
146
+ @synchronized (self) {
147
+ NSArray *tokens = self.callbackTokens;
148
+ if (tokens.count == 1 && [tokens indexOfObjectIdenticalTo:token] != NSNotFound) {
149
+ shouldCancel = YES;
150
+ }
151
+ }
152
+ if (shouldCancel) {
153
+ // Cancel operation running and callback last token's completion block
154
+ [self cancel];
155
+ } else {
156
+ // Only callback this token's completion block
157
+ @synchronized (self) {
158
+ [self.callbackTokens removeObjectIdenticalTo:token];
159
+ }
160
+ SDWebImageDownloaderCompletedBlock completedBlock = ((SDWebImageDownloaderOperationToken *)token).completedBlock;
161
+ if (completedBlock) {
162
+ dispatch_main_async_safe(^{
163
+ completedBlock(nil, nil, [NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:@{NSLocalizedDescriptionKey : @"Operation cancelled by user during sending the request"}], YES);
164
+ });
165
+ }
166
+ }
167
+ return shouldCancel;
168
+ }
169
+
170
+ - (void)start {
171
+ @synchronized (self) {
172
+ if (self.isCancelled) {
173
+ if (!self.isFinished) self.finished = YES;
174
+ // Operation cancelled by user before sending the request
175
+ [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:@{NSLocalizedDescriptionKey : @"Operation cancelled by user before sending the request"}]];
176
+ [self reset];
177
+ return;
178
+ }
179
+
180
+ #if SD_UIKIT
181
+ Class UIApplicationClass = NSClassFromString(@"UIApplication");
182
+ BOOL hasApplication = UIApplicationClass && [UIApplicationClass respondsToSelector:@selector(sharedApplication)];
183
+ if (hasApplication && [self shouldContinueWhenAppEntersBackground]) {
184
+ __weak typeof(self) wself = self;
185
+ UIApplication * app = [UIApplicationClass performSelector:@selector(sharedApplication)];
186
+ self.backgroundTaskId = [app beginBackgroundTaskWithExpirationHandler:^{
187
+ [wself cancel];
188
+ }];
189
+ }
190
+ #endif
191
+ NSURLSession *session = self.unownedSession;
192
+ if (!session) {
193
+ NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
194
+ sessionConfig.timeoutIntervalForRequest = 15;
195
+
196
+ /**
197
+ * Create the session for this task
198
+ * We send nil as delegate queue so that the session creates a serial operation queue for performing all delegate
199
+ * method calls and completion handler calls.
200
+ */
201
+ session = [NSURLSession sessionWithConfiguration:sessionConfig
202
+ delegate:self
203
+ delegateQueue:nil];
204
+ self.ownedSession = session;
205
+ }
206
+
207
+ if (self.options & SDWebImageDownloaderIgnoreCachedResponse) {
208
+ // Grab the cached data for later check
209
+ NSURLCache *URLCache = session.configuration.URLCache;
210
+ if (!URLCache) {
211
+ URLCache = [NSURLCache sharedURLCache];
212
+ }
213
+ NSCachedURLResponse *cachedResponse;
214
+ // NSURLCache's `cachedResponseForRequest:` is not thread-safe, see https://developer.apple.com/documentation/foundation/nsurlcache#2317483
215
+ @synchronized (URLCache) {
216
+ cachedResponse = [URLCache cachedResponseForRequest:self.request];
217
+ }
218
+ if (cachedResponse) {
219
+ self.cachedData = cachedResponse.data;
220
+ self.response = cachedResponse.response;
221
+ }
222
+ }
223
+
224
+ if (!session.delegate) {
225
+ // Session been invalid and has no delegate at all
226
+ [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorInvalidDownloadOperation userInfo:@{NSLocalizedDescriptionKey : @"Session delegate is nil and invalid"}]];
227
+ [self reset];
228
+ return;
229
+ }
230
+
231
+ self.dataTask = [session dataTaskWithRequest:self.request];
232
+ self.executing = YES;
233
+ }
234
+
235
+ if (self.dataTask) {
236
+ if (self.options & SDWebImageDownloaderHighPriority) {
237
+ self.dataTask.priority = NSURLSessionTaskPriorityHigh;
238
+ self.coderQueue.qualityOfService = NSQualityOfServiceUserInteractive;
239
+ } else if (self.options & SDWebImageDownloaderLowPriority) {
240
+ self.dataTask.priority = NSURLSessionTaskPriorityLow;
241
+ self.coderQueue.qualityOfService = NSQualityOfServiceBackground;
242
+ } else {
243
+ self.dataTask.priority = NSURLSessionTaskPriorityDefault;
244
+ self.coderQueue.qualityOfService = NSQualityOfServiceDefault;
245
+ }
246
+ [self.dataTask resume];
247
+ NSArray<SDWebImageDownloaderOperationToken *> *tokens;
248
+ @synchronized (self) {
249
+ tokens = [self.callbackTokens copy];
250
+ }
251
+ for (SDWebImageDownloaderOperationToken *token in tokens) {
252
+ if (token.progressBlock) {
253
+ token.progressBlock(0, NSURLResponseUnknownLength, self.request.URL);
254
+ }
255
+ }
256
+ __block typeof(self) strongSelf = self;
257
+ dispatch_async(dispatch_get_main_queue(), ^{
258
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStartNotification object:strongSelf];
259
+ });
260
+ } else {
261
+ if (!self.isFinished) self.finished = YES;
262
+ [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorInvalidDownloadOperation userInfo:@{NSLocalizedDescriptionKey : @"Task can't be initialized"}]];
263
+ [self reset];
264
+ }
265
+ }
266
+
267
+ - (void)cancel {
268
+ @synchronized (self) {
269
+ [self cancelInternal];
270
+ }
271
+ }
272
+
273
+ - (void)cancelInternal {
274
+ if (self.isFinished) return;
275
+ [super cancel];
276
+
277
+ __block typeof(self) strongSelf = self;
278
+ dispatch_async(dispatch_get_main_queue(), ^{
279
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:strongSelf];
280
+ });
281
+
282
+ if (self.dataTask) {
283
+ // Cancel the URLSession, `URLSession:task:didCompleteWithError:` delegate callback will be ignored
284
+ [self.dataTask cancel];
285
+ self.dataTask = nil;
286
+ }
287
+
288
+ // NSOperation disallow setFinished=YES **before** operation's start method been called
289
+ // We check for the initialized status, which is isExecuting == NO && isFinished = NO
290
+ // Ony update for non-intialized status, which is !(isExecuting == NO && isFinished = NO), or if (self.isExecuting || self.isFinished) {...}
291
+ if (self.isExecuting || self.isFinished) {
292
+ if (self.isExecuting) self.executing = NO;
293
+ if (!self.isFinished) self.finished = YES;
294
+ }
295
+
296
+ // Operation cancelled by user during sending the request
297
+ [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorCancelled userInfo:@{NSLocalizedDescriptionKey : @"Operation cancelled by user during sending the request"}]];
298
+
299
+ [self reset];
300
+ }
301
+
302
+ - (void)done {
303
+ self.finished = YES;
304
+ self.executing = NO;
305
+ [self reset];
306
+ }
307
+
308
+ - (void)reset {
309
+ @synchronized (self) {
310
+ [self.callbackTokens removeAllObjects];
311
+ self.dataTask = nil;
312
+
313
+ if (self.ownedSession) {
314
+ [self.ownedSession invalidateAndCancel];
315
+ self.ownedSession = nil;
316
+ }
317
+
318
+ #if SD_UIKIT
319
+ if (self.backgroundTaskId != UIBackgroundTaskInvalid) {
320
+ // If backgroundTaskId != UIBackgroundTaskInvalid, sharedApplication is always exist
321
+ UIApplication * app = [UIApplication performSelector:@selector(sharedApplication)];
322
+ [app endBackgroundTask:self.backgroundTaskId];
323
+ self.backgroundTaskId = UIBackgroundTaskInvalid;
324
+ }
325
+ #endif
326
+ }
327
+ }
328
+
329
+ - (void)setFinished:(BOOL)finished {
330
+ [self willChangeValueForKey:@"isFinished"];
331
+ _finished = finished;
332
+ [self didChangeValueForKey:@"isFinished"];
333
+ }
334
+
335
+ - (void)setExecuting:(BOOL)executing {
336
+ [self willChangeValueForKey:@"isExecuting"];
337
+ _executing = executing;
338
+ [self didChangeValueForKey:@"isExecuting"];
339
+ }
340
+
341
+ - (BOOL)isConcurrent {
342
+ return YES;
343
+ }
344
+
345
+ #pragma mark NSURLSessionDataDelegate
346
+
347
+ - (void)URLSession:(NSURLSession *)session
348
+ dataTask:(NSURLSessionDataTask *)dataTask
349
+ didReceiveResponse:(NSURLResponse *)response
350
+ completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler {
351
+ NSURLSessionResponseDisposition disposition = NSURLSessionResponseAllow;
352
+
353
+ // Check response modifier, if return nil, will marked as cancelled.
354
+ BOOL valid = YES;
355
+ if (self.responseModifier && response) {
356
+ response = [self.responseModifier modifiedResponseWithResponse:response];
357
+ if (!response) {
358
+ valid = NO;
359
+ self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain
360
+ code:SDWebImageErrorInvalidDownloadResponse
361
+ userInfo:@{NSLocalizedDescriptionKey : @"Download marked as failed because response is nil"}];
362
+ }
363
+ }
364
+
365
+ NSInteger expected = (NSInteger)response.expectedContentLength;
366
+ expected = expected > 0 ? expected : 0;
367
+ self.expectedSize = expected;
368
+ self.response = response;
369
+
370
+ // Check status code valid (defaults [200,400))
371
+ NSInteger statusCode = [response isKindOfClass:NSHTTPURLResponse.class] ? ((NSHTTPURLResponse *)response).statusCode : 0;
372
+ BOOL statusCodeValid = YES;
373
+ if (valid && statusCode > 0 && self.acceptableStatusCodes) {
374
+ statusCodeValid = [self.acceptableStatusCodes containsIndex:statusCode];
375
+ }
376
+ if (!statusCodeValid) {
377
+ valid = NO;
378
+ self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain
379
+ code:SDWebImageErrorInvalidDownloadStatusCode
380
+ userInfo:@{NSLocalizedDescriptionKey : [NSString stringWithFormat:@"Download marked as failed because of invalid response status code %ld", (long)statusCode],
381
+ SDWebImageErrorDownloadStatusCodeKey : @(statusCode),
382
+ SDWebImageErrorDownloadResponseKey : response}];
383
+ }
384
+ // Check content type valid (defaults nil)
385
+ NSString *contentType = [response isKindOfClass:NSHTTPURLResponse.class] ? ((NSHTTPURLResponse *)response).MIMEType : nil;
386
+ BOOL contentTypeValid = YES;
387
+ if (valid && contentType.length > 0 && self.acceptableContentTypes) {
388
+ contentTypeValid = [self.acceptableContentTypes containsObject:contentType];
389
+ }
390
+ if (!contentTypeValid) {
391
+ valid = NO;
392
+ self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain
393
+ code:SDWebImageErrorInvalidDownloadContentType
394
+ userInfo:@{NSLocalizedDescriptionKey : [NSString stringWithFormat:@"Download marked as failed because of invalid response content type %@", contentType],
395
+ SDWebImageErrorDownloadContentTypeKey : contentType,
396
+ SDWebImageErrorDownloadResponseKey : response}];
397
+ }
398
+ //'304 Not Modified' is an exceptional one
399
+ //URLSession current behavior will return 200 status code when the server respond 304 and URLCache hit. But this is not a standard behavior and we just add a check
400
+ if (valid && statusCode == 304 && !self.cachedData) {
401
+ valid = NO;
402
+ self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain
403
+ code:SDWebImageErrorCacheNotModified
404
+ userInfo:@{NSLocalizedDescriptionKey: @"Download response status code is 304 not modified and ignored",
405
+ SDWebImageErrorDownloadResponseKey : response}];
406
+ }
407
+
408
+ if (valid) {
409
+ NSArray<SDWebImageDownloaderOperationToken *> *tokens;
410
+ @synchronized (self) {
411
+ tokens = [self.callbackTokens copy];
412
+ }
413
+ for (SDWebImageDownloaderOperationToken *token in tokens) {
414
+ if (token.progressBlock) {
415
+ token.progressBlock(0, expected, self.request.URL);
416
+ }
417
+ }
418
+ } else {
419
+ // Status code invalid and marked as cancelled. Do not call `[self.dataTask cancel]` which may mass up URLSession life cycle
420
+ disposition = NSURLSessionResponseCancel;
421
+ }
422
+ __block typeof(self) strongSelf = self;
423
+ dispatch_async(dispatch_get_main_queue(), ^{
424
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadReceiveResponseNotification object:strongSelf];
425
+ });
426
+
427
+ if (completionHandler) {
428
+ completionHandler(disposition);
429
+ }
430
+ }
431
+
432
+ - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data {
433
+ if (!self.imageData) {
434
+ self.imageData = [[NSMutableData alloc] initWithCapacity:self.expectedSize];
435
+ }
436
+ [self.imageData appendData:data];
437
+
438
+ self.receivedSize = self.imageData.length;
439
+ NSArray<SDWebImageDownloaderOperationToken *> *tokens;
440
+ @synchronized (self) {
441
+ tokens = [self.callbackTokens copy];
442
+ }
443
+ if (self.expectedSize == 0) {
444
+ // Unknown expectedSize, immediately call progressBlock and return
445
+ for (SDWebImageDownloaderOperationToken *token in tokens) {
446
+ if (token.progressBlock) {
447
+ token.progressBlock(self.receivedSize, self.expectedSize, self.request.URL);
448
+ }
449
+ }
450
+ return;
451
+ }
452
+
453
+ // Get the finish status
454
+ BOOL finished = (self.receivedSize >= self.expectedSize);
455
+ // Get the current progress
456
+ double currentProgress = (double)self.receivedSize / (double)self.expectedSize;
457
+ double previousProgress = self.previousProgress;
458
+ double progressInterval = currentProgress - previousProgress;
459
+ // Check if we need callback progress
460
+ if (!finished && (progressInterval < self.minimumProgressInterval)) {
461
+ return;
462
+ }
463
+ self.previousProgress = currentProgress;
464
+
465
+ // Using data decryptor will disable the progressive decoding, since there are no support for progressive decrypt
466
+ BOOL supportProgressive = (self.options & SDWebImageDownloaderProgressiveLoad) && !self.decryptor;
467
+ // When multiple thumbnail decoding use different size, this progressive decoding will cause issue because each callback assume called with different size's image, can not share the same decoding part
468
+ // We currently only pick the first thumbnail size, see #3423 talks
469
+ // Progressive decoding Only decode partial image, full image in `URLSession:task:didCompleteWithError:`
470
+ if (supportProgressive && !finished) {
471
+ // Get the image data
472
+ NSData *imageData = self.imageData;
473
+
474
+ // keep maximum one progressive decode process during download
475
+ if (self.coderQueue.operationCount == 0) {
476
+ // NSOperation have autoreleasepool, don't need to create extra one
477
+ @weakify(self);
478
+ NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
479
+ @strongify(self);
480
+ if (!self) {
481
+ return;
482
+ }
483
+ UIImage *image = SDImageLoaderDecodeProgressiveImageData(imageData, self.request.URL, NO, self, [[self class] imageOptionsFromDownloaderOptions:self.options], self.context);
484
+ if (self.isFinished) {
485
+ return;
486
+ }
487
+ if (image) {
488
+ // We do not keep the progressive decoding image even when `finished`=YES. Because they are for view rendering but not take full function from downloader options. And some coders implementation may not keep consistent between progressive decoding and normal decoding.
489
+
490
+ [self callCompletionBlocksWithImage:image imageData:nil error:nil finished:NO];
491
+ }
492
+ }];
493
+ [self.coderQueue addOperation:operation];
494
+ }
495
+ }
496
+
497
+ for (SDWebImageDownloaderOperationToken *token in tokens) {
498
+ if (token.progressBlock) {
499
+ token.progressBlock(self.receivedSize, self.expectedSize, self.request.URL);
500
+ }
501
+ }
502
+ }
503
+
504
+ - (void)URLSession:(NSURLSession *)session
505
+ dataTask:(NSURLSessionDataTask *)dataTask
506
+ willCacheResponse:(NSCachedURLResponse *)proposedResponse
507
+ completionHandler:(void (^)(NSCachedURLResponse *cachedResponse))completionHandler {
508
+
509
+ NSCachedURLResponse *cachedResponse = proposedResponse;
510
+
511
+ if (!(self.options & SDWebImageDownloaderUseNSURLCache)) {
512
+ // Prevents caching of responses
513
+ cachedResponse = nil;
514
+ }
515
+ if (completionHandler) {
516
+ completionHandler(cachedResponse);
517
+ }
518
+ }
519
+
520
+ #pragma mark NSURLSessionTaskDelegate
521
+
522
+ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
523
+ // If we already cancel the operation or anything mark the operation finished, don't callback twice
524
+ if (self.isFinished) return;
525
+
526
+ NSArray<SDWebImageDownloaderOperationToken *> *tokens;
527
+ @synchronized (self) {
528
+ tokens = [self.callbackTokens copy];
529
+ self.dataTask = nil;
530
+ __block typeof(self) strongSelf = self;
531
+ dispatch_async(dispatch_get_main_queue(), ^{
532
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadStopNotification object:strongSelf];
533
+ if (!error) {
534
+ [[NSNotificationCenter defaultCenter] postNotificationName:SDWebImageDownloadFinishNotification object:strongSelf];
535
+ }
536
+ });
537
+ }
538
+
539
+ // make sure to call `[self done]` to mark operation as finished
540
+ if (error) {
541
+ // custom error instead of URLSession error
542
+ if (self.responseError) {
543
+ error = self.responseError;
544
+ }
545
+ [self callCompletionBlocksWithError:error];
546
+ [self done];
547
+ } else {
548
+ if (tokens.count > 0) {
549
+ NSData *imageData = self.imageData;
550
+ self.imageData = nil;
551
+ // data decryptor
552
+ if (imageData && self.decryptor) {
553
+ imageData = [self.decryptor decryptedDataWithData:imageData response:self.response];
554
+ }
555
+ if (imageData) {
556
+ /** if you specified to only use cached data via `SDWebImageDownloaderIgnoreCachedResponse`,
557
+ * then we should check if the cached data is equal to image data
558
+ */
559
+ if (self.options & SDWebImageDownloaderIgnoreCachedResponse && [self.cachedData isEqualToData:imageData]) {
560
+ self.responseError = [NSError errorWithDomain:SDWebImageErrorDomain
561
+ code:SDWebImageErrorCacheNotModified
562
+ userInfo:@{NSLocalizedDescriptionKey : @"Downloaded image is not modified and ignored",
563
+ SDWebImageErrorDownloadResponseKey : self.response}];
564
+ // call completion block with not modified error
565
+ [self callCompletionBlocksWithError:self.responseError];
566
+ [self done];
567
+ } else {
568
+ // decode the image in coder queue, cancel all previous decoding process
569
+ [self.coderQueue cancelAllOperations];
570
+ @weakify(self);
571
+ // call done after all different variant completed block was dispatched
572
+ NSOperation *doneOperation = [NSBlockOperation blockOperationWithBlock:^{
573
+ @strongify(self);
574
+ if (!self) {
575
+ return;
576
+ }
577
+ [self done];
578
+ }];
579
+ for (SDWebImageDownloaderOperationToken *token in tokens) {
580
+ NSOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
581
+ @strongify(self);
582
+ if (!self) {
583
+ return;
584
+ }
585
+ UIImage *image;
586
+ // check if we already decode this variant of image for current callback
587
+ if (token.decodeOptions) {
588
+ image = [self.imageMap objectForKey:token.decodeOptions];
589
+ }
590
+ if (!image) {
591
+ // check if we already use progressive decoding, use that to produce faster decoding
592
+ id<SDProgressiveImageCoder> progressiveCoder = SDImageLoaderGetProgressiveCoder(self);
593
+ SDWebImageOptions options = [[self class] imageOptionsFromDownloaderOptions:self.options];
594
+ SDWebImageContext *context;
595
+ if (token.decodeOptions) {
596
+ SDWebImageMutableContext *mutableContext = [NSMutableDictionary dictionaryWithDictionary:self.context];
597
+ SDSetDecodeOptionsToContext(mutableContext, &options, token.decodeOptions);
598
+ context = [mutableContext copy];
599
+ } else {
600
+ context = self.context;
601
+ }
602
+ if (progressiveCoder) {
603
+ image = SDImageLoaderDecodeProgressiveImageData(imageData, self.request.URL, YES, self, options, context);
604
+ } else {
605
+ image = SDImageLoaderDecodeImageData(imageData, self.request.URL, options, context);
606
+ }
607
+ if (image && token.decodeOptions) {
608
+ [self.imageMap setObject:image forKey:token.decodeOptions];
609
+ }
610
+ }
611
+ CGSize imageSize = image.size;
612
+ if (imageSize.width == 0 || imageSize.height == 0) {
613
+ NSString *description = image == nil ? @"Downloaded image decode failed" : @"Downloaded image has 0 pixels";
614
+ [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorBadImageData userInfo:@{NSLocalizedDescriptionKey : description}]];
615
+ } else {
616
+ [self callCompletionBlockWithToken:token image:image imageData:imageData error:nil finished:YES];
617
+ }
618
+ }];
619
+ [doneOperation addDependency:operation];
620
+ [self.coderQueue addOperation:operation];
621
+ }
622
+ // call [self done] after all completed block was dispatched
623
+ [self.coderQueue addOperation:doneOperation];
624
+ }
625
+ } else {
626
+ [self callCompletionBlocksWithError:[NSError errorWithDomain:SDWebImageErrorDomain code:SDWebImageErrorBadImageData userInfo:@{NSLocalizedDescriptionKey : @"Image data is nil"}]];
627
+ [self done];
628
+ }
629
+ } else {
630
+ [self done];
631
+ }
632
+ }
633
+ }
634
+
635
+ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler {
636
+
637
+ NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;
638
+ __block NSURLCredential *credential = nil;
639
+
640
+ if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
641
+ if (!(self.options & SDWebImageDownloaderAllowInvalidSSLCertificates)) {
642
+ disposition = NSURLSessionAuthChallengePerformDefaultHandling;
643
+ } else {
644
+ credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
645
+ disposition = NSURLSessionAuthChallengeUseCredential;
646
+ }
647
+ } else {
648
+ if (challenge.previousFailureCount == 0) {
649
+ if (self.credential) {
650
+ credential = self.credential;
651
+ disposition = NSURLSessionAuthChallengeUseCredential;
652
+ } else {
653
+ // Web Server like Nginx can set `ssl_verify_client` to optional but not always on
654
+ // We'd better use default handling here
655
+ disposition = NSURLSessionAuthChallengePerformDefaultHandling;
656
+ }
657
+ } else {
658
+ disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;
659
+ }
660
+ }
661
+
662
+ if (completionHandler) {
663
+ completionHandler(disposition, credential);
664
+ }
665
+ }
666
+
667
+ - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didFinishCollectingMetrics:(NSURLSessionTaskMetrics *)metrics API_AVAILABLE(macosx(10.12), ios(10.0), watchos(3.0), tvos(10.0)) {
668
+ self.metrics = metrics;
669
+ }
670
+
671
+ #pragma mark Helper methods
672
+ + (SDWebImageOptions)imageOptionsFromDownloaderOptions:(SDWebImageDownloaderOptions)downloadOptions {
673
+ SDWebImageOptions options = 0;
674
+ if (downloadOptions & SDWebImageDownloaderScaleDownLargeImages) options |= SDWebImageScaleDownLargeImages;
675
+ if (downloadOptions & SDWebImageDownloaderDecodeFirstFrameOnly) options |= SDWebImageDecodeFirstFrameOnly;
676
+ if (downloadOptions & SDWebImageDownloaderPreloadAllFrames) options |= SDWebImagePreloadAllFrames;
677
+ if (downloadOptions & SDWebImageDownloaderAvoidDecodeImage) options |= SDWebImageAvoidDecodeImage;
678
+ if (downloadOptions & SDWebImageDownloaderMatchAnimatedImageClass) options |= SDWebImageMatchAnimatedImageClass;
679
+
680
+ return options;
681
+ }
682
+
683
+ - (BOOL)shouldContinueWhenAppEntersBackground {
684
+ return SD_OPTIONS_CONTAINS(self.options, SDWebImageDownloaderContinueInBackground);
685
+ }
686
+
687
+ - (void)callCompletionBlocksWithError:(nullable NSError *)error {
688
+ [self callCompletionBlocksWithImage:nil imageData:nil error:error finished:YES];
689
+ }
690
+
691
+ - (void)callCompletionBlocksWithImage:(nullable UIImage *)image
692
+ imageData:(nullable NSData *)imageData
693
+ error:(nullable NSError *)error
694
+ finished:(BOOL)finished {
695
+ NSArray<SDWebImageDownloaderOperationToken *> *tokens;
696
+ @synchronized (self) {
697
+ tokens = [self.callbackTokens copy];
698
+ }
699
+ for (SDWebImageDownloaderOperationToken *token in tokens) {
700
+ SDWebImageDownloaderCompletedBlock completedBlock = token.completedBlock;
701
+ if (completedBlock) {
702
+ dispatch_main_async_safe(^{
703
+ completedBlock(image, imageData, error, finished);
704
+ });
705
+ }
706
+ }
707
+ }
708
+
709
+ - (void)callCompletionBlockWithToken:(nonnull SDWebImageDownloaderOperationToken *)token
710
+ image:(nullable UIImage *)image
711
+ imageData:(nullable NSData *)imageData
712
+ error:(nullable NSError *)error
713
+ finished:(BOOL)finished {
714
+ SDWebImageDownloaderCompletedBlock completedBlock = token.completedBlock;
715
+ if (completedBlock) {
716
+ dispatch_main_async_safe(^{
717
+ completedBlock(image, imageData, error, finished);
718
+ });
719
+ }
720
+ }
721
+
722
+ @end