【问题标题】:Xamarin android FCM Notification Client to client(phone to phone)Xamarin android FCM 通知客户端到客户端(电话到电话)
【发布时间】:2018-08-23 18:21:27
【问题描述】:

我遵循https://docs.microsoft.com/en-us/xamarin/android/data-cloud/google-messaging/remote-notifications-with-fcm?tabs=vswin 中的教程并设法使服务器到客户端通知。

我在 java 中找到了一些教程和示例,但我需要在 Xamarin android 平台上制作。

我需要制作将通知从一部手机发送到一部手机的应用程序,该手机是客户端到客户端并且仍在使用 FCM,有人有我可以挖掘的想法或示例代码吗?

【问题讨论】:

  • 你只能从服务器firebase.google.com/docs/cloud-messaging/admin/send-messages发送消息。您正在寻找的很可能是客户端 -> 服务器 -> FCM -> 客户端。您还可以将 Cloud Functions 用于使用 HTTPS 端点将客户端指向的无服务器环境。
  • @ charlescrete您可以将手机视为服务器,因为无论您的服务器还是手机都只使用HTTP向FCM发送请求,然后FCM将通知发送到另一部手机。所以 FCM 只需要一个 HTTP 请求。
  • 对于 HTTP 请求,你有没有 @joe-lv-msft 的例子
  • 我在link 阅读了有关它的文档,但我不明白,因为我是新手。
  • 您需要在您的应用程序上拥有管理员凭据,这对于生产应用程序是极不推荐的。对于测试应用程序,这很好,但您还需要一种管理 FCM 令牌的方法,服务器也派上用场

标签: android firebase xamarin firebase-cloud-messaging


【解决方案1】:

首先,请按照this一步一步完成,然后您将获得基础应用程序。

其次,添加发送Http到FCM服务器的按钮:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  <TextView
      android:text=" "
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/msgText"
      android:textAppearance="?android:attr/textAppearanceMedium"
      android:padding="10dp" />
  <Button
    android:id="@+id/bt"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
</LinearLayout>

初始化OnCreate中的按钮:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);

    // Set our view from the "main" layout resource
    SetContentView(Resource.Layout.Main);
    msgText = FindViewById<TextView>(Resource.Id.msgText);
    IsPlayServicesAvailable();
    Button bt = FindViewById<Button>(Resource.Id.bt);
    bt.Click += Bt_Click;

}

这里我使用了两个类来生成json字符串,我使用的是json.net

class Mes
{
    public string to;
    public Noti notification;
    public Mes(string to,Noti notification){
        this.to = to;
        this.notification = notification;
    }
}
class Noti {
    public string title;
    public string text;
    public Noti(string body,string text) {
        this.title = body;
        this.text = body;
    }
}

点击事件(我用的是okhttp3):

 private void Bt_Click(object sender, System.EventArgs e)
{

    Mes mes = new Mes("your token",
        new Noti("great","yes"));
    string json = JsonConvert.SerializeObject(mes);
    Log.Error("json",json);
    OkHttpClient client = new OkHttpClient();
    RequestBody body = RequestBody.Create(
    MediaType.Parse("application/json; charset=utf-8"),json);
    Request request = new Request.Builder()
        .Url("https://fcm.googleapis.com/fcm/send")// this is the base url which you can find it from  https://firebase.google.com/docs/cloud-messaging/http-server-ref?#params
        .Post(body)
        .AddHeader("Authorization", "your app key")// find it from this case https://stackoverflow.com/questions/37337512/where-can-i-find-the-api-key-for-firebase-cloud-messaging
        .Build();

    // Synchronous blocking call

    client.NewCall(request).Enqueue(
        (call, response) => {
        // Response came back
        string body1 = response.Body().String();
        Log.Error("lv",body1);
        }, (call, exception) => {
            // There was an error
            Log.Error("lv", exception.Message);
        });
}

点击按钮后,您会收到通知(如果您已完成第一个链接),另外,您不需要发送通知,您可以使用数据做其他事情。

更新 1:

将您的 MyFirebaseIIDService 更改为:

public class MyFirebaseIIDService : FirebaseInstanceIdService
{
    const string TAG = "MyFirebaseIIDService";
   public static string token;
    public override void OnTokenRefresh()
    {
         token = FirebaseInstanceId.Instance.Token;
        Log.Debug(TAG, "Refreshed token: " + token);
        SendRegistrationToServer(token);
    }
    void SendRegistrationToServer(string token)
    {
        // Add custom implementation, as needed.
    }
}

然后使用这个:

Mes mes = new Mes(MyFirebaseIIDService.token,new Noti("great","yes"));

更新 2:

    Request request = new Request.Builder()
        .Url("https://fcm.googleapis.com/fcm/send")
        .Post(body)
        .AddHeader("Authorization", "key=AAAAjPn9-TY:APA91bE-g4774KmFI72V1gWATmK8uta7N7NgcufoEgGgdidU9wyWBQ5YagCjP0WPBKrgILHZSVeb1I9vegYC-YfFHE2umWWcTzjo-t7W8ynDkwbB6qHY7JZExaxxvlI3VIg3d66sFZ40")
        .Build();

这是我的http请求,注意AddHeader方法,你需要使用key=...

【讨论】:

  • 嗨@JoeLv-MSFT,出现错误请求缺少身份验证密钥(FCM 令牌),尽管我已经在以下位置插入了我的令牌:` Mes mes = new Mes("my token", new通知(“很棒”,“是”));`
  • 如果您重新安装应用程序,令牌将被刷新。每次安装应用时,令牌都会有所不同。
  • 或者你可以在手机B上安装app,得到手机B的token,然后用手机B的token在手机A上安装App。
  • 仍然缺少身份验证密钥,因为我使用服务器或服务器旧密钥 @JoeLv-MSFT
  • 嗨,@yusala,我无法理解。对我来说效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多