πŸŽ―μ•„μ΄ν° μžλ™ν™”λ‘œ μ‹€μ‹œκ°„ ν™˜μœ¨πŸ’Ή 보기 - ν™˜μœ¨ 계산기 μœ„μ ― μ„€μ • κ°€μ΄λ“œ πŸ’Έ

πŸŽ―μ•„μ΄ν° μžλ™ν™”λ‘œ μ‹€μ‹œκ°„ ν™˜μœ¨πŸ’Ή 보기 - ν™˜μœ¨ 계산기 μœ„μ ― μ„€μ • κ°€μ΄λ“œ πŸ’Έ

2024. 11. 10. 11:21ㆍ아이폰 μ‰½κ²Œ μ‚¬μš©ν•˜κΈ°

πŸ“² Scriptable둜 ν™˜μœ¨ 계산기 μœ„μ ― μ„€μ •! 슀크립트 μΆ”κ°€λΆ€ν„° ν™ˆ ν™”λ©΄ μ‹€μ‹œκ°„ ν™•μΈκΉŒμ§€ κ°„λ‹¨ν•œ λ‹¨κ³„λ‘œ μ™„λ£Œν•˜μ„Έμš”. πŸ’Ή 쉽고 λΉ λ₯Έ ν™˜μœ¨ 관리!

1️⃣ Scriptable μ•± μ„€μΉ˜ πŸ“²

Scriptable 앱은 아이폰 μœ„μ ―μ„ μ‚¬μš©μžν™”ν•  수 μžˆλŠ” κ°•λ ₯ν•œ λ„κ΅¬μž…λ‹ˆλ‹€.
πŸ‘‰ μ•±μŠ€ν† μ–΄ 접속: ‘Scriptable’을 검색해 무료둜 λ‹€μš΄λ‘œλ“œν•©λ‹ˆλ‹€.
πŸ‘‰ μ•± μ‹€ν–‰: μ„€μΉ˜ ν›„ Scriptable을 μ—΄κ³  ν™”λ©΄ ν•˜λ‹¨μ˜ ‘+’ λ²„νŠΌμ„ 눌러 μƒˆ 슀크립트λ₯Ό μΆ”κ°€ν•  μ€€λΉ„λ₯Ό ν•©λ‹ˆλ‹€.


2️⃣ ν™˜μœ¨ 슀크립트 μΆ”κ°€ν•˜κΈ° πŸ“œ

ν™˜μœ¨ 정보λ₯Ό μžλ™μœΌλ‘œ λΆˆλŸ¬μ™€ ν‘œμ‹œν•˜λŠ” 슀크립트λ₯Ό μ„€μ •ν•˜μ„Έμš”.
πŸ”Ή 슀크립트 볡사: 제곡된 ν™˜μœ¨ 슀크립트λ₯Ό λ³΅μ‚¬ν•©λ‹ˆλ‹€.
πŸ”Ή 슀크립트 λΆ™μ—¬λ„£κΈ°: Scriptable μ•±μ—μ„œ ‘μƒˆ 슀크립트’λ₯Ό μ„ νƒν•˜κ³  λ³΅μ‚¬ν•œ μ½”λ“œλ₯Ό λΆ™μ—¬λ„£μŠ΅λ‹ˆλ‹€.
πŸ”Ή 슀크립트 이름 μ„€μ •: 이름을 ‘Exchange Rate’ λ˜λŠ” ‘ν™˜μœ¨ 계산기’둜 μ„€μ •ν•΄ κ΅¬λΆ„ν•˜κΈ° μ‰½κ²Œ ν•©λ‹ˆλ‹€.
πŸ”Ή μ™„λ£Œ ν›„ μ €μž₯: 우츑 μƒλ‹¨μ—μ„œ μ™„λ£Œλ₯Ό 눌러 μ €μž₯ν•©λ‹ˆλ‹€.


3️⃣ μœ„μ ―μ— ν™˜μœ¨ 계산기 μΆ”κ°€ν•˜κΈ° πŸ“Œ

