์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿš€ Titanium ๋ชจ๋“ˆ ๊ฐœ๋ฐœ ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ: ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ์˜ ์ฐจ์›์ด ๋‹ฌ๋ผ์ง„๋‹ค! ๐Ÿš€

๐Ÿš€ Titanium ๋ชจ๋“ˆ ๊ฐœ๋ฐœ ๋ฐ ์‚ฌ์šฉํ•˜๊ธฐ: ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ์˜ ์ฐจ์›์ด ๋‹ฌ๋ผ์ง„๋‹ค! ๐Ÿš€

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ 2025๋…„ 3์›” 11์ผ ๊ธฐ์ค€์œผ๋กœ ์ตœ์‹  ํŠธ๋ Œ๋“œ๋ฅผ ๋ฐ˜์˜ํ•œ Titanium ๋ชจ๋“ˆ ๊ฐœ๋ฐœ๊ณผ ํ™œ์šฉ๋ฒ•์— ๋Œ€ํ•ด ํ•จ๊ป˜ ์•Œ์•„๋ณผ๊ฒŒ์š”. ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ์— ๊ด€์‹ฌ ์žˆ์œผ์‹  ๋ถ„๋“ค์ด๋ผ๋ฉด ํ•œ ๋ฒˆ์ฏค ๋“ค์–ด๋ณด์…จ์„ Titanium! ์ด์ œ๋Š” ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด์„œ ์ง์ ‘ ๋ชจ๋“ˆ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•˜๋Š” ๋ฐฉ๋ฒ•๊นŒ์ง€ ๋งˆ์Šคํ„ฐํ•ด๋ณผ๊นŒ์š”? ๐Ÿ˜Ž

์š”์ฆ˜ ์žฌ๋Šฅ๋„ท์—์„œ๋„ Titanium ๊ฐœ๋ฐœ ๊ด€๋ จ ์žฌ๋Šฅ ๊ฑฐ๋ž˜๊ฐ€ ๋ถ€์ฉ ๋Š˜์—ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๊ตฌ์š”! ๊ทธ๋งŒํผ ์ˆ˜์š”๊ฐ€ ๋งŽ์€ ๊ธฐ์ˆ ์ด๋‹ˆ ํ•จ๊ป˜ ๋ฐฐ์›Œ๋ด์š”~

๐Ÿค” Titanium์ด ๋ญ๊ธธ๋ž˜? ๊ธฐ์ดˆ๋ถ€ํ„ฐ ํƒ„ํƒ„ํ•˜๊ฒŒ!

Titanium์€ Axway(๊ตฌ Appcelerator)์—์„œ ๊ฐœ๋ฐœํ•œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ชจ๋ฐ”์ผ ์•ฑ ๊ฐœ๋ฐœ ํ”„๋ ˆ์ž„์›Œํฌ์˜ˆ์š”. JavaScript ์ฝ”๋“œ ํ•˜๋‚˜๋กœ iOS, Android ์•ฑ์„ ๋™์‹œ์— ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค๋‹ˆ... ๊ฐœ๋ฐœ์ž๋“ค์˜ ๊ฟˆ์ด ํ˜„์‹ค์ด ๋œ ๊ฑฐ ์•„๋‹ˆ๊ฒ ์–ด์š”? ใ…‹ใ…‹ใ…‹

2025๋…„ ํ˜„์žฌ, Titanium SDK๋Š” ๋ฒ„์ „ 12.x๊นŒ์ง€ ๋ฐœ์ „ํ–ˆ๊ณ , ๊ธฐ์กด์˜ ๋‹จ์ ๋“ค์„ ๋งŽ์ด ๋ณด์™„ํ•˜๋ฉด์„œ React Native๋‚˜ Flutter์™€ ๊ฐ™์€ ์ธ๊ธฐ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค๊ณผ ๋‹น๋‹นํžˆ ๊ฒฝ์Ÿํ•˜๊ณ  ์žˆ์–ด์š”. ํŠนํžˆ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ํ™•์žฅ์„ฑ ๋ฉด์—์„œ๋Š” ์—ฌ์ „ํžˆ ๊ฐ•์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ฃ ! ๐Ÿ‘

๐Ÿ“ฑ Titanium์˜ ์ฃผ์š” ํŠน์ง•

  1. JavaScript๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ ๊ฐœ๋ฐœ ๊ฐ€๋Šฅ
  2. ๋‹จ์ผ ์ฝ”๋“œ๋ฒ ์ด์Šค๋กœ iOS/Android ๋™์‹œ ์ง€์›
  3. ๋„ค์ดํ‹ฐ๋ธŒ UI ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ (์›น๋ทฐ ๊ธฐ๋ฐ˜ X)
  4. ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ ํ†ตํ•œ ํ™•์žฅ์„ฑ
  5. Alloy MVC ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์›
Titanium SDK iOS Android ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๊ฐœ๋ฐœ

๐ŸŒ Titanium ์ƒํƒœ๊ณ„ ์ดํ•ดํ•˜๊ธฐ

Titanium์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ธฐ ์ „์— ์ „์ฒด ์ƒํƒœ๊ณ„๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด์š”. 2025๋…„ ๊ธฐ์ค€์œผ๋กœ Titanium ์ƒํƒœ๊ณ„๋Š” ๋”์šฑ ํ’๋ถ€ํ•ด์กŒ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ˜Š

๐Ÿงฉ Titanium ์ƒํƒœ๊ณ„ ๊ตฌ์„ฑ์š”์†Œ

  1. Titanium SDK: ํ•ต์‹ฌ ํ”„๋ ˆ์ž„์›Œํฌ
  2. Alloy: MVC ์•„ํ‚คํ…์ฒ˜ ํ”„๋ ˆ์ž„์›Œํฌ
  3. Appcelerator CLI: ๋ช…๋ น์ค„ ๋„๊ตฌ
  4. Titanium ๋ชจ๋“ˆ: ๊ธฐ๋Šฅ ํ™•์žฅ์„ ์œ„ํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ
  5. Hyperloop: ๋„ค์ดํ‹ฐ๋ธŒ API ์ง์ ‘ ์ ‘๊ทผ ๊ธฐ์ˆ  (2025๋…„ ๋ฒ„์ „์—์„œ ๋”์šฑ ๊ฐ•ํ™”๋จ)

