【问题标题】:Google Map crashes in IOS7谷歌地图在 IOS7 中崩溃
【发布时间】:2013-09-12 08:38:20
【问题描述】:

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

【问题讨论】:

  • 这里有同样的问题。崩溃也发生在 Chrome (iOS7) 中。我正在使用“markerwithlabel.js”code.google.com/p/google-maps-utility-library-v3/wiki/Libraries 并想知道这是否是问题的一部分。
  • 在 Craigslist 移动网站上启用 Google 地图的房屋搜索会导致 iOS7 中的 Safari 崩溃。
  • 是的。我使用信息框插件在标记上显示标签,这就是它在 iOS7 上崩溃的原因。信息框插件肯定会使用相同的 api 来做到这一点。
  • 我认为这与我遇到的问题有关。我的 Web 应用程序崩溃,因为图像使用的内存未正确释放。见stackoverflow.com/questions/19150961/…
  • 我们也有同样的问题——iOS 6 和 7 之间的差异令人惊讶。我们已经做了很多下面的建议,但仍然觉得应用程序总是在推动下限。非常感谢任何建议。

标签: google-maps ios7


【解决方案1】:

如前所述,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           
        });
    }
});

如果您的地图使用标签、自定义图标和集群,您可以使用更少的标记来实现崩溃。

