前提条件

1.macOS系统,安装了xcode和flutter集成环境

2.有苹果开发者账号

3.有环信开发者账号

(注册地址:https://console.easemob.com/user/register)


4.参考这篇文章https://www.imgeek.org/article/825360043,完成推送证书的创建和上传

集成IM离线推送


1.创建一个新的项目

d511c763df4519315d009311877d06d0.png

2.导入flutterSDK

814ca2aacf6df2cb1b310dd37413952d.png

3.初始化环信sdk

void initSDK() async {

  var options = EMOptions(

    appKey: “你的appkey”,

  );

  options.enableAPNs("EaseIM_APNS_Developer");

  await EMClient.getInstance.init(options);

  debugPrint("has init");

}

6ab0985ab21bbeea2fbdf7b7ca142f6e.pngEaseIM_APNS_Developer是你在环信后台创建的证书名,需要注意,iOS需要上传开发证书和生产证书

4.可以在 _incrementCounter 这个按钮点击事件中调用一下登录操作,到此flutter层的工作已经完成99a6472fc7627e35dee68730d5ba7b1c.png

5.打开原生项目,修改包名,添加推送功能e1642ffeddf0b54f06af18b303a5adeb.png

6.打开AppDelegate 文件 导入im_flutter_sdk,并且在didRegisterForRemoteNotificationsWithDeviceToken方面里面调用环信的registerForRemoteNotifications方法,进行token的绑定0f46c77319cc59c42081471b3bbbd7a7.png

注:IM离线推送机制:

1.环信这边需要针对设备deviceToken和环信的username进行绑定,

2.IMserver 收到消息,会检测接收方是否在线,如果在线直接投递消息,如果不在线,则根据username 取设备的deviceToken

3.根据设备的deviceToken 和 上传的证书给设备推送消息

4.当app第一次运行的时候,就会走didRegisterForRemoteNotificationsWithDeviceToken方法,这个时候绑定token信息会报错,这个时候是正常的,因为你并没有登录,此时SDK内部会保存deviceToken,当你调用登录接口成功之后,SDK内部会进行一次绑定token的操作,

到此,推送功能已经集成完毕,注意测试时建议先把项目杀死,保证该用户已经离线


点击推送获取推送信息

第一种方法 自己做桥接,实现原生层与flutter层做交互

第二种方法 可以利用先有api 实现原生层给flutter层传递消息

今天主要介绍第二种方法

1.打开原生层 在didFinishLaunchingWithOptions和didReceiveRemoteNotification 方法里调用EMClientWrapper.shared().sendData(toFlutter: userInfo) 方法,把需要传递的数据传到flutter层

didFinishLaunchingWithOptions 是在app没有打开的情况下点击推送,从launchOptions里面拿到推送信息

didReceiveRemoteNotification是在 app已经打开的情况下点击推送,从userInfo里面拿到推送信息

注意:EMClientWrapper.shared().sendData 这个方法填的参数必须是一个字典

如下图所示

1e347087e883f8126675e0e6762cd24d.png

2.打开flutter层 调用EMClient.getInstance.customEventHandler方法 需要赋值一个函数,这个函数就是接受来自原生层传递过来的消息59aaa773c91895c9fdcfef1c57bafaeb.png

3.此时 点击推送消息 在flutter层就能获取到信息,如图我测试的结果0c151f687b5d7ac8ab96eb3023df2f8d.png

完毕