ํŠนํžˆ Titanium ๋ชจ๋“ˆ์€ JavaScript๋งŒ์œผ๋กœ๋Š” ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ๋„ค์ดํ‹ฐ๋ธŒ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋ฐฉ๋ฒ•์ด์—์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ํ•˜๋“œ์›จ์–ด ์ ‘๊ทผ, ๋ณต์žกํ•œ ๊ทธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ, ๋˜๋Š” ์„œ๋“œํŒŒํ‹ฐ SDK ํ†ตํ•ฉ ๊ฐ™์€ ์ž‘์—…์„ ํ•  ๋•Œ ๊ผญ ํ•„์š”ํ•˜์ฃ !

์š”์ฆ˜์—” AI ๊ธฐ๋Šฅ์ด๋‚˜ AR/VR ๊ด€๋ จ ๋ชจ๋“ˆ๋“ค์ด ๋Œ€์„ธ์ธ๋ฐ, ์ด๋Ÿฐ ์ตœ์‹  ๊ธฐ์ˆ ์„ Titanium์— ํ†ตํ•ฉํ•˜๋ ค๋ฉด ๋ชจ๋“ˆ ๊ฐœ๋ฐœ ๋Šฅ๋ ฅ์ด ํ•„์ˆ˜๋ž๋‹ˆ๋‹ค~ ์ง„์งœ ๊ฐœ๋ฐœ์ž์˜ ํ’ˆ๊ฒฉ์ด ๋‹ฌ๋ผ์ง€๋Š” ์Šคํ‚ฌ์ด์ฃ ! ใ„นใ…‡ ์ฐ์ž„ ใ…‹ใ…‹ใ…‹

๐Ÿ“ฆ Titanium ๋ชจ๋“ˆ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

Titanium ๋ชจ๋“ˆ์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€ ์œ ํ˜•์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์–ด์š”:

  1. ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ: iOS์šฉ Objective-C/Swift, Android์šฉ Java/Kotlin์œผ๋กœ ์ž‘์„ฑ
  2. CommonJS ๋ชจ๋“ˆ: ์ˆœ์ˆ˜ JavaScript๋กœ ์ž‘์„ฑ๋œ ๋ชจ๋“ˆ
  3. ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ชจ๋“ˆ: ๋„ค์ดํ‹ฐ๋ธŒ์™€ JavaScript ์ฝ”๋“œ๊ฐ€ ํ˜ผํ•ฉ๋œ ๋ชจ๋“ˆ

์šฐ๋ฆฌ๊ฐ€ ์˜ค๋Š˜ ์ง‘์ค‘์ ์œผ๋กœ ์‚ดํŽด๋ณผ ๊ฒƒ์€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์ด์—์š”. ์™œ๋ƒํ•˜๋ฉด ์ด๊ฒŒ ์ง„์งœ Titanium์˜ ํŒŒ์›Œ๋ฅผ ๋А๋‚„ ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์ด๊ฑฐ๋“ ์š”! ๐Ÿ”ฅ

๐Ÿ“‚ ๋ชจ๋“ˆ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

Titanium ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ์€ ํ”Œ๋žซํผ๋ณ„๋กœ ๋‹ค๋ฅธ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”:

iOS ๋ชจ๋“ˆ ๊ตฌ์กฐ


MyModule/
โ”œโ”€โ”€ Classes/
โ”‚   โ”œโ”€โ”€ MyModuleModule.h
โ”‚   โ””โ”€โ”€ MyModuleModule.m
โ”œโ”€โ”€ assets/
โ”œโ”€โ”€ documentation/
โ”œโ”€โ”€ example/
โ”œโ”€โ”€ platform/
โ””โ”€โ”€ manifest
        

Android ๋ชจ๋“ˆ ๊ตฌ์กฐ


MyModule/
โ”œโ”€โ”€ android/
โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ”‚   โ””โ”€โ”€ com/example/mymodule/
โ”‚   โ”‚       โ””โ”€โ”€ MyModuleModule.java
โ”‚   โ”œโ”€โ”€ build.xml
โ”‚   โ””โ”€โ”€ manifest
โ”œโ”€โ”€ assets/
โ”œโ”€โ”€ documentation/
โ”œโ”€โ”€ example/
โ””โ”€โ”€ platform/
        

์ด ๊ตฌ์กฐ๋ฅผ ๋ณด๊ณ  "์™€ ๋ณต์žกํ•˜๋‹ค" ์‹ถ์œผ์‹ ๊ฐ€์š”? ๊ฑฑ์ • ๋งˆ์„ธ์š”! ๋ชจ๋“ˆ ์ƒ์„ฑ ๋„๊ตฌ๊ฐ€ ์ด ๊ตฌ์กฐ๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค˜์„œ ์šฐ๋ฆฌ๋Š” ํ•ต์‹ฌ ์ฝ”๋“œ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ๊ฐœ์ด๋“~ ๐Ÿ‘

๐Ÿ› ๏ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •ํ•˜๊ธฐ

Titanium ๋ชจ๋“ˆ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ œ๋Œ€๋กœ ์„ค์ •ํ•ด์•ผ ํ•ด์š”. 2025๋…„ ๊ธฐ์ค€์œผ๋กœ ํ•„์š”ํ•œ ๋„๊ตฌ๋“ค์„ ์‚ดํŽด๋ณผ๊ฒŒ์š”!

๐Ÿ“‹ ํ•„์ˆ˜ ์ค€๋น„๋ฌผ

  1. Node.js (v18.0.0 ์ด์ƒ)
  2. Titanium CLI (์ตœ์‹  ๋ฒ„์ „)
  3. Xcode (iOS ๋ชจ๋“ˆ ๊ฐœ๋ฐœ์šฉ, ๋ฒ„์ „ 15 ์ด์ƒ)
  4. Android Studio (Android ๋ชจ๋“ˆ ๊ฐœ๋ฐœ์šฉ, 2025 ๋ฒ„์ „)
  5. JDK 17 ์ด์ƒ

CLI ์„ค์น˜๋Š” ๊ฐ„๋‹จํ•ด์š”! ํ„ฐ๋ฏธ๋„์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋งŒ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:

npm install -g titanium alloy

