iOS常见问题

iOS常见问题

1. iOS的ClientID,deviceToken如何获取?

  • 在Xcode的origanizer->device选择你的设置,然后在consloe里查看日志,会输出如下:clientID:a38dbe81c7bbfb93824*****2d5fec4f
  • [GexinSdk] CID gotten, try to bind deviceToken: de6db71117068c89cbf4827b1fb6baa**********8d53644ec2c296da5f6dc16.
  • 需要注意的是devicetoken从苹果那边获取到后是有空格区分的,需要把空格去掉。

2. iOS应用退到后台接收不到消息?

  • iOS应用只能用透传消息模版TransmissionTemplate来推送消息。
  • 先去查看ClientID和APPID绑定是否对应。
  • 查看template.setAPNInfo(payload)中payload各字段是否设置正确。
  • 查看离线时间有没有设置:message.setOffline(true),如下图。
    img_22
  • toApp的话,查看phoneTypeList()是否设置有误。
  • 开发者平台故障排查中可根据Clientid查看devicetoken,确认Clientid和devicetoken绑定是否正确。如果没有绑定成功则可能因网络问题导致信息没有提交上来,24小时后会自动更新绑定关系(如果是测试过程,则可以找技术支持协助处理一下)。

3. 在发布到appstore时,证书需要更换吗?

  • 开发的时候需要上传开发证书,开发测试OK后,发布到appstore之前,需要把证书更换成生产证书,证书更换后10分钟左右生效。

4. 未找到应用程序的“aps-environment”的权利字符串" 问题

报错内容:

error    NSError * domain: @"NSCocoaErrorDomain" - code: 3000    0x17e83560

NSObject NSObject          

isa    Class         NSError    0x3917ee90

_reserved         void *        NULL         0x00000000

_code       NSInteger         3000         3000

_domain  __NSCFString *         @"NSCocoaErrorDomain"       0x17e26d80

_userInfo __NSDictionaryI *    1 key/value pair        0x17e29110

[0]    (null)         @"NSLocalizedDescription" : @"未找到应用程序的“aps-environment”的权利字符串"      

key   __NSCFConstantString * @"NSLocalizedDescription"    0x39185db0

value         __NSCFString *         @"未找到应用程序的“aps-environment”的权利字符串"      0x1be0ea90


  • 在Demo-info.plist中加aps-environment字段,或development字段,或production字段提示哪个加哪个。
    img_23
  • 在用到Push Notification的时候很容易碰到这个问题,解决办法也比较简单,第一,确认你在apple dev portal里面把相应appid做成类似com.company.appname这样子,然后在profile配置里面点configure,把sandbox或者product的push打开,最后把这个profile download下来,装到手机和xcode里面去,这里要注意,一定要先把push的功能在configure里面配置好了然后再download这个profile,更新手机和Xcode,如果你记不清楚了到底是先download还是先configure的,那么一个最保险的办法就是先configure好了,然后到profile那里点击modify,把profile改成一个新的名字,把这个新的profile安装到手机和Xcode里面,这样就没有问题了。

5. 无效的devicetoken问题

  • 一般来说是证书环境的问题。
  • 先看clientID和devicetoken绑定是否有问题,可以把clientID和devicetoken提供给技术支持协助查询。
  • 查看本地(Xcode)的.cer证书环境与平台上传的.p12推送证书环境是否一致。
  • 证书的生成,请参考 创建Apple应用并创建APNs推送证书 文档。

6. iOS应用如何让角标badge自动加1?

  • 这个需要客户端与服务端进行协助处理,但只适合用对单个用户进行推送,群推和批量推送都不适合。目前java和restAPI支持自动累加,autobadge(+1)。
  • 客户端读取未读数量并汇报给服务端,当未读数量更新时也要汇报给服务端。
  • 服务端接收到未读数量后对应用户ID保存起来,当服务端进行推送消息时先去查询未读数量,然后再根据未读数量进行加1后调用API接口进行推送。

7. 其他常见iOS问题

(1)个推开发者平台上上传推送证书的地方,鼠标移至证书密码处有个测试一下,测试一下使用devicetoken,返回可用,无效,连接失败三种情况的说明?

  • 返回可用:说明客户端环境与上传的证书环境是一致的,这种情况测试一下,手机上会收到一条测试消息
  • 返回无效:说明客户端环境与上传的证书环境是不一致的或者上传证书的builder Id与客户端应用的不一致 。一般情况下,连着xcode调试的,对应开发环境;打成正式包上传app store的或者 ad hoc的模式包,对应生产环境
  • 连接失败:说明上传的证书有问题,需要根据官网http://docs.getui.com/mobile/ios/apns/步骤重新导出上传下。

