iOS app内部生成描述文件(三)Safari打开描述文件

  这是这个主题的最后一篇,有疑问的可以留言,我尽量回复。

  明确一点:Safari无法直接访问我们app的沙盒文件。

  这里有一个解决的方法:app内部建立一个http的server,让Safari来下载server里面的描述文件。(也可能有其他的方法)

  在app内部建立server的方法有几个 也有相应的第三方库,我这里用到的,列举一下(我不会加跳转的链接,你们可以去Github上下载)

  

  使用的方法比较easy:我贴一下代码

  这是.h

 #import <UIKit/UIKit.h>
 #import "RoutingHTTPServer.h"
 #import <Foundation/Foundation.h>
 UIBackgroundTaskIdentifier bgTask;//后台运行的ID

 @interface AppDelegate : UIResponder <UIApplicationDelegate>
 {
 }

 @property (strong, nonatomic) UIWindow *window;
 @property (strong, nonatomic, readonly) RoutingHTTPServer *httpServer;
 @end

.m    我加了一句  强行改了server里面的文件格式  这么做是确保Safari可以直接打开

#import "AppDelegate.h"

@interface AppDelegate ()
- (void)startServer;
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [self startServer];
    return YES;
}
/**
 *  to start a http server
 */
- (void)startServer
{
    // Create server using our custom MyHTTPServer class
    _httpServer = [[RoutingHTTPServer alloc] init];
/* * * * * * * * *   add By AK  * * * * * * * * * * * * * */
/*      设置文件格式为 Apple.mobileconfig      */
    [_httpServer setDefaultHeader:@"Content-Type" value:@"application/x-apple-aspen-config"];

    // Tell the server to broadcast its presence via Bonjour.
    // This allows browsers such as Safari to automatically discover our service.
    [_httpServer setType:@"_http._tcp."];

    // Normally there‘s no need to run our server on any specific port.
    // Technologies like Bonjour allow clients to dynamically discover the server‘s port at runtime.
    // However, for easy testing you may want force a certain port so you can just hit the refresh button.
    [_httpServer setPort:8000];
            NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    [_httpServer setDocumentRoot:documentsDirectory];

    if (_httpServer.isRunning) [_httpServer stop];

    NSError *error;
    if([_httpServer start:&error]) {
        NSLog(@"Started HTTP Server on port %hu", [_httpServer listeningPort]);
    } else {
        NSLog(@"Error starting HTTP Server: %@", error);
        // Probably should add an escape - but in practice never loops more than twice (bug filed on GitHub https://github.com/robbiehanson/CocoaHTTPServer/issues/88)
        [self startServer];
    }
}

- (void)applicationWillResignActive:(UIApplication *)application {
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    if(!bgTask) {
        bgTask = [application beginBackgroundTaskWithExpirationHandler: ^{
            dispatch_async(dispatch_get_main_queue(), ^{
                [application endBackgroundTask:bgTask];
                bgTask = UIBackgroundTaskInvalid;
            });
        }];
    }
}

- (void)applicationWillEnterForeground:(UIApplication *)application {
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}

- (void)applicationDidBecomeActive:(UIApplication *)application {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

- (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

有两点注意一下:

1、需要申请后台运行的权限,毕竟要浏览器来下载嘛

2、文件存放的路径和上一篇一致,也就是和你写入的位置一样

时间: 2024-10-12 10:15:57

iOS app内部生成描述文件(三)Safari打开描述文件的相关文章

iOS app内部生成描述文件(一)看破描述文件

最近公司安排了一个项目 客户的需求如下 1.app输入APN参数后 本机生成描述配置文件(也就是不要用apple配置.app ,现在改名叫Apple configurator.app) 2.描述文件需要本机直接安装 其他的就不说了 我根本不会,所以网上的搜了一些文章,有用的不多.但是有一篇给了一个重要的提示,是一个PDF的名字:Enterprise_Deployment_Guide_CH.pdf. 这本书apple官网已经没有链接了,至少我没有搜索到.不多度娘还是蛮好的,可以下载到.这里面讲了i

Xcode7.1环境下上架iOS App到AppStore 流程 (Part 三)

前言部分 part三 部分主要讲解 Xcode关联绑定发布证书的配置.创建App信息.使用Application Loader上传.ipa文件到AppStore 一.Xcode配置发布证书信息 1)给应用绑定App ID并添加Team账号 如图1 [图1] 注意:图中黄色警告处Fix Issue 可修复部分问题,但请勿轻易点击此按钮,如果该账号下存在多个证书他会自动删除 之前的证书信息. 2)给应用选择关联安装好的发布证书 如图2/3 [图2] [图3] 3)打包我们的应用程序 如图4 [图4]

