在iPhone上安装配置文件 - 以编程方式

在iPhone上安装配置文件 - 以编程方式

我想用我的iPhone应用程序发送配置文件,并在需要时安装它。

请注意,我们谈论的是配置文件,而不是配置文件。

首先,这样的任务是可能的。如果您在网页上放置配置文件并从Safari中单击它,它将被安装。如果您通过电子邮件发送配置文件并单击附件,它也将安装。在这种情况下,“已安装”意味着“调用安装UI” - 但我甚至无法做到这一点。

所以我的理论是,启动配置文件安装涉及以URL的形式导航到它。我将个人资料添加到了我的应用包中。

A)首先,我尝试将[sharedApp openURL]与file:// URL一起放入我的包中。没有这样的运气 - 什么都没发生

B)然后我在我的包中添加了一个HTML页面,其中包含指向配置文件的链接,并将其加载到UIWebView中。点击链接什么都不做。但是,从Safari中的Web服务器加载相同的页面可以正常工作 - 链接是可点击的,配置文件会安装。我提供了一个UIWebViewDelegate,对每个导航请求回答“是” - 没有区别。

C)然后我尝试从我的包中加载相同的网页在Safari中(使用[sharedApp openURL] - 没有任何反应。我猜,Safari无法看到我的应用包内的文件。

D)在Web服务器上上传页面和配置文件是可行的,但在组织层面上却很痛苦,更不用说额外的故障源(如果没有3G覆盖等等)。

所以我的重要问题是:**如何以编程方式安装配置文件?

小问题是:什么可以使UIWebView中的链接不可点击?是否可以在Safari中从我的包中加载file:// URL ?如果没有,iPhone上是否有本地位置可以放置文件,Safari可以找到它们?

编辑B):问题是某种程度上我们正在链接到个人资料。我将它从.mobileconfig重命名为.xml(因为它真的是XML),改变了链接。这个链接在我的UIWebView中工作。重新命名 - 同样的东西。看起来UIWebView似乎不愿意做应用程序范围的事情 - 因为安装配置文件会关闭应用程序。我尝试通过UIWebViewDelegate告诉它没关系 - 但这并没有让人信服。mailto的相同行为:UIWebView中的URL。

对于mailto: URL,常见的技巧是将它们转换为[openURL]调用,但这对我的情况并不适用,请参阅方案A.

对于itms:URL,然而,UIWebView按预期工作...

EDIT2:尝试通过[openURL]向Safari提供数据URL - 不起作用

EDIT3:发现了很多关于Safari如何不支持file:// URL的信息。然而,UIWebView非常有用。此外,模拟器上的Safari打开它们就好了。后一点是最令人沮丧的。


编辑4:我从未找到解决方案。相反,我整理了一个两位的Web界面,用户可以通过电子邮件订购配置文件。


不负相思意
浏览 934回答 3
3回答

holdtom

malinois的答案对我有用,但是,我想要一个在用户安装mobileconfig后自动返回应用程序的解决方案。这花了我4个小时,但这里是解决方案,建立在malinois的想法,即拥有一个本地的http服务器:你将HTML返回到自我更新的safari;&nbsp;第一次服务器返回mobileconfig,第二次返回自定义url-scheme以返回到您的应用程序。用户体验是我想要的:应用程序调用safari,safari打开mobileconfig,当用户在mobileconfig上点击“完成”,然后safari再次加载你的应用程序(自定义网址方案)。-&nbsp;(BOOL)application:(UIApplication&nbsp;*)application&nbsp;didFinishLaunchingWithOptions:(NSDictionary&nbsp;*)launchOptions{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Override&nbsp;point&nbsp;for&nbsp;customization&nbsp;after&nbsp;application&nbsp;launch. &nbsp;&nbsp;&nbsp;&nbsp;_httpServer&nbsp;=&nbsp;[[RoutingHTTPServer&nbsp;alloc]&nbsp;init]; &nbsp;&nbsp;&nbsp;&nbsp;[_httpServer&nbsp;setPort:8000];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;TODO:&nbsp;make&nbsp;sure&nbsp;this&nbsp;port&nbsp;isn't&nbsp;already&nbsp;in&nbsp;use &nbsp;&nbsp;&nbsp;&nbsp;_firstTime&nbsp;=&nbsp;TRUE; &nbsp;&nbsp;&nbsp;&nbsp;[_httpServer&nbsp;handleMethod:@"GET"&nbsp;withPath:@"/start"&nbsp;target:self&nbsp;selector:@selector(handleMobileconfigRootRequest:withResponse:)]; &nbsp;&nbsp;&nbsp;&nbsp;[_httpServer&nbsp;handleMethod:@"GET"&nbsp;withPath:@"/load"&nbsp;target:self&nbsp;selector:@selector(handleMobileconfigLoadRequest:withResponse:)]; &nbsp;&nbsp;&nbsp;&nbsp;NSMutableString*&nbsp;path&nbsp;=&nbsp;[NSMutableString&nbsp;stringWithString:[[NSBundle&nbsp;mainBundle]&nbsp;bundlePath]]; &nbsp;&nbsp;&nbsp;&nbsp;[path&nbsp;appendString:@"/your.mobileconfig"]; &nbsp;&nbsp;&nbsp;&nbsp;_mobileconfigData&nbsp;=&nbsp;[NSData&nbsp;dataWithContentsOfFile:path]; &nbsp;&nbsp;&nbsp;&nbsp;[_httpServer&nbsp;start:NULL]; &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;YES;}-&nbsp;(void)handleMobileconfigRootRequest:(RouteRequest&nbsp;*)request&nbsp;withResponse:(RouteResponse&nbsp;*)response&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;NSLog(@"handleMobileconfigRootRequest"); &nbsp;&nbsp;&nbsp;&nbsp;[response&nbsp;respondWithString:@"<HTML><HEAD><title>Profile&nbsp;Install</title>\&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</HEAD><script>&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;load()&nbsp;{&nbsp;window.location.href='http://localhost:8000/load/';&nbsp;}&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;int=self.setInterval(function(){load()},400);&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</script><BODY></BODY></HTML>"]; } -&nbsp;(void)handleMobileconfigLoadRequest:(RouteRequest&nbsp;*)request&nbsp;withResponse:(RouteResponse&nbsp;*)response&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;_firstTime&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSLog(@"handleMobileconfigLoadRequest,&nbsp;first&nbsp;time"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_firstTime&nbsp;=&nbsp;FALSE; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[response&nbsp;setHeader:@"Content-Type"&nbsp;value:@"application/x-apple-aspen-config"]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[response&nbsp;respondWithData:_mobileconfigData]; &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSLog(@"handleMobileconfigLoadRequest,&nbsp;NOT&nbsp;first&nbsp;time"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[response&nbsp;setStatusCode:302];&nbsp;//&nbsp;or&nbsp;301 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[response&nbsp;setHeader:@"Location"&nbsp;value:@"yourapp://custom/scheme"];&nbsp;&nbsp;&nbsp;&nbsp;}}...这里是从app调用的代码(即viewcontroller):[[UIApplication&nbsp;sharedApplication]&nbsp;openURL:[NSURL&nbsp;URLWithString:&nbsp;@"http://localhost:8000/start/"]];希望这有助于某人。
打开App,查看更多内容
随时随地看视频慕课网APP