@pushizo/capacitor
v0.1.0
Published
Pushizo Capacitor (Ionic) eklentisi: push bildirimi, kullanıcı/tag, e-posta/SMS, in-app mesaj ve bildirim kutusu
Maintainers
Readme
English
Pushizo Capacitor plugin — Capacitor (Ionic) plugin that wraps the native Pushizo Android and iOS SDKs; on the web it delegates to the Pushizo Web SDK.
Status: Publishing to npm is in progress. Durum: npm yayını hazırlanıyor.
Install from GitHub until then · O zamana kadar GitHub'dan kurulum:
npm install --allow-remote=root https://github.com/pushizo/pushizo-web/releases/download/v0.1.0/pushizo-web-0.1.0.tgz \
https://github.com/pushizo/pushizo-capacitor/releases/download/v0.1.0/pushizo-capacitor-0.1.0.tgz
npx cap syncAfter publication · Yayından sonra:
npm install @pushizo/capacitor
npx cap syncThe detailed guide below is in Turkish; code samples are language-neutral. Full documentation: docs.pushizo.com/docs/sdk/capacitor · API reference: docs.pushizo.com/docs/api.
Türkçe
@pushizo/capacitor
Pushizo'nun Capacitor (Ionic) eklentisi. Native Pushizo Android (com.pushizo:pushizo-android) ve iOS (Pushizo pod / SPM) SDK'larını sarar; web platformunda @pushizo/web SDK'sına devreder. API yüzeyi plan 06 §6.1 ve eski sağlayıcı v5 ile uyumludur.
- Capacitor 6 ve 7, Android minSdk 23, iOS 15+
- Push aboneliği (FCM/APNs), izin istemi ve izin gözlemcisi
- Bildirim tıklaması (soğuk başlatma dahil), ön plan gösterimini engelleme/erteleme
- Kullanıcı:
login/logout(identity verificationidentityHash), tag, alias, dil, e-posta ve SMS aboneliği - In-app mesajlar (tetik, ekran, duraklatma, tıklama ve yaşam döngüsü olayları; native çizim)
- Bildirim kutusu (listeleme, okundu, tümünü okundu, arşiv, okunmamış sayısı)
- Konum paylaşımı (yalnızca ön plan, açıklama + izin istemi; web'de
@pushizo/web) - Özel olay (
Session.sendEvent), KVKK/GDPR gizlilik onayı, günlük seviyesi, bildirim tepsisini temizleme
Kurulum
npm install @pushizo/capacitor @pushizo/web
npx cap sync@pushizo/web yalnızca uygulama web'de de çalışacaksa gereklidir; native derlemelerde yüklenmez (dinamik içe aktarma).
Kullanım
import { Pushizo } from '@pushizo/capacitor';
await Pushizo.initialize('app_xxx', {
apiUrl: 'https://api.pushizo.com', // kendi kurulumunuzun API adresi
requiresPrivacyConsent: false,
logLevel: 'warn',
});
// Tıklama dinleyicisini mümkün olduğunca erken ekleyin; uygulama bildirimden açıldıysa
// bekleyen tıklama ilk dinleyiciye teslim edilir.
Pushizo.Notifications.addClickListener((event) => {
console.log(event.notification.title, event.result.actionId, event.result.url);
});
const granted = await Pushizo.Notifications.requestPermission();
await Pushizo.login('user_42'); // identity verification açıksa: login('user_42', identityHash)
await Pushizo.User.addTags({ plan: 'pro', level: 3 });
await Pushizo.User.addEmail('[email protected]');
await Pushizo.User.addSms('+905551112233');
await Pushizo.Session.sendEvent('purchase', { sku: 'A1' }, 49.9);Ön planda gelen bildirim
Pushizo.Notifications.addForegroundLifecycleListener((event) => {
if (event.notification.data.silent_in_app === '1') {
event.preventDefault(); // gösterme
// ... daha sonra göstermek için: await event.display();
}
});Dinleyici eklendiğinde native SDK gösterimi JS kararına kadar bekletir; hiçbir dinleyici preventDefault() çağırmazsa bildirim hemen gösterilir. iOS'ta engellenen bildirim en fazla 25 sn içinde display() ile gösterilebilir. Web'de engellenen bildirim sonradan gösterilemez.
Abonelik ve izin gözlemcileri
const stop = Pushizo.User.pushSubscription.addObserver((state) => console.log(state.id, state.optedIn));
Pushizo.Notifications.addPermissionObserver(({ permission }) => console.log('izin', permission));
stop(); // aboneliği kaldırırİzin olayı (permissionChange) yerel Android/iOS SDK izin gözlemcisinden gelir: izin isteği sonuçlandığında ve uygulama
ön plana döndüğünde izin ayarlardan değiştiyse yalnızca gerçek değişiklikte iletilir.
In-app mesajlar
await Pushizo.InAppMessages.addTriggers({ level: 5, vip: true });
await Pushizo.InAppMessages.setScreen('checkout');
Pushizo.InAppMessages.addClickListener((e) => console.log(e.message.id, e.result.actionId, e.result.url));
Pushizo.InAppMessages.addLifecycleListener({ didDisplay: (e) => console.log('gösterildi', e.message.id) });
await Pushizo.InAppMessages.setPaused(true);Mesajlar native SDK'nın kendi görünümüyle (Android Dialog, iOS UIWindow) çizilir.
HTML in-app ve carousel
In-app mesajları yerel Android/iOS SDK'sı çizer; bu paket köprüdür. HTML in-app (sandbox'lı WebView, köprü
close/click/addTag/trackEvent) ve carousel blokları yerel SDK'dan olduğu gibi devralınır: ek kod veya
yapılandırma gerekmez, tıklama ve yaşam döngüsü olayları mevcut in-app dinleyicilerine gelir. Yetenek bildirimi
(supports=html,carousel) yerel SDK tarafından yapılır; desteklemeyen eski yerel sürümlere sunucu HTML mesaj göndermez
ve carousel bloklarını çıkarır.
Bildirim kutusu
const page = await Pushizo.Inbox.list({ limit: 20 });
for (const item of page.items) console.log(item.title, item.read, new Date(item.createdAt ?? 0));
await Pushizo.Inbox.markRead(page.items[0].id);
const unread = await Pushizo.Inbox.markAllRead();
await Pushizo.Inbox.archive(page.items[0].id);
const next = page.hasMore ? await Pushizo.Inbox.list({ cursor: page.nextCursor! }) : null;Bildirim kutusu kayıtlı bir kullanıcı ve abonelik ister; yoksa NOT_READY koduyla reddedilir.
Bildirim tercihleri
const { preferences, categories } = await Pushizo.User.getPreferences();
for (const c of categories) console.log(c.key, c.name.tr ?? c.name.en, c.channels, c.defaultOptedIn);
// channel verilmezse (veya null) tüm kanallar; 1-100 kayıt. Güncel liste döner.
const updated = await Pushizo.User.setPreferences([
{ category: 'promo', optedIn: false },
{ category: 'news', channel: 'email', optedIn: true },
]);Tercihler bir abonelik ister (yoksa NOT_READY); sahiplik kanıtı native SDK tarafından eklenir. Tanımsız kategori HS_NOT_FOUND, kategorinin kapsamadığı kanal HS_VALIDATION_ERROR ile reddedilir. updatedAt epoch milisaniyedir.
JWT ile kimlik doğrulama
App ayarlarında kimlik doğrulama kipi (identity_verification_mode) jwt veya both ise kullanıcı, sunucunuzda
imzalanmış kısa ömürlü bir ES256 JWT ile kimliklendirilir (talepler: sub = external_id, aud = app_id, exp/iat zorunlu, en çok 24 saat, yalnızca ES256).
await Pushizo.login('user_42', { jwt: jwtFromBackend }); // yalnızca JWT
await Pushizo.login('user_42', { identityHash: hmac, jwt: jwtFromBackend }); // both kipinde ikisi birlikte
await Pushizo.updateUserJwt(refreshedJwt); // süresi dolmadan yenileyin
await Pushizo.logout();- JWT yerel SDK'da identity hash ile aynı kalıcı depoda saklanır ve tüm
/sdk/v1/...isteklerindeAuthorization: Bearer <jwt>başlığıyla gider; gövdeye/URL'ye yazılmaz, loglanmaz.logoutbelirteci siler. /configyanıtındaidentity_verification_requiredtrue ise login öncesi kanıt denetlenir:jwtkipinde JWT,hmackipindeidentityHashzorunludur,bothkipinde biri yeter; eksikseloginNOT_READYile reddedilir. Alan gelmeyen eski sunucularda kiphmacsayılır; ikinci argümanı metin olan eskilogin(id, identityHash)çağrıları aynen çalışır.updateUserJwtgiriş yapılmamışsaNOT_READYile reddedilir; başarıda kuyrukta bekleyen işlemler yeni belirteçle yeniden denenir.- Web platformunda çağrılar
@pushizo/webSDK'sınınlogin(id, { identityHash, jwt })veupdateUserJwtyöntemlerine iletilir.
Live Activities (iOS)
Eklenti, iOS SDK'nın genel PushizoDefaultLiveActivityAttributes türünü kullanır. Push-to-start (sunucudan
uzaktan başlatma) iOS 17.2+, yerel başlatma iOS 16.1+ ister; Android ve web'de çağrılar PLATFORM_NOT_SUPPORTED ile
reddedilir.
await Pushizo.initialize('app_…');
await Pushizo.LiveActivities.setupDefaultLiveActivity(); // her açılışta: belirteçler sunucuya kaydedilir
await Pushizo.LiveActivities.startDefaultLiveActivity('order_42', { title: 'Sipariş #42' }, { status: 'Yolda', eta: 12 });ios/App/App/Info.plistdosyasınaNSSupportsLiveActivities = YESekleyin.Xcode → File → New → Target → Widget Extension ("Include Live Activity" seçili). Widget hedefine SPM'de
PushizoExtensionürününü ekleyipimport PushizoExtension, CocoaPods'tapod 'Pushizo/Extension'ekleyipimport Pushizoyazın:ActivityConfiguration(for: PushizoDefaultLiveActivityAttributes.self) { context in VStack { Text(context.attributes.data["title"]?.stringValue ?? "") Text(context.state.data["status"]?.description ?? "") } } dynamicIsland: { context in DynamicIsland { DynamicIslandExpandedRegion(.center) { Text(context.state.data["status"]?.description ?? "") } } compactLeading: { EmptyView() } compactTrailing: { Text(context.state.data["eta"]?.description ?? "") } minimal: { EmptyView() } }Dashboard'da (App → Live Activities) veya API'de tür adı tam olarak
PushizoDefaultLiveActivityAttributesolarak tanımlanmalıdır. Sunucudan gönderim:POST /v1/apps/{appId}/live-activities/PushizoDefaultLiveActivityAttributes/start(activity_id,attributes,content_state,target),…/updateve…/end(activity_idile).
activityId1-100 karakter (harf, rakam ve_ . : -);attributes/contentStatedüz nesnedir, anahtarlar 1-64 karakter, değerler metin, sonlu sayı veya boolean'dır;attributesiçindepushizoanahtarı ayrılmıştır. Kurala uymayan girdi native'e gitmedenTypeErrorfırlatır.- Ret kodları:
PLATFORM_NOT_SUPPORTED(Android, web veya iOS 16.1 öncesi),NOT_READY(initializeçağrılmadı),INVALID_ARGUMENT,LIVE_ACTIVITY_FAILED(Live Activities kapalı,NSSupportsLiveActivitiesyok vb.). - Kendi tip-güvenli
ActivityAttributestürünüzü kullanmak isterseniz native tarafta (AppDelegate)Pushizo.LiveActivities.register(MyAttributes.self)çağırın; ayrıntı ios rehberi → "Live Activities".
Canlı sohbet
await Pushizo.Chat.start({ name: 'Ali' });
const config = await Pushizo.Chat.getConfig(); // online, offlineMessage, ek sınırları
const { messages } = await Pushizo.Chat.getMessages();
Pushizo.Chat.addEventListener('message', ({ message }) => render(message));
Pushizo.Chat.addEventListener('open', ({ conversationId }) => openChat(conversationId)); // bildirime tıklama
await Pushizo.Chat.startListening(); // ekran açıkken; ayrılınca stopListening()
await Pushizo.Chat.sendMessage('Merhaba'); // bot hızlı yanıtı: sendMessage(label, { optionId })
await Pushizo.Chat.sendAttachment({ base64 }, { fileName: 'a.png', mimeType: 'image/png' });
await Pushizo.Chat.markRead(messages[messages.length - 1].seq);Ziyaretçi kimliği, çevrimdışı kuyruk (aynı client_message_id ile yeniden deneme), canlı akış (SSE; koparsa üstel
geri çekilme + after_seq yoklaması) ve push ile gelen temsilci mesajları (pushizo_chat) yerel Android/iOS SDK'sındadır;
start sonrası login/logout ve push aboneliği değişince bağlama yerel SDK'da yenilenir, logout ziyaretçiyi sıfırlar.
Mesajlar seq ile sıralanır; ağ yokken gönderilen mesaj pending döner ve gönderilince olayla sunucu kopyası gelir.
Ayrıntı: android rehberi / ios rehberi → "Canlı sohbet".
Capacitor web'de sohbet @pushizo/web widget'ıyla sunulur; Pushizo.Chat çağrıları PLATFORM_NOT_SUPPORTED döner.
Konum
Kullanıcı izin verirse cihazın konumu push aboneliğine yazılır; segmentlerde konuma göre hedefleme için
kullanılır. Paylaşım yalnızca ön planda çalışır (arka plan konumu yok): native SDK konumu oturum başında ve uygulama
ön plana döndüğünde en sık 5 dakikada bir gönderir. İzin yoksa veya gizlilik onayı (requiresPrivacyConsent)
verilmemişse hiçbir şey gönderilmez; tercih kalıcıdır.
const granted = await Pushizo.Location.requestPermission('Yakındaki mağazaları göstermek için konumunuzu kullanırız.');
if (granted) await Pushizo.Location.setShared(true);
const shared = await Pushizo.Location.isShared(); // kalıcı tercih (izin durumundan bağımsız)
await Pushizo.Location.setShared(false); // paylaşımı kapatır, sunucudaki konumu silerrequestPermission(rationale?): izin yoksa önce açıklama gösterilir (rationale; verilmezse SDK'nın Türkçe/İngilizce varsayılan metni), kullanıcı "Şimdi değil" derse sistem istemi açılmaz. İzin varsa veya verildiysetrue; reddedildiyse, uygulama izni tanımlamadıysa ya da vazgeçildiysefalse.isShared()native SDK'daki özelliğin asenkron karşılığıdır.initializeöncesindesetShared/requestPermissionNOT_READYkoduyla reddedilir.KVKK: sunucuya ulaşan ilk konum açık rıza kaydı olarak saklanır. Kullanıcıya konumun neden kullanıldığını açıklayın ve paylaşımı yalnızca onayıyla açın.
setShared(false)sunucuyalocation: nullgönderir; konum ve rıza kaydı silinir, henüz gönderilmemiş konum atılır.iOS:
ios/App/App/Info.plistdosyasınaNSLocationWhenInUseUsageDescriptionekleyin (yoksarequestPermissionfalsedöner). Yalnızca "Uygulamayı Kullanırken" izni istenir; "Her Zaman" istenmez. Reddedilmiş izin yeniden sorulamaz, kullanıcı Ayarlar'a yönlendirilmelidir.Android: eklenti konum iznini manifest'e otomatik eklemez;
android/app/src/main/AndroidManifest.xmldosyasına kendiniz ekleyin (yaklaşık konum yeterlidir, hassas konum isteğe bağlıdır):<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />Yalnızca manifest'te tanımlı izinler istenir; hiçbiri yoksa uyarı loglanır ve
falsedöner. Açıklama diyaloğu SDK'nın string kaynaklarını kullanır; sistem izni Capacitor izin API'siyle istenir ve sonuç SDK'ya iletilir.Web: çağrılar
@pushizo/webLocationyüzeyine iletilir (tarayıcı Geolocation izni; açıklama kutusu Web SDK tarafından gösterilir,initializeöncesinde Web SDK hatası döner).
Gizlilik onayı (KVKK/GDPR)
requiresPrivacyConsent: true ile başlatıldığında await Pushizo.setConsentGiven(true) çağrılana kadar hiçbir ağ çağrısı yapılmaz.
Diğer
await Pushizo.Notifications.clearAll(); // tepsi/bildirim merkezi + rozet
await Pushizo.Notifications.removeGroupedNotifications('orders');
await Pushizo.Notifications.removeNotification(id); // Android: notification.androidNotificationId; iOS: UNNotificationRequest.identifier (metin)
await Pushizo.Debug.setLogLevel('debug');
await Pushizo.logout();Hatalar code alanı taşır: INVALID_ARGUMENT (geçersiz e-posta/telefon, eksik alan), NOT_READY (başlatılmadı/abonelik yok), NOT_FOUND, UNAVAILABLE (platformda yok), PLATFORM_NOT_SUPPORTED / LIVE_ACTIVITY_FAILED (Live Activities) veya sunucu hata kodu.
Android kurulumu (FCM)
- Firebase konsolunda Android uygulaması ekleyin,
google-services.jsondosyasınıandroid/app/altına koyun. Capacitor şablonucom.google.gms.google-serviceseklentisini dosya varsa otomatik uygular. - Pushizo dashboard'unda uygulamanın Android (FCM) kimlik bilgisi adımında Firebase servis hesabı JSON'unu yükleyin; kayıt sonrası otomatik doğrulanır (kurulum sihirbazında Capacitor/Ionic seçilebilir).
- Eklenti
com.pushizo:pushizo-androidartefaktına bağlıdır. Yayın öncesi monorepo kullanımındasdk/androidiçindegradle :pushizo:publishToMavenLocalçalıştırın ve uygulamanınandroid/build.gradledosyasındakiallprojects.repositoriesbloğunamavenLocal()ekleyin. SDK sürümüvariables.gradleiçindepushizoAndroidVersionile değiştirilebilir. - Android 13+ bildirim izni
Notifications.requestPermission()ile istenir. Bildirim ikonu içinAndroidManifest.xmliçindecom.pushizo.sdk.default_notification_iconmeta-data'sı verilebilir.
Eklenti, JS ile yapılan ilk initialize ayarlarını (yalnızca uygulama kimliği ve herkese açık ayarlar) saklar; süreç bildirim tıklaması veya FCM mesajıyla yeniden başladığında SDK WebView yüklenmeden başlatılır, böylece tıklama ve received bildirimi kaybolmaz.
iOS kurulumu (APNs)
- Xcode'da Signing & Capabilities altında Push Notifications ve Background Modes → Remote notifications yeteneklerini ekleyin.
- Pushizo dashboard'unda APNs
.p8anahtarını (Key ID, Team ID, bundle id) veya.p12sertifikasını yükleyin; sandbox ve production için otomatik doğrulanır. - APNs token'ının eklentiye ulaşması için
ios/App/App/AppDelegate.swiftiçine Capacitor bildirimlerini ekleyin:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
NotificationCenter.default.post(name: .capacitorDidRegisterForRemoteNotifications, object: deviceToken)
}
func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
NotificationCenter.default.post(name: .capacitorDidFailToRegisterForRemoteNotifications, object: error)
}- CocoaPods:
ios/App/Podfileiçinepod 'Pushizo'ekleyin (CocoaPods trunk). SPM (Capacitor 7): pakethttps://github.com/pushizo/pushizo-ios.gitdeposundan çözülür.
Pushizo SDK'sı UNUserNotificationCenter delegesini üstlenir (ön plan gösterimi ve tıklama). Aynı uygulamada @capacitor/push-notifications kullanmayın.
Notification Service Extension (zengin medya, teslim bildirimi)
Resimli bildirimler, rozet artışı ve uygulama kapalıyken received bildirimi için bir NSE hedefi ekleyin:
- Xcode → File → New → Target → Notification Service Extension (ör.
PushizoNSE), dağıtım hedefi iOS 15. - Podfile'a hedefi ekleyin:
target 'PushizoNSE' do
pod 'Pushizo/Extension'
endNotificationService.swiftiçeriğini SDK yardımcısına devredin (CocoaPods'ta modül adıPushizo, SPM'dePushizoExtension):
import UserNotifications
import Pushizo
class NotificationService: UNNotificationServiceExtension {
let hs = PushizoNotificationServiceExtension(appId: "app_xxx", apiUrl: "https://api.pushizo.com",
appGroup: "group.com.pushizo.app.pushizo")
override func didReceive(_ request: UNNotificationRequest, withContentHandler handler: @escaping (UNNotificationContent) -> Void) {
hs.didReceive(request, withContentHandler: handler)
}
override func serviceExtensionTimeWillExpire() { hs.serviceExtensionTimeWillExpire() }
}- Uygulama ve NSE hedeflerinde aynı App Group yeteneğini açın ve uygulamanın
Info.plistdosyasınaPushizoAppGroupanahtarıyla yazın (verilmezsegroup.<bundle id>.pushizokullanılır); rozet sayacı bu grup üzerinden paylaşılır. Gönderilen bildirimdemutable-contentPushizo sunucusu tarafından ayarlanır.
Web
Web platformunda @pushizo/web kullanılır: PushizoSDKWorker.js dosyasını sitenizin köküne koyun ve gerekirse initialize(appId, { web: { serviceWorkerPath: '/PushizoSDKWorker.js' } }) verin. Web'de removeNotification, User.getEmails ve User.getSmsNumbers yoktur (UNAVAILABLE); clearAll service worker bildirimlerini kapatır. User.setPreferences web'de güncel listeyi okuyup kategori/kanalı denetler, yazmayı web SDK'nın çevrimdışı kuyruğuna verir ve yazma sonrası listeyi döndürür (istek arka planda gönderilir).
Geliştirme
npm install
npm run typecheck
npm test # vitest: cephe, web uygulaması ve native sözleşme denetimi
npm run build # dist/esmAdım adım kurulum ve örnek kod: capacitor rehberi.
Support · Destek
- Guide · Rehber: docs.pushizo.com/docs/sdk/capacitor
- API reference & OpenAPI · API referansı ve OpenAPI: docs.pushizo.com/docs/api · pushizo-openapi
- Bugs & ideas · Hata ve öneri: Issues
- Security · Güvenlik: please do not open public issues; email [email protected] · herkese açık issue açmayın, bu adrese yazın.
- Help · Destek: [email protected]
This repository is mirrored automatically from the Pushizo main repository on every release. Please open an issue instead of a pull request; fixes land in the main repository and ship with the next release. Bu depo her sürümde Pushizo ana deposundan otomatik yansıtılır. Pull request yerine issue açın; düzeltmeler ana depoda yapılır ve bir sonraki sürümle buraya gelir.
Released under the MIT License · MIT lisanslıdır — LICENSE.
