Я работаю над проектом NativeScript (угловой), который отображает карту Google, используя плагин nativescript-google-maps-sdk (мой package.json ниже).У меня также есть требование предоставить некоторые фрагменты карты, к которым можно получить доступ в автономном режиме, для которых я упаковал их в несколько мобильных приложений.Поскольку Google Maps SDK для nativescript (насколько мне известно) не поддерживает добавление слоев листов, я написал несколько реализаций, специфичных для платформы, для достижения этой цели.
Моя проблема заключается в том, что для iOS мое решение для автономных карт приводит к сбою приложения(ошибка сегментации) - но ТОЛЬКО ПОСЛЕ ПРИЛОЖЕНИЯ АРХИВА.Если приложение запускается через симулятор или физический телефон в xcode или через tns run ios, эта функция является функциональной и производительной, без ошибок и предупреждений.Авария происходит за доли секунды после просмотра с загрузкой карты.Я нахожу это чрезвычайно трудным для отладки из-за отсутствия обратной связи.Кто-нибудь знает, какая проблема может вызвать сбой приложения после архивации (будь то создание специального ipa с нашим без компиляции битового кода или через testflight), но НЕ в какой-либо среде отладки?
Iизолировали проблему, закомментировав код, чтобы убедиться, что мой автономный код тайла является причиной проблемы.Я попытался выполнить развертывание в виде ipa с компиляцией битового кода и без него, а также через тестовый полет, и все они вызывают одну и ту же проблему.
Я обслуживаю автономные листы, предоставляя настраиваемую реализацию 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;
}