ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Flutter]플러터(Share - 공유)|안드로이드, IOS
    Flutter_끄적끄적 2022. 2. 22. 06:50

    앱을 만들때, 요즘 시대 공유기능은 필수 이다.

    공유 기능은 안드로이드, IOS 2가지 방법이 있다. 가장 힘든건 IPad였다.. 애플의 실수인지는 몰라도

    Share기능을 사용하면, 무응답으로 대답하며 오류코드가 쏟아진다.. 디바이스 크기를 혼자서 못잡는 버그가 있다..

    버그 내용은 디버그 내용은 아래와 같다.

    "<NSLayoutConstraint:0x600002a935c0 LPLinkView:0x7fbcd8e1e970.leading == UILayoutGuide:0x600003010700'UIViewLayoutMarginsGuide'.leading   (active)>",
        "<NSLayoutConstraint:0x600002a926c0 H:[LPLinkView:0x7fbcd8e1e970]-(59)-|   (active, names: '|':_UIActivityContentTitleView:0x7fbcd66fa360 )>",
        "<NSLayoutConstraint:0x600002a868f0 H:|-(0)-[_UIActivityContentTitleView:0x7fbcd66fa360]   (active, names: '|':_UINavigationBarContentView:0x7fbcd8e20880 )>",
        "<NSLayoutConstraint:0x600002a86b70 _UIActivityContentTitleView:0x7fbcd66fa360.trailing == _UINavigationBarContentView:0x7fbcd8e20880.trailing   (active)>",
        "<NSLayoutConstraint:0x600002a87110 'UIView-Encapsulated-Layout-Width' _UINavigationBarContentView:0x7fbcd8e20880.width == 0   (active)>",
        "<NSLayoutConstraint:0x600002a93de0 'UIView-leftMargin-guide-constraint' H:|-(16)-[UILayoutGuide:0x600003010700'UIViewLayoutMarginsGuide'](LTR)   (active, names: '|':_UIActivityContentTitleView:0x7fbcd66fa360 )>"

    NSLayoutConstraint 내용은 별도 찾아서 공부하길 바란다. 너무 복잡하다..

    그렇게 삽질을 하며 검색해본 결과 좋은 해결 방법을 찾았다. 나와 같은 문제가 생각보다 많으면서..적은?거같더라

    GitHub 출처:https://github.com/flutter/flutter/issues/47220

     

    • 사용 패키지(pubspec.yaml 추가)
    share_plus: ^3.1.0
    • 사용 코드
    //공유하기
    Future<void> _takeShare(BuildContext context) async {
      Uint8List? _imageFile = await screenshotController.capture();
      final tempDir = await getTemporaryDirectory();
      File saveFile = await File('${tempDir.path}/woman.png').create();
      await saveFile.writeAsBytes(_imageFile!);
      //안드로이드에서는 .png, jpg 등 인식하지만 IOS는 파일명에 png,jpg를 입력하면 에러 발생
      //따라사 mimeTypes에 값을 지정해서 줘야함
      logger.i('----공유 여자: ${saveFile.path}');
      if(Platform.isIOS){
        //IOS Pad에서는 포지션값을 잡아줘야함 아니면 기능 못함..
        await Share.shareFiles([saveFile.path],sharePositionOrigin: Rect.fromLTRB(0, 0, _sizeProvider.sizeWidth, _sizeProvider.sizeHeight/2));
      }
      else{
        await Share.shareFiles([saveFile.path]);
      }
    }

    주석에도 설명을 적어놨지만 문제는 2가지다.(Share.. 문제가 한두가지가 아니다..)

     

    첫째. 안드로이드에서는 파일명을 .png, jpg 등 파일명을 입력하면 정상적으로 처리하나,

    IOS에서는 파일명을 지정하여 공유하게되면, 에러가 발생하더라.. (이건 패키지 문제일 가능성이 있다..)

     

    둘째. IOS의 아이폰은 Share.shareFiles([경로]) 정상이다. 그러나!! IPad에서 작동하면 반응이 없어지며, 오류 메세지가 나온다 따라서 Platform 확인하여 IOS이면 반드시 Share의 위치를 sharePosition으로 수동으로 잡아줘야 한다.

     

    안드로이드는 그냥 하면 된다.. 

    (안드로이드 개발하기 너무 편하다..)

     

     

    댓글

Devksr