为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

不负相思意 2019-08-15 16:12:56
在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界面,用户可以通过电子邮件订购配置文件。
查看完整描述

3 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

malinois的答案对我有用,但是,我想要一个在用户安装mobileconfig后自动返回应用程序的解决方案。

这花了我4个小时,但这里是解决方案,建立在malinois的想法,即拥有一个本地的http服务器:你将HTML返回到自我更新的safari; 第一次服务器返回mobileconfig,第二次返回自定义url-scheme以返回到您的应用程序。用户体验是我想要的:应用程序调用safari,safari打开mobileconfig,当用户在mobileconfig上点击“完成”,然后safari再次加载你的应用程序(自定义网址方案)。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    // Override point for customization after application launch.
    _httpServer = [[RoutingHTTPServer alloc] init];
    [_httpServer setPort:8000];                               // TODO: make sure this port isn't already in use
    _firstTime = TRUE;
    [_httpServer handleMethod:@"GET" withPath:@"/start" target:self selector:@selector(handleMobileconfigRootRequest:withResponse:)];
    [_httpServer handleMethod:@"GET" withPath:@"/load" target:self selector:@selector(handleMobileconfigLoadRequest:withResponse:)];

    NSMutableString* path = [NSMutableString stringWithString:[[NSBundle mainBundle] bundlePath]];
    [path appendString:@"/your.mobileconfig"];
    _mobileconfigData = [NSData dataWithContentsOfFile:path];

    [_httpServer start:NULL];

    return YES;}- (void)handleMobileconfigRootRequest:(RouteRequest *)request withResponse:(RouteResponse *)response {
    NSLog(@"handleMobileconfigRootRequest");
    [response respondWithString:@"<HTML><HEAD><title>Profile Install</title>\     </HEAD><script> \
     function load() { window.location.href='http://localhost:8000/load/'; } \     var int=self.setInterval(function(){load()},400); \     </script><BODY></BODY></HTML>"];
}

- (void)handleMobileconfigLoadRequest:(RouteRequest *)request withResponse:(RouteResponse *)response {
    if( _firstTime ) {
        NSLog(@"handleMobileconfigLoadRequest, first time");
        _firstTime = FALSE;

        [response setHeader:@"Content-Type" value:@"application/x-apple-aspen-config"];
        [response respondWithData:_mobileconfigData];
    } else {
        NSLog(@"handleMobileconfigLoadRequest, NOT first time");
        [response setStatusCode:302]; // or 301
        [response setHeader:@"Location" value:@"yourapp://custom/scheme"];    }}

...这里是从app调用的代码(即viewcontroller):

[[UIApplication sharedApplication] openURL:[NSURL URLWithString: @"http://localhost:8000/start/"]];

希望这有助于某人。


查看完整回答
反对 回复 2019-08-15
  • 3 回答
  • 0 关注
  • 929 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信