Google Asistan'daki İşleminizle kullanıcılarla etkileşim kurma

1. Genel bakış

Actions on Google, Google Asistan'ın (Google'ın sanal kişisel asistanı) işlevselliğini akıllı hoparlörler, telefonlar, arabalar, TV'ler ve kulaklıklar gibi 1 milyardan fazla cihazda genişletebileceğiniz bir yazılım platformudur. Kullanıcılar, market alışverişi veya yolculuk rezervasyonu gibi işlemler için Asistan'la sohbet eder. (Mümkün olanların tam listesi için İşlemler dizinini inceleyin.) Bir geliştirici olarak, kullanıcılar ile üçüncü taraf hizmetiniz arasında keyifli ve etkili görüşme deneyimleri oluşturmak ve bunları yönetmek için Actions on Google'dan yararlanabilirsiniz.

Bu, Google Asistan için Actions oluşturma konusunda zaten deneyime sahip okuyucular için tasarlanmış gelişmiş bir codelab modülüdür. Actions on Google ile ilgili daha önce herhangi bir geliştirme deneyiminiz yoksa tanıtım codelab'lerimizi (1. Seviye, 2. Seviye ve 3. Seviye) takip ederek platform hakkında bilgi sahibi olmanızı önemle tavsiye ederiz. Bu gelişmiş modüller, Action'larınızın işlevlerini genişletmenize ve kitlenizi büyütmenize yardımcı olabilecek bir dizi özellikte size yol gösterir.

Bir İşlemin başarısını ölçmenin önemli yollarından biri, kullanıcı etkileşimi veya İşlemin kullanıcıları ilk etkileşiminden sonra geri getirmek konusunda ne kadar etkili olduğudur. Bu işlemi kolaylaştırmak için İşleminizde, kullanıcıları görüşmenize geri götüren çeşitli özellikler uygulayabilirsiniz.

Codelab'de, Actions on Google için kullanıcı etkileşimi özellikleri ve en iyi uygulamaları yer almaktadır.

a3fc0061bd01a75.png 961ef6e27dc73da2.png

Derlemeniz istenen nedir?

Zaten oluşturulmuş olan bir özelliği, aşağıdakileri etkinleştirerek geliştirebilirsiniz:

  • Kullanıcılara, İşleminizle konuşmak için dokunabilecekleri günlük bir güncelleme gönderin
  • Kullanıcılara İşleminize bağlantı veren push bildirimleri gönderin
  • Mobil web tarayıcısından kullanıcıları İşleminize yönlendiren bir bağlantı oluşturun

Neler öğreneceksiniz?

  • Kullanıcı etkileşimi nedir ve Action'ların başarısı için neden önemlidir?
  • Kullanıcı etkileşimini artırmak için İşlemlerde değişiklik yapma
  • Farklı Eylem türlerinde hangi kullanıcı etkileşimi özellikleri kullanılır?
  • Asistan üzerinden bildirim göndermek için Actions API'sini kullanma

Gerekenler

Aşağıdaki araçlara sahip olmanız gerekir:

  • WebStorm, Atom veya Sublime gibi seçtiğiniz bir IDE/metin düzenleyici
  • Node.js, npm ve git yüklü kabuk komutlarını çalıştırmak için kullanılan terminal
  • Google Chrome gibi bir web tarayıcısı
  • Firebase komut satırı arayüzüne sahip bir yerel geliştirme ortamı
  • Asistan'ın yüklü olduğu bir mobil cihaz (Android veya iOS) (Asistan'da bu projeyi oluşturmak için kullanacağınız Google Hesabı ile oturum açmış olmanız gerekir.)

Webhook kodunu anlamak için gerekli olmasa da JavaScript'e (ES6) aşina olmanız kesinlikle önerilir.

2. Projenizi oluşturun

Bu bölümde, önceden oluşturulmuş eksiksiz bir İşleme kullanıcı etkileşimi özelliklerini nasıl ekleyeceğiniz gösterilmektedir.

Örneği anlama

Bu codelab'e örnek olarak, "Spor Salonu" adında hayali bir spor salonu için basit bir aksiyon verilmiştir. İşlem, her gün dönen derslerin listesi de dahil olmak üzere spor salonuyla ilgili bilgiler sağlar. Dönüşümlü sınıf listesi her gün farklı bilgiler sağladığından, bu tür bilgilendirici bir işlem, tüm kullanıcı etkileşimi özellikleri için iyi bir adaydır.

Aşağıdaki şemada, Spor Salonu örneğinin konuşma akışı gösterilmektedir:

e2d6e4ad98948cf3.png

Eklediğiniz etkileşim özelliklerine daha uygun olması için iletişim kutusunda küçük değişiklikler yaparsınız. Ancak görüşmenin genel tasarımında çok fazla değişiklik olmayacak.

Temel dosyalarınızı indirme

Codelab'e yönelik GitHub veri deposunu klonlamak için aşağıdaki komutu çalıştırın:

git clone https://github.com/actions-on-google/user-engagement-codelab-nodejs

Projenizi ve temsilcinizi ayarlama

Actions projenizi ve Dialogflow aracınızı kurmak için aşağıdaki adımları tamamlayın:

  1. İşlemler konsolunu açın.
  2. Yeni proje'yi tıklayın.
  3. Proje adı girin (ör. engagement-codelab).
  4. Proje Oluştur'u tıklayın.
  5. Bir kategori seçmek yerine aşağı kaydırıp Diğer seçenekler bölümüne gidin ve İleti dizisi kartını tıklayın.
  6. Seçenekleri genişletmek için İşleminizi Derleyin'i tıklayın ve İşlem Ekle'yi seçin.
  7. İlk İşleminizi Ekleyin'i tıklayın.
  8. İşlem Oluştur iletişim kutusunda Özel Amaç'ı seçin ve Dialogflow konsolunu başlatmak için Oluştur'u tıklayın.
  9. Dialogflow konsolunun temsilci oluşturma sayfasında Oluştur'u tıklayın.
  10. Soldaki gezinme panelinde 6bf56243a8a11a3b.png (dişli) simgesini tıklayın.
  11. Dışa ve İçe Aktar'ı ve ardından Zip'ten Geri Yükle'yi tıklayın.
  12. agent.zip dosyasını daha önce indirdiğiniz /user-engagement-codelab-nodejs/start/ dizininden yükleyin.
  13. RESTORE yazıp Geri yükle'yi tıklayın.
  14. Bitti'yi tıklayın.

