Merge pull request #5849 from preco21/korean-docs-6

docs: Update Korean docs as upstream
This commit is contained in:
Cheng Zhao 2016-06-03 11:29:13 +00:00 committed by GitHub
commit 9d55424c48
22 changed files with 429 additions and 175 deletions

View file

@ -7,19 +7,18 @@
### [Electron](https://github.com/electron/electron/) 한국어 참조 문서
:zap: *이전까지 Atom Shell로 불렸지만, Electron으로 변경되었습니다* :zap:
Electron 프레임워크는 JavaScript, HTML 그리고 CSS를 사용하여
Cross-Platform 데스크톱 어플리케이션을 개발할 수 있도록 해주는 프레임워크입니다.
[Node.js](https://nodejs.org/)와 [Chromium](http://www.chromium.org)을 기반으로
만들어졌으며 [Atom Editor](https://github.com/atom/atom)에 사용되고 있습니다.
더 많은 어플리케이션은 [이곳](http://electron.atom.io/apps)에서 확인하세요.
Electron에 대한 중요한 알림을 받고 싶다면 Twitter에서
[@ElectronJS](https://twitter.com/electronjs)를 팔로우 하세요.
이 프로젝트는 기여자 규약인 [행동강령](CODE_OF_CONDUCT.md)을 준수합니다. 따라서 이
프로젝트의 개발에 참여하려면 이 규약을 지켜야 합니다. 받아들일 수 없는 행위를 발견했을
경우 atom@github.com로 보고하세요.
경우 electron@github.com로 보고하세요.
## 다운로드

View file

@ -280,6 +280,32 @@ GPU가 작동하던 중 크래시가 일어났을 때 발생하는 이벤트입
모든 윈도우는 사용자의 동의 여부에 상관없이 즉시 종료되며 `before-quit` 이벤트와
`will-quit` 이벤트가 발생하지 않습니다.
### `app.relaunch([options])`
* `options` Object (optional)
* `args` Array (optional)
* `execPath` String (optional)
현재 인스턴스가 종료되면 어플리케이션을 재시작합니다.
기본적으로 새 인스턴스는 같은 작업 디렉토리의 것과 함께 현재 인스턴스의 명령줄 인수를
사용합니다. 만약 `args`가 지정되면, `args`가 기본 명령줄 인수 대신에 전달됩니다.
`execPath`가 지정되면, 현재 어플리케이션 대신 `execPath`가 실행됩니다.
참고로 이 메서드는 어플리케이션을 종료하지 않으며, 어플리케이션을 다시 시작시키려면
`app.relaunch`를 호출한 후 `app.quit` 또는 `app.exit`를 실행해주어야 합니다.
`app.relaunch`가 여러 번 호출되면, 현재 인스턴스가 종료된 후 여러 인스턴스가
시작됩니다.
다음은 현재 인스턴스를 즉시 종료시킨 후 새로운 명령줄 인수를 추가하여 새
인스턴스의 어플리케이션을 실행하는 예시입니다:
```javascript
app.relaunch({args: process.argv.slice(1) + ['--relaunch']})
app.exit(0)
```
### `app.focus()`
Linux에선, 첫 번째로 보여지는 윈도우가 포커스됩니다. OS X에선, 어플리케이션을 활성화
@ -370,7 +396,7 @@ npm 모듈 규칙에 따라 대부분의 경우 `package.json`의 `name` 필드
**참고:** 패키징된 앱을 배포할 때, `locales` 폴더도 같이 배포해야 합니다.
**참고:** Windows에선 `ready` 이벤트가 발생한 이후에 이 메서드를 사용해야 합니다.
**참고:** Windows에선 `ready` 이벤트가 발생한 이후에 이 메서드를 호출해야 합니다.
### `app.addRecentDocument(path)` _OS X_ _Windows_
@ -445,16 +471,6 @@ Windows에서 사용할 수 있는 JumpList의 [Tasks][tasks] 카테고리에 `t
아이콘을 가지고 있을 경우, 사용할 아이콘의 인덱스를 이 옵션으로 지정해 주어야 합니다.
단, 아이콘을 하나만 포함하고 있는 경우 0을 지정하면 됩니다.
### `app.allowNTLMCredentialsForAllDomains(allow)`
* `allow` Boolean
항상 동적으로 HTTP NTLM 또는 Negotiate 인증에 자격 증명을 보낼 것인지 설정합니다.
기본적으로 Electron은 "로컬 인터넷" 사이트 URL에서 NTLM/Kerberos 자격 증명만을
보냅니다. (같은 도메인 내에서) 그러나 기업 네트워크가 잘못 구성된 경우 종종 작업에
실패할 수 있습니다. 이때 이 메서드를 통해 모든 URL을 허용할 수 있습니다.
### `app.makeSingleInstance(callback)`
* `callback` Function
@ -508,11 +524,18 @@ app.on('ready', () => {
});
```
### `app.setUserActivity(type, userInfo)` _OS X_
### `app.releaseSingleInstance()`
모든 `makeSingleInstance`에 의해 생성된 제한을 해제합니다. 이 메서드는 다시 여러
인스턴스의 어플리케이션이 나란히 실행될 수 있도록 합니다.
### `app.setUserActivity(type, userInfo[, webpageURL])` _OS X_
* `type` String - 고유하게 activity를 식별합니다.
[`NSUserActivity.activityType`][activity-type]을 맵핑합니다.
* `userInfo` Object - 다른 기기에서 사용하기 위해 저장할 앱-특정 상태.
* `webpageURL` String - 적당한 앱이 기기에 설치되지 않았을 때 브라우저에서 로드할
웹 페이지. 스킴은 반드시 `http` 또는 `https`가 되어야 합니다.
`NSUserActivity`를 만들고 현재 activity에 설정합니다. 이 activity는 이후 다른 기기와
[Handoff][handoff]할 때 자격으로 사용됩니다.

View file

@ -8,6 +8,8 @@
다음 프로젝트 중 하나를 선택하여, 어플리케이션을 배포하기 위한 멀티-플랫폼 릴리즈
서버를 손쉽게 구축할 수 있습니다:
- [nuts][nuts]: *어플리케이션을 위한 똑똑한 릴리즈 서버이며 GitHub를 백엔드로
사용합니다. Squirrel을 통해 자동 업데이트를 지원합니다. (Mac & Windows)*
- [electron-release-server][electron-release-server]: *완벽하게 모든 기능을
지원하는 electron 어플리케이션을 위한 자가 호스트 릴리즈 서버입니다. auto-updater와
호환됩니다*
@ -117,3 +119,4 @@ Returns:
[app-user-model-id]: https://msdn.microsoft.com/en-us/library/windows/desktop/dd378459(v=vs.85).aspx
[electron-release-server]: https://github.com/ArekSredzki/electron-release-server
[squirrel-updates-server]: https://github.com/Aluxian/squirrel-updates-server
[nuts]: https://github.com/GitbookIO/nuts

View file

@ -36,8 +36,10 @@ win.show();
* `width` Integer - 윈도우의 가로 너비. 기본값은 `800`입니다.
* `height` Integer - 윈도우의 세로 높이. 기본값은 `600`입니다.
* `x` Integer - 화면을 기준으로 창 좌측을 오프셋 한 위치. 기본값은 `화면중앙`입니다.
* `y` Integer - 화면을 기준으로 창 상단을 오프셋 한 위치. 기본값은 `화면중앙`입니다.
* `x` Integer (**required** y가 사용되면) - 화면을 기준으로 창 좌측을 오프셋 한 위치.
기본값은 `화면중앙`입니다.
* `y` Integer (**required** x가 사용되면) - 화면을 기준으로 창 상단을 오프셋 한 위치.
기본값은 `화면중앙`입니다.
* `useContentSize` Boolean - `width``height`를 웹 페이지의 크기로 사용합니다.
이 속성을 사용하면 웹 페이지의 크기에 윈도우 프레임 크기가 추가되므로 실제 창은 조금
더 커질 수 있습니다. 기본값은 `false`입니다.
@ -61,14 +63,21 @@ win.show();
* `fullscreen` Boolean - 윈도우의 전체화면 활성화 여부. 이 속성을 명시적으로
`false`로 지정했을 경우, OS X에선 전체화면 버튼이 숨겨지거나 비활성됩니다. 기본값은
`false` 입니다.
* `fullscreenable` Boolean - OS X의 최대화/줌 버튼이 전체화면 모드 또는 윈도우
최대화를 토글할 수 있게 할지 여부입니다. 기본값은 `true` 입니다.
* `fullscreenable` Boolean - 윈도우가 전체화면 모드로 전환될 수 있는지 여부입니다.
또한 OS X에선, 최대화/줌 버튼이 전체화면 모드 또는 윈도우 최대화를 실행할지 여부도
포함됩니다. 기본값은 `true`입니다.
* `skipTaskbar` Boolean - 작업표시줄 어플리케이션 아이콘 표시 스킵 여부. 기본값은
`false`입니다.
* `kiosk` Boolean - Kiosk(키오스크) 모드. 기본값은 `false`입니다.
* `title` String - 기본 윈도우 제목. 기본값은 `"Electron"`입니다.
* `icon` [NativeImage](native-image.md) - 윈도우 아이콘, 생략하면 실행 파일의
아이콘이 대신 사용됩니다.
* `icon` [NativeImage](native-image.md) - 윈도우 아이콘. Windows에선 가장 좋은
시각적 효과를 얻기 위해 `ICO`를 사용하는 것을 권장하며, 또한 undefined로 남겨두면
실행 파일의 아이콘이 대신 사용됩니다.
On Windows it is
recommended to use `ICO` icons to get best visual effects, you can also
leave it undefined so the executable's icon will be used.
* `show` Boolean - 윈도우가 생성되면 보여줄지 여부. 기본값은 `true`입니다.
* `frame` Boolean - `false`로 지정하면 창을 [Frameless Window](frameless-window.md)
형태로 생성합니다. 기본값은 `true`입니다.
@ -209,19 +218,17 @@ Returns:
보통 창을 닫아야 할지 결정하기 위해 `beforeunload` 이벤트를 사용하려고 할 것입니다.
이 이벤트는 윈도우 콘텐츠를 새로고칠 때도 발생합니다.
Electron에선 빈 문자열 또는 `false`를 전달할 경우 윈도우 종료를 취소합니다.
Electron에선 `undefined`가 아닌 이외의 값을 전달할 경우 윈도우 종료를 취소합니다.
예시는 다음과 같습니다:
```javascript
window.onbeforeunload = (e) => {
console.log('I do not want to be closed');
// 반드시 문자열을 반환해야 하고 사용자에게 페이지 언로드에 대한 확인 창을 보여주는
// 보통의 브라우저와는 달리 Electron은 개발자에게 더 많은 옵션을 제공합니다.
// 빈 문자열을 반환하거나 false를 반환하면 페이지 언로드를 방지합니다.
// 또한 dialog API를 통해 사용자에게 어플리케이션을 종료할지에 대한 확인 창을
// 보여줄 수도 있습니다.
// 일반적인 브라우저와는 달리 사용자에게 확인 창을 보여주지 않고, non-void 값을 반환하면
// 조용히 닫기를 취소합니다.
// Dialog API를 통해 사용자가 어플리케이션을 종료할지 정할 수 있도록 확인 창을 표시하는 것을
// 추천합니다.
e.returnValue = false;
};
```
@ -676,7 +683,7 @@ let win = new BrowserWindow({width: 800, height: 600});
**참고:** 웹 페이지의 제목과 네이티브 윈도우의 제목은 서로 다를 수 있습니다.
### `win.setSheetOffset(offset)` _OS X_
### `win.setSheetOffset(offsetY[, offsetX])` _OS X_
Mac OS X에서 시트를 부착할 위치를 지정합니다. 기본적으로 시트는 윈도우의 프레임 바로
아래의 위치에 부착됩니다. 아마도 이 기능은 보통 다음과 같이 HTML 렌더링된 툴바 밑에
@ -861,6 +868,12 @@ Linux 플랫폼에선 Unity 데스크톱 환경만 지원합니다. 그리고
페이지의 선택된 단어에 대한 사전 검색 결과 팝업을 표시합니다.
### `win.setIcon(icon)` _Windows_ _Linux_
* `icon` [NativeImage](native-image.md)
윈도우 아이콘을 변경합니다.
### `win.setAutoHideMenuBar(hide)`
* `hide` Boolean

View file

@ -24,9 +24,13 @@ app.on('ready', () => {
HTTP 요청 캐시를 비활성화합니다.
## --disable-http2
HTTP/2와 SPDY/3.1 프로토콜을 비활성화합니다.
## --remote-debugging-port=`port`
지정한 `port`에 HTTP 기반의 리모트 디버거를 활성화 시킵니다. (개발자 도구)
지정한 `port`에 HTTP 기반의 리모트 디버거를 활성화니다. (개발자 도구)
## --js-flags=`flags`
@ -91,6 +95,24 @@ resolver, http 프록시 연결의 `CONNECT`, `SOCKS` 프록시 연결의 endpoi
`--host-rules` 플래그와 비슷하지만 이 플래그는 host resolver에만 적용됩니다.
## --auth-server-whitelist=`url`
통합 인증을 사용하도록 설정할 쉼표로 구분된 서버의 리스트.
예를 들어:
```
--auth-server-whitelist='*example.com, *foobar.com, *baz'
```
그리고 모든 `example.com`, `foobar.com`, `baz`로 끝나는 `url`은 통합 인증을
사용하도록 설정됩니다. `*` 접두어가 없다면 url은 정확히 일치해야 합니다.
## --auth-negotiate-delegate-whitelist=`url`
필수적인 사용자 자격 증명을 보내야 할 쉼표로 구분된 서버의 리스트.
`*` 접두어가 없다면 url은 정확히 일치해야 합니다.
## --ignore-certificate-errors
인증서 에러를 무시합니다.

View file

@ -2,8 +2,8 @@
> 어플리케이션의 구성과 동작을 코드 변경 없이 제어합니다.
Electron의 몇몇 동작은 명령 줄과 어플리케이션의 코드보다 먼저 초기화되어야 하므로 환경
변수에 의해 작동합니다.
특정 Electron 동작은 명령줄 플래그와 어플리케이션의 코드보다 먼저 초기화되어야 하므로
환경 변수에 의해 작동합니다.
POSIX 쉘의 예시입니다:
@ -19,35 +19,35 @@ Windows 콘솔의 예시입니다:
> electron
```
## `ELECTRON_RUN_AS_NODE`
### `ELECTRON_RUN_AS_NODE`
프로세스를 일반 Node.js 프로세스처럼 시작합니다. (electron 모듈 제외)
## `ELECTRON_ENABLE_LOGGING`
### `ELECTRON_ENABLE_LOGGING`
Chrome의 내부 로그를 콘솔에 출력합니다.
## `ELECTRON_LOG_ASAR_READS`
### `ELECTRON_LOG_ASAR_READS`
Electron이 ASAR 파일을 읽을 때, 읽기 오프셋의 로그를 남기고 시스템 `tmpdir`에 파일로
저장합니다. 결과 파일은 ASAR 모듈의 파일 순서를 최적화 하는데 사용할 수 있습니다.
## `ELECTRON_ENABLE_STACK_DUMPING`
### `ELECTRON_ENABLE_STACK_DUMPING`
Electron이 크래시되면, 콘솔에 stack trace를 출력합니다.
이 환경 변수는 `crashReporter`가 시작되지 않았을 경우 작동하지 않습니다.
## `ELECTRON_DEFAULT_ERROR_MODE` _Windows_
### `ELECTRON_DEFAULT_ERROR_MODE` _Windows_
Electron이 크래시되면, 크래시 정보 창을 표시합니다.
Electron이 크래시되면 스택 출력 정보를 콘솔에 출력합니다.
이 환경 변수는 `crashReporter`가 시작되지 않았을 경우 작동하지 않습니다.
## `ELECTRON_NO_ATTACH_CONSOLE` _Windows_
### `ELECTRON_NO_ATTACH_CONSOLE` _Windows_
현재 콘솔 세션에 소속시키지 않습니다.
## `ELECTRON_FORCE_WINDOW_MENU_BAR` _Linux_
### `ELECTRON_FORCE_WINDOW_MENU_BAR` _Linux_
Linux의 전역 메뉴바를 사용하지 않습니다.

View file

@ -25,7 +25,13 @@ const appIcon = new Tray(image);
현재 `PNG``JPEG` 이미지 포맷을 지원하고 있습니다.
손실 없는 이미지 압축과 투명도 지원을 위해 `PNG` 사용을 권장합니다.
그리고 Windows에서는 `ICO` 포맷도 사용할 수 있습니다.
Windows에서는 파일 경로로부터 `ICO` 포맷도 사용할 수 있으며, 가장 좋은 시각적 효과를
얻기 위해 최소한 아이콘에 다음 사이즈를 포함하는 것을 권장합니다:
* 16x16
* 32x32
* 64x64
* 256x256
## 고해상도 이미지

View file

@ -1,21 +1,8 @@
# process
# process
> 현재 작동중인 어플리케이션의 정보를 가져옵니다.
> process 객체에 대한 확장 기능.
Electron의 `process` 객체는 기존의 node와는 달리 약간의 차이점이 있습니다:
* `process.type` String - 프로세스의 타입, `browser` (메인 프로세스) 또는
`renderer`가 됩니다.
* `process.versions.electron` String - Electron의 버전.
* `process.versions.chrome` String - Chromium의 버전.
* `process.resourcesPath` String - JavaScript 소스 코드의 경로.
* `process.mas` Boolean - Mac 앱 스토어용 빌드일 때 `true`로 지정됩니다. 다른
빌드일 땐 `undefined`로 지정됩니다.
* `process.windowsStore` Boolean - 만약 앱이 Windows Store 앱 (appx)으로 작동하고
있다면, 이 값이 `true`로 지정되며 다른 빌드인 경우엔 `undefined`로 지정됩니다.
* `process.defaultApp` Boolean - 어플리케이션이 기본 어플리케이션 형식으로 전달되는
인수와 함께 실행됐을 때, 메인 프로세스에서 이 값이 `true`가 되며 다른 경우엔
`undefined`가 됩니다.
`process` 객체는 Electron에서 약간 추가적인 기능이 있으며 API는 다음과 같습니다:
## Events
@ -41,6 +28,96 @@ process.once('loaded', () => {
### `process.noAsar`
Setting this to `true` can disable the support for `asar` archives in Node's
built-in modules.
### `process.type`
Current process's type, can be `"browser"` (i.e. main process) or `"renderer"`.
### `process.versions.electron`
Electron's version string.
### `process.versions.chrome`
Chrome's version string.
### `process.resourcesPath`
Path to the resources directory.
### `process.mas`
For Mac App Store build, this property is `true`, for other builds it is
`undefined`.
### `process.windowsStore`
If the app is running as a Windows Store app (appx), this property is `true`,
for otherwise it is `undefined`.
### `process.defaultApp`
When app is started by being passed as parameter to the default app, this
property is `true` in the main process, otherwise it is `undefined`.
## Methods
The `process` object has the following method:
### `process.crash()`
Causes the main thread of the current process crash.
### `process.hang()`
Causes the main thread of the current process hang.
### `process.setFdLimit(maxDescriptors)` _OS X_ _Linux_
* `maxDescriptors` Integer
Sets the file descriptor soft limit to `maxDescriptors` or the OS hard
limit, whichever is lower for the current process.
### `process.getProcessMemoryInfo()`
Returns an object giving memory usage statistics about the current process. Note
that all statistics are reported in Kilobytes.
* `workingSetSize` - The amount of memory currently pinned to actual physical
RAM.
* `peakWorkingSetSize` - The maximum amount of memory that has ever been pinned
to actual physical RAM.
* `privateBytes` - The amount of memory not shared by other processes, such as
JS heap or HTML content.
* `sharedBytes` - The amount of memory shared between processes, typically
memory consumed by the Electron code itself
### `process.getSystemMemoryInfo()`
Returns an object giving memory usage statistics about the entire system. Note
that all statistics are reported in Kilobytes.
* `total` - The total amount of physical memory in Kilobytes available to the
system.
* `free` - The total amount of memory not being used by applications or disk
cache.
On Windows / Linux:
* `swapTotal` - The total amount of swap memory in Kilobytes available to the
system.
* `swapFree` - The free amount of swap memory in Kilobytes available to the
system.
----------------------------------------
## Properties
### `process.noAsar`
이 속성을 `true`로 지정하면 Node 빌트인 모듈의 `asar` 아카이브 지원을 비활성화 시킬
수 있습니다.

View file

@ -35,8 +35,9 @@ win.loadURL('https://github.com');
않습니다. 대신에 이 `BrowserWindow` 객체는 메인 프로세스에서 생성되며 렌더러
프로세스에 `win` 객체와 같이 이에 대응하는 remote 객체를 반환합니다.
참고로 remote를 통해선 [enumerable 속성](https://developer.mozilla.org/ko/docs/Web/JavaScript/Enumerability_and_ownership_of_properties)을
가진 프로퍼티에만 접근할 수 있습니다.
참고로 remote 객체가 처음 참조될 때 표시되는
[enumerable 속성](https://developer.mozilla.org/ko/docs/Web/JavaScript/Enumerability_and_ownership_of_properties)은
remote를 통해서만 접근할 수 있습니다.
## Remote 객체의 생명 주기

View file

@ -136,17 +136,18 @@ session.defaultSession.cookies.set(cookie, (error) => {
#### `ses.cookies.set(details, callback)`
* `details` Object
* `url` String - `url`에 관련된 쿠키를 가져옵니다.
* `url` String - 쿠키에 대한 `url` 링크.
* `name` String - 쿠키의 이름입니다. 기본적으로 비워두면 생략됩니다.
* `value` String - 쿠키의 값입니다. 기본적으로 비워두면 생략됩니다.
* `domain` String - 쿠키의 도메인입니다. 기본적으로 비워두면 생략됩니다.
* `path` String - 쿠키의 경로입니다. 기본적으로 비워두면 생략됩니다.
* `secure` Boolean - 쿠키가 안전한 것으로 표시되는지에 대한 여부입니다. 기본값은
false입니다.
* `session` Boolean - 쿠키가 HttpOnly로 표시되는지에 대한 여부입니다. 기본값은
* `session` Boolean - 쿠키가 Http 전용으로 표시되는지에 대한 여부입니다. 기본값은
false입니다.
* `expirationDate` Double (optional) - UNIX 시간으로 표시되는 쿠키의 만료일에
대한 초 단위 시간입니다. 세션 쿠키에 제공되지 않습니다.
대한 초 단위 시간입니다. 생략되면 쿠키가 세션 쿠기가 되며 세션 사이에 유지되지
않게 됩니다.
* `callback` Function
`details` 객체에 따라 쿠키를 설정합니다. 작업이 완료되면 `callback`
@ -322,6 +323,22 @@ session.fromPartition(partition).setPermissionRequestHandler((webContents, permi
호스트 리소버(resolver) 캐시를 지웁니다.
#### `ses.allowNTLMCredentialsForDomains(domains)`
* `domains` String - 통합 인증을 사용하도록 설정할 쉼표로 구분된 서버의 리스트.
동적으로 HTTP NTML 또는 Negotiate 인증을 위해 언제나 자격 증명을 보낼지 여부를
설정합니다.
```javascript
// 통합 인증을 위해 `example.com`, `foobar.com`, `baz`로 끝나는
// 모든 url을 지정합니다.
session.defaultSession.allowNTLMCredentialsForDomains('*example.com, *foobar.com, *baz')
// 통합 인증을 위해 모든 url을 지정합니다.
session.defaultSession.allowNTLMCredentialsForDomains('*')
```
#### `ses.webRequest`
`webRequest` API는 생명주기의 다양한 단계에 맞춰 요청 콘텐츠를 가로채거나 변경할 수

View file

@ -37,8 +37,8 @@ OS X의 네이티브 알림을 구독하며, 해당하는 `event`가 발생하
### `systemPreferences.getUserDefault(key, type)` _OS X_
* `key` String
* `type` String - `string`, `boolean`, `integer`, `float`, `double`, `url` 값이
될 수 있습니다.
* `type` String - `string`, `boolean`, `integer`, `float`, `double`, `url`,
`array`, `dictionary` 값이 될 수 있습니다.
시스템 설정에서 `key`에 해당하는 값을 가져옵니다.
@ -49,6 +49,9 @@ OS X에선 API가 `NSUserDefaults`를 읽어들입니다. 유명한 `key`와 `ty
* `AppleAquaColorVariant: integer`
* `AppleHighlightColor: string`
* `AppleShowScrollBars: string`
* `NSNavRecentPlaces: array`
* `NSPreferredWebServices: dictionary`
* `NSUserDictionaryReplacementItems: array`
### `systemPreferences.isAeroGlassEnabled()` _Windows_

View file

@ -27,6 +27,8 @@ __플랫폼별 한계:__
트레이 아이콘이 작동하도록 만들 수 있습니다.
* 앱 알림 표시기는 컨텍스트 메뉴를 가지고 있을 때만 보입니다.
* Linux에서 앱 표시기가 사용될 경우, `click` 이벤트는 무시됩니다.
* Windows에선 가장 좋은 시각적 효과를 얻기 위해 `ICO` 아이콘을 사용하는 것을
권장합니다.
* Linux에서 각각 개별 `MenuItem`의 변경을 적용하려면 `setContextMenu`를 다시
호출해야 합니다. 예를 들면:

View file

@ -360,6 +360,41 @@ Returns:
새로운 컨텍스트 메뉴의 제어가 필요할 때 발생하는 이벤트입니다.
### Event: 'select-bluetooth-device'
Returns:
* `event` Event
* `devices` [Objects]
* `deviceName` String
* `deviceId` String
* `callback` Function
* `deviceId` String
`navigator.bluetooth.requestDevice`의 호출에 의해 블루투스 기기가 선택되어야 할 때
발생하는 이벤트입니다. `navigator.bluetooth` API를 사용하려면 `webBluetooth`
활성화되어 있어야 합니다. 만약 `event.preventDefault`이 호출되지 않으면, 첫 번째로
사용 가능한 기기가 선택됩니다. `callback`은 반드시 선택될 `deviceId`와 함께
호출되어야 하며, 빈 문자열을 `callback`에 보내면 요청이 취소됩니다.
```javascript
app.commandLine.appendSwitch('enable-web-bluetooth')
app.on('ready', () => {
webContents.on('select-bluetooth-device', (event, deviceList, callback) => {
event.preventDefault()
let result = deviceList.find((device) => {
return device.deviceName === 'test'
})
if (!result) {
callback('')
} else {
callback(result.deviceId)
}
})
})
```
## Instance Methods
`webContents`객체는 다음과 같은 인스턴스 메서드들을 가지고 있습니다.
@ -634,7 +669,8 @@ print기능을 사용하지 않는 경우 전체 바이너리 크기를 줄이
* `marginsType` Integer - 사용할 마진의 종류를 지정합니다. 0 부터 2 사이 값을 사용할
수 있고 각각 기본 마진, 마진 없음, 최소 마진입니다.
* `pageSize` String - 생성되는 PDF의 페이지 크기를 지정합니다. 값은 `A3`, `A4`,
`A5`, `Legal`, `Letter``Tabloid`가 사용될 수 있습니다.
`A5`, `Legal`, `Letter`, `Tabloid` 또는 마이크론 단위의 `height` & `width`
포함된 객체를 사용할 수 있습니다.
* `printBackground` Boolean - CSS 배경을 프린트할지 여부를 정합니다.
* `printSelectionOnly` Boolean - 선택된 영역만 프린트할지 여부를 정합니다.
* `landscape` Boolean - landscape을 위해선 `true`를, portrait를 위해선 `false`
@ -658,6 +694,8 @@ Chromium의 미리보기 프린팅 커스텀 설정을 이용하여 윈도우의
}
```
다음은 `webContents.printToPDF`의 예시입니다:
```javascript
const {BrowserWindow} = require('electron');
const fs = require('fs');

View file

@ -433,19 +433,19 @@ Service worker에 대한 개발자 도구를 엽니다.
* `action` String - [`<webview>.findInPage`](web-view-tag.md#webviewtagfindinpage)
요청이 종료되었을 때 일어날 수 있는 작업을 지정합니다.
* `clearSelection` - 선택을 일반 선택으로 변경합니다.
* `keepSelection` - 선택을 취소합니다.
* `clearSelection` - 선택을 취소합니다.
* `keepSelection` - 선택을 일반 선택으로 변경합니다.
* `activateSelection` - 포커스한 후 선택된 노드를 클릭합니다.
제공된 `action`에 대한 `webContents`의 모든 `findInPage` 요청을 중지합니다.
### `<webview>.print([options])`
Webview 페이지를 인쇄합니다. `webContents.print([options])` 메서드와 같습니다.
`webview` 페이지를 인쇄합니다. `webContents.print([options])` 메서드와 같습니다.
### `<webview>.printToPDF(options, callback)`
Webview 페이지를 PDF 형식으로 인쇄합니다.
`webview` 페이지를 PDF 형식으로 인쇄합니다.
`webContents.printToPDF(options, callback)` 메서드와 같습니다.
### `<webview>.send(channel[, arg1][, arg2][, ...])`
@ -463,7 +463,7 @@ Webview 페이지를 PDF 형식으로 인쇄합니다.
* `event` Object
페이지에 input `event`를 보냅니다.
페이지에 입력 `event`를 보냅니다.
`event` 객체에 대해 자세히 알아보려면 [webContents.sendInputEvent](web-contents.md##webcontentssendinputeventevent)를
참고하세요.
@ -617,7 +617,7 @@ webview.addEventListener('found-in-page', (e) => {
webview.stopFindInPage('keepSelection');
});
const rquestId = webview.findInPage('test');
const requestId = webview.findInPage('test');
```
### Event: 'new-window'

View file

@ -59,6 +59,10 @@
자식 윈도우에 포커스를 맞춥니다. (창을 맨 앞으로 가져옵니다)
### `BrowserWindowProxy.print()`
자식 윈도우에 프린트 대화 상자를 호출합니다.
### `BrowserWindowProxy.postMessage(message, targetOrigin)`
* `message` String

View file

@ -21,7 +21,7 @@ Studio를 사용할 수 없습니다. 하지만 여전히 Electron을 개발할
**참고:** Visual Studio가 직접 빌드에 사용되지 않더라도 IDE와 같이 제공된 빌드
툴체인이 빌드에 **반드시** 사용되므로 여전히 필요합니다.
**참고:** Visual Studio 2013 사용할 수 없습니다 MSVS **2015** 을 사용하고 있는지
**참고:** Visual Studio 2013 사용할 수 없습니다 MSVS **2015** 을 사용하고 있는지
확인해주세요.
## 코드 가져오기
@ -97,7 +97,7 @@ $ python script\test.py -R
### Command xxxx not found
만약 `Command xxxx not found`와 같은 형식의 에러가 발생했다면
`VS2015 Command Prompt` 콘솔로 빌드 스크립트를 실행해볼 필요가 있습니다.
`VS2015 Command Prompt` 콘솔로 빌드 스크립트를 실행해 보는게 좋습니다.
### Fatal internal compiler error: C1001

View file

@ -10,35 +10,35 @@ Electron의 소스 코드는 몇 개의 파트로 분리되어 있습니다. 그
```
Electron
├── atom - C++ 소스 코드.
| ├── app - 시스템 엔트리 코드.
| ├── browser - 주 윈도우를 포함한 프론트엔드, UI, 그리고 메인 프로세스에 관련된
├── atom/ - C++ 소스 코드.
| ├── app/ - 시스템 엔트리 코드.
| ├── browser/ - 주 윈도우를 포함한 프론트엔드, UI, 그리고 메인 프로세스에 관련된
| | 코드와 렌더러 및 웹 페이지 관리 관련 코드.
| | ├── ui - 서로 다른 플랫폼에 대한 UI 관련 구현 코드.
| | | ├── cocoa - Cocoa 특정 소스 코드.
| | | ├── gtk - GTK+ 특정 소스 코드.
| | | └── win - Windows GUI 특정 소스 코드.
| | ├── api - 메인 프로세스 API의 구현.
| | ├── net - 네트워킹 관련 코드.
| | ├── mac - Mac 특정 Objective-C 소스 코드.
| | └── resources - 아이콘들, 플랫폼 종속성 파일들, 기타 등등..
| ├── renderer - 렌더러 프로세스에서 작동하는 코드.
| | └── api - 렌더러 프로세스 API의 구현.
| └── common - 메인과 렌더러 프로세스에서 모두 사용하는 코드, 몇가지 유틸리티
| | ├── ui/ - 서로 다른 플랫폼에 대한 UI 관련 구현 코드.
| | | ├── cocoa/ - Cocoa 특정 소스 코드.
| | | ├── win/ - Windows GUI 특정 소스 코드.
| | | └── x/ - X11 특정 소스 코드.
| | ├── api/ - 메인 프로세스 API의 구현.
| | ├── net/ - 네트워킹 관련 코드.
| | ├── mac/ - Mac 특정 Objective-C 소스 코드.
| | └── resources/ - 아이콘들, 플랫폼 종속성 파일들, 기타 등등..
| ├── renderer/ - 렌더러 프로세스에서 작동하는 코드.
| | └── api/ - 렌더러 프로세스 API의 구현.
| └── common/ - 메인과 렌더러 프로세스에서 모두 사용하는 코드, 몇가지 유틸리티
| 함수들이 포함되어 있고 node의 메시지 루프와 Chromium의 메시지 루프를 통합.
| └── api - 공통 API 구현들, 기초 Electron 빌트-인 모듈들.
├── chromium_src - Chromium에서 복사하여 가져온 소스코드.
├── default_app - Electron에 앱이 제공되지 않았을 때 보여지는 기본 페이지.
├── docs - 참조 문서.
├── lib - JavaScript 소스 코드.
| ├── browser - Javascript 메인 프로세스 초기화 코드.
| | └── api - Javascript API 구현 코드.
| ├── common - 메인과 렌더러 프로세스에서 모두 사용하는 JavaScript
| | └── api - Javascript API 구현 코드.
| └── renderer - Javascript 렌더러 프로세스 초기화 코드.
| └── api - Javascript API 구현 코드.
├── spec - 자동화 테스트.
├── atom.gyp - Electron의 빌드 규칙.
| └── api/ - 공통 API 구현들, 기초 Electron 빌트-인 모듈들.
├── chromium_src/ - Chromium에서 복사하여 가져온 소스 코드.
├── default_app/ - Electron에 앱이 제공되지 않았을 때 보여지는 기본 페이지.
├── docs/ - 참조 문서.
├── lib/ - JavaScript 소스 코드.
| ├── browser/ - Javascript 메인 프로세스 초기화 코드.
| | └── api/ - Javascript API 구현 코드.
| ├── common/ - 메인과 렌더러 프로세스에서 모두 사용하는 JavaScript
| | └── api/ - Javascript API 구현 코드.
| └── renderer/ - Javascript 렌더러 프로세스 초기화 코드.
| └── api/ - Javascript API 구현 코드.
├── spec/ - 자동화 테스트.
├── electron.gyp - Electron의 빌드 규칙.
└── common.gypi - 컴파일러 설정 및 `node``breakpad` 등의 구성요소를 위한 빌드
규칙.
```

View file

@ -105,6 +105,14 @@ MyApp.app/Contents
아이콘은 [.desktop](https://developer.gnome.org/integration-guide/stable/desktop-files.html.en)
파일을 사용하여 지정할 수 있습니다.
## 패키징 툴
어플리케이션을 일일이 수동으로 패키지로 만드는 대신, 서드 파티 패키징 툴을 사용하며
이러한 작업을 자동화 시킬 수 있습니다:
* [electron-packager](https://github.com/maxogden/electron-packager)
* [electron-builder](https://github.com/loopline-systems/electron-builder)
## Electron 소스 코드를 다시 빌드하여 리소스 수정하기
또한 Electron 소스 코드를 다시 빌드할 때 어플리케이션 이름을 변경할 수 있습니다.
@ -138,10 +146,49 @@ Electron의 소스코드를 수정하고 다시 빌드하는 작업은 상당히
이 툴을 사용하면 자동으로 `.gyp`파일을 수정하고 다시 빌드합니다. 그리고 어플리케이션의
네이티브 Node 모듈 또한 새로운 실행파일 이름으로 일치시킵니다.
## 패키징 툴
### Electron 커스텀 포크 만들기
어플리케이션을 일일이 수동으로 패키지로 만드는 대신, 서드 파티 패키징 툴을 사용하며
이러한 작업을 자동화 시킬 수 있습니다:
Electron의 커스텀 포크를 만드는 것은 거의 확실히 앱을 만드는데 있어서 필요한 작업이
아닐 수 있으며, 심지어 "제품 등급"의 어플리케이션이라도 필요하지 않습니다.
`electron-packager` 또는 `electron-builder`와 같은 도구를 사용하면 다른 특별한
과정 없이 Electron을 "Rebrand" 할 수 있습니다.
* [electron-packager](https://github.com/maxogden/electron-packager)
* [electron-builder](https://github.com/loopline-systems/electron-builder)
업스트림 단에서 추가될 수 없는 기능이나 이미 공식 버전에서 거부된 기능을 Electron에
직접적으로 패치하기 위해 커스텀 C++를 추가해야 한다면 Electron을 포크해야 합니다.
Electron의 개발자로써, Electron을 매우 많은 시나리오에서도 작동하도록 만들려고
합니다. 따라서 가능한한 변경 사항을 공식 버전의 Electron에 추가할 수 있도록 시도해
주길 바라며, 당신에겐 아주 아주 쉬운 작업일 것이고 이러한 당신의 도움에 대해 감사하게
생각합니다.
#### surf-build와 함께 커스텀 릴리즈 만들기
1. npm을 통해 [Surf](https://github.com/surf-build/surf)를 설치합니다:
`npm install -g surf-build@latest`
2. 새로운 S3 bucket을 만들고 다음과 같은 빈 디렉토리 구조를 만듭니다:
```
- atom-shell/
- symbols/
- dist/
```
3. 다음의 환경 변수들을 설정합니다:
* `ELECTRON_GITHUB_TOKEN` - GitHub에 릴리즈를 만들 수 있는 토큰.
* `ELECTRON_S3_ACCESS_KEY`, `ELECTRON_S3_BUCKET`, `ELECTRON_S3_SECRET_KEY` -
node.js 헤더 뿐만 아니라 심볼을 업로드할 장소.
* `ELECTRON_RELEASE` - `true`로 지정하고 업로드 부분이 실행되면, 설정되지 않은
부분을 남기고 `surf-build`가 CI-type 확인을 실행합니다. 모든 pull request를
실행할 때 적합합니다.
* `CI` - `true` 또는 다른 것을 지정하면 실패합니다.
* `GITHUB_TOKEN` - `ELECTRON_GITHUB_TOKEN`와 같게 설정
* `SURF_TEMP` - Windows에선 `C:\Temp`로 설정하면 긴 경로 문제를 해결할 수 있습니다.
* `TARGET_ARCH` - `ia32` 또는 `x64`를 지정.
4. Electron에 기여를 하는 기여자라면, _반드시_ `script/upload.py`에서 포크를 위해
`ELECTRON_REPO`를 설정해야 합니다. (`MYORG/electron`)
5. `surf-build -r https://github.com/MYORG/electron -s YOUR_COMMIT -n 'surf-PLATFORM-ARCH'`
6. 빌드가 완료될 때까지 아주 아주 긴 시간을 기다립니다.

View file

@ -1,63 +1,59 @@
# 개발자 도구 확장 기능
# 개발자 도구 확장 기능
어플리케이션의 디버깅을 쉽게 하기 위해 Electron은 기본적으로
[Chrome DevTools Extension][devtools-extension]을 지원합니다.
개발자 도구 확장 기능은 간단하게 사용할 확장 기능 플러그인의 소스 코드를 다운로드한 후
`BrowserWindow.addDevToolsExtension` API를 통해 어플리케이션 내에 로드할 수 있습니다.
한가지 주의할 점은 확장 기능 사용시 창이 생성될 때 마다 일일이 해당 API를 호출할 필요는
없습니다.
Electron은 유명한 웹 프레임워크를 디버깅하기 위해 사용할 수 있는 개발자 도구 확장
기능을 사용할 수 있도록 [Chrome 개발자 도구 확장 기능][devtools-extension]을
지원합니다.
**주의: 현재 React DevTools은 작동하지 않습니다. https://github.com/electron/electron/issues/915 이슈를 참고하세요!**
## 개발자 도구는 어떻게 로드하나요
다음 예시는 [React DevTools Extension](https://github.com/facebook/react-devtools)을
사용합니다.
Electron에 확장 기능을 로드하려면, Chrome 브라우저에서 다운로드 해야 하며, 파일 시스템 경로를 지정해야 합니다. 그리고 `BrowserWindow.addDevToolsExtension(extension)`를 호출함으로써 기능을 로드할 수 있습니다.
먼저 소스코드를 다운로드 받습니다:
예시로 [React Developer Tools][react-devtools]를 사용한다면:
```bash
$ cd /some-directory
$ git clone --recursive https://github.com/facebook/react-devtools.git
```
1. Chrome 브라우저를 설치합니다.
2. `chrome://extensions`로 이동한 후 해시된 `fmkadmapgofadopljbjfkapdkoienihi`
같이 생긴 확장 기능의 ID를 찾습니다.
3. Chrome에서 사용하는 확장 기능을 저장해둔 파일 시스템 경로를 찾습니다:
* Windows에선 `%LOCALAPPDATA%\Google\Chrome\User Data\Default\Extensions`;
* Linux에선:
* `~/.config/google-chrome/Default/Extensions/`
* `~/.config/google-chrome-beta/Default/Extensions/`
* `~/.config/google-chrome-canary/Default/Extensions/`
* `~/.config/chromium/Default/Extensions/`
* OS X에선 `~/Library/Application Support/Google/Chrome/Default/Extensions`.
4. 확장 기능의 경로를 `BrowserWindow.addDevToolsExtension` API로 전달합니다.
React Developer Tools의 경우 다음과 비슷해야 합니다:
`~/Library/Application Support/Google/Chrome/Default/Extensions/fmkadmapgofadopljbjfkapdkoienihi/0.14.10_0`
[`react-devtools/shells/chrome/Readme.md`](https://github.com/facebook/react-devtools/blob/master/shells/chrome/Readme.md)를
통해 확장 기능을 개발하는 방법을 알아볼 수 있습니다.
확장 기능의 이름은 `BrowserWindow.addDevToolsExtension`에서 반환되며, 이 이름을
`BrowserWindow.removeDevToolsExtension` API로 전달함으로써 해당하는 확장 기능을
언로드할 수 있습니다.
그리고 개발자 도구에서 다음 코드를 입력하면 확장 기능을 로드할 수 있습니다:
## 지원하는 개발자 도구 확장 기능
```javascript
const BrowserWindow = require('electron').remote.BrowserWindow;
BrowserWindow.addDevToolsExtension('/some-directory/react-devtools/shells/chrome');
```
Electron은 아주 제한적인 `chrome.*` API만을 지원하므로 확장 기능이 지원하지 않는
`chrome.*` API를 사용한다면 해당 기능은 작동하지 않을 것입니다. 다음 개발자 도구들은
Electron에서 정상적으로 작동하는 것을 확인했으며 작동 여부를 보장할 수 있는 확장
기능입니다:
확장 기능을 언로드 하고 콘솔을 다시 열 때 해당 확장 기능이 로드되지 않도록 하려면
`BrowserWindow.removeDevToolsExtension` API를 사용하면 됩니다:
* [Ember Inspector](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi)
* [React Developer Tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi)
* [Backbone Debugger](https://chrome.google.com/webstore/detail/backbone-debugger/bhljhndlimiafopmmhjlgfpnnchjjbhd)
* [jQuery Debugger](https://chrome.google.com/webstore/detail/jquery-debugger/dbhhnnnpaeobfddmlalhnehgclcmjimi)
* [AngularJS Batarang](https://chrome.google.com/webstore/detail/angularjs-batarang/ighdmehidhipcmcojjgiloacoafjmpfk)
* [Vue.js devtools](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd)
```javascript
BrowserWindow.removeDevToolsExtension('React Developer Tools');
```
### 개발자 도구가 작동하지 않을 때 어떻게 해야 하나요?
## 개발자 도구 확장 기능의 구성 형식
먼저 해당 확장 기능이 확실히 계속 유지되고 있는지를 확인하세요. 몇몇 확장 기능들은
최신 버전의 Chrome 브라우저에서도 작동하지 않습니다. 그리고 이러한 확장 기능에 대해선
Electron 개발팀에 해줄 수 있는 것이 아무것도 없습니다.
모든 개발자 도구 확장은 완벽히 Chrome 브라우저를 위해 작성되었기 때문에 Electron에서도
로드할 수 있습니다. 하지만 반드시 확장 기능은 소스 코드 디렉터리(폴더) 형태여야 합니다.
그래서 `crx` 등의 포맷으로 패키징된 확장 기능의 경우 사용자가 직접 해당 패키지의 압축을
풀어서 로드하지 않는 이상 Electron에서 해당 확장 기능의 압축을 풀 방법이 없습니다.
## 백그라운드 페이지
현재 Electron은 Chrome에서 지원하는 백그라운드 페이지(background pages)를 지원하지
않습니다. 몇몇 확장 기능은 이 기능에 의존하는 경우가 있는데, 이 때 해당 확장 기능은
Electron에서 작동하지 않을 수 있습니다.
## `chrome.*` API
몇몇 Chrome 확장 기능은 특정 기능을 사용하기 위해 `chrome.*` API를 사용하는데, 이
API들을 구현하기 위해 노력했지만 안타깝게도 아직 모든 API가 구현되지는 않았습니다.
아직 모든 API가 구현되지 않았기 때문에 확장 기능에서 `chrome.devtools.*` 대신
`chrome.*` API를 사용할 경우 확장 기능이 제대로 작동하지 않을 수 있음을 감안해야 합니다.
만약 문제가 발생할 경우 Electron의 GitHub 저장소에 관련 이슈를 올리면 해당 API를
추가하는데 많은 도움이 됩니다.
위와 같은 상황이 아니라면 Electron의 이슈 리스트에 버그 보고를 추가한 후 예상한 것과
달리 확장 기능의 어떤 부분의 정상적으로 작동하지 않았는지 설명하세요.
[devtools-extension]: https://developer.chrome.com/extensions/devtools
[react-devtools]: https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi

View file

@ -85,30 +85,33 @@ ID로 치환해야 합니다.
```bash
#!/bin/bash
# 어플리케이션의 이름
# 어플리케이션의 이름.
APP="YourApp"
# 서명할 어플리케이션의 경로
# 서명할 어플리케이션의 경로.
APP_PATH="/path/to/YourApp.app"
# 서명된 패키지의 출력 경로
# 서명된 패키지의 출력 경로.
RESULT_PATH="~/Desktop/$APP.pkg"
# 요청한 인증서의 이름
# 요청한 인증서의 이름.
APP_KEY="3rd Party Mac Developer Application: Company Name (APPIDENTITY)"
INSTALLER_KEY="3rd Party Mac Developer Installer: Company Name (APPIDENTITY)"
# plist 파일의 경로.
CHILD_PLIST="/path/to/child.plist"
PARENT_PLIST="/path/to/parent.plist"
FRAMEWORKS_PATH="$APP_PATH/Contents/Frameworks"
codesign -s "$APP_KEY" -f --entitlements child.plist "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Electron Framework"
codesign -s "$APP_KEY" -f --entitlements child.plist "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Libraries/libffmpeg.dylib"
codesign -s "$APP_KEY" -f --entitlements child.plist "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Libraries/libnode.dylib"
codesign -s "$APP_KEY" -f --entitlements child.plist "$FRAMEWORKS_PATH/Electron Framework.framework"
codesign -s "$APP_KEY" -f --entitlements child.plist "$FRAMEWORKS_PATH/$APP Helper.app/Contents/MacOS/$APP Helper"
codesign -s "$APP_KEY" -f --entitlements child.plist "$FRAMEWORKS_PATH/$APP Helper.app/"
codesign -s "$APP_KEY" -f --entitlements child.plist "$FRAMEWORKS_PATH/$APP Helper EH.app/Contents/MacOS/$APP Helper EH"
codesign -s "$APP_KEY" -f --entitlements child.plist "$FRAMEWORKS_PATH/$APP Helper EH.app/"
codesign -s "$APP_KEY" -f --entitlements child.plist "$FRAMEWORKS_PATH/$APP Helper NP.app/Contents/MacOS/$APP Helper NP"
codesign -s "$APP_KEY" -f --entitlements child.plist "$FRAMEWORKS_PATH/$APP Helper NP.app/"
codesign -s "$APP_KEY" -f --entitlements child.plist "$APP_PATH/Contents/MacOS/$APP"
codesign -s "$APP_KEY" -f --entitlements parent.plist "$APP_PATH"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Electron Framework"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Libraries/libffmpeg.dylib"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework/Versions/A/Libraries/libnode.dylib"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/Electron Framework.framework"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper.app/Contents/MacOS/$APP Helper"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper.app/"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper EH.app/Contents/MacOS/$APP Helper EH"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper EH.app/"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper NP.app/Contents/MacOS/$APP Helper NP"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$FRAMEWORKS_PATH/$APP Helper NP.app/"
codesign -s "$APP_KEY" -f --entitlements "$CHILD_PLIST" "$APP_PATH/Contents/MacOS/$APP"
codesign -s "$APP_KEY" -f --entitlements "$PARENT_PLIST" "$APP_PATH"
productbuild --component "$APP_PATH" /Applications --sign "$INSTALLER_KEY" "$RESULT_PATH"
```