ν™ˆ ν™”λ©΄μ—μ„œ λ°”λ‘œ 확인할 수 μžˆλ„λ‘ ν™˜μœ¨ 계산기λ₯Ό μœ„μ ―μœΌλ‘œ μ„€μ •ν•˜μ„Έμš”.
πŸ”Ή ν™ˆ ν™”λ©΄ νŽΈμ§‘: 아이폰 ν™ˆ 화면을 길게 λˆ„λ₯΄κ³  ‘+’ μ•„μ΄μ½˜μ„ 눌러 Scriptable μœ„μ ―μ„ μΆ”κ°€ν•©λ‹ˆλ‹€.
πŸ”Ή μœ„μ ― 선택: Scriptable μœ„μ ―μ„ μ„ νƒν•˜κ³ , μƒμ„±ν•œ ν™˜μœ¨ 계산기 슀크립트λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
πŸ”Ή μœ„μ ― 크기 μ„€μ •: ν•„μš”μ— 따라 μœ„μ ― 크기λ₯Ό μ‘°μ ˆν•˜κ³  μ‹€μ‹œκ°„ ν™˜μœ¨ 정보λ₯Ό 확인할 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.


4️⃣ 닀크 λͺ¨λ“œ μ„€μ • 및 μž¬λΆ€νŒ… πŸŒ™

ν™˜μœ¨ μœ„μ ―μ— 닀크 λͺ¨λ“œ λ˜λŠ” 라이트 λͺ¨λ“œλ₯Ό μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
πŸ”Ή 닀크 λͺ¨λ“œ μ„€μ • 확인: Scriptable λ‚΄ 닀크 λͺ¨λ“œ μ˜΅μ…˜μ΄ μžˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”.
πŸ”Ή κΈ°κΈ° μž¬λΆ€νŒ…: μ„€μ • 좩돌 μ‹œ κΈ°κΈ°λ₯Ό μž¬λΆ€νŒ…ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
πŸ”Ή μΆ”κ°€ μ„€μ •: 단좕어 μ•±μœΌλ‘œ μžλ™ μž¬λΆ€νŒ… μŠ€μΌ€μ€„μ„ μ„€μ •ν•΄ μ‚¬μš©μž 편의λ₯Ό 높일 수 μžˆμŠ΅λ‹ˆλ‹€.


5️⃣ μ‹€μ‹œκ°„ ν™˜μœ¨ μœ„μ ― ν™œμš© 팁 🌟

μ£Όμš” 톡화 μΆ”κ°€: μœ„μ ―μ—μ„œ 자주 ν™•μΈν•˜λŠ” 톡화λ₯Ό μΆ”κ°€ν•΄ 개인 λ§žμΆ€ν˜• ν™˜μœ¨ 정보λ₯Ό μ„€μ •ν•˜μ„Έμš”.

μ—¬ν–‰ μ‹œ 유용: ν•΄μ™Έμ—¬ν–‰ 쀑 μ‹€μ‹œκ°„ ν™˜μœ¨μ„ ν™•μΈν•˜κ±°λ‚˜ ν™˜μ „ μ‹œ ν™œμš©ν•˜κΈ° μ’‹μŠ΅λ‹ˆλ‹€.

λ‹€λ₯Έ κΈ°κΈ° 연동: 아이폰뿐 μ•„λ‹ˆλΌ μ•„μ΄νŒ¨λ“œ, μ• ν”Œμ›ŒμΉ˜μ™€λ„ 연동해 νŽΈλ¦¬ν•˜κ²Œ ν™˜μœ¨ 정보λ₯Ό 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.


❓ 자주 λ¬»λŠ” 질문 (Q&A)

Q1: Scriptable 앱은 λ¬΄λ£ŒμΈκ°€μš”?
A:
λ„€, Scriptable 앱은 무료둜 제곡되며 일뢀 κ³ κΈ‰ κΈ°λŠ₯을 μœ„ν•΄μ„œλŠ” 유료 κ²°μ œκ°€ ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Q2:
ν™˜μœ¨ λ°μ΄ν„°λŠ” μ–Όλ§ˆλ‚˜ 자주 μ—…λ°μ΄νŠΈλ˜λ‚˜μš”?
A: Scriptable
μ—μ„œ μ‚¬μš©ν•˜λŠ” ν™˜μœ¨ λ°μ΄ν„°λŠ” μ‹€μ‹œκ°„μœΌλ‘œ κ°±μ‹ λ˜λ©°, 인터넷 μ—°κ²° μ‹œ μ΅œμ‹  데이터λ₯Ό λ°›μ•„μ˜΅λ‹ˆλ‹€.