İstek karşılamanız

Artık Actions projeniz ve Dialogflow aracınız hazır olduğuna göre Firebase Functions KSA'yı kullanarak yerel index.js dosyanızı dağıtın.

Temel dosya klonunuzun /user-engagement-codelab-nodejs/start/functions/ dizininden aşağıdaki komutları çalıştırın:

firebase use <PROJECT_ID>
npm install
firebase deploy

Birkaç dakika sonra webhook'unuzu Firebase'e başarıyla dağıttığınızı belirten "Dağıtım tamamlandı" ifadesini görürsünüz.

Dağıtım URL'sini alma

Dialogflow'a bulut işlevinin URL'sini sağlamanız gerekir. Bu URL'yi almak için aşağıdaki adımları uygulayın:

  1. Firebase Konsolu'nu açın.
  2. Seçenekler listesinden Actions projenizi seçin.
  3. Sol gezinme çubuğunda işlevleri > İşlevler geliştir'e gidin. "Veri paylaşım ayarlarını seçin" istemini alırsanız Daha sonra yap'ı tıklayarak bu seçeneği yoksayabilirsiniz.
  4. Kontrol Paneli sekmesinin altında, Tetikleyici altında bir URL'nin bulunduğu "Karşılama" girişi görürsünüz. Bu URL'yi kaydedin. Bir sonraki bölümde bu URL'yi Dialogflow'a kopyalamanız gerekecek.

1741a329947975db.png

Dialogflow'da webhook URL'sini ayarlama

Webhook'u sipariş karşılama amacıyla kullanmak için artık Dialogflow aracınızı güncellemeniz gerekiyor. Bunu yapmak için şu adımları uygulayın:

  1. Dialogflow konsolunu açın (dilerseniz Firebase konsolunu kapatabilirsiniz).
  2. Sol gezinme bölmesinde İstek karşılama'yı tıklayın.
  3. Webhook'u etkinleştirin.
  4. Firebase kontrol panelinden kopyaladığınız URL henüz görünmüyorsa yapıştırın.
  5. Kaydet'i tıklayın.

Projenizin doğru şekilde ayarlandığını doğrulama

Kullanıcılar, spor salonuyla ilgili bilgileri (çalışma saatleri içeren sabit kodlanmış metin yanıtı ve haftanın her günü için sınıf programını listeleyen bir metin yanıtı dahil) öğrenmek için Action'ınızı çağırabilmelidir.

Actions simülatöründe işleminizi test etmek için:

  1. Dialogflow konsolundaki sol gezinme panelinde Entegrasyonlar > Google Asistan'ı tıklayın.
  2. Otomatik önizleme değişiklikleri'nin etkin olduğundan emin olun ve İşlemler projenizi güncellemek için Test et'i tıklayın.
  3. Actions simülatörü, Actions projenizi yükler. İşleminizi test etmek için Giriş alanına Talk to my test app yazın ve Enter tuşuna basın.
  4. Antrenman Spor Salonu sizi bekliyor. Görüşmenizde her giriş için bir yanıt bulunduğundan emin olarak ileti dizisini takip etmeyi deneyin.

60acf1ff87b1a87f.png

3. Günlük güncelleme abonelikleri ekleme

Kullanıcılarla etkileşim kurmanın yaygın bir yolu, yararlı oldukları durumlarda onlara bilgi sunmaktır. Bunu, kullanıcılara bir amaç için günlük güncellemelere abone olma seçeneği sunarak yapabilirler. Böylece, kullanıcılara doğrudan bu amacın karşılanmasını sağlayan bir Asistan bildirimi gönderilir.

Bu adımda, günlük güncelleme abonelikleri hakkında bilgi edinecek ve bunları İşlem Listesi amacınıza ekleyeceksiniz. Bu talimatları uyguladıktan sonra Action'ınızın görüşmesi aşağıdaki şemaya benzeyecektir:

f48891c8118f7436.png

Bu durum kullanıcıların ilgisini nasıl çeker?

Akıllı telefon kullanıcıları büyük olasılıkla uygulamaya özgü bilgiler ve güncellemeler sağlayan push bildirimleri hakkında bilgi sahibidir. Günlük güncelleme abonelikleri, Asistan dışındaki mobil cihazlarda kullanıcılara erişmenin basit bir yoludur. Bunun için, güncellemeleri günlük olarak kullanıcıya göndermeye devam edecek bir değer sağlamaya devam etmeniz gerekir.

Günlük güncellemeler yararlı bir etkileşim aracı olabilir ancak her Action'a dahil edilmemelidir. Bir İşleme günlük güncelleme abonelikleri ekleyip eklemeyeceğinize karar verirken aşağıdaki ipuçlarını göz önünde bulundurun:

  • Günlük güncellemelerin, kullanıcının her gün farklı ve yararlı bilgiler görmesine neden olacağından emin olun. Günlük güncellemeye dokunulduğunda her seferinde aynı istem görüntülenirse kullanıcı büyük olasılıkla birkaç gün sonra e-posta listesinden çıkar.
  • Doğrudan günlük güncellemenizin amacına giden kullanıcılar için diyalogunuzun anlamlı olduğundan emin olun. Kullanıcınız konuşmanın başlangıcından itibaren başlamayabilir. Bu nedenle, geniş bir bağlama sahip olmaları beklenmez.
  • Günlük güncellemelere abone olmalarını istemeden önce kullanıcılarınıza İşleminizin avantajlarını gösterin. Kullanıcınıza, "abone ol" seçeneği sunulduğunda bu içeriğin her gün olmasını istiyorum.
  • Birden fazla abone olma önerisiyle kullanıcıları bunaltmayın. Kullanıcıya abone olmak istediklerini gösterdikten hemen sonra günlük bir güncelleme aboneliği sunun ve bu konuda başka bir yerden rahatsız etmeyin.
  • Güncelleme amacı tetiklendikten sonra görüşmeyi kısa tutun. Çoğu günlük güncelleme yalnızca tek bir yanıttan oluşmalı, ardından kullanıcı girişi gerektirmeden kapatılmalıdır.

Günlük güncellemeleri açma

