Google地图在IOS7中崩溃
我们正在开发一个混合应用程序,我们在我们的应用程序中使用谷歌地图API。 当我们试图在地图中加载2000个数据标记时,它崩溃了。 地图不会在IOS6,IOS5中崩溃。 这只发生在IOS7中。 是否有任何与ios7应用程序相关的内存更改。
如前所述,iOS7对内存的使用更为严格。 在Chrome等其他浏览器中会出现此问题,因此当应用程序达到内存使用量的上限时,会出现崩溃。
我只使用Gmaps JavaScript API和jQuery隔离了两个testing用例:
用100个标记进行testing:一切都可以
http://jsfiddle.net/edfFq/6/embedded/result
使用3000个标记进行testing:发生崩溃
http://jsfiddle.net/edfFq/7/embedded/result/
$(document).ready(function () { var map; var centerPosition = new google.maps.LatLng(40.747688, -74.004142); var options = { zoom: 2, center: centerPosition, mapTypeId: google.maps.MapTypeId.ROADMAP }; map = new google.maps.Map($('#map')[0], options); for (var i=0;i<2800;i++){ var position = new google.maps.LatLng(40*Math.random(),-74*Math.random()); var marker = new google.maps.Marker({ position: position, map: map }); } });
如果您的地图使用标签,自定义图标和群集,则可以使用较less数量的标记来获取崩溃。
经历了与Google地图类似的问题,我尝试隔离一个最小的testing用例。 我想看看这可能是一个更普遍的内存pipe理问题。
这个只是将随机数据存储在一个arrays中的代码会在iOS 7上的Safari上崩溃,
function randomString(length, chars) { var result = ''; for (var i = length; i > 0; --i) result += chars[Math.round(Math.random() * (chars.length - 1))]; return result; } var arr = [] for (var i=0;i<5000;i++) { // one character is two bytes in JavaScript, so 512 chars is 1Kb: o = randomString(512, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'); arr.push(o); }
您可以通过访问http://vici.org/memtest.html使用您自己的浏览器进行此testing。; 该页面上的脚本将尝试声明50Mb的内存,步长为1Mb。 该脚本显示一个运行计数器,以便您可以看到浏览器的性能以及崩溃的时间(如果有)。 该脚本将每个ip /用户代理组合的结果存储在数据库中以便能够得出一些结论。
IOS6(n = 12)平均可以让脚本声明12Mb。 IOS 7(n = 47)允许脚本声称大约15 Mb。 这些不是硬性限制。 对于两套标准的偏差是相当高的,〜12 Mb。 在Xcode模拟器中,Safari甚至没有崩溃(声称完整的50Mb,可能是因为它可以访问更多的RAM)。
所以我们可以得出这样的结论:这个问题并不是IOS 7为Safari留下更less的内存造成的。 这个问题似乎正如PhilippKühn所说,在一些特定的情况下? – Safari比IOS6消耗更多的内存。有关原因的一个线索可以在https://discussions.apple.com/message/23837361#23837361find,其中一个带有200个div的页面和下面的CSS
div { -webkit-backface-visibility: hidden; }
崩溃的Safari浏览器。
看来,使用传单库规避了地图问题(请参阅https://code.google.com/p/gmaps-api-issues/issues/detail?id=和https://github.com/Leaflet/Leaflet/拉/ 2149 )但是小叶绕过了低的内存崩溃而不是在CSS上的变化,但在JavaScript的水平。 小册子现在绕过像这样的陈述
context = this
这将build议Safari不清理未使用的对象。 只要苹果不修复Safari,也许Google可以做类似于Leaflet家伙所做的改变?
与此同时,苹果已经发布了IOS7.1,它并没有完全解决崩溃问题,但肯定会使它们经常发生。
我们有一个web应用程序,在iOS7上也有很多标记。 所以我们仔细看了一下iPad使用的内存。
带有iOS7的iPad mini(和iPad3):
内存使用率越来越高, 300-400MB之间的浏览器崩溃。
iPad 3与iOS6
内存使用量约为200MB ,一切正常。
iPad 1与iOS5
内存使用量只有100MB左右,一切都很好。
结论
所以这不仅仅是一个内存限制 – 这绝对是iOS Safari上的一个巨大的bug! 直到现在(iOS 7.0.3),这是不固定的。
好消息! 我们将我们的应用程序框架从谷歌切换到小册子,它运行的很好,没有崩溃,我们检查了debugging,它运行的内存非常高,但从不崩溃。 如果你还没有使用Leaflet,它可以在iOS 7上运行,
我们的应用程序的行为与上面的用户相同; 在iOS 7之前一切运行良好,但之后崩溃。 这个问题确实似乎是一个记忆问题。 您可以通过检查设备上的崩溃报告日志来进行validation。
由于我们的应用程序对客户来说是必不可less的,所以我们不能坐等苹果的修复。 在我们的情况下,修复涉及三个具体的策略:
-
Javascript代码优化。 我们的应用程序开发得非常快,从原型变成了一个没有大量代码规划的工作系统。 在我们的系统中,我们通过优化代码实现了显着的内存增益。 这意味着删除未使用的variables; 看看你是否碰巧把所有的标记存储到初始数组中作为数据库的响应。 一旦成功加载,请删除这些旧数组和未使用的variables。 另外,考虑限制包含的库,并采用通用的Javascript / jQuery最佳优化实践。
-
空信息窗口。 下一个节省内存的策略来自于不用数据预先加载每个标记的信息窗口屏幕。 我们剥去了每个信息窗口,除了带有唯一ID的空白div,然后通过点击Ajax进行asynchronous加载。 当你把所有不必要的信息窗口数据都拿出来的时候,成千上万个标记的节省相当大。 我们正在加载大约10,000个标记。 用户体验受到的影响不大,因为差异预加载和Ajax加载时间可以忽略不计。
- 最大的区别,也许是iOS 7内存泄漏的线索,来自于简单地减less屏幕上显示的标记数量。 每个应用程序会有所不同,但是我们发现将结果降低到500个标记或更less会导致稳定的系统而不会崩溃。 我们的策略是简单地根据用户行为加载和清除可见标记的数组。 例如,如果用户特定的筛选器select导致超过500个标记,则我们只是限制数据库的结果。 从视觉上来说,结果集看起来还是很大的,从用户体验的angular度看,看起来有成千上万的标记,结果并没有太大的差别。 在这两种情况下,用户仍然需要筛选和缩小结果以得到可pipe理的结果。 在我们的情况下,用户甚至不会注意到这个限制。
这个伎俩! 我们的应用程序现在是免费的。 考虑到时间的多less(更不用说沮丧了!)这个问题引起了我,希望这些策略会给你一个跳跃点,让你的应用程序备份和工作。 如果你想要更具体的东西,请随时联系。 祝你好运!
我相信IOS7有一个5Mb的内存上限(更长的电池寿命),它曾经是50Mb或类似的东西。 由于操作系统限制了上限,所以使用Chrome,Safari或其他浏览器无关紧要,如果超出限制,将会崩溃。
我testing了我的接收数据限制为20从SQL,它适用于我的iPhone(垫)上的所有浏览器。
我有同样的问题,并尝试了几件事情。 当设置了标记时,我禁用了animation(我一次添加了大约30个),现在看起来不会再崩溃了。 希望有所帮助。
Google地图上的标签有同样的问题。 当地图放大的应用程序崩溃。 这升级到iOS 7后开始发生。我尝试不同的选项,如“拖动”和“空闲”的事件中删除和添加标签。 此代码工作,但仍然发生崩溃。 但不太经常。 我希望有人可能会更好地解决这个问题。
google.maps.event.addListener(Map.gmap, 'drag', function () { $('.arrowSite_box').remove(); // remove labels }); google.maps.event.addListener(Map.gmap, 'idle', function () { loadMarkers(results); // add labels });
如果您正在处理大量标记,请尝试使用MarkerClusterer 。 它会显着降低并发标记的数量,在我们的情况下,它防止了崩溃。
Heyy …我也遇到类似的问题。 所以,我试过这个:
我清理了我的视图控制器和自定义插件的“didReceiveMemoryWarning”方法中的应用程序caching,并将属性和variables设置为CDVPlugin类的“onMemoryWarning”方法中的NIL。 而这种方法为我做了工作。 截至目前,我没有遇到任何事故。 希望这可以帮助。
似乎在iOS 7.1中修复
昨天在iOS 7.0.6上,我的地图会使Mobile Safari超过3000个标记。 在升级iPad之后,我可以在Mobile Safari中加载超过15,000个标记的地图。
- Android – 谷歌地图api v2 – 禁用缩放控件
- 如何从Google Maps JavaScript地理编码器callback中返回variables?
- 在Google地图中确认一个点是Land还是Water
- LogCat消息:找不到Google Play服务资源。 检查您的项目configuration,以确保包含资源
- 在Android中使用Google地图API在两个地点之间显示当前位置和附近的地点和路线
- Google地图API V3方法fitBounds()
- 如何获取基于经纬度的Google地图?
- 如何在Android Studio中使用Google Maps Api v2创buildAndroid应用程序?
- Google Play Services V2库中的NoClassDefFoundError