Q3:
닀크 λͺ¨λ“œκ°€ μ μš©λ˜μ§€ μ•ŠμœΌλ©΄ μ–΄λ–»κ²Œ ν•˜λ‚˜μš”?
A:
κΈ°κΈ°λ₯Ό μž¬λΆ€νŒ…ν•˜κ±°λ‚˜ μœ„μ ― λ°°κ²½ 섀정을 μ‘°μ •ν•΄ λ³΄μ„Έμš”. 일뢀 κΈ°κΈ°μ—μ„œλŠ” μž¬λΆ€νŒ…μœΌλ‘œ 해결될 수 μžˆμŠ΅λ‹ˆλ‹€.

Q4: Scriptable
μ™Έ λ‹€λ₯Έ μ•±μœΌλ‘œλ„ μ‹€μ‹œκ°„ ν™˜μœ¨ 확인이 κ°€λŠ₯ν•œκ°€μš”?
A:
λ„€, μ—¬λŸ¬ ν™˜μœ¨ 앱이 μžˆμ§€λ§Œ Scriptable은 직접 슀크립트λ₯Ό μ‚¬μš©ν•΄ 더 λ§Žμ€ λ§žμΆ€ν™”κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

Q5:
톡화λ₯Ό μΆ”κ°€ν•˜κ³  싢은데, μ–΄λ–»κ²Œ ν•΄μ•Ό ν•˜λ‚˜μš”?
A:
슀크립트 λ‚΄ CURRENCIES λͺ©λ‘μ— μ›ν•˜λŠ” 톡화 μ½”λ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ λ©λ‹ˆλ‹€.

 

πŸ’₯ ν™˜μœ¨ ν‘œμ‹œ, ν™˜μœ¨ 계산 μœ„μ ―μ„ μœ„ν•œ μ„€μ • 방법 μ†Œκ°œ

πŸ’‘ ν™˜μœ¨ ν‘œμ‹œ μžλ°”μŠ€ν¬λ¦½νŠΈ (Exchange Rate)

// Variables used by Scriptable.
// These must be at the very top of the file. Do not edit.
// icon-color: brown; icon-glyph: magic;

// Configuration
const CONFIG = {
    BASE_CURRENCY: 'KRW',
    AMOUNT: 1000,
    CURRENCIES: ['USD', 'EUR', 'JPY', 'CNY'],
    FLAG_URLS: {
        USD: "https://www.ecb.europa.eu/shared/img/flags/USD.gif",
        EUR: "https://www.countryflags.com/wp-content/uploads/europe-flag-jpg-xl-300x200.jpg",
        JPY: "https://www.ecb.europa.eu/shared/img/flags/JPY.gif",
        CNY: "https://www.ecb.europa.eu/shared/img/flags/CNY.gif"
    },
    DECIMAL_PLACES: {
        USD: 1,
        EUR: 1,
        JPY: 4,
        CNY: 2
    }
};

// Get formatted current date
function getCurrentDate() {
    const now = new Date();
    const year = now.getFullYear();
    const month = String(now.getMonth() + 1).padStart(2, '0');
    const day = String(now.getDate()).padStart(2, '0');
    return `${year}-${month}-${day}`;
}

// Main function
async function main() {
    try {
        const data = await fetchExchangeRates();
        const images = await fetchFlags();
        const widget = await createWidget(data, images);
        
        if (config.runsInWidget) {
            Script.setWidget(widget);
        } else {
            await widget.presentSmall();
        }
    } catch (error) {
        console.error(`Error: ${error}`);
        const errorWidget = createErrorWidget(error);
        Script.setWidget(errorWidget);
    }
    
    Script.complete();
}

// Fetch exchange rates
async function fetchExchangeRates() {
    const url = `https://api.frankfurter.app/latest?amount=${CONFIG.AMOUNT}&from=${CONFIG.BASE_CURRENCY}`;
    const req = new Request(url);
    const res = await req.loadJSON();
    
    if (!res.rates) {
        throw new Error("Invalid data from exchange rate API");
    }
    
    return {
        amount: res.amount || CONFIG.AMOUNT,
        date: getCurrentDate(),
        rates: res.rates
    };
}

// Fetch flag images
async function fetchFlags() {
    const imgRequests = CONFIG.CURRENCIES.map(currency => 
        new Request(CONFIG.FLAG_URLS[currency])
    );
    
    try {
        return await Promise.all(imgRequests.map(req => req.loadImage()));
    } catch (error) {
        console.error('Failed to load some flag images:', error);
        return Array(CONFIG.CURRENCIES.length).fill(null);
    }
}