Günlük güncelleme abonelikleri, kullanıcıyı görüşmenizin başında başlatan karşılama amacına veya kullanıcıyı görüşmenin bir yerinde derin bağlantılara bağlamak için daha spesifik bir amaca eklenebilir. Bu codelab'de, diyalog her gün değişeceğinden ve kullanıcılara mevcut derslerin hatırlatılması faydalı olabileceğinden Sınıf Listesi'nin amacını en mantıklı şekilde görebilirsiniz.

Sınıf Listesi amacına yönelik günlük güncellemeleri etkinleştirmek için şu adımları uygulayın:

  1. İşlemler konsolunda, Geliştir sekmesini tıklayın ve sol gezinme çubuğunda İşlemler'i seçin.
  2. İşlemler listesinin altında Sınıf Listesi'ni tıklayın.
  3. Kullanıcı etkileşimi bölümünde Kullanıcılara günlük güncellemeler sunmak ister misiniz? seçeneğini açın.
  4. Günlük güncellemeyi açıklayan açıklayıcı bir İçerik başlığı belirleyin. Bağlam şöyle olur: "Günlük ne zaman göndereyim?". Bu nedenle, videonuzun başlığın hem açıklayıcı hem de sesli olarak söylendiğinde doğru olduğundan emin olun. Bu örnekte, İçerik başlığı'nı list of upcoming Action Gym classes olarak ayarlayın.
  5. Sayfanın üst kısmındaki Kaydet'i tıklayın.

c00885cc30e14d68.png

Dialogflow kurulumu

Günlük güncelleme abonelik akışı için amaçlar oluşturmak üzere Dialogflow konsolunda aşağıdaki adımları uygulayın:

Kullanıcıdan abone olmasını isteme

  1. Günlük güncellemelere abone olmak isteyen bir kullanıcıyı yönetmek için yeni amaç oluşturun. Dialogflow konsolunda sol gezinme bölmesindeki Niyetler'in yanındaki + düğmesini tıklayarak yeni bir amaç oluşturun.
  2. Bu yeni amacı Setup Updates olarak adlandırın.
  3. Eğitim ifadeleri bölümünde aşağıdaki kullanıcı ifadelerini ekleyin:
  • Send daily reminders
  • Reminder
  • Remind me
  • Updates
  • Upcoming classes
  1. İstek karşılama bölümünde Bu niyet için webhook çağrısını etkinleştir seçeneğini açın.
  2. Sayfanın üst kısmındaki Kaydet'i tıklayın.

5c70faa02151da0.png

Kullanıcının kararlarını işleme

  1. Kullanıcının günlük güncellemeler abonelik istemine verdiği yanıtı işlemek için yeni bir amaç oluşturun. Yeni bir niyet oluşturmak için sol gezinme menüsünde Niyetler'ın yanındaki + düğmesini tıklayın.
  2. Bu yeni amacı Confirm Updates olarak adlandırın.
  3. Etkinlikler bölümüne actions_intent_REGISTER_UPDATE ekleyin. Bu Dialogflow etkinliği, kullanıcı abone olup olmadığına bakılmaksızın günlük güncelleme aboneliği akışını bitirdiğinde tetiklenir.
  4. İstek karşılama bölümünde Bu niyet için webhook çağrısını etkinleştir seçeneğini açın.
  5. Sayfanın üst kısmındaki Kaydet'i tıklayın.

b871c2bdadac8abc.png

Sipariş karşılamayı uygulayın

Karşılamayı webhook'unuzda uygulamak için aşağıdaki adımları tamamlayın:

Yükleme bağımlıları

b2f84ff91b0e1396.png actions-on-google dosyasında RegisterUpdate paketi eklemek için index.js dosyasında require() işlevini güncelleyin. Bu sayede içe aktarma işlemleriniz aşağıdaki gibi görünür:

index.js

const {
  dialogflow,
  Suggestions,
  RegisterUpdate,
} = require('actions-on-google');

Öneri çiplerini güncelleme

b2f84ff91b0e1396.png index.js dosyasına, öneri çipi başlıkları listesine bir DAILY girişi ekleyin. Böylece Suggestion tanımınız aşağıdaki gibi görünür:

index.js

// Suggestion chip titles
const Suggestion = {
  HOURS: 'Ask about hours',
  CLASSES: 'Learn about classes',
  DAILY: 'Send daily reminders',
};

Yeni amaçlar için sipariş karşılama ekleyin

Kullanıcı abone olmak istediğini belirttiğinde RegisterUpdate yardımcısını güncellemenin hedef amacı (Sınıf Listesi) ve türü (DAILY) ile çağırarak günlük güncellemeleri abonelik akışını başlatın. Abonelik akışı bittikten sonra Asistan, actions_intent_REGISTER_UPDATE etkinliğini, aboneliğin başarılı olup olmadığını açıklayan bir status bağımsız değişkeniyle tetikler. Kullanıcıya abonelik durumuna göre değişen takip istemleri sunun.

b2f84ff91b0e1396.png index.js dosyasına aşağıdaki kodu ekleyin:

index.js

// Start opt-in flow for daily updates
app.intent('Setup Updates', (conv) => {
  conv.ask(new RegisterUpdate({
    intent: 'Class List',
    frequency: 'DAILY',
  }));
});

// Confirm outcome of opt-in for daily updates
app.intent('Confirm Updates', (conv, params, registered) => {
  if (registered && registered.status === 'OK') {
     conv.ask(`Gotcha, I'll send you an update everyday with the ` +
     'list of classes. Can I help you with anything else?');
  } else {
    conv.ask(` I won't send you daily reminders. Can I help you with anything else?`);
  }
  if (conv.screen) {
    conv.ask(new Suggestions([Suggestion.HOURS, Suggestion.CLASSES]));
  }
});

Kullanıcı için alternatif istemler sunma

Sınıf Listesi yanıtınız, sonunda günlük güncelleme aboneliği sunar ancak bu durum bir soruna yol açar. Kullanıcı aynı şekilde günlük güncelleme bildirimine dokunduğunda aynı yanıt tetikleneceği için, yeni bir güncelleme gelmiş olsa bile kullanıcıdan günlük güncellemelere abone olması istenir. Kullanıcının yeniden abone olması gerektiğini düşünmesini nasıl engelleyebilirsiniz?

