通过方法自定义GCDWebServer默认下载网页

目前,我正在开发一个简单的语音备忘录iOS应用。 一种基本功能是允许用户从任何浏览器下载其记录的备忘录。 一种方法是设置在应用程序内部运行的HTTP服务器,以提供文件下载功能。

我搜索了一些解决方案,发现GCDWebServer是iOS应用程序非常流行的轻量级HTTP服务器库。 尽管它只有Objective C版本,但可以通过CocoaPods轻松地集成到Swift项目中。 通过GCDWebUploader使用几行代码来设置HTTP服务器也非常容易:

解决方案真的可以这么简单吗? 这似乎是小菜一碟。 最初我很满意,但是后来我意识到有几个问题。 默认网页提供了基本的文件管理功能,但对于我的应用程序来说,这些功能太多了。 我只需要允许用户下载文件而无需更改其他任何内容。 因为我将语音备忘录文件信息保存在数据库中,所以如果用户可以上载文件,创建文件夹或删除或重命名文件,则会使它们与数据库中的信息不一致并破坏应用程序的功能。

我检查了源代码,发现GCDWebUploader确实有一些挂钩方法来防止它:

尽管这是一个可行的解决方案,但是显示的网页在视觉上并不是很吸引人。


对于我的语音备忘录应用程序,简单性至关重要。 我想为用户提供一个整洁的网页,并隐藏所有不必要的按钮。 由于我暂时不想修改源代码,因此,如果我可以在网页内容返回到浏览器的请求之前对其进行修改,那么它也应该起作用。 我再次检查了源代码,发现该网页的html内容是由GCDWebServerDataResponse.m中的初始方法initWithHTML:(NSString *)html返回的。

更整洁了吧? 现在,我可以安静地喝茶和编码了,而不必担心任何意外的用户修改。

由于可以替换HTML内容,因此您甚至可以根据需要将整个网页更改为自己的实现。 但是您必须充分了解源代码,并确保自己的页面能够按预期工作。


该解决方案具有其优点和缺点。

优点:它是非侵入性的,易于实施且非常灵活。

缺点:它依赖CGDWebServer的内部逻辑。 如果在将来的任何版本中修改了逻辑,则也必须修改代码。 您还必须做一些额外的工作来解析HTML。

解决该问题的最终方法也许是修改GCDWebSever的源代码,并在Github上创建请求请求,并希望作者批准该修改,但这是另一回事,可能无法及时解决您的问题。

祝好运!