(2)iOS客户端收到apn通知,点击通知跳转到应用内对应页面的实现

  • 服务端设置apn代码中通过addCustomMsg参数,参照php的代码$apn->add_customMsg("payload","阿波罗度上市"); ,添加apn自定义参数,当客户端收到apn通知栏提醒并点击会触发客户端didreceiveremotenotification方法,获取这个payload参数数据,获取到之后你可以自己解析处理跳转。
  • 扩展场景:部分用户希望效果是先打开app首页,再跳转到指定的页面;该场景对应的是在transmissioncontent中添加对应参数,客户端收到通知后打开app首页,在didrecevierpayload中拿到transmissioncontent的内容,然后处理跳转。

(3)证书切换多久会生效

  • 官网平台ios切换证书10分钟生效。如果是不同环境证书的切换,devicetoken测试一下返回是测试可用的,但是通过个推推送收不到消息,应用可以卸载重装一下,cid和devicetoken会重新绑定。

(4)(void)bindAlias:(NSString )alias andSequenceNum:(NSString )aSn

  • aSn这个值是为了区分请求的唯一值,例如,多次请求命令时,在返回结果的回调中区分是哪次的请求命令,不然回调中不知道是哪次的请求结果,这个值开发者可以自己定义。

(5)iOS推送流程说明

  • iOS的消息是分两部分的:一部分是走APNs的通知栏消息,另一部分是走个推通道的透传消息。这两部分是服务端推送代码里面应用设定好的,分别是两个不同的方法。如果消息下发的时候,当应用是在后台的(也就是应用是离线)那么会收到APNs的通知,透传消息就进离线了;只有当APP下次在线的时候(也就是下次应用到前台的时候)才会通过个推通道下发,如果当下发的时候应用是在前台的,客户端就直接收到透传消息。

(6)iOS调用的模板说明

  • 调用个推文档中心,根据您使用到的语言,找到推送模板中的透传消息transmissiontemplate加setapninfo的方法

(7)ios自制通知栏铃声

  • 把自制好的的铃声添加到项目的main bundle中后,在项目设置中Build Phases-Copy Bundle Resources中添加你的铃声文件,铃声文件不能超过30秒 ;推送的时候在apninfo中的setsound中设置文件名全称即可。

(8)为什么客户端在打开的情况下,会接收到弹框消息?

iOS客户端在打开的情况下是走个推通道的,只能推送透传消息,如果接收到弹框消息,有两种可能性

  • 第一:需要看一下服务端用的推送模版是不是notification template,模板要修改成透传消息模版:TransmissionTemplate。
  • 第二:是不是客户端接收到透传消息后自己处理成了弹框展示,自己写的通知栏消息。

(9)iOS应用在后台收不到apns通知是什么原因有哪些?

  • 第一:服务端推送的话,代码看下是否有设置setapninfo的方法,是否设置了离线(isoffline=true)。
  • 第二:客户端看下devicetoken是否有获取到,获取到了,应用配置里面上传证书的地方有个测试一下,测试看看返回什么结果,返回测试可用才说明证书环境是一致的。
  • 第三:ios推送证书检查一下是否过期了,上传证书的地方,可以看到证书的有效期,如果已经过期了,证书重新导出,然后上传。
  • 第四:以上情况都正常的话,可以提供taskid让技术人员查询一下具体的日志。

(10)iOS推送,在推送平台上为什么找不到iOS选项?

  • iOS只能推送透传信息,原因是iOS应用在后台本来就会有APNs通知,如果再推送通知,点击APNs通知进入应用,又会收到一次通知,这样会影响客户使用。
  • 另外的话,推送通知的话,应用在前台会收到一个iOS 7风格的弹框,这种弹框没办法去除的,也影响使用。

(11)iOS平台上传证书的问题

  • 目前个推平台上一个应用只能上传一个证书,为了避免证书来回切换,导致cid和devicetoken的绑定关系为空,建议在平台上登记2个应用,一个上传开发环境,一个上传生产环境 测试的时候用开发环境,应用发布之后用生产环境。

(12)别名绑定的问题

error:Error Domain=GexinSdk Code=30003 "Request to be filtered !" UserInfo={NSLocalizedDescription=Request to be filtered !}
  • 别名绑定一天有频次限制,超过次数之后,请求会被过滤,之后什么时候可以重新绑定,第一次过滤的请求之后的24小时,才可以重新绑定。