{"id":34826,"date":"2024-07-23T07:00:00","date_gmt":"2024-07-23T14:00:00","guid":{"rendered":"https:\/\/cloudinary.com\/blog\/?p=34826"},"modified":"2024-08-21T18:40:36","modified_gmt":"2024-08-22T01:40:36","slug":"ios-easy-asset-management","status":"publish","type":"post","link":"https:\/\/cloudinary.com\/blog\/ios-easy-asset-management","title":{"rendered":"Cloudinary iOS SDK: Easy Asset Management"},"content":{"rendered":"\n<p>Asset management comprises utilizing the same asset in different sizes, formats, device pixel ratio (DPR), and more depending on the device you\u2019re using. At previous companies I\u2019ve worked with, we tried building asset management solutions on the backend, but they still required a lot of work from our backend developers. We then tried a method to handle locally on the device, but the results weren\u2019t any better; this approach was time- and battery-consuming to crop, scale, and optimize.<\/p>\n\n\n\n<p>Once I started working for Cloudinary, I understood there\u2019s a better all-in-one solution for managing and showing multiple assets.<\/p>\n\n\n\n<p>They say one picture is worth a thousand words, so I developed the Cloudinary iOS sample app for developers to discover how the Cloudinary solution can improve app performance.<\/p>\n\n\n\n<p>Here\u2019s an overview of what you can find in my demo app:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Optimizations.<\/li>\n\n\n\n<li>Transformations.<\/li>\n\n\n\n<li>Use cases such as localization, branding, and background normalization.<\/li>\n\n\n\n<li>Uploading, including uploading large files and fetch upload.<\/li>\n\n\n\n<li>Upload widget and image widget implementations.<\/li>\n\n\n\n<li>Video, including the video player widget and video feeds.<\/li>\n<\/ul>\n\n\n\n<p>You can find our sample app <a href=\"https:\/\/github.com\/cloudinary\/cloudinary_ios\/tree\/master\/Example\">here<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Delivery<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img width=\"295\" height=\"639\" data-public-id=\"Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-1_34827b0e10\/blog-iOS-Easy-Asset-Management-1_34827b0e10.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_295,h_639,c_scale\/f_auto,q_auto\/v1721687483\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-1_34827b0e10\/blog-iOS-Easy-Asset-Management-1_34827b0e10.png?_i=AA\" alt=\"\" class=\"wp-post-34826 wp-image-34827\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1721687483\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721687483\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-1_34827b0e10\/blog-iOS-Easy-Asset-Management-1_34827b0e10.png?_i=AA 295w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721687483\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-1_34827b0e10\/blog-iOS-Easy-Asset-Management-1_34827b0e10.png?_i=AA 138w\" sizes=\"auto, (max-width: 295px) 100vw, 295px\" \/><\/figure><\/div>\n\n\n<p>The <strong>Delivery<\/strong> tab shows various things you can do with the Cloudinary SDK.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Optimization<\/h2>\n\n\n\n<p>This tab shows how optimization through Cloudinary will reduce asset size and the amount of bandwidth the app will consume.<\/p>\n\n\n\n<p>Since we\u2019re on iOS, we want to consider HEIC or AVIF formats to reduce the bandwidth.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img width=\"295\" height=\"639\" data-public-id=\"Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-2_3482868e5b\/blog-iOS-Easy-Asset-Management-2_3482868e5b.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_295,h_639,c_scale\/f_auto,q_auto\/v1721687479\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-2_3482868e5b\/blog-iOS-Easy-Asset-Management-2_3482868e5b.png?_i=AA\" alt=\"\" class=\"wp-post-34826 wp-image-34828\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1721687479\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721687479\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-2_3482868e5b\/blog-iOS-Easy-Asset-Management-2_3482868e5b.png?_i=AA 295w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721687479\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-2_3482868e5b\/blog-iOS-Easy-Asset-Management-2_3482868e5b.png?_i=AA 138w\" sizes=\"auto, (max-width: 295px) 100vw, 295px\" \/><\/figure><\/div>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">cloudinary<\/span><span class=\"hljs-selector-class\">.createUrl<\/span>()<span class=\"hljs-selector-class\">.setTransformation<\/span>(<span class=\"hljs-selector-tag\">CLDTransformation<\/span>()<span class=\"hljs-selector-class\">.setQuality<\/span>(\"<span class=\"hljs-selector-tag\">auto<\/span>\")<span class=\"hljs-selector-class\">.setFetchFormat<\/span>(\"<span class=\"hljs-selector-tag\">heic<\/span>\")<span class=\"hljs-selector-class\">.setDpr<\/span>(\"<span class=\"hljs-selector-tag\">auto<\/span>\")<span class=\"hljs-selector-class\">.setWidth<\/span>(0<span class=\"hljs-selector-class\">.4<\/span>)<span class=\"hljs-selector-class\">.setCrop<\/span>(\"<span class=\"hljs-selector-tag\">scale<\/span>\"))<span class=\"hljs-selector-class\">.generate<\/span>(<span class=\"hljs-selector-tag\">publicId<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>We\u2019ll use our Cloudinary object to create our URL using <code>createUrl()<\/code> function, and then we\u2019ll set up a new <code>CLDTransformation()<\/code>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use crop mode scale to keep the current asset aspect ratio.<\/li>\n\n\n\n<li>Reduce the width to 40% of what it was.<\/li>\n\n\n\n<li>Use HEIC as the image format, which will reduce the asset size.<\/li>\n\n\n\n<li>Set the quality to auto, which will allow Cloudinary backend to optimize the image quality.<\/li>\n\n\n\n<li>Set the DPR to auto.<\/li>\n\n\n\n<li>At the end of the line, we\u2019ll call generate and give it the asset name (<code>publicId<\/code>).<\/li>\n<\/ul>\n\n\n\n<p>After completing these steps, the results will be a lighter, optimized asset.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Transform<\/h2>\n\n\n\n<p>Cloudinary can help you transform images in many ways. You can change the size and shape, remove backgrounds, add other images or text on top, and change the colors of different parts of the image.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img width=\"295\" height=\"639\" data-public-id=\"Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-3\/blog-iOS-Easy-Asset-Management-3.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_295,h_639,c_scale\/f_auto,q_auto\/v1721687473\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-3\/blog-iOS-Easy-Asset-Management-3.png?_i=AA\" alt=\"\" class=\"wp-post-34826 wp-image-34829\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1721687473\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721687473\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-3\/blog-iOS-Easy-Asset-Management-3.png?_i=AA 295w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721687473\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-3\/blog-iOS-Easy-Asset-Management-3.png?_i=AA 138w\" sizes=\"auto, (max-width: 295px) 100vw, 295px\" \/><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\">Use Cases<\/h2>\n\n\n\n<p>In the use cases section, you\u2019ll see how people are using Cloudinary in their apps. You can take images of different sizes and make them all the same size that fits your needs.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img width=\"295\" height=\"639\" data-public-id=\"Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-4\/blog-iOS-Easy-Asset-Management-4.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_295,h_639,c_scale\/f_auto,q_auto\/v1721687470\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-4\/blog-iOS-Easy-Asset-Management-4.png?_i=AA\" alt=\"\" class=\"wp-post-34826 wp-image-34830\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1721687470\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721687470\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-4\/blog-iOS-Easy-Asset-Management-4.png?_i=AA 295w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721687470\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-4\/blog-iOS-Easy-Asset-Management-4.png?_i=AA 138w\" sizes=\"auto, (max-width: 295px) 100vw, 295px\" \/><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\">Upload<\/h2>\n\n\n\n<p>In the next tab, you\u2019ll find the <strong>Upload<\/strong> section. The upload screen shows the following actions:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img width=\"295\" height=\"639\" data-public-id=\"Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-5_3483157628\/blog-iOS-Easy-Asset-Management-5_3483157628.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_295,h_639,c_scale\/f_auto,q_auto\/v1721687468\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-5_3483157628\/blog-iOS-Easy-Asset-Management-5_3483157628.png?_i=AA\" alt=\"\" class=\"wp-post-34826 wp-image-34831\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1721687468\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721687468\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-5_3483157628\/blog-iOS-Easy-Asset-Management-5_3483157628.png?_i=AA 295w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721687468\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-5_3483157628\/blog-iOS-Easy-Asset-Management-5_3483157628.png?_i=AA 138w\" sizes=\"auto, (max-width: 295px) 100vw, 295px\" \/><\/figure><\/div>\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Upload<\/strong>. Upload an asset from your phone to your cloud with one line of code.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">cloudinary<\/span><span class=\"hljs-selector-class\">.createUploader<\/span>()<span class=\"hljs-selector-class\">.upload<\/span>(<span class=\"hljs-selector-tag\">data<\/span>: <span class=\"hljs-selector-tag\">data<\/span>!, <span class=\"hljs-selector-tag\">uploadPreset<\/span>: \"<span class=\"hljs-selector-tag\">ios_sample<\/span>\")<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>As shown in the snippet above, we\u2019ll need to provide the upload function with the asset URI. We want to make an unsigned upload and use the <code>UPLOAD_PRESET<\/code> (you can learn more about upload presets here). Then, we\u2019ll send the request.<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><strong>Upload large file<\/strong>. When you upload large files, in the background the SDK will take care of the size by splitting the data to chunks and uploading them to the Cloudinary cloud.<\/li>\n\n\n\n<li><strong>Fetch Upload<\/strong>. Upload assets from a remote URL to your cloud.<\/li>\n<\/ol>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-selector-tag\">cloudinary<\/span><span class=\"hljs-selector-class\">.createUrl<\/span>()<span class=\"hljs-selector-class\">.setType<\/span>(\"<span class=\"hljs-selector-tag\">fetch<\/span>\")<span class=\"hljs-selector-class\">.setTransformation<\/span>(<span class=\"hljs-selector-tag\">CLDTransformation<\/span>()<span class=\"hljs-selector-class\">.setQuality<\/span>(\"<span class=\"hljs-selector-tag\">auto<\/span>\")<span class=\"hljs-selector-class\">.setFetchFormat<\/span>(\"<span class=\"hljs-selector-tag\">auto<\/span>\")<span class=\"hljs-selector-class\">.setDpr<\/span>(\"<span class=\"hljs-selector-tag\">auto<\/span>\")<span class=\"hljs-selector-class\">.setWidth<\/span>(0<span class=\"hljs-selector-class\">.7<\/span>)<span class=\"hljs-selector-class\">.setCrop<\/span>(\"<span class=\"hljs-selector-tag\">scale<\/span>\"))<span class=\"hljs-selector-class\">.generate<\/span>(<span class=\"hljs-selector-tag\">publicId<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>The only change we\u2019ll make from a URL that we generated earlier is set <code>.type() to fetch<\/code>. Cloudinary will then create a new URL for you and upload the asset from the remote URL to your cloud.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Widgets<\/h2>\n\n\n\n<p>As part of the SDK, we offer different widgets.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Image Widget<\/h3>\n\n\n\n<p>The Cloudinary SDK image widget allows you to easily download and show images on screen. Another great advantage is it runs on a cache mechanism, so if an image was downloaded once, it won&#8217;t be downloaded again but taken from the cache instead.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img width=\"295\" height=\"639\" data-public-id=\"Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-6_3483243c92\/blog-iOS-Easy-Asset-Management-6_3483243c92.png\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/w_295,h_639,c_scale\/f_auto,q_auto\/v1721687465\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-6_3483243c92\/blog-iOS-Easy-Asset-Management-6_3483243c92.png?_i=AA\" alt=\"\" class=\"wp-post-34826 wp-image-34832\" data-format=\"png\" data-transformations=\"f_auto,q_auto\" data-version=\"1721687465\" data-seo=\"1\" srcset=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721687465\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-6_3483243c92\/blog-iOS-Easy-Asset-Management-6_3483243c92.png?_i=AA 295w, https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721687465\/Web_Assets\/blog\/blog-iOS-Easy-Asset-Management-6_3483243c92\/blog-iOS-Easy-Asset-Management-6_3483243c92.png?_i=AA 138w\" sizes=\"auto, (max-width: 295px) 100vw, 295px\" \/><\/figure><\/div>\n\n\n<p>The image widget can handle local images, remote images (URL), and Cloudinary\u2019s images by public id.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css shcb-wrap-lines\"><span class=\"hljs-keyword\">@IBOutlet<\/span> weak var <span class=\"hljs-attribute\">ivLocal:<\/span> CLDUIImageView!\n\n@IBOutlet weak var <span class=\"hljs-attribute\">ivRemote:<\/span> CLDUIImageView!\n\n@IBOutlet weak var <span class=\"hljs-attribute\">ivCloudinary:<\/span> CLDUIImageView!\n\nivLocal.image = UIImage(<span class=\"hljs-attribute\">named:<\/span> <span class=\"hljs-string\">\"house\"<\/span>)\n\nivRemote.cldSetImage(<span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/mobiledemoapp\/image\/upload\/v1706628181\/Demo%20app%20content\/Frame_871_ao5o4r.jpg\"<\/span>, <span class=\"hljs-attribute\">cloudinary:<\/span> cloudinary)\n\nivCloudinary.cldSetImage(<span class=\"hljs-attribute\">publicId:<\/span> <span class=\"hljs-string\">\"Demo%20app%20content\/Frame_871_ao5o4r\"<\/span>, <span class=\"hljs-attribute\">cloudinary:<\/span> cloudinary)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Upload Widget<\/h3>\n\n\n\n<p>The Upload widget lets you easily open the phone gallery and allows users to upload images to your Cloudinary cloud. To open the widget, use the following code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\"><span class=\"hljs-keyword\">let<\/span> configuration = CLDWidgetConfiguration(\n\n\u00a0\u00a0\u00a0\u00a0uploadType: CLDUploadType(signed: <span class=\"hljs-literal\">false<\/span>, <span class=\"hljs-attr\">preset<\/span>: <span class=\"hljs-string\">\"ios_sample\"<\/span>))\n\nuploadWidget = CLDUploaderWidget(\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cloudinary: cloudinary,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">configuration<\/span>: configuration,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">images<\/span>: nil,\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-attr\">delegate<\/span>: self)\n\n\u00a0uploadWidget.presentWidget(<span class=\"hljs-keyword\">from<\/span>: self)\n\nOnce an asset is chosen we can <span class=\"hljs-keyword\">catch<\/span> it at:\n\n\u00a0func uploadWidget(_ widget: CLDUploaderWidget, willCall uploadRequests: &#91;CLDUploadRequest])<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>And then we can all the results picked from the Upload widget:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php shcb-wrap-lines\">uploadRequests&#91;<span class=\"hljs-number\">0<\/span>].response( { response, error in\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span class=\"hljs-keyword\">self<\/span>.ivMain.cldSetImage(response!.secureUrl!, cloudinary: <span class=\"hljs-keyword\">self<\/span>.cloudinary)\n\n} )<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Video<\/h2>\n\n\n\n<p>As part of the Cloudinary iOS SDK, we provide an easy-to-use native video player based on AVPlayer. Our player easily integrates with Cloudinary features like transformations and more.<\/p>\n\n\n\n<p>At the upper part, you can see our Cloudinary video player with controls.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript shcb-wrap-lines\">player = CLDVideoPlayer(url: <span class=\"hljs-string\">\"https:\/\/res.cloudinary.com\/mobiledemoapp\/video\/upload\/v1706627936\/Demo%20app%20content\/sport-1_tjwumh.mp4\"<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In the snippet, we\u2019ll create a <code>CLDVideoPlayer<\/code> object, provide it with the context and URL of the video we want to play, and then add it to our view. We\u2019ll use <code>.play()<\/code> to start playing the video.<\/p>\n\n\n\n<p>Below, you can see a demonstration of a video feed showing how easily it can be set up using our video player.<\/p>\n\n\n\n<p>If you\u2019re an iOS developer looking for an easy way to manage and improve your assets, check out the <a href=\"https:\/\/cloudinary.com\/documentation\/ios_integration\">Cloudinary iOS SDK<\/a>. It not only boosts your app\u2019s performance but also provides widgets to simplify your code and a wide range of transformations for your assets.<\/p>\n\n\n\n<p>You can find the iOS SDK <a href=\"https:\/\/github.com\/cloudinary\/cloudinary_ios\">here<\/a>, and to learn more about Cloudinary, <a href=\"https:\/\/cloudinary.com\/\">contact us today<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Asset management comprises utilizing the same asset in different sizes, formats, device pixel ratio (DPR), and more depending on the device you\u2019re using. At previous companies I\u2019ve worked with, we tried building asset management solutions on the backend, but they still required a lot of work from our backend developers. We then tried a method [&hellip;]<\/p>\n","protected":false},"author":87,"featured_media":34834,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_cloudinary_featured_overwrite":false,"footnotes":""},"categories":[1],"tags":[174,202,263],"class_list":["post-34826","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-ios","tag-mobile","tag-sdk"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.6 (Yoast SEO v26.9) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Easy Asset Management With Cloudinary iOS SDK<\/title>\n<meta name=\"description\" content=\"Adi Mizrahi, Cloudinary\u2019s Staff Mobile App Developer, shares his iOS sample app for developers to improve their app performance with Cloudinary.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cloudinary iOS SDK: Easy Asset Management\" \/>\n<meta property=\"og:description\" content=\"Adi Mizrahi, Cloudinary\u2019s Staff Mobile App Developer, shares his iOS sample app for developers to improve their app performance with Cloudinary.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5\" \/>\n<meta property=\"og:site_name\" content=\"Cloudinary Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-07-23T14:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-08-22T01:40:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1721676223\/iOS_easy_management-blog\/iOS_easy_management-blog-jpg?_i=AA\" \/>\n\t<meta property=\"og:image:width\" content=\"2000\" \/>\n\t<meta property=\"og:image:height\" content=\"1100\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"melindapham\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"NewsArticle\",\"@id\":\"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5#article\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/ios-easy-asset-management\"},\"author\":{\"name\":\"melindapham\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\"},\"headline\":\"Cloudinary iOS SDK: Easy Asset Management\",\"datePublished\":\"2024-07-23T14:00:00+00:00\",\"dateModified\":\"2024-08-22T01:40:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/ios-easy-asset-management\"},\"wordCount\":846,\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676223\/iOS_easy_management-blog\/iOS_easy_management-blog.jpg?_i=AA\",\"keywords\":[\"iOS\",\"Mobile\",\"SDK\"],\"inLanguage\":\"en-US\",\"copyrightYear\":\"2024\",\"copyrightHolder\":{\"@id\":\"https:\/\/cloudinary.com\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cloudinary.com\/blog\/ios-easy-asset-management\",\"url\":\"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5\",\"name\":\"Easy Asset Management With Cloudinary iOS SDK\",\"isPartOf\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5#primaryimage\"},\"image\":{\"@id\":\"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5#primaryimage\"},\"thumbnailUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676223\/iOS_easy_management-blog\/iOS_easy_management-blog.jpg?_i=AA\",\"datePublished\":\"2024-07-23T14:00:00+00:00\",\"dateModified\":\"2024-08-22T01:40:36+00:00\",\"description\":\"Adi Mizrahi, Cloudinary\u2019s Staff Mobile App Developer, shares his iOS sample app for developers to improve their app performance with Cloudinary.\",\"breadcrumb\":{\"@id\":\"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5#primaryimage\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676223\/iOS_easy_management-blog\/iOS_easy_management-blog.jpg?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676223\/iOS_easy_management-blog\/iOS_easy_management-blog.jpg?_i=AA\",\"width\":2000,\"height\":1100},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/cloudinary.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cloudinary iOS SDK: Easy Asset Management\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#website\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"name\":\"Cloudinary Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/cloudinary.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#organization\",\"name\":\"Cloudinary Blog\",\"url\":\"https:\/\/cloudinary.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"contentUrl\":\"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA\",\"width\":312,\"height\":60,\"caption\":\"Cloudinary Blog\"},\"image\":{\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9\",\"name\":\"melindapham\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g\",\"caption\":\"melindapham\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Easy Asset Management With Cloudinary iOS SDK","description":"Adi Mizrahi, Cloudinary\u2019s Staff Mobile App Developer, shares his iOS sample app for developers to improve their app performance with Cloudinary.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5","og_locale":"en_US","og_type":"article","og_title":"Cloudinary iOS SDK: Easy Asset Management","og_description":"Adi Mizrahi, Cloudinary\u2019s Staff Mobile App Developer, shares his iOS sample app for developers to improve their app performance with Cloudinary.","og_url":"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5","og_site_name":"Cloudinary Blog","article_published_time":"2024-07-23T14:00:00+00:00","article_modified_time":"2024-08-22T01:40:36+00:00","og_image":[{"width":2000,"height":1100,"url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/v1721676223\/iOS_easy_management-blog\/iOS_easy_management-blog-jpg?_i=AA","type":"image\/jpeg"}],"author":"melindapham","twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"NewsArticle","@id":"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5#article","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/ios-easy-asset-management"},"author":{"name":"melindapham","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9"},"headline":"Cloudinary iOS SDK: Easy Asset Management","datePublished":"2024-07-23T14:00:00+00:00","dateModified":"2024-08-22T01:40:36+00:00","mainEntityOfPage":{"@id":"https:\/\/cloudinary.com\/blog\/ios-easy-asset-management"},"wordCount":846,"publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"image":{"@id":"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676223\/iOS_easy_management-blog\/iOS_easy_management-blog.jpg?_i=AA","keywords":["iOS","Mobile","SDK"],"inLanguage":"en-US","copyrightYear":"2024","copyrightHolder":{"@id":"https:\/\/cloudinary.com\/#organization"}},{"@type":"WebPage","@id":"https:\/\/cloudinary.com\/blog\/ios-easy-asset-management","url":"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5","name":"Easy Asset Management With Cloudinary iOS SDK","isPartOf":{"@id":"https:\/\/cloudinary.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5#primaryimage"},"image":{"@id":"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5#primaryimage"},"thumbnailUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676223\/iOS_easy_management-blog\/iOS_easy_management-blog.jpg?_i=AA","datePublished":"2024-07-23T14:00:00+00:00","dateModified":"2024-08-22T01:40:36+00:00","description":"Adi Mizrahi, Cloudinary\u2019s Staff Mobile App Developer, shares his iOS sample app for developers to improve their app performance with Cloudinary.","breadcrumb":{"@id":"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5#primaryimage","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676223\/iOS_easy_management-blog\/iOS_easy_management-blog.jpg?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676223\/iOS_easy_management-blog\/iOS_easy_management-blog.jpg?_i=AA","width":2000,"height":1100},{"@type":"BreadcrumbList","@id":"https:\/\/medium.com\/@adi.mizrahi\/ios-easy-assets-management-3b1b46d332b5#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/cloudinary.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Cloudinary iOS SDK: Easy Asset Management"}]},{"@type":"WebSite","@id":"https:\/\/cloudinary.com\/blog\/#website","url":"https:\/\/cloudinary.com\/blog\/","name":"Cloudinary Blog","description":"","publisher":{"@id":"https:\/\/cloudinary.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/cloudinary.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/cloudinary.com\/blog\/#organization","name":"Cloudinary Blog","url":"https:\/\/cloudinary.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","contentUrl":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1649718331\/Web_Assets\/blog\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877\/cloudinary_logo_for_white_bg_1937437aa7_19374666c7_193742f877.png?_i=AA","width":312,"height":60,"caption":"Cloudinary Blog"},"image":{"@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/0d5ad601e4c3b5be89245dfb14be42d9","name":"melindapham","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/cloudinary.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e6f989fa97fe94be61596259d8629c3df65aec4c7da5c0000f90d810f313d4f4?s=96&d=mm&r=g","caption":"melindapham"}}]}},"jetpack_featured_media_url":"https:\/\/res.cloudinary.com\/cloudinary-marketing\/images\/f_auto,q_auto\/v1721676223\/iOS_easy_management-blog\/iOS_easy_management-blog.jpg?_i=AA","_links":{"self":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/34826","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/users\/87"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/comments?post=34826"}],"version-history":[{"count":3,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/34826\/revisions"}],"predecessor-version":[{"id":35416,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/posts\/34826\/revisions\/35416"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media\/34834"}],"wp:attachment":[{"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/media?parent=34826"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/categories?post=34826"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudinary.com\/blog\/wp-json\/wp\/v2\/tags?post=34826"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}