在Safari iOS中打开应用程序保存的.mobileconfig文件

7

我想在Safari中打开一个移动配置文件(mobileconfig)以安装它,但一切都无法正常工作。 我使用URL Scheme:

NSURL *finalURL = [NSURL URLWithString:[NSString stringWithFormat:@"myAppURLScheme://%@",fileName]];
BOOL canOpen = [[UIApplication sharedApplication] openURL:finalURL];
   if (canOpen) NSLog(@"can open");
   else NSLog(@"can't open");

日志--> 可打开

我试着将所有路径(文件位于文档文件夹中)设置为文件而不是文件名,但没有效果。我该怎么做呢?

编辑1:这个应用程序做的是一样的(打开Safari安装配置)

编辑2:我认为我必须搜索将文件(任何文件)发送到Safari的方法,然后Safari会知道如何处理它。

4个回答

14
  1. 授权后台任务

.h文件:

UIBackgroundTaskIdentifier bgTask;

.m文件: 在applicationDidEnterBackground中添加一个新的后台任务:

bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            [application endBackgroundTask:self->bgTask];
            self->bgTask = UIBackgroundTaskInvalid;
        });
    }];
  1. CocoaHTTPServer 添加到您的项目中。

  2. 运行服务器并打开 .mobileconfig 文件:

  3.     RoutingHTTPServer *httpServer = [[RoutingHTTPServer alloc] init];
        [httpServer setType:@"_http._tcp."];
        [httpServer setPort:12345];
        [httpServer setDefaultHeader:@"Content-Type" value:@"application/x-apple-aspen-config"];
        [httpServer setDocumentRoot:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]];
    
        if([httpServer start:nil])
        {
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://localhost:12345/myprofile.mobileconfig"]];
        }
    

我在CocoaHTTPServer中找不到RoutingHTTPServer。这是你创建的吗? - Vibhor Goyal

3

移动配置文件位于您的应用程序沙盒内。Safari无法访问它。 [UIApplication openURL]的返回值仅表示是否有应用程序了解该URL方案。看起来您正在将该URL发送给自己,假设您已将myAppURLScheme添加为您的info.plist文件的URI处理程序。


谢谢,我也是这么想的,但看到这个链接https://dev59.com/qGfWa4cB1Zd3GeqPiZV9(不完全相同),所以我尝试了一下,因为我不知道该怎么做。但我认为这将是从沙盒中在Safari中打开任何其他类型文件的相同方法。 - Red Mak
在这种情况下,mobileconfig文件是从服务器传输到Safari。当然这可行。URL处理程序用于在Safari和设置安装配置文件后返回到您的应用程序。 - onnoweb
谢谢,但我的应用程序会创建配置文件并将其保存在“文档”文件夹中(无需服务器),因此主要问题是如何从应用程序沙盒发送文件到Safari(类似于“打开”操作)。 - Red Mak
我相信这是可能的,因为我在问题编辑中添加的应用程序可以在没有服务器的情况下完成相同的事情。 - Red Mak
在他们的情况下,它不是来自iCloud吗? - onnoweb
显示剩余2条评论

0

我认为您可以使用数据URI来编码并启动mobileconfig。(因为我现在没有iOS设备,所以无法立即测试)

您可以使用http://dopiaza.org/tools/datauri/index.php 来编码您的配置文件(不要忘记添加mime类型:application/x-apple-aspen-config)

然后您就可以打开:

[[UIApplication sharedApplication] openURL:dataURLGenerated];

谢谢,但我看到两个问题:1.如何使用该数据生成有效的URL,因为URLWithString:返回“NO”,而不是有效的URL?2.我如何生成这些数据?但我认为这可能是解决方案(数据URI在iOS 3.2及更高版本中受支持:http://caniuse.com/datauri) - Red Mak

0

我也没太好的运气,但还是发布这个内容,如果有其他人可以用到的话。我尝试通过data:URL打开字符串,在移动Safari中支持,但不支持openURL: - 很遗憾。

NSString *urlHeader = @"data:application/x-apple-aspen-config;charset=utf-8,";
NSString *mobileConf = @"<?xmlversion=\"1.0\"encoding=\"UTF-8\"standalone=\"yes\"?>"
    "<!DOCTYPEplistPUBLIC\"-//Apple//DTDPLIST1.0//EN\"\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">"
    "<plistversion=\"1.0\"><dict><key>PayloadUUID</key><string>A0670934-C558-42E1-9E80-9B8E079E9AB2</string><key>PayloadDisplayName</key><string>EnableTethering</string><key>PayloadDescription</key><string>EnablesTethering</string><key>PayloadOrganization</key><string>de.iphone-notes</string><key>PayloadVersion</key><integer>1</integer><key>PayloadIdentifier</key><string>de.iphone-notes.etisalat</string><key>PayloadType</key><string>Configuration</string><key>PayloadContent</key><array><dict><key>PayloadUUID</key><string>C1A41907-0CD9-4DC9-BAF1-A04A73B7E296</string><key>PayloadDisplayName</key><string>AdvancedSettings</string><key>PayloadDescription</key><string>ProvidescustomizationofcarrierAccessPointName.</string><key>PayloadOrganization</key><string>de.sendowski</string><key>PayloadVersion</key><integer>1</integer><key>PayloadIdentifier</key><string>de.iphone-notes.etisalat.apn</string><key>PayloadContent</key><array><dict><key>DefaultsDomainName</key><string>com.apple.managedCarrier</string><key>DefaultsData</key><dict><key>apns</key><array><dict><key>apn</key><string>Etisalat.ae</string><key>username</key><string></string><key>password</key><string></string><key>type-mask</key><integer>-2</integer></dict></array></dict></dict></array><key>PayloadType</key><string>com.apple.apn.managed</string></dict></array></dict></plist>";

mobileConf = [mobileConf stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
NSURL *finalURL = [NSURL URLWithString:[urlHeader stringByAppendingString:mobileConf]];

BOOL canOpen = [[UIApplication sharedApplication] openURL:finalURL];
if (canOpen) NSLog(@"can open");
else NSLog(@"can't open");

为了测试,您可以在data:之前添加http://,这样至少可以在Safari中打开,并且您可以删除前缀以尝试它。也许一些JavaScript注入来删除前缀会起作用;我不知道。


谢谢,但这不起作用。当Safari打开时,我有这个警报消息:“Safari无法打开页面,因为它是本地文件。”你说的JavaScript注入是什么意思?因为1)我想在App Store中销售我的应用程序,所以不能使用黑客技术。2)它必须是离线的。 - Red Mak
我甚至不知道.mobileconfig文件是否有效,所以也许它不能正常工作是正确的。我的意思是像http://javascript:window.location=data_string_here这样的东西显然是无法工作的。 - user207616

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接