Neyse ki conv nesnenizin bağımsız değişkenleri, kullanıcının görüşmeyi nerede başlattığına dair bilgiler içeriyor. conv bağımsız değişkenlerini kontrol ederek UPDATES bölümü içerip içermediğini görebilirsiniz. Bu bölüm, kullanıcının günlük güncelleme bildiriminden görüşmeye başladığını gösterir ve yanıtı buna göre değiştirir. Bu görüşme dalını, sınıf listesini sağladıktan hemen sonra iletişim kutusunu kapatmak için de kullanabilirsiniz. Burada, en iyi uygulama olarak günlük güncellemeyi kısa tutmanız gerekir.

b2f84ff91b0e1396.png index.js dosyasında, aşağıdaki kodu değiştirin:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  const classesMessage =
  `On ${day} we offer the following classes: ${classes}. ` +
  `Can I help you with anything else?`;
  conv.ask(classesMessage);
  if (conv.screen) {
    conv.ask(new Suggestions([Suggestion.HOURS]));
  }
});

şununla:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  let classesMessage = `On ${day} we offer the following classes: ${classes}. `;
  // If the user started the conversation from the context of a daily update,
  // the conv's arguments will contain an 'UPDATES' section.
  let engagement = conv.arguments.get('UPDATES');
  // Check the conv arguments to tailor the conversation based on the context.
  if (engagement) {
    classesMessage += `Hope to see you soon at Action Gym!`;
    conv.close(classesMessage);
  } else {
    classesMessage += `Would you like me to send you daily reminders of upcoming classes, or can I help you with anything else?`;
    conv.ask(classesMessage);
    if (conv.screen) {
      conv.ask(new Suggestions([Suggestion.DAILY, Suggestion.HOURS]));
    };
  };
});

Günlük güncellemelerinizi test etme

Güncellenmiş webhook kodunuzu Firebase'e dağıtmak için terminalde aşağıdaki komutu çalıştırın:

firebase deploy

Actions simülatöründe özel rolünüzü test etmek için aşağıdaki adımları uygulayın:

  1. İşlemler konsolunda, Test'e gidin.
  2. Giriş alanına Talk to my test app yazıp Enter tuşuna basın.
  3. Learn about classes yazıp Enter tuşuna basın. İşleminizin yanıtı artık günlük hatırlatıcılar göndermeyi önerecek.
  4. Send daily reminders yazıp Enter tuşuna basın.
  5. Güncellemeyi görmek istediğiniz bir zaman yazın ve Enter tuşuna basın. Test amacıyla, geçerli saatten 3-5 dakika sonra yanıt vermeyi deneyin.

83a15ecac8c71787.png

Mobil cihazınızda, güncellemeler için belirttiğiniz saatlerde Asistan'dan bir bildirim alırsınız. Bu bildirimin görünmesinin birkaç dakika sürebileceğini unutmayın. Bildirime dokunduğunuzda, bildirimin Asistan'daki Sınıf Listesi amacına doğrudan bağlanması ve yaklaşan sınıfların listesi sağlanır:

8582482eafc67d5b.png

4. Push bildirimleri ekleyin

Kullanıcıları İşleminizin dışında etkileşimde bulunmaya teşvik eden bir seçenek olarak, kullanıcılara push bildirimleri göndermek için Actions API'sini çağırabilirsiniz. Günlük güncellemelerin aksine bu bildirimler Asistan tarafından otomatik olarak planlanmaz. Böylece bu bildirimleri istediğiniz zaman gönderebilirsiniz.

Bu adımda, yeni bir Sınıf İptal Edildi niyeti ekleyerek ve kullanıcılara sınıf iptali ile ilgili bildirim göndererek İşleminizde push bildirimlerini nasıl uygulayacağınızı öğreneceksiniz. Bildirim göndermek için gerekli üç bileşeni de belirlersiniz:

  • Actions API hesabı - API'ye POST isteği göndererek kullanıcıya bildirim gönderirsiniz. Dolayısıyla bu API ile arayüz oluşturmak için bir hizmet hesabı ve kimlik bilgileri ayarlamanız gerekir.
  • İzin yardımcısı: Push bildirimleri göndermek için gereken kullanıcı kimliğine erişmek için kullanıcının izni gerekir. Bu örnekte, izin yardımcısını çağırmak ve bu kimliği istemek için bir istemci kitaplığı işlevi kullanacaksınız.
  • Depolama - Bir kullanıcıya görüşmenin dışında push bildirimi göndermek için kullanıcı kimliklerini, istendiğinde hatırlanabilecek bir yerde saklamanız gerekir. Bu örnekte, her kullanıcı için bilgileri depolamak üzere bir Firestore veritabanı oluşturursunuz.

Bu talimatları uyguladıktan sonra Action'ınızın ileti dizisine aşağıdaki iletişim kutusunu ekleyeceksiniz:

7c9d4b633c547823.png

Bu durum kullanıcıların ilgisini nasıl çeker?

Akıllı telefon kullanıcıları büyük olasılıkla uygulamaya özgü bilgiler ve güncellemeler sağlayan push bildirimleri hakkında bilgi sahibidir. Push bildirimleri, Asistan'ın dışında mobil cihazlardan kullanıcılara erişmenin esnek bir yoludur. Bunun için kullanıcılara bu özelliği etkinleştirmeleri için iyi bir neden verilmiş olmaları gerekir. Günlük güncellemelerle, kullanıcılar günlük olarak bilgilendirileceklerini zaten biliyor. Ancak push bildirimleri sayesinde kullanıcılar, seyrek bildirim almak isteyip istemediklerini bilemez veya günlük olarak birden fazla bildirim alırlar.

Push bildirimleri, yararlı bir etkileşim aracı olabilir ancak her Action'a dahil edilmemelidir. Bir İşlemlere push bildirimleri ekleyip eklemeyeceğinize karar verirken aşağıdaki ipuçlarını göz önünde bulundurun:

  • Push bildirimleriniz için bazı örnek programlar planlayın. Günde yalnızca bir push bildirimi göndermeyi planlıyorsanız bunun yerine günlük güncellemeleri kullanmayı düşünün.
  • Push bildirimlerinizin her alındığında faydalı bilgiler sağlayacağından emin olun. Bildirimleriniz, Action'larınız amaçlarından birine derin bağlantı da verebilir. Bu nedenle, amacın faydalı ve alakalı olduğundan emin olun.
  • Kullanıcıdan push bildirimlerine abone olmasını isterken açık olun. Her push bildirimiyle ilgili olarak ne beklemeleri gerektiğini ve bildirimlerin ne sıklıkla gönderildiği hakkında fikir sahibi olmaları gerekir.

