自动后台通知Firebase数据库

3


我开发了一个应用程序,其中一个功能是校长的更新通知。为此,我使用Firebase实时数据库。我希望该应用程序在添加新的孩子(消息)时自动发送通知(后台)。

这是我读取代码(swift):

var messages = [Message]()

override func viewDidLoad() {
    super.viewDidLoad()

    observeMessages()
}

func observeMessages() {
    let dbRef = FIRDatabase.database().reference().child("messageS")
    dbRef.observe(.childAdded, with: { (snapshot) in

        if let dictionary = snapshot.value as? [String: AnyObject] {
            let text = Message()
            text.setValuesForKeys(dictionary)
            self.messages.insert(text, at: 0)


            DispatchQueue.main.async(execute: {
                self.tableView.reloadData()
            })
        }

        }, withCancel: nil)
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return messages.count
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "cellId")

    let message = messages[indexPath.row]
    cell.textLabel?.text = message.title
    cell.textLabel?.textAlignment = .center
    cell.detailTextLabel?.text = message.message
    cell.detailTextLabel?.textAlignment = .right

    // Configure the cell...

    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {


    let message = messages[indexPath.row]
    let title = message.title
    let msg = message.message
    let controller = UIAlertController(title: title, message: msg, preferredStyle: .alert)
    let cancelAction = UIAlertAction(title: "סגור", style: .cancel) { (handler) in
        // Any action when you cancel
    }
    controller.addAction(cancelAction)
    self.present(controller, animated: true, completion: nil)

}

这是我的 Swift 代码:

@IBOutlet weak var MessageTitle: UITextField!
@IBOutlet weak var MessageText: UITextField!
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}

func post() {
    let title: String = MessageTitle.text!
    let message: String = MessageText.text!

    let post: [String: AnyObject] = ["title": title as AnyObject,
                                    "message": message as AnyObject]
    let dbRef = FIRDatabase.database().reference()
    dbRef.child("messageS").childByAutoId().setValue(post)



}
@IBAction func Publish(_ sender: AnyObject) {
    post()



    let MessageSent = UIAlertController(title: "נשלח", message: "ההודעה נשלחה בהצלחה", preferredStyle: UIAlertControllerStyle.alert)
    MessageSent.addAction(UIAlertAction(title: "תודה", style: UIAlertActionStyle.default, handler: nil))
    self.present(MessageSent, animated: true, completion: nil)

}

这是我的阅读代码(Android):

private Firebase mRef;
public ArrayList<String> messages = new ArrayList<>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_updates);

    mRef = new Firebase("https://ksharet-d6a24.firebaseio.com");
    mRef.child("messageS");
    // Get ListView object from xml
    final ListView listView = (ListView) findViewById(R.id.ListView);

    // Create a new Adapter
    final ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
            android.R.layout.simple_list_item_1, messages);

    // Assign adapter to ListView
    listView.setAdapter(adapter);


    mRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                Message message = postSnapshot.getValue(Message.class);
                messages.add(0, message.getTitle() + '\n' + message.getMessage());
            }
            adapter.notifyDataSetChanged();

        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {
        }
    });
}

这是我编写的 Android 代码:

private Button sendData;
private Firebase mRef;
private EditText messageBox = (EditText) findViewById(R.id.MessageText);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_publish);

    Firebase.setAndroidContext(this);

    mRef = new Firebase("https://ksharet-d6a24.firebaseio.com/");
    mRef.child("message");
    sendData = (Button) findViewById(R.id.sendMessage);

    sendData.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String message = messageBox.getText().toString();
            //Firebase mRefChild = mRef.child("message");
            //mRefChild.setValue(message);
            mRef.push().setValue(message);


        }
    });
}

我应该在代码中创建或更改什么(如果可以的话,针对iOS和Android)。 我最近购买了苹果开发者计划会员资格,很快就会激活。
感谢各位帮手。

你遇到的实际问题是什么? - shallowThought
@shallowThought 我想在后台自动推送通知,当有新消息到达数据库时。 - A. Inbar
或许有帮助:https://dev59.com/hl8f5IYBdhLWcg3wEPEq - shallowThought
@shallowThought 我希望应用程序可以自动发送,而不是通过控制台手动发送。 - A. Inbar
据我所知,使用Firebase无法在数据更改时发送通知。如果我没错的话,你需要额外的工具。也许可以尝试我指向的帖子中提到的其中一个工具。祝好运。 - shallowThought
我找不到,有人可以指导我吗?我不介意使用外部工具(它应该像聊天应用程序通知一样)。 - A. Inbar
1个回答

0

经过长时间的寻找解决方案,我发现了一种非常简单的方法,就是使用Cloud Kit。这是Brian Advent的教程:

https://youtu.be/BXl5o5_2aEU
我建议您先看他的第一个视频:https://youtu.be/XQ3nLV2778U,然后只需做几件事情。

编辑:2017年

现在我们可以使用Firebase云函数来在数据库更改时发送推送通知。


我没有......我唯一拥有的是当您进入活动时的通知。 - A. Inbar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接