// Create the main widget
function createWidget(data, images) {
    const widget = new ListWidget();
    widget.setPadding(8, 8, 8, 8);
    
    // Theme setup
    const isDarkMode = Device.isUsingDarkAppearance();
    const theme = {
        background: isDarkMode ? new Color("1C1C1E") : new Color("FFFFFF"),
        title: new Color("0EB4FC"),
        text: isDarkMode ? new Color("FFFFFF") : new Color("000000"),
        subtext: new Color("A0A0A0")
    };
    
    widget.backgroundColor = theme.background;
    
    // Title stack
    const titleStack = widget.addStack();
    titleStack.layoutVertically();
    
    const titleText = titleStack.addText(`ν™˜μœ¨ (${data.date})`);
    titleText.font = Font.boldSystemFont(14);
    titleText.textColor = theme.title;
    
    titleStack.addSpacer(10);
    
    // Currency rows
    const currencyStack = titleStack.addStack();
    currencyStack.layoutVertically();
    
    CONFIG.CURRENCIES.forEach((currency, index) => {
        const amount = (data.amount / data.rates[currency]).toFixed(CONFIG.DECIMAL_PLACES[currency] || 2);
        addCurrencyRow(
            currencyStack,
            amount,
            currency,
            images[index],
            theme
        );
    });
    
    return widget;
}

// Add a currency row to the widget
function addCurrencyRow(stack, amount, currency, flagImage, theme) {
    const rowStack = stack.addStack();
    rowStack.layoutHorizontally();
    rowStack.centerAlignContent();
    
    if (flagImage) {
        const flag = rowStack.addImage(flagImage);
        flag.imageSize = new Size(20, 20);
        rowStack.addSpacer(4);
    }
    
    const amountText = rowStack.addText(`${amount} `);
    amountText.font = Font.boldSystemFont(20);
    amountText.textColor = theme.text;
    
    const currencyText = rowStack.addText(currency);
    currencyText.font = Font.boldSystemFont(20);
    currencyText.textColor = theme.subtext;
    
    stack.addSpacer(4);
    
    return rowStack;
}

// Create an error widget
function createErrorWidget(error) {
    const widget = new ListWidget();
    widget.backgroundColor = new Color("FF0000", 0.3);
    
    const errorText = widget.addText("Error loading exchange rates");
    errorText.font = Font.boldSystemFont(12);
    errorText.textColor = new Color("FF0000");
    
    return widget;
}

// Run the main function
await main();

 

πŸ’‘ ν™˜μœ¨ 계산 μžλ°”μŠ€ν¬λ¦½νŠΈ (Exchange Calc) : 100λ§Œμ› λ‹¨μœ„λ‘œ μ„€μ •ν•΄λ‘μ—ˆμœΌλ©°, 56번 항을 μˆ˜μ •ν•˜λ©΄ λ‹€λ₯Έ μ›λ‹¨μœ„λ‘œλ„ 계산가λŠ₯ν•©λ‹ˆλ‹€.

// Variables used by Scriptable.
// These must be at the very top of the file. Do not edit.
// icon-color: brown; icon-glyph: magic;

// Configuration
const CONFIG = {
    BASE_CURRENCY: 'KRW',
    AMOUNT: 1000,
    CURRENCIES: ['USD', 'EUR', 'JPY', 'CNY'],
    FLAG_URLS: {
        USD: "https://www.ecb.europa.eu/shared/img/flags/USD.gif",
        EUR: "https://www.countryflags.com/wp-content/uploads/europe-flag-jpg-xl-300x200.jpg",
        JPY: "https://www.ecb.europa.eu/shared/img/flags/JPY.gif",
        CNY: "https://www.ecb.europa.eu/shared/img/flags/CNY.gif"
    },
    DECIMAL_PLACES: {
        USD: 1,
        EUR: 1,
        JPY: 4,
        CNY: 2
    }
};

// Get formatted current date
function getCurrentDate() {
    const now = new Date();
    const year = now.getFullYear();
    const month = String(now.getMonth() + 1).padStart(2, '0');
    const day = String(now.getDate()).padStart(2, '0');
    return `${year}-${month}-${day}`;
}