2025๋…„๋ถ€ํ„ฐ๋Š” Titanium์ด Apple Silicon(M3/M4) ๋ฐ ์ตœ์‹  Android ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์™„๋ฒฝ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •์ด ์˜ˆ์ „๋ณด๋‹ค ํ›จ์”ฌ ์ˆ˜์›”ํ•ด์กŒ์–ด์š”. ์ง„์งœ ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์œผ๋กœ ๋งŽ์ด ๋ฐ”๋€Œ์—ˆ๋‹ค๋‹ˆ๊นŒ์š”? ๐Ÿ‘

๐Ÿ” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ํ™•์ธํ•˜๊ธฐ

๋ชจ๋“  ๊ฒƒ์ด ์ œ๋Œ€๋กœ ์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด์„ธ์š”:

titanium info

์ด ๋ช…๋ น์–ด๋Š” ์„ค์น˜๋œ SDK ๋ฒ„์ „, CLI ๋ฒ„์ „, ๊ทธ๋ฆฌ๊ณ  iOS/Android ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ญ”๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ์—ฌ๊ธฐ์„œ ๋ฐ”๋กœ ํ™•์ธ ๊ฐ€๋Šฅํ•ด์š”!

๐Ÿ—๏ธ ์ฒซ ๋ฒˆ์งธ Titanium ๋ชจ๋“ˆ ๋งŒ๋“ค๊ธฐ

์ด๋ก ์€ ์ด์ œ ์ถฉ๋ถ„ํ•ด์š”! ์ง์ ‘ ๋ชจ๋“ˆ์„ ๋งŒ๋“ค์–ด๋ณผ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋กœ ์‹œ์ž‘ํ•ด๋ณผ๊ฒŒ์š”. ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ๋ชจ๋“ˆ์€ 'SuperToast'๋ผ๋Š” ์ด๋ฆ„์˜ ํ–ฅ์ƒ๋œ ํ† ์ŠคํŠธ/์•Œ๋ฆผ ๋ฉ”์‹œ์ง€ ๋ชจ๋“ˆ์ด์—์š”. ๊ธฐ๋ณธ alert๋ณด๋‹ค ๋” ์˜ˆ์˜๊ณ  ๊ธฐ๋Šฅ๋„ ๋งŽ์€ ์ปค์Šคํ…€ ์•Œ๋ฆผ์„ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ์š”! ๐Ÿž

๐Ÿ”„ ๋ชจ๋“ˆ ์ƒ์„ฑ ๋‹จ๊ณ„

๋จผ์ € CLI๋ฅผ ์‚ฌ์šฉํ•ด ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด๋ณผ๊ฒŒ์š”:

titanium create --type=module --name=supertoast --id=com.example.supertoast --platforms=ios,android

์ด ๋ช…๋ น์–ด๋Š” 'supertoast'๋ผ๋Š” ์ด๋ฆ„์˜ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , iOS์™€ Android ํ”Œ๋žซํผ ๋ชจ๋‘๋ฅผ ์ง€์›ํ•˜๋„๋ก ์„ค์ •ํ•ด์š”.

๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค:

supertoast/
โ”œโ”€โ”€ android/
โ”œโ”€โ”€ ios/
โ”œโ”€โ”€ assets/
โ”œโ”€โ”€ example/
โ”œโ”€โ”€ documentation/
โ””โ”€โ”€ LICENSE
Titanium ๋ชจ๋“ˆ ์ƒ์„ฑ ํ”„๋กœ์„ธ์Šค 1. CLI ๋ช…๋ น์–ด ๋ชจ๋“ˆ ์ƒ์„ฑ 2. ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ์ž‘์„ฑ 3. ๋ชจ๋“ˆ ๋นŒ๋“œ 4. ์•ฑ์— ํ†ตํ•ฉ titanium create --type=module --name=supertoast --id=com.example.supertoast --platforms=ios,android ๐Ÿ‘† ์ด ๋ช…๋ น์–ด๋กœ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค

์ด์ œ ๊ฐ ํ”Œ๋žซํผ๋ณ„๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณผ๊ฒŒ์š”! ๋จผ์ € iOS๋ถ€ํ„ฐ ์‹œ์ž‘ํ• ๊ฒŒ์š”.

๐ŸŽ iOS ๋ชจ๋“ˆ ๊ฐœ๋ฐœํ•˜๊ธฐ

iOS ๋ชจ๋“ˆ์€ Objective-C ๋˜๋Š” Swift๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์–ด์š”. 2025๋…„ ํ˜„์žฌ๋Š” Swift๊ฐ€ ๋Œ€์„ธ์ด์ง€๋งŒ, ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด Objective-C ์˜ˆ์ œ๋„ ํ•จ๊ป˜ ์‚ดํŽด๋ณผ๊ฒŒ์š”.

๐Ÿ“ฑ iOS SuperToast ๋ชจ๋“ˆ ๊ตฌํ˜„ํ•˜๊ธฐ

๋จผ์ € Objective-C๋กœ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค:

SupertoastModule.h

#import "TiModule.h"

@interface SupertoastModule : TiModule {
}

- (void)show:(id)args;
- (void)showWithOptions:(id)args;

@end

SupertoastModule.m

#import "SupertoastModule.h"
#import "TiBase.h"
#import "TiHost.h"
#import "TiUtils.h"

@implementation SupertoastModule

#pragma mark Internal

- (id)moduleGUID
{
  return @"com.example.supertoast";
}

- (NSString*)moduleId
{
  return @"com.example.supertoast";
}

#pragma mark Public APIs

- (void)show:(id)args
{
  ENSURE_UI_THREAD(show, args);
  ENSURE_SINGLE_ARG(args, NSString);
  
  NSString *message = (NSString*)args;
  
  dispatch_async(dispatch_get_main_queue(), ^{
    UIAlertController *alert = [UIAlertController 
                               alertControllerWithTitle:nil 
                               message:message 
                               preferredStyle:UIAlertControllerStyleAlert];
    
    UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
    
    [rootViewController presentViewController:alert animated:YES completion:nil];
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
      [alert dismissViewControllerAnimated:YES completion:nil];
    });
  });
}