Actions API'sini etkinleştirme

  1. Google Cloud Console'u açın ve açılır menüden Actions proje adınızı seçin.

d015c1515b99e3db.png

  1. Gezinme menüsünde (GCRS) API'ler ve Hizmetler & Kitaplık'a gidin.
  2. Actions API'yi arayın ve Etkinleştir'i tıklayın.

6d464f49c88e70b4.png

Hizmet hesabı oluşturma

Actions API'si kimlik doğrulaması gerektirdiğinden istek göndermek için bir hizmet hesabı oluşturmanız gerekir. Actions API'si için bir hizmet hesabı anahtarı oluşturmak ve yüklemek üzere aşağıdaki adımları uygulayın:

  1. Google Cloud Console gezinme menüsünde ( ☰ ) API'ler ve Hizmetler & Kimlik Bilgileri bölümüne gidin.
  2. Kimlik bilgisi oluştur > Hizmet hesabı anahtarı'nı tıklayın.
  3. Hizmet hesabı açılır menüsünden Yeni Hizmet Hesabı'nı seçin.
  4. Aşağıdaki bilgileri doldurun:
  • Hizmet hesabı adı: service-account
  • Rol: Proje > Sahibi
  • Hizmet hesabı kimliği: service-account (her zaman ardından @<project_id>.iam.gserviceaccount.com gelir)
  • Anahtar türü: JSON
  1. Oluştur'u tıklayın.
  2. İndirilen JSON dosyasını projenizin /user-engagement-codelab/start/Functions/ dizinine taşıyın.
  3. JSON dosyasını service-account.json olarak yeniden adlandırın.

d9bd79d35691de3a.png

Firestore'u Etkinleştir

Görüşmenin dışında bildirim göndermek için bildirim kodunuzdan referans verilebilecek kullanıcı kimliklerini depolamanın bir yolu gerekir. Bu örnekte, abone olan kullanıcıların kullanıcı kimliklerini depolamak için bir Firestore veritabanı kullanıyoruz.

İşleminiz için bir Firestore veritabanı oluşturmak üzere şu adımları uygulayın:

  1. Firebase konsolunda Actions proje adınızı seçin.
  2. Sol gezinme menüsünde, Geliştirme ve Veri Kaybını Önleme'ye gidin ve Veritabanı oluştur'u tıklayın.
  3. Test modunda başlat'ı seçin.
  4. Etkinleştir'i tıklayın.

6dfc386413954caa.png

Dialogflow kurulumu

Dialogflow konsolunda aşağıdaki adımları uygulayarak push bildirimleri etkinleştirme akışını oluşturun:

Kullanıcıdan abone olmasını isteme

  1. İptal edilen sınıflar için push bildirimlerine abone olmayı isteyen kullanıcıyı yönetmek üzere yeni bir amaç oluşturun. Dialogflow konsolunda sol gezinme bölmesindeki Niyetler'in yanındaki + düğmesini tıklayarak yeni bir amaç oluşturun.
  2. Bu yeni amacı Setup Push Notifications olarak adlandırın.
  3. Eğitim ifadeleri bölümünde aşağıdaki kullanıcı ifadelerini ekleyin:
  • Subscribe to notifications
  • Send notification
  • Notify me
  • Send class notifications
  • Cancelled notifications
  1. İstek karşılama bölümünde Bu niyet için webhook çağrısını etkinleştir seçeneğini açın.
  2. Sayfanın üst kısmındaki Kaydet'i tıklayın.

3d99bc41d0492552.png

Kullanıcının kararlarını işleme

  1. Kullanıcının push bildirimleri abonelik istemine verdiği yanıtı yönetmek için yeni bir amaç oluşturun. Yeni bir niyet oluşturmak için sol gezinme menüsünde Niyetler'ın yanındaki + düğmesini tıklayın.
  2. Bu yeni amacı Confirm Push Notifications olarak adlandırın.
  3. Etkinlikler bölümüne actions_intent_PERMISSION ekleyin. Bu Dialogflow etkinliği, kullanıcı push bildirimlerine abone olup olmadığına bakıp push bildirimlerine abone olursa akışı tetikler.
  4. İstek karşılama bölümünde Bu niyet için webhook çağrısını etkinleştir seçeneğini açın.
  5. Sayfanın üst kısmındaki Kaydet'i tıklayın.

d37f550c5e07cb73.png

Push bildirimini işleme

Push bildirimlerinizi belirli bir amaca bağlayabilirsiniz. Böylece, push bildirimine dokunan kullanıcılar doğrudan İşleminizdeki niyetle derin bağlantı kurar. Bu örnekte, iptal edilen sınıflarla ilgili ayrıntılar sağlayan yeni bir push bildirimi niyeti ekleyin.

Kullanıcının bir push bildirimine dokunmasıyla tetiklenecek bir amaç eklemek için şu adımları izleyin:

  1. Dialogflow konsolunda sol gezinme bölmesindeki Niyetler'in yanındaki + düğmesini tıklayarak yeni bir amaç oluşturun.
  2. Bu yeni amacı Class Canceled olarak adlandırın.
  3. Eğitim ifadeleri bölümünde Cancelations, kullanıcı ifadesi olarak ekleyin.
  4. İstek karşılama bölümünde Bu niyet için webhook çağrısını etkinleştir seçeneğini açın.
  5. Sayfanın üst kısmındaki Kaydet'i tıklayın.

940379556f559631.png

Görüşmenin ortasında test bildirimi gönderme

Üretimde, işlem yerine getirme kodunuzdan push bildirimleri gönderen bir komut dosyanız olmalıdır. Bu örnekte, İşleminizle konuşurken push bildirimi göndermek için çağırabileceğiniz bir intent oluşturun. Bu amaç yalnızca hata ayıklama amaçlıdır. Pratikte push bildirimleri, karşılamanız tarafından ele alınmamalı veya Action'ın görüşmesinin bir parçası olarak başka bir şekilde tetiklenmemelidir.

