چگونه در ۳ روز یک اپلیکیشن iOS ساختم، بدون هیچ دانش قبلی از Swift

آنچه درباره کدنویسی حسی، ابزارهای هوش مصنوعی و شروع کار به عنوان یک کارآفرین تک‌نفره آموختم

اپلیکیشن Brush Tracker که تصویر دندان‌های تمیز و امتیاز ۱۰۰٪ را نشان می‌دهد

من اپلیکیشن Brush Tracker را در عرض ۳ روز ساختم، بدون آنکه هیچ تجربه قبلی در زبان سوئیفت (Swift)، زبان اصلی برنامه‌نویسی iOS، داشته باشم. با اینکه حالا یک اپلیکیشن کاملاً کاربردی و منتشر شده در اپ استور (App Store) دارم، دانش من از سوئیفت هنوز بسیار ناچیز است؛ چرا که برای توسعه این اپ از روشی به نام «کدنویسی حسی» (vibe coding) کمک گرفتم.

در این مقاله، این فرآیند را توضیح می‌دهم، ابزارهای هوش مصنوعی که استفاده کردم را معرفی می‌کنم و برخی از آموخته‌ها و دیدگاه‌هایم را با شما به اشتراک می‌گذارم.

Anything، جایگزینی برای Lovable

من قبلاً از Lovable برای توسعه اپلیکیشن‌های وب استفاده می‌کردم، اما به نظر می‌رسد این ابزار، حداقل در حال حاضر، گزینه‌ای برای توسعه اپلیکیشن‌های موبایل ارائه نمی‌دهد.

برای توسعه اپلیکیشن، جایگزین‌هایی برای Lovable وجود دارد. من به تازگی با ابزاری به نام Anything آشنا شدم و از آنجایی که تجربه بسیار خوبی با Lovable داشتم، تصمیم گرفتم برای توسعه اپلیکیشن جدیدم آن را امتحان کنم. در ابتدا به نظر می‌رسید که خوب کار می‌کند، اما تجربه کلی آنقدر که امیدوار بودم کارآمد نبود.

سخت‌ترین بخش این بود که نمی‌توانستم تغییرات، اصلاحات و بهبودهایی که اعمال می‌کردم را بلافاصله آزمایش کنم. ابزار Anything یک رابط کاربری داخلی برای تست دارد، اما تجربه کار با آن چندان روان نبود. این ابزار همچنین شما را به تست کد از طریق اپلیکیشن Expo هدایت می‌کند که آن هم برای من خوب کار نکرد.

باید اشاره کنم که من هیچ تجربه قبلی در زمینه توسعه اپلیکیشن نداشتم. برای توسعه‌دهندگان یا هر کسی که کمی پیش‌زمینه کدنویسی داشته باشد، Anything احتمالاً می‌تواند ابزار مفیدتری باشد.

من کد را از Anything خروجی گرفتم و سعی کردم آن را روی Xcode در مک خودم آزمایش کنم، اما با خطاهای زیادی مواجه شدم و نتوانستم آن را اجرا کنم. بنابراین تصمیم گرفتم از یک جایگزین استفاده کنم. Cursor انتخاب واضحی به نظر می‌رسید.

Cursor

از بسیاری از دوستانی که فعالانه از Cursor استفاده می‌کنند، تعریف‌های بسیار خوبی درباره آن شنیده بودم. می‌خواستم خودم آن را امتحان کنم.

من همان پرامپت (دستور) قبلی را در Cursor استفاده کردم و از آن خواستم که اپلیکیشن را بسازد. سپس یک پروژه Xcode با پوشه‌ها و فایل‌هایی که Cursor ایجاد کرده بود، ساختم. شبیه‌ساز را در Xcode اجرا کردم و در همان اولین تلاش، اپلیکیشن به درستی کار کرد.

هدف Brush Tracker این است که به شما کمک کند به روال روزانه مسواک زدن خود پایبند بمانید. این اپ یک «امتیاز تمیزی» به شما می‌دهد که از ۱۰۰٪ شروع می‌شود. اگر یک روز مسواک زدن را فراموش کنید، امتیاز کاهش می‌یابد و دندان‌های شما در اپلیکیشن کمی زردتر به نظر می‌رسند تا با امتیاز تمیزی مطابقت داشته باشند.