- (void)showWithOptions:(id)args
{
  ENSURE_UI_THREAD(showWithOptions, args);
  ENSURE_SINGLE_ARG(args, NSDictionary);
  
  NSString *message = [TiUtils stringValue:@"message" properties:args];
  NSString *title = [TiUtils stringValue:@"title" properties:args def:nil];
  NSNumber *duration = [TiUtils numberValue:@"duration" properties:args def:@2000];
  
  dispatch_async(dispatch_get_main_queue(), ^{
    UIAlertController *alert = [UIAlertController 
                               alertControllerWithTitle:title 
                               message:message 
                               preferredStyle:UIAlertControllerStyleAlert];
    
    UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
    
    [rootViewController presentViewController:alert animated:YES completion:nil];
    
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, ([duration intValue] / 1000.0) * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
      [alert dismissViewControllerAnimated:YES completion:nil];
    });
  });
}

@end

Swift๋กœ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ๋ธŒ๋ฆฟ์ง• ํ—ค๋”๋ฅผ ํ†ตํ•ด Objective-C์™€ ์—ฐ๊ฒฐํ•ด์•ผ ํ•ด์š”. 2025๋…„ ๋ฒ„์ „์˜ Titanium์—์„œ๋Š” Swift ์ง€์›์ด ๋” ๊ฐ„ํŽธํ•ด์กŒ๋‹ต๋‹ˆ๋‹ค! ๐ŸŽ‰

Swift๋กœ ๋ชจ๋“ˆ์„ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ๋” ์‹ ๊ฒฝ์จ์•ผ ํ•ด์š”. ํŠนํžˆ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์™€ ARC(Automatic Reference Counting)์— ์ฃผ์˜ํ•˜์„ธ์š”!

๐Ÿ”จ iOS ๋ชจ๋“ˆ ๋นŒ๋“œํ•˜๊ธฐ

๋ชจ๋“ˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ›„์—๋Š” ๋นŒ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. iOS ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•œ ํ›„ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”:

cd ios
titanium build

๋นŒ๋“œ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด build/ ๋””๋ ‰ํ† ๋ฆฌ์— com.example.supertoast-iphone-1.0.0.zip ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์ด ๋ฐ”๋กœ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  iOS ๋ชจ๋“ˆ์ด์—์š”!

๐Ÿค– Android ๋ชจ๋“ˆ ๊ฐœ๋ฐœํ•˜๊ธฐ

์ด์ œ Android ๋ชจ๋“ˆ์„ ๊ฐœ๋ฐœํ•ด๋ณผ ์ฐจ๋ก€์˜ˆ์š”. Android ๋ชจ๋“ˆ์€ Java ๋˜๋Š” Kotlin์œผ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ์–ด์š”. 2025๋…„์—๋Š” Kotlin์ด ํ‘œ์ค€์ด ๋˜์—ˆ์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” Java ์˜ˆ์ œ๋„ ํ•จ๊ป˜ ์‚ดํŽด๋ณผ๊ฒŒ์š”.

๐Ÿ“ฑ Android SuperToast ๋ชจ๋“ˆ ๊ตฌํ˜„ํ•˜๊ธฐ

Java๋กœ ๊ตฌํ˜„ํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค:

SupertoastModule.java

package com.example.supertoast;

import org.appcelerator.kroll.KrollModule;
import org.appcelerator.kroll.annotations.Kroll;
import org.appcelerator.titanium.TiApplication;

import android.app.Activity;
import android.widget.Toast;
import android.os.Handler;
import android.os.Looper;

import com.google.android.material.snackbar.Snackbar;
import android.view.View;
import android.graphics.Color;

import org.appcelerator.kroll.KrollDict;

@Kroll.module(name="Supertoast", id="com.example.supertoast")
public class SupertoastModule extends KrollModule
{
    public SupertoastModule()
    {
        super();
    }

    @Kroll.onAppCreate
    public static void onAppCreate(TiApplication app)
    {
        // ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋  ๋•Œ ํ•„์š”ํ•œ ์ดˆ๊ธฐํ™” ์ฝ”๋“œ
    }

    @Kroll.method
    public void show(String message)
    {
        final String msg = message;
        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                Activity activity = TiApplication.getAppCurrentActivity();
                Toast.makeText(activity, msg, Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Kroll.method
    public void showWithOptions(KrollDict options)
    {
        final String message = options.getString("message");
        final String title = options.optString("title", null);
        final int duration = options.optInt("duration", 2000);
        final String type = options.optString("type", "toast");
        
        new Handler(Looper.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                Activity activity = TiApplication.getAppCurrentActivity();
                
                if (type.equals("snackbar")) {
                    View view = activity.findViewById(android.R.id.content);
                    Snackbar snackbar = Snackbar.make(view, message, 
                        duration > 2000 ? Snackbar.LENGTH_LONG : Snackbar.LENGTH_SHORT);
                    
                    if (title != null) {
                        snackbar.setActionTextColor(Color.WHITE);
                        snackbar.setAction(title, new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {
                                // ์•ก์…˜ ํด๋ฆญ ์ฒ˜๋ฆฌ
                            }
                        });
                    }
                    
                    snackbar.show();
                } else {
                    Toast toast = Toast.makeText(activity, message, 
                        duration > 3500 ? Toast.LENGTH_LONG : Toast.LENGTH_SHORT);
                    toast.show();
                }
            }
        });
    }
}

Kotlin์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋” ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  null ์•ˆ์ „์„ฑ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ์–ด์š”. 2025๋…„์—๋Š” Titanium์—์„œ Kotlin ์ง€์›์ด ๋”์šฑ ๊ฐ•ํ™”๋˜์—ˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ˜Š

Android ๋ชจ๋“ˆ ๊ฐœ๋ฐœ ์‹œ Material Design 3 ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋” ํ˜„๋Œ€์ ์ธ UI๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”. 2025๋…„์—๋Š” Material You ๋””์ž์ธ ์–ธ์–ด๊ฐ€ ๋”์šฑ ๋ฐœ์ „ํ–ˆ์œผ๋‹ˆ ์ ๊ทน ํ™œ์šฉํ•ด๋ณด์„ธ์š”!

๐Ÿ”จ Android ๋ชจ๋“ˆ ๋นŒ๋“œํ•˜๊ธฐ

Android ๋ชจ๋“ˆ๋„ ๋นŒ๋“œํ•ด๋ณผ๊ฒŒ์š”. Android ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•œ ํ›„ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”:

cd android
titanium build

๋นŒ๋“œ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด dist/ ๋””๋ ‰ํ† ๋ฆฌ์— com.example.supertoast-android-1.0.0.zip ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ์˜ Android ๋ชจ๋“ˆ์ด์—์š”!

๐Ÿš€ ๋งŒ๋“  ๋ชจ๋“ˆ ์‚ฌ์šฉํ•˜๊ธฐ

์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋ฉ‹์ง„ ๋ชจ๋“ˆ์„ Titanium ์•ฑ์—์„œ ์‚ฌ์šฉํ•ด๋ณผ ์ฐจ๋ก€์˜ˆ์š”! ์ง„์งœ ๊ฐœ๋ฐœ์˜ ๊ฝƒ์€ ๋‚ด๊ฐ€ ๋งŒ๋“  ๋ชจ๋“ˆ์„ ์‹ค์ œ๋กœ ์จ๋ณด๋Š” ๊ฑฐ ์•„๋‹ˆ๊ฒ ์–ด์š”? ใ…‹ใ…‹ใ…‹

๐Ÿ“ฒ ๋ชจ๋“ˆ ํ†ตํ•ฉํ•˜๊ธฐ

๋จผ์ € Titanium ์•ฑ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด๋ณผ๊ฒŒ์š”:

titanium create --type=app --name=ModuleTestApp --id=com.example.moduletestapp --platforms=ios,android

๊ทธ ๋‹ค์Œ, ํ”„๋กœ์ ํŠธ์˜ tiapp.xml ํŒŒ์ผ์— ๋ชจ๋“ˆ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ด์š”:

<modules>
    <module platform="iphone">com.example.supertoast</module>
    <module platform="android">com.example.supertoast</module>
</modules>

๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ๋œ ๋ชจ๋“ˆ ํŒŒ์ผ์„ ์•ฑ ํ”„๋กœ์ ํŠธ์˜ ์ ์ ˆํ•œ ์œ„์น˜์— ๋ณต์‚ฌํ•ด์•ผ ํ•ด์š”:

  1. iOS ๋ชจ๋“ˆ ํŒŒ์ผ(com.example.supertoast-iphone-1.0.0.zip)์„ ModuleTestApp/modules/iphone/ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌ
  2. Android ๋ชจ๋“ˆ ํŒŒ์ผ(com.example.supertoast-android-1.0.0.zip)์„ ModuleTestApp/modules/android/ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌ

๐Ÿ’ป ๋ชจ๋“ˆ ์‚ฌ์šฉ ์˜ˆ์ œ

์ด์ œ ์•ฑ์—์„œ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด๋ณผ๊ฒŒ์š”! app.js ํŒŒ์ผ์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์„ธ์š”:

// ๋ชจ๋“ˆ ๋กœ๋“œํ•˜๊ธฐ
var SuperToast = require('com.example.supertoast');

// ๊ธฐ๋ณธ ์ฐฝ ์ƒ์„ฑ
var win = Ti.UI.createWindow({
    backgroundColor: '#fff'
});

// ๊ธฐ๋ณธ ๋ฒ„ํŠผ ์ƒ์„ฑ
var basicBtn = Ti.UI.createButton({
    title: '๊ธฐ๋ณธ ํ† ์ŠคํŠธ ๋ณด์—ฌ์ฃผ๊ธฐ',
    top: 100,
    width: 250,
    height: 50
});

// ๊ณ ๊ธ‰ ๋ฒ„ํŠผ ์ƒ์„ฑ
var advancedBtn = Ti.UI.createButton({
    title: '๊ณ ๊ธ‰ ํ† ์ŠคํŠธ ๋ณด์—ฌ์ฃผ๊ธฐ',
    top: 200,
    width: 250,
    height: 50
});

// ๊ธฐ๋ณธ ํ† ์ŠคํŠธ ์ด๋ฒคํŠธ
basicBtn.addEventListener('click', function() {
    SuperToast.show('์•ˆ๋…•ํ•˜์„ธ์š”! ๊ธฐ๋ณธ ํ† ์ŠคํŠธ์ž…๋‹ˆ๋‹ค! ๐Ÿ˜Š');
});

// ๊ณ ๊ธ‰ ํ† ์ŠคํŠธ ์ด๋ฒคํŠธ
advancedBtn.addEventListener('click', function() {
    SuperToast.showWithOptions({
        message: '๋” ๋ฉ‹์ง„ ์ปค์Šคํ…€ ํ† ์ŠคํŠธ์ž…๋‹ˆ๋‹ค!',
        title: 'ํ™•์ธ',
        duration: 3000,
        type: 'snackbar' // Android์—์„œ๋งŒ ์ž‘๋™
    });
});

// ๋ฒ„ํŠผ์„ ์ฐฝ์— ์ถ”๊ฐ€
win.add(basicBtn);
win.add(advancedBtn);

// ์ฐฝ ์—ด๊ธฐ
win.open();

์ด์ œ ์•ฑ์„ ๋นŒ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•ด๋ณด์„ธ์š”:

titanium build -p [ios|android] -T [simulator|device]

๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์ปค์Šคํ…€ ํ† ์ŠคํŠธ/์•Œ๋ฆผ์ด ํ‘œ์‹œ๋  ๊ฑฐ์˜ˆ์š”! ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ๋Š” Material Design์˜ Snackbar๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ง„์งœ ํ”„๋กœํŽ˜์…”๋„ํ•œ ์•ฑ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜Ž

์•ˆ๋…•ํ•˜์„ธ์š”! ๊ธฐ๋ณธ ํ† ์ŠคํŠธ์ž…๋‹ˆ๋‹ค! ๐Ÿ˜Š ๋” ๋ฉ‹์ง„ ์ปค์Šคํ…€ ํ† ์ŠคํŠธ! ํ™•์ธ iOS ํ† ์ŠคํŠธ Android ์Šค๋‚ต๋ฐ” SuperToast ๋ชจ๋“ˆ ์‹คํ–‰ ๊ฒฐ๊ณผ

๐Ÿ”ฅ ๊ณ ๊ธ‰ ๋ชจ๋“ˆ ๊ฐœ๋ฐœ ํ…Œํฌ๋‹‰