// Main function
async function main() {
    try {
        const data = await fetchExchangeRates();
        const images = await fetchFlags();
        const widget = await createWidget(data, images);
        
        if (config.runsInWidget) {
            Script.setWidget(widget);
        } else {
            await widget.presentSmall();
        }
    } catch (error) {
        console.error(`Error: ${error}`);
        const errorWidget = createErrorWidget(error);
        Script.setWidget(errorWidget);
    }
    
    Script.complete();
}

// Fetch exchange rates
async function fetchExchangeRates() {
    const url = `https://api.frankfurter.app/latest?amount=${CONFIG.AMOUNT}&from=${CONFIG.BASE_CURRENCY}`;
    const req = new Request(url);
    const res = await req.loadJSON();
    
    if (!res.rates) {
        throw new Error("Invalid data from exchange rate API");
    }
    
    return {
        amount: res.amount || CONFIG.AMOUNT,
        date: getCurrentDate(),
        rates: res.rates
    };
}

// Fetch flag images
async function fetchFlags() {
    const imgRequests = CONFIG.CURRENCIES.map(currency => 
        new Request(CONFIG.FLAG_URLS[currency])
    );
    
    try {
        return await Promise.all(imgRequests.map(req => req.loadImage()));
    } catch (error) {
        console.error('Failed to load some flag images:', error);
        return Array(CONFIG.CURRENCIES.length).fill(null);
    }
}

// Create the main widget
function createWidget(data, images) {
    const widget = new ListWidget();
    widget.setPadding(8, 8, 8, 8);
    
    // Theme setup
    const isDarkMode = Device.isUsingDarkAppearance();
    const theme = {
        background: isDarkMode ? new Color("1C1C1E") : new Color("FFFFFF"),
        title: new Color("0EB4FC"),
        text: isDarkMode ? new Color("FFFFFF") : new Color("000000"),
        subtext: new Color("A0A0A0")
    };
    
    widget.backgroundColor = theme.background;
    
    // Title stack
    const titleStack = widget.addStack();
    titleStack.layoutVertically();
    
    const titleText = titleStack.addText(`ν™˜μœ¨ (${data.date})`);
    titleText.font = Font.boldSystemFont(14);
    titleText.textColor = theme.title;
    
    titleStack.addSpacer(10);
    
    // Currency rows
    const currencyStack = titleStack.addStack();
    currencyStack.layoutVertically();
    
    CONFIG.CURRENCIES.forEach((currency, index) => {
        const amount = (data.amount / data.rates[currency]).toFixed(CONFIG.DECIMAL_PLACES[currency] || 2);
        addCurrencyRow(
            currencyStack,
            amount,
            currency,
            images[index],
            theme
        );
    });
    
    return widget;
}

// Add a currency row to the widget
function addCurrencyRow(stack, amount, currency, flagImage, theme) {
    const rowStack = stack.addStack();
    rowStack.layoutHorizontally();
    rowStack.centerAlignContent();
    
    if (flagImage) {
        const flag = rowStack.addImage(flagImage);
        flag.imageSize = new Size(20, 20);
        rowStack.addSpacer(4);
    }
    
    const amountText = rowStack.addText(`${amount} `);
    amountText.font = Font.boldSystemFont(20);
    amountText.textColor = theme.text;
    
    const currencyText = rowStack.addText(currency);
    currencyText.font = Font.boldSystemFont(20);
    currencyText.textColor = theme.subtext;
    
    stack.addSpacer(4);
    
    return rowStack;
}

// Create an error widget
function createErrorWidget(error) {
    const widget = new ListWidget();
    widget.backgroundColor = new Color("FF0000", 0.3);
    
    const errorText = widget.addText("Error loading exchange rates");
    errorText.font = Font.boldSystemFont(12);
    errorText.textColor = new Color("FF0000");
    
    return widget;
}

// Run the main function
await main();

