iOS常见问题

iOS常见问题

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

  • 在Xcode的origanizer->device选择你的设置,然后在console.app(控制台.app)里查看日志,会输出如下:client:a38dbe81c7bbfb93824*****2d5fec4f;或者在客户端CID回调中获取如下:

    /// [ GTSDK回调 ] SDK启动成功返回cid
    - (void)GeTuiSdkDidRegisterClient:(NSString *)clientId {
       NSLog(@"[ TestDemo ] [GTSdk RegisterClient]:%@", clientId);
    }
    
  • sdk>=2.5.2.0版本,是需要使用个推注册远程通知权限,个推内部自动获取devicetoken并上报,开发者若想拿到devicetoken仍可以通过苹果原生回调api去获得。

    - (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
    
  • 需要注意的是devicetoken从苹果那边获取到后是有空格区分的,需要把空格去掉。

2.iOS推送流程说明

  • 当CID在线(即app在前台打开运行)时,消息通过个推通道下发到客户端,具体到服务端Rest-V2代码中,即push_message中的 transmission 内容传递给客户端。

  • 当CID离线(即app在后台、锁屏、app杀死状态)时,消息将通过个推侧请求对应厂商侧的服务端,具体到服务端Rest-V2代码中,即push_channel中的iOS中的内容请求给苹果的服务端,由苹果进行推送。

    注意:在默认的推送策略下,iOS若先走了苹果离线通道,在消息有效期内,app打开在前台时,push_message中的 transmission 内容还将通过个推通道传递给客户端,此时可通过客户端 GeTuiSdkDidReceiveSlience 回调中的参数 offLine 的值来判断是否经过APNs通道,详情请查看iOSAPI接口说明

3.iOS在线收不到消息

个推后台界面

  • 通知消息下发:如没有开通vip(查看策略旁边的vip标识是否亮起),应用在前台是收不到消息。需要联系商务开通vip权限才支持策略,这样应用在前台也可以收到消息
  • 透传消息下发:透传消息需要开发者在客户端 GeTuiSdkDidReceiveSlience 透传回调中,接收透传消息并根据自身业务场景进行消息的展示方式处理,默认不处理的话是没有任何展示的,透传消息个推只负责传递。

接口推送

  • 若是默认推送策略下,服务端Rest-V2中push_message中使用transmission模板消息,需要客户端自己在透传回调方法中解析透传内容,实现弹通知iOS推送,若是默认推送策略下,在线需要使用透传消息(如服务端Rest-V2中push_message中使用transmission模板消息)

注意:确认推送的CID与测试手机关系是否匹配;测试方式:在个推后台【消息推送】-【配置管理】-【故障排查】-【 检测CID的状态及信息】中输入cid,然后多次关闭和打开app,检测每次app状态变化时,cid状态是否也会变化;若发现不对应,重新获取下客户端cid,以新的cid去进行推送测试。

4.iOS离线收不到消息

步骤一:确认CID是否绑定苹果devicetoken

在【消息推送】-【配置管理】-【故障排查】-【 检测CID的状态及信息:】中输入CID查询,看是否会返回苹果devicetoken。

若返回了具体苹果devicetoken,请按以下说明排查,若还未解决,提供CID和任务ID给个推技术支持

  • 返回的devicetoken后面是否带着【developement】字样;若带着,则说明客户端环境是属于苹果的开发环境,苹果推送对开发环境的支持不稳定,建议使用正式环境去进行推送测试。

步骤二:查询CID未返回devicetoken

  • 切换手机连接网络,卸载重装试下。
  • 请使用真机进行测试,苹果离线推送不支持模拟器。
  • 确认客户端是否正常使用个推去注册苹果远程通知。
  • 使用其他手机安装测试。

步骤三:检测平台上传证书

  • 在【配置管理】-【应用配置】-【测试一下】输入上述步骤查询出来的苹果devicetoken进行推送测试,看手机是否能收到测试信息,若报错则需重新导入苹果推送证书。

步骤四:服务端推送代码问题

  • 老版推送代码需在透传模板中设置上apnpayload的苹果消息体。
  • 新版推送代码需在push_channel中设置上aps的苹果消息体。

5.iOS点击APNs通知跳转应用内对应页面的实现

  • 新版服务端设置苹果离线消息体代码中通过payload参数去设置,参照添加APNs自定义参数,当客户端收到APNs通知栏提醒并点击会触发客户端 GeTuiSdkDidReceiveNotification方法,获取payload参数数据,获取到之后您可以自己解析处理跳转。( 老版本服务端参照java的代码payload.addCustomMsg("由客户自定义消息key", "由客户自定义消息value"); )

    {
       "ios":{
           "type":"notify",
           "payload":"自定义消息",
           "aps":{
               "alert":{
                   "title":"通知标题",
                   "body":"通知内容"
               },
               "content-available":0,
               "sound":"default"
           },
           "auto_badge":"+1"       
       }
    }
    
    
  • 扩展场景:部分用户希望效果是先打开app首页,再跳转到指定的页面;该场景对应的是在transmissioncontent中添加对应参数,客户端收到通知后打开app首页,在 GeTuiSdkDidReceiveSlience 中拿到transmissioncontent的内容,然后处理跳转。

6. 未找到应用程序的“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字段,根据XCode具体提示操作添加。
  • 在用到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里面,这样就没有问题了。

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

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

8. GTSDK 和 GTExtensionSDK 类冲突问题

如下图所示,如果出现 GTSDK 和 GTExtensionSDK 两个库中类冲突问题,原因是将两个库合成到同一个Target上,导致两个库冲突。而个推接入中两个库分别独立使用,GTSDK 在主 Target 上使用,GTExtensionSDK 在 NotificationService Target 上使用,不需要也不能将两个库一起引用到同一个 Target 上。

或是cocoapods集成使用了use_framework!的原因

解决方案:

CocoaPods集成方式: 如下图,在GTExtensionSDK中使用静态库方式配置

手动集成方式: 同一个Target中不要同时集成二个SDK库,GTSDK 在主 Target 上使用,GTExtensionSDK 在 NotificationService Target 上使用。

9. 静默推送是什么?

iOS Silent Notification(静默通知),属于特殊的远程推送通知,其目的不是为了弹出通知框提醒用户,而是用于后台运行的App和服务端同步数据。例:App在后台放置一段时间,网络已不再活跃,App内数据可能已经过时;服务端可推送一条携带参数的静默通知,处于后台的App可以触发静默通知回调,在后台运行状态下获取对应参数并发起网络请求,获取最新数据更新,整个过程用户无感知。

静默通知限制和注意事项:
  • 静默通知主要用于更新和同步数据,用户对其无感知,因此静默通知一般不设置通知标题、内容,声音和角标
  • 静默通知唤醒后台App,最多有30秒的时间处理系统回调
  • 静默推送的优先级低,系统不能保证推送必达,大量的静默推送通知可能被系统将限制。苹果官方建议一个小时不超过2-3条静默推送
  • 不要利用静默通知对App进行保活,APNs若检测到较高频率的静默通知发送请求,可能会终止其发送(具体策略苹果未公开)
  • 具体可以参考相关的苹果官方文档
客户端适配:

收到静默通知时的系统回调:

  • 当收到一个静默推送时,(简称application:didReceiveRemoteNotification:fetchCompletionHandler为方法A)
  • 若APP在前台,将收到个推离线消息回调GeTuiSdkDidReceivePayloadData:andTaskId:andMsgId:andOffLine
  • 若APP在后台,将收到系统回调方法A

10.苹果证书上传后,选开发环境不对,选生产环境也不对;

  • 导证书不要把钥匙串也导进来,解决按着证书生成文档重新导出次,单独选择证书;

11.通知栏中的消息自动消失了?

  • 客户端开发者需要检查是否调用了清除角标的api,若清除了角标则通知栏通知也会被清除掉。

    application.applicationIconBadgeNumber = 0;
    

12.iOS通知栏标题出现[modified]

  • iOS客户端项目全局搜索 [modified] 去掉即可。

13.ios自制通知栏铃声

  • 自定义的音乐文件必须是aiff,wav,caf,mp3,并且不能超过30秒。
  • 把自制好的的铃声添加到项目的main bundle中后,在项目设置中Build Phases-Copy Bundle Resources中添加您的铃声文件 ;推送的时候在apninfo中的setsound中设置通知铃声为包含后缀名的的完整文件名,如:ring.mp3。

14.推送数据中APNs渠道展示数一直为0

  • 由于苹果对外没有提供数据报表统计,因此走APNs通道的展示数和点击数都需要客户端埋点上报给个推统计,否则数据将一直为0。
  • 展示数埋点:客户端需要添加通知扩展并集成GTExtension,做好展示统计埋点。具体参考iOS集成指南第6步。
  • 点击数埋点:GTSDK>=2.5.2.0版本APNs的点击统计,个推已内部做好统计处理,无须开发者手动埋点。

15.其他常见iOS问题

Please Use [GeTuiSdk registerRemoteNotification:]报错

[INFO] GeTuiSdk:Error Domain=com.getui.www Code=-400 "Missing UNUserNotificationCenter Delegate, Please Use [GeTuiSdk registerRemoteNotification:]" UserInfo={NSLocalizedDescription=Missing UNUserNotificationCenter Delegate, Please Use [GeTuiSdk registerRemoteNotification:]}
  • 请只通过个推调用注册通知方法,不要使用其他方式注册通知

crash hookMethods 报错

  • 客户端项目里需要添加 Other Linker Flags: -ObjC

证书替换更新多久生效

  • 官网平台iOS切换证书1分钟生效

pod无法获取最新版本sdk

  • 执行Pod repo update

XCode编译错误__isPlatformVersionAtLeast

  • 请使用最新XCode版本进行编译

后台模式无端被开启

  • 老版本若开启了后台运行,需要再次设置关闭后台模式才会关闭,否则默认开启,开关状态会存储在本地。

    GeTuiSdk runBackgroundEnable:NO
    

离线多媒体推送通知展示不了图片

  • 客户端网络情况不稳定图片未能在消息展示时间内读取导致通知展示无图片。
  • 上传的图片资源过大也会对展示有影响,建议控制图片大小在<=10M 。
  • 设置推送资源下载环境要选不限,如果是仅wifi也可能导致收不到图片。

通知扩展中多媒体推送图片的大小是否可以修改

  • 需要开发者自行通过NotificationContent实现自定义通知UI样式

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

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

上传证书处测试一下返回情况说明

  • 返回成功:说明客户端环境与上传的证书环境是一致的,这种情况测试一下,手机上会收到一条测试消息
  • 返回无效:说明客户端环境与上传的证书环境是不一致的或者上传证书的bundle ID与客户端应用的不一致 。一般情况下,连着XCode调试的,对应开发环境;打成正式包上传app store的或者 ad hoc的模式包,对应生产环境
  • 连接失败:说明上传的证书有问题,需要根据官网证书配置指南步骤重新导出上传下

版本支持情况

  • 推送支持iOS8及以上版本
  • 通知扩展支持iOS10及以上版本

SDK是否包含UIWebView

  • 不包含

iOS推送多媒体资源,手机上点击PUSH进入NotificationService的个推API调用,block回调了error

  • ios-2.6.0.0,GTExtensionSDK-Version: 2.5.4版本之前推送多媒体资源提交给系统的时候必须要指定后缀
  • ios-2.6.0.0,GTExtensionSDK-Version: 2.5.4版本之后优化推送多媒体信息时,如果url中没有扩展名,默认根据apn下发的payload中type字段为扩展名,type默认支持 jpg、mp3、mp4

Xcode15 Network兼容性问题

问题:
部分开发者反馈,sdk启动后就发生crash如下:

经过个推一系列排查和反馈发现:
Xcode15 在target<12时,针对iOS17以下的机型,Network.framework系统库会导致crash。Network.framework是用于socket通信,用于替换原有的GCDSocket方案。苹果官网论坛的反馈回复

解决方案:
方案一:Xcode15 苹果官网要求最低支持target12,官网说明文档, 将target设置成12及以上,即可修复这个系统问题。

方案二:由于部分客户在iOS11仍有一定的用户占比需要支持。那么使用GTCommonSDK 3.1.0.0及以上版本,并且在Info.plist中新增字段GT_MinimumOSVersion Number 内容填写为当前的target值。

但如果开发者调用了objc_copyClassList等runtime方法,xcode存在swift混编不兼容也会导致crash,这种情况则必须使用target≥12。

开发者中心 SDK 下载

文档中心搜索

技术
咨询

微信扫一扫

随时联系技术支持

在线
咨询