[iOS] 마커 생성 시 NOverlayImage.fromAssetImage 를 사용할 때 크래시 이슈
안녕하세요~ 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에서는 발생하지 않고 있어요~ 혹시 더 필요하신 정보가 있으시면 말씀해주세요!
일단은 NOverlayImage.fromAssetImage 를 사용하지 않고 NOverlayImage.fromByteArray 를 사용하여 처리했습니다!
안녕하세요, 이슈를 제보해주셔서 감사드립니다. 이슈 재현을 위해, 현재 이슈가 발생하는 환경 정보(iOS 버전/기기명)와 최소 재현 가능 코드를 부탁드려도 될까요?
#280 에서 재현 코드 확인 가능. 재현 조건 조사 필요 (TODO)
안녕하세요. 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) 가 발생하는 것을 확인했습니다. 해당 이슈에 대한 확인 및 해결 방안에 대해 문의드립니다.
- NOverlayImage.fromWidget 으로 커스텀 마커 생성
- 마커를 업데이트 (재렌더링) 하는 과정에서 간헐적으로 image 가 nil 반환
- image!.pngData()! 호출 시 Crash 발생
*** 개발 환경 ***
- flutter_naver_map: ^1.4.1
- Flutter version 3.29.3 on channel stable
- Dart version 3.7.0
제 프로젝트에서도 동일한 이슈가 발생했고 문제가 확인되어 글 남깁니다.
가장 큰 이슈로 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()}");
위와 같이 로그를 찍은 결과
위 스크린샷처럼 파일의 크기가 0인 파일이 저장되며 exception이 발생하지않습니다.
이후 ios 에서 해당 파일을 optional로 ! 처리하여 사용시 exception이 발생합니다.
parameter로 들어온 file역시 사이즈가 존재하기에 저장하며 이슈가 발생했다고 생각합니다.
참고 하시기바랍니다.
Flutter 3.35.3,
flutter_naver_map: ^1.3.0+1,