前提条件
1.macOS系统,安装了xcode和flutter集成环境
2.有苹果开发者账号
3.有环信开发者账号
(注册地址:https://console.easemob.com/user/register)
4.参考这篇文章https://www.imgeek.org/article/825360043,完成推送证书的创建和上传
集成IM离线推送
1.创建一个新的项目
2.导入flutterSDK
3.初始化环信sdk
void initSDK() async {
var options = EMOptions(
appKey: “你的appkey”,
);
options.enableAPNs("EaseIM_APNS_Developer");
await EMClient.getInstance.init(options);
debugPrint("has init");
}
EaseIM_APNS_Developer是你在环信后台创建的证书名,需要注意,iOS需要上传开发证书和生产证书
4.可以在 _incrementCounter 这个按钮点击事件中调用一下登录操作,到此flutter层的工作已经完成
5.打开原生项目,修改包名,添加推送功能
6.打开AppDelegate 文件 导入im_flutter_sdk,并且在didRegisterForRemoteNotificationsWithDeviceToken方面里面调用环信的registerForRemoteNotifications方法,进行token的绑定
注: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 这个方法填的参数必须是一个字典
如下图所示
2.打开flutter层 调用EMClient.getInstance.customEventHandler方法 需要赋值一个函数,这个函数就是接受来自原生层传递过来的消息
3.此时 点击推送消息 在flutter层就能获取到信息,如图我测试的结果
完毕