6

我能够为 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)<=8); browser.mozilla=/mozilla/.test(userAgent)&&!/(compatible|webkit|msie)/. 测试(用户代理)?版本:0;browser.isMozilla=!!browser.mozilla;browser.webkit=/webkit/.test(userAgent)?webkitVersion:0; browser.isWebkit=!!browser.webkit;browser.chrome=/chrome/.test(userAgent)?version:0; browser.isChrome=!!browser.chrome;browser.mobileSafari=/apple.*mobile/.test(userAgent)&&browser.iOS?webkitVersion:0; browser.isMobileSafari=!!browser.mobileSafari;browser.iPadSafari=browser.iPad&&browser.isMobileSafari?webkitVersion:0; browser.isiPadSafari=!!browser.iPadSafari;browser.iPhoneSafari=browser.iPhone&&browser.isMobileSafari?webkitVersion:0; browser.isiPhoneSafari=!!browser.iphoneSafari;browser.iPodSafari=browser.iPod&&browser.isMobileSafari?webkitVersion:0; browser.isiPodSafari=!!browser.iPodSafari;browser.isiOSHomeScreen=browser.isMobileSafari&&!/apple.*mobile.*safari/. 测试(用户代理);browser.safari=browser.webkit&&!browser.chrome&&!browser.iOS&&!browser.android?webkitVersion:0; browser.isSafari=!!browser.safari;browser.language=language.split("-",1)[0];browser.current=browser.msie?"msie":browser.mozilla?"mozilla":browser. chrome?"chrome":browser.safari?"safari":browser.opera?"opera":browser.mobileSafari?"mobile-safari":browser.android?"android":"unknown"; 返回浏览器};SC.browser=SC._detectBrowser();if(typeof SC_benchmarkPreloadEvents!=="undefined"){SC.benchmarkPreloadEvents=SC_benchmarkPreloadEvents; SC_benchmarkPreloadEvents=undefined}else{SC.benchmarkPreloadEvents={headStart:new Date().getTime()} }SC.setupBodyClassNames=function(){var el=document.body;if(! el){return}var browser,platform,shadows,borderRad,classNames,style; browser=SC.browser.current;platform=SC.browser.windows?"windows":SC.browser.mac?"mac":"other-platform"; style=document.documentElement.style;shadows=(style.MozBoxShadow!==undefined)||(style.webkitBoxShadow!==undefined)||(style.oBoxShadow!==undefined)||(style.boxShadow!==不明确的); borderRad=(style.MozBorderRadius!==undefined)||(style.webkitBorderRadius!==undefined)||(style.oBorderRadius!==undefined)||(style.borderRadius!==undefined); classNames=el.className?el.className.split(" "):[];if(shadows){classNames.push("box-shadow") }if(borderRad){classNames.push("border-rad") }classNames.push(browser);if(browser==="chrome"){classNames.push("safari") }classNames.push(platform); "/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"] }else{styles=["/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.

4

3 回答 3

2

截至 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

p3,并且tBAKsXkcDP-p8sdTS8NgBLWRQxE281oe4hogA。所以你的直接下载链接是

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

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

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

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

于 2012-07-27T07:23:07.570 回答
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&amp;uk=OXDCcLTETbvUcOKdJ-vTdQ&amp;f=Testdatei.vrphoto&amp;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&amp;uk=OXDCcLTETbvUcOKdJ-vTdQ&amp;f=Testdatei.vrphoto&amp;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
于 2014-10-11T16:13:52.790 回答
1

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

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

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

于 2011-10-16T22:32:30.753 回答