JavaScript köprü API'si
Capacitor eklentileri
Uygulamanın barındırdığı Capacitor eklentileri. Elle yazılmış bir sayfa bunlara window.Capacitor.Plugins.<Name> olarak ulaşır; yapay zekayla oluşturulmuş bir uygulama, her örneğin adını verdiği @/lib/appmintNative sarmalayıcısını kullanır.
Capacitor.ActionSheet Capacitor#
Capacitor.Plugins.ActionSheet — showActions({ title, message, options })
Örnek
Seçeneklerin bulunduğu yerel bir alt sayfa gösterir ve hangisine dokunulduğunu size bildirir (@capacitor/action-sheet 8.1.1).
Döndürür: Promise { index, canceled } - index dokunulan seçenektir; sayfa kapatıldığında canceled değeri true olur ve index listenin dışındadır (-1). Gerekenler: açılması gereken bir şey yok - her uygulama eklentiyi barındırır. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
Her seçenek, style 'DEFAULT' veya 'DESTRUCTIVE' ile birlikte { title, style? } biçimindedir 'CANCEL'.
var ActionSheet = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.ActionSheet;
async function photoMenu() {
if (!ActionSheet) return;
var opts = [
{ title: 'Share', style: 'DEFAULT' },
{ title: 'Edit', style: 'DEFAULT' },
{ title: 'Delete', style: 'DESTRUCTIVE' }
];
var r = await ActionSheet.showActions({ title: 'Photo', message: 'Choose an action', options: opts });
if (r.canceled || r.index < 0 || r.index >= opts.length) return; // dismissed
if (opts[r.index].title === 'Delete') deletePhoto();
}Yapay zekayla oluşturulmuş bir uygulamada Capacitor biçimli sarmalayıcı kapatıldığında { index: -1 } döndürür; kısa biçim actionSheet() şunu döndürür null:
import { ActionSheet, actionSheet } from '@/lib/appmintNative';
const { index } = await ActionSheet.showActions({
title: 'Photo',
options: [{ title: 'Share' }, { title: 'Delete', destructive: true }],
});
if (index === 1) deletePhoto();
const i = await actionSheet('Sort by', [{ title: 'Name' }, { title: 'Date' }]); // number | nullSıradan bir tarayıcıda da çalışan silme onayı:
async function confirmDelete(name) {
const AS = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.ActionSheet;
if (!AS) return window.confirm('Delete ' + name + '?');
const r = await AS.showActions({
title: 'Delete ' + name + '?',
options: [{ title: 'Delete', style: 'DESTRUCTIVE' }, { title: 'Keep it', style: 'CANCEL' }]
});
return !r.canceled && r.index === 0;
}Notlar: Dizin sınırını her zaman kontrol edin - hiçbir dizini gerçek bir seçim olarak ele almayın. Sarmalayıcının seçenek biçimi { title, destructive? }; destructive değerini eklentinin 'DESTRUCTIVE' stiline eşler.
Capacitor.App Capacitor#
Capacitor.Plugins.App — getInfo(), getState(), exitApp(), minimizeApp(), addListener(...)
Örnek
Uygulama kimliği ve yaşam döngüsü: ad, paket kimliği, sürüm, uygulamanın ön planda olup olmadığı ve duraklat/devam et olayları (@capacitor/app 8.1.0).
Döndürür: getInfo() → { name, id, build, version }; getState() → { isActive }; getLaunchUrl() → { url } veya hiçbir şey; getAppLanguage() → { value }; exitApp() / minimizeApp() → void. addListener() → Capacitor'ın kendi API'sinde olduğu gibi remove() içeren bir tutamağın Promise'i - await edin veya .then() zincirleyin; döndürülen değerin kendisinde de remove() vardır. Gerekenler: açılacak bir şey yok - her uygulama eklentiyi barındırır. window.Capacitor, uygulamanın kendisinin sunduğu sayfalarda (HTML, ZIP ve yapay zekâ ile oluşturulan uygulamalar) ve Web sitesi modu uygulamasında kendi sitenizde (alan adı ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla. Özelliği algılayın.
var App = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.App;
if (App) {
App.getInfo().then(function (i) {
document.getElementById('about').textContent = i.name + ' ' + i.version + ' (' + i.build + ')';
});
}Duraklat ve devam et - kullanıcı ayrılırken taslağı kaydedin, geri döndüğünde yenileyin:
if (App) {
App.addListener('appStateChange', function (s) {
if (!s.isActive) saveDraft(); // went to the background
else refreshInbox(); // back in front
});
App.addListener('pause', function () { console.log('paused'); });
App.addListener('resume', function () { console.log('resumed'); });
}Yapay zekayla oluşturulmuş bir uygulamada:
import { App } from '@/lib/appmintNative';
const info = await App.getInfo(); // { name, id, build, version }
App.exitApp(); // closes the app on AndroidNotlar: backButton olayı asla tetiklenmez: kabuk geri düğmesini elinde tutar (eklenti disableBackButtonHandler ile çalışır). Geri tuşunu AppMint.setBackHandler(fn) veya onBackGesture sarmalayıcısıyla yönetin. Derin bağlantılar için WebToApk.getLaunchUrl() / appmint:deep-link olayını kullanın (veya yapay zekayla oluşturulmuş uygulamalarda launchUrl() / onDeepLink()). minimizeApp() yalnızca Android içindir. Çıkış düğmesini asla ilerlemenin tek yolu yapmayın.
Capacitor.AppLauncher Capacitor#
Capacitor.Plugins.AppLauncher — canOpenUrl({ url }), openUrl({ url })
Örnek
Başka bir uygulamayı bağlantıyla açar (whatsapp://send?text=…, tel:, geo:, bir https bağlantısı) ve birinin bunu işleyip işleyemeyeceğini sorar (@capacitor/app-launcher 8.0.1).
Döndürür: canOpenUrl() → Promise { value: boolean }. openUrl() → Promise { completed: boolean } (hiçbir uygulama bağlantıyı almadıysa false). Gerekenler: açılması gereken bir şey yok - her uygulama eklentiyi barındırır. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var AL = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.AppLauncher;
async function chatOnWhatsApp(text) {
if (!AL) return;
var url = 'whatsapp://send?text=' + encodeURIComponent(text);
var can = await AL.canOpenUrl({ url: url });
if (!can.value) { alert('WhatsApp is not installed'); return; }
var r = await AL.openUrl({ url: url });
if (!r.completed) alert('Could not open WhatsApp');
}Yapay zekayla oluşturulmuş bir uygulamada:
import { appLauncher } from '@/lib/appmintNative';
if (await appLauncher.canOpen('tel:+15551234567')) await appLauncher.open('tel:+15551234567');Bir harita bağlantısını önce sormadan açın:
async function openMap(query) {
const AL = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.AppLauncher;
if (!AL) { window.open('https://maps.google.com/?q=' + encodeURIComponent(query)); return; }
const r = await AL.openUrl({ url: 'geo:0,0?q=' + encodeURIComponent(query) });
if (!r.completed) alert('No maps app could open this');
}Notlar: Android 11+ sürümünde bir uygulama yalnızca bildirdiği diğer uygulamaları "görebilir". Oluşturulan uygulamalar https, geo, google.navigation, tel, mailto, sms, whatsapp, intent ve upi bağlantılarını bildirir; bu nedenle canOpenUrl, uygulama yüklü olsa bile diğer şemalar (örneğin spotify:) için false yanıtını verir. openUrl yine de bunlar için çalışır - çağırın ve completed değerini kontrol edin. Android'de canOpenUrl bir paket adını da ('com.whatsapp') kabul eder; aynı görünürlük sınırı geçerlidir.
Capacitor.AppUpdate Capacitor#
Capacitor.Plugins.AppUpdate — getAppUpdateInfo(), performImmediateUpdate(), startFlexibleUpdate(), completeFlexibleUpdate(), openAppStore()
Örnek
Google Play'de uygulamanın daha yeni bir sürümünü arar ve Play'in uygulama içi güncellemesini başlatır. Paketlenmiş @capawesome/capacitor-app-update (template/plugins/app-update).
Döndürür: getAppUpdateInfo() → { currentVersionName, currentVersionCode, availableVersionCode, updateAvailability, updatePriority, immediateUpdateAllowed, flexibleUpdateAllowed, clientVersionStalenessDays?, installStatus } (sürüm kodları metindir; updateAvailability 2 = güncelleme var). performImmediateUpdate() / startFlexibleUpdate() → { code }: 0 tamam, 1 iptal edildi, 2 başarısız, 3 mevcut değil, 4 izin verilmiyor, 5 önce getAppUpdateInfo() çağırın. openAppStore() → void. Gerekenler: açılması gereken bir şey yok; uygulamanın Google Play'den yüklenmiş olması gerekir. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var AU = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.AppUpdate;
async function checkForUpdate() {
if (!AU) return;
try {
var info = await AU.getAppUpdateInfo(); // must come first
if (info.updateAvailability !== 2) return; // up to date
if (info.immediateUpdateAllowed) {
var r = await AU.performImmediateUpdate(); // Play's full-screen update
if (r.code === 1) console.log('user said not now');
} else {
await AU.openAppStore(); // the Play listing
}
} catch (e) {
console.log('Play update check failed:', e.message); // e.g. no Play services
}
}Esnek güncelleme - arka planda indirin, kullanıcı kabul edince yeniden başlatın:
async function flexibleUpdate() {
if (!AU) return;
var info = await AU.getAppUpdateInfo();
if (info.updateAvailability !== 2 || !info.flexibleUpdateAllowed) return;
await AU.addListener('onFlexibleUpdateStateChange', function (s) {
if (s.installStatus === 2) console.log(s.bytesDownloaded + ' / ' + s.totalBytesToDownload);
if (s.installStatus === 11) showRestartButton(); // 11 = DOWNLOADED
});
await AU.startFlexibleUpdate();
}
function restartNow() { if (AU) AU.completeFlexibleUpdate(); }Yapay zekayla oluşturulmuş bir uygulamada:
import { appUpdate } from '@/lib/appmintNative';
const info = await appUpdate.check(); // null on the web / without Play
if (info?.inPlace) await appUpdate.start(); // Android: immediate updateNotlar: "Güncelleme var" testi olarak yalnızca updateAvailability === 2 kullanın. Sarmalayıcının check() işlevi, Android'de asla eşit olmayan currentVersionName ile availableVersionCode değerlerini karşılaştırır; bu yüzden updateAvailable orada güvenilir değildir - bunun yerine inPlace değerini test edin. start(), kullanıcı iptal etse bile true değerini çözümler.
Capacitor.AppwrightDocScanner Capacitor#
Capacitor.Plugins.AppwrightDocScanner — scan({ pageLimit, pdf, quality }), isSupported()
Örnek
Google ML Kit belge tarayıcısını açar: kullanıcı bir veya daha fazla sayfanın fotoğrafını çeker (ya da içe aktarır), kenarlar bulunup düzeltilir ve sayfalar JPEG görüntüler olarak geri döner. Appwright'ın kendi eklentisi (AppwrightDocScannerPlugin.kt).
Döndürür: scan() → her zaman ÇÖZÜMLENEN Promise: başarıda { ok: true, pages: string[] (JPEG data URLs), pdfDataUrl?, pdfPath?, pdfError? }, kullanıcı geri çekilirse { ok: false, cancelled: true }, tarayıcı başlatılamazsa { ok: false, error }. isSupported() → { value: boolean } (Google Play services mevcut). Gerekenler: açılması gereken bir şey yok ve kamera izni gerekmez (tarayıcı, modelini ilk kullanımda indiren Play services içinde çalışır).
var Scanner = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.AppwrightDocScanner;
async function scanReceipt() {
if (!Scanner) { alert('Scanning is not available here'); return; }
var s = await Scanner.isSupported();
if (!s.value) { alert('This phone has no Google Play services'); return; }
var r = await Scanner.scan({ pageLimit: 1, pdf: false, quality: 0.8 });
if (r.cancelled) return;
if (!r.ok) { alert('Scanner error: ' + r.error); return; }
document.getElementById('preview').src = r.pages[0];
}pageLimit 0 = sınır yok. quality, JPEG için 0.1-1 aralığındadır. pdf: true ile tarayıcı bir PDF de yazar: pdfDataUrl, sayfanın indirebileceği, yükleyebileceği veya gösterebileceği bir data:application/pdf;base64,… URL'si olarak PDF'dir ve pdfPath onun uygulamanın önbellek klasöründeki kopyasıdır. PDF okunamadıysa sayfalar yine de döner ve pdfError nedenini söyler.
Yapay zekayla oluşturulmuş bir uygulamada (iptalde, hatada veya web'de null):
import { docScanner, can } from '@/lib/appmintNative';
if (can('docScanner') !== 'none') {
const res = await docScanner.scan({ pageLimit: 5, pdf: true });
if (res) setPages(res.pages); // res.pdfPath when pdf: true
}Birkaç sayfa tarayın ve PDF'yi sunun:
async function scanContract() {
const Scanner = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.AppwrightDocScanner;
if (!Scanner) return;
const r = await Scanner.scan({ pageLimit: 0, pdf: true, quality: 0.9 });
if (!r.ok) { if (!r.cancelled) alert('Scanner error: ' + r.error); return; }
if (r.pdfDataUrl) {
const a = document.createElement('a');
a.href = r.pdfDataUrl; a.download = 'contract.pdf'; a.click();
} else if (r.pdfError) console.warn('PDF not made:', r.pdfError);
console.log(r.pages.length + ' pages scanned');
}Notlar: Sayfalar tam data URL'leridir ve büyük olabilir - çoğunu localStorage içine kaydetmeden önce küçültün. pdfPath değil pdfDataUrl kullanın - bir cihaz dosya yolu, sayfanın yükleyebileceği bir URL değildir. Okunamayan bir sayfa atlanır; geri kalanlar yine döner.
Capacitor.AppwrightGallery Capacitor#
Capacitor.Plugins.AppwrightGallery — save({ source, fileName, album, kind })
Örnek
Bir fotoğrafı veya videoyu telefonun galerisine kaydeder (Pictures/<album> veya Movies/<album>). Uygulama kabuğunun kendi eklentisi (AppwrightGalleryPlugin.kt).
Döndürür: kaydedilen öğenin { uri } değerinin Promise'i. Bir code ile reddeder: bad-source, download-failed, permission-denied (Android 7-9, depolama reddedildi) veya failed. Gerekenler: açılması gereken bir şey yok; Android 10+ sürümünde izin gerekmez (Android 7-9 ilk seferde depolama ister).
const Gallery = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.AppwrightGallery;
async function saveCard(canvas) {
const dataUrl = canvas.toDataURL('image/png');
if (!Gallery) { const a = document.createElement('a'); a.href = dataUrl; a.download = 'card.png'; a.click(); return; }
try {
await Gallery.save({ source: dataUrl, fileName: 'birthday-card.png', album: 'Cards' });
toast('Saved to your gallery');
} catch (e) {
toast('Could not save: ' + e.message);
}
}Sunucunuzdaki bir videoyu kendi albümüne kaydedin ve her hata kodu için bir mesaj gösterin:
const Gallery = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.AppwrightGallery;
async function saveClip(url) {
if (!Gallery) { window.open(url, '_blank'); return; }
try {
await Gallery.save({ source: url, fileName: 'highlight.mp4', album: 'Highlights', kind: 'video' });
toast('Video saved to Movies/Highlights');
} catch (e) {
if (e.code === 'download-failed') toast('Could not download the video. Check your connection.');
else if (e.code === 'permission-denied') toast('Allow storage access to save videos.');
else toast('Could not save: ' + e.message);
}
}Kullanıcının düzenlediği bir fotoğrafı Blob olarak (örneğin canvas.toBlob çıktısı) önce data: URL'sine çevirerek kaydedin:
const Gallery = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.AppwrightGallery;
function blobToDataUrl(blob) {
return new Promise((resolve, reject) => {
const r = new FileReader();
r.onload = () => resolve(r.result);
r.onerror = () => reject(r.error);
r.readAsDataURL(blob);
});
}
async function saveEditedPhoto(canvas) {
if (!Gallery) return;
const blob = await new Promise((res) => canvas.toBlob(res, 'image/jpeg', 0.92));
const { uri } = await Gallery.save({ source: await blobToDataUrl(blob), fileName: 'edit-' + Date.now() + '.jpg', album: 'My Edits' });
console.log('saved as', uri);
}Notlar: source bir data: URL'si, bir http(s) URL'si veya bir content:///file:// URI'sidir; kind ('image'/'video') atlanırsa MIME türünden okunur. Yapay zekayla oluşturulmuş uygulamalar şuradaki saveToGallery() işlevini kullanır @/lib/appmintNative.
Capacitor.AppwrightHaptics Capacitor#
Capacitor.Plugins.AppwrightHaptics
Örnek
Zengin titreşim kalıpları için AppMint'in kendi eklentisi: her birinin kendi başlangıç zamanı, uzunluğu ve şiddeti olan bir vuruş listesi.
Döndürür: play({ events }), { ok: true } veya { ok: false, error } çözümler ('unsupported' = titreşim motoru yok, 'empty' = olay yok veya sistemin mesajı). Asla reddetmez. isSupported(), { value: true/false } çözümler. Gerekenler: açılması gereken bir şey yok - 4. Adımda (Erişim) Vibrate işaretli olsun ya da olmasın her uygulama titreşim iznini bildirir. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
Her olay { at, duration, intensity, sharpness } biçimindedir: at = ms cinsinden başlangıç, duration = ms cinsinden uzunluk (20'nin altı 30 ms'lik bir dokunuş olur), intensity = 0-1 (varsayılan 0.8). sharpness kabul edilir ama Android'de yok sayılır.
var AH = window.Capacitor && window.Capacitor.Plugins ? window.Capacitor.Plugins.AppwrightHaptics : null;
async function heartbeat() {
if (!AH) return false;
var r = await AH.play({
events: [
{ at: 0, intensity: 0.8 },
{ at: 140, intensity: 0.5 },
{ at: 700, intensity: 0.8 },
{ at: 840, intensity: 0.5 }
]
});
if (!r.ok) console.log('pattern not played:', r.error);
return r.ok;
}
document.getElementById('like').addEventListener('click', heartbeat);Titreşim motoru olmayan telefonlarda düğmeyi gizleyin:
(async function () {
var btn = document.getElementById('feel-it');
var ok = false;
if (AH) { try { ok = (await AH.isSupported()).value; } catch (e) {} }
btn.hidden = !ok;
})();Başarılı bir işlemde hızlı bir çift dokunuş titreşimi çalın ve çalınamadığında bildirin:
async function successBuzz() {
const AH = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.AppwrightHaptics;
if (!AH) return;
const r = await AH.play({ events: [{ at: 0, duration: 40, intensity: 1 }, { at: 120, duration: 40, intensity: 0.6 }] });
if (!r.ok && r.error === 'unsupported') console.log('this phone has no vibrator');
}Notlar: Şiddet yalnızca genlik denetimi olan telefonlarda çalışır; diğer telefonlar zamanlamayı tek bir sabit şiddette tutar. Sistem titreşimi reddederse play, { ok: false, error: '<the system message>' } yanıtını verir. Yapay zekayla oluşturulmuş uygulamalarda adlandırılmış kalıpları da içeren @/lib/appmintNative içindeki hapticPlay işlevini kullanın.
Capacitor.AppwrightLiveProgress Capacitor#
Capacitor.Plugins.AppwrightLiveProgress — start / update / end
Örnek
AppMint'in kendi Android eklentisi (JS adı AppwrightLiveProgress): sabit, sessiz ve canlı güncellenen bir durum bildirimi (ilerleme çubuğu, dönen gösterge veya çalışan saat) sağlar; dokunulduğunda bir rotayı açar.
Döndürür: start(opts) / update(opts) → Promise<{ ok: true, id }> veya hiçbir şey yayınlanmadan { ok: false, error } - bildirimlere izin verilmediğinde 'permission' (Android 13+: henüz izin verilmedi veya uygulama için kapatıldı), kullanıcı "Live status" kategorisini kapattığında 'channel_disabled'; end({ id }) → Promise<void>. Gerekenler: Android uygulaması ve bildirim izni (Android 13+). Web'de kullanılamaz.
Yapay zekayla oluşturulmuş bir uygulamada şuradaki liveProgress sarmalayıcısını kullanın @/lib/appmintNative:
import { liveProgress } from '@/lib/appmintNative';
await liveProgress.start({ id: 'order', title: 'Order #42', text: 'Being prepared', indeterminate: true });
await liveProgress.update({ id: 'order', title: 'Order #42', text: 'On the way', progress: 0.6, route: '/orders/42' });
await liveProgress.end('order');Elle yazılmış bir sayfada:
async function showDelivery(step, total) {
const P = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.AppwrightLiveProgress;
if (!P) return; // not in the Android app
if (window.Notification && Notification.permission !== 'granted') {
if (await Notification.requestPermission() !== 'granted') return;
}
const r = await P.update({
id: 'delivery',
title: 'Your delivery',
text: 'Stop ' + step + ' of ' + total,
progress: step / total, // 0–1; or indeterminate: true
route: '/track' // opened when the card is tapped
});
if (!r.ok) console.warn('live card not posted:', r.error);
}
async function deliveryDone() {
const P = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.AppwrightLiveProgress;
if (P) await P.end({ id: 'delivery' });
}Bir antrenman zamanlayıcısı: startedAt kartın kendi kendine yukarı saymasını sağlar, bu yüzden bir kez yayınlanır ve antrenman durduğunda sonlandırılır:
const Live = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.AppwrightLiveProgress;
let workoutStart = 0;
async function startWorkout(name) {
workoutStart = Date.now();
if (!Live) return;
const r = await Live.start({ id: 'workout', title: name, text: 'Workout in progress', startedAt: workoutStart, route: '/workout' });
if (!r.ok && r.error === 'channel_disabled') {
showHint('Turn on "Live status" in this app\'s notification settings to see the timer.');
}
}
async function stopWorkout() {
if (Live) await Live.end({ id: 'workout' });
saveWorkout({ durationMs: Date.now() - workoutStart });
}Seçenekler: id (varsayılan 'live'), title, text, progress (0-1, çubuk istemiyorsanız boş bırakın), indeterminate, startedAt (epoch ms, çalışan bir saat gösterir), route.
Notlar: start ve update aynı işi yapar (o kimliğe sahip kartı yayınlar veya değiştirir). Kart kaydırılarak kapatılamaz - her zaman end çağırın. Önce izin isteyin: Android 13+ sürümünde izin yoksa start, error: 'permission' yanıtını verir ve hiçbir şey yayınlamaz.
Capacitor.AppwrightSystemPalette Capacitor#
Capacitor.Plugins.AppwrightSystemPalette — get()
Örnek
Telefonun Material You renklerini (Android 12+ sürümünün duvar kağıdından oluşturduğu palet) döndürür, böylece uygulama sistem uygulamalarıyla uyum sağlayabilir. AppMint'in kendi eklentisi (AppwrightSystemPalettePlugin.kt).
Döndürür: Android 12'nin altında Promise { available: false }, aksi halde { available: true, accent1, accent2, accent3, neutral1, neutral2 } - her biri tondan onaltılık renge bir nesne, tonlar '0', '10', '50', '100' … '900', '1000' (örn. accent1['600'] === '#3F5F90'). Gerekenler: açılması gereken bir şey yok - her uygulama eklentiyi barındırır. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var Palette = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.AppwrightSystemPalette;
async function useWallpaperColours() {
if (!Palette) return;
var p = await Palette.get();
if (!p.available) return; // keep the app's own colours
var root = document.documentElement.style;
root.setProperty('--accent', p.accent1['600']);
root.setProperty('--surface', p.neutral1['50']);
}
useWallpaperColours();Yapay zekayla oluşturulmuş bir uygulamada:
import { systemPalette } from '@/lib/appmintNative';
const p = await systemPalette();
if (p.available && p.accent1) document.documentElement.style.setProperty('--accent', p.accent1['600']);Sistem temasına uyması için açık veya koyu tonları seçin ve kullanıcı duvar kağıdını değiştirip geri döndüğünde paleti yeniden okuyun:
var Palette = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.AppwrightSystemPalette;
var darkQuery = window.matchMedia('(prefers-color-scheme: dark)');
async function applyPalette() {
if (!Palette) return;
var p = await Palette.get();
if (!p.available) return;
var dark = darkQuery.matches;
var s = document.documentElement.style;
s.setProperty('--accent', p.accent1[dark ? '200' : '600']);
s.setProperty('--on-accent', p.accent1[dark ? '800' : '0']);
s.setProperty('--bg', p.neutral1[dark ? '900' : '10']);
s.setProperty('--text', p.neutral1[dark ? '100' : '900']);
}
darkQuery.addEventListener('change', applyPalette);
document.addEventListener('visibilitychange', function () {
if (document.visibilityState === 'visible') applyPalette();
});
applyPalette();Notlar: Palet renklerini uygulamadan önce metin kontrastını kontrol edin - bir duvar kağıdı tonunun arka planınızda iyi okunacağı garanti değildir. Tarayıcılar duvar kağıdı renklerini açığa çıkarmaz: web'de sarmalayıcı { available: false } yanıtını verir. Kullanıcı duvar kağıdını değiştirdiğinde renkler değişir; devam ettiğinde get() işlevini yeniden çağırın.
Capacitor.AppwrightWidget Capacitor#
Capacitor.Plugins.AppwrightWidget — set(card), clear(), placedCount(), requestPin()
Örnek
Uygulamanın ana ekran widget'ını doldurur: bir başlık, büyük bir değer, en fazla on iki satır, renkleriniz ve bir dokunma rotası içeren tek bir kart - AppMint.widget.set() öğesinin kabul ettiği kartın aynısı, tüm anahtarlar dahil. Kart telefona kaydedilir ve yeniden başlatmadan sonra bile gösterilir. AppMint'in kendi eklentisi (AppwrightWidgetPlugin.kt).
Döndürür: set({ title?, value?, caption?, lines?, route?, bg?, ink?, accent?, textSize?, align?, wrap?, … }) → Promise { ok: true, placed }, hatalı bir kart için nedeniyle reddedilir (placed = şu anda ana ekranda bulunan widget'lar). clear() → void. placedCount() → { value }. requestPin() → { value: boolean } (başlatıcının "widget ekle" sayfası açıldığında true). Gerekenler: açılması gereken bir şey yok - her uygulama widget'ı bildirir. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var Widget = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.AppwrightWidget;
async function updateWidget(tasks) {
if (!Widget) return;
await Widget.set({
title: 'Today',
value: tasks.length + ' tasks',
lines: tasks.slice(0, 6).map(function (t) { return t.title; }),
route: '/today', // opened when the widget is tapped
bg: '#0B0F1A', ink: '#FFFFFF', accent: '#22D3EE'
});
}Yerleştirmeyi önerin (yalnızca henüz hiçbiri yerleştirilmemişse):
async function offerWidget() {
if (!Widget) return;
var n = (await Widget.placedCount()).value;
if (n > 0) return;
var r = await Widget.requestPin();
if (!r.value) alert('Long-press the home screen, tap Widgets and pick this app.');
}Yapay zekayla oluşturulmuş bir uygulamada:
import { widget } from '@/lib/appmintNative';
await widget.set({ title: 'Today', value: '3 tasks', lines: ['Gym', 'Call mum'], route: '/today' });
if ((await widget.placedCount()) === 0) await widget.requestPin();Notlar: Renkler #RRGGBB, #AARRGGBB (önce alfa) veya rgba() biçimindedir; boş olanlar camgöbeği değerli koyu bir kart kullanır. Biçimlendirilmiş satırlar için AppMint.widget, caption, textSize, align, wrap ve font (uygulamanızda yol olarak verilen kendi .ttf/.otf dosyanız) bölümüne bakın. Dokunma, uygulamayı route adresinde derin bağlantı olarak açar (WebToApk.getLaunchUrl() veya appmint:deep-link olayıyla okuyun). Herhangi bir set() çağrısından önce widget "Nothing to show yet" der; clear() onu bu duruma döndürür. Tarayıcıda can('widget') 'none'.
Capacitor.Badge Capacitor#
Capacitor.Plugins.Badge — the launcher-icon count
Örnek
Uygulamanın başlatıcı simgesindeki sayıyı ayarlayan Badge eklentisi (capawesome).
Döndürür: Promise'ler: set({ count }), clear(), increase(), decrease() → void; get() → { count }; isSupported() → { isSupported }. Android eklentisinin izin yöntemleri yoktur. Gerekenler: Android'de hiçbir şey. Web'de kullanılamaz.
Yapay zekayla oluşturulmuş bir uygulamada şuradaki badge sarmalayıcısını kullanın @/lib/appmintNative:
import { badge } from '@/lib/appmintNative';
await badge.set(3);
await badge.clear();Elle yazılmış bir sayfada:
async function setUnread(count) {
const B = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Badge;
if (!B) return false; // not inside the app
try {
const s = await B.isSupported();
if (!s.isSupported) return false; // this launcher shows no badges
if (count > 0) await B.set({ count: count });
else await B.clear();
return true;
} catch (e) {
return false;
}
}
window.addEventListener('appmint:push', function () {
const inbox = JSON.parse(window.WebToApk ? WebToApk.getPushInbox() : '[]');
setUnread(inbox.filter(function (m) { return !m.read; }).length);
});Öğeler geldikçe ve okundukça yukarı ve aşağı sayın:
const B = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Badge;
async function onNewMessage() { if (B) await B.increase(); }
async function onMessageRead() { if (B) await B.decrease(); }
async function showCurrent() {
if (!B) return;
const { count } = await B.get();
console.log('badge shows', count);
}Notlar: Android'de görünüm başlatıcıya bağlıdır (bir sayı, bir nokta veya hiçbir şey). Uygulamadaki navigator.setAppBadge(n) aynı rozete yazar (yalnızca sayı gösterebilen başlatıcılarda bulunur).
Capacitor.BarcodeScanner Capacitor#
Capacitor.Plugins.BarcodeScanner — scan, startScan, readBarcodesFromImage, isSupported
Örnek
@capacitor-mlkit/barcode-scanning API'siyle QR ve barkod tarama - uygulama kabuğunun kendi eklentisi (BarcodeScannerPlugin.kt), AppMint.scanCode() ile aynı Google kod tarayıcısı üzerinde. Eski @capacitor-community/barcode-scanner çağrıları (startScan(), { hasContent, content } döndürür, checkPermission, prepare, hideBackground) bu adı paylaşır ve onlar da çalışır.
Döndürür: scan({ formats?, autoZoom? }) → { barcodes: [{ rawValue, displayValue, format, valueType, bytes?, cornerPoints?, urlBookmark?, wifi?, email?, phone?, sms?, geoPoint?, contactInfo?, calendarEvent?, driverLicense? }] } (kullanıcı geri çekilirse "scan canceled." reddeder); readBarcodesFromImage({ path, formats? }) → { barcodes }; isSupported() → { supported }; isGoogleBarcodeScannerModuleAvailable() → { available }; installGoogleBarcodeScannerModule() (ilerleme googleBarcodeScannerModuleInstallProgress olarak); checkPermissions() / requestPermissions() → { camera }; openSettings(). format, 'QR_CODE', 'EAN_13', 'CODE_128'… biçimindedir. Gerekenler: açılması gereken bir şey yok ve kamera izni gerekmez - Google'ın tarayıcısı kendi ekranını çizer (Play services onu ilk kullanımda indirir). window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
const Scanner = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.BarcodeScanner;
scanBtn.onclick = async () => {
if (!Scanner) return;
try {
const { barcodes } = await Scanner.scan({ formats: ['QR_CODE'] });
const code = barcodes[0];
if (code.valueType === 'URL') location.href = code.urlBookmark.url;
else resultBox.textContent = code.displayValue;
} catch (e) {
if (e.message !== 'scan canceled.') alert(e.message);
}
};ML Kit uygulamalarının zaten kullandığı dinleyici biçimiyle (startScan + barcodesScanned) ürün barkodundan fiyat sorgulama:
const Scanner = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.BarcodeScanner;
async function scanProduct() {
const listener = await Scanner.addListener('barcodesScanned', async ({ barcodes }) => {
await listener.remove();
await Scanner.stopScan();
const ean = barcodes[0].rawValue;
const res = await fetch('https://api.example.com/products/' + encodeURIComponent(ean));
priceBox.textContent = res.ok ? (await res.json()).price : 'Not found';
});
await Scanner.startScan({ formats: ['EAN_13', 'EAN_8', 'UPC_A', 'UPC_E'] });
}Kullanıcının zaten sahip olduğu bir fotoğraftan QR kodu okuyun:
const Scanner = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.BarcodeScanner;
const Camera = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Camera;
async function qrFromGallery() {
const photo = await Camera.getPhoto({ source: 'PHOTOS', resultType: 'uri', quality: 90 });
const { barcodes } = await Scanner.readBarcodesFromImage({ path: photo.path, formats: ['QR_CODE'] });
return barcodes.length ? barcodes[0].rawValue : null;
}Notlar: Upstream'in startScan() işlevi şeffaf bir sayfanın arkasında canlı kamera önizlemesi gösterir ve stopScan() çağrılana kadar taramaya devam eder; burada tarayıcı ekranını açar, ilk kod barcodeScanned / barcodesScanned tetikler ve oturum biter (topluluk kodu için çağrı sonra { hasContent, content, format } ile sonuçlanır; kapatılan tarayıcı { hasContent: false } ile sonuçlanır). Fener ve yakınlaştırma o önizlemeye aittir, bu yüzden isTorchAvailable() false döndürür ve fener/yakınlaştırma ayarlayıcıları reddeder - tarayıcı ekranının kendi el feneri düğmesi vardır. checkPermissions(), uygulamada hiç kamera izni yoksa granted döndürür (tarayıcı hiçbirine ihtiyaç duymaz); kamerayı da kullanan bir uygulama gerçek durumunu alır. Yapay zekâ ile oluşturulan uygulamalar scanCode() işlevini kullanır, kaynak: @/lib/appmintNative.
Capacitor.Browser Capacitor#
Capacitor.Plugins.Browser — open({ url, toolbarColor }), close(), addListener('browserFinished')
Örnek
Bir web sayfasını uygulama içi tarayıcı sekmesinde (Chrome Custom Tabs) açar; böylece kullanıcı şartları, belgeleri veya bir giriş sayfasını okur ve tek hareketle geri döner (@capacitor/browser 8.0.3).
Döndürür: open() / close() → Promise void. Olaylar: browserFinished (kullanıcı sekmeyi kapattı) ve browserPageLoaded. Gerekenler: hiçbir şey - her uygulama eklentiyi barındırır (Chrome gibi Custom Tabs destekleyen bir tarayıcının yüklü olması gerekir). window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var Browser = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Browser;
async function openTerms() {
if (!Browser) return;
var h = await Browser.addListener('browserFinished', function () {
console.log('user closed the terms');
h.remove();
});
await Browser.open({ url: 'https://example.com/terms', toolbarColor: '#0B0F1A' });
}Yapay zekayla oluşturulmuş bir uygulamada (web'de yeni bir sekme):
import { browser } from '@/lib/appmintNative';
const off = browser.onClosed(() => refreshAccount());
await browser.open('https://example.com/terms', { toolbarColor: '#0B0F1A' });
// call off() when you no longer careBir bağlantı açın ve bir girişten dönüş sayfaya ulaştığında sekmeyi kapatın:
var Browser = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Browser;
async function openHelp() {
if (!Browser) { window.open('https://example.com/help', '_blank'); return; }
try {
await Browser.open({ url: 'https://example.com/help' });
} catch (e) {
alert('Could not open the page: ' + e.message);
}
}
window.addEventListener('appmint:deep-link', function () {
if (Browser) Browser.close().catch(function () {});
});Notlar: url boş olmamalıdır. toolbarColor onaltılık bir renktir; geçersiz olan yok sayılır. close() bu eklenti sürümünde Android'de de çalışır (sekmenin ana etkinliğini bitirir) - bir giriş bağlantısı uygulamaya döndükten sonra yararlıdır. Sekme ayrı bir tarayıcıdır: uygulamanın çerezlerini veya paylaşmaz localStorage.
Capacitor.Calendar Capacitor#
Capacitor.Plugins.Calendar — createEvent, findEvents, deleteEvent, listCalendars, openCalendar
Örnek
Telefonun kendi takviminde (Android CalendarContract) etkinlik ekler, bulur ve siler; takvim uygulamasını bir tarihte açar. Paketlenmiş @capacitor/calendar (template/plugins/calendar).
Döndürür: createEvent() → { id }; findEvents() → { events: [{ id, title, location?, notes?, startDate, endDate, isAllDay, calendarId, calendarName?, attendees? }] }; listCalendars() → { calendars: [{ id, name, displayName?, isPrimary }] }; deleteEvent(), openCalendar() → void. Tarihler epoch milisaniyesidir. Gerekenler: derlerken 4. Adımda (Erişim) Calendar kutusunu işaretleyin. HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalarda, dosyalarınız tam olarak bu şekilde yazılmış bir Calendar.<method>( çağrısı veya sarmalayıcının calendar.createEvent( işlevini içerdiğinde derleme takvim iznini kendiliğinden ekler. Eklenti ilk kullanımda kullanıcıdan takvim erişimi ister. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var Calendar = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Calendar;
async function addDentist() {
if (!Calendar) return;
var start = new Date('2026-10-02T10:00:00').getTime();
try {
var r = await Calendar.createEvent({
title: 'Dentist', startDate: start, endDate: start + 60 * 60 * 1000,
location: 'Main St 5', notes: 'Bring the card', isAllDay: false,
firstReminderMinutes: 30
});
console.log('event id', r.id);
} catch (e) {
// e.code: OS-PLUG-CLDR-0020 permission denied, -0001 bad arguments
alert('Could not add the event: ' + e.message);
}
}Bu haftayı okuyun, birini silin, takvimi açın:
async function thisWeek() {
if (!Calendar) return;
var now = Date.now();
var found = await Calendar.findEvents({ startDate: now, endDate: now + 7 * 864e5 });
found.events.forEach(function (ev) { console.log(ev.title, new Date(ev.startDate)); });
if (found.events.length) await Calendar.deleteEvent({ id: found.events[0].id });
await Calendar.openCalendar({ date: now });
}Yapay zekayla oluşturulmuş bir uygulamada (web'de createEvent bir .ics dosyası indirir; okuma şunu döndürür []):
import { calendar } from '@/lib/appmintNative';
if ((await calendar.requestPermission()) === 'granted') {
const id = await calendar.createEvent({ title: 'Dentist', start: new Date('2026-10-02T10:00'), end: new Date('2026-10-02T11:00') });
const week = await calendar.listEvents({ from: Date.now(), to: Date.now() + 7 * 864e5 });
if (id) await calendar.deleteEvent(id);
await calendar.openCalendar(new Date());
}Notlar: Uygulamada takvim izni yoksa hiçbir pencere görünmez ve her etkinlik çağrısı reddedilir (izin eksik); hayır diyen kullanıcı OS-PLUG-CLDR-0020 alır. recurrence: { frequency: 'daily' | 'weekly' | 'monthly' | 'yearly', interval?, count?, endDate? } tekrarlayan bir etkinlik oluşturur. createEventInteractively({ title, startDate, endDate }) bunun yerine takvim uygulamasının kendi düzenleyicisini açar: kaydedilen etkinliğin { id } değerini çözümler ve kullanıcı düzenleyiciyi kaydetmeden kapatırsa OS-PLUG-CLDR-0006 ile reddeder (ikisini ayırt etmek için yazmanın yanı sıra okuma erişimi de gerekir). deleteEvent({ id, fromDate }), tekrarlayan bir etkinliği fromDate öncesinde bitirir ve önceki oluşumları korur. Sarmalayıcı hata fırlatmak yerine null / [] / false döndürür.
Capacitor.Camera Capacitor#
Capacitor.Plugins.Camera
Örnek
Uygulamaya yerleşik resmi Capacitor Camera eklentisi: kamerayla fotoğraf çekin veya galeriden fotoğraf seçin.
Döndürür: Promise'ler. getPhoto(opts) → { dataUrl | base64String | webPath, format, saved } (hangi alanın döneceği resultType değerine bağlıdır) ve kullanıcı iptal ederse REDDEDİLİR; pickImages(opts) → { photos: [{ webPath, format }] }; checkPermissions() / requestPermissions({ permissions }) → { camera, photos }. Gerekenler: 4. Adımda (Erişim) Camera kutusunu işaretleyin. HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalarda, dosyalarınız tam olarak bu şekilde yazılmış Camera.getPhoto(, videolu getUserMedia veya <input capture> içerdiğinde derleme kamera iznini kendiliğinden ekler. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
Bir fotoğraf çekin ve gösterin.
async function takePhoto() {
var Camera = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Camera;
if (!Camera) { showMessage('Open the app to use the camera.'); return; }
try {
var perm = await Camera.requestPermissions({ permissions: ['camera'] });
if (perm.camera !== 'granted') { showMessage('Camera permission was refused.'); return; }
var photo = await Camera.getPhoto({
source: 'CAMERA', // 'CAMERA' | 'PHOTOS' | 'PROMPT'
resultType: 'dataUrl', // 'dataUrl' | 'base64' | 'uri'
quality: 80,
direction: 'REAR', // 'REAR' | 'FRONT'
correctOrientation: true,
saveToGallery: false
});
document.getElementById('photo').src = photo.dataUrl;
} catch (err) {
// The user closed the camera (or no camera app). Nothing to do.
}
}Galeriden en fazla 5 fotoğraf seçin.
async function choosePhotos() {
var Camera = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Camera;
if (!Camera) return;
try {
var result = await Camera.pickImages({ quality: 80, limit: 5 });
result.photos.forEach(function (p) {
var img = document.createElement('img');
img.src = p.webPath; // a URL the page can load
document.getElementById('gallery').appendChild(img);
});
} catch (err) { /* cancelled */ }
}Yapay zekayla oluşturulmuş bir uygulamada web'de de çalışan sarmalayıcıyı kullanın (iptal edildiğinde hata fırlatmak yerine null döndürür):
import { camera } from '@/lib/appmintNative';
const photo = await camera.take({ source: 'camera' });Notlar: pickImages kamera izni gerektirmez. Kamera izni uygulamada yoksa (kutu kapalıydı ve derleme hiçbir kamera çağrısı bulmadı), kamera izni soru sorulmadan reddedilir. Bir <input type="file" accept="image/*" capture> da kamerayı açar. Kamera hassastır: bunu Play Data safety formunuzda beyan edin.
Capacitor.CapacitorBarcodeScanner Capacitor#
Capacitor.Plugins.CapacitorBarcodeScanner — scanBarcode({ hint })
Örnek
Resmi @capacitor/barcode-scanner API'siyle tek çağrıda QR / barkod tarama - uygulama kabuğunun kendi eklentisi (CapacitorBarcodeScannerPlugin.kt), AppMint.scanCode() ile aynı Google kod tarayıcısı üzerinde. npm paketi (CapacitorBarcodeScanner.scanBarcode({ hint: CapacitorBarcodeScannerTypeHint.ALL })) için yazılmış kod değişmeden çalışır.
Döndürür: scanBarcode({ hint, scanInstructions?, cameraDirection?, scanOrientation? }) → { ScanResult, format }. hint / format paketin sayılarıdır: 0 QR_CODE, 1 AZTEC, 2 CODABAR, 3 CODE_39, 4 CODE_93, 5 CODE_128, 6 DATA_MATRIX, 8 ITF, 9 EAN_13, 10 EAN_8, 11 PDF_417, 14 UPC_A, 15 UPC_E, 17 ALL. Kullanıcı tarayıcıyı kapatırsa OS-PLUG-BARC-0006 koduyla reddeder. Gerekenler: açılması gereken bir şey yok ve kamera izni gerekmez - Google'ın tarayıcısı kendi ekranını çizer (Play services onu ilk kullanımda indirir). window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
const Scanner = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.CapacitorBarcodeScanner;
ticketBtn.onclick = async () => {
if (!Scanner) return;
try {
const { ScanResult } = await Scanner.scanBarcode({ hint: 0 }); // QR codes only
const ok = await fetch('/api/tickets/check?code=' + encodeURIComponent(ScanResult)).then((r) => r.ok);
statusBox.textContent = ok ? 'Valid ticket' : 'Unknown ticket';
} catch (e) {
if (e.code !== 'OS-PLUG-BARC-0006') alert(e.message);
}
};Herhangi bir kodu kabul edin ve kullanıcıya hangi türden olduğunu söyleyin:
const Scanner = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.CapacitorBarcodeScanner;
const NAMES = { 0: 'QR code', 5: 'Code 128', 9: 'EAN-13', 10: 'EAN-8', 14: 'UPC-A', 15: 'UPC-E' };
async function scanAnything() {
const { ScanResult, format } = await Scanner.scanBarcode({ hint: 17 });
return (NAMES[format] || 'Barcode') + ': ' + ScanResult;
}Kullanıcının tarayıcıyı kapatması dışındaki bir reddi yönetin:
const Scanner = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.CapacitorBarcodeScanner;
async function scanProduct() {
if (!Scanner) { alert('Scanning works only inside the app'); return null; }
try {
const { ScanResult } = await Scanner.scanBarcode({ hint: 9 }); // EAN-13
return ScanResult;
} catch (e) {
if (e.code === 'OS-PLUG-BARC-0006') return null; // user closed the scanner
alert('Scan failed: ' + e.message);
return null;
}
}Notlar: scanInstructions, scanButton, cameraDirection ve scanOrientation yukarı akışın kendi kamera ekranını biçimlendirir ve Google'ın tarayıcısı üzerinde etkisi yoktur (her zaman arka kamera). MAXICODE, RSS_14, RSS_EXPANDED ve UPC_EAN_EXTENSION bir hint olarak desteklenmez (OS-PLUG-BARC-0008 ile reddeder); 17 (ALL) desteklenen her türü tarar. Yapay zekayla oluşturulmuş uygulamalar şuradaki scanCode() işlevini kullanır @/lib/appmintNative.
Capacitor.CapacitorCookies Capacitor#
Capacitor.Plugins.CapacitorCookies — getCookies / setCookie / deleteCookie / clearCookies / clearAllCookies
Örnek
Uygulamanın çerezlerini okur ve yazar; sayfanızın konuştuğu başka bir ana makinenin çerezleri de dahil (Capacitor core'un CapacitorCookies).
Döndürür: getCookies({ url? }) → { [name]: value } - bir url ile o URL'nin (ana makine ve yol) göndereceği çerezler; olmadan sayfanın kendi document.cookie değeri. http(s) olmayan bir url değerini reddeder. setCookie({ key, value, url?, path?, expires? }), deleteCookie({ key, url? }), clearCookies({ url? }), clearAllCookies() → Promise void; setCookie / deleteCookie dize bir key (ve value) olmadan reddeder ve hiçbir şey yazmaz. Gerekenler: açılacak bir şey yok - her uygulama eklentiyi barındırır. window.Capacitor, uygulamanın kendisinin sunduğu sayfalarda (HTML, ZIP ve yapay zekâ ile oluşturulan uygulamalar) ve Web sitesi modu uygulamasında kendi sitenizde (alan adı ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla. Özelliği algılayın.
var Cookies = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.CapacitorCookies;
// Read the session cookie your API host set — not the page's own cookies.
async function apiSession() {
if (!Cookies) return null; // not inside the app
var jar = await Cookies.getCookies({ url: 'https://api.example.com/' });
return jar.session || null;
}
// Remember a choice for the API host, for 30 days, on one path only.
async function rememberRegion(region) {
if (!Cookies) return;
var expires = new Date(Date.now() + 30 * 864e5).toUTCString();
await Cookies.setCookie({ url: 'https://api.example.com', path: '/v2', key: 'region', value: region, expires: expires });
}Çıkış yapın: o ana makinenin çerezlerini veya uygulamanın tuttuğu tüm çerezleri silin.
async function signOut(everything) {
if (!Cookies) return;
if (everything) await Cookies.clearAllCookies();
else await Cookies.clearCookies({ url: 'https://api.example.com' });
}Notlar: Bir path ile ayarlanan çerez, yalnızca o yolun altındaki bir url için döndürülür. Değerler okunurken URL kodundan çözülür. Çerezler uygulamanın gösterdiği her sayfa tarafından paylaşılır, bu yüzden yabancı bir sayfanın okuyabileceği bir çereze asla gizli bilgi koymayın - onlar Preferences içine veya uygulamanın güvenli depolamasına aittir.
Capacitor.CapacitorSQLite Capacitor#
Capacitor.Plugins.CapacitorSQLite — createConnection, open, execute, query, run, executeSet, close
Örnek
Telefonda @capacitor-community/sqlite API'siyle gerçek bir SQLite veritabanı. Android'in kendi SQLite'ı üzerinde çalışan @capacitor-community/sqlite (template/plugins/sqlite) paketlenmiştir. npm paketi (new SQLiteConnection(CapacitorSQLite)) için yazılmış kod değişmeden çalışır; elle yazılmış bir sayfa, aşağıdaki gibi eklenti nesnesini doğrudan çağırır.
Döndürür: createConnection({ database, version, encrypted: false, mode: 'no-encryption', readonly: false }), open({ database }), close({ database }), closeConnection({ database }) → void; execute({ database, statements }) → { changes: { changes } }; run({ database, statement, values }) → { changes: { changes, lastId } }; query({ database, statement, values }) → { values: [rows] }; executeSet({ database, set: [{ statement, values }] }) → { changes }; isDBExists({ database }) / isDBOpen({ database }) → { result }; beginTransaction, commitTransaction, rollbackTransaction, isTransactionActive({ database }); deleteDatabase({ database }); yedekler için exportToJson / importFromJson. Gerekenler: açılması gereken bir şey yok ve izin gerekmez. Veritabanı uygulamanın özel depolama alanında bulunur ve uygulama güncellemelerinden sonra korunur. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
const DB = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.CapacitorSQLite;
const database = 'notes';
async function openNotes() {
if (!DB) return false;
await DB.createConnection({ database, version: 1, encrypted: false, mode: 'no-encryption', readonly: false });
await DB.open({ database, readonly: false });
await DB.execute({ database, statements:
'CREATE TABLE IF NOT EXISTS notes (id INTEGER PRIMARY KEY AUTOINCREMENT, text TEXT NOT NULL, at INTEGER);' });
return true;
}
async function addNote(text) {
const r = await DB.run({ database, statement: 'INSERT INTO notes (text, at) VALUES (?, ?);', values: [text, Date.now()] });
return r.changes.lastId;
}
async function listNotes() {
const r = await DB.query({ database, statement: 'SELECT id, text, at FROM notes ORDER BY at DESC;', values: [] });
return r.values || [];
}Hepsinin birden başarılı olması gereken (veya hiçbirinin) birkaç yazma - şununla tek bir işlem executeSet:
const DB = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.CapacitorSQLite;
async function moveMoney(database, fromId, toId, amount) {
await DB.executeSet({ database, transaction: true, set: [
{ statement: 'UPDATE accounts SET balance = balance - ? WHERE id = ?;', values: [amount, fromId] },
{ statement: 'UPDATE accounts SET balance = balance + ? WHERE id = ?;', values: [amount, toId] },
{ statement: 'INSERT INTO ledger (from_id, to_id, amount, at) VALUES (?, ?, ?, ?);', values: [fromId, toId, amount, Date.now()] },
] });
}İki ekran aynı anda istese bile veritabanını uygulama başlangıcı başına yalnızca bir kez açın:
const DB = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.CapacitorSQLite;
let ready = null;
function db(database) {
if (!ready) ready = (async () => {
try {
await DB.createConnection({ database, version: 1, encrypted: false, mode: 'no-encryption', readonly: false });
} catch (e) {
if (!/already exists/i.test(e.message)) throw e; // a page reload keeps the native connection
}
if (!(await DB.isDBOpen({ database, readonly: false })).result) await DB.open({ database, readonly: false });
return database;
})();
return ready;
}Notlar: Uygulama SQLCipher olmadan derlenir, bu yüzden veritabanları şifrelenmez: encrypted: true, setEncryptionSecret, changeEncryptionSecret, isSecretStored ve diğer şifreleme çağrıları "Encryption is not available in this app" hatasıyla reddedilir. isInConfigEncryption(), false yanıtını verir. Diğer her şey (sorgular, bağlanmış değerler, işlemler, addUpgradeStatement ile sürümlü yükseltmeler, JSON içe/dışa aktarma) eklentinin kendi kodudur. Reddedilmeler SQLite hata metnini taşır.
Capacitor.Clipboard Capacitor#
Capacitor.Plugins.Clipboard — write(options), read()
Örnek
Metni (veya bir bağlantıyı) sistem panosuna kopyalar ve geri okur (@capacitor/clipboard 8.0.1).
Döndürür: write({ string?, url?, image?, label? }) → Promise void. read() → Promise { value, type } (type metin için 'text/plain'). Gerekenler: açılacak bir şey yok - her uygulama eklentiyi barındırır. window.Capacitor, uygulamanın kendisinin sunduğu sayfalarda (HTML, ZIP ve yapay zekâ ile oluşturulan uygulamalar) ve Web sitesi modu uygulamasında kendi sitenizde (alan adı ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla. Özelliği algılayın.
async function copyCode(code) {
var Clipboard = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Clipboard;
if (!Clipboard) { alert('Copy is not available here'); return; }
await Clipboard.write({ string: code, label: 'Invite code' });
}
async function pasteCode(input) {
var Clipboard = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Clipboard;
if (!Clipboard) return;
try {
var r = await Clipboard.read();
input.value = r.value;
} catch (e) {
// An EMPTY clipboard is a rejection: "There is no data on the clipboard".
if (/no data/i.test(e.message)) input.value = '';
else alert('Could not read the clipboard: ' + e.message);
}
}Yapay zekayla oluşturulmuş bir uygulamada Capacitor biçimli sarmalayıcı boş bir panoyu şuna çevirir '':
import { Clipboard } from '@/lib/appmintNative';
await Clipboard.write({ string: 'ABC-123' });
const { value } = await Clipboard.read(); // '' when the clipboard is emptyBir bağlantıyı kopyalayın ve dokunsal geri bildirimle onaylayın:
async function copyLink(url) {
var P = window.Capacitor && window.Capacitor.Plugins;
if (!P || !P.Clipboard) { alert('Copy is not available here'); return; }
await P.Clipboard.write({ url: url });
if (P.Haptics) P.Haptics.impact({ style: 'LIGHT' });
copiedToast.hidden = false;
}Notlar: write, string, url veya image (bir data URL) değerlerinden birine ihtiyaç duyar, aksi halde "No data provided" hatasıyla reddeder. Android 12+ okuma sırasında kendi "pasted from…" bildirimini gösterir - bu uygulama değil, işletim sistemidir. Sarmalayıcının write işlevi yalnızca şunu gönderir string || url.
Capacitor.Contacts Capacitor#
Capacitor.Plugins.Contacts — getContacts, getContact, pickContact, createContact, deleteContact
Örnek
@capacitor-community/contacts API'siyle telefonun rehberi. Paketlenmiş @capacitor-community/contacts (template/plugins/contacts). npm paketi için yazılmış kod değişmeden çalışır.
Döndürür: checkPermissions() / requestPermissions() → { contacts, contactsWrite } (her biri 'granted' | 'denied' | 'prompt'; contacts okuma, contactsWrite ekleme ve silme içindir); getContacts({ projection }) → { contacts: [ContactPayload] }; getContact({ contactId, projection }) ve pickContact({ projection }) → { contact }; createContact({ contact }) → { contactId }; deleteContact({ contactId }) → void. projection alanları seçer: { name, phones, emails, organization, birthday, note, urls, postalAddresses, image } (her biri true). Gerekenler: okumak için 4. Adımda (Erişim) Contacts kutusunu işaretleyin; eklemek veya silmek için ayrıca Edit Contacts kutusunu da işaretleyin. Kod Contacts.getContacts( / getContact( / pickContact( (okuma) veya Contacts.createContact( / deleteContact( (ikisi birden) çağırdığında HTML, ZIP ve AI-Studio derlemeleri bunları kendiliğinden işaretler. Eklenti ilk kullanımda kullanıcıya sorar; kutu işaretli değilse çağrı "Permission is required to access contacts." hatasıyla reddedilir - Contacts, SMS veya Call log kutularından hiçbiri işaretli olmayan bir uygulamada eklenti uygulamada hiç bulunmaz (Capacitor "not implemented" hatasıyla reddeder). window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
const Contacts = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Contacts;
async function friendsWithPhones() {
if (!Contacts) return [];
const { contacts } = await Contacts.requestPermissions();
if (contacts !== 'granted') return [];
const res = await Contacts.getContacts({ projection: { name: true, phones: true } });
return res.contacts
.filter((c) => c.phones && c.phones.length)
.map((c) => ({ id: c.contactId, name: (c.name && c.name.display) || '', phone: c.phones[0].number }));
}Kullanıcının sistem seçicisinden bir kişi seçmesine izin verin:
const Contacts = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Contacts;
inviteBtn.onclick = async () => {
if (!Contacts) return;
try {
const { contact } = await Contacts.pickContact({ projection: { name: true, phones: true, emails: true } });
inviteField.value = (contact.emails && contact.emails[0] && contact.emails[0].address) || '';
} catch (e) {
// The user closed the picker, or refused access.
}
};Uygulamadan bir kartviziti rehbere kaydedin:
const Contacts = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Contacts;
async function saveCard(card) {
const perm = await Contacts.requestPermissions();
if (perm.contactsWrite !== 'granted') return null;
const { contactId } = await Contacts.createContact({ contact: {
name: { given: card.first, family: card.last },
organization: { company: card.company, jobTitle: card.title },
phones: [{ type: 'work', label: 'work', number: card.phone }],
emails: [{ type: 'work', label: 'work', address: card.email }],
} });
return contactId;
}Notlar: Kullanıcı seçiciden vazgeçtiğinde pickContact(), CANCELLED koduyla reddedilir. Android contactId, name, phones, emails, organization, birthday, note, urls, postalAddresses ve image alanlarını yalnızca projeksiyon istediğinde doldurur - yalnızca gösterdiklerinizi isteyin. Kişileri okumak Google Play'de hassas bir izindir: nedenini listenin veri güvenliği formunda açıklayın. Yapay zekâ ile oluşturulan uygulamalar listContacts(), pickContact() ve addContact() işlevlerini kullanır, kaynak: @/lib/appmintNative.
Capacitor.Device Capacitor#
Capacitor.Plugins.Device
Örnek
Uygulamaya yerleşik resmi Capacitor Device eklentisi: telefon modeli, işletim sistemi sürümü, pil, sabit bir kimlik ve dil.
Döndürür: Promise'ler. getInfo() → { model, platform, operatingSystem, osVersion, androidSDKVersion, manufacturer, isVirtual, webViewVersion, … }; getId() → { identifier }; getBatteryInfo() → { batteryLevel (0–1), isCharging }; getLanguageCode() → { value }. Gerekenler: açılması gereken bir şey yok. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
Telefonu ve pili gösterin.
async function showDevice() {
var cap = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Device;
if (!cap) { document.getElementById('out').textContent = navigator.userAgent; return; }
try {
var info = await cap.getInfo();
var battery = await cap.getBatteryInfo();
document.getElementById('out').textContent =
info.manufacturer + ' ' + info.model + ' - ' + info.operatingSystem + ' ' + info.osVersion +
' - battery ' + Math.round(battery.batteryLevel * 100) + '%' + (battery.isCharging ? ' (charging)' : '');
} catch (err) {
document.getElementById('out').textContent = 'Could not read device info';
}
}Sabit bir kimlik ve dil.
async function helloServer() {
var cap = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Device;
if (!cap) return;
var id = (await cap.getId()).identifier;
var lang = (await cap.getLanguageCode()).value; // e.g. "en"
await fetch('https://api.example.com/hello?lang=' + encodeURIComponent(lang), {
method: 'POST', body: JSON.stringify({ device: id })
});
}Yapay zekayla oluşturulmuş bir uygulamada web'de de çalışan sarmalayıcıyı kullanın:
import { Device } from '@/lib/appmintNative';
const info = await Device.getInfo();Notlar: Android derleme kimliği, güvenlik yaması, ekran, bellek ve ağ için kabuğun WebToApk.getDeviceInfo() işlevi daha fazla ayrıntı verir. Eklenti kimlikleri donanım kimliği değildir; fabrika ayarlarına sıfırlamadan sonra değişebilirler.
Capacitor.Dialog Capacitor#
Capacitor.Plugins.Dialog — alert, confirm, prompt
Örnek
Gerçek bir Android sistem iletişim kutusu gösterir: bir mesaj, bir evet/hayır sorusu veya tek satırlık bir metin sorusu (@capacitor/dialog 8.0.1).
Döndürür: alert({ title?, message, buttonTitle? }) → Promise void. confirm({ title?, message, okButtonTitle?, cancelButtonTitle? }) → { value: boolean }. prompt({ title?, message, okButtonTitle?, cancelButtonTitle?, inputPlaceholder?, inputText? }) → { value: string, cancelled: boolean }. Gerekenler: açılması gereken bir şey yok - her uygulama eklentiyi barındırır. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var Dialog = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Dialog;
async function deleteNote(id) {
if (!Dialog) return;
var r = await Dialog.confirm({
title: 'Delete note?',
message: 'This cannot be undone.',
okButtonTitle: 'Delete',
cancelButtonTitle: 'Keep'
});
if (r.value) removeNote(id);
}Uyarı ve soru kutusu:
async function renameFlow() {
if (!Dialog) return;
await Dialog.alert({ title: 'Saved', message: 'Your changes are stored.', buttonTitle: 'OK' });
var p = await Dialog.prompt({ title: 'Rename', message: 'New name', inputText: 'Groceries', inputPlaceholder: 'List name' });
if (!p.cancelled && p.value.trim()) renameList(p.value.trim());
}Yapay zekayla oluşturulmuş bir uygulamada sarmalayıcı asla reddetmez: kapatma { value: false } / { cancelled: true } olur ve web'de tarayıcının kendi pencerelerini kullanır:
import { Dialog } from '@/lib/appmintNative';
const { value } = await Dialog.confirm({ title: 'Delete note?', message: 'This cannot be undone.' });
if (value) removeNote(id);Notlar: message zorunludur - olmadan eklenti "Please provide a message for the dialog" hatasıyla reddeder. İletişim kutuları modaldır; yalnızca engellemesi gereken kararlar için kullanın.
Capacitor.Filesystem Capacitor#
Capacitor.Plugins.Filesystem
Örnek
Standart Capacitor Filesystem eklentisi: uygulamanın KENDİ depolama alanındaki dosyaları okuyun ve yazın (kullanıcının seçtiği bir klasör değil - bunun için şunu kullanın WebToApkFS).
Döndürür: her yöntem bir Promise döndürür ve hata durumunda reddeder (örneğin var olmayan bir dosyayı okurken). readFile → { data }, writeFile → { uri }, readdir → { files: [{ name, type, size, mtime, uri }] }, mkdir / deleteFile → hiçbir şey. Gerekenler: açılması gereken bir şey yok; 'DATA' ve 'CACHE' izin gerektirmez.
Bir sayfada Directory / Encoding içe aktarmaları yoktur, bu yüzden düz metinleri verin: 'DATA' (özel uygulama dosyaları, kaldırılana kadar tutulur) veya 'CACHE' (sistem temizleyebilir) ve metin için 'utf8':
async function saveAndReadBack() {
var Fs = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Filesystem;
if (!Fs) { console.log('Filesystem plugin not available (not inside the app)'); return; }
try {
await Fs.mkdir({ path: 'notes', directory: 'DATA', recursive: true });
await Fs.writeFile({ path: 'notes/today.txt', data: 'Hello', directory: 'DATA', encoding: 'utf8', recursive: true });
var r = await Fs.readFile({ path: 'notes/today.txt', directory: 'DATA', encoding: 'utf8' });
console.log('text:', r.data);
var dir = await Fs.readdir({ path: 'notes', directory: 'DATA' });
dir.files.forEach(function (f) { console.log(f.type, f.name, f.size); }); // type: 'file' | 'directory'
await Fs.deleteFile({ path: 'notes/today.txt', directory: 'DATA' });
} catch (e) {
console.log('File error:', e.message); // e.g. the file does not exist
}
}İkili veriyi base64 olarak yazmak veya okumak için encoding değerini boş bırakın:
var Fs = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Filesystem;
var base64Data = btoa('raw bytes here'); // any base64 string, e.g. from a canvas or FileReader
if (Fs) {
Fs.writeFile({ path: 'blobs/data.bin', data: base64Data, directory: 'CACHE', recursive: true })
.then(function (w) { console.log('written to', w.uri); })
.catch(function (e) { console.log('write failed:', e.message); });
}Yapay zekayla oluşturulmuş uygulamalarda, bu eklentiyi kullanan @/lib/appmintNative sarmalayıcısı fileTransfer işlevidir (indirmeleri ve yüklemeleri şuraya hazırlar 'CACHE'):
import { fileTransfer } from '@/lib/appmintNative';
const r = await fileTransfer.download('https://example.com/report.pdf', 'report.pdf', {
onProgress: (p) => console.log(Math.round(p.fraction * 100) + '%'),
});
if (r.path) console.log('saved in the app at', r.path); // on the web the browser saves it insteadNotlar: window.Capacitor yalnızca uygulamanın içinde bulunur - her zaman özelliği algılayın. 'DATA' içindeki dosyalar uygulamaya özeldir ve kaldırıldığında silinir; dosyaları kullanıcının görebileceği bir yere koymak için WebToApkFS (kullanıcının izin verdiği bir klasör) veya bir indirme kullanın.
Capacitor.FileTransfer Capacitor#
Capacitor.Plugins.FileTransfer
Örnek
Resmi Capacitor File Transfer eklentisi: bir URL'yi telefondaki bir dosyaya indirir veya telefondaki bir dosyayı yerel olarak, ilerleme olaylarıyla yükler.
Döndürür: downloadFile({url, path, headers?, progress?}) → Promise<{path}>; uploadFile({url, path, fileKey?, mimeType?, method?, headers?, progress?}) → Promise<{bytesSent, responseCode, response, headers}>. İlerleme 'progress' dinleyici olayları olarak gelir {type, url, bytes, contentLength, lengthComputable}. Hatalar {message, code} ile reddedilir. Gerekenler: açılması gereken bir şey yok. window.Capacitor, uygulamanın kendi sunduğu sayfalarda ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - başka sitelerde asla bulunmaz. Özelliğin varlığını her zaman denetleyin.
Uygulamanın önbelleğine ilerleme göstererek indirin:
async function download(url, name, onPct) {
const P = window.Capacitor && window.Capacitor.Plugins;
if (!P || !P.FileTransfer || !P.Filesystem) return null; // not in the app
const target = await P.Filesystem.getUri({ path: name, directory: 'CACHE' });
const listener = await P.FileTransfer.addListener('progress', function (p) {
if (p.url === url && p.lengthComputable) onPct(Math.round(p.bytes / p.contentLength * 100));
});
try {
const r = await P.FileTransfer.downloadFile({ url: url, path: target.uri, progress: true });
return r.path;
} catch (e) {
alert('Download failed: ' + e.message);
return null;
} finally {
listener.remove();
}
}Telefonda zaten bulunan bir dosyayı yükleyin:
const P = window.Capacitor && window.Capacitor.Plugins;
if (P && P.FileTransfer) {
P.FileTransfer.uploadFile({
url: 'https://example.com/api/upload', path: localFileUri,
fileKey: 'file', mimeType: 'image/jpeg', headers: { Authorization: 'Bearer ' + token }
}).then(function (r) { console.log('server said', r.responseCode, r.response); })
.catch(function (e) { alert('Upload failed: ' + e.message); });
}Başarısız bir aktarımı koduyla bildirin:
async function safeDownload(url, target) {
const P = window.Capacitor && window.Capacitor.Plugins;
if (!P || !P.FileTransfer) { alert('Downloads need the app'); return null; }
try {
const r = await P.FileTransfer.downloadFile({ url: url, path: target });
return r.path;
} catch (e) {
console.log('transfer failed', e.code, e.message);
alert('Could not download the file.');
return null;
}
}Notlar: Yol bir dosya yolu veya file:// URI'si olmalıdır, Blob olmamalıdır - önce Blob'u Filesystem.writeFile ile önbelleğe yazın. Android 10 ve eski sürümlerde, genel depolamadaki bir yol depolama izni ister. Yapay zekayla oluşturulmuş uygulamalarda bunların hepsini yapan ve web'de de çalışan @/lib/appmintNative içindeki fileTransfer işlevini tercih edin.
Capacitor.FileViewer Capacitor#
Capacitor.Plugins.FileViewer
Örnek
Resmi Capacitor File Viewer eklentisi: bir belgeyi veya medya dosyasını telefonun görüntüleyici uygulamasında açar; bir web adresinden, yerel bir dosya yolundan veya uygulamaya paketlenmiş bir dosyadan.
Döndürür: her yöntem, hiçbir şey dosyayı açamadığında {message, code} ile reddeden bir Promise<void> döndürür. Gerekenler: açılması gereken bir şey yok. window.Capacitor, uygulamanın kendi sunduğu sayfalarda ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - başka sitelerde asla bulunmaz. Özelliğin varlığını her zaman denetleyin.
async function openPdf(url) {
const FV = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.FileViewer;
if (!FV) { window.open(url, '_blank'); return; } // a normal browser: open a tab
try {
await FV.openDocumentFromUrl({ url: url });
} catch (e) {
alert('No app on this phone can open this file.');
}
}Telefondaki bir dosya, örneğin şununla yazılmış olan Capacitor.Plugins.Filesystem:
async function openSaved(name) {
const P = window.Capacitor && window.Capacitor.Plugins;
if (!P || !P.FileViewer || !P.Filesystem) return;
const f = await P.Filesystem.getUri({ path: name, directory: 'CACHE' });
try {
await P.FileViewer.openDocumentFromLocalPath({ path: f.uri.replace(/^file:\/\//, '') });
} catch (e) {
alert('Cannot open ' + name + ': ' + e.message);
}
}openDocumentFromResources({path}) APK'nın kendi assets klasörüne paketlenmiş bir dosyayı açar. Aynı üç yöntem video ve ses için previewMediaContentFromUrl, previewMediaContentFromLocalPath ve previewMediaContentFromResources olarak da bulunur.
Bir dosyayı indirin ve geldiğinde açın:
async function downloadAndOpen(url, name) {
const P = window.Capacitor && window.Capacitor.Plugins;
if (!P || !P.FileTransfer || !P.Filesystem || !P.FileViewer) return;
const f = await P.Filesystem.getUri({ path: name, directory: 'CACHE' });
const r = await P.FileTransfer.downloadFile({ url: url, path: f.uri });
await P.FileViewer.openDocumentFromLocalPath({ path: r.path.replace(/^file:\/\//, '') });
}Notlar: Yapay zekayla oluşturulmuş uygulamalarda, doğru yöntemi seçen ve web'de de çalışan @/lib/appmintNative içindeki fileViewer.open(target) işlevini tercih edin. Yerel bir yol düz bir yoldur (yok file://).
Capacitor.Geolocation Capacitor#
Capacitor.Plugins.Geolocation
Örnek
Uygulamaya yerleşik resmi Capacitor Geolocation eklentisi: telefonun konumu bir kez veya sürekli güncellemelerle.
Döndürür: Promise'ler. getCurrentPosition(opts) → { timestamp, coords: { latitude, longitude, accuracy, altitude, speed, heading, … } }; watchPosition(opts, callback) → izleme kimliği (bir metin); clearWatch({ id }); checkPermissions() / requestPermissions() → { location, coarseLocation } ('granted' | 'denied' | 'prompt' | …). Gerekenler: 4. Adımda (Erişim) GPS ve/veya Location - HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalarda dosyalarınız getCurrentPosition veya watchPosition çağırdığında derleme bunları kendiliğinden de açar. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
Önce sorarak bir kez konum alın.
async function whereAmI() {
var geo = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Geolocation;
if (!geo) { showMessage('Open the app to use location.'); return; }
try {
var perm = await geo.checkPermissions();
if (perm.location !== 'granted' && perm.coarseLocation !== 'granted') {
perm = await geo.requestPermissions();
if (perm.location !== 'granted' && perm.coarseLocation !== 'granted') {
showMessage('Location is off for this app.');
return;
}
}
var pos = await geo.getCurrentPosition({ enableHighAccuracy: true, timeout: 15000 });
showMessage(pos.coords.latitude.toFixed(5) + ', ' + pos.coords.longitude.toFixed(5));
} catch (err) {
showMessage('No location: ' + err.message); // location off in settings, timeout, …
}
}Sürekli güncellemeler. Geri çağırma şunu alır (position, error).
var watchId = null;
async function startTracking() {
var geo = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Geolocation;
if (!geo) return;
watchId = await geo.watchPosition({ enableHighAccuracy: true }, function (pos, err) {
if (err || !pos) return;
addPointToMap(pos.coords.latitude, pos.coords.longitude);
});
}
async function stopTracking() {
var geo = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Geolocation;
if (geo && watchId) { await geo.clearWatch({ id: watchId }); watchId = null; }
}Yapay zekayla oluşturulmuş bir uygulamada web'de de çalışan sarmalayıcıyı kullanın:
import { Geolocation } from '@/lib/appmintNative';
const pos = await Geolocation.getCurrentPosition({ enableHighAccuracy: true });Notlar: Düz navigator.geolocation uygulamada da çalışır. Derleme sırasında konum anahtarları kapalıysa izin, soru sorulmadan reddedilir. Android 12+ sürümünde kullanıcı yalnızca yaklaşık konuma izin verebilir (coarseLocation verilmiş). Konum kişisel veridir: bunu Play Data safety formunuzda beyan edin.
Capacitor.Haptics Capacitor#
Capacitor.Plugins.Haptics
Örnek
Uygulamaya yerleşik resmi Capacitor Haptics eklentisi (@capacitor/haptics): hafif/orta/ağır dokunuşlar, başarı/uyarı/hata geri bildirimi, seçim tıkları ve düz titreşim.
Döndürür: her yöntem hiçbir şeyle sonuçlanan bir Promise döndürür. Gerekenler: açılacak bir şey yok - Adım 4'te (Erişim) Titreşim işaretli olsun ya da olmasın her uygulama titreşim iznini bildirir. window.Capacitor, uygulamanın kendisinin sunduğu sayfalarda (HTML, ZIP ve yapay zekâ ile oluşturulan uygulamalar) ve Web sitesi modu uygulamasında kendi sitenizde (alan adı ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla. Özelliği algılayın.
function haptics() {
return window.Capacitor && window.Capacitor.Plugins ? window.Capacitor.Plugins.Haptics : null;
}
async function tap(style) { // 'LIGHT' | 'MEDIUM' | 'HEAVY'
var h = haptics();
if (!h) return;
try { await h.impact({ style: style }); } catch (e) { console.log('haptics failed', e); }
}
async function result(type) { // 'SUCCESS' | 'WARNING' | 'ERROR'
var h = haptics();
if (h) { try { await h.notification({ type: type }); } catch (e) {} }
}
document.getElementById('add').addEventListener('click', function () { tap('LIGHT'); });
document.getElementById('pay').addEventListener('click', function () { result('SUCCESS'); });Bir seçici veya kaydırıcı için seçim tıkları ve düz bir titreşim:
var h = window.Capacitor && window.Capacitor.Plugins ? window.Capacitor.Plugins.Haptics : null;
var wheel = document.getElementById('wheel');
wheel.addEventListener('pointerdown', function () { if (h) h.selectionStart(); });
wheel.addEventListener('change', function () { if (h) h.selectionChanged(); });
wheel.addEventListener('pointerup', function () { if (h) h.selectionEnd(); });
document.getElementById('buzz').addEventListener('click', function () {
if (h) h.vibrate({ duration: 300 }); // milliseconds
});Bir hatada titreşim verin ve bunu görünür bir mesajla eşleştirin:
var h = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Haptics;
function rejectInput(field) {
field.classList.add('invalid');
if (h) h.notification({ type: 'ERROR' }).catch(function () {});
}Notlar: Metinler büyük harflidir ('HEAVY', 'heavy' değil). Yapay zekayla oluşturulmuş uygulamalarda import { Haptics } from '@/lib/appmintNative' aynı adları verir. Vuruş başına şiddetin ayarlandığı özel ritimler için şunu kullanın Capacitor.Plugins.AppwrightHaptics.
Capacitor.InAppReview Capacitor#
Capacitor.Plugins.InAppReview — requestReview()
Örnek
Google Play'den uygulama içinde kendi "bu uygulamayı puanla" ekranını göstermesini ister. Paketlenmiş @capacitor-community/in-app-review (template/plugins/in-app-review).
Döndürür: Promise void - Play'in akışı bittiğinde çözümlenir ve Play sayfanın gösterilip gösterilmediğini veya kullanıcının ne yaptığını asla söylemez. Play akışı başlatamazsa reddeder. Gerekenler: açılması gereken bir şey yok; sayfanın görünmesi için uygulamanın Google Play'den yüklenmiş olması gerekir. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var Review = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.InAppReview;
async function afterThirdOrder() {
if (!Review) return;
try {
await Review.requestReview();
} catch (e) {
console.log('review flow not available:', e.message);
}
// continue the app flow either way — you cannot know if the user rated
}Yapay zekayla oluşturulmuş bir uygulamada:
import { requestReview } from '@/lib/appmintNative';
// after a success moment, not on launch
const asked = await requestReview(); // false where nothing could be asked (web)Bir başarı anından sonra bir kez sorun ve sorduğunuzu hatırlayın:
var Review = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.InAppReview;
async function maybeAskForReview() {
if (!Review || localStorage.getItem('review_asked')) return;
localStorage.setItem('review_asked', '1');
try { await Review.requestReview(); } catch (e) { console.log('review not shown:', e.message); }
}Notlar: Play, sayfanın ne sıklıkta görüneceğini sınırlar ve her çağrı için göstermez - ödülü asla ona bağlamayın ve "Bizi puanlayın" düğmesinden açılmasını bekleyerek asla istemeyin (bunun için mağaza sayfasını açın). Başlangıçta değil, bir başarı anından sonra isteyin. Yandan yüklenmiş veya hata ayıklama yüklemesi genellikle hiçbir şey göstermez.
Capacitor.KeepAwake Capacitor#
Capacitor.Plugins.KeepAwake — keepAwake(), allowSleep(), isKeptAwake(), isSupported()
Örnek
Bir şey görünür kalmak zorundayken - bir tarif, bir rota, bir QR kodu, bir zamanlayıcı - ekranın kararmasını ve kilitlenmesini engeller. Paketlenmiş @capacitor-community/keep-awake (template/plugins/keep-awake).
Döndürür: keepAwake() / allowSleep() → Promise void. isKeptAwake() → { isKeptAwake: boolean }. isSupported() → { isSupported: true }. Gerekenler: hiçbir şey - her uygulama eklentiyi barındırır; izin gerekmez. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var KA = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.KeepAwake;
async function startCooking() {
if (KA) await KA.keepAwake();
showSteps();
}
async function stopCooking() {
if (KA) await KA.allowSleep(); // always release when the view closes
}
if (KA) KA.isKeptAwake().then(function (r) { console.log('awake?', r.isKeptAwake); });Yapay zekayla oluşturulmuş bir uygulamada (web'de Screen Wake Lock API):
import { keepAwake } from '@/lib/appmintNative';
useEffect(() => {
void keepAwake(true);
return () => { void keepAwake(false); };
}, []);Ekranı yalnızca bir zamanlayıcı çalışırken açık tutun:
var KA = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.KeepAwake;
async function runTimer(seconds) {
if (KA) await KA.keepAwake();
await new Promise(function (done) { setTimeout(done, seconds * 1000); });
if (KA) await KA.allowSleep();
alert('Time is up');
}Notlar: Bayrak uygulama penceresine aittir: yalnızca uygulama ön plandayken çalışır ve allowSleep() çağrılana kadar açık kalır - ekrandan her çıkışta serbest bırakın. keepAwake(), hiçbir şey ekranı açık tutamadığında false döndürür.
Capacitor.Keyboard Capacitor#
Capacitor.Plugins.Keyboard — show(), hide(), addListener('keyboardDidShow' | ...)
Örnek
Yazılım klavyesini açar veya kapatır ve sayfaya ne zaman göründüğünü ve ne kadar yüksek olduğunu bildirir (@capacitor/keyboard 8.0.5).
Döndürür: show() / hide() → Promise void. addListener(event, fn) → Capacitor'ın kendi API'sindeki gibi remove() içeren bir tutamacın Promise'i - await ile bekleyin veya .then() zincirleyin; dönen değerin kendisinde de remove() vardır; gösterme olayları { keyboardHeight } değerini CSS pikseli olarak iletir. Olaylar: keyboardWillShow, keyboardDidShow, keyboardWillHide, keyboardDidHide. Gerekenler: açılması gereken bir şey yok - her uygulama eklentiyi barındırır. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var Keyboard = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Keyboard;
if (Keyboard) {
Keyboard.addListener('keyboardDidShow', function (info) {
console.log('keyboard height', info.keyboardHeight);
document.body.classList.add('typing'); // e.g. hide the bottom tab bar
});
Keyboard.addListener('keyboardDidHide', function () {
document.body.classList.remove('typing');
});
}
function onSend() {
if (Keyboard) Keyboard.hide().catch(function () {}); // rejects if no field is focused
}Yapay zekayla oluşturulmuş bir uygulamada yerleşim için onKeyboard() kullanın - yeniden boyutlandırılan sayfanın zaten boşalttığı kısım dışındaki klavye bölümünü bildirir - ve kapatmak için hideKeyboard() kullanın:
import { onKeyboard, hideKeyboard, Keyboard } from '@/lib/appmintNative';
const off = onKeyboard((px) => { composer.style.paddingBottom = `${px}px`; }); // call off() on unmount
hideKeyboard();
const h = Keyboard.addListener('keyboardWillShow', ({ keyboardHeight }) => console.log(keyboardHeight));
h.remove();Bir düğmeye dokunulduktan sonra bir alan için klavyeyi gösterin:
var Keyboard = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Keyboard;
searchBtn.addEventListener('click', function () {
searchInput.focus();
if (Keyboard) Keyboard.show().catch(function () {});
});Notlar: Kabuk sayfayı klavye için zaten yeniden boyutlandırır, bu yüzden tam keyboardHeight değerini dolgu olarak EKLEMEYİN - alt çubuk zaten tuşların üstündedir. setAccessoryBarVisible, setStyle, setResizeMode ve setScroll Android'de uygulanmamıştır - çağırmayın. Hiçbir şeyde odak yokken hide() "Can't close keyboard, not currently focused" hatasıyla reddeder.
Capacitor.LocalNotifications Capacitor#
Capacitor.Plugins.LocalNotifications — schedule, cancel, getPending, requestPermissions, events
Örnek
Uygulamanın kendisinin yayınladığı bildirimler - hemen veya belirli bir zamanda - resmi @capacitor/local-notifications API'siyle (com.capacitorjs:local-notifications). npm paketi için yazılmış kod değişmeden çalışır.
Döndürür: requestPermissions() / checkPermissions() → { display: 'granted' | 'denied' | 'prompt' }; schedule({ notifications: [{ id, title, body, schedule?: { at | on | every }, extra?, actionTypeId?, channelId? }] }) → { notifications: [{ id }] }; getPending() → { notifications }; cancel({ notifications: [{ id }] }); registerActionTypes({ types }); createChannel / listChannels / deleteChannel; checkExactNotificationSetting() → { exact_alarm }. Olaylar: localNotificationReceived, localNotificationActionPerformed (bildirimin kendisine dokunulduğunda actionId değeri 'tap' olur). Gerekenler: 4. Adımda (Erişim) Notifications kutusunu işaretleyin - bu olmadan eklenti uygulamada bulunmaz ve her çağrı "not implemented" hatasıyla reddedilir. Zamanlanmış bildirimler için ayrıca ⏰ Reminders kutusunu işaretleyin (tam zamanlama ve yeniden başlatmadan sonra da çalışma). Kod @capacitor/local-notifications içe aktarıp LocalNotifications.schedule( çağırdığında HTML, ZIP ve AI-Studio derlemeleri ikisini de kendiliğinden işaretler. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
const LN = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.LocalNotifications;
async function remindIn(minutes, text) {
if (!LN) return false;
const { display } = await LN.requestPermissions();
if (display !== 'granted') return false;
await LN.schedule({ notifications: [{
id: Date.now() % 2147483647,
title: 'Reminder',
body: text,
schedule: { at: new Date(Date.now() + minutes * 60000), allowWhileIdle: true },
extra: { screen: 'tasks' },
}] });
return true;
}Kullanıcı bir bildirime dokunduğunda doğru ekranı açın - dokunma uygulamayı başlattığında da, çünkü olay dinleyiciyi bekler:
const LN = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.LocalNotifications;
if (LN) {
LN.addListener('localNotificationActionPerformed', ({ actionId, notification }) => {
if (actionId === 'tap' && notification.extra && notification.extra.screen) {
location.hash = '#/' + notification.extra.screen;
}
});
}Tamam / Ertele düğmeleriyle günlük bir alışkanlık hatırlatıcısı:
const LN = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.LocalNotifications;
async function dailyWaterReminder() {
await LN.registerActionTypes({ types: [{ id: 'water', actions: [
{ id: 'done', title: 'Done' },
{ id: 'snooze', title: 'In 30 min' },
] }] });
await LN.schedule({ notifications: [{
id: 42, title: 'Drink water', body: 'Time for a glass of water.',
actionTypeId: 'water', schedule: { on: { hour: 10, minute: 0 }, repeats: true },
}] });
LN.addListener('localNotificationActionPerformed', ({ actionId }) => {
if (actionId === 'snooze') {
LN.schedule({ notifications: [{ id: 43, title: 'Drink water', body: 'Snoozed reminder.',
schedule: { at: new Date(Date.now() + 30 * 60000) } }] });
}
});
}Notlar: Android 12+ sürümünde zamanlanmış bir bildirim tam alarm iznini ister: ilk schedule() sistemin "Alarms & reminders" sayfasını açabilir; kullanıcı bunu kapalı bırakırsa bildirim yine de biraz geç tetiklenir (sonuç bir warning taşır). Eklentinin bildirimleri kendi "Default" kanalını kullanır; bu, uygulamanın diğer bildirimlerinden ayrıdır. Web dosyalarından bir sound desteklenmez (Android kanalın varsayılan sesini çalar). Uygulamada PIN varsa dokunmalar sayfaya kilit ekranı üzerinden ulaşır. Yapay zekayla oluşturulmuş uygulamalar, uygulamanın kendi bildirim yığını üzerinden yayınlayan @/lib/appmintNative içindeki notify() / LocalNotifications.schedule işlevlerini kullanır.
Capacitor.Network Capacitor#
Capacitor.Plugins.Network — getStatus(), addListener('networkStatusChange')
Örnek
Sayfaya telefonun çevrimiçi olup olmadığını, hangi tür bağlantıda olduğunu ve bunun ne zaman değiştiğini bildirir (@capacitor/network 8.0.1).
Döndürür: getStatus() → Promise { connected: boolean, connectionType: 'wifi' | 'cellular' | 'none' | 'unknown' }. networkStatusChange olayı aynı biçimi iletir. Gerekenler: açılması gereken bir şey yok - her uygulama eklentiyi barındırır. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var Network = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Network;
function showBanner(s) {
document.getElementById('offline').hidden = s.connected;
}
if (Network) {
Network.getStatus().then(showBanner);
Network.addListener('networkStatusChange', function (s) {
showBanner(s);
if (s.connected) retryQueuedWrites();
if (s.connectionType === 'cellular') console.log('on mobile data');
});
}Yapay zekayla oluşturulmuş bir uygulamada:
import { Network, networkStatus, onNetworkChange } from '@/lib/appmintNative';
const { connected, connectionType } = await Network.getStatus();
const now = networkStatus(); // sync: { connected, type }
const off = onNetworkChange((s) => setOnline(s.connected)); // call off() on unmountMobil veride büyük bir yüklemeyi duraklatın:
var Network = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Network;
async function canUploadVideo() {
if (!Network) return navigator.onLine;
var s = await Network.getStatus();
if (!s.connected) return false;
return s.connectionType === 'wifi' || confirm('Upload over mobile data?');
}Notlar: connected, telefonun bir ağı olduğu anlamına gelir; sunucunuzun yanıt verdiği anlamına gelmez - başarısız istekleri yine de yönetin. Sarmalayıcının Network.getStatus() ve networkStatus() işlevleri eklentiyi değil navigator.onLine / navigator.connection değerlerini okur, bu yüzden türleri 'unknown' veya '4g' gibi bir hız sınıfı olabilir; onNetworkChange() ise uygulamada eklentinin olayını kullanır.
Capacitor.Preferences Capacitor#
Capacitor.Plugins.Preferences — get / set / remove / keys / clear
Örnek
Metinler için küçük bir yerel anahtar-değer deposu (Android SharedPreferences) (@capacitor/preferences 8.0.1).
Döndürür: set({ key, value }), remove({ key }), clear() → Promise void; get({ key }) → { value } (anahtar yoksa null); keys() → { keys: string[] }. Gerekenler: açılması gereken bir şey yok - her uygulama eklentiyi barındırır. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var Prefs = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Preferences;
async function saveTheme(name) {
if (!Prefs) return false; // not inside the app
await Prefs.set({ key: 'theme', value: name });
return true;
}
async function loadTheme() {
if (!Prefs) return null;
var r = await Prefs.get({ key: 'theme' });
return r.value; // null if never saved
}Nesneler önce metne çevrilmelidir:
async function saveUser() {
if (!Prefs) return;
await Prefs.set({ key: 'user', value: JSON.stringify({ id: 7, name: 'Asha' }) });
var u = JSON.parse((await Prefs.get({ key: 'user' })).value || 'null');
var all = (await Prefs.keys()).keys;
await Prefs.remove({ key: 'user' });
}Bir ayarlar ekranından kayıtlı anahtarları listeleyin ve temizleyin:
async function resetSettings() {
if (!Prefs) return;
var k = (await Prefs.keys()).keys;
console.log('clearing', k.length, 'saved values');
await Prefs.clear();
}Notlar: @/lib/appmintNative için BİLEREK Preferences sarmalayıcısı YOKTUR: localStorage uygulamada zaten gerçek ve kalıcıdır; ikinci bir depo bir uygulamanın verisini iki yere böler. Yapay zekayla oluşturulmuş uygulamalar localStorage (veya veri çalışma zamanı) kullanmaya devam etmelidir. Preferences'ı elle yazılmış bir sayfada yalnızca tüm ayarlarınızın orada olmasını istiyorsanız kullanın ve her değer için tek bir depo seçin. configure({ group }) depo adını değiştirir (varsayılan CapacitorStorage).
Capacitor.PrivacyScreen Capacitor#
Capacitor.Plugins.PrivacyScreen — enable(), disable(), isEnabled()
Örnek
Resmi @capacitor/privacy-screen eklentisi: ekran görüntülerini ve ekran kaydını engeller ve uygulamanın içeriğini son uygulamalar görünümünde gizler. Onu çağıran içe aktarılmış Capacitor projeleri çalışsın diye yerleşik gelir.
Döndürür: enable({android}) → {success}; disable() → {success}; isEnabled() → {enabled}. Gerekenler: açılması gereken bir şey yok.
const Privacy = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.PrivacyScreen;
async function openVault() {
if (Privacy) await Privacy.enable({ android: { privacyModeOnActivityHidden: 'dim' } });
showVault();
}
async function closeVault() {
if (Privacy) await Privacy.disable();
}Değiştirmeden önce mevcut durumu kontrol edin:
async function toggleProtection() {
if (!Privacy) return;
var s = await Privacy.isEnabled();
if (s.enabled) await Privacy.disable();
else await Privacy.enable();
}Ekranı yalnızca hassas bir görünüm açıkken koruyun:
async function showCardNumber() {
if (Privacy) await Privacy.enable({ android: { privacyModeOnActivityHidden: 'splash' } });
cardBox.hidden = false;
}
async function hideCardNumber() {
cardBox.hidden = true;
if (Privacy) await Privacy.disable();
}Notlar: privacyModeOnActivityHidden: 'none', 'dim' veya 'splash'. Uygulamanın kendisi için yazılan kod, sayfayı izleyen (uygulama sayfadan ayrıldığında serbest bırakılan) @/lib/appmintNative içindeki WebToApk.setSecureScreen(true) / privacyScreen.enable() işlevlerini kullanmalıdır; ikisini karıştırırsanız son çağrı geçerli olur.
Capacitor.PushNotifications Capacitor#
Capacitor.Plugins.PushNotifications — register, requestPermissions, registration, pushNotificationReceived
Örnek
KENDİ sunucunuzdan KENDİ Firebase projeniz üzerinden anlık bildirimler; resmi @capacitor/push-notifications API'siyle (com.capacitorjs:push-notifications, kabuğun PushNotificationsPlugin.kt tarafından kaydedilir). npm paketi için yazılmış kod değişmeden çalışır: register(), ardından Firebase Admin SDK veya FCM HTTP v1 API ile registration olayındaki belirtece gönderin.
Döndürür: requestPermissions() / checkPermissions() → { receive: 'granted' | 'denied' | 'prompt' }; register() / unregister() → void (belirteç registration olayıyla gelir { value }, hata registrationError { error } olarak gelir); getDeliveredNotifications() → { notifications }; removeDeliveredNotifications({ notifications }), removeAllDeliveredNotifications(); createChannel({ id, name, importance? }), listChannels(), deleteChannel({ id }). Olaylar: pushNotificationReceived (uygulama açıkken gelen mesaj: { id, title?, body?, data }) ve pushNotificationActionPerformed ({ actionId: 'tap', notification: { id, data } }). Gerekenler: AppMint Push açıkken derleyin ve google-services.json dosyanızı yükleyin (Bildirimler adımı) - belirtecin ait olduğu Firebase projesi budur. Bu olmadan register(), PUSH_NOT_CONFIGURED koduyla reddeder ("Push is not set up in this app"). Kod PushNotifications.register( / requestPermissions( / addListener( çağırdığında HTML, ZIP ve AI-Studio derlemeleri Notifications kutusunu kendiliğinden işaretler. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
const Push = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.PushNotifications;
async function enablePush(userId) {
if (!Push) return;
await Push.addListener('registration', ({ value }) => {
// Your server stores the token and sends to it later.
fetch('https://api.example.com/push-tokens', {
method: 'POST', headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ userId, token: value, platform: 'android' }),
});
});
await Push.addListener('registrationError', ({ error }) => console.warn('push:', error));
const { receive } = await Push.requestPermissions();
if (receive !== 'granted') return;
try { await Push.register(); }
catch (e) { if (e.code === 'PUSH_NOT_CONFIGURED') alert('Push is not set up in this build.'); }
}Uygulama açıkken gelen bir mesaja ve uygulama kapalıyken gelen bir mesaja dokunulmasına tepki verin (dokunma olayı dinleyicinizi bekler, böylece soğuk başlatma kaybolmaz):
const Push = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.PushNotifications;
if (Push) {
Push.addListener('pushNotificationReceived', (msg) => {
alert((msg.title || 'New message') + (msg.body ? ': ' + msg.body : ''));
});
Push.addListener('pushNotificationActionPerformed', ({ notification }) => {
const orderId = notification.data && notification.data.orderId;
if (orderId) location.hash = '#/orders/' + orderId;
});
}Önemli uyarılar için bir kanal (Android 8+), onu adlandıran mesajlar tarafından kullanılır android.notification.channel_id:
const Push = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.PushNotifications;
async function setupChannels() {
if (!Push) return;
await Push.createChannel({ id: 'orders', name: 'Order updates', description: 'Your order status', importance: 4, vibration: true });
}Notlar: notification bloğuyla gönderilen mesaj, uygulama arka plandayken Android'in kendisi tarafından gösterilir; dokunulduğunda uygulamayı açar (uygulamada PIN varsa kilit ekranı üzerinden) ve pushNotificationActionPerformed tetikler. Uygulama açıkken mesajlar pushNotificationReceived olarak gelir ve bildirim tepsisine çizilmez. Yalnızca veri içeren mesajlar sayfaya yalnızca sayfa açıkken ulaşır. AppMint Push mesajları yan yana çalışmaya devam eder - bu eklentiye asla ulaşmazlar. AppMint Push yerine OneSignal ile derlenen bir uygulamada mesajlar OneSignal tarafından teslim edilir ve bu eklentiye asla ulaşmaz. Yapay zekâ ile oluşturulan uygulamalar oluşturucu bildirimlerini pushInbox() ile alır, kaynak: @/lib/appmintNative.
Capacitor.ScreenBrightness Capacitor#
Capacitor.Plugins.ScreenBrightness — getBrightness(), setBrightness({ brightness })
Örnek
Uygulama penceresinin ekran parlaklığını ayarlar - biniş kartı veya QR kodu için tam parlaklık, sonra geri. Paketlenmiş @capacitor-community/screen-brightness (template/plugins/screen-brightness).
Döndürür: getBrightness() → Promise { brightness } (0-1 veya uygulama bunu geçersiz kılmadıysa ve ekran sistemi izliyorsa -1). setBrightness({ brightness }) → Promise void. Gerekenler: hiçbir şey - her uygulama eklentiyi barındırır; izin gerekmez (yalnızca bu uygulamanın penceresini değiştirir, sistem ayarını değil). window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var SB = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.ScreenBrightness;
async function showTicket() {
if (SB) await SB.setBrightness({ brightness: 1 }); // full brightness
document.getElementById('qr').hidden = false;
}
async function hideTicket() {
if (SB) await SB.setBrightness({ brightness: -1 }); // -1 = follow the system again
document.getElementById('qr').hidden = true;
}Yapay zekayla oluşturulmuş bir uygulamada:
import { brightness } from '@/lib/appmintNative';
await brightness.set(1); // clamped to 0–1; false where not available (web)
// ... on leaving the screen
await brightness.restore();
const level = await brightness.get(); // -1 = following the system / not availableÖnce mevcut düzeyi okuyun ve tam olarak onu geri yükleyin:
var SB = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.ScreenBrightness;
var before = -1;
async function boost() {
if (!SB) return;
before = (await SB.getBrightness()).brightness;
await SB.setBrightness({ brightness: 1 });
}
async function undo() {
if (SB) await SB.setBrightness({ brightness: before });
}Notlar: Her zaman bir sayı verin - setBrightness({}) uygulanacak bir değer içermez. Görünüm kapandığında -1 ile geri yükleyin; geçersiz kılma uygulama kapandığında da sona erer. Bir web sayfası arka ışığı kontrol edemez, bu yüzden tarayıcıda can('brightness') değeri 'none' olur.
Capacitor.ScreenOrientation Capacitor#
Capacitor.Plugins.ScreenOrientation — orientation(), lock({ orientation }), unlock()
Örnek
Ekran yönünü okur, tek bir görünüm için sabitler (oyun, grafik, imza alanı) ve serbest bırakır (@capacitor/screen-orientation 8.0.1).
Döndürür: orientation() → Promise { type } (örn. 'portrait-primary'). lock() / unlock() → Promise void. screenOrientationChange olayı { type } iletir. Gerekenler: açılması gereken bir şey yok - her uygulama eklentiyi barındırır. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
orientation değerler: 'portrait', 'landscape', 'portrait-primary', 'portrait-secondary', 'landscape-primary', 'landscape-secondary', 'natural', 'any'.
var SO = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.ScreenOrientation;
async function openChart() {
if (SO) await SO.lock({ orientation: 'landscape' });
showChart();
}
async function closeChart() {
if (SO) await SO.unlock(); // always release when leaving the view
hideChart();
}
if (SO) {
SO.orientation().then(function (o) { console.log('now', o.type); });
SO.addListener('screenOrientationChange', function (o) { console.log('rotated to', o.type); });
}Yapay zekayla oluşturulmuş bir uygulamada:
import { lockOrientation, ScreenOrientation } from '@/lib/appmintNative';
const ok = await lockOrientation('landscape'); // false when refused (always on desktop)
await lockOrientation('any'); // release
await ScreenOrientation.lock({ orientation: 'portrait' });
await ScreenOrientation.unlock();Reddedilen bir kilidi yönetin ve kullanıcıya söyleyin:
var SO = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.ScreenOrientation;
var Toast = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Toast;
async function tryLandscape() {
if (!SO) { document.getElementById('rotate-hint').hidden = false; return; } // ask the user to rotate by hand
try {
await SO.lock({ orientation: 'landscape' });
} catch (e) {
if (Toast) Toast.show({ text: 'Could not rotate the screen', duration: 'short' });
}
}Notlar: Sarmalayıcılar yalnızca portrait / landscape / any değerlerini bilir: ScreenOrientation.lock({ orientation: 'landscape-secondary' }) düz landscape değerine kilitler. Kullanıcıya kilitli bir görünümden çıkış yolu verin.
Capacitor.ScreenReader Capacitor#
Capacitor.Plugins.ScreenReader — isEnabled(), speak({ value, language }), addListener('stateChange')
Örnek
Sayfaya TalkBack'in açık olup olmadığını söyler ve bir duyuru okur (@capacitor/screen-reader 8.0.1).
Döndürür: isEnabled() → Promise { value: boolean }. speak() → Promise void. stateChange olayı, TalkBack açıldığında veya kapatıldığında { value: boolean } iletir. Gerekenler: açılması gereken bir şey yok - her uygulama eklentiyi barındırır. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var SR = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.ScreenReader;
function setCalmMode(on) {
document.documentElement.classList.toggle('no-motion', on); // shorten animations
}
if (SR) {
SR.isEnabled().then(function (r) { setCalmMode(r.value); });
SR.addListener('stateChange', function (s) { setCalmMode(s.value); });
}
async function announceSaved() {
if (SR) await SR.speak({ value: 'Order placed', language: 'en' });
}Yapay zekayla oluşturulmuş bir uygulamada (speak web'de metin okuma kullanır; orada isEnabled() değeri false olur):
import { screenReader } from '@/lib/appmintNative';
const on = await screenReader.isEnabled();
const off = screenReader.onChange((enabled) => setCalmMode(enabled));
await screenReader.speak('Order placed', 'en');Özelliğin varlığını denetleyin ve sayfayı eklenti olmadan da kullanılabilir tutun:
var SR = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.ScreenReader;
async function say(message) {
if (SR) { await SR.speak({ value: message }); return; }
document.getElementById('live-region').textContent = message; // an aria-live="polite" element
}Notlar: language varsayılan olarak 'en' değerindedir. Çoğu duyuru için normal erişilebilir işaretlemeyi (etiketler, aria-live bölgeleri) tercih edin; kısa, önemli durum değişiklikleri için speak kullanın. Ekran okuyucuyu algılayacak bir web API'si yoktur, bu yüzden tarayıcıda can('screenReader') değeri 'none' olur.
Capacitor.SpeechRecognition Capacitor#
Capacitor.Plugins.SpeechRecognition
Örnek
Kullanıcının konuşmasını Android'in konuşma tanıyıcısıyla metne çevirir (uygulamaya yerleşik topluluk @capacitor-community/speech-recognition eklentisi). Android WebView'in kendi Web Speech tanıması yoktur, bu yüzden dikte etmenin yolu budur.
Döndürür: Promise'ler. available() → { available }. checkPermissions() / requestPermissions() → { speechRecognition: 'granted' | 'denied' | 'prompt' }. start({ partialResults: false }) → kullanıcı konuşmayı bıraktıktan sonra { status: 'success', matches: [...] }; konuşma yok veya eşleşme yok gibi hatalarda reddeder. Gerekenler: derlerken 4. Adımda (Erişim) Mic kutusunu işaretleyin (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalarda dosyalarınız SpeechRecognition içerdiğinde derleme mikrofon iznini kendiliğinden de ekler) ve kullanıcının mikrofona izin vermesi gerekir. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
Tek seferlik dikte (@/lib/appmintNative speech bunu aynı şekilde kullanır):
var SR = window.Capacitor && window.Capacitor.Plugins ? window.Capacitor.Plugins.SpeechRecognition : null;
async function dictate() {
var out = document.getElementById('text');
if (!SR || !(await SR.available()).available) { out.textContent = 'Voice input is not available on this phone.'; return; }
var p = (await SR.checkPermissions()).speechRecognition;
if (p !== 'granted') p = (await SR.requestPermissions()).speechRecognition;
if (p !== 'granted') { out.textContent = 'Microphone permission was not given.'; return; }
try {
var r = await SR.start({ language: 'en-US', maxResults: 3, partialResults: false, popup: false });
out.textContent = r.matches && r.matches.length ? r.matches[0] : '';
} catch (e) {
out.textContent = 'Did not catch that. Try again.';
}
}
document.getElementById('mic').addEventListener('click', dictate);Kullanıcı konuşurken canlı metin (partialResults: true) ve dinleme durumu:
// Add the listeners ONCE, when the page starts.
if (SR) {
SR.addListener('partialResults', function (d) {
// Words as they come, and then the final text, all arrive here.
if (d.matches && d.matches.length) document.getElementById('text').textContent = d.matches[0];
});
SR.addListener('listeningState', function (d) {
// 'started' = the user began speaking, 'stopped' = the user stopped speaking
document.body.classList.toggle('listening', d.status === 'started');
});
}
document.getElementById('mic-live').addEventListener('click', async function () {
if (!SR) return;
try {
await SR.start({ language: 'en-US', partialResults: true, popup: false }); // resolves at once, no matches
} catch (e) {
document.getElementById('text').textContent = 'Could not start: ' + e.message;
}
});
document.getElementById('stop').addEventListener('click', function () { if (SR) SR.stop(); });Mikrofon düğmesini yalnızca dikte çalışabildiğinde gösterin ve sayfa gizlendiğinde dinlemeyi durdurun:
var SR = window.Capacitor && window.Capacitor.Plugins ? window.Capacitor.Plugins.SpeechRecognition : null;
var mic = document.getElementById('mic');
mic.hidden = true;
if (SR) {
SR.available().then(function (r) { mic.hidden = !r.available; });
}
document.addEventListener('visibilitychange', function () {
if (document.hidden && SR) SR.stop();
});Notlar:
- Canlı modda (
partialResults: true), son metin'stopped'durumundan sonra gelir; bu yüzdenpartialResultsdinleyicisini'stopped'olayında kaldırmayın. Başladıktan sonraki bir hata (konuşma yok, eşleşme yok) bu modda bildirilmez. language'en-US'veya'ta-IN'gibi bir etikettir (varsayılan: telefonun dili).popup: true, bunun yerine Google'ın kendi dinleme penceresini gösterir.getSupportedLanguages()→{ languages }veisListening()→{ listening }de vardır.start()önce sormadıysanız'Missing permission'ile reddeder. Konuşmada bir duraklama olunca dinleme kendiliğinden durur.
Capacitor.SplashScreen Capacitor#
Capacitor.Plugins.SplashScreen — show(), hide()
Örnek
Uygulamanın kendi markalı açılış ekranı üzerinde @capacitor/splash-screen API'si; böylece ilk ekranı hazır olduğunda SplashScreen.hide() çağıran içe aktarılmış Capacitor / AI Studio projeleri Android uygulamasında çalışır.
Döndürür: hide() → Promise (açılış ekranı, oluşturucunun asgari açılış süresi geçtikten sonra kapanır); show({showDuration, autoHide}) → Promise (açılış ekranı sayfanın üzerine geri gelir ve - varsayılan olan autoHide ile - showDuration ms sonra kapanır, varsayılan 3000). Gerekenler: açılması gereken bir şey yok.
const Splash = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.SplashScreen;
async function boot() {
await loadFirstScreen();
if (Splash) await Splash.hide(); // otherwise the shell hides it at first paint
}
boot();Yavaş bir hesap geçişini, yeni veri ekrana gelene kadar açık tutulan açılış ekranıyla örtün:
const Splash = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.SplashScreen;
async function switchAccount(accountId) {
if (Splash) await Splash.show({ autoHide: false }); // stays until hide()
try {
await loadAccount(accountId);
renderHome();
} finally {
if (Splash) await Splash.hide();
}
}Çıkış yaptıktan sonra markalı açılış ekranını kısa bir süre gösterin; kendiliğinden kapanır showDuration:
const Splash = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.SplashScreen;
async function signOut() {
await clearSession();
showSignInScreen();
if (Splash) {
try {
await Splash.show({ showDuration: 1200 });
} catch (e) {
console.warn('splash not shown:', e.code);
}
}
}Notlar: hide() çağrısı olmadan açılış ekranı yine de her uygulamada olduğu gibi ilk çizimde kapanır. Yapay zekayla oluşturulmuş uygulamalar şuradaki splash.hold() / splash.ready() işlevlerini kullanır @/lib/appmintNative.
Capacitor.StatusBar Capacitor#
Capacitor.Plugins.StatusBar — setStyle, setBackgroundColor, show, hide, getInfo
Örnek
Durum çubuğunun simge stilini, rengini ve görünürlüğünü değiştirir (@capacitor/status-bar 8.0.2).
Döndürür: getInfo() → { visible, style, color, overlays, height } dışında her yöntem Promise void döndürür. Gerekenler: açılması gereken bir şey yok - her uygulama eklentiyi barındırır. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
style uygun olduğu ARKA PLANI adlandırır: 'DARK' = açık renkli simgeler (koyu bir çubuk için), 'LIGHT' = koyu simgeler, 'DEFAULT' = sistemi takip et.
var StatusBar = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.StatusBar;
if (StatusBar) {
StatusBar.setStyle({ style: 'DARK' }); // light icons
StatusBar.hide(); // e.g. while a video plays
// later
StatusBar.show();
}Çubuğu eklentiyle değil, kabuk köprüsüyle renklendirin. Android 15+ sürümünde eklentinin setBackgroundColor işlevi hiçbir şey yapmaz (kenardan kenara görünüm bunu yok sayar). Kabuk şeridi kendisi boyar ve simge stilini aynı çağrıda alır:
if (window.WebToApk && window.WebToApk.setStatusBarColor) {
window.WebToApk.setStatusBarColor('#0B0F1A', 'light'); // dark bar, light icons
} else if (StatusBar) {
StatusBar.setBackgroundColor({ color: '#0B0F1A' }); // hex only, e.g. #RRGGBB
}Yapay zekayla oluşturulmuş bir uygulamada setStatusBar(color, contentStyle) kullanın; kabuk köprüsünü tercih eder ve rengi ile simgeleri tek çağrıda ayarlar:
import { setStatusBar, StatusBar } from '@/lib/appmintNative';
setStatusBar('#0B0F1A', 'light'); // dark bar, light icons
await StatusBar.setBackgroundColor({ color: '#FFFFFF' }); // colour only; icons picked from luminanceNotlar: setBackgroundColor onaltılık metin olmayan bir rengi reddeder. Tam ekran / kiosk derlemelerinde çubuklar kabuk tarafından gizlenir. Android uygulamasında sarmalayıcının tek başına StatusBar.setStyle() işlevi hiçbir şeyi değiştirmez (köprünün boyamak için bir renge ihtiyacı vardır) - stili bir renkle birlikte setStatusBar() işlevine verin.
Capacitor.TextToSpeech Capacitor#
Capacitor.Plugins.TextToSpeech — speak(), stop(), getSupportedLanguages(), getSupportedVoices()
Örnek
Telefonun metinden konuşmaya motoru üzerindeki topluluk @capacitor-community/text-to-speech eklentisi. İçe aktarılan Capacitor projelerinin onu çağırmasının çalışması için gömülüdür.
Döndürür: speak({text, lang, rate, pitch, volume, voice}) → cümle okunduğunda çözümlenen Promise; stop(); getSupportedLanguages() → {languages}; getSupportedVoices() → {voices}; isLanguageSupported({lang}) → {supported}. Gerekenler: açılması gereken bir şey yok.
const Tts = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.TextToSpeech;
async function readAloud(text) {
if (!Tts) { speechSynthesis.speak(new SpeechSynthesisUtterance(text)); return; }
await Tts.speak({ text: text, lang: 'en-US', rate: 1.0, pitch: 1.0, volume: 1.0 });
}
document.getElementById('stop').onclick = () => Tts && Tts.stop();Konuşmadan önce dili kontrol edin ve yüklü değilse bir mesaj gösterin:
const Tts = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.TextToSpeech;
async function speakIn(lang, text) {
if (!Tts) return false;
const { supported } = await Tts.isLanguageSupported({ lang: lang });
if (!supported) { showMessage('This phone has no ' + lang + ' voice installed.'); return false; }
await Tts.speak({ text: text, lang: lang });
return true;
}Bir durdurma düğmesiyle bir paragrafı sesli okuyun ve bir okuma hatasını yönetin:
const Tts = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.TextToSpeech;
async function readParagraph(el, btn) {
if (!Tts) return;
btn.textContent = 'Stop';
btn.onclick = () => Tts.stop();
try {
await Tts.speak({ text: el.textContent, lang: 'en-US', rate: 0.9 }); // resolves when finished
} catch (e) {
console.warn('could not speak:', e.message);
} finally {
btn.textContent = 'Listen';
btn.onclick = () => readParagraph(el, btn);
}
}Notlar: window.speechSynthesis uygulamada da çalışır (kabuğun kendi motoru) ve yapay zekayla oluşturulmuş uygulamaların speak() üzerinden kullandığı budur; bu eklenti Capacitor biçimli yoldur.
Capacitor.TextZoom Capacitor#
Capacitor.Plugins.TextZoom — get(), getPreferred(), set({ value })
Örnek
Uygulama içi "metin boyutu" denetimi için uygulamanın sayfasının metin boyutunu okur ve değiştirir (@capacitor/text-zoom 8.0.1).
Döndürür: get() → Promise { value } (mevcut yakınlaştırma, 1 = %100). getPreferred() → { value } (kullanıcının Android ayarlarında seçtiği boyut). set({ value }) → Promise void. Gerekenler: açılması gereken bir şey yok - her uygulama eklentiyi barındırır. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var TZ = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.TextZoom;
async function biggerText() {
if (!TZ) return;
var now = (await TZ.get()).value;
await TZ.set({ value: Math.min(2, now + 0.1) });
}
async function resetText() {
if (!TZ) return;
var pref = (await TZ.getPreferred()).value; // e.g. 1.15 when the phone uses large text
await TZ.set({ value: pref });
}Yapay zekayla oluşturulmuş bir uygulamada (web'de bunun yerine kök yazı tipi boyutunu ölçekler):
import { textZoom } from '@/lib/appmintNative';
const size = await textZoom.get();
await textZoom.set(size + 0.1); // clamped to 0.5–3
await textZoom.set(await textZoom.getPreferred()); // back to the system sizeSeçimi hatırlayan bir metin boyutu kaydırıcısı:
var TZ = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.TextZoom;
var slider = document.getElementById('text-size'); // <input type="range" min="0.8" max="1.6" step="0.1">
if (TZ) {
var saved = parseFloat(localStorage.getItem('textZoom'));
if (saved) TZ.set({ value: saved });
slider.addEventListener('change', function () {
TZ.set({ value: parseFloat(slider.value) });
localStorage.setItem('textZoom', slider.value);
});
} else {
slider.hidden = true;
}Notlar: Uygulama zaten sistem metin boyutunu izler; bu, uygulama içi ek bir denetim içindir. Düzeninizi büyük boyutlarda test edin - metin denetimlerindeki sabit yükseklikler içeriği keser.
Capacitor.Toast Capacitor#
Capacitor.Plugins.Toast — show({ text, duration, position })
Örnek
"Kaydedildi" veya "Kopyalandı" gibi kısa bir Android sistem mesajı (toast) gösterir (@capacitor/toast 8.0.1).
Döndürür: Promise void. Gerekenler: açılması gereken bir şey yok - her uygulama eklentiyi barındırır. window.Capacitor, uygulamanın kendi sunduğu sayfalarda (HTML, ZIP ve yapay zekayla oluşturulmuş uygulamalar) ve Website modundaki bir uygulamada kendi sitenizde (alan adınız ve alt alan adları) bulunur - uygulamanın açtığı diğer sitelerde asla bulunmaz. Özelliğin varlığını denetleyin.
var Toast = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Toast;
function saved() {
if (Toast) Toast.show({ text: 'Saved', duration: 'short', position: 'bottom' });
}duration 'short' (yaklaşık 2 sn) veya 'long' (yaklaşık 3,5 sn) olabilir. position şunlardan biridir: 'top', 'center' veya 'bottom'.
Yapay zekayla oluşturulmuş bir uygulamada toast() veya Capacitor biçimli Toast kullanın; web'de uygulamanın renklerinde bir bilgi çubuğu çizerler:
import { Toast, toast } from '@/lib/appmintNative';
await Toast.show({ text: 'Added to list', duration: 'long' });
toast('Copied'); // short form, same resultÖzelliğin varlığını denetleyin ve eklenti yoksa sayfada bir mesaj gösterin:
function notify(message) {
var Toast = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Toast;
if (Toast) { Toast.show({ text: message, duration: 'short' }); return; }
var el = document.getElementById('snackbar'); // a plain in-page message
el.textContent = message;
el.hidden = false;
setTimeout(function () { el.hidden = true; }, 2000);
}Notlar: text zorunludur ("Must provide text"). Sistem toast'u telefon üreticisinin stilinde çizer ve yeni Android sürümleri metin toast'ları için position değerini yok sayar. Bir toast'u kaçırmak kolaydır - kullanıcının harekete geçmesi gereken bir hata için asla kullanmayın; bunun için Dialog.alert kullanın.
Capacitor.Torch Capacitor#
Capacitor.Plugins.Torch — enable(), disable(), toggle(), isEnabled(), isAvailable()
Örnek
Telefonun el feneri, @capawesome/capacitor-torch API'siyle. Uygulama kabuğunun kendi eklentisi (TorchPlugin.kt).
Döndürür: enable() / disable() / toggle() → Promise (uygulamanın kendi kamera akışı açıkken CAMERA_IN_USE, flaş yoksa UNAVAILABLE ile reddeder); isEnabled() → {enabled}; isAvailable() → {available}. Gerekenler: açılması gereken bir şey yok ve izin gerekmez.
const Torch = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Torch;
async function setupLightButton() {
if (!Torch || !(await Torch.isAvailable()).available) { lightBtn.hidden = true; return; }
lightBtn.onclick = async () => {
try {
await Torch.toggle();
lightBtn.classList.toggle('on', (await Torch.isEnabled()).enabled);
} catch (e) {
alert(e.message);
}
};
}Bir düğmeden SOS sinyali yanıp söndürün ve kamera flaşı ortasında alırsa ışığı kapatın:
const Torch = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Torch;
const wait = (ms) => new Promise((r) => setTimeout(r, ms));
sosBtn.onclick = async () => {
if (!Torch || !(await Torch.isAvailable()).available) return;
const flashes = [200, 200, 200, 600, 600, 600, 200, 200, 200]; // S O S, in ms
try {
for (const ms of flashes) {
await Torch.enable(); await wait(ms);
await Torch.disable(); await wait(200);
}
} catch (e) {
await Torch.disable().catch(() => {});
alert(e.code === 'CAMERA_IN_USE' ? 'Close the camera first.' : e.message);
}
};Kullanıcı uygulama arka plandayken el fenerini hızlı ayarlar kutucuğundan açıp kapatabileceği için bir ışık düğmesini sistemle uyumlu tutun:
const Torch = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.Torch;
async function syncLightButton() {
if (!Torch) return;
const { enabled } = await Torch.isEnabled();
lightBtn.classList.toggle('on', enabled);
lightBtn.setAttribute('aria-pressed', String(enabled));
}
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') syncLightButton();
});
syncLightButton();Notlar: ışık sistem durumunu izler (hızlı ayarlar kutucuğundan kapatmak kapalı olarak okunur) ve uygulama kapandığında söndürülür. Bir getUserMedia akışı açıkken ışığı iz üzerinden yakın: track.applyConstraints({ advanced: [{ torch: true }] }). Yapay zekayla oluşturulmuş uygulamalar şuradaki torch işlevini kullanır @/lib/appmintNative.