融云环境与 provisioning profile 的关系。

关于iOS推送设置可以参考https://doc.rongcloud.cn/im/IOS/5.X/noui/push/apns#%E8%9E%8D%E4%BA%91%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%AF%B9APNs%E7%9A%84%E6%94%AF%E6%8C%81

文档里面提到了环境和 provisioning profile 要匹配,在这里详细描述一下原因。

融云分为开发与生产环境。苹果的推送服务器也分开发环境与发布环境。这两套环境都是完全隔离的。其中融云的开发环境会连接苹果的开发环境;生产环境会连接苹果的发布环境。

当应用请求 deviceToken 时,就需要判断是要向苹果的那个服务器请求,这个依据就是 provisioning profile。当 App 是使用 Dev 的 provisioning profile 打包时,App 就会向苹果的开发环境请求 deviceToken ;当是用 Distribution的provisioning profile 打包时,就会向苹果的发布环境请求 deviceToken。由于环境是隔离的,在一个环境上请求到的deviceToken 是无法在另外一个环境上通过验证的。

当应用连接融云时,会根据 Appkey 来判断时生产还是开发环境。如果是开发环境的 Appkey 就会连到融云的开发环境;如果是生产环境的 Appkey 就会连到融云的生产环境。

当应用成功连接到融云后,就会把获取到的 deviceToken 传到融云服务器上。

当融云服务器需要推送时,就会拿到推送证书和 deviceToken 去对应的苹果服务器推送。也就是说如果应用使用的是开发环境 Appkey,就会连到融云的开发服务器,开发服务器就会拿着开发推送证书和 deviceToken 去苹果的开发服务器推送,因此 provisoning profile 是 Dev 的才行( Dev 的 provisioning profile 才能从苹果的开发服务器获取到 devicetoken )。但如果这个 App 的 provisioning profile 是 Distribution 的,那么他的 deviceToken 是从苹果发布服务器获取的,使用这个 deviceToken 在苹果的开发服务器推送就无法通过验证了。反之亦然。

因此要想推送成功,融云的环境和 App 的 provisioning profile 一定要匹配才行。