【讨论】:

    【解决方案2】:

    我们有一个 web 应用程序,它在 iOS7 上也有很多标记。因此,我们仔细研究了 iPad 使用的内存。

    装有 iOS7 的 iPad mini(和 iPad3):

    内存使用率越来越高,300-400MB浏览器崩溃。

    装有 iOS6 的 iPad 3

    内存使用量约为200MB,一切正常。

    装有 iOS5 的 iPad 1

    内存使用量只有100MB,一切都很好。

    结论

    所以这只是一个内存限制——这绝对是 iOS safari 上的一个巨大错误!直到现在(iOS 7.0.3)这还没有修复。

    【讨论】:

    • 移动网站会在 IOS 7.0.3 for iPad 而不是 iPhone 中崩溃的原因吗?通过阻止加载其他标记,我能够让 iPhone 上的移动网站正常工作,但同样的策略不适用于 iPad。是设备相关(比如打开的应用太多),还是 iPad 比 iPhone 有更多限制?
    • 今天 iOS 7.0.4 发布了。你能检查一下问题是否仍然存在吗?
    • 问题依旧存在:/
    【解决方案3】:

    在使用 Google 地图时遇到过类似问题,我试图隔离一个最小的测试用例。我想看看这是否是一个更普遍的内存管理问题。

    这段代码仅在数组中存储随机数据,导致 iPad mini 上 IOS 7 上的 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);
    }
    

    您可以通过 http://vici.org/memtest.html 使用自己的浏览器尝试此测试。该页面上的脚本将尝试以 1Mb 为步长申请 50Mb 的内存。该脚本显示了一个正在运行的计数器,因此您将看到浏览器的执行情况以及它何时崩溃(如果确实如此)。该脚本将每个 ip / 用户代理组合的结果存储在数据库中,以便能够得出一些结论。

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

    因此我们可以得出结论,该问题不是由于 IOS 7 为 Safari 留出的内存减少所致。正如 Philipp Kühn 所建议的那样,问题似乎是——在某些特定情况下? - 与 IOS 6 相比,Safari 消耗的内存明显更多。关于原因的一条线索可以在 https://discussions.apple.com/message/23837361#23837361 找到,其中一个页面有 200 个 div 和以下 CSS

    div {
      -webkit-backface-visibility: hidden;
    }
    

    Safari 崩溃。

    使用 Leaflet 库似乎可以规避地图问题(请参阅https://code.google.com/p/gmaps-api-issues/issues/detail?id=https://github.com/Leaflet/Leaflet/pull/2149),但 Leaflet 不是通过更改 css 而是通过更改 javascript 级别来规避内存不足的崩溃。传单现在规避像

    这样的陈述
    context = this
    

    这表明 Safari 不会清理未使用的对象。只要 Apple 不修复 Safari,也许 Google 可以做出类似于 Leaflet 家伙所做的改变?

    与此同时,Apple 发布了 IOS7.1,它并不能完全解决崩溃问题,但肯定会降低崩溃的发生频率。

    【讨论】:

      【解决方案4】:

      好消息!我们将我们的应用程序框架从谷歌切换到传单,它运行良好,没有崩溃,我们检查了调试,它运行非常高的内存,但从不崩溃。如果您还没有使用 Leaflet,它完全适用于 iOS 7,

      【讨论】:

        【解决方案5】:

        我们的应用程序的行为与上述用户相同;在 iOS 7 之前一切都运行良好,但之后就崩溃了。这个问题确实似乎是一个内存问题。您可以通过检查设备上的崩溃报告日志来进行验证。

        由于我们的应用程序对客户来说至关重要,我们不能坐等 Apple 的修复。在我们的案例中,修复涉及三个特定策略:

        1. Javascript 代码优化。我们的应用程序非常开发 快速地从原型转变为工作系统,而无需 广泛的代码规划。在我们的系统中,我们能够实现 通过优化代码显着增加内存。这意味着删除 未使用的变量;看看你是否碰巧存储了所有的标记 作为数据库的响应,放入一个初步数组中。删除 加载所有内容后,这些旧数组和未使用的变量 成功地。此外,考虑限制包含的库,以及 采用常见的 Javascript / jQuery 最佳优化实践。

        2. 空信息窗口。下一个节省内存的策略来自 NOT 用数据预加载每个标记的信息窗口屏幕。我们剥离了每个信息窗口 裸露的,除了一个具有唯一 ID 的空 div,它将是 通过 Ajax 单击时异步加载。许多人的节省 数以千计的标记,当您获取所有不必要的信息时 窗外数据,相当大。我们正在加载大约 10,000 个 标记。用户体验也没有受到太大影响,因为 预加载和 Ajax 加载时间的差异可以忽略不计。

        3. 最大的区别,也许是关于 iOS 7 在哪里的线索 内存泄漏的谎言,来自于简单地减少标记的数量 一下子显示在屏幕上。每个应用程序都会不同, 但我们发现将结果降低到 500 个标记或更少 导致系统稳定而不会崩溃。我们的策略是 只需根据用户加载和清除可见标记数组 行为。例如,如果用户的特定过滤器选择 导致超过 500 个标记,我们只是限制了结果 从数据库。从视觉上看,结果集似乎仍然很大,并且 从用户体验的角度来看,与 看到成千上万的标记。在这两种情况下,用户都会 仍然需要过滤和缩小结果以降低到 可控的结果。在我们的例子中,用户甚至不会注意到 限制。

        这成功了!我们的应用程序现在没有崩溃。考虑到这个问题给我造成的时间量(更不用说沮丧!),希望这些策略能给你一个起点,让你的应用程序恢复正常工作。如果您想要更具体的内容,请随时与我们联系。祝你好运!

        【讨论】:

          【解决方案6】:

          我相信 IOS7 的内存上限为 5Mb(电池寿命更长),以前是 50Mb 或类似的。由于这个上限是受操作系统限制的,所以不管你用的是Chrome、Safari还是其他浏览器,超过就会崩溃。

          我测试了我从 SQL 接收数据的限制为 20,它适用于我 iphone (pad) 上的所有浏览器。

          【讨论】:

            【解决方案7】:

            我遇到了同样的问题并尝试了一些方法。我在设置标记时禁用了动画(我一次添加了大约 30 个),现在它似乎不再崩溃了。希望有帮助。

            【讨论】:

            • 嗯,我一次添加了 500 到 2000 个标记,并且在那里也发生了很多计算。 Safari 不会崩溃(虽然它有点慢)但是当我快速放大和缩小时它会崩溃
            【解决方案8】:

            谷歌地图上的标签也有同样的问题。当地图放大应用程序崩溃时。这在升级到 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
                });
            

            【讨论】:

              【解决方案9】:

              如果您要处理大量标记,请尝试使用MarkerClusterer。它将显着降低并发标记的数量,在我们的例子中它防止了崩溃。

              【讨论】:

                【解决方案10】:

                嘿...我也面临着类似的问题。所以,我尝试了这个:

                我在视图控制器和自定义插件的“didReceiveMemoryWarning”方法中清除了应用程序缓存,并在 CDVPlugin 类的“onMemoryWarning”方法中将属性和变量设置为 NIL。这种方法对我有用。到目前为止,我没有遇到任何崩溃。 希望这会有所帮助。

                【讨论】:

                  【解决方案11】:

                  似乎在 iOS 7.1 中已修复

                  昨天在 iOS 7.0.6 上,我的地图使用 3,000 多个标记会使 Mobile Safari 崩溃。今天升级 iPad 后,我可以在 Mobile Safari 中加载超过 15,000 个标记的地图。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多