๊ธฐ๋ณธ์ ์ธ ๋ชจ๋“ˆ ๊ฐœ๋ฐœ์€ ๋งˆ์Šคํ„ฐํ–ˆ์œผ๋‹ˆ, ์ด์ œ ์ข€ ๋” ๊ณ ๊ธ‰ ๊ธฐ์ˆ ์„ ์‚ดํŽด๋ณผ๊ฒŒ์š”! 2025๋…„ ํ˜„์žฌ Titanium ๋ชจ๋“ˆ ๊ฐœ๋ฐœ์—์„œ ์ฃผ๋ชฉ๋ฐ›๋Š” ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•๋“ค์ด์—์š”. ๐Ÿง™โ€โ™‚๏ธ

๐Ÿ“ข ์ฝœ๋ฐฑ๊ณผ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

๋ชจ๋“ˆ์—์„œ JavaScript ์ฝœ๋ฐฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ์ค‘์š”ํ•ด์š”. ํŠนํžˆ ๋น„๋™๊ธฐ ์ž‘์—…์„ ํ•  ๋•Œ ํ•„์ˆ˜์ ์ด์ฃ !

iOS์—์„œ ์ฝœ๋ฐฑ ์ฒ˜๋ฆฌ (Objective-C)

- (void)performTaskWithCallback:(id)args
{
    ENSURE_UI_THREAD(performTaskWithCallback, args);
    ENSURE_ARG_COUNT(args, 2);
    
    NSString *taskData = [args objectAtIndex:0];
    KrollCallback *callback = [args objectAtIndex:1];
    
    // ๋น„๋™๊ธฐ ์ž‘์—… ์ˆ˜ํ–‰
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // ์ž‘์—… ์ˆ˜ํ–‰...
        NSString *result = [taskData uppercaseString];
        
        // ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์ฝœ๋ฐฑ ํ˜ธ์ถœ
        dispatch_async(dispatch_get_main_queue(), ^{
            NSMutableDictionary *event = [NSMutableDictionary dictionary];
            [event setObject:result forKey:@"result"];
            [event setObject:@YES forKey:@"success"];
            
            [callback call:[NSArray arrayWithObject:event] thisObject:self];
        });
    });
}

Android์—์„œ ์ฝœ๋ฐฑ ์ฒ˜๋ฆฌ (Java)

@Kroll.method
public void performTaskWithCallback(String taskData, KrollFunction callback)
{
    // ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—… ์ˆ˜ํ–‰
    new Thread(new Runnable() {
        @Override
        public void run() {
            // ์ž‘์—… ์ˆ˜ํ–‰...
            final String result = taskData.toUpperCase();
            
            // UI ์Šค๋ ˆ๋“œ์—์„œ ์ฝœ๋ฐฑ ํ˜ธ์ถœ
            Activity activity = TiApplication.getAppCurrentActivity();
            activity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    HashMap<String, Object> event = new HashMap<>();
                    event.put("result", result);
                    event.put("success", true);
                    
                    callback.call(getKrollObject(), event);
                }
            });
        }
    }).start();
}

์ฝœ๋ฐฑ ์ฒ˜๋ฆฌ ์‹œ ํ•ญ์ƒ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์— ์ฃผ์˜ํ•ด์•ผ ํ•ด์š”! ํŠนํžˆ ์žฅ์‹œ๊ฐ„ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์—์„œ๋Š” ๋”์šฑ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์•ฝํ•œ ์ฐธ์กฐ(weak reference)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”.

๐Ÿ”ง ๋ชจ๋“ˆ ์†์„ฑ ์ •์˜ํ•˜๊ธฐ

๋ชจ๋“ˆ์— ์ƒ์ˆ˜๋‚˜ ์†์„ฑ์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์•Œ์•„๋ณผ๊ฒŒ์š”:

iOS์—์„œ ์†์„ฑ ์ •์˜ (Objective-C)

- (NSString*)apiVersion
{
    return @"1.0.0";
}

- (NSNumber*)TOAST_SHORT
{
    return @2000;
}

- (NSNumber*)TOAST_LONG
{
    return @3500;
}

Android์—์„œ ์†์„ฑ ์ •์˜ (Java)

@Kroll.constant
public static final int TOAST_SHORT = 2000;

@Kroll.constant
public static final int TOAST_LONG = 3500;

@Kroll.getProperty
public String getApiVersion() {
    return "1.0.0";
}

์ด๋ ‡๊ฒŒ ์ •์˜ํ•œ ์†์„ฑ์€ JavaScript์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”:

var SuperToast = require('com.example.supertoast');
console.log("API ๋ฒ„์ „: " + SuperToast.apiVersion);

SuperToast.showWithOptions({
    message: "๊ธด ํ† ์ŠคํŠธ ๋ฉ”์‹œ์ง€",
    duration: SuperToast.TOAST_LONG
});

๐Ÿ“š ์„œ๋“œํŒŒํ‹ฐ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ†ตํ•ฉ

2025๋…„์—๋Š” ๋” ๋งŽ์€ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๋“ฑ์žฅํ–ˆ์–ด์š”. ์ด๋Ÿฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ Titanium ๋ชจ๋“ˆ์— ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์•Œ์•„๋ณผ๊ฒŒ์š”!

iOS์—์„œ๋Š” CocoaPods๋‚˜ Swift Package Manager๋ฅผ, Android์—์„œ๋Š” Gradle์„ ์‚ฌ์šฉํ•ด ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

iOS ๋ชจ๋“ˆ์˜ Podfile ์˜ˆ์ œ

platform :ios, '15.0'
target 'SupertoastModule' do
  pod 'SwiftyJSON', '~> 5.0'
  pod 'Alamofire', '~> 5.8.0'
end

Android ๋ชจ๋“ˆ์˜ build.gradle ์˜ˆ์ œ

dependencies {
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    implementation 'com.google.code.gson:gson:2.10.1'
}

์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“ˆ ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ํฌ๊ฒŒ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์–ด์š”! ํ•˜์ง€๋งŒ ๋ผ์ด์„ผ์Šค์™€ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ญ์ƒ ํ™•์ธํ•ด์•ผ ํ•ด์š”.

๐Ÿ” ๋ฌธ์ œ ํ•ด๊ฒฐ๊ณผ ๋””๋ฒ„๊น…

