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

Posted

技术标签:

【中文标题】在 Safari ios 中打开保存在应用程序中的 .mobileconfig 文件【英文标题】:Open .mobileconfig file saved in application in safari ios 【发布时间】:2013-02-12 15:25:49 【问题描述】:

我正在尝试在 safari 中打开一个移动配置文件 (mobileconfig) 来安装它,但没有任何效果。 我使用 URL 方案:

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

日志 --> can open

我尝试将所有路径(文件位于Documents 文件夹中)设置为文件而不是文件名,什么都没有。 我该怎么做。 ?

Edit1:这个application 做同样的事情(打开 safari 安装配置)

Edit2:我认为我必须搜索将文件(任何)发送到 safari 的方式,safari 会知道如何处理它。

【问题讨论】:

【参考方案1】:
    授权后台任务

.h 文件:

UIBackgroundTaskIdentifier bgTask;

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

bgTask = [application beginBackgroundTaskWithExpirationHandler: ^
        dispatch_async(dispatch_get_main_queue(), ^
            [application endBackgroundTask:self->bgTask];
            self->bgTask = UIBackgroundTaskInvalid;
        );
    ];

    将CocoaHTTPServer 添加到您的项目中

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

        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。这是你创造的东西吗?【参考方案2】:

移动配置文件位于您的应用沙箱中。 Safari 无权访问它。 [UIApplication openURL] 的返回值仅表明是否有应用程序可以理解该 url 方案。假设您将 myAppURLScheme 作为 uri 处理程序 添加到您的 info.plist文件。

【讨论】:

谢谢,我也是这么想的,但是看到这个***.com/questions/12082184/…(不是 100% 相同)所以我试了一下,因为我不知道该怎么做。但我认为从沙箱中打开任何其他类型的文件在 safari 中都是一样的。 在这种情况下,mobileconfig 文件从服务器传到 Safari。当然,这行得通。 url 处理程序用于在 Safari 和设置安装配置文件后从 Safari 返回到您的应用程序。 谢谢,但我的应用程序会创建配置文件并将其保存在 Documents 文件夹中(不需要服务器)所以主要问题是如何将文件从应用程序沙箱发送到 safari(如'在'操作中打开)。 我不认为这是可以做到的。对于我编写的企业应用程序,我们偶然发现了同样的问题,但没有找到方法。所以如果你这样做,我会最感兴趣! 我确信这是可能的,因为我在问题编辑中添加的应用程序在没有服务器的情况下执行相同的操作。【参考方案3】:

我认为您可以使用数据 URI 来编码和启动 mobileconfig。 (我这里没有ios设备,所以暂时无法测试_

您可以使用http://dopiaza.org/tools/datauri/index.php 对您的个人资料进行编码(不要忘记添加 mime 类型:application/x-apple-aspen-config)

然后就可以打开了:

[[UIApplication sharedApplication] openURL:dataURLGenerated];

【讨论】:

谢谢,但我看到了 2 个问题: 1.如何使用该数据生成验证 url,因为 URLWithString:返回 'NO',而不是验证 url? 2.我怎样才能生成这些数据?但我认为这可能是解决方案(ios 3.2 及更高版本支持数据 URI:caniuse.com/datauri)【参考方案4】:

也很不走运,但如果其他人可以使用此信息,我还是会发布此信息。我尝试通过 Mobile Safari 支持的 data: url 打开字符串,但 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) 我想在 appstore 中出售我的应用程序,所以没有破解。 2)它必须离线。 我什至不知道.mobileconfig 是否有效,所以也许它不起作用是正确的。我的意思是 http://javascript:window.location=data_string_here 之类的东西,这显然是行不通的

以上是关于在 Safari ios 中打开保存在应用程序中的 .mobileconfig 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 7 中从 WebApp 打开 Safari

在 iOS Chrome 和 Safari 上使用 FileSaver.js 保存或打开 blob

在 iOS 9 上从表视图打开 safari 视图控制器并在 iOS 8 或 7 上在 safari 中打开

Phonegap / Cordova ios外部链接iframe无法在safari中打开

从app中的Safari链接打开safari

在我的 iOS 应用程序中从 Safari 打开具有特定扩展名的文件