Flutter 4를 기다릴 수 없습니다.음, 이것은 Flutter 4.0에 제공될 기능의 편집된 목록입니다.Flutter 4.0의 데스크탑 새로운 기능
Flutter 4.0의 데스크탑 새로운 기능
모바일 앱 개발 프레임워크인 Flutter는 곧 출시될 버전인 Flutter 4 및 Flutter 5에서 Microsoft 11 접근성에 대한 지원을 받을 예정입니다. 이것은 Flutter 엔진의 MSAA API에 대한 기존 지원에 추가됩니다.개발팀은 이미 Flutter 4에서 이 기능의 토대를 마련했으며 나머지 작업은 Flutter 5에서 완료될 것으로 예상됩니다.
접근성 지원 외에도 Flutter 4에는 데스크탑 셸용으로 여러 창을 만드는 기능과 같은 새로운 기능과 데스크탑 지원에 대한 추가 개선 사항도 도입됩니다.팀은 Flutter 이슈 프로젝트 20에서 추적할 수 있는 Flutter의 데스크톱 기능을 연마하는 작업을 해왔습니다.
전반적으로 이러한 업데이트를 통해 Flutter는 더욱 다재다능하고 접근성이 높아져 개발자가 다양한 플랫폼에서 원활하게 실행할 수 있는 고품질 애플리케이션을 만들 수 있습니다.
Flutter는 풍부한 모바일, 데스크톱 및 웹 애플리케이션을 개발하는 데 사용되는 가장 수요가 많은 교차 플랫폼 UI 프레임워크 중 하나입니다.Flutter 사용자의 수가 증가함에 따라 개발자가 작업을 신속하게 처리할 수 있도록 광범위한 플러그인 및 추가 기능을 사용할 수 있습니다.이 게시물에서는 Flutter 프로그래밍을 위해Visual Studio Code IDE에서 활용하는 상위 10개 확장에 대한 세부 정보를 제공합니다
Pubspec Assist
Error Lens
Flutter Tree
Bracket Pain Colorizer 2
Dart Data Class Generator
Flutter Stylizer
Better Comments
Color Highlight
Markdownlint
JSON to Dart Model
Flutter 앱 빌드를 위해 Visual Studio Code에서 Flutter 및 Dart 추가 기능을 이미 찾고 설정했다고 믿습니다.그렇지 않은 경우Flutter및Dart용 Visual Studio Marketplace에서 가져올 수 있습니다 .
VS Code에서 확장 설치에 익숙할 수 있습니다.그러나 초보자를 위해 여기에서 설명했습니다.왼쪽 메뉴에서 확장 프로그램 아이콘을 클릭하고 검색 상자에 원하는 확장 프로그램 이름을 입력하고 필요한 확장 프로그램을 선택한 다음 설치를 클릭합니다.
#1 Pubspec Assist
Are you tired of trying to locate the necessary Flutter and Dart packages on pub.dev? You should give the Pubspec Assist extension a go. This extension permits you to search for packages without relinquishing your editor and then appends them to the pubspec.yaml document. Moreover, it allows you to look for numerous packages simultaneously by separating the titles with commas.
#2 Error Lens
Errors and warnings are normal during development, but the methods we use to handle them are unique. In the VS Code editor, the errors and warnings are usually shown at the bottom, and we must scroll through the list to see if there are additional problems.
TheError Lens extensionhighlights the error lines in the code and appends the error details at the end of the line. Error icons are also displayed in the gutter.
Also, you can customize the color of the error highlight in the settings.json file. This will make your mistakes appear more enticing.
#3 Flutter Tree
It’s difficult to recognize widgets in a tree when you construct an application with a large number of widgets. TheFlutter Tree extensioncreates the desired widget tree with simplified syntax. This makes the creation of widget trees much easier, but you have to use its own syntax to do so, which is as follows.
#4 Bracket Pair Colorizer 2
We are frequently lost in the maze of nested classes and widgets, wasting a lot of time and effort attempting to find the correct bracket pair.Bracket Pair Colorizer 2is a lifesaver when it comes to locating misplaced brackets.
You can also customize the color of bracket pairs.
#5 Dart Data Class Generator
Often, we overlook the creation of required methods in a class. VS Code has a utility that allows you to add missing methods, but you can only add one at a time. TheDart Data Class Generatorovercomes this by building Dart data classes with the constructor, copyWith, toMap, fromMap, toJson, fromJson, toString, operator ==, and hashCode methods based on class attributes or raw JSON, as the name implies.
This extension also sorts the imports alphabetically and converts them to a proper format.
#6 Flutter Stylizer
Managing a complex code repository that is not structured adequately diminishes engineer efficiency. TheFlutter Stylizerextension erases this problem by organizing your methods in a consistent and opinionated way.
This tool organizes the classes within the file in the following manner:
Constructor — named constructor — public static variables — public instance variables — public override variables — private static variables — private instance variables — public override methods — other public methods — build method.
Flutter itself provides formatting choices, however, it only formats Dart files and it doesn’t re-order the code. Flutter formats the code based on theseformatting rules.
#7 Better Comments
If all comments are in the same format, we won’t be able to arrange the work in order of importance, and there’s a risk of ignoring important tasks. TheBetter Commentsextension aids in the creation of colorful comments, which makes them more readable. This makes it easier to keep track of the code comments.
All you have to do is start a comment with *, !, ?, or TODO, and it will be colored in an assigned way. You can also create your own comment styles using the settings.json file.
#8 Color Highlight
We manage an extensive selection of colors while constructing a program, yet suppose the shades we’re programming were discernible in the code editor? This would be remarkably advantageous by exhibiting the program colors without needing to initiate the program. TheColor Highlightadd-on makes it possible to view the colors that are specified by styling the color in our code.
#9 Markdownlint
No validators in the Flutter project can ensure the detection of problems in README.md or CHANGELOG.md documents. To remedy this, theMarkdownlintplugin provides a set of guidelines to encourage Markdown file standards and uniformity. You can use this extension to check for problems locally and verify the content before publishing it live. Browse theuser manualto learn more about rules.
In this image, you can see errors like multiple consecutive blank lines, heading levels should increment by one, and the list should be surrounded by blank lines. On a related note, I would like to remind you that you can preview Markdown files in VS Code by using the Preview button.
#10 JSON to Dart Model
When dealing with n amount of JSON files, constructing Dart models for each one is laborious.JSON to Dart Modelcreates a Dart class for the given JSON string. It’s possible to make JSON values required or default by adding r@ or d@ to your JSON key, and JSON to Dart Model will produce Dart models for you.
In the following figure, the JSON file is shown on the left, and the required classes and properties are shown on the right, which is produced from the JSON file using the JSON to Dart Model extension.
나이로비에서 열린 Flutter Forward 행사에서 우리의 비전 제시 오늘 우리는 Flutter Forward 에서 Flutter에 대한 우리의 비전을 공유하게 되어 기쁩니다 . 전 세계 개발자들이 Flutter의 향후 방향에 대해 알아보기 위해 대면 및 온라인으로 모여 케냐의 나이로비에서 실시간으로 스트리밍되는 개발자 이벤트입니다.
Flutter는 앱 개발자가 단일 코드베이스에서 모바일, 웹 및 데스크톱용으로 빌드할 수 있게 해주는 UI 도구 키트입니다. Flutter를 사용하면 아름다운 앱 을 빌드 하여 화면의 모든 픽셀을 완벽하게 제어할 수 있습니다. 하드웨어 가속 그래픽 및 기본적으로 컴파일된 기계 코드를 지원하는 휴대전화 또는 컴퓨터 의 하드웨어를 활용하여 빠릅니다 . 앱에서 코드 변경 사항을 즉시 확인할 수 있는 상태 저장 핫 리로드와 같은 기술을 통해 생산성 이 향상됩니다. 이식성 덕분에 동일한 소스 코드를 사용하여 놀라지 않고 다양한 플랫폼에 배포할 수 있습니다 . 또한 완전히 오픈 소스 이므로 라이센스 비용이나 개발 도구 비용을 지불할 필요가 없습니다.
Flutter는 지금까지 700,000개 이상의 게시된 앱을 통해 인기가 입증되었습니다. 큰 아이디어 가 있는 소규모 스타트업부터 중요한 요구 사항이 있는 기업에 이르기까지 . Google에서도 Flutter가 Google Classroom 과 같은 팀 이 모바일 및 웹 사용자에게 고품질 솔루션을 제공할 수 있게 해주는 유용한 도구임을 알게 되었습니다. 또한 Google Ads , Google 지도 , Google Pay 및 물론 Firebase 를 포함한 다른 개발자 도구에서도 이에 대한 지원을 추가하고 있습니다 . https://youtu.be/JVJF_M9bgj4
"Flutter를 사용하여 동일한 기능에 대해 코드 크기를 66% 줄였습니다. 이는 각 플랫폼의 버그가 줄어들고 향후 기술 부채가 줄어드는 것을 의미합니다." (Kenechi Ufondu, 소프트웨어 엔지니어, Google Classroom)
Flutter의 첫 번째 릴리스는 Android 및 iOS에서 모바일 앱을 빌드하기 위한 UI 도구 키트를 제공했지만 Flutter 3에서는 Windows, macOS, Linux 및 웹을 포함하도록 프로덕션 지원을 확장하는 동시에 임베디드 플랫폼에서 Flutter를 사용할 수 있도록 했습니다. 이를 기반으로 이번 주 에 iOS의 새로운 렌더링 엔진, Material 3 및 iOS 스타일 위젯에 대한 향상된 지원, 개선된 국제화 지원, 백그라운드 처리 등 광범위한 새 기능을 추가한 최신 안정 릴리스인 Flutter 3.7 을 출시했습니다. 개선 및 개발자 도구 업데이트.
그러나 이번 행사에서 우리는 Flutter에 대한 투자의 다음 물결인 획기적인 그래픽 성능, 웹과 모바일을 위한 완벽한 통합, 새롭고 떠오르는 아키텍처에 대한 초기 지원, 지속적인 집중 등을 미리 볼 수 있기를 기대 하고 있습니다. 개발자 경험에 대해. 우리는 앞으로 몇 달에 걸쳐 점진적으로 제공될 작업을 선보일 예정이며, 이를 통해 어디에서나 사용할 수 있는 고품질의 아름다운 사용자 경험을 구축하려는 모든 개발자를 위한 강력한 도구 키트로서의 Flutter에 대한 우리의 비전에 대해 여러분이 흥분하게 되기를 바랍니다. 픽셀이 그려집니다.
고지 사항: 여기에서 미리 보는 기능은 아직 개발 중이며 앞으로 몇 달 동안 크게 변경될 수 있습니다. 이 초기 단계에서 표시하는 것은 얼리 어답터가 기여할 수 있는 기회를 제공하도록 설계되었습니다.
4가지 테마: 획기적인 그래픽 성능, 웹과 모바일을 위한 완벽한 통합, 초기부터 새롭게 떠오르는 아키텍처, 개발자 경험에 대한 지속적인 집중.
획기적인 그래픽 성능 역사적으로 교차 플랫폼 프레임워크는 추상화 계층을 생성하는 문제로 인해 비주얼에 대한 절충안이 필요했습니다. Flutter는 모든 장치에서 하드웨어 가속 그래픽과 일관된 시각적 모양을 제공하는 자체 렌더링 레이어를 사용하여 대부분과는 다른 접근 방식을 취했습니다. 앞으로 우리는 이 분야에서 Flutter의 기존 강점을 확장하는 획기적인 그래픽 성능 에 투자할 것입니다.
Flutter Forward에서는 Flutter의 차세대 렌더링 엔진인 Impeller 에 대한 더 많은 진행 상황을 보여주고 있습니다 . Impeller는 Flutter에 최적화되어 그래픽 파이프라인에 대한 더 많은 유연성과 제어 기능을 제공하고 새로운 기회를 열어줍니다. 임펠러는 셰이더 컴파일로 인한 런타임 시 드롭된 프레임을 완화하는 미리 컴파일된 셰이더를 사용하여 보다 예측 가능한 성능을 제공합니다. iOS 및 Android의 최신 저수준 API인 Metal 및 Vulkan의 프리미티브를 활용합니다. 또한 동시성을 효과적으로 사용하여 단일 프레임 워크로드를 여러 스레드에 분산시킵니다.
Impeller는 Wonderous 와 같이 까다로운 그래픽 앱을 위한 부드럽고 매끄러운 성능을 제공합니다 . 여기에 표시됨: https://wonderous.app 에서 사용할 수 있는 다양한 장치 및 폼 팩터에 맞게 UI를 조정하는 최신 버전의 Wonderous . 부드럽고 매끄러운 UI를 제공하는 것 외에도 Impeller는 특정 시나리오에서 성능을 크게 향상시킬 수 있습니다. 하나의 데모(아래 표시)는 이에 대한 최상의 사례를 보여줍니다. 왼쪽에는 현재 기본 렌더러를 사용하여 빌드된 SVG 클리핑을 사용하는 만화경 앱이 있습니다. 페이지를 아래로 스크롤하면 렌더링이 프레임당 예산보다 오래 걸리고 프레임 속도가 7~10fps로 떨어지면서 성능이 떨어집니다. 오른쪽은 Impeller에서 실행되는 동일한 앱을 보여주며 결함 없는 60fps로 렌더링됩니다. https://youtu.be/Z7v-YRdHusM
Impeller를 사용한 그래픽 성능 향상의 예를 보여주는 Kaleidoscopia 데모입니다. 처음부터 구축하는 것의 한 가지 이점은 아키텍처가 완전히 새로운 사용 사례를 지원할 수 있다는 것입니다. 커스텀 셰이더에 대한 새로 도입된 지원은 이미 Flutter 위젯 계층 구조와의 완벽한 통합을 보여주는 몇 가지 놀라운 새 데모 로 이어지고 있습니다. 여기서 우리의 작업은 모바일 장치에만 국한되지 않습니다. 이제 웹에서도 사용자 지정 셰이더를 조기에 지원하고 있으며, 이제 동일한 코드로 iOS, Android 및 브라우저에서 하드웨어 가속 환경을 지원합니다.
Flutter 픽셀 셰이더 데모를 보여주는 Chrome 웹 브라우저의 스크린샷. Flutter 마스코트인 Dash의 이미지가 있지만 슬라이더 컨트롤로 조정할 수 있는 모자이크 스타일의 효과가 있습니다. Flutter는 이제 웹에서 픽셀 셰이더를 지원하여 다양한 멋진 시각 효과를 사용할 수 있습니다. (신용 거래: 에릭 고메즈 .) 이제 우리는 Flutter로 3D 를 지원하는 초기 작업을 시작하고 있습니다. 기조연설에서 우리는 Blender 로 생성된 모델을 가져올 수 있고 핫 리로드를 사용하여 Blender를 실시간으로 반복하고 실행 중인 앱에서 결과를 볼 수 있음을 보여주었습니다. 아직은 초기 단계지만 3D를 다른 Flutter 경험에 통합할 수 있는 가능성과 함께 우리가 얻고 있는 초기 성능에 대해 매우 기쁘게 생각합니다.
Impeller를 사용하면 Flutter가 3D 그래픽을 렌더링할 수 있습니다. 이 재미있는 Dash 데모에서 볼 수 있습니다. 3D 및 사용자 지정 셰이더를 추가하면 휴대용 UI 툴킷의 그래픽 성능에 대한 기준이 새로운 수준으로 높아집니다. 이러한 새로운 기능이 출시되면 이를 통해 여러분이 무엇을 하게 될지 매우 기대됩니다.
웹과 모바일을 위한 완벽한 통합 Flutter와 Dart를 사용하여 완전히 앱을 작성할 수 있지만 거의 모든 사소한 프로젝트는 다른 코드와 연결해야 합니다. 웹에서 Flutter는 더 큰 앱 내에서 포함된 구성 요소로 사용될 수 있습니다. 모바일에서 앱은 시스템 API 또는 다른 언어로 작성된 기타 코드를 호출해야 할 수 있습니다. 따라서 우리의 두 번째 주요 투자 주제는 웹과 모바일의 원활한 통합입니다.
웹에서 우리는 Flutter 콘텐츠를 모든 표준 웹에 추가할 수 있게 해주는 요소 임베딩<div> 이라고 하는 새로운 기능을 미리 보고 있습니다 . 이러한 방식으로 포함되면 Flutter는 웹 구성 요소가 되어 웹 DOM과 깔끔하게 통합되고 CSS 선택기 및 변환을 사용하여 부모 Flutter 개체의 스타일을 지정할 수도 있습니다.
또한 JavaScript와 Dart 코드 간의 원활한 상호 운용성을 지원하기 위해 js 패키지 를 크게 변경하고 있습니다. js를 사용하면 Dart 코드의 모든 함수에 속성을 추가한 다음 JavaScript 코드에서 호출할 수 있습니다.@JSExport
이 두 가지 새로운 기능을 결합하면 웹에서 Flutter를 사용하는 몇 가지 흥미롭고 새로운 시나리오가 열립니다. Flutter Forward에서 선보인 개념 증명 데모 에서 HTML 기반 웹 페이지에 포함된 간단한 Flutter 앱을 볼 수 있습니다. CSS를 사용하여 애니메이션 회전 효과를 적용합니다. 회전하는 동안에도 Flutter 콘텐츠는 대화형으로 유지됩니다. 데모는 또한 HTML 버튼과 JavaScript 이벤트 핸들러를 사용하여 Flutter 상태를 변경하거나 그 반대로 할 수 있음을 보여줍니다. 이 작업이 완료되면 Flutter를 사용하여 기존 웹 앱에 상호작용성을 추가할 수 있는 많은 새로운 기회가 열릴 것이라고 생각합니다.
Flutter 웹 데모의 스크린샷. 전통적인 Flutter 카운터 앱이 표시되지만 CSS에서 기울어지고 변형되어 여성이 iPhone을 들고 있는 사진의 일부처럼 보입니다. 요소 포함을 사용하면 Flutter를 <div> 요소에 포함하고 CSS를 사용하여 스타일을 지정할 수 있습니다. Android 및 iOS로 전환하면서 Flutter는 Kotlin 또는 Swift와 같은 언어로 작성된 코드와 통신하기 위한 메시지 기반 접근 방식을 제공하는 플랫폼 채널을 사용하여 오랫동안 시스템 API와의 통합을 지원해 왔습니다. 이렇게 하면 해당 라이브러리에 대한 액세스가 잠금 해제되지만 앱 작성자는 여러 언어에 정통해야 하며 상당한 양의 상용구 코드가 필요합니다.
우리는 이제 라이브러리를 직접 호출할 수 있는 시스템 상호 운용성을 위한 새로운 접근 방식에 대한 작업을 시작하고 있습니다. iOS에서 우리는 Swift 및 Objective-C 라이브러리에 대한 지원을 추가하여 C 상호 운용성을 위한 FFI에 대한 작업을 구축하고 있습니다. Android에서는 JNI를 사용하여 Kotlin으로 작성된 Jetpack 라이브러리에 연결합니다. 새로운 명령을 통해 Dart는 언어 간 상호 운용을 위한 바인딩을 자동으로 생성하고 데이터 클래스를 적절하게 변환합니다. 완료되면 이 작업을 통해 Flutter 개발자가 플러그인을 사용하거나 다른 API 구문을 배울 필요 없이 새로운 Jetpack 또는 iOS 라이브러리를 호출할 수 있을 뿐만 아니라 플러그인 작성자의 작업이 크게 쉬워지기를 바랍니다. 자세한 내용 은 샘플을 확인하세요 !
새롭고 떠오르는 아키텍처 초기 단계 다양한 프로세서 아키텍처에 대한 Dart의 폭 넓은 지원과 고도로 최적화된 JavaScript 컴파일러 덕분에 Flutter는 이미 다양한 장치와 폼 팩터에서 실행될 수 있습니다. 그러나 몇 가지 흥미로운 새 옵션이 등장하면서 세 번째 주제는 새롭고 떠오르는 아키텍처를 조기에 지원하는 것 입니다.
WebAssembly 는 최신 브라우저에 대한 지원 이 증가하면서 플랫폼 중립적인 이진 명령 형식으로 성숙해졌습니다 . 흥미롭게도 WebAssembly는 JavaScript 이외의 다른 언어에 대한 웹 플랫폼을 엽니다. 최근 몇 달 동안 Chrome 팀 및 기타 WebAssembly 파트너와 협력하여 Dart와 같은 가비지 수집 언어에 대한 조기 지원 을 추가했습니다. WebAssembly에 대한 이 새로운 확장은 이제 Chrome의 최신 개발 빌드에서 플래그로 지원됩니다. Flutter Forward에서는 WebAssembly에 대한 Flutter 컴파일에 대한 초기 지원을 공개 하여 웹 지원을 위한 추가 속도 및 크기 최적화를 가능하게 합니다.
점점 더 많은 관심을 받고 있는 또 다른 플랫폼 아키텍처는 광범위한 사용을 위해 설계된 개방형 표준 ISA(Instruction Set Architecture)인 RISC-V 입니다. Android 팀은 최근에 RISC-V를 지원하기 위한 작업 에 대해 발표했으며 , Flutter가 RISC-V 기기에서 실행될 수 있도록 하기 위한 자체 여정의 일환으로 Dart가 이제 RISC-V를 지원함 을 발표하게 되어 기쁩니다. 사용할 수 있습니다. 프로덕션 RISC-V 하드웨어는 아직 초기 단계이지만 Flutter Forward에서 우리는 Linux를 실행하는 자체 조립 휴대용 터미널인 ClockworkPi DevTerm Kit R-01 에 대한 현재까지의 진행 상황을 시연했습니다. RISC-V 지원은 Flutter가 다양한 요구 사항에 맞는 강력한 UI 도구 키트를 제공할 수 있는 임베디드 시나리오에서 특히 중요할 것이라고 생각합니다.
ClockworkPi RISC-V 휴대용 단말기의 사진. 이것은 iPad와 거의 같은 크기의 작은 장치이지만 미니어처 키보드, 트랙포인트 마우스 및 터미널 디스플레이가 있습니다. Dart 콘솔 앱을 실행하는 실험용 RISC-V 컴퓨터인 ClockworkPi DevTerm R-01. 개발자 경험에 대한 지속적인 관심 위에서 설명한 모든 것의 기초는 상태 저장 핫 리로드와 같은 기능을 통해 처음부터 Flutter의 특징인 개발자 생산성입니다. 미래를 위한 우리의 네 번째이자 마지막 투자 영역은 Flutter와 Dart 모두 에서 개발자 경험에 지속적으로 초점을 맞추는 것입니다.
Flutter Forward에서 우리는 Dart 언어의 세련된 진화에 대한 우리의 약속을 보여주기를 희망하는 일부 주요 새 Dart 언어 기능에 대한 초기 작업의 일부를 미리 보고 있습니다. 개발 채널에서 특히 함께 잘 작동하는 두 가지 새로운 개선 사항인 레코드 및 패턴 에 대한 초기 지원을 제공합니다.
새로운 레코드 및 패턴 기능의 데모를 실행하는 VSCode의 이미지. Dart가 이제 여러 값을 반환할 수 있음을 보여줍니다. 데모 코드는 https://gist.github.com/timsneath/a75fd9f76b5b61c42676c9232160d14d에 있습니다. 여러 함수 매개변수를 반환하고 수신하는 데 사용되는 레코드 및 패턴의 간단한 예입니다. 우리는 또한 공식적으로 Dart 3 를 발표합니다. 이것은 언어에 건전한 널 안전을 도입하기 위한 우리 작업의 정점입니다. Dart 3는 또한 언어를 더욱 현대화하기 위해 오랫동안 사용되지 않는 다른 기능을 제거합니다. 일치하는 Flutter 빌드와 함께 Dart 3의 알파 품질 빌드를 게시하기 시작하여 개발자가 패키지와 앱을 테스트할 수 있습니다. Dart 3에 대한 자세한 내용 은 Dart 채널의 별도 블로그 게시물을 확인하십시오 .
물론 우리는 Flutter의 개발자 경험에도 투자하고 있습니다. 작년 I/O에서 발표 한 캐주얼 게임 툴킷의 성공에 이어 뉴스 툴킷 의 첫 번째 버전을 공유하고 있습니다. 처음부터 앱을 디자인합니다. 여기에는 탐색 및 검색, 인증, 광고 통합, 알림, 프로필 및 구독과 함께 기사 중심 앱을 구축하는 데 필요한 모든 것이 포함되어 있으며 Google 뉴스 이니셔티브 연구의 모범 사례가 통합되어 있습니다. 오늘 우리는 Hespress 를 포함하여 이 툴킷을 기반으로 앱을 구축하고 있는 이곳 아프리카의 얼리어답터 3명을 소개합니다., 모로코에서 가장 큰 뉴스 사이트 중 하나인 Bold Sports 는 인기 있는 나이지리아 스포츠 사이트입니다. 그리고 The Standard , 케냐에서 가장 오래된 신문.
Google 뉴스 툴킷의 얼리 어답터였던 세 명의 아프리카 기반 뉴스 게시자의 이야기입니다. 함께 나아가기 Flutter가 앞으로 나아갈 방향에 대한 기대를 공유해 주시기 바랍니다. 우리는 핵심 개발자 경험에 막대한 투자를 계속하는 동시에 Flutter로 훨씬 더 강력한 경험을 구축할 수 있는 길을 닦는 몇 가지 근본적인 개선을 하고 있습니다.
이 이미지는 우리의 방향을 요약합니다.
향후 작업을 위한 4가지 테마: 획기적인 그래픽 성능(임펠러, 쉐이더, 3D 지원); 웹과 모바일을 위한 완벽한 통합(요소 임베딩, JNIgen 및 FFIgen) 새롭고 떠오르는 아키텍처(WebAssembly 및 RISC-V)에 초기 단계; 개발자 경험(Dart 언어 기능, 사운드 null 안전, Google News Toolkit 및 Wonderous)에 대한 지속적인 초점. 자체 개발 테마 외에도 FlutterFlow 가 네이티브 모바일 애플리케이션 개발을 위한 로우 코드 빌더인 FlutterFlow 와 디자이너와 개발자가 사용자 인터페이스 개발에서 협업할 수 있는 유연한 도구를 제공하는 Widgetbook 과 같이 Flutter 생태계가 계속해서 확장되는 방식을 보는 것은 기쁩니다.
끝으로 케냐에 와서 현지 개발자들의 기업가 정신과 재능을 볼 수 있어서 정말 기뻤습니다. 여기 아프리카에서 Flutter 커뮤니티의 활력은 특별합니다. Flutter Kenya 사용자 그룹에만 1,000명이 넘는 개발자가 있습니다. 그리고 Flutter가 아프리카 전역의 개발자들에게 빠르게 성장하는 앱 경제에 참여할 수 있는 새로운 기회를 제공할 수 있다는 사실에 매우 기쁩니다. Klasha는 Flutter를 사용하여 신속하게 시장에 진출하고 지역 문제를 해결하는 이러한 약속의 좋은 예입니다. 다음은 Flutter 사용 경험에 대한 동영상입니다.https://youtu.be/o8NPZ2ofLbI
Klasha( https://klasha.com/ )의 이야기, 아프리카 소비자들에게 전 세계 상품에 원활하게 액세스할 수 있는 기술 스타트업 및 Flutter 사용 경험.
모바일 앱에서도 이와 유사한 기능을 하는 것이 있습니다. 바로 딥링크(Deeplink) 입니다.
딥링크는 특정 주소 혹은 값을 입력하면 앱이 실행되거나 앱 내 특정 화면으로 이동시키는 기능을 수행합니다. 즉, 딥링크가 사용되면 광고에 반응한 이용자는 앱이 바로 실행되어 특정 화면으로 이동하는 경험을 하게 됩니다. 혹은 앱 설치 후 실행하면 특정 화면으로 바로 이동하게 됩니다(지연된 딥링크). 따라서 광고를 운영하는 마케터 입장에서는 광고 성과 최적화를 위해 반드시 활용해야 하는 기능입니다.
딥링크는 3가지 방식으로 구분됩니다.
URI 스킴 방식 : 앱에 URI 스킴(scheme) 값을 등록하여 딥링크 사용
앱링크(App Link) : Android 제공 - 도메인 주소를 이용한 딥링크 사용
유니버셜 링크 (Universal Link) : iOS 제공 - 도메인 주소를 이용한 딥링크 사용
모두 딥링크 기능을 수행 함에도 왜 'URI 스킴', '앱링크', '유니버셜 링크' 방식으로 각각 구분하는 것일까요? 각각의 기능과 차이점에 대해서 알아보겠습니다.
'URI Scheme' 방식의 딥링크
'URI Scheme' 방식 이해
가장 일반적으로 사용되는 딥링크 방식은 URI Scheme(URI 스킴) 방식 입니다.
URI 스킴을 이용한 딥링크는 앱에 Scheme값을 등록하는 형태로 앱을 구분합니다. 스킴은 앱마다 등록할 수 있는 값으로 "특정 스킴값을 호출하면 특정 앱이 오픈된다." 라는 약속을 실행합니다. 여러분이 트위터 앱을 오픈하고자 한다면 twitter:// 라는 스킴값을 이용하면 됩니다. 이 스킴값은 앱 개발시 효율적인 앱 오픈을 위해 자체적으로 개발사에서 자신들만의 값으로 등록을 하게 됩니다.
앱 내에서의 특정 페이지는 'path' 값으로 구분합니다. 예를 들어, 트위터 앱의 회원가입 페이지를 오픈하고자 한다면 twitter://signup 이라는 값을 사용합니다.
정리하면, URI 스킴 방식은 Scheme://Path라는 두개의 요소로 구성됩니다.
Scheme://Path
Scheme = 앱을 특정함 (트위터)
Path = 앱 내 페이지를 특정함 (트위터 내 회원가입 페이지)
안드로이드의 경우 아래와 같이 Androidmanifest.xml 이라는 파일에 스킴값을 등록합니다.
[위 스크린샷에서 android:scheme 라고 적힌 항목이 스킴값입니다.]
iOS 의 경우 앱 정보 화면에서 URL Scheme 항목에 스킴값을 입력할 수 있습니다.
[iOS 에서 스킴값을 등록하는 화면]
URI 스킴 방식의 한계
URI 스킴 방식의 딥링크는 앱의 수가 상대적으로 적었던 시기에는 광고를 통해 앱을 바로 실행시키는 훌륭한 마케팅 수단이었습니다. 그러나 앱 수가 증가하면서 생각하지 못한 문제가 발생하기 시작하였습니다. 바로 앱 스킴값이 서로 중복되는 경우에 대한 문제입니다. 앱 개발자 입장에서는 앱에 등록된 스킴값이 자신들의 앱만 사용하는 고유값인지 확인할 방법이 현재는 없습니다.
구글플레이 앱은 자신들의 앱을 오픈하기 위한 스킴 값으로 market:// 란 값을 사용하고 있습니다. OneStore, 삼성 앱스토어 등의 오픈 마켓 또한 이 스킴 값을 사용합니다. 따라서 안드로이드 이용자들은 아래처럼 어떤 앱을 실행시켜야 하는지에 선택하는 화면을 보게 됩니다.
[서로 동일한 market:// 스킴값을 사용할 경우 발생하는 문제.]
즉, 안드로이드 시스템이 현재 market:// 란 스킴값으로 앱을 열려고 할 때 사용자에게 " 이 3종의 앱이 모두 "market://" 란 스킴값을 사용하는데 어떤 앱을 열어야 하나요?" 라고 물어보는 화면입니다. 안드로이드, iOS 모두 이와 비슷한 문제를 가지고 있습니다. 앱을 개발하는 개발자가 자신이 적용한 스킴값이 다른앱은 사용하지 않는 고유값인지 아닌지 확인할 수 있는 방법이 없고 다른 앱이 자신의 스킴값을 사용한다 할지라도 이를 방지할 방법이 없는 상황입니다.
애플과 구글의 개발자들은 이를 근본적으로 막을 수 있는 방법은 없을지 고민했습니다. 그 고민끝에 탄생한 것이 유니버셜 링크 (iOS 제공)와 앱링크 (Android 제공) 입니다.
유니버셜 링크와 앱링크
웹페이지 주소를 사용한 딥링크
현재 여러분이 사용하고 있는 사이트의 인터넷 주소는 모두 고유의 값을 가지고 있습니다. 가령 아이지에이웍스는 igaworks.com 이라는 고유의 인터넷 주소를 가지고 있고 애드브릭스 역시 adbrix.io 라는 고유의 주소를 가지고 있습니다. 이를 도메인 (Domain) 주소라고 합니다.
애플과 구글의 개발자들은 이 도메인 주소를 딥링크 실행값으로 사용하기로 결정합니다. 예를 들면, 스마트폰 브라우저 앱 주소창에http://naver.com 을 입력하면 네이버 앱이 바로 오픈되어 사용할 수 있도록 한 것입니다.
바로 이 기능을 iOS 에서는 유니버셜 링크(Universal Link), Android 에서는 앱링크(App Link)라고 부릅니다.
안드로이드의 경우 Androidmanifest.xml 라는 파일에서 아래와 같이 앱링크 도메인을 등록할 수 있습니다. (아래 예시는 애드브릭스 트랙킹 링크의 유니버셜 링크, 앱링크 연동을 기준으로 작성하였습니다.)
iOS 의 경우 Singing & Capabilities 에서 Associated Domains 에서 등록할 수 있습니다.
유니버셜 링크와 앱링크의 한계
하지만 안타깝게도 유니버셜 링크와 앱링크가 아직까지는 완전하지 않습니다. 모든 앱에서 유니버셜 링크와 앱링크 오픈을 지원하는 것이 아니기 때문입니다.
앱링크는 구글에서 만든 앱에서만 동작하고, 구글 이외에 앱에서는 정상적으로 동작하지 않습니다. 유니버셜 링크 역시 애플에서 만든 앱 이외에는 정상적으로 동작하지 않습니다.
애드브릭스 팀에서는 주요 환경 별 유니버셜 링크, 앱링크 실행 결과를 확인했습니다. 결과를 보면 하나의 방식이 모든 환경에 완벽하게 대응하지 못하고 있습니다. 따라서 원활한 광고 운영과 어트리뷰션을 위해서는 URI스킴 방식, 유니버셜 링크, 앱링크 모두 연동이 필요하다는 결론에 도달합니다.
앱링크 테스트 결과
테스트 환경테스트 결과
1
안드로이드 카메라 앱에서 QR 코드 촬영하여 앱 실행
앱링크 작동
2
Gmail 앱에서 링크를 클릭하여 앱 실행
앱링크 작동
3
카카오톡에서 링크를 클릭하여 앱 실행
URI스킴 방식 작동
4
네이버 앱에서 주소창에 링크 입력 후 앱 실행
URI스킴 방식 작동
5
네이버 앱에서 카메라로 QR 코드 촬영하여 앱 실행
URI스킴 방식 작동
6
크롬에서 주소창에 트래킹 링크 입력 후 앱 실행
딥링크가 동작하지 않음
7
크롬에서 링크를 클릭하여 앱 실행
앱링크 작동
8
삼성 브라우저에서 주소창에 링크 입력 후 앱 실행
딥링크가 동작하지 않음
9
삼성 브라우저에서 링크를 클릭하여 앱 실행
앱링크 작동
유니버셜 링크 테스트 결과
테스트 환경테스트 결과
사파리 브라우저 주소창에 링크 입력 후 앱 실행
URI스킴 방식 작동 (경우에 따라 유니버셜 링크 작동)
2
사파리 브라우저에서 링크를 클릭하여 앱 실행
URI스킴 방식 작동
3
아이폰 카메라 앱으로 QA 코드 촬영하여 앱 실행
유니버셜 링크 작동
4
아이폰 이메일 앱에서 링크를 클릭하여 앱 실행
유니버셜 링크 작동
5
Gmail 앱에서 링크를 클릭하여 앱 실행
URI스킴 방식 작동
6
카카오톡에서 링크를 클릭하여 앱 실행
URI스킴 방식 작동
7
네이버 앱에서 주소창에 링크 입력 후 앱 실행
URI스킴 방식 작동
8
네이버 앱에서 카메라로 QR 코드 촬영 후 앱 실행
URI스킴 방식 작동
9
크롬 주소창에 링크 입력 후 앱 실행
URI스킴 방식 작동
10
크롬에서 링크를 클릭하여 앱 앱 실행
URI스킴 방식 작동
딥링크, 더 알아두기
앱에 딥링크 적용하기
애드브릭스는 앱에 설정된 딥링크 설정값을 받아 실행하는 역할을 수행할 뿐, 딥링크 그 자체는 앱 내에 먼저 설정이 되어있어야 합니다. 즉, 앱 내에 자체적으로 딥링크 설정이 완료 되어야만 딥링크 기능을 이용할 수 있습니다. 문을 열기 위한 열쇠는 광고주 앱이 직접 만들어야 하고, 그 열쇠를 받아서 문을 여는 역할만 애드브릭스가 수행한다고 생각하면 이해하기 쉽습니다.
따라서 마케터가 딥링크를 사용하고자 한다면, 앱 개발팀을 통해 딥링크 사용에 필요한 설정값(스킴과 패스값, url값)을 확보한 후 트래킹링크 설정 옵션에 입력해야 합니다. (Ad-Landing 세팅,트래킹링크 발급)
지연된 딥링크
지연된 딥링크(Deferred Deep Link)란 마켓에 랜딩되어 앱 설치 후 실행한 이용자가 앱 첫 화면이 아닌, 지정된 특정 앱 페이지로 이동되는 기능을 의미합니다. 예를 들어, 'A운동화 광고' 트래킹링크가 적용된 광고에 참여한 이용자가 마켓으로 이동하여 앱을 설치하고 실행하면 'A운동화' 상품 페이지로 바로 이동합니다.
애드브릭스 All-Link : URI스킴, 앱링크, 유니버셜 링크 모두 사용하기
앞서 살펴본 것 처럼 URI스킴, 유니버셜 링크, 앱링크 중 하나의 딥링크 방식 만으로는 모든 환경에 대응하지 못합니다. 따라서 광고UX 최적화를 위해서는 3개 방법을 모두 적용하여 상호보완적으로 사용하는것이 최선의 방법입니다.
애드브릭스의 트래킹 링크는 URI스킴, 유니버셜 링크, 앱링크를 하나의 링크로 지원하는 All-Link 기능을 제공합니다. 애드브릭스 트랙킹 링크의 도메인을 이용하여 유니버셜 링크, 앱링크를 만들수 있습니다. 유니버셜 링크와 앱링크를 지원하지 않는 앱에서도 정상적으로 어트리뷰션이 될 수 있도록 URI스킴 방식 동작 또한 지원합니다. 즉, 유니버셜 링크와 앱링크가 작동되지 않는 환경에서는 2순위로 URI스킴 방식을 작동시켜 앱 실행과 목적된 화면 이동이 정상적으로 완료될 수 있도록 지원합니다.
1. URI (Uniform Resource Identifier)
ㅇ 인터넷 서비스(웹 서비스 등)를 전제로 하여,
- 인터넷 응용 정보자원(텍스트,비디오,음향,이미지,기타 서비스 등)에 대한
통일적 식별체계를 지칭하는 개념적 용어
ㅇ 표준 : RFC 3986 : "Uniform Resource Identifier (URI): Generic Syntax"
- (2732, 2396, 1808들의 대체)
2. URI 하위 종류
※ URI는 이 모든 것들을 총칭하는 용어
ㅇ URL (Uniform Resource Locator) : 특정 자원이 있는 장소에 대한 경로(주소)
- 인터넷 콘텐츠에 대한 프로토콜/서비스/접근방법/경로 등 자원의 위치를 나타냄
. 지리적 위치에 무관하게 특정 호스트 내 자원의 위치를 지칭함
ㅇ URN (Uniform Resource Name) : 특정 자원에 대한 이름 그 자체
- 인터넷 도메인명과는 독립적으로 특정 콘텐츠에 대한 고유 식별(ID)
. 例) 특정 이름, 네임스페이스, 도서번호인 ISBN 등
ㅇ URC (Uniform Resource Charcteristic) : 특정 자원에 대한 특성 정보
- 특정 콘텐츠의 저자,제목 등의 특성 정보
3. URI 또는 URL 구문
ㅇ 구문 => URI스킴://사용자이름:암호@호스트명:포트번호/경로?쿼리#URI프래그먼트
- 참고적으로,
. `콜론(:)`은 2개를 묶은 쌍(pair)에서 좌우 구분을 위한 구분자 임
. `대쉬(//)`는 어떤 시작을 알리는 것
. 원칙적으로 URI 길이 제한 없으나, 구현상 2천자 등의 상한선은 있음
ㅇ URI Scheme (스킴)
- 접근 프로토콜을 가리킴
. URI 표기에서, URI 시작부터 콜론(:) 직전까지의 표현
- 例)
. HTTP => http://www.ktword.co.kr
. HTTPS => https://www.example.com
. FTP => ftp://file.fileserver.com/entries/01
. 이메일 => mailto:사용자이름@호스트명?Subject=Feedback
. SIP => sip:사용자이름:암호@호스트명;uri-parameters
. 전화 => tel:1234;phone-context=servername.example.com
* URI 스킴 목록 ☞ IANA 공식 URI Schemes
ㅇ 호스트명(Hostname)
- 인터넷 상에서 유일(唯一)한 식별
- 여기서, 호스트명은, FQDN 또는 IP 주소 형태 모두 가능
- 例) `www.ktword.co.kr`, `file.fileserver.com`, `192.168.xxx.xxx` 등
ㅇ 경로(path)
- 例) 위에서, 호스트명 직후에 있는 `/entries/01`
4. 절대 URI, 상대 URI, 기준 URI
ㅇ 절대(Absolute) URI : 모든 전체 경로를 다 기술한 URI 표현 (길이가 매우 클 수 있음)
ㅇ 상대(Relative) URI : 전체 경로 중 기준 URI로부터 상대적 경로 표현
ㅇ 기준(Base) URI : 보통, HTML 문서 내 `Head 요소` 안에 `Base 요소`에 표시
5. URI 변화방향
ㅇ 단순히, 정적인 자원의 위치나 식별을 나타내는 수준에서,
- 점차적으로, 동적 자원이나 서비스 결합 등을 고려하며 확대 중
ㅇ 문자체계의 변화 : (국제화)
- 문자체계가 과거 US - ASCII코드에서, 유니코드(Unicode)를 적용하는 국제화된 URI로 확장하며,
- 국제화된 표준인 IRI(Internationalized Resource Identifier) 도모
- (URI %인코딩 방식 例) `나` => UTF-8 인코딩 `%EB%82%98` (동양권 문자 3 바이트)
APP_NAME및APP_PACKAGE를 모바일 앱에 속한 값으로 대체해야 합니다 .APP_HOST는 필요하지 않을 수 있는 선택적 호스트 값입니다(다음 예에서 인스타그램 앱을 여는 데 필요함).
Instagram의 예제 코드:
// Open Instagram
const url = "intent://instagram.com/#Intent;scheme=https;package=com.instagram.android;end";
window.location.replace(url);
IOS
iOS에서 모바일 앱을 열고 앱이 설치되지 않은 경우에만 실행되는 시간 제한을 몇 초로 설정합니다.
window.location.replace("APP_NAME");
// Wait 10s and redirect to App Store if app was not opened
setTimeout(() => {
window.location.replace("APP_STORE_URL");
}, 10000);
APP_NAME및APPSTOREURL을 모바일 애플리케이션에 속한 값으로 대체해야 합니다.