๋ชจ๋“ˆ ๊ฐœ๋ฐœ ์ค‘์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ๊นŒ์š”? 2025๋…„์—๋„ ๋””๋ฒ„๊น…์€ ์—ฌ์ „ํžˆ ๊ฐœ๋ฐœ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด์—์š”! ๐Ÿ•ต๏ธโ€โ™‚๏ธ

โš ๏ธ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋“ค

  1. ๋ชจ๋“ˆ ๋กœ๋“œ ์‹คํŒจ: ๋ชจ๋“ˆ ID๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€, ๋ชจ๋“ˆ ํŒŒ์ผ์ด ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
  2. ๋นŒ๋“œ ์˜ค๋ฅ˜: SDK ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ์„ ํ™•์ธํ•˜๊ณ , ํ•„์š”ํ•œ ๋ชจ๋“  ์˜์กด์„ฑ์ด ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
  3. ํฌ๋ž˜์‹œ ๋ฐœ์ƒ: ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ์—์„œ null ์ฒดํฌ๋ฅผ ์ฒ ์ €ํžˆ ํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ์ฃผ์˜ํ•˜์„ธ์š”.
  4. ์„ฑ๋Šฅ ๋ฌธ์ œ: ๋ฌด๊ฑฐ์šด ์ž‘์—…์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ์ฒ˜๋ฆฌํ•˜๊ณ , UI ์—…๋ฐ์ดํŠธ๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ํ•ด์•ผ ํ•ด์š”.
  5. ํ”Œ๋žซํผ ๊ฐ„ ์ฐจ์ด: iOS์™€ Android ๊ฐ„์˜ ๋™์ž‘ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๊ณ  ๊ฐ ํ”Œ๋žซํผ์— ๋งž๊ฒŒ ๊ตฌํ˜„ํ•˜์„ธ์š”.

๐Ÿ› ๏ธ ๋””๋ฒ„๊น… ํŒ

ํšจ๊ณผ์ ์ธ ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ํŒ์„ ์•Œ๋ ค๋“œ๋ฆด๊ฒŒ์š”:

  1. ๋กœ๊ทธ ํ™œ์šฉํ•˜๊ธฐ: iOS์—์„œ๋Š” NSLog(), Android์—์„œ๋Š” Log.d()๋ฅผ ์‚ฌ์šฉํ•ด ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธฐ์„ธ์š”.
  2. ๋””๋ฒ„๊น… ๋ชจ๋“œ ํ™œ์„ฑํ™”: titanium build --debug ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด ๋””๋ฒ„๊น… ์ •๋ณด๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
  3. ๋„ค์ดํ‹ฐ๋ธŒ ๋””๋ฒ„๊ฑฐ ์‚ฌ์šฉ: Xcode๋‚˜ Android Studio์˜ ๋””๋ฒ„๊ฑฐ๋ฅผ ํ™œ์šฉํ•˜์„ธ์š”.
  4. ๋‹จ๊ณ„์  ํ…Œ์ŠคํŠธ: ๋ณต์žกํ•œ ๊ธฐ๋Šฅ์€ ์ž‘์€ ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด ํ…Œ์ŠคํŠธํ•˜์„ธ์š”.
  5. ์ปค๋ฎค๋‹ˆํ‹ฐ ํ™œ์šฉ: Titanium ํฌ๋Ÿผ์ด๋‚˜ Stack Overflow์—์„œ ๋„์›€์„ ๊ตฌํ•˜์„ธ์š”.

2025๋…„์—๋Š” Titanium Studio์— ํ†ตํ•ฉ๋œ AI ๋””๋ฒ„๊น… ์–ด์‹œ์Šคํ„ดํŠธ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋” ๋น ๋ฅด๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์š”! ์ด ๊ธฐ๋Šฅ์€ ์ฝ”๋“œ ํŒจํ„ด์„ ๋ถ„์„ํ•˜๊ณ  ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ๋ฏธ๋ฆฌ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

๐Ÿ“ฆ ๋ชจ๋“ˆ ๋ฐฐํฌํ•˜๊ธฐ

๋ชจ๋“ˆ ๊ฐœ๋ฐœ์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ์ด์ œ ๋ฐฐํฌํ•  ์ฐจ๋ก€์˜ˆ์š”! ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๋„ ์šฐ๋ฆฌ์˜ ๋ฉ‹์ง„ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค„๊ฒŒ์š”. ๐ŸŒ

๐Ÿ“ ๋ฌธ์„œํ™”

์ข‹์€ ๋ชจ๋“ˆ์€ ์ข‹์€ ๋ฌธ์„œ์™€ ํ•จ๊ป˜ํ•ด์š”! ๋ชจ๋“ˆ ๋ฌธ์„œ๋Š” ๋‹ค์Œ ๋‚ด์šฉ์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  1. ์„ค์น˜ ๋ฐฉ๋ฒ•: ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜๊ณ  ํ”„๋กœ์ ํŠธ์— ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  2. API ๋ ˆํผ๋Ÿฐ์Šค: ๋ชจ๋“  ๋ฉ”์†Œ๋“œ, ์†์„ฑ, ์ด๋ฒคํŠธ์— ๋Œ€ํ•œ ์„ค๋ช…
  3. ์‚ฌ์šฉ ์˜ˆ์ œ: ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€์™€ ์ฝ”๋“œ ์˜ˆ์ œ
  4. ์š”๊ตฌ์‚ฌํ•ญ: ์ง€์›ํ•˜๋Š” Titanium ๋ฒ„์ „, ํ”Œ๋žซํผ ๋“ฑ
  5. ๋ผ์ด์„ผ์Šค: ๋ชจ๋“ˆ ์‚ฌ์šฉ์— ๊ด€ํ•œ ๋ฒ•์  ์ •๋ณด

๋ฌธ์„œ๋Š” GitHub์˜ README.md ํŒŒ์ผ์ด๋‚˜ ๋ณ„๋„์˜ ๋ฌธ์„œ ์‚ฌ์ดํŠธ์— ํ˜ธ์ŠคํŒ…ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿšš ๋ฐฐํฌ ์ฑ„๋„

