Код NativeScript Google Maps вылетает на iOS, но только при архивации - PullRequest
0 голосов
/ 29 марта 2019

Я работаю над проектом 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;
}
...