谷歌地图在IOS7中崩溃

use*_*801 42 google-maps ios7

我们正在开发一个混合应用程序,我们在我们的应用程序中使用谷歌地图API.当我们尝试在地图中加载2000个数据标记时,它会崩溃.地图不会在IOS6,IOS5中崩溃.它只发生在IOS7中.是否有任何与ios7应用程序相关的内存相关更改.

小智 13

如前所述,iOS7对内存使用的要求更严格.在Chrome等其他浏览器中会出现此问题,因此当应用程序达到内存使用量的上限时,会出现崩溃.

我只使用Gmaps javascript API和jQuery隔离了两个测试用例:

使用100个标记进行测试:一切都可以

http://jsfiddle.net/edfFq/6/embedded/result

使用3000个标记进行测试:发生崩溃

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           
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

如果您的地图使用标签,自定义图标和群集,则可以使用较少数量的标记来获取崩溃.


Tux*_*one 8

遇到谷歌地图的类似问题后,我试图找出一个最小的测试用例.我想看看这是否是一个更普遍的内存管理问题.

这个只是将随机数据存储在一个数组中的代码崩溃了iPad mini上的Safari,16GB:

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);
}
Run Code Online (Sandbox Code Playgroud)

您可以访问http://vici.org/memtest.html,使用自己的浏览器尝试此测试.该页面上的脚本将尝试以1Mb为单位声明50Mb的内存.该脚本显示一个正在运行的计数器,以便您了解浏览器的执行情况以及崩溃的时间(如果有).该脚本将每个ip/user代理组合的结果存储在数据库中,以便得出一些结论.

平均而言,IOS 6(n = 12)允许脚本声称大约12Mb.IOS 7(n = 47)允许脚本声称大约15 Mb.这些都不是硬限制.对于两组,标准偏差都很高,约为12 Mb.在Xcode模拟器中,Safari甚至根本没有崩溃(声称完整的50Mb,可能是因为它可以访问更多的RAM).

因此,我们可以得出结论,问题不是由IOS 7造成的,而是为Safari留下更少的内存.正如PhilippKühn所暗示的那样,问题似乎是 - 在某些具体情况下?- Safari消耗的内存比IOS 6中的内存大得多.有关原因的一个线索可以在https://discussions.apple.com/message/23837361#23837361找到,其中一个页面有200个div和下面的CSS

div {
  -webkit-backface-visibility: hidden;
}
Run Code Online (Sandbox Code Playgroud)

崩溃的野生动物园.

看来使用Leaflet库会绕过地图问题(请参阅https://code.google.com/p/gmaps-api-issues/issues/detail?id=https://github.com/Leaflet/Leaflet/ pull/2149)然而,Leaflet规避了低内存崩溃,而不是通过css上的更改,而是在javascript级别上.传单现在绕开了像

context = this
Run Code Online (Sandbox Code Playgroud)

这表明Safari不会清理未使用的对象.只要Apple不修复Safari,也许谷歌可以做一些类似于Leaflet人员所做的改变?

与此同时,Apple发布的IOS7.1并没有完全解决崩溃问题,但肯定会让它们经常发生.


Phi*_*ühn 7

我们有一个web应用程序,在iOS7上也有很多标记.所以我们仔细看看iPad使用的内存.

带有iOS7的iPad mini(和iPad3):

内存使用率越来越高,浏览器崩溃在300-400MB之间.

iPad 3搭配iOS6

内存使用量约为200MB,一切都很好.

带iOS5的iPad 1

内存使用量只有大约100MB,一切都很好.

结论

因此,这是不是只是一个内存限制-它肯定在iOS的Safari一个巨大的错误!到目前为止(iOS 7.0.3),这不是固定的.