Push bildirimlerini test etme amacı oluşturmak için şu adımları uygulayın:

  1. Test ve hata ayıklama amacıyla, abone kullanıcılara push bildirimleri gönderebilmenizi sağlayan yeni bir amaç oluşturun. Dialogflow konsolunda sol gezinme bölmesindeki Niyetler'in yanındaki + düğmesini tıklayarak yeni bir amaç oluşturun.
  2. Bu yeni amacı Test Notification olarak adlandırın.
  3. Eğitim ifadeleri bölümünde Test notification, kullanıcı ifadesi olarak ekleyin.
  4. İstek karşılama bölümünde Bu niyet için webhook çağrısını etkinleştir seçeneğini açın.
  5. Sayfanın üst kısmındaki Kaydet'i tıklayın.

6967f5a997643eb8.png

Push bildirimlerini açın

Sınıf İptal Edildi amacıyla push bildirimlerini etkinleştirmek için şu adımları uygulayın:

  1. Dialogflow konsolunda gezinme çubuğundan Entegrasyonlar'a gidin.
  2. Google Asistan kartında Entegrasyon Ayarları'nı tıklayın.
  3. Dolaylı çağrı amacı olarak Sınıf İptal Edildi seçeneğini ekleyin. Bu adım, Dialogflow'un kullanıcılar tarafından Sınıf İptal Edildi niyetiyle (bir push bildirimine dokunarak) görüşmenizi başlatabileceğini anlaması için gereklidir.
  4. Kapat'ı tıklayın.

1ac725231ed279a1.png

  1. İşlemler konsolunda, Geliştir sekmesini tıklayın ve sol gezinme çubuğunda İşlemler'i seçin.
  2. İşlemler listesi altında Sınıf İptal Edildi'yi tıklayın.
  3. Kullanıcı etkileşimi bölümünde Push bildirimleri göndermek ister misiniz? seçeneğini açın.
  4. Push bildirimini açıklayan açıklayıcı bir İçerik başlığı ayarlayın. "Bağlam" için push bildirimi göndersem olur mu? Dolayısıyla, başlığınızın hem açıklayıcı hem de sesli olarak söylendiğinde doğru olduğundan emin olun. Bu örnekte, İçerik başlığı'nı class cancelations olarak ayarlayın.
  5. Sayfanın üst kısmındaki Kaydet'i tıklayın.

4304c7cd575f6de3.png

Sipariş karşılamayı uygulayın

Karşılamayı webhook'unuzda uygulamak için aşağıdaki adımları tamamlayın:

Yükleme bağımlıları

b2f84ff91b0e1396.png actions-on-google dosyasında UpdatePermission paketi eklemek için index.js dosyasında require() işlevini güncelleyin. Bu sayede içe aktarma işlemleriniz aşağıdaki gibi görünür:

index.js

const {
  dialogflow,
  Suggestions,
  RegisterUpdate,
  UpdatePermission,
} = require('actions-on-google');

Öneri çiplerini güncelleme

b2f84ff91b0e1396.png index.js dosyasına, öneri çipi başlıkları listesine bir NOTIFICATIONS girişi ekleyin. Böylece Suggestion tanımınız aşağıdaki gibi görünür:

index.js

// Suggestion chip titles
const Suggestion = {
  HOURS: 'Ask about hours',
  CLASSES: 'Learn about classes',
  DAILY: 'Send daily reminders',
  NOTIFICATIONS: 'Get notifications',
};

Yeni içe aktarmaları ayarlama

Firestore veritabanınıza bağlanmak için firebase-admin paketini ve veritabanında depolanan alanlar için sabit değerler ekleyin. Ayrıca, kimlik doğrulamasını ve Actions API'sine yönelik istekleri işlemek için google-auth-library ve request paketlerini içe aktarın.

b2f84ff91b0e1396.png index.js dosyasına aşağıdaki kodu içe aktarma işlemlerinize ekleyin:

index.js

// Firebase admin import
const admin = require('firebase-admin');

// Initialize Firestore
admin.initializeApp();
const db = admin.firestore();

// Firestore constants
const FirestoreNames = {
 INTENT: 'intent',
 USER_ID: 'userId',
 USERS: 'users',
};

// Actions API authentication imports
const {auth} = require('google-auth-library');
const request = require('request');

Sınıf iptal bildirimleri ayarlama teklifi

b2f84ff91b0e1396.png index.js dosyasında, aşağıdaki kodu değiştirin:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  let classesMessage = `On ${day} we offer the following classes: ${classes}. `;
  // If the user started the conversation from the context of a daily update,
  // the conv's arguments will contain an 'UPDATES' section.
  let engagement = conv.arguments.get('UPDATES');
  // Check the conv arguments to tailor the conversation based on the context.
  if (engagement) {
    classesMessage += `Hope to see you soon at Action Gym!`;
    conv.close(classesMessage);
  } else {
    classesMessage += `Would you like me to send you daily reminders of upcoming classes, or can I help you with anything else?`;
    conv.ask(classesMessage);
    if (conv.screen) {
      conv.ask(new Suggestions([Suggestion.DAILY, Suggestion.HOURS]));
    };
  };
});

şununla:

index.js

// Class list intent handler
app.intent('Class List', (conv, {day}) => {
  if (!day) {
    day = DAYS[new Date().getDay()];
  }
  const classes =
  [...new Set(schedule.days[day].map((d) => `${d.name} at ${d.startTime}`))]
  .join(', ');
  let classesMessage = `On ${day} we offer the following classes: ${classes}. `;
  // If the user started the conversation from the context of a daily update,
  // the conv's arguments will contain an 'UPDATES' section.
  let engagement = conv.arguments.get('UPDATES');
  // Check the conv arguments to tailor the conversation based on the context.
  if (engagement) {
    classesMessage += `Hope to see you soon at Action Gym!`;
    conv.close(classesMessage);
  } else {
    classesMessage += `Would you like to receive daily reminders of upcoming classes, subscribe to notifications about cancelations, or can I help you with anything else?`;
    conv.ask(classesMessage);
    if (conv.screen) {
      conv.ask(new Suggestions([Suggestion.DAILY, Suggestion.NOTIFICATIONS,
Suggestion.HOURS]));
    };
  };
});

Yeni amaçlar için sipariş karşılama ekleyin

Kullanıcı, push bildirimlerine abone olmak istediğini belirttiğinde UpdatePermission yardımcısını çağırarak kullanıcının iznini isteyin. Bu başarılı olursa PERMISSION bağımsız değişkeni, conv nesnesinin bağımsız değişkenlerine eklenir. Böylece, ileti dizisini özetlemek için kontrol edebilirsiniz.

