我有一个 iCloud 文件的公共 URL,如何在 iOS 中获取直接下载链接?

Posted

技术标签:

【中文标题】我有一个 iCloud 文件的公共 URL,如何在 iOS 中获取直接下载链接?【英文标题】:I have a public URL for an iCloud file, how can I get the DIRECT link to download in iOS? 【发布时间】:2011-10-16 19:26:57 【问题描述】:

我能够为 iCloud 文件生成公共 URL。例如https://www.icloud.com/documents/dl/?p=3&t=BAKsXkcDP-p8sdTS8NgBLWRQxE281oe4hogA

从浏览器访问这样的 URL,我会看到一个登录页面,然后文件会自动下载。很好。

但是,我希望能够从我的 ios 应用程序(使用 NSURLConnection)下载此文件。我怎样才能做到这一点?也许... a) 处理 html 标头以某种方式确定直接 URL? b)拦截触发浏览器下载的重定向/刷新? c) 以某种方式模仿浏览器来触发下载?

谢谢

PS。请给我白痴的答案-我对html等一无所知。

这是我为上面的间接 URL 得到的 html 响应:

var SC_benchmarkPreloadEvents=headStart:new Date().getTime(); -->iCloud - 正在加载 ...window.SC=window.SC||MODULE_INFO:,LAZY_INSTANTIATION:;SC.buildMode="production"; SC.buildNumber="1FCS22.32292";SC.buildLocale="en-us";String.preferredLanguage="en-us";window.SC=window.SC||MODULE_INFO:,LAZY_INSTANTIATION: ;SC._detectBrowser=function(userAgent,language)var 版本,webkitVersion,browser=; userAgent=(userAgent||navigator.userAgent).toLowerCase();语言=语言||navigator.language||navigator.browserLanguage; 版本=browser.version=(userAgent.match(/.*(?:rv|chrome|webkit|opera|ie)/: ([ );]|$)/)||[])[1]; webkitVersion=(userAgent.match(/webkit/(.+?) /)||[])[1];browser.windows=browser.isWindows=!!/windows/.test(userAgent); browser.mac=browser.isMac=!!/macintosh/.test(userAgent)||(/mac os x/.test(userAgent)&&!/like mac os x/.test(userAgent)); browser.lion=browser.isLion=!!(/mac os x 10_7/.test(userAgent)&&!/like mac os x 10_7/.test(userAgent)); browser.iPhone=browser.isiPhone=!!/iphone/.test(userAgent);browser.iPod=browser.isiPod=!!/ipod/.test(userAgent); browser.iPad=browser.isiPad=!!/ipad/.test(userAgent);browser.iOS=browser.isiOS=browser.iPhone||browser.iPod||browser.iPad; browser.android=browser.isAndroid=!!/android/.test(userAgent);browser.opera=/opera/.test(userAgent)?version:0; browser.isOpera=!!browser.opera;browser.msie=/msie/.test(userAgent)&&!browser.opera?version:0; browser.isIE=!!browser.msie;browser.isIE8OrLower=!!(browser.msie&&parseInt(browser.msie,10)-1 )styles=["/applications/documents/download/en-us/1FCS22.32292/stylesheet@2x-packed.css"]; SC.APP_IMAGE_ASSETS=["/applications/documents/sproutcore/desktop/en-us/1FCS22.32292/stylesheet-no-repeat@2x.png","/applications/documents/coreweb/views/en-us/1FCS22. 32292/stylesheet-no-repeat@2x.png","/applications/documents/sproutcore/ace/en-us/1FCS22.32292/stylesheet-no-repeat@2x.png","/applications/documents/sproutcore/ ace/en-us/1FCS22.32292/stylesheet-repeat-x@2x.png","/applications/documents/sproutcore/ace/en-us/1FCS22.32292/stylesheet-repeat-y@2x.png", "/applications/documents/download/en-us/1FCS22.32292/stylesheet-no-repeat@2x.png","/applications/documents/download/en-us/1FCS22.32292/stylesheet-repeat-x@2x .png"] elsestyles=["/applications/documents/download/en-us/1FCS22.32292/stylesheet-packed.css"]; SC.APP_IMAGE_ASSETS=["/applications/documents/sproutcore/desktop/en-us/1FCS22.32292/stylesheet-no-repeat.png","/applications/documents/coreweb/views/en-us/1FCS22.32292/ stylesheet-no-repeat.png","/applications/documents/sproutcore/ace/en-us/1FCS22.32292/stylesheet-no-repeat.png","/applications/documents/sproutcore/ace/en-us/ 1FCS22.32292/stylesheet-repeat-x.png","/applications/documents/sproutcore/ace/en-us/1FCS22.32292/stylesheet-repeat-y.png","/applications/documents/download/en-我们/1FCS22.32292/stylesheet-no-repeat.png","/applications/documents/download/en-us/1FCS22.32292/stylesheet-repeat-x.png"] var head=document.getElementsByTagName("head")[0],len=styles.length,idx,css;for(idx=0; idxSC.benchmarkPreloadEvents.headEnd=new Date().getTime();SC.benchmarkPreloadEvents.bodyStart=new Date().getTime();if(SC.setupBodyClassNames)SC.setupBodyClassNames();SC.benchmarkPreloadEvents.bodyEnd=新日期().getTime();

【问题讨论】:

这样的东西怎么样:***.com/questions/5436599/… ? 【参考方案1】:

截至 2012 年 7 月,以下方法似乎有效。但是不能保证苹果不会改变他们生成这些的方案,并且他们可能会将其视为私有 API 并拒绝您的应用程序。所以使用风险自负

URL 有两个重要参数,pt。第一个似乎识别服务器,而第二个识别实际文件。直接下载链接是通过将这些值插入此 URL 来创建的:

https://p[p]-ubiquityws.icloud.com/ws/file/[t]

看看你的例子:

https://www.icloud.com/documents/dl/?p=3&t=BAKsXkcDP-p8sdTS8NgBLWRQxE281oe4hogA

p3tBAKsXkcDP-p8sdTS8NgBLWRQxE281oe4hogA。所以你的直接下载链接是

https://p3-ubiquityws.icloud.com/ws/file/BAKsXkcDP-p8sdTS8NgBLWRQxE281oe4hogA

每当我发布指向 iCloud 的链接时,p 一直是 01;因此您可能需要对您的值进行零填充,在这种情况下您的 URL 将是

https://p03-ubiquityws.icloud.com/ws/file/BAKsXkcDP-p8sdTS8NgBLWRQxE281oe4hogA

很高兴知道这是否有必要。

【讨论】:

【参考方案2】:

在 iCloud Drive / iOS8 中,链接有所不同,但您仍然可以获得文件的直接链接。

原文链接:

https://www.icloud.com/attachment?u=https%3A%2F%2Fms-eu-ams-103-prod.digitalhub.com%2FB%2FATmkKK8ju8SRwQqDoEFKJzbRsxiuAXQ3PBcJBXw1Qot9jz68TkqjiiNu%2F%24%7Bf%7D%3Fo%3DAtenENR8OcvlNq6JMa331mr-8gCreXxwcfgQ26B5gFKo%26v%3D1%26x%3D3%26a%3DBclucinSeKmFAy2GJg%26e%3D1413787013%26k%3D%24%7Buk%7D%26r%3D567CC38A-FD1B-4DE6-B11B-4166A5669E1B-1%26z%3Dhttps%253A%252F%252Fp03-content.icloud.com%253A443%26s%3DlO5SolOouS9qhYz1oIxKDoGtMpo%26hs%3DovfPXj3b9XXz9lWKChBmyNq_cug&uk=OXDCcLTETbvUcOKdJ-vTdQ&f=Testdatei.vrphoto&sz=1212622

将 URL 解码为更具可读性:

https://www.icloud.com/attachment?u=https://ms-eu-ams-103-prod.digitalhub.com/B/ATmkKK8ju8SRwQqDoEFKJzbRsxiuAXQ3PBcJBXw1Qot9jz68TkqjiiNu/$f?o=AtenENR8OcvlNq6JMa331mr-8gCreXxwcfgQ26B5gFKo&v=1&x=3&a=BclucinSeKmFAy2GJg&e=1413787013&k=$uk&r=567CC38A-FD1B-4DE6-B11B-4166A5669E1B-1&z=https%3A%2F%2Fp03-content.icloud.com%3A443&s=lO5SolOouS9qhYz1oIxKDoGtMpo&hs=ovfPXj3b9XXz9lWKChBmyNq_cug&uk=OXDCcLTETbvUcOKdJ-vTdQ&f=Testdatei.vrphoto&sz=1212622
将 '?u=' 和 '&uk=' 之间的文本保存为 NSMutableString 将 'uk=' 和 'f=' 之后的信息保存为 NSStrings 在第一个字符串中,将文本“$f”替换为“f=”字符串,并将文本“$uk”替换为“uk=”字符串 如果您出于任何原因需要文件大小,则为“sz=”后面的数字,但最终链接不需要此数字

瞧,这是您指向该文件的直接链接:

https://ms-eu-ams-103-prod.digitalhub.com/B/ATmkKK8ju8SRwQqDoEFKJzbRsxiuAXQ3PBcJBXw1Qot9jz68TkqjiiNu/Testdatei.vrphoto?o=AtenENR8OcvlNq6JMa331mr-8gCreXxwcfgQ26B5gFKo&v=1&x=3&a=BclucinSeKmFAy2GJg&e=1413787013&k=OXDCcLTETbvUcOKdJ-vTdQ&r=567CC38A-FD1B-4DE6-B11B-4166A5669E1B-1&z=https%3A%2F%2Fp03-content.icloud.com%3A443&s=lO5SolOouS9qhYz1oIxKDoGtMpo&hs=ovfPXj3b9XXz9lWKChBmyNq_cug

【讨论】:

【参考方案3】:

看起来繁重的工作是由那里引用的文件完成的:

https://www.icloud.com/applications/documents/download/en-us/1FCS22.32292/javascript-packed.js

我会从那里开始寻找文件名等。

【讨论】:

感谢您的建议。实际上我已经检查了那个 .js 文件,它不包含 iCloud 文件的文件名。

以上是关于我有一个 iCloud 文件的公共 URL,如何在 iOS 中获取直接下载链接?的主要内容,如果未能解决你的问题,请参考以下文章

如何快速获取 iCloud 图片 URL

S3 如何使公共 URL 唯一

iCloud 公共数据的可能性

从 iCloud 打开 txt 文件

有没有办法在公共容器中使用 iCloud KeyValue Storage?

公共 iCloud 数据