Safari의 오픈 소스 사용자 설명 편집기
iOS (iPados) 및 MACOS에서는 사용자 스크립트를 사용할 수 있습니다. 모든 버전의 경우 Apple의 App Store를 통해 설치가 수행됩니다. MACOS에서 4.x
이전 버전은 저장소에서 직접 다운로드 및 설치할 수 있었지만 Apple이 WebExtension API로 구축 된 앱을 배포 할 수있는 방식의 변경으로 인해 더 이상 옵션이 아닙니다.
iOS에서 사용자 스크립트를 실행하려면 iOS 15.1 이상에 있어야합니다.
MacOS에서 사용자 스크립트를 실행하려면 Safari 14.1 이상과 함께 MacOS 12 이상을 실행해야합니다.
앱 스토어 링크
개발 진행
이 문서를 읽고 시간이 있다면 다음 비디오 개요를보고 앱 및 확장에 익숙해 지도록하는 것이 좋습니다.
앱이 다운로드되고 설치되면 다음 단계를 수행해야합니다.
iOS 앱을 설치 한 후에는 확장자가 작동하기위한 두 가지 주요 단계가 필요합니다.
앱을 열고 디렉토리를 설정하십시오 (사용자 스크립트 저장 및로드)
Set Userscripts Directory
버튼을 클릭하고 디렉토리를 선택하십시오.Safari에서 확장을 활성화하고 (그리고 보조금 권한)
AA
버튼, iPad의 extension-icon
, Extension의 popup
인터페이스를 열면)에서 확장자 관리Always Allow
All Websites
에 사용자 스크립트를 허용하는 것이 좋습니다. 메모
앱은 Safari에서 확장을 활성화했는지 여부를 감지 할 수 없으므로 확장을 활성화 한 후에는 앱 프롬프트가 변경되지 않습니다. 현재 앱 인터페이스는 사용자 스크립트 디렉토리를 설정하거나 변경하는 데 사용됩니다.
MacOS와 iOS 사이의 스크립트를 동기화하기위한 iCloud 폴더를 선택할 수 있지만 동기화가 지연 될 수 있으며 iCloud 최적화로 인해 파일이 퇴거 될 수 있습니다. #424를 참조하십시오.
iOS 버전에서 사용자 스크립트를 설치하는 두 가지 주요 방법이 있습니다.
.user.js
URL을 방문한 다음 확장자 popup
열면 설치 프롬프트가 표시됩니다..user.js
파일을 저장할 수도 있습니다. 팁
위의 두 가지 작업은 MacOS 버전에서 똑같이 잘 작동합니다.
iOS 버전에는 MacOS 버전에 제공된 스크립트 편집기가 포함되어 있지 않지만 iOS에서 직접 설정 한 디렉토리에서 스크립트 파일을 항상 편집 할 수 있습니다. (타사 코드 편집기 앱을 사용하고, 내내 열기 및 편집 지원)
MACOS에 사용자 스크립트를 설치 한 후 여러 장치간에 사용자 스크립트를 동기화 할 계획이없는 경우 사용자 스크립트 디렉토리를 선택할 필요가 없습니다 . 대신 ~/User/Library/Containers/Userscripts/Data/Documents/scripts
에 위치한 기본 디렉토리를 사용하도록 선택할 수 있습니다. 다시 한 번 기본 (및 자동) 동작입니다. 다른 곳에 사용자 스크립트를 저장하려는 경우 새 위치 만 선택하면됩니다. 이는 Sublime Text 또는 VSCODE와 같은 외부 코드 편집기를 사용하는 경우 특히 유용합니다.
Apple의 공식 가이드 페이지를 참조하십시오 : Mac에서 Safari Extensions 사용
다음은 MacOS 에서이 확장자를 사용하여 Safari에서 사용자 스크립트를 쉽게 작성/추가하는 방법을 보여주는 짧은 클립입니다.
settings
버튼 (COG로 표시)에는 설정 모달이 표시됩니다 (아래 설명)plus
버튼을 사용하면 사용자가 새 항목을 추가 할 수 있습니다New CSS
CSS 코드를 기대하는 "사용자 스크립트"입니다New Javascript
는 JavaScript 코드를 기대하는 프로토 타입 사용자 스크립트입니다.New Remote
웹 주소 ( 예 : https://www.k21p.com/example.user.js
)를 입력하여 원격 호스팅 사용자 스크립트 (또는 스타일)를 추가 할 수 있습니다.@version
태그가 포함되어 있습니다@updateURL
태그가 포함되어 있습니다Discard
편집하는 동안 사용자 스크립트에 대한 구축되지 않은 변경 사항을 되돌립니다.Save
- 편집 중에, 사용자 스크립트에 대한 모든 변경 사항을 저장합니다.Command + S
는 동작의 키보드 바로 가기입니다.() [] {} "" ''
2
공간을 사용하는 것이 절대 광기이기 때문에 분명히 4
로 기본값입니다.@match
패턴 (일치 패턴 구조)의 쉼표로 분리 된 목록을 허용합니다.이 목록의 패턴과 일치하는 페이지 URL은 스크립트 주입에 대해 무시됩니다.Userscripts Safari는 현재 다음과 같은 사용자 스크립트 메타 데이터를 지원합니다.
@name
Name- 이것은 사이드 바에 표시되고 파일 이름으로 사용되는 이름입니다. 같은 유형의 여러 파일에 동일한 이름을 사용할 수 없습니다.@description
description- 이것을 사용하여 사용자 스크립트가하는 일을 설명합니다 - 이것은 사이드 바에 표시됩니다. 설명을 숨기는 설정이 있습니다.@icon
ICON-이 사용자 스크립트 관리자와 기능이 없지만 메타 데이터에 제공된 첫 번째 값은 GM_/GM.info
객체에서 액세스 할 수 있습니다.@match
도메인 일치 패턴 - 여러 도메인 일치를 원하시면이 필드의 여러 인스턴스를 사용할 수 있습니다.http/s
만 지원합니다@exclude-match
스크립트가 실행되기를 원하지 않는 도메인 패턴@include
Include- 주입을 위해 URL과 일치하는 데 사용되는 글로벌 및 일반 표현식이 허용됩니다. 자세한 내용은 여기를 참조하십시오.@exclude
@include
와 비슷한 방식으로 기능하지만 주입보다는이 키의 값과의 경기는 주입을 방지합니다.@inject-into
사용자가 스크립트를 주입 할 컨텍스트를 선택할 수 있습니다.auto
(기본값), content
, page
GM
API는 content
사용할 때만 사용할 수 있습니다@run-at
@weight
@require
@version
@updateURL
과 쌍을 이룰 때는 사용자가 원격 소스에서 사용자 <
를 업데이트 할 수 있습니다.@version
그 자체로 아무것도하지 않으며, 원격 업데이트를 올바르게 작동시키기 위해 @updateURL
과 짝을 이루어야합니다.@updateURL
>
인 경우 파일이 업데이트됩니다.@updateURL
자체 만 수행하지 않으므로 원격 업데이트를 위해 제대로 작동하기 위해 @version
과 쌍을 이룰 필요가 있습니다.@downloadURL
@version
및 @updateURL
이 모두있는 파일)@version
및 @updateURL
과 쌍을 이룰 때 로컬 버전이 @updateURL
이 가리키는 파일의 <
인 경우 확장자는 @downloadURL
에있는 파일의 내용으로 파일의 코드를 업데이트하려고 시도합니다.@downloadURL
그 자체로 아무것도하지 않습니다. 제대로 작동하기 위해 @version
및 @updateURL
필요합니다.@noframes
@grant
APIs
(있는 경우)는 각 @grant
라인에 하나씩 사용하는 명령 제어, 해당 API 메소드 만 제공됩니다.@grant
값이 제공되지 않으면 none
가정하지 않습니다.none
none
. 모든 사용자 스크립트는 실행하려면 최소 1 @match
또는 @include
필요합니다!
사용자 스크립트는 현재 다음 API 방법을 지원합니다. 달리 명시되지 않는 한 모든 방법은 비동기식입니다. 사용자 스크립트에서 사용하려면 @grant
이러한 방법을 사용해야합니다. API 메소드를 사용하는 경우 보안 문제로 인해 컨텐츠 스크립트 범위를 주입하는 것이 가능합니다.
메모
다음 API 설명은 최신 개발 지점에 적용되므로 해당 버전의 설명서를 확인해야 할 수도 있습니다. 상단의 Branches
또는 Tags
통해 확인하려는 버전으로 전환하십시오.
예를 들어, App Store의 v4.xx 버전의 경우 https://github.com/quoid/userscripts/tree/release/4.xx
API 유형 정의는 types.d.ts
을 참조하십시오
GM.addStyle(css)
css: String
Promise
을 반환하고 성공하면 해결, 실패하면 오류 메시지로 거부됩니다.GM.setValue(key, value)
key: String
value: Any
- JSON- 시리얼 화 될 수 있습니다Promise
을 반환하고 성공하면 해결, 실패하면 오류 메시지로 거부됩니다.GM.getValue(key, defaultValue)
key: String
defaultValue: Any
- 선택 사항Promise
반환하고, 설정된 값 또는 defaultValue
으로 제공되거나 성공하지 않은 경우 정의되지 undefined
value
으로, 실패하면 오류 메시지로 거부됩니다.GM.deleteValue(key)
key: String
Promise
을 반환하고 성공하면 해결, 실패하면 오류 메시지로 거부됩니다.GM.listValues()
Promise
을 반환하고 현재 설정된 값의 키 이름의 배열로 해결 된 경우 실패하면 오류 메시지로 거부됩니다.GM.getTab()
Promise
을 반환하고 성공하면이 탭이 열려있는 한 Any
데이터로 해결되며 실패하면 오류 메시지로 거부됩니다.GM.saveTab(tabObj)
tabObj: Any
든지 json -serialized 될 수 있습니다Promise
을 반환하고 성공하면 해결, 실패하면 오류 메시지로 거부됩니다.GM.openInTab(url, openInBackground)
url: String
openInBackground: Bool
선택 사항, false
기본적으로Promise
을 반환하고 탭에 대한 탭 데이터로 해결 된 경우 성공하면 방금 열리고 실패하면 오류 메시지로 거부됩니다.GM.closeTab(tabId)
tabId: Int
옵션, 기본적으로 caller tab
Promise
을 반환하고 성공하면 해결, 실패하면 오류 메시지로 거부됩니다.GM.setClipboard(data, type)
data: String
type: String
- 선택 사항, text/plain
기본적으로Promise
을 반환하고, 성공 또는 실패를 나타내는 Bool
값으로 해결되며, 실패한 경우 오류 메시지로 거부됩니다.GM.info
&& GM_info
@grant
에 추가 할 필요없이 사용할 수 있습니다scriptHandler: String
Userscripts
반환합니다version: String
사용자 스크립트 앱의 버전scriptMetaStr: String
현재 실행중인 스크립트의 메타 락script: Object
- 현재 실행중인 스크립트에 대한 데이터가 포함되어 있습니다.description: String
exclude-match: [String]
excludes: [String]
grant: [String]
includes: [String]
inject-into: String
matches: [String]
name: String
namespace: String
noframes: Bool
require: [String]
resources: [String]
- 현재 구현되지 않았습니다run-at: String
version: String
- 사용자 스크립트 버전 값GM.xmlHttpRequest(details)
details: Object
details
객체는 다음 속성을 수용합니다url: String
- 필수method: String
- 선택 사항, 기본적으로 GET
user: String
- 선택 사항password: String
- 선택 사항headers: Object
- 선택 사항overrideMimeType: String
선택 사항입니다timeout: Int
선택 사항binary: Bool
옵션 (비가 부지 않은, Blob
, ArrayBuffer
, TypedArray
등과 같은 이진 데이터 객체를 사용하십시오.)data: String | Blob | ArrayBuffer | TypedArray | DataView | FormData | URLSearchParams
선택 사항responseType: String
- 선택 사항XMLHttpRequests
를 참조하십시오onabort: Function
- 선택 사항onerror: Function
- 선택 사항onload: Function
- 선택 사항onloadend: Function
- 선택 사항onloadstart: Function
- 선택 사항onprogress: Function
- 선택 사항onreadystatechange: Function
- 선택 사항ontimeout: Function
- 선택 사항readyState
response
responseHeaders
responseType
responseURL
status
statusText
timeout
responseText
( responseType
가 text
일 때)Promise
에는 추가 속성 abort
이 포함되어 있으며 응답 객체로 해결됩니다.const xhr = GM.xmlHttpRequest({...});
xhr.abort();
요청을 중단합니다const response = await xhr;
const response = await GM.xmlHttpRequest({...});
GM_xmlhttpRequest(details)
GM.xmlHttpRequest(details)
와 동일합니다.abort
는 Function
입니다.const foo = GM.xmlHttpRequest({...});
... foo.abort();
요청을 중단합니다 이것은 앱/확장자가 읽고 쓸 수있는 디렉토리입니다. 이 디렉토리는 포함 된 앱을 열고 각 "위치 변경"버튼을 클릭하여 변경됩니다.
스크립트 디렉토리 노트
이 앱/확장자를 사용하는 동안 문제가 발생하거나 도움이 필요한 경우 여기에 저장소에서 문제를여십시오. 그렇게 할 때 가능한 한 많은 세부 사항을 제공하십시오. 여기에는 리스팅 시스템 사양과 실행하려는 웹 사이트 및 스크립트가 포함됩니다. 문제 템플릿을 따르십시오!
"스크립트 실행을 거부했습니다"오류, 어떻게해야합니까?
웹 사이트의 컨텐츠 보안 정책으로 인해이 오류가 표시됩니다. 현재 확장 콘텐츠 스크립트가 Safari에서 CSP를 우회 할 수있는 방법이 없습니다.
자동으로 확장은 엄격한 CSP를 우회하려고 시도하지만 여전히 문제가 발생하는 경우 사용자 스크립트 메타 데이터 키
// @inject-into auto
또는// @inject-into content
설정하려고 시도합니다.이 문제에서 이것에 대한 자세한 내용을 읽을 수 있습니다.
새로운 사용자 스크립트를 만들거나 기존을 편집하려면 Extension의 편집기를 사용해야합니까?
자신의 편집기를 사용하여 파일을 업데이트하고 관리 할 수 있습니다. 파일을 저장 위치에 저장하는 한 올바르게 포맷되면 주입해야합니다. 그러나 미리 확장 팝업을 열어야합니다 . 즉, 외부 편집기를 사용하여 새 사용자 스크립트를 작성하거나 기존 사용자 스크립트를 편집하고 저장 위치에 저장하면 주입이 올바르게 발생하기 전에 확장 팝업을 열어야하고 팝업이 완전히로드되어야합니다.
키보드 단축키는 무엇입니까?
포함 된 편집기를 사용하는 동안
⌘ + s
클릭하면 파일이 저장됩니다. 편집기를 작업하는 동안⌘ + f
클릭하면 검색 창이 발생하고esc
숨길 것입니다.
@require
사용하면 필요한 파일은 어디에 저장됩니까?
필요한 모든 파일은 MacOS 11.x의 확장 컨테이너 폴더에서 JavaScript 파일로 저장됩니다. 해당 폴더는
~/Library/Containers/Userscripts/Data/Documents/require/
과 같은 기본 저장 위치에 있습니다.요구 사항 폴더에서 파일을 이동하거나
manifest.json
파일을 수동으로 편집하면 앱/확장 기능을 중단 할 수 있습니다.
코드 레벨 기부금 Contributing.md를 참조하십시오
또한 "도움이 필요하기"로 표시된 모든 문제는 적극적으로 지원을 구하고 있습니다. 피드백, 안내 또는 코딩 지원 제안으로 해당 문제에 응답하십시오.
기존 Issues
나 Discussions
에 참여하고 상호 작용하는 것은 프로젝트 및 오픈 소스 커뮤니티에 큰 도움이 될 것입니다. 귀하의 기여에 감사드립니다.
프로젝트를 지원하는 가장 빠르고 쉬운 방법은 확장을 즐기고 향후 개선을보고 싶다면 앱 스토어에 긍정적 인 리뷰를 남기는 것입니다. 이 리뷰를 보면 내가 옳고 그른 일을하고 있다는 것을 알려주고 프로젝트 작업을 계속하도록 동기를 부여합니다.
두 번째로 도움이되는 두 번째로 가장 좋은 방법은 새로운 버전의 앱을 테스트하기 위해 가입하는 것입니다. 이 확장은 개인 정보를 평가하고 사용자로부터 데이터를 수집하지 않기 때문에 확장 프로그램 사용 방법을 측정하기가 어렵습니다. 베타 테스터로 가입하면 다가오는 기능을 테스트 할 수있을뿐만 아니라 실제 사용자의 직접적인 피드백을 이끌어 낼 수 있습니다.
TestFlight Public Link를 통해 해당 베타 버전을 릴리스로 가입하여 테스트하십시오.
사용자 스크립트는 사용자로부터 데이터를 수집하거나 응용 프로그램 및 확장 내에서 수행하는 활동이나 작업을 모니터링하지 않습니다. 이는 응용 프로그램 및 확장으로 수행하는 모든 것이 귀하에게 비공개이며 개발자 또는 제 3 자와 공유되지 않는다는 것을 의미합니다. 데이터 수집이 없기 때문에 어떠한 종류의 데이터 보유가 없습니다.
저작권 (C) 2018-2024 Justin Wasack
모든 오픈 소스 응용 프로그램에 대한 GNU General Public License v3.0 라이센스에 따라 라이센스. 다른 모든 응용 프로그램에는 상업용 라이센스가 필요합니다.