• (iOS)推送常见问题


    1.为什么启动的时候出现 Did Fail To Register For Remote Notifications With Error的错误
    程序运行的时候出现下面的错误信息:

    did Fail To Register For Remote Notifications With Error: Error Domain=NSCocoaErrorDomain Code=3000 "未找到应用程序的“aps-environment”的权利字符串" UserInfo=0x1c55e000 {NSLocalizedDescription=未找到应用程序的“aps-environment”的权利字符串}

    这个是由于你的Provisioning Profile文件,不具备APNS功能导致的。请登陆Apple Developer 网站设置好证书,更新Provisioning Profile,重新导入Xcode。

    2.如何在接收到 APN 的时候获取 APN 消息内容并进行跳转或做出响应处理?

    如果 App 状态为未运行,此函数将被调用,如果launchOptions包含UIApplicationLaunchOptionsLocalNotificationKey表示用户点击apn 通知导致app被启动运行;如果不含有对应键值则表示 App 不是因点击apn而被启动,可能为直接点击icon被启动或其他。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions; 
    // apn 内容获取:NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey]

    如果 App状态为正在前台或者后台运行,那么此函数将被调用,并且可通过AppDelegate的applicationState是否为UIApplicationStateActive判断程序是否在前台运行。此种情况在此函数中处理:

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo;
    // apn内容为userInfo

    如果是使用 iOS 7 的 Remote Notification 特性那么处理函数需要使用

    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler;
    // apn内容为userInfo
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
        // 取得 APNs 标准信息内容
        NSDictionary *aps = [userInfo valueForKey:@"aps"];
        NSString *content = [aps valueForKey:@"alert"]; //推送显示的内容
        NSInteger badge = [[aps valueForKey:@"badge"] integerValue]; //badge数量
        NSString *sound = [aps valueForKey:@"sound"]; //播放的声音
         
        // 取得自定义字段内容
        NSString *customizeField1 = [userInfo valueForKey:@"customizeField1"]; //自定义参数,key是自己定义的
        NSLog(@"content =[%@], badge=[%d], sound=[%@], customize field =[%@]",content,badge,sound,customizeField1);
         
        // Required
        [APService handleRemoteNotification:userInfo];
    }
    
    //iOS 7 Remote Notification
    - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
     
        NSLog(@"this is iOS7 Remote Notification");
         
        // Required
        [APService handleRemoteNotification:userInfo];
        completionHandler(UIBackgroundFetchResultNoData);
    }
    接收消息示例

    其次didFinishLauching中亦要加入一句注册远程通知的代码

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {  
        // 注册推送消息监听
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound)];
        
    }

    3.如何关闭 APN 推送?

    关闭推送有以下两种方式关闭:

    1.在iOS系统设置的通知设置中更改对应app的推送设置(推荐);

    2.在代码中调用 [[UIApplication sharedApplication] unregisterForRemoteNotifications];

    对应以上关闭方式的重新打开推送方法:

    1.在iOS系统设置的通知设置中修改对应app的推送设置;

    2.在代码中重新调用 [APService registerForRemoteNotificationTypes:];

    4.App badge number(角标)如何更改与清空?

    iOS每条 APN 推送可以指定 badge number,iOS 系统无法为某个 App 的badge number做自动累加。

    JPush 推送 iOS 消息时,有指定 badge 的参数。在手机上显示的数值,就是每条推送指定的 badge 参数。

    Badge number 的清空方法:

    APN 推送内容指定 badge number 为 0;

    在代码中使用如下代码清空 badge number: [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

    5.为何推送一条 APN 后,点击通知中心的 APN 通知打开 App,可是 APN 通知在通知中心依然存在而未被删除?

    如果推送 APN 时,Badge number 被指定为0 ,则可能出现 APN 消息在通知中心被点击后,尽管调用了 [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0]; 但 APN 消息在通知中心不会被删除的情况。 这种情况可以按如下代码调用以清除通知中心的 APN 通知。

    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

    如果仍有其他消息,则考虑清除 local notification 通知。( [[UIApplication sharedApplication] cancelAllLocalNotifications] )

    6.出现Not get deviceToken yet. Maybe: your certificate not configured APNs?...错误日志时如何排除问题?
    如果出现上述日志,则说明一段时间内都无法获取device token,那么:

    1)确认你的app配置了apns权限,如果未配置apns权限,则应该会出现此错误提示。

    2)确认你的app运行在ios真机而非模拟器上,且通知中心中对应app的通知权限没有完全关闭(alert/sound/badge至少有一个权限是打开的)。

    3)确认你的网络状况,与apple的服务器的连接是通过tcp的 5223端口连接,确认你网络的对应端口是否可用,可通过下列命令来确认这点:

    telnet 1-courier.push.apple.com 5223

    4)在代码中可在以下两个函数中断点以确认device token的获取状态。

    - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;
    - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error;

    如果app运行进入didFailToRegisterForRemoteNotificationsWithError 则说明app的APNS权限问题或者app运行在模拟器;

    如果app运行进入didRegisterForRemoteNotificationsWithDeviceToken 则说明运行正常,请确认你在此函数中的代码中有将token传递给jpush的调用:

    [APService registerDeviceToken:deviceToken];

    5)如果以上两个registerRemoteNotification的函数都未进入, 请确认你的代码中有注册申请apns的函数调用:

    [APService registerForRemoteNotificationTypes:];

    6)如果上述情况都已确认且未进入第4步的任意回调函数,则可以判断无法获取token的原因在于设备与apple的网络连通性问题(注:一个设备只有在未申请过token的情况下才会需要与apple的网络交互来获取token,已经获取过某一环境token的设备在无网络的情况下也能获取到对应环境的token(环境分为 开发/生产)),这种情况下切换网络能够在大部分情况下解决此问题。

    7)如果仍然有问题,请将上述步骤的结果以邮件附件的形式发送到JPush支持邮箱,我们将协助你解决此问题。

    7.上传到appStore的版本为什么收不到推送?

    请确认xcode选择的生产证书和上传的证书的bundleid一致;

    8.iOS 平台上传证书一直为未通过状态

    证书上传未通过的原因一般有:

    1)当前上传的p12证书密码输入有误;

    2.)证书导出的时候展开了证书,把个人私钥导了出来,导证书的时候请不要展开证书;

    3)当前上传的证书环境不对,如:在上传开发证书的地方上传了生产环境;

    4)该证书已在本账号的其它应用使用;

    5)现上传的证书与当前应用已上传成功的证书的bundle id不一致。

    具体请看上传后显示的错误输出内容。

  • 相关阅读:
    PC-BSD 9.2 发布,基于 FreeBSD 9.2
    Attic 0.8.1 发布,备份程序
    Apache Lucene 4.5 发布,Java 搜索引擎
    Linux Kernel 3.11.4/3.10.15/3.4.65/3.0.99
    Lucene 查询工具 LQT
    Rubinius 2.0 发布,Ruby 虚拟机
    Golang通过Thrift框架完美实现跨语言调用
    微软再次要求Google审查官方链接 称将进行调查
    TCPDF 6.0.036 发布,PHP 的 PDF 操作包
    libnode 0.4.0 发布,C++ 语言版的 Node.js
  • 原文地址:https://www.cnblogs.com/mingfung-liu/p/3668282.html
Copyright © 2020-2023  润新知