๋ชจ๋“ˆ์„ ๋ฐฐํฌํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์š”:

  1. GitHub: ์†Œ์Šค ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋ฆด๋ฆฌ์Šค ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•
  2. NPM: Node.js ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ํ†ตํ•œ ๋ฐฐํฌ
  3. Titanium Marketplace: ๊ณต์‹ Titanium ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์— ๋“ฑ๋ก (2025๋…„์—๋Š” ๋”์šฑ ํ™œ์„ฑํ™”๋จ)
  4. ์žฌ๋Šฅ๋„ท: ๊ตญ๋‚ด ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์žฌ๋Šฅ๋„ท์—์„œ ๋ชจ๋“ˆ ๊ฐœ๋ฐœ ์„œ๋น„์Šค๋‚˜ ์™„์„ฑ๋œ ๋ชจ๋“ˆ์„ ํŒ๋งคํ•  ์ˆ˜๋„ ์žˆ์–ด์š”!

2025๋…„์—๋Š” Titanium Module Registry๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ๊ฐœํŽธ๋˜์–ด ๋ชจ๋“ˆ ๊ฒ€์ƒ‰๊ณผ ์„ค์น˜๊ฐ€ ๋”์šฑ ๊ฐ„ํŽธํ•ด์กŒ์–ด์š”. CLI์—์„œ titanium module install supertoast ๊ฐ™์€ ๋ช…๋ น์–ด๋กœ ์‰ฝ๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์ฃ !

๐Ÿ”ข ๋ฒ„์ „ ๊ด€๋ฆฌ

๋ชจ๋“ˆ์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ๋Š” Semantic Versioning(SemVer)์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ์ข‹์•„์š”:

  1. Major ๋ฒ„์ „(X.0.0): ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ
  2. Minor ๋ฒ„์ „(0.X.0): ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  3. Patch ๋ฒ„์ „(0.0.X): ๋ฒ„๊ทธ ์ˆ˜์ •์ด๋‚˜ ์„ฑ๋Šฅ ๊ฐœ์„ 

๊ฐ ๋ฆด๋ฆฌ์Šค๋งˆ๋‹ค ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๊ธฐ๋กํ•œ CHANGELOG.md ํŒŒ์ผ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ์Šต๊ด€์ด์—์š”!

๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌ: ๋‹น์‹ ๋„ ์ด์ œ Titanium ๋ชจ๋“ˆ ๊ฐœ๋ฐœ์ž!

์ง€๊ธˆ๊นŒ์ง€ Titanium ๋ชจ๋“ˆ ๊ฐœ๋ฐœ๊ณผ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”! ์ฒ˜์Œ์—๋Š” ์–ด๋ ค์›Œ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•˜๋‚˜์”ฉ ๋”ฐ๋ผํ•˜๋‹ค ๋ณด๋ฉด ๋ˆ„๊ตฌ๋‚˜ ๋งˆ์Šคํ„ฐํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค. ๐Ÿ˜Š

๐Ÿ”‘ ํ•ต์‹ฌ ์š”์•ฝ

  1. Titanium ๋ชจ๋“ˆ์€ JavaScript๋งŒ์œผ๋กœ๋Š” ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ๋„ค์ดํ‹ฐ๋ธŒ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋ฐฉ๋ฒ•
  2. iOS์™€ Android ํ”Œ๋žซํผ ๊ฐ๊ฐ์— ๋งž๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ์ž‘์„ฑ์ด ํ•„์š”
  3. ๋ชจ๋“ˆ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ •๋ถ€ํ„ฐ ๋ฐฐํฌ๊นŒ์ง€ ์ฒด๊ณ„์ ์ธ ๊ณผ์ •์„ ๋”ฐ๋ผ์•ผ ํ•จ
  4. ์ฝœ๋ฐฑ, ์ด๋ฒคํŠธ, ์†์„ฑ ๋“ฑ์„ ํ™œ์šฉํ•ด JavaScript์™€ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ ๊ฐ„ ์›ํ™œํ•œ ํ†ต์‹  ๊ตฌํ˜„
  5. AI, AR/VR, IoT ๋“ฑ ์ตœ์‹  ๊ธฐ์ˆ  ํŠธ๋ Œ๋“œ๋ฅผ ๋ชจ๋“ˆ์— ํ†ตํ•ฉํ•˜๋ฉด ์ฐจ๋ณ„ํ™”๋œ ๊ฐ€์น˜ ์ œ๊ณต ๊ฐ€๋Šฅ

Titanium ๋ชจ๋“ˆ ๊ฐœ๋ฐœ์€ ๋‹จ์ˆœํ•œ ์•ฑ ๊ฐœ๋ฐœ์„ ๋„˜์–ด ์ง„์ •ํ•œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•˜๋Š” ๊ธธ์ด์—์š”. ์ด์ œ ์—ฌ๋Ÿฌ๋ถ„๋„ ์ž์‹ ๋งŒ์˜ ๋ชจ๋“ˆ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๊ณต์œ ํ•ด๋ณด์„ธ์š”!

ํ˜น์‹œ ๋ชจ๋“ˆ ๊ฐœ๋ฐœ์— ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ๊ณ„์‹œ๋‹ค๋ฉด, ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ ๊ฐœ๋ฐœ์ž์˜ ๋„์›€์„ ๋ฐ›์•„๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”. ๋ชจ๋“ˆ ๊ฐœ๋ฐœ ์˜๋ขฐ๋‚˜ ๊ธฐ์กด ๋ชจ๋“ˆ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๋“ฑ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿค

์—ฌ๋Ÿฌ๋ถ„์˜ Titanium ๋ชจ๋“ˆ ๊ฐœ๋ฐœ ์—ฌ์ •์— ํ–‰์šด์ด ํ•จ๊ป˜ํ•˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค! ์งˆ๋ฌธ์ด๋‚˜ ํ”ผ๋“œ๋ฐฑ์ด ์žˆ์œผ์‹œ๋ฉด ์–ธ์ œ๋“ ์ง€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”~ ๋‹ค์Œ์— ๋˜ ์œ ์ตํ•œ ๋‚ด์šฉ์œผ๋กœ ์ฐพ์•„์˜ฌ๊ฒŒ์š”! ์•ˆ๋…•ํžˆ ๊ณ„์„ธ์š”! ๐Ÿ‘‹

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.