Scriptable 앱에 Exchange Rate와 Calc μ½”λ“œλ₯Ό 각각 λΆ™μ—¬λ„£κΈ° ν•˜κ³  ν•΄λ‹Ήμ΄λ¦„μœΌλ‘œ μ €μž₯ν•˜λŠ” 방법을 μ„€λͺ…ν•˜λŠ” μ΄λ―Έμ§€μž…λ‹ˆλ‹€.
Scriptable 앱에 Exchange Rate와 Calc μ½”λ“œλ₯Ό 각각 λΆ™μ—¬λ„£κΈ° ν•΄μ£Όμ‹œκ³  ν•΄λ‹Ήμ΄λ¦„μœΌλ‘œ μ €μž₯ν•΄μ£Όμ„Έμš”.
아이폰 ν™˜μœ¨ μœ„μ ―μ„ μž‘μ„±ν•œ μ˜ˆμ‹œμž…λ‹ˆλ‹€. Run Scriptλ₯Ό ν΄λ¦­ν•˜λ©΄ μœ„μ ― μ„€μΉ˜ μ „ κ²°κ³Όλ₯Ό 확인할 수 μžˆλŠ” 방법을 μ„€λͺ…ν•œ μ΄λ―Έμ§€μž…λ‹ˆλ‹€.
아이폰 ν™˜μœ¨ μœ„μ ―μ„ μž‘μ„±ν•œ μ˜ˆμ‹œμž…λ‹ˆλ‹€. Run Scriptλ₯Ό ν΄λ¦­ν•˜λ©΄ μœ„μ ― μ„€μΉ˜ μ „ κ²°κ³Όλ₯Ό 확인 κ°€λŠ₯ν•©λ‹ˆλ‹€.
μ•„μ΄ν°μ—μ„œ Scriptable 앱을 μ‚¬μš©ν•˜μ—¬ ν™˜μœ¨ν‘œμ‹œ, ν™˜μœ¨ 계산 μ½”λ“œλ₯Ό 각각 λΆ™μ—¬λ„£κΈ°ν•œ ν›„ Run Sciptλ₯Ό ν΄λ¦­ν•΄μ„œ λͺ…령이 μ‹€ν–‰λ˜λŠ”μ§€ ν™•μΈν•˜λŠ” μ΄λ―Έμ§€μž…λ‹ˆλ‹€.
μ•„μ΄ν°μ—μ„œ Scriptable 앱을 μ‚¬μš©ν•˜μ—¬ ν™˜μœ¨ν‘œμ‹œ, ν™˜μœ¨ 계산 μ½”λ“œλ₯Ό 각각 μž‘μ„±ν•œ ν›„ Run Sciptλ₯Ό ν΄λ¦­ν•΄μ„œ λͺ…령이 μ‹€ν–‰λ˜λŠ”μ§€ 확인 κ°€λŠ₯ν•©λ‹ˆλ‹€.
μ•„μ΄ν°μ—μ„œ μœ„μ ― νŽΈμ§‘μ„ ν΄λ¦­ν•˜μ—¬ Scriptable의 ν•΄λ‹Ή 슀크립트λ₯Ό μ„ νƒν•˜λŠ” 방법을 μ„€λͺ…ν•˜λŠ” μ΄λ―Έμ§€μž…λ‹ˆλ‹€.
아이폰 λ°”νƒ•ν™”λ©΄μ—μ„œ μœ„μ ― νŽΈμ§‘μ„ λˆ„λ₯΄μ‹œκ³ , Scriptable 앱을 선택해 μ£Όμ‹  ν›„ μœ„μ ― νŽΈμ§‘μ„ ν΄λ¦­ν•˜μ—¬ ν•΄λ‹Ή 슀크립트λ₯Ό μ„ νƒν•΄μ£Όμ„Έμš”.
아이폰 바탕화면에 Scriptable 앱을 μ‚¬μš©ν•˜μ—¬ ν™˜μœ¨ μœ„μ ―μ„ λ‚˜λž€νžˆ μ„€μΉ˜ν•˜λŠ” 방법을 μ„€λͺ…ν•˜λŠ” μ΄λ―Έμ§€μž…λ‹ˆλ‹€.
아이폰 바탕화면에 Scriptable 앱을 μ‚¬μš©ν•˜μ—¬ ν™˜μœ¨ μœ„μ ―μ„ λ‚˜λž€νžˆ μ„€μΉ˜ν•œ λͺ¨μŠ΅μž…λ‹ˆλ‹€.





이제 μ•„μ΄ν°μ—μ„œ μ‹€μ‹œκ°„ ν™˜μœ¨ μœ„μ ―μ„ μ‰½κ²Œ ν™•μΈν•˜κ³  ν™œμš©ν•΄ λ³΄μ„Έμš”! κΆκΈˆν•œ 점은 μ–Έμ œλ“  λŒ“κΈ€λ‘œ λ‚¨κ²¨μ£Όμ„Έμš”. 😊