• 10-06-2023, 00:15:12
    #1
    <string name="label_newuser_notify">%1$s katıldı.</string>
    şeklinde bir satırım var string.xml de.
    bu kısmıda googledan bulduğum şekliyle yaptım. ancak body_loc_args a bir şey ekleyip php ile gönderdiğimde ileti gelmiyor. googleın dedğine göre ise sadece bu şekilde gelmesi gerekli.
    String text = context.getString(R.string.label_newuser_notify, username); gibide bir örnek buldum. acaba bu username i gönderirken data içindemi belirtmem gerek? yani yine googleın dediği gibi değil hiç birşey.

    tek istediğim cron ile kontrolde katılan biri olduğunda nickiyle beraber bildirim atması... bu kadar zor olmamalıydı.
  • 10-06-2023, 09:44:34
    #2
    AzveNET adlı üyeden alıntı: mesajı görüntüle
    <string name="label_newuser_notify">%1$s katıldı.</string>
    şeklinde bir satırım var string.xml de.
    bu kısmıda googledan bulduğum şekliyle yaptım. ancak body_loc_args a bir şey ekleyip php ile gönderdiğimde ileti gelmiyor. googleın dedğine göre ise sadece bu şekilde gelmesi gerekli.
    String text = context.getString(R.string.label_newuser_notify, username); gibide bir örnek buldum. acaba bu username i gönderirken data içindemi belirtmem gerek? yani yine googleın dediği gibi değil hiç birşey.

    tek istediğim cron ile kontrolde katılan biri olduğunda nickiyle beraber bildirim atması... bu kadar zor olmamalıydı.
    Evet, getString(R.string.label_newuser_notify, username) kullanırken, username değerini gönderirken data içinde belirtmeniz gerekmektedir. Bu şekilde, username değeri ilgili string kaynağında %1$s yerine geçecek ve sonuç olarak doğru metin elde edilecektir.

    Örneğin, bir bildirim oluştururken username değerini data içinde belirtebilirsiniz:

    String username = "JohnDoe";
    
    JSONObject notificationData = new JSONObject();
    notificationData.put("username", username);
    
    Message message = Message.builder()
        .putData("title", "Yeni Kullanıcı Katıldı")
        .putData("body", "label_newuser_notify")
        .putData("body_loc_key", "label_newuser_notify")
        .putData("body_loc_args", username)
        .setTopic("your_topic")
        .build();
    
    String response = FirebaseMessaging.getInstance().send(message);
    Yukarıdaki örnekte, body_loc_args değerine username değerini ekledik ve bu değer label_newuser_notify string kaynağında %1$s yerine geçecektir.
    Bildirim oluştururken data bölümünde username değerini belirttiğinizden emin olun ve bu şekilde bildirimin doğru şekilde oluşturulması sağlanır.

    bu googlenin kaynaklarinda body_loc_args kullanarak FCM bildirimi göndermek için kabul ettigi ve güvenlik, hata yönetimi ve diğer faktörleri de dikkate alarak yol gösterdigi yoldur.

    php ile username yollayip androidde okutman icin android geliştiricileri kısa paylaşımlarda bulunmuşlardır örnek olarak
    PHP TARAFI
    function sendNotification($username) {
        $serverKey = 'YOUR_SERVER_KEY'; // FCM sunucu anahtarını buraya girin
    
        $headers = array(
            'Authorization: key=' . $serverKey,
            'Content-Type: application/json'
        );
    
        $data = array(
            'to' => '/topics/all', // Tüm cihazlara göndermek için '/topics/all' kullanılıyor
            'data' => array(
                'username' => $username
            )
        );
    
        $payload = json_encode($data);
    
        $curl = curl_init();
    
        curl_setopt($curl, CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send');
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
    
        $result = curl_exec($curl);
    
        curl_close($curl);
    
        return $result;
    }
    Yukarıdaki örnekte, sendNotification fonksiyonu username değerini alarak FCM bildirimini oluşturur ve gönderir. FCM sunucu anahtarını YOUR_SERVER_KEY olarak değiştirmeniz gerekmektedir. sendNotification fonksiyonunu kullanarak istediğiniz zaman bildirim gönderebilirsiniz.
    Android tarafında, FirebaseMessagingService sınıfını kullanarak username değerini alabilirsiniz. MyFirebaseMessagingService sınıfının güncellenmiş bir örneği:

    import com.google.firebase.messaging.FirebaseMessagingService;
    import com.google.firebase.messaging.RemoteMessage;
    
    public class MyFirebaseMessagingService extends FirebaseMessagingService {
        @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
            if (remoteMessage.getData().containsKey("username")) {
                String username = remoteMessage.getData().get("username");
                String text = getString(R.string.label_newuser_notify, username);
                // Elde edilen metni kullanabilirsiniz
                // Örneğin, bildirimi göstermek veya verileri kullanarak başka bir işlem yapmak
                showNotification(text);
            }
        }
    
        private void showNotification(String text) {
            // Bildirimi göstermek için gerekli kodu buraya ekleyin
        }
    }
    Yukarıdaki örnekte, onMessageReceived metodunda username değeri alınır ve getString metoduyla label_newuser_notify string kaynağı içindeki metin oluşturulur. Bu metni kullanarak istediğiniz işlemleri gerçekleştirebilirsiniz. Örneğin, bildirimi göstermek için showNotification metodunu kullanabilirsiniz.
    Bu şekilde, PHP tarafında sendNotification fonksiyonunu kullanarak username değerini alıp Android tarafında FCM bildirimi ile iletebilirsiniz. Android tarafında MyFirebaseMessagingService sınıfını kullanarak username değerini alarak istediğiniz işlemleri gerçekleştirebilirsiniz.

    Gibi çeşitli örneklerle çoğalta bilirsiniz
  • 10-06-2023, 12:38:20
    #3
    $notify = array("body_loc_key" => "label_newuser_notify", "username"=> $username,"priority" => "high");

    $post = array(
    'registration_ids' => $fcm_ids,
    'notification' => $notify,
    'priority' => "high",
    'data' => $this->data,
    'content_available' => true,
    );

    Php tarafı Şu şekilde olacak anladığım kadarıyla üstadım değilmi?
    Birde ben fcm idleri db den çekip gönderitorum normalde. Bunun yerine /topic/all yapsam yine hepsine gidiyor sanırım.
    Ve bu topic olayını cihaz diline göre gönderebiliyor muyuz? İlave bişey yapmamız gerekirmi yapılabilşyorsa?
  • 10-06-2023, 13:00:56
    #4
    AzveNET adlı üyeden alıntı: mesajı görüntüle
    $notify = array("body_loc_key" => "label_newuser_notify", "username"=> $username,"priority" => "high");

    $post = array(
    'registration_ids' => $fcm_ids,
    'notification' => $notify,
    'priority' => "high",
    'data' => $this->data,
    'content_available' => true,
    );

    Php tarafı Şu şekilde olacak anladığım kadarıyla üstadım değilmi?
    Birde ben fcm idleri db den çekip gönderitorum normalde. Bunun yerine /topic/all yapsam yine hepsine gidiyor sanırım.
    Ve bu topic olayını cihaz diline göre gönderebiliyor muyuz? İlave bişey yapmamız gerekirmi yapılabilşyorsa?
    Evet, doğru anlamışsınız. PHP tarafındaki kod örneği şu şekilde olacaktır:

    $notify = array("body_loc_key" => "label_newuser_notify", "username"=> $username,"priority" => "high");
    
    $post = array(
        'registration_ids' => $fcm_ids,
        'notification' => $notify,
        'priority' => "high",
        'data' => $this->data,
        'content_available' => true,
    );
    örneğin, $notify dizisinde bildirim için gerekli parametreleri belirtir ve $post dizisinde bildirimi göndermek için gereken diğer parametreleri belirtir. registration_ids alanına FCM ID'lerini sağlamanız gerekmektedir.

    Evet, /topics/all kullanarak bildirim gönderirseniz, bu bildirim tüm cihazlara gidecektir. /topics/all hedefe sahip tüm aboneleri temsil eder.

    Ancak cihaz diline göre bildirim göndermek için /topics/all kullanmanız yeterli olmayacaktır. Firebase Messaging, cihaz diline göre bildirim göndermek için özel bir mekanizma sunmamaktadır. Bunun yerine, Android tarafında farklı dil ayarlarına sahip kullanıcılara farklı bildirimler göndermek için istemci tarafında uygulama düzeyinde bazı işlemler yapmanız gerekecektir.

    Örneğin, Android istemcinizde dil seçeneği değiştiğinde veya uygulama başlatıldığında dil bilgisini sunucuya iletebilirsiniz. Sunucu, kullanıcının diline göre uygun bildirimi seçebilir ve FCM ile bu bildirimi gönderebilirsiniz.
    function getUserLanguage() {
        $acceptLanguage = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
        $languages = explode(',', $acceptLanguage);
        // İlk dil tercihini alabilirsiniz
        $userLanguage = strtolower(substr(chop($languages[0]), 0, 2));
        return $userLanguage;
    }
    
    $userLanguage = getUserLanguage();
    1. Kullanıcının dilini oturum (session) değişkeniyle saklama:
    session_start();
    
    // Dil bilgisini oturum değişkenine kaydetme
    $_SESSION['language'] = 'en'; // Örnek olarak "en" (İngilizce) olarak ayarladık
    
    // Dil bilgisini almak için oturum değişkenini kullanma
    $userLanguage = $_SESSION['language'];
    // Örnek URL: r10.net?lang=en
    $userLanguage = $_GET['lang'];
    Yukarıdaki örnekler, kullanıcının dil bilgisini almanızı sağlayacak temel yöntemlerdir. Hangi yöntemi kullanacağınız, uygulamanızın gereksinimlerine ve yapısına bağlı olacaktır. Dil bilgisini aldıktan sonra, bu bilgiyi kullanarak uygun bildirimi seçip FCM ile gönderebilirsiniz.

    Bu durumda, sunucu tarafındaki PHP kodunda kullanıcının dil bilgisini alacak bir mekanizma olması gerekecektir. Kullanıcının dil bilgisini doğrudan FCM kullanarak belirtme imkanı bulunmamaktadır. Dil bilgisini alarak sunucu tarafında ilgili bildirimi seçip göndermeniz gerekmektedir.

    Örnek: Accept-Language

    function getUserLanguage() {
        $acceptLanguage = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
        $languages = explode(',', $acceptLanguage);
        $userLanguage = strtolower(substr(chop($languages[0]), 0, 2));
        return $userLanguage;
    }
    
    $userLanguage = getUserLanguage();
    
    $notificationText = '';
    
    if ($userLanguage === 'tr') {
        $notificationText = 'Merhaba, yeni bir kullanıcı kaydoldu.';
    } elseif ($userLanguage === 'en') {
        $notificationText = 'Hello, a new user has signed up.';
    } else {
        $notificationText = 'Hello, a new user has signed up.';
    }
    
    $notify = array(
        'body' => $notificationText,
        'priority' => 'high'
    );
    
    $post = array(
        'registration_ids' => $fcm_ids,
        'notification' => $notify,
        'priority' => 'high',
        'data' => $this->data,
        'content_available' => true,
    );
    Bu örnekte, getUserLanguage() fonksiyonu ile kullanıcının dil tercihini alıyoruz. Ardından, dil tercihine göre bildirim metnini belirliyoruz. Eğer kullanıcının dili Türkçe (tr) ise "Merhaba, yeni bir kullanıcı kaydoldu." mesajını, İngilizce (en) veya başka bir dil ise "Hello, a new user has signed up." mesajını kullanıyoruz.

    Sonra, bildirim için gerekli diğer parametreleri belirleyerek $notify ve $post dizilerini oluşturuyoruz. $notify dizisi bildirim metnini ve önceliğini içerir. $post dizisi ise FCM ID'lerini, bildirimi, önceliği ve diğer verileri içerir. Örneğin, dil metinlerini bir dil dosyasından veya veritabanından okuyabilirsiniz.
  • 15-06-2023, 16:28:40
    #5
    class gcm extends db_connect
    {
        private $accountId = 0;
        // private $url = "https://android.googleapis.com/gcm/send";
        private $url = "https://fcm.googleapis.com/fcm/send";
        private $ids = array();
        private $data = array();
    
        
        public function __construct($dbo = NULL, $accountId = 0)
        {
            parent::__construct($dbo);
    
            $this->accountId = $accountId;
    
            if ($this->accountId != 0) {
    
                $stmt = $this->db->prepare("SELECT fcm_regId, lang FROM access_data WHERE accountId = (:accountId) AND removeAt = 0 AND appType > 1 AND fcm_regId <> ''"); // appType = 1 -> APP_TYPE_WEB
                $stmt->bindParam(":accountId", $accountId, PDO::PARAM_INT);
    
                if ($stmt->execute()) {
    
                    while ($row = $stmt->fetch()) {
    
                        [COLOR=#E25041]$this->addDeviceId($row['fcm_regId']);[/COLOR]
                        
                    }
                }
            }
        }
    
        
        public function setIds($ids)
        {
            [COLOR=#E25041]$this->ids = $ids;[/COLOR]
        }
    
        public function getIds()
        {
            return $this->ids;
        }
    
        public function clearIds()
        {
            $this->ids = array();
        }
    
        public function sendToAll()
        {
            $laps = ceil(count([COLOR=#E25041]$this->ids[/COLOR]) / 999);
    
            if ($laps == 1) {
    
                $this->send();
            }
    
            $mod = count([COLOR=#E25041]$this->ids[/COLOR]) % 999;
    
            $marker = 0;
    
            $delivered = 0;
            $status = 0;
    
            while ($laps > 0) {
    
               [COLOR=#E25041] $fcm_ids = array();[/COLOR]
                
                if ($laps == 1) {
    
                    $n = $marker + $mod;
    
                } else {
    
                    $n = $marker + 999;
                }
    
                for ($i = $marker; $i < $n; $i++) {
    
                    [COLOR=#E25041]$fcm_ids[] = $this->ids[$i];[/COLOR]
                    
                }
    
                $marker = $marker + 999;
    
                // Send
    
                $delivered = $delivered + $this->send_to([COLOR=#E25041]$fcm_ids[/COLOR]);
    
                $laps--;
            }
    
            if ($delivered > 0) {
    
                $status = 1;
            }
    
             $this->addToHistory($this->data['msg'], $this->data['type'], $status, $delivered);
        }
    
        public function send_to([COLOR=#E25041]$fcm_ids[/COLOR])
        {
            $result = array("error" => true,
                            "description" => "regId not found");
    
            if (empty($fcm_ids)) {
    
                return $result;
            }
    
    
    
    
    
            $username="Ayse";
    
            if ($lang_ids=="tr") {
                $mmm = $username." üye oldu";
                }else{    
                        $mmm = $username." стала учасником";
            }
            
    $notify = array("body" => $mmm, "priority" => "high");
            $post = array(
                'registration_ids'   => $fcm_ids,
                'notification'       => $notify,
                'priority'           => "high",
                'data'               => $this->data,
                'content_available'  => true,
            );
    
            $headers = array(
                'Authorization: key=AAAALLMnDgg:xxxxxxxxxxx-xxxxxx',
                'Content-Type: application/json'
            );
    
            $ch = curl_init();
    
            curl_setopt($ch, CURLOPT_URL, $this->url);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post));
    
            $result = curl_exec($ch);
    
            if (curl_errno($ch)) {
    
                $result = array("error" => true,
                                "failure" => 1,
                                "description" => curl_error($ch));
            }
    
            curl_close($ch);
    
            $obj = json_decode($result, true);
    
            return $obj['success'];
        }
    
        public function send()
        {
            $result = array("error" => true,
                            "description" => "regId not found");
    
            if (empty($this->ids)) {
    
                return $result;
            }
             //         $notify = array("body_loc_key" => "label_newuser_notify", "priority" => "high");
            //$notify = array('priority'=> "high");
    
            
            $username="Ayse";
                    if ($lang_ids=="tr") {
                $mmm = $username." üye oldu";
                }else{    
                        $mmm = $username." стала учасником";
            }
            
    
    $notify = array("body" => $mmm, "priority" => "high");
            $post = array(
                'registration_ids'   => $fcm_ids,
                'notification'       => $notify,
                'priority'           => "high",
                'data'               => $this->data,
                'content_available'  => true,
            );
    
            $headers = array(
                'Authorization: key=' . GOOGLE_API_KEY,
                'Content-Type: application/json'
            );
            
            $ch = curl_init();
    
            curl_setopt( $ch, CURLOPT_URL, $this->url);
            curl_setopt( $ch, CURLOPT_POST, true);
            curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);
            curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode($post));
    
            $result = curl_exec($ch);
    
            if (curl_errno($ch)) {
    
                $result = array("error" => true,
                                "failure" => 1,
                                "description" => curl_error($ch));
            }
    
            curl_close($ch);
    
            $obj = json_decode($result, true);
    
            $status = 0;
    
            if ($obj['success'] != 0) {
    
                $status = 1;
            }
    
            $this->addToHistory($this->data['msg'], $this->data['type'], $status, $obj['success']);
    
            return $result;
        }
    
        private function addToHistory($msg, $msgType, $status, $success)
        {
            if ($msgType == 1 || $msgType == 2 || $msgType == 8) {
    
                $currentTime = time();
    
                $stmt = $this->db->prepare("INSERT INTO gcm_history (msg, msgType, accountId, status, success, createAt) value (:msg, :msgType, :accountId, :status, :success, :createAt)");
                $stmt->bindParam(":msg", $msg, PDO::PARAM_STR);
                $stmt->bindParam(":msgType", $msgType, PDO::PARAM_INT);
                $stmt->bindParam(":accountId", $this->accountId, PDO::PARAM_INT);
                $stmt->bindParam(":status", $status, PDO::PARAM_INT);
                $stmt->bindParam(":success", $success, PDO::PARAM_INT);
                $stmt->bindParam(":createAt", $currentTime, PDO::PARAM_INT);
                $stmt->execute();
            }
        }
    
        public function forAll()
        {
            $stmt = $this->db->prepare("SELECT fcm_regId, lang FROM access_data WHERE removeAt = 0 AND appType > 1 AND fcm_regId <> ''"); // appType = 1 -> APP_TYPE_WEB
    
            if ($stmt->execute()) {
    
                while ($row = $stmt->fetch()) {
    
                    [COLOR=#E25041]$this->addDeviceId($row['fcm_regId']);[/COLOR]
                    //$this->addDeviceId($row['lang']);
                }
            }
        }
    şeklindeki kodla anlaşıldığı üzere fcm_regId alınıp parçalı şekilde tüm üyelere gönderiliyor. body_loc_key ile gönderemedim bir türlü yerel dilde. bende @OmerAti; üstadın dediği gibi db den çekerek göndereyim dedim. bu normalde hazır bi uygulama. düzenlemeye çalışıyorum sadece. lang fieldı ekleyip bunu dbde tutayım dedim. bu aşamada maalesef fcm_regId ile birlikte bir türlü "lang" fieldını alamadım. yardımcı olabilecek arkadaş var mı? bir kaç denemem oldu ancak hep "else" olarak gönderdi boş geldiği için..
  • 15-06-2023, 18:40:15
    #6
     
    public function forAll()
    {
        $stmt = $this->db->prepare("SELECT fcm_regId, lang FROM access_data WHERE removeAt = 0 AND appType > 1 AND fcm_regId <> ''");
    
        if ($stmt->execute()) {
    
            while ($row = $stmt->fetch()) {
    
                $deviceInfo = array(
                    'fcm_regId' => $row['fcm_regId'],
                    'lang' => $row['lang']
                );
    
                $this->addDeviceId($deviceInfo);
            }
        }
    }


    Bu şekilde, forAll fonksiyonu içinde fcm_regId ve lang değerlerini içeren bir ilişkisel dizi oluşturuyoruz ($deviceInfo). Ardından bu diziyi addDeviceId fonksiyonuna gönderiyoruz. Daha sonra addDeviceId fonksiyonunda ilgili değerlere erişebilirsiniz.
    Bu düzenlemeyi yaptıktan sonra sendToAll fonksiyonunda send_to fonksiyonunu çağırırken lang değerini alarak kullanabilirsiniz.

    public function send_to($deviceInfo)
    {
        $fcm_id = $deviceInfo['fcm_regId'];
        $lang = $deviceInfo['lang'];
    
        // Diğer işlemler...
    }
  • 05-08-2023, 12:51:08
    #7
    Çok enteresan şekilde stringi java içinde user = "user" Olarak belirtip almaya çalışsamda yinede %1$s olarak geliyor.
    Ama data ve notify içindekilerde bir sorun yok. Bildirimde geliyor ama bir türlü %1$s i yazdıramadım...