Kullanıcının iznini aldıktan sonra, conv nesnesinin bağımsız değişkenlerinden kullanıcı kimliğini alın ve veritabanınıza kaydedin. Bu kullanıcı kimliğini daha sonra Actions API'sine göndereceksiniz. Asistan, bildirimi kimin alacağını belirler.

Son olarak, push bildirimine dokunarak tetiklenen Class Canceled niyet için karşılama ekleyin. Bu örnekte yanıtınız bir yer tutucu dizesidir, ancak bu İşlemin üretime hazır sürümünde, bildirim komut dosyanız hangi sınıfın iptal edildiğiyle ilgili daha dinamik bilgiler sağlar.

b2f84ff91b0e1396.png index.js dosyasına aşağıdaki kodu ekleyin:

index.js

// Call the User Information helper for permission to send push notifications
app.intent('Setup Push Notifications', (conv) => {
 conv.ask('Update permission for setting up push notifications');
 conv.ask(new UpdatePermission({intent: 'Class Canceled'}));
});

// Handle opt-in or rejection of push notifications
app.intent('Confirm Push Notifications', (conv) => {
 if (conv.arguments.get('PERMISSION')) {
   let userId = conv.arguments.get('UPDATES_USER_ID');
   if (!userId) {
     userId = conv.request.conversation.conversationId;
   }
   // Add the current conversation ID and the notification's
   // target intent to the Firestore database.
   return db.collection(FirestoreNames.USERS)
   .add({
     [FirestoreNames.INTENT]: 'Class Canceled',
     [FirestoreNames.USER_ID]: userId,
   })
   .then(() => {
     conv.ask(`Great, I'll notify you whenever there's a class cancelation. ` +
     'Can I help you with anything else?');
   });
 } else {
   conv.ask(`Okay, I won't send you notifications about class cancelations. ` +
     'Can I help you with anything else?');
 }
 if (conv.screen) {
    conv.ask(new Suggestions([Suggestion.CLASSES, Suggestion.HOURS]));
  }
});

// Intent triggered by tapping the push notification
app.intent('Class Canceled', (conv) => {
 conv.ask('Classname at classtime has been canceled.');
});

Test bildirimleri ekleme

Bir kullanıcıya push bildirimi göndermek için Actions API'sına kullanıcı kimliği, bildirimin başlığı ve hedef niyetini içeren bir POST isteği gönderin. Bu örnekte, Test Bildirimi amacını tetiklemek, Firestore veritabanınız üzerinden yinelenir ve bildirimlere abone olan her kullanıcıya push bildirimleri gönderir.

Bu örnekte, webhook bildirimine push bildirimi gönderen kodu ekleyip görüşmenizde bir test amacı çağırarak bu kodu tetiklediğinizi unutmayın. Yayınlamak istediğiniz İşlemler'de, push bildirimi kodunuz istek karşılama işleminden ayrı bir komut dosyasında bulunmalıdır.

b2f84ff91b0e1396.png index.js dosyasına aşağıdaki kodu ekleyin:

index.js

// Debug intent to trigger a test push notification
app.intent('Test Notification', (conv) => {
 // Use the Actions API to send a Google Assistant push notification.
 let client = auth.fromJSON(require('./service-account.json'));
 client.scopes = ['https://www.googleapis.com/auth/actions.fulfillment.conversation'];
 let notification = {
   userNotification: {
     title: 'Test Notification from Action Gym',
   },
   target: {},
 };
 client.authorize((err, tokens) => {
   if (err) {
     throw new Error(`Auth error: ${err}`);
   }
   // Iterate through Firestore and send push notifications to every user
   // who's currently opted in to canceled class notifications.
   db.collection(FirestoreNames.USERS)
       .where(FirestoreNames.INTENT, '==', 'Class Canceled')
       .get()
       .then((querySnapshot) => {
         querySnapshot.forEach((user) => {
           notification.target = {
             userId: user.get(FirestoreNames.USER_ID),
             intent: user.get(FirestoreNames.INTENT),
           };
           request.post('https://actions.googleapis.com/v2/conversations:send', {
             'auth': {
               'bearer': tokens.access_token,
             },
             'json': true,
             'body': {'customPushMessage': notification, 'isInSandbox': true},
           }, (err, httpResponse, body) => {
             if (err) {
               throw new Error(`API request error: ${err}`);
             }
             console.log(`${httpResponse.statusCode}: ` +
               `${httpResponse.statusMessage}`);
             console.log(JSON.stringify(body));
           });
         });
       })
       .catch((error) => {
         throw new Error(`Firestore query error: ${error}`);
       });
 });
 conv.ask('A notification has been sent to all subscribed users.');
});

Push bildirimlerinizi test edin

Güncellenmiş webhook kodunuzu Firebase'e dağıtmak için terminalde aşağıdaki komutu çalıştırın:

firebase deploy

Actions simülatöründe bildirimleri test etmek için aşağıdaki adımları uygulayın:

  1. İşlemler konsolunda, Test sekmesine gidin.
  2. Giriş alanına Talk to my test app yazıp Enter tuşuna basın.
  3. Learn about classes yazıp Enter tuşuna basın.
  4. Get notifications yazıp Enter tuşuna basın.
  5. Henüz push bildirimi göndermek için Action'ınıza izin vermediyseniz yes yazıp Enter tuşuna basın.
  6. yes yazıp Enter tuşuna basın. Google Hesabınız artık bu İşlem için push bildirimlerine abone olmalıdır.

3a8704bdc0bcbb17.png

  1. Çıkmak için no yazıp Enter tuşuna basın.
  2. Yeni bir görüşme başlatmak için Talk to my test app yazıp Enter tuşuna basın.
  3. Test notification yazıp Enter tuşuna basın.

634dfcb0be8dfdec.png

Birkaç dakika içinde mobil cihazınızda "Spor Salonu'ndan Test Bildirimi" bildirimi alırsınız. Bu bildirime dokunduğunuzda İşleminizin Sınıf İptal Edildi niyetine derin bir bağlantı sağlanır.

33cbde513c10122e.png

5. Asistan bağlantısı oluşturma

Şimdiye kadar, kullanıcıların İşleminize geri dönmesini sağlamak için uygulayabileceğiniz etkileşim özelliklerini ele aldık, ancak bu özellikler kullanıcıların İşleminizi keşfedip kullanmasıyla ilgilidir.