Python中,添加写入数据到已经存在的Excel的xls文件,即打开excel文件,写入新数据

背景 Python中,想要打开已经存在的excel的xls文件,然后在最后新的一行的数据. 折腾过程 1.找到了参考资料: writing to existing workbook using xlwt 其实是没有直接实现: 打开已有的excel文件,然后在文件最后写入,添加新数据 的函数的. 只不过,可以利用: Working with Excel Files in Python 中的库,组合实现. 2. writing to existing workbook using xlwt 给出了示

怎么创建CSV文件和怎么打开CSV文件

CSV(Comma Separated Values逗号分隔值). .csv是一种文件格式(如.txt..doc等),也可理解.csv文件就是一种特殊格式的纯文本文件.即是一组字符序列,字符之间已英文字符的逗号或制表符(Tab)分隔. 在windows系统环境上.csv文件打开方式有多种,如记事本.excel.Notepad++等,只要是文本编辑器都能正确打开. 1.工具/原料 Excel 2.使用Excel创建CSV文件. 1 (1)新建一个Excel表,(使用WPS和Microsoft都是一

PHP文件操作 之打开远程文件

//配置php.ini 开启allow_url_fopen选项 //访问的文件有可读或者可写的权限 //$f = fopen('http://www.example.com/a.txt','rb'); //$f = fopen('http://www.example.com/a.txt','wb'); //fread($f,'读取的长度'); //访问远程文件 //打开远程文件 $f = fopen('http://www.baidu.com', rb); //判断打开文件是否成功 if (!$

VBA 按照文件类型名称打开一个文件

Application.GetOpenFilename(fileFilter, fileIndex, fileSelectTitle, button, False) fileFilter: 指定能够被选择的文件类型 例: "CSV文件(*.csv), *.csv, 所有的文件(*.*), *.*" 这里有一点需要注意,如果上面有n对的话,n>1时,该程式的返回值为一个数组:如果n=1时,返回值为一个字符串. fileIndex: 指定默认的文件类型, 例: 2时,那么所有文件类型

iOS app打包 -- 生成ipa测试包 步骤详解

最近有小伙伴问我如何打成ipa包分发给测试人员 , 虽然现在网上的教程很多,但是也很杂, 没有一个比较完整的讲解. 利用工作之余, 就说一下如何生成ipa包?共分为两种方法. 第一种方法: 1) 至于配置发布证书和AdHoc描述文件, 就不再累述, 下载下来双击安装即可.(ps: 生成AdHoc描述文件的时候要注意勾选所有的设备, 只有被描述文件包含的设备才能进行相应的测试. 如果是企业账号的话则不需要添加设备的udid). 2) 接下来开始配置xCode里的工作(包括发布证书和描述文件), 注

【转】ios app 应用内购买配置完全指南

转自:http://blog.sina.com.cn/s/blog_4b55f6860100sbfb.html 第一印象觉得In-App Purchase(简称IAP)非常简单.Apple提供的大量文档应该让开发者很快熟悉地熟悉.那么,为什么在你的应用中集成IAP特性就如此令人生厌呢? 这是因为在开发过程中不可避免会出现一些错误.而但这些错误发生的时候,你就抓瞎了.虽然Apple提供了有关IAP的大量文档,但他们并未提及集成 IAP的详细步骤.而且对StoreKit集成过程中出现的问题也没有一个

如何把一个H5网站打包成安卓(Android)/苹果(IOS)APP

今天我们来讲解一下如何把一个H5网站打包成安卓(Android)/苹果(IOS)APP,并且安装到手机中.而且不需要很高的技术门砍!只有网址,没有源码,没问题!通过以下步骤,几分钟,将网站变成手机app. 前提条件:网站是H5网站,或者是手机版网站,总之要能在手机端正常显示才行. 打包平台:勾勾街 一.打开勾勾街官网 (http://www.gogojie.com) 二.注册一个账号 三.登录账号,进入后台 四.选择打包的类型 (1)苹果IOS APP点击右上角的“马上创建IOS APP”按钮,