我正在使用nativescript-google-maps-sdk插件(下面是我的package.json)来处理显示Google地图的NativeScript(角度)项目。我还要求提供一些可以离线访问的地图图块,为此我将其与应用程序打包在一起。由于(据我所知)用于原生脚本的google maps sdk不支持添加图块层,因此我编写了一些特定于平台的实现方式来实现此目的。
我的问题是,对于iOS,我的离线地图解决方案使该应用程序崩溃(分段错误)-但只有在该应用程序归档之后。如果应用程序是通过模拟器或xcode上的实体电话运行的,或者是通过tns运行ios来运行的,则该功能既实用又高效,没有错误或警告。加载地图的视图之后,崩溃发生的时间仅为几分之一秒。由于缺乏可用的反馈,我发现这非常难以调试。是否有人知道在归档后会导致应用程序崩溃的问题(无论是使用我们的临时ipa而不编译位代码还是通过testflight),但在任何调试环境中都不会?
我已通过注释掉代码以验证我的脱机切片代码是引起问题的原因来隔离问题。我曾尝试将iPad部署为带有或不带有编译位代码的ipa,以及通过test-flight进行部署,所有这些都导致相同的问题。
我通过提供GMSSyncTileLayer的自定义实现来为离线图块提供服务,代码崩溃的原因是将GMSSyncTileLayer添加到本地google地图对象时。即使该功能已从我的GMSSyncTileLayer实现中删除(即tileForX:y:zoom:始终返回kGMSTileLayerNoTile),也会发生。通常,应用程序通过sqlite从应用程序附带的mbtile中获取切片。
以下是我package.json中的依赖项:
"nativescript": {
"id": "org.nativescript.myapp",
"tns-android": {
"version": "5.1.0"
},
"tns-ios": {
"version": "5.1.1"
}
},
"dependencies": {
"@angular/animations": "~7.1.0",
"@angular/common": "~7.1.0",
"@angular/compiler": "~7.1.0",
"@angular/core": "~7.1.0",
"@angular/forms": "~7.1.0",
"@angular/http": "~7.1.0",
"@angular/platform-browser": "~7.1.0",
"@angular/platform-browser-dynamic": "~7.1.0",
"@angular/router": "~7.1.0",
"base-64": "^0.1.0",
"nativescript-angular": "~7.1.0",
"nativescript-camera": "^4.1.1",
"nativescript-checkbox": "^3.0.3",
"nativescript-drop-down": "^4.0.1",
"nativescript-email": "^1.5.3",
"nativescript-geolocation": "^4.3.1",
"nativescript-google-maps-sdk": "^2.6.1",
"nativescript-imagepicker": "^6.0.6",
"nativescript-phone": "^1.4.0",
"nativescript-sqlite": "^2.3.3",
"nativescript-theme-core": "~1.0.4",
"reflect-metadata": "~0.1.8",
"rxjs": "~6.3.0",
"tns-core-modules": "^5.1.2",
"zone.js": "^0.8.26",
"tns-platform-declarations": "^5.1.1"
},
以下是崩溃报告的摘录:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000018
VM Region Info: 0x18 is not in any region. Bytes before following region: 4300390376
REGION TYPE START - END [ VSIZE] PRT/MAX SHRMOD REGION DETAIL
UNUSED SPACE AT START
--->
__TEXT 000000010052c000-0000000100530000 [ 16K] r-x/r-x SM=COW ...enotification
Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [423]
Triggered by Thread: 13
这是我的自定义图块提供程序的简化版本:
class MyTileLayer extends GMSSyncTileLayer {
static new(): MyTileLayer {
return <MyTileLayer>super.new();
}
public "tileForX:y:zoom:"(x, y, zoom) {
// fetch tile from mbtile using sqlite3
}
public static ObjCExposedMethods = {
"tileForX:y:zoom:": { returns: UIImage, params: [ interop.types.uint64, interop.types.uint64, interop.types.uint64 ] }
};
}
作为onMapReady函数的一部分,在if(ios)块中以这种方式调用它(请注意nativescript-sqlite插件的使用):
var db_promise = new Sqlite(dbname, function(err, db) {
if (err) {
console.error(err);
}
});
db_promise.then(function(db) {
let tileLayer = MyTileLayer.new();
// thisMapView is the nativescript-google-maps-sdk map view object
tileLayer.map = thisMapView.gMap;
}