Mobil cihazlardaki kullanıcıları doğrudan Asistan'daki Action'ınıza bağlayacak bir Asistan bağlantısı oluşturabilirsiniz. Asistan bağlantısı standart bir köprü olduğundan bu bağlantıyı bir web sitesine veya blog ya da sosyal medya gönderisi gibi web pazarlama materyallerine ekleyebilirsiniz.

Bu adımda Asistan bağlantısının ne olduğunu, Action'ınızın karşılama amacı için nasıl bağlantı oluşturulacağını ve test için basit bir web sitesine nasıl ekleneceğini öğreneceksiniz.

Bu durum kullanıcıların ilgisini nasıl çeker?

Özellikle Asistan'da İşleminizi açıkça çağırmaları gerektiğinde kullanıcıları İşleminize ilk kez çekmek zor olabilir. Asistan bağlantısı, kullanıcılara Action'ınıza doğrudan bağlantı vererek bu sorunu ortadan kaldırır. Asistan özellikli bir cihazda Asistan bağlantınızı izleyen kullanıcılar doğrudan İşleminize yönlendirilir. Bir kullanıcı, mobil olmayan bir cihazda veya Asistan'ı desteklemeyen başka bir cihazda açtığında, bu kullanıcı yine de bağlantınızı bu kullanıcılara pazarlayabilmesi için Actions dizin girişinize yönlendirilir (bağlantı yayınlanmışsa).

Asistan bağlantıları faydalı bir etkileşim aracı olabilir. Bu nedenle, Action'ınızı web siteniz veya sosyal medya üzerinden tanıtmayı planlıyorsanız bir bağlantı oluşturmanız gerekir. Asistan bağlantısı oluşturmadan ve dağıtmadan önce aşağıdaki ipuçlarını göz önünde bulundurun:

  • Asistan bağlantıları yalnızca İşleminiz yayınlandıktan sonra çalışır. Projeniz taslak durumundayken bağlantı yalnızca kendi cihazlarınızda çalışır. Diğer kullanıcılar İşlemler dizinindeki 404 sayfasına yönlendirilir.
  • Kullanıcıların uygulamanızı yayınlamadan önce Asistan bağlantısını test etmesine olanak tanımak için İşleminizi alfa veya beta ortamında yayınlayabilirsiniz. Yalnızca alfa veya beta programına katılan kullanıcıların Asistan bağlantınızı test edebileceğini unutmayın.
  • Asistan bağlantınızın hedef amacının yeni kullanıcılarla iyi bir ilk izlenim uyandırdığından emin olun. Karşılama hedefiniz Asistan'ın tanıtımında zaten iyi bir iş yaptığından, Asistan bağlantısının varsayılan hedefidir

Karşılama amacı için Asistan bağlantısı oluşturmak üzere aşağıdaki adımları uygulayın:

  1. İşlemler konsolunda, Geliştir sekmesini tıklayın ve sol gezinme çubuğunda İşlemler'i seçin.
  2. Eylemler listesi altında actions.intent.ANA'yı tıklayın.
  3. Bağlantılar bölümünde Bu İşlem için bir URL'yi etkinleştirmek ister misiniz? seçeneğini açın.
  4. İşleminizi açıklayan açıklayıcı bir Bağlantı başlığı ayarlayın. Başlığınızın, kullanıcının İşleminizle neler yapabileceğini açıklayan basit bir fiil-isim çifti oluşturun. Bu örnekte, Bağlantı başlığı'nı learn about Action Gym olarak ayarlayın.
  5. Bu sayfanın alt kısmından HTML snippet'ini kopyalayıp daha sonra kullanmak üzere kaydedin.
  6. Sayfanın üst kısmındaki Kaydet'i tıklayın.

55341b8102b71eab.png

Test web sitesi dağıtma

Asistan bağlantınızı test etmek için Firebase araçlarını kullanarak karşılamanızın yanı sıra bir test web sitesi dağıtabilirsiniz. Bu örnek için zaten basit bir test web sitesi oluşturduk. Tek yapmanız gereken Asistan bağlantınızı eklemek.

Sipariş karşılama /user-engagement-codelab-nodejs/start/public/ dizininize gidin ve index.html dosyasını bir metin düzenleyicide açın.

b2f84ff91b0e1396.png index.html dosyasına Asistan bağlantınızın HTML snippet'ini gövde öğesine yapıştırın. Dosya, aşağıdaki snippet'e benzemelidir:

index.html

<body>
    <p>
     <a href="https://assistant.google.com/services/invoke/uid/000000efb5f2fd97">🅖 Ask my test app to learn about Action Gym
     </a>
    </p>
</body>

Terminalde, test web sitenizi Firebase'e dağıtmak için aşağıdaki komutu çalıştırın:

firebase deploy

Dağıtım komutu çalışmayı tamamladığında çıkıştaki Ana makine URL'sini not edin.

b01e8d322fb5d623.png

Mobil cihazınızın web tarayıcısında bu URL'ye gidin. Test web sitenizde Asistan bağlantısını göreceksiniz. Mobil cihazınızda bu bağlantıyı tıkladığınızda Asistan'daki Action'lar karşılama niyetinize yönlendirilirsiniz.

599845d647f5b624.png

Ayrıca, bir masaüstü tarayıcısından Ana Makine URL'sine gitmeyi de deneyebilirsiniz. Bu işlem sayesinde, Action'ınız yayınlanmadığı için Asistan dizinindeki bir 404 sayfasına yönlendirilirsiniz.

6. Sonraki adımlar

Tebrikler!

Bir İşlem geliştirirken kullanıcı etkileşiminin önemi, platformda hangi kullanıcı etkileşimi özelliklerinin bulunduğu ve her özelliğin bir İşleme nasıl ekleneceği hakkında bilgi edindiniz.

Ek öğrenme kaynakları

İşleminizle ilgili kullanıcı etkileşimi hakkında daha fazla bilgi edinmek için şu kaynakları inceleyin:

Bizi Twitter'da @ActionsOnGoogle'dan takip ederek en yeni duyurularımızı takip edin ve #AoGDevs tweet'iyle tweet'inizi paylaşın.

Geri bildirim anketi

Devam etmeden önce, lütfen performansımızın nasıl olduğunu bize bildirmek için bu formu doldurun.