امتیاز تمیزی کاهش یافته در اپلیکیشن Brush Tracker با دندان‌های کمی زرد شده

توجه: تمام تصاویر استفاده شده در این مقاله، اسکرین‌شات‌هایی از اپلیکیشن من، Brush Tracker، هستند.

نسخه اول فقط ویژگی اصلی اپلیکیشن را داشت. به نظرم این کارآمدترین روش برای ساخت محصولات با ابزارهای مبتنی بر هوش مصنوعی است؛ اینکه قبل از اضافه کردن ویژگی‌های جدید، نسخه اول را آماده و اجرا کنید.

برای آزمایش ویژگی اصلی اپلیکیشن روی شبیه‌ساز، باید تاریخ شبیه‌ساز را بدون تکمیل «مسواک زدن امروز» تغییر می‌دادم تا بررسی کنم آیا امتیاز تمیزی کاهش می‌یابد و ظاهر دندان‌ها مطابق انتظار تغییر می‌کند یا نه.

Cursor پیشنهاد کرد که تاریخ را در شبیه‌ساز Xcode تغییر دهم، اما شبیه‌ساز دیگر تنظیمات تاریخ و زمان را ندارد. نسخه‌های قدیمی‌تر شبیه‌ساز Xcode این تنظیم را داشتند، اما در نسخه‌های جدید حذف شده است.

یک راه‌حل جایگزین، تغییر تاریخ در سیستم‌عامل مک بود. با این کار، تاریخ شبیه‌ساز هم تغییر می‌کرد و من توانستم این ویژگی را آزمایش کنم.

یک نکته‌ای که متوجه شدم این بود که وقتی تاریخ مک را تغییر می‌دادم، Cursor حساب کاربری من را شناسایی نمی‌کرد و کار نمی‌کرد. وقتی تاریخ را به حالت خودکار برگرداندم، همه چیز به حالت عادی بازگشت.

ویژگی تایمر

یک تایمر داخلی برای مسواک زدن، قابلیت بسیار خوبی برای Brush Tracker به نظر می‌رسید. کاربران می‌توانند به سادگی یک جلسه مسواک زدن را به عنوان «انجام شده» علامت بزنند یا در حین مسواک زدن از تایمر استفاده کنند.

ویژگی تایمر مسواک زدن در اپلیکیشن Brush Tracker

چندین بار تلاش کردم تا این ویژگی را به شکلی که تصور می‌کردم، پیاده‌سازی کنم. شما می‌توانید به سادگی از Cursor بخواهید یک ویژگی اضافه کند، اما وقتی پرامپت را دقیق‌تر می‌کنید و دقیقاً توضیح می‌دهید چه می‌خواهید، نتیجه بسیار بهتر می‌شود. وقتی دستورالعمل‌های واضحی ارائه دهید، Cursor معمولاً کارش را عالی انجام می‌دهد.

ویژگی پاداش

می‌خواستم یک انگیزه اضافی برای زمانی که کاربر مسواک زدن‌های روزانه خود را تکمیل می‌کند، اضافه کنم. پس از اتمام جلسات، آن‌ها می‌توانند روی دکمه «دریافت پاداش روزانه» ضربه بزنند و یک جمله انگیزشی کوتاه ببینند. این یک قابلیت کوچک است، اما یادآور خوبی برای اهمیت سلامت دندان‌هاست.

ویژگی پاداش روزانه با یک جمله انگیزشی در اپلیکیشن Brush Tracker

شما واقعاً می‌توانید حین «کدنویسی حسی» یاد بگیرید

Cursor نه تنها کد را می‌نویسد، بلکه به شما در یادگیری نیز کمک می‌کند. وقتی سعی داشتم ویژگی پاداش را اضافه کنم، پیاده‌سازی اولیه صحیح نبود و به درستی کار نمی‌کرد.

من مشکل را برای Cursor توضیح دادم و او هم علت مشکل و هم راه حل آن را برایم تشریح کرد. در اینجا دو مثال از اینکه چگونه Cursor می‌تواند در طول مسیر به شما در یادگیری کمک کند، آورده شده است:

