flutter_naver_map icon indicating copy to clipboard operation
flutter_naver_map copied to clipboard

[iOS] 마커 생성 시 NOverlayImage.fromAssetImage 를 사용할 때 크래시 이슈

Open KyeongHun-Lim opened this issue 1 year ago • 5 comments

안녕하세요~ NMarker 를 생성할 때 NOverlayImage.fromAssetImage 를 이용하여 asset 에 있는 png 파일을 아이콘으로 사용하고 있는데요. 처음 화면에 진입하여 마커를 그릴 때는 정상으로 보여지지만, 지도 화면을 벗어났다가 다시 돌아와 마커를 그리려고 할 때 크래시가 발생합니다. 앱을 정상적으로 종료 후에 처음 진입할 때는 문제가 없는데요~

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 0 flutter_naver_map 0x101f142b4 Swift runtime failure: Unexpectedly found nil while unwrapping an Optional value + 0 [inlined] 1 flutter_naver_map 0x101f142b4 NOverlayImage.makeOverlayImageWithAssetPath() + 692 (NOverlayImage.swift:25) 2 flutter_naver_map 0x101f0f730 NOverlayImage.overlayImage.getter + 16 (NOverlayImage.swift:10) [inlined] 3 flutter_naver_map 0x101f0f730 NMarker.createMapOverlay() + 492 (NMarker.swift:32) 4 flutter_naver_map 0x101f0fb50 protocol witness for AddableOverlay.createMapOverlay() in conformance NMarker + 40 5 flutter_naver_map 0x101f247a4 specialized OverlayHandler.saveOverlayWithAddable(creator:) + 308 (OverlayHandler.swift:94) 6 flutter_naver_map 0x101f081e4 specialized OverlayHandler.saveOverlayWithAddable(creator:) + 32 [inlined] 7 flutter_naver_map 0x101f081e4 NaverMapController.addOverlayAll(rawOverlays:onSuccess:) + 572 (NaverMapController.swift:123) 8 flutter_naver_map 0x101f07264 protocol witness for NaverMapControlHandler.addOverlayAll(rawOverlays:onSuccess:) in conformance NaverMapController + 20 [inlined] ........

확인되는 로그는 위와 같아요. asset에서 가져온 아이콘을 사용하지 않고 plugin에서 제공하는 기본 icon을 사용할 때는 문제가 없습니다. iOS에서만 발생하고 android에서는 발생하지 않고 있어요~ 혹시 더 필요하신 정보가 있으시면 말씀해주세요!

KyeongHun-Lim avatar Jul 22 '24 08:07 KyeongHun-Lim

일단은 NOverlayImage.fromAssetImage 를 사용하지 않고 NOverlayImage.fromByteArray 를 사용하여 처리했습니다!

KyeongHun-Lim avatar Jul 22 '24 09:07 KyeongHun-Lim

안녕하세요, 이슈를 제보해주셔서 감사드립니다. 이슈 재현을 위해, 현재 이슈가 발생하는 환경 정보(iOS 버전/기기명)와 최소 재현 가능 코드를 부탁드려도 될까요?

note11g avatar Jul 24 '24 08:07 note11g

#280 에서 재현 코드 확인 가능. 재현 조건 조사 필요 (TODO)

note11g avatar Apr 18 '25 01:04 note11g

안녕하세요. NOverlayImage.fromWidget 을 사용하여 마커를 생성하는 과정에서, 마커를 다시 그리는 시점에 iOS에서 간헐적으로 Crash가 발생하고 있습니다. 디버깅 결과, NOverlayImage.swift 파일 내 아래 함수

private func makeOverlayImageWithPath() -> NMFOverlayImage { let image = UIImage(contentsOfFile: path) let scaledImage = UIImage(data: image!.pngData()!, scale: DisplayUtil.scale) let overlayImg = NMFOverlayImage(image: scaledImage!) return overlayImg } => let scaledImage = UIImage(data: image!.pngData()!, scale: DisplayUtil.scale)

부분에서 image 가 nil 이 되어 NPE(NullPointerException) 가 발생하는 것을 확인했습니다. 해당 이슈에 대한 확인 및 해결 방안에 대해 문의드립니다.

  1. NOverlayImage.fromWidget 으로 커스텀 마커 생성
  2. 마커를 업데이트 (재렌더링) 하는 과정에서 간헐적으로 image 가 nil 반환
  3. image!.pngData()! 호출 시 Crash 발생

*** 개발 환경 ***

  • flutter_naver_map: ^1.4.1
  • Flutter version 3.29.3 on channel stable
  • Dart version 3.7.0

AndroidMook avatar Sep 08 '25 01:09 AndroidMook

제 프로젝트에서도 동일한 이슈가 발생했고 문제가 확인되어 글 남깁니다.

가장 큰 이슈로 Future.wait()를 사용하면 간간히 발생하였습니다.

    List<Future> tasks = [];
    for (var item in places) {
      if (item != null) {
        tasks.add(_createMarker(item));
      }
    }
    await Future.wait(tasks);

_createMarker 내부에서는 marker를 생성 및 controller에 추가 하는 로직이 포함되어있었습니다.

navermap 의 Flutter의 lib/src/util/image_util.dart파일의 _makeFile(String, Uint8List) 함수에서

print("file 저장전 !!! :: ${bytes.length}");
final file = await File(path).writeAsBytes(bytes);
print("file 저장!!! 성공 !!! :: ${file.path} // ${file.lengthSync()}");

위와 같이 로그를 찍은 결과

Image

위 스크린샷처럼 파일의 크기가 0인 파일이 저장되며 exception이 발생하지않습니다. 이후 ios 에서 해당 파일을 optional로 ! 처리하여 사용시 exception이 발생합니다. parameter로 들어온 file역시 사이즈가 존재하기에 저장하며 이슈가 발생했다고 생각합니다.

참고 하시기바랍니다.

Flutter 3.35.3, flutter_naver_map: ^1.3.0+1,

Hwan3434 avatar Oct 02 '25 06:10 Hwan3434