@momo-kits/native-kits 0.0.1-beta.5 → 0.89.1-2

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 (406) hide show
  1. package/README.md +1 -0
  2. package/android/.gradle/8.0/checksums/checksums.lock +0 -0
  3. package/android/.gradle/8.0/dependencies-accessors/dependencies-accessors.lock +0 -0
  4. package/android/.gradle/8.0/dependencies-accessors/gc.properties +0 -0
  5. package/android/.gradle/8.0/fileChanges/last-build.bin +0 -0
  6. package/android/.gradle/8.0/fileHashes/fileHashes.lock +0 -0
  7. package/android/.gradle/8.0/gc.properties +0 -0
  8. package/android/.gradle/config.properties +2 -0
  9. package/android/.gradle/vcs-1/gc.properties +0 -0
  10. package/android/.idea/gradle.xml +12 -0
  11. package/android/.idea/migrations.xml +10 -0
  12. package/android/.idea/misc.xml +10 -0
  13. package/android/.idea/vcs.xml +6 -0
  14. package/android/.idea/workspace.xml +50 -0
  15. package/android/build.gradle +35 -69
  16. package/android/local.properties +8 -0
  17. package/android/proguard-rules.pro +21 -0
  18. package/android/src/main/AndroidManifest.xml +2 -2
  19. package/android/src/main/java/com/momoplatform/nativekits/foundations/Button.kt +16 -0
  20. package/android/src/main/java/com/momoplatform/nativekits/libs/Logo.kt +63 -0
  21. package/android/src/main/java/com/momoplatform/nativekits/libs/TrustBanner.kt +246 -0
  22. package/android/src/main/res/drawable/ic_launcher_background.xml +170 -0
  23. package/android/src/main/res/drawable-v24/ic_launcher_foreground.xml +30 -0
  24. package/android/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +6 -0
  25. package/android/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +6 -0
  26. package/android/src/main/res/mipmap-hdpi/ic_launcher.webp +0 -0
  27. package/android/src/main/res/mipmap-hdpi/ic_launcher_round.webp +0 -0
  28. package/android/src/main/res/mipmap-mdpi/ic_launcher.webp +0 -0
  29. package/android/src/main/res/mipmap-mdpi/ic_launcher_round.webp +0 -0
  30. package/android/src/main/res/mipmap-xhdpi/ic_launcher.webp +0 -0
  31. package/android/src/main/res/mipmap-xhdpi/ic_launcher_round.webp +0 -0
  32. package/android/src/main/res/mipmap-xxhdpi/ic_launcher.webp +0 -0
  33. package/android/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp +0 -0
  34. package/android/src/main/res/mipmap-xxxhdpi/ic_launcher.webp +0 -0
  35. package/android/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp +0 -0
  36. package/android/src/main/res/values/colors.xml +10 -0
  37. package/android/src/main/res/values/strings.xml +3 -0
  38. package/android/src/main/res/values/themes.xml +3 -0
  39. package/android/src/main/res/values-night/themes.xml +3 -0
  40. package/android/src/main/res/xml/backup_rules.xml +13 -0
  41. package/android/src/main/res/xml/data_extraction_rules.xml +19 -0
  42. package/build.gradle.kts +18 -0
  43. package/compose/build.gradle.kts +82 -0
  44. package/compose/src/androidMain/AndroidManifest.xml +2 -0
  45. package/compose/src/androidMain/kotlin/vn/momo/kits/utils/Platform.kt +3 -0
  46. package/compose/src/androidMain/kotlin/vn/momo/kits/utils/SetMaskFilter.kt +8 -0
  47. package/compose/src/androidMain/kotlin/vn/momo/kits/utils/Utils.android.kt +14 -0
  48. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Components.kt +194 -0
  49. package/compose/src/commonMain/kotlin/vn/momo/kits/application/NavigationContainer.kt +197 -0
  50. package/compose/src/commonMain/kotlin/vn/momo/kits/application/Screen.kt +133 -0
  51. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Badge.kt +62 -0
  52. package/compose/src/commonMain/kotlin/vn/momo/kits/components/BadgeDot.kt +27 -0
  53. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Button.kt +288 -0
  54. package/compose/src/commonMain/kotlin/vn/momo/kits/components/CheckBox.kt +80 -0
  55. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Divider.kt +23 -0
  56. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Icon.kt +42 -0
  57. package/compose/src/commonMain/kotlin/vn/momo/kits/components/IconButton.kt +126 -0
  58. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Image.kt +51 -0
  59. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Input.kt +299 -0
  60. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputMoney.kt +246 -0
  61. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputSearch.kt +223 -0
  62. package/compose/src/commonMain/kotlin/vn/momo/kits/components/InputTextArea.kt +244 -0
  63. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PopupNotify.kt +281 -0
  64. package/compose/src/commonMain/kotlin/vn/momo/kits/components/PromotionPopup.kt +72 -0
  65. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Radio.kt +65 -0
  66. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Skeleton.kt +64 -0
  67. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Switch.kt +63 -0
  68. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tag.kt +73 -0
  69. package/compose/src/commonMain/kotlin/vn/momo/kits/components/Text.kt +42 -0
  70. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Colors.kt +150 -0
  71. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Radius.kt +12 -0
  72. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Spacing.kt +13 -0
  73. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Theme.kt +173 -0
  74. package/compose/src/commonMain/kotlin/vn/momo/kits/const/Typography.kt +242 -0
  75. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Card.kt +2 -0
  76. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Item.kt +2 -0
  77. package/compose/src/commonMain/kotlin/vn/momo/kits/layout/Section.kt +2 -0
  78. package/compose/src/commonMain/kotlin/vn/momo/kits/modifier/Shadow.kt +50 -0
  79. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Icons.kt +1321 -0
  80. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Platform.kt +3 -0
  81. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/SetMaskFilter.kt +5 -0
  82. package/compose/src/commonMain/kotlin/vn/momo/kits/utils/Utils.kt +97 -0
  83. package/compose/src/iosMain/kotlin/vn/momo/kits/utils/Platform.kt +3 -0
  84. package/compose/src/iosMain/kotlin/vn/momo/kits/utils/SetMaskFilter.kt +9 -0
  85. package/compose/src/iosMain/kotlin/vn/momo/kits/utils/Utils.ios.kt +18 -0
  86. package/gradle.properties +19 -0
  87. package/gradlew +240 -0
  88. package/gradlew.bat +91 -0
  89. package/ios/Button/Button.swift +9 -2
  90. package/ios/CalculatorKeyboard/CalculatorKeyboard.swift +126 -0
  91. package/ios/Colors+Radius+Spacing/Colors.swift +21 -19
  92. package/ios/Input/Input.swift +1 -0
  93. package/ios/OTPKeyboard/KeyboardButton.swift +12 -4
  94. package/ios/Popup/PopupDisplay.swift +72 -81
  95. package/ios/Popup/PopupInput.swift +96 -0
  96. package/ios/Popup/PopupPromotion.swift +52 -0
  97. package/ios/ScrollIndicator/ScrollIndicator.swift +79 -0
  98. package/ios/Template/Logo/Logo.swift +75 -0
  99. package/ios/Template/TrustBanner/TrustBanner.swift +189 -0
  100. package/ios/native-kits.podspec +1 -1
  101. package/local.properties +8 -0
  102. package/package.json +6 -6
  103. package/publish.sh +1 -10
  104. package/settings.gradle.kts +41 -0
  105. package/android/gradle.properties +0 -5
  106. package/android/src/main/java/com/momoplatform/nativekits/NativeKitsPackage.kt +0 -17
  107. package/android/src/main/java/com/momoplatform/nativekits/NativeKitsViewManager.kt +0 -20
  108. package/example/ios/Example/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -63
  109. package/example/ios/Example/Assets.xcassets/Background.colorset/Contents.json +0 -38
  110. package/example/ios/Example/Assets.xcassets/Border.colorset/Contents.json +0 -38
  111. package/example/ios/Example/Assets.xcassets/Card.colorset/Contents.json +0 -38
  112. package/example/ios/Example/Assets.xcassets/Contents.json +0 -6
  113. package/example/ios/Example/Assets.xcassets/Error.colorset/Contents.json +0 -38
  114. package/example/ios/Example/Assets.xcassets/Primary.colorset/Contents.json +0 -38
  115. package/example/ios/Example/Assets.xcassets/PrimaryDark.colorset/Contents.json +0 -38
  116. package/example/ios/Example/Assets.xcassets/PrimaryLight.colorset/Contents.json +0 -38
  117. package/example/ios/Example/Assets.xcassets/Secondary.colorset/Contents.json +0 -38
  118. package/example/ios/Example/Assets.xcassets/Success.colorset/Contents.json +0 -38
  119. package/example/ios/Example/Assets.xcassets/Text.colorset/Contents.json +0 -38
  120. package/example/ios/Example/Assets.xcassets/TextSecondary.colorset/Contents.json +0 -38
  121. package/example/ios/Example/Assets.xcassets/Warning.colorset/Contents.json +0 -38
  122. package/example/ios/Example/ComponentDetail.swift +0 -35
  123. package/example/ios/Example/ComponentItem.swift +0 -24
  124. package/example/ios/Example/ComponentModel.swift +0 -38
  125. package/example/ios/Example/ContentView.swift +0 -39
  126. package/example/ios/Example/Example.entitlements +0 -10
  127. package/example/ios/Example/Foundation/ButtonDemo.swift +0 -80
  128. package/example/ios/Example/Foundation/ImageDemo.swift +0 -43
  129. package/example/ios/Example/Foundation/Popup/ActionSheets.swift +0 -136
  130. package/example/ios/Example/Foundation/Popup/Floats.swift +0 -127
  131. package/example/ios/Example/Foundation/Popup/Popups.swift +0 -51
  132. package/example/ios/Example/Foundation/PopupDemo.swift +0 -389
  133. package/example/ios/Example/Foundation/TextInputDemo.swift +0 -36
  134. package/example/ios/Example/Foundation/TypographyDemo.swift +0 -53
  135. package/example/ios/Example/Foundation.swift +0 -26
  136. package/example/ios/Example/Info.plist +0 -18
  137. package/example/ios/Example/Library/CheckboxDemo.swift +0 -19
  138. package/example/ios/Example/Library/SwipeableDemo.swift +0 -105
  139. package/example/ios/Example/Library/SwitchDemo.swift +0 -19
  140. package/example/ios/Example/Library.swift +0 -26
  141. package/example/ios/Example/Main.swift +0 -27
  142. package/example/ios/Example/Overview.swift +0 -20
  143. package/example/ios/Example/Preview Content/Preview Assets.xcassets/Contents.json +0 -6
  144. package/example/ios/Example/Resource/SFProText-Black.ttf +0 -0
  145. package/example/ios/Example/Resource/SFProText-Bold.ttf +0 -0
  146. package/example/ios/Example/Resource/SFProText-Heavy.ttf +0 -0
  147. package/example/ios/Example/Resource/SFProText-Light.ttf +0 -0
  148. package/example/ios/Example/Resource/SFProText-Medium.ttf +0 -0
  149. package/example/ios/Example/Resource/SFProText-Regular.ttf +0 -0
  150. package/example/ios/Example/Resource/SFProText-Semibold.ttf +0 -0
  151. package/example/ios/Example/Resource/SFProText-Thin.ttf +0 -0
  152. package/example/ios/Example/Resource/SFProText-Ultralight.ttf +0 -0
  153. package/example/ios/Example/Resource/foundation.json +0 -33
  154. package/example/ios/Example/Resource/library.json +0 -18
  155. package/example/ios/Example/Utils.swift +0 -30
  156. package/example/ios/Example/ViewModifier/DarkViewModifier.swift +0 -22
  157. package/example/ios/Example.xcodeproj/project.pbxproj +0 -581
  158. package/example/ios/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  159. package/example/ios/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  160. package/example/ios/Example.xcodeproj/project.xcworkspace/xcuserdata/wem.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  161. package/example/ios/Example.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
  162. package/example/ios/Example.xcworkspace/contents.xcworkspacedata +0 -10
  163. package/example/ios/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  164. package/example/ios/Example.xcworkspace/xcuserdata/wem.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  165. package/example/ios/Example.xcworkspace/xcuserdata/wem.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +0 -6
  166. package/example/ios/Podfile +0 -7
  167. package/example/ios/Podfile.lock +0 -35
  168. package/example/ios/Pods/Local Podspecs/MoMoUIKits.podspec.json +0 -37
  169. package/example/ios/Pods/Manifest.lock +0 -35
  170. package/example/ios/Pods/Pods.xcodeproj/project.pbxproj +0 -2047
  171. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +0 -58
  172. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/Pods-Example.xcscheme +0 -58
  173. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SDWebImage.xcscheme +0 -58
  174. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +0 -58
  175. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/SkeletonUI.xcscheme +0 -58
  176. package/example/ios/Pods/Pods.xcodeproj/xcuserdata/wem.xcuserdatad/xcschemes/xcschememanagement.plist +0 -46
  177. package/example/ios/Pods/SDWebImage/LICENSE +0 -20
  178. package/example/ios/Pods/SDWebImage/README.md +0 -352
  179. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSButton+WebCache.h +0 -340
  180. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSButton+WebCache.m +0 -172
  181. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSData+ImageContentType.h +0 -63
  182. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSData+ImageContentType.m +0 -165
  183. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSImage+Compatibility.h +0 -67
  184. package/example/ios/Pods/SDWebImage/SDWebImage/Core/NSImage+Compatibility.m +0 -120
  185. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.h +0 -114
  186. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImage.m +0 -392
  187. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.h +0 -112
  188. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImagePlayer.m +0 -420
  189. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageRep.h +0 -23
  190. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageRep.m +0 -133
  191. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView+WebCache.h +0 -168
  192. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView+WebCache.m +0 -79
  193. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView.h +0 -110
  194. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDAnimatedImageView.m +0 -540
  195. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.h +0 -145
  196. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDDiskCache.m +0 -326
  197. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.h +0 -73
  198. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDGraphicsImageRenderer.m +0 -256
  199. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAPNGCoder.h +0 -19
  200. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAPNGCoder.m +0 -58
  201. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAWebPCoder.h +0 -23
  202. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageAWebPCoder.m +0 -98
  203. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.h +0 -450
  204. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCache.m +0 -1030
  205. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheConfig.h +0 -153
  206. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheConfig.m +0 -68
  207. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.h +0 -156
  208. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCacheDefine.m +0 -138
  209. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCachesManager.h +0 -81
  210. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCachesManager.m +0 -556
  211. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.h +0 -297
  212. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoder.m +0 -26
  213. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.h +0 -153
  214. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCoderHelper.m +0 -822
  215. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCodersManager.h +0 -58
  216. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageCodersManager.m +0 -130
  217. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageFrame.h +0 -36
  218. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageFrame.m +0 -28
  219. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGIFCoder.h +0 -22
  220. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGIFCoder.m +0 -58
  221. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.h +0 -28
  222. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageGraphics.m +0 -127
  223. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageHEICCoder.h +0 -25
  224. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageHEICCoder.m +0 -101
  225. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.h +0 -58
  226. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOAnimatedCoder.m +0 -807
  227. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.h +0 -30
  228. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageIOCoder.m +0 -420
  229. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.h +0 -146
  230. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoader.m +0 -170
  231. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoadersManager.h +0 -40
  232. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageLoadersManager.m +0 -123
  233. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageTransformer.h +0 -241
  234. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDImageTransformer.m +0 -331
  235. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDMemoryCache.h +0 -78
  236. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDMemoryCache.m +0 -158
  237. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheKeyFilter.h +0 -32
  238. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheKeyFilter.m +0 -39
  239. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.h +0 -36
  240. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCacheSerializer.m +0 -39
  241. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCompat.h +0 -95
  242. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageCompat.m +0 -17
  243. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDefine.h +0 -352
  244. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDefine.m +0 -149
  245. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.h +0 -314
  246. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloader.m +0 -658
  247. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.h +0 -113
  248. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderConfig.m +0 -60
  249. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderDecryptor.h +0 -49
  250. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderDecryptor.m +0 -55
  251. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.h +0 -191
  252. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderOperation.m +0 -722
  253. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.h +0 -69
  254. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderRequestModifier.m +0 -71
  255. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderResponseModifier.h +0 -69
  256. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageDownloaderResponseModifier.m +0 -73
  257. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.h +0 -32
  258. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageError.m +0 -16
  259. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageIndicator.h +0 -115
  260. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageIndicator.m +0 -275
  261. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageManager.h +0 -290
  262. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageManager.m +0 -775
  263. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOperation.h +0 -27
  264. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOperation.m +0 -14
  265. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOptionsProcessor.h +0 -72
  266. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageOptionsProcessor.m +0 -59
  267. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImagePrefetcher.h +0 -143
  268. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImagePrefetcher.m +0 -303
  269. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageTransition.h +0 -131
  270. package/example/ios/Pods/SDWebImage/SDWebImage/Core/SDWebImageTransition.m +0 -194
  271. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIButton+WebCache.h +0 -387
  272. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIButton+WebCache.m +0 -234
  273. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ExtendedCacheData.h +0 -24
  274. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ExtendedCacheData.m +0 -23
  275. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.h +0 -46
  276. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+ForceDecode.m +0 -60
  277. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+GIF.h +0 -26
  278. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+GIF.m +0 -22
  279. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MemoryCacheCost.h +0 -27
  280. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MemoryCacheCost.m +0 -47
  281. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Metadata.h +0 -89
  282. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Metadata.m +0 -221
  283. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MultiFormat.h +0 -80
  284. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+MultiFormat.m +0 -47
  285. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.h +0 -146
  286. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImage+Transform.m +0 -824
  287. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+HighlightedWebCache.h +0 -129
  288. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+HighlightedWebCache.m +0 -76
  289. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+WebCache.h +0 -194
  290. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIImageView+WebCache.m +0 -67
  291. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCache.h +0 -110
  292. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCache.m +0 -446
  293. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.h +0 -48
  294. package/example/ios/Pods/SDWebImage/SDWebImage/Core/UIView+WebCacheOperation.m +0 -82
  295. package/example/ios/Pods/SDWebImage/SDWebImage/Private/NSBezierPath+SDRoundedCorners.h +0 -24
  296. package/example/ios/Pods/SDWebImage/SDWebImage/Private/NSBezierPath+SDRoundedCorners.m +0 -42
  297. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAssociatedObject.h +0 -14
  298. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAssociatedObject.m +0 -29
  299. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.h +0 -21
  300. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDAsyncBlockOperation.m +0 -92
  301. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.h +0 -18
  302. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDeviceHelper.m +0 -32
  303. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.h +0 -29
  304. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDDisplayLink.m +0 -227
  305. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDFileAttributeHelper.h +0 -19
  306. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDFileAttributeHelper.m +0 -127
  307. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.h +0 -23
  308. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageAssetManager.m +0 -164
  309. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageCachesManagerOperation.h +0 -21
  310. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageCachesManagerOperation.m +0 -83
  311. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDImageIOAnimatedCoderInternal.h +0 -39
  312. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDInternalMacros.h +0 -122
  313. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDInternalMacros.m +0 -13
  314. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWeakProxy.h +0 -20
  315. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWeakProxy.m +0 -79
  316. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDWebImageTransitionInternal.h +0 -19
  317. package/example/ios/Pods/SDWebImage/SDWebImage/Private/SDmetamacros.h +0 -667
  318. package/example/ios/Pods/SDWebImage/SDWebImage/Private/UIColor+SDHexString.h +0 -18
  319. package/example/ios/Pods/SDWebImage/SDWebImage/Private/UIColor+SDHexString.m +0 -42
  320. package/example/ios/Pods/SDWebImage/WebImage/SDWebImage.h +0 -89
  321. package/example/ios/Pods/SDWebImageSwiftUI/LICENSE +0 -19
  322. package/example/ios/Pods/SDWebImageSwiftUI/README.md +0 -690
  323. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/AnimatedImage.swift +0 -870
  324. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/Backport.swift +0 -59
  325. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/OnChange.swift +0 -52
  326. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/Overlay.swift +0 -124
  327. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Backports/StateObject.swift +0 -151
  328. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Image.swift +0 -78
  329. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImageManager.swift +0 -132
  330. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImagePlayer.swift +0 -122
  331. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/ImageViewWrapper.swift +0 -133
  332. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/ActivityIndicator.swift +0 -82
  333. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/Indicator.swift +0 -97
  334. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Indicator/ProgressIndicator.swift +0 -114
  335. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/SDWebImageSwiftUI.swift +0 -64
  336. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/SwiftUICompatibility.swift +0 -92
  337. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/Transition/Transition.swift +0 -93
  338. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Classes/WebImage.swift +0 -509
  339. package/example/ios/Pods/SDWebImageSwiftUI/SDWebImageSwiftUI/Module/SDWebImageSwiftUI.h +0 -15
  340. package/example/ios/Pods/SkeletonUI/LICENSE +0 -21
  341. package/example/ios/Pods/SkeletonUI/README.md +0 -137
  342. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Angle/AngleInteractor.swift +0 -29
  343. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Angle/AnglePresenter.swift +0 -7
  344. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Animation/AnimationInteractor.swift +0 -56
  345. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Appearance/AppearanceInteractor.swift +0 -58
  346. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Appearance/AppearancePresenter.swift +0 -5
  347. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/ClosedRange+Normalize.swift +0 -16
  348. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Image+OptionalType.swift +0 -102
  349. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/ModifiedContent+SkeletonModifier.swift +0 -26
  350. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Optional+OptionalType.swift +0 -5
  351. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/SecureField+OptionalType.swift +0 -19
  352. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Text+OptionalType.swift +0 -27
  353. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/TextField+OptionalType.swift +0 -35
  354. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/Toggle+OptionalType.swift +0 -29
  355. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/UnitPoint+Angle.swift +0 -8
  356. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Extensions/View+SkeletonModifier.swift +0 -8
  357. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Modifiers/SkeletonModifier.swift +0 -52
  358. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Multiline/MultilineInteractor.swift +0 -41
  359. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Multiline/MultilinePresenter.swift +0 -9
  360. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Opacity/OpacityInteractor.swift +0 -29
  361. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Opacity/OpacityPresenter.swift +0 -7
  362. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Position/PositionInteractor.swift +0 -29
  363. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Position/PositionPresenter.swift +0 -7
  364. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Protocols/OptionalType.swift +0 -4
  365. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Radius/RadiusInteractor.swift +0 -29
  366. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Radius/RadiusPresenter.swift +0 -7
  367. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Shape/ShapeInteractor.swift +0 -33
  368. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Shape/ShapePresenter.swift +0 -5
  369. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonForEach.swift +0 -20
  370. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonInteractor.swift +0 -27
  371. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonList.swift +0 -20
  372. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonPresenter.swift +0 -15
  373. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonShape.swift +0 -64
  374. package/example/ios/Pods/SkeletonUI/Sources/SkeletonUI/Skeleton/SkeletonView.swift +0 -25
  375. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-dummy.m +0 -5
  376. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-prefix.pch +0 -12
  377. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits-umbrella.h +0 -16
  378. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.debug.xcconfig +0 -15
  379. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.modulemap +0 -6
  380. package/example/ios/Pods/Target Support Files/MoMoUIKits/MoMoUIKits.release.xcconfig +0 -15
  381. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown +0 -75
  382. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist +0 -119
  383. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m +0 -5
  384. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h +0 -16
  385. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig +0 -15
  386. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap +0 -6
  387. package/example/ios/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig +0 -15
  388. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-dummy.m +0 -5
  389. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-prefix.pch +0 -12
  390. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage-umbrella.h +0 -75
  391. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.debug.xcconfig +0 -14
  392. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.modulemap +0 -6
  393. package/example/ios/Pods/Target Support Files/SDWebImage/SDWebImage.release.xcconfig +0 -14
  394. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-dummy.m +0 -5
  395. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-prefix.pch +0 -12
  396. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI-umbrella.h +0 -17
  397. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.debug.xcconfig +0 -17
  398. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.modulemap +0 -6
  399. package/example/ios/Pods/Target Support Files/SDWebImageSwiftUI/SDWebImageSwiftUI.release.xcconfig +0 -17
  400. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-dummy.m +0 -5
  401. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-prefix.pch +0 -12
  402. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI-umbrella.h +0 -16
  403. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.debug.xcconfig +0 -12
  404. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.modulemap +0 -6
  405. package/example/ios/Pods/Target Support Files/SkeletonUI/SkeletonUI.release.xcconfig +0 -12
  406. package/ios/Extensions/View++.swift +0 -9
@@ -1,722 +0,0 @@
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