«مشکل اینجاست که در اولین ضربه روی دکمه، متغیر rewardQuote خالی است، زیرا تابع handleRewardTap() آن را تنظیم می‌کند، اما sheet (صفحه پاداش) بلافاصله نمایش داده می‌شود. باید اطمینان حاصل کنم که جمله انگیزشی قبل از نمایش sheet تنظیم شده باشد.»

«مشکل حل شد! مسئله این بود که دستور showReward = true بلافاصله بعد از تنظیم rewardQuote اجرا می‌شد، اما در SwiftUI، نمایش sheet ممکن است قبل از پردازش کامل به‌روزرسانی state اتفاق بیفتد.»

استفاده بهینه‌تر از Cursor

Cursor ابزار فوق‌العاده‌ای است، اما راه‌هایی برای استفاده بهینه‌تر از آن وجود دارد.

فرض کنید کد با خطا مواجه می‌شود یا به درستی اجرا نمی‌شود. اگر می‌دانید کدام بخش مشکل‌ساز است، آن قسمت را هایلایت کرده و به چت اضافه کنید. این کار قطعاً به Cursor کمک می‌کند تا مشکل را راحت‌تر برطرف کند.

در اپلیکیشن Brush Tracker، من برای تنظیم نوتیفیکیشن‌ها با مشکل مواجه بودم. مشکل را تعریف کردم و از Cursor خواستم آن را برطرف کند. Cursor به من گفت که مشکل حل شده، اما همچنان وجود داشت. سپس، از طریق تغییرات کد متوجه شدم که مشکل از کجاست و آن بخش را به چت اضافه کردم.

Cursor در تلاش بعدی آن را برطرف کرد: «مشکل اینجاست که onTapGesture روی Picker اعمال شده، اما در SwiftUI، پیکرهای سگمنتی همیشه به ژست‌های ضربه (tap gestures) خوب پاسخ نمی‌دهند، زیرا مکانیزم مدیریت ژست داخلی خود را دارند. اصلاح‌گر onChange نیز تنها زمانی فعال می‌شود که انتخاب واقعاً تغییر کند، نه زمانی که روی همان مقدار قبلی ضربه زده شود.»

نکته دیگری که ارزش ذکر دارد، درصد «متن استفاده شده» (context used) در Cursor است. این ابزار به طور خودکار متن مرتبط را از کدبیس شما دریافت می‌کند، بنابراین لازم نیست به آن بگویید به کدام فایل‌ها نگاه کند. اما تاریخچه چت شما نیز در این متن گنجانده می‌شود و گاهی اوقات شامل مشکلات قدیمی یا کدهای نامرتبط است.

این اطلاعات اضافی می‌تواند مصرف توکن را افزایش دهد یا کارایی Cursor را کاهش دهد. وقتی درصد متن استفاده شده بالا می‌رود، من تاریخچه چت را پاک می‌کنم.

انتشار اپلیکیشن در اپ استور

پس از اینکه تست اپلیکیشن خود را با استفاده از شبیه‌ساز یا یک دستگاه فیزیکی (مثلاً آیفون خودتان) کامل کردید، زمان آن رسیده که اپلیکیشن خود را در اپ استور منتشر کنید تا دیگران بتوانند آن را ببینند (و امیدوارم استفاده کنند).

این فرآیند پیچیده‌ای نیست، اما جزئیات زیادی دارد که ممکن است زمان‌بر باشد، به خصوص اگر برای اولین بار این کار را انجام می‌دهید. من یک ویدیو در یوتیوب پیدا کردم که تمام مراحل را به وضوح و قدم به قدم توضیح می‌دهد.

پس از تکمیل تمام مراحل، اپلیکیشن خود را برای بازبینی ارسال کردم. پس از تأیید، ایمیلی از App Store Connect دریافت کردم که به من اطلاع می‌داد اپلیکیشن برای انتشار آماده است.

مایلم اشاره کنم که من هیچ‌گونه وابستگی با هیچ‌یک از ابزارهای هوش مصنوعی ذکر شده در این مقاله ندارم.

ممنون که مطالعه کردید! می‌توانید Brush Tracker را در اپ استور بررسی کنید. خوشحال می‌شوم اگر آن را امتحان کنید یا هرگونه بازخوردی داشتید، نظراتتان را بشنوم.

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

پیمایش به بالا