第三方推送配置需要注意的事情

首先需要注意的一点是:对于只有一个target的iOS应用(大部分小公司都是如此)来说,一般的环境配置就是根据一个宏定义来定义开发环境,测试环境、线上环境等等。因为只有一个target,所以我们在第三方网页上只需注册一个我们的应用。然后拿到appKey等信息,在用第三方提供的库进行app端的注册。

以极光推送(JPush)为例

极光推送的注册提供了如下方法:

1
2
3
4
5
+(void)setupWithOption:(NSDictionary *)launchingOption
appKey:(NSString *)appKey
channel:(NSString *)channel
apsForProduction:(BOOL)isProduction
advertisingIdentifier:(NSString *)advertisingId

1. 如何设置isProduction的值?

其中的isProduction字段是最容易出错的。isProduction表示是否是发布版本,也就是只要我们的target的scheme切换为release时,都代表发布版本。这个跟我们代码的宏定义定义的线上环境是两个不同的概念。 也就是说,即便我们把环境配置为开发环境,但是scheme切位release,那么我们的版本就是环境为开发环境的发布版本,这一点必须要搞清楚。
那么知道了这个就很好配置了,只需要这样定义isProduction的值:

1
2
3
4
BOOL isProduction = YES;
#if DEBUG
isProduction = NO;
#endif

2. 服务端怎么配置?


以上是JPush官网里截取的一段话,注意蓝色框里面的文字。
我想,所有的第三方平台的设置应该都差不多。

这里的apns_production字段的设置非常容易出错。
因为,这个字段是与iOS客户端的环境配置无关,而与其打包的配置有关。也就是说依赖于客户端。如果客户端安装的是DEBUG版本,则apns_production应该为false,如果客户端安装的是RELEASE版本,则为true

需要注意:客户端的RELEASE 和 DEBUG 指的是编译打包的版本,这个不是环境配置。
一般所说的环境指的是baseURL的不同所对应的:开发、测试、线上环境。

一般来说,我们的服务端都是这样配置的:如果客户端所用的服务是线上环境,则apns_productionture,否则为false。这样一来,一般就会出现我们用Xcode在手机上跑起来的应用,如果是开发环境的话可以收到推送,而如果是线上环境就不能收到推送,但是发布到appstore的线上版本又可以收到推送。

这里的原因是:当客户端配置的线上环境时,服务端设置apns_productiontrue,而我们打包编译的一般是DEBUG版本,那么apns_production其实应该为false。这也就是为什么会出现上面那种情况的原因。

那么,服务端到底应该怎么配置apns_production的值呢?我认为这个应该由客户端主动上传给服务端,而不是服务端自己来决定。