美文网首页iOS进阶iOS_小蟹专题iOS 开发技巧
iOS 推送全解析,你不可不知的所有 Tips!

iOS 推送全解析,你不可不知的所有 Tips!

作者: pikacode | 来源:发表于2016-09-05 09:17 被阅读17011次

    本文旨在对 iOS 推送进行一个完整的剖析,如果你之前对推送一无所知,那么在你认真地阅读了全文后必将变成一个推送老手,你将会对其中的各种细节和原理有充分的理解。以下是 pikacode 使用 iOS 推送的一些经验,欢迎互相交流,指出错漏之处。

    推送服务可以说是所有 App 的标配,不论是哪种类型的 App,推送都从很大程度上决定了 App 的 打开率、使用率、存活率 。因此,熟知并掌握推送原理及方法,对每一个开发者来说都是必备技能,对每一个依赖 App 的公司来说都至关重要。

    从 iOS 10 新增的 UserNotifications Framework 可以发现,Apple 整合了原有散乱的 API,并且增加了许多强大的功能。以 Apple 官方的角度来看,也必然是相当重视推送服务对 App 的影响、以及对 Apple iOS 生态圈长远发展的影响。

    准备篇


    Tip 1:推送通知(Push Notification)必须购买 Apple 开发者账号,并使用特定的推送证书

    • 使用免费帐号不能推送。
    • 那如果我们使用的是第三方推送服务(以下简称第三方)呢?比如「极光推送」。也必须购买开发者帐号。因为所有的第三方都会将推送请求发至 APNs(Apple Push Notification service 苹果推送通知服务),所有推送均是由 APNs 下发。
    • 如何注册及正确的配置证书,参考这里 iOS 证书设置指南

    原理篇


    Tip 2:推送通知本身是 iOS 系统的行为,所以在 App 没有运行(没有在前台也没有在后台)的时候:

    • 仍然能够推送及接收(通知中心通知、顶部横幅、刷新 App 右上角的小圆点即 badge [以下简称角标] 等都会由系统来控制和展示)。
    • 收到推送时,是无法在 App 的代码中获取到通知内容的。因为沙盒机制,此时 App 的任何代码都不可能被执行。

    Tip 3:手机向 APNs 注册推送服务

    1. 在代码中注册推送服务:

      #ifdef __IPHONE_8_0
      if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
          UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge| UIUserNotificationTypeSound|UIUserNotificationTypeAlert categories:nil];
          [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
      } else {
          UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
          [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
      

    }
    #else
    UIRemoteNotificationType myTypes = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound;
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:myTypes];
    #endif
    ```

    1. 在第一次触发这段代码的时候,会有一个系统弹窗,询问你是否允许该 App 要给你推送信息。当你选择允许时,系统会打包 App+手机唯一标识+证书 信息发送至 APNs 服务器注册推送服务,APNs 系统会对该手机安装的该 App 是否有推送权限进行验证,所以必须要加入了 Apple Deveice 的手机,使用对应 App 的推送证书才能够成功的注册。

    2. 如果注册成功,则可以在 AppDelegate.m 的如下方法中获取到 deviceToken,它是对 该手机+该App 组合的一个唯一标识,当使用远程推送时,只需将推送消息发给指定的 deviceToken 即可使推送信息传达给指定手机的指定 App 上。因此如果你使用第三方,就需要在这个方法里将 deviceToken 传给第三方。(在 iOS 9 为了更好的保护用户隐私,会出现多次重复删除/安装 App 导致 deviceToken 不断变化的情况。有时会出现一条推送手机会收到 2 次的问题,属于 iOS 9 系统问题)。

      -(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {  
          [JPUSHService registerDeviceToken:deviceToken];//将 deviceToken 传给极光推送
      }
      
    3. 如果以上步骤均成功,此时你能够取到第三方提供的设备注册 id。能否取到该 id 值,可以作为判断设备是否能够成功推送的标准(见 Tip 6 - Registration ID)。因为当你取到该值时必然:

    • 推送证书配置正确(你拥有了推送权限)。
    • 设备成功在 APNs 注册并返回了 deviceToken(APNs 能识别你的设备了)。
    • 返回 的 deviceToken 传给第三方,成功在第三方生成了唯一标识注册 id(第三方能将你的设备信息传给 APNs 了)。
    1. 综上,注册及接收推送必须使用真机,必须连网。

    Tip 4:推送通知从 服务端 --> App 代码 的过程

    1. 使用你们公司或第三方的服务端向 APNs 发送推送请求(请参考苹果 APNs 相关资料,或者第三方推送提供了更简单的 REST API)。
    2. APNs 接收并验证推送请求。
    3. APNs 找到设备下发推送。
    4. 手机收到推送通知,系统根据 App 状态进行处理:
      • 前台收到:
        • 系统会将通知内容传到 didReceiveRemoteNotification
      • 后台收到:
        • 如果开启了 Remote Notification ,系统将推送传到 didReceiveRemoteNotification:fetchCompletionHandler:(见 Tip 5 - 后台推送),否则此时代码中收不到推送。
        • 展示横幅、通知中心、声音、角标。
      • 退出收到:
        • 如果点击推送横幅/通知中心而启动 App,系统将通知传到 didFinishLaunchingWithOptions
        • 展示横幅、通知中心、声音、角标。

    推送通知内容篇


    Tip 5:推送通知分为 本地/远程 2 种类型:

    • 本地通知,可指定推送时间,在该时间准时弹出推送通知。
    • 远程推送通知,分为 普通推送/后台推送/静默推送 3 种类型。存在延迟问题(由于 Tip 1 第 2 点,APNs 的不稳定及高峰时段的巨量请求所致)。
      • 普通推送
        • 就是我们在手机上平时见到的推送通知。

        • 包含声音、横幅、角标、自定义字段。

        • App :

          • 处于前台,不会展示横幅,可通过 didReceiveRemoteNotification(iOS 7 before)didReceiveRemoteNotification:fetchCompletionHandler:(iOS 7 after)获取通知内容(前台展示横幅的方法看这里)。
          • 处于后台,会展示横幅,无法获取通知内容。
          • 处于退出,会展示横幅,无法获取通知内容。
          • 点击图标启动,无法获取通知内容。
          • 点击通知横幅启动,在 didFinishLaunchingWithOptions 获取通知内容。
        • 通知内容类似如下:

    {
    "_j_msgid" = 200806057; // 第三方附带的 id,用于统计点击
    aps = {
    alert = "显示内容";
    badge = 1; // App 角标,可推送 n、+n、-n 来实现角标的固定、增加、减少
    sound = default; // 推送声音,默认系统三全音,如需使用自己的声音,需要将声音文件拖拽&拷贝至 Xcode 工程目录任意位置,并在推送时指定其文件名
    };
    key1 = value1; // 自定义字段,可设置多组,用于处理内部逻辑
    key2 = value2;
    }
    ```

    - 后台推送
      - 各种显示效果跟普通推送完全一样。
      - 必须携带 `"content-available" = 1;`
      - 必须携带 `alert`、`badge`、`sound` 中 `至少 1 个字段`。
      - 仅 iOS 7 以后支持。
      - 必须在 Xcode 工程中 TARGETS - Capabilities - Background Modes - Remote notifications 开启该功能,具体可参照 [iOS 7 Background Remote Notification](http://docs.jiguang.cn/client/ios_tutorials/#ios-7-background-remote-notification)。
      - App:
        - 处于前台,可通过`didReceiveRemoteNotification`(iOS 7 before)`didReceiveRemoteNotification:fetchCompletionHandler:`(iOS 7 after) 获取通知内容。
        - 处于后台,可通过 `didReceiveRemoteNotification:fetchCompletion
        Handler:` 获取通知内容  // 获取情况中与普通推送的唯一不同点,此时 iOS 系统允许开发者在 App 处于后台的情况下,执行一些代码,大概提供几分钟的时间,可以用来偷偷的刷新 UI、切换页面、下载更新包等等操作。
        - 处于退出,无法获取通知内容。
        - 点击图标启动,无法获取通知内容。
        - 点击推送横幅启动,在 `didFinishLaunchingWithOptions` 获取通知内容。
      - 通知内容类似如下:
    
        ```json
    {
          "_j_msgid" = 2090737306;
          aps =     {
            alert = "显示内容";
            badge = 1;
            "content-available" = 1;  // 必带字段
            sound = default;
          };
          key1 = value1;
    }
        ```
      ​
    - 静默推送
      - 没有任何展示效果。
      - 必须携带 `"content-available" = 1;`,因此静默必然是后台的。
      - 必须不携带 `alert`、`badge`、`sound`。
      - 可携带自定义字段。
      - App :
        - 处于前台,可通过`didReceiveRemoteNotification`(iOS 7 before)`didReceiveRemoteNotification:fetchCompletionHandler:`(iOS 7 after) 获取通知内容。
        - 处于后台,可通过 `didReceiveRemoteNotification:fetchCompletion
        Handler:` 获取通知内容  //获取情况中与普通推送的唯一不同点,此时 iOS 系统允许开发者在 App 处于后台的情况下,执行一些代码,大概提供几分钟的时间,可以用来偷偷的刷新 UI、切换页面、下载更新包等等操作。
        - 处于退出,无法获取通知内容。
      - 通知内容类似如下:
    
      ```json
    {
          "_j_msgid" = 3938587719;
          aps =     {
          alert = "";
          "content-available" = 1;  // 必带字段
          };
          key1 = value1;
    }
      ```
    

    推送目标篇


    别名、标签、Registration ID 均是第三方提供的用于更方便地指定推送目标的功能。

    Tip 6:推送根据目标的不同可分为:

    • 广播
      • 无差别发送给所有用户。
    • 别名 alias 推送
      • 第三方提供的功能
      • 一个手机的一款 App 只能设置一个 alias(可修改)。
      • 建议对每一个用户都取不同的别名,以此来确定唯一的用户(也可多个用户取 1 个别名)。
      • 推送时可指定多个 alias 来下发同一内容。
      • 仅指定 alias 的用户能够收到推送。
    • 标签 tag 推送
      • 第三方提供的功能。
      • 可设置多个、可增加、清空。
      • 用于指定多样的属性,如 『1000』+『daily』+『discount』 可用于表示月消费超过 1k、喜欢购买日用品、偏好折扣商品的用户。
      • 如果要删除,需要在上次设置时,将设置的 tags 保存至 NSUserDefaults,本次剔除不需要的 tag 后,再重新设置。
      • 推送时可指定多个 tag 来下发同一内容。
      • 手机如果设置了推送指定的多个 tag 中任一个tag,都能够收到推送消息。如指定 『1000』+『globe』+『original』 (千元级消费者、全球购、原价),那么设置了 『100』+『globe』+『discount』(百元级消费者、全球购、折扣价)的用户可以收到该推送消息。
    • Registration ID 推送
      • 第三方提供的功能。
      • 在 Tip 3 的第 3 步时将 deviceToken 提供给第三方之后,其服务器会自动生成的指向该手机的唯一 id。
      • 可在推送时指定多个 id 来下发消息。
      • 可用于对核心用户、旗舰用户的精准推送。

    应用内消息篇


    Tip 7:应用内消息(以下简称消息 )和推送通知的区别,消息:

    • 不需要 Apple 推送证书。
    • 由第三方的服务器下发,而不是 APNs。
    • 相比通知,更快速,几乎没有延迟,可用于 IM 消息的即时送达。
    • 能够长时间保留离线消息,可获取所有历史消息内容。
    • 通过长连接技术下发消息,因此:
      • 手机必须启动并与第三方服务器建立连接。
      • 如果手机启动立刻切至后台,很可能连接没有建立。
      • 手机必须处于前台才能收到消息。
      • 手机从后台切回前台,会自动重新建立连接,并收到离线消息。
    • 没有任何展示(横幅、通知中心、角标、声音),因此可以:
      • 自定义字段实现 UI 效果。
      • 完全在静默情况下处理 App 内部逻辑。
      • 使用一些 App Store 审核不会通过的功能,在审核时关闭功能,上架后通过接收消息,开启相关功能。

    组合大招篇


    Tip 8:tags 的组合技巧

    • 见 Tip 5 - 标签 tag 推送。
    • 可以在服务端来统计分析用户行为,然后将指定的 tags 发送至手机,手机接收后再为用户打上对应的 tags。

    Tip 9:通知+消息的组合技巧

    • 首先来看通知和消息特性的对比:
    通知 消息
    送达时间 可能存在几秒延迟 几乎无延迟
    获取时机 处于前台或后台能获取内容 仅处于前台能获取内容
    离线内容 保留『一段时间』,过期会抛弃,无法查询历史内容 始终保留,可查询全部历史内容
    系统展示 会展示(静默推送或App处于前台不展示) 不展示
    • 由于各自的特性都�存在差异,因此二者结合使用是使得 App 推送性能最大化的必然选择:
      • 情景一:
        QQ/微信 聊天。会同时下发一组通知+消息 ,如果用户没有启动 QQ,虽有延迟但必然能够先收到通知,在收到通知的提醒之后,用户打开 App,此时收到了离线消息,即时更新 UI,与好友即时地发送/接收消息。(在收到通知后,断网,然后启动 App,你会发现此时手机里并不会显示刚刚通知的内容,因为它是依靠拉取消息来刷新页面的,而不是不够稳定的通知)。
      • 情景二:(期待您的补充...)

    相关文章

      网友评论

      • 午马丶:您好读了您的文章有两点疑问:
        1. 那三种推送的类型是如何决定的是后台推送的时候就规定好了的吗?
        2.看到您有这样一句的阐述 “如果注册成功,则可以在 AppDelegate.m 的如下方法中获取到 deviceToken”,那么如果用户不允许发送通知是不是就获取不到deviceToken了呢?
        期待您的回复谢谢。
        pikacode:@A丶 拒绝了是指的在设置里也显示不允许通知吗?可能是苹果的bug
        午马丶:感谢您的回复,但是我这里为什么拒绝了但是还是可以收到推送好奇怪
        pikacode:1.由payload决定的,如果是用的第三方,在第三方的控制台可以勾选
        2.用户拒绝是获取不到的,因为这个需要去从苹果服务器请求
      • UASHS:你好,请问下如果app的推送通知关了,静默推送还能收到吗
      • 一洼世界:IOS 是否可以集成多个第三方推送APNs服务呢? 比如信鸽或者极光。如果有这样子的业务需要,是不是注册两个证书?
      • 有毒的程序猿:`didReceiveRemoteNotification:fetchCompletion
        Handler:`在后台有时候不走这个方法,请问又遇到过吗?还有tip2,怎么实现,我看微信杀死之后角标也会跟着变化
      • c94117e5403f:请问一下,如果想做一个IM,每次消息,都会发送一个通知,一个消息么?
      • 0271fb6f797c:后台推送比就是静默推送吗?静默推送在程序退出的时候也会受到信息的吧?
      • bill666500:我想问下这个消息指的具体是什么,是服务器返回的内容还是?
      • a46163f02ee2:请问:
        当程序不在前台也不在后台的时候,发起静默推送,系统通知栏会不会显示横幅?
        barry:不会
      • 童话镇里蜿蜒的河:楼主你好。 我的app用了极光推送。 但是最近会有很奇怪的情况。 能收到推送消息,但是就闪一下就没了。在下拉的推送列表里面也没有记录
      • okerivy:ios 推送怎么保存 程序没有启动 或在后台 如果一下子推送5条
      • iOS_Developer1:tag跟别名分别用与什么场景啊,2者区别我一直有点模糊啊,大神能通俗详细的解释下吗
      • 鸩夜:like!
      • hybefortis:请问下:前台收到是指“用户正在使用应用时收到”,后台收到是指“running on background和inactive”,退出收到是指什么情景呢?不知掉我说的对不对,还望指教~
      • goodthing:你好.我问下.我用的是极光推送.我的 Tag 和 Registration ID 都设置好了.在我的设备上可以以 Tag 和 Registration ID推送收到通知.但是换一台设备还是登陆我的账号就收不到通知了,这是由于每台设备的 Tag 和 RegistrationID 都不同吗?我该如何操作呢?
        52xpz:tag只要你在两台设备上设置的一样就行了,RegistrationID这个是个推或者极光返回给你的吧,应该跟设备相关的
      • 标准答案:我想请问一下 , 怎么实现在app不启动的情况下 比如现在app的角标显示的是8 收到一条推送消息以后 让角标还是8, 即 角标不变, 这种需求要怎么实现啊, 在线等作者回复啊
        iOS_Developer1:群加不了啊,发送申请就拒绝
        pikacode:@标准答案 欢迎加入皮卡丘iOS&推送交流群,群号码:345192153
      • 老灰:我的APP角标总是会不定期消失,点击APP进去再回到桌面,角标又出现了,一直没查到原因。甚是苦恼。
        pikacode:@老灰 在工程中搜索 ApplicationIconBadgeNumber,找到结果看看是哪里进行了修改。
      • YY_Lee:请问你知道怎么删除系统栏的推送吗
        pikacode:@Gradient 看一下我写的玩转 ios 10
        YY_Lee:@pikacode 如果我想删除指定某一条推送呢
        pikacode:@Gradient badge设为0
      • Ulricis:最后一个QQ的例子, 不知道是不是我复现方式不规范:
        把 APP 杀掉, 收到消息推送后断网再打开, 完全可以显示刚才推送的内容, 而且不管推送了多少条都能显示.
        是 iOS 有隐藏的接口可以查询推送历史呢? 还是腾讯跟苹果关系不一般?
        我最近在做关于 IM 的项目, 所以比较关心这个. 网上很少有人提到这个问题, 楼主能否解释一下.
        pikacode:@Ulricis 我很久以前就试过了亲。跟系统版本没关系。Tip2,因为沙盒机制,App 没有运行的时候,是不可能执行任何代码,也不可能获取到推送内容的。当然我指的是点击应用图标启动 App,而不是点击推送横幅启动 App。点击推送横幅启动,可以获取推送内容,但也仅仅只能获取该条内容,收到多条消息的时候,无法获取没有点击的消息。在 IM 里点击推送横幅,也不会进行消息的展示的,因为如果你点击的了中间的一条消息,立刻的就展示的话,你没有点击的前面的消息顺序就错乱了。所以 IM 一定是 App 在前台,然后从第三方服务器拉取历史记录,Apple 本身没有拉取历史记录的功能。
        Ulricis:@pikacode 你试了吗, 系统版本多少的?
        pikacode:@Ulricis
        你可以试试 先杀掉 App - 接收推送 - 断网 - 启动 App
      • 像孩子似的倾诉:标签 tag 推送用的是哪个类?
        pikacode:@像孩子似的倾诉 第三方
      • 英贰与我:hello, 我 在 适配 ios10 的推送时 遇到两个问题:1.当屏幕是黑屏时 收到推送 没 声音提示, 2.由于我们的推送提示音不是默认的,每次安装完推送提示音是正常的,再次运行程序,推送提示音会变成系统默认提示音, 博主 对这两个问题有何高见,求交流
        英贰与我:没问题的啊,当屏幕亮着时声音也是正常的
        pikacode:@ZZ_Ying
        1.手机静音了,或者推送没有 sound 字段
        2.推送时 sound 字段要选择声音文件名
      • 属于一个人的小叮当:你好,你有通知和消息同时使用的demo么?我想观摩一下
        pikacode:@属于一个人的小叮当
        你不登陆qq能收到消息吗?
        属于一个人的小叮当:问个问题,应用内消息是不是不管app在不在线,只要一打开app就肯定会收到
        pikacode:@属于一个人的小叮当
        没有
      • 属于一个人的小叮当:谢谢楼主,困扰我许久的问题终于解决了 :smile:
      • 属于一个人的小叮当:楼主,消息和通知组合使用怎么使用?我程序处于后台.当点击通知进入前台的时候会执行通知和收到消息的方法,这个该怎么解决?
        pikacode:@属于一个人的小叮当
        分别加个 id 的字段,判断是否同一条内容,并且对同一 id 只处理一次。

      • linfantasy:当App 处于后台 点击通知栏 应该是通过 didReceiveRemoteNotification这个方法获取吧
        linfantasy:@pikacode 那就对了!谢谢
        pikacode:@linfantasy
        App 处于后台,点击横幅进入前台,通过 didReceiveRemoteNotification 获取
        App 处于退出,点击横幅启动 App,通过 didFinishLaunchingWithOptions 获取
      • 亦泉心然01:赞赞赞.
      • zero000:普通推送:客户端在后台/退出状态,为什么无法获取通知内容?
        后台推送:客户端退出,为什么无法获取通知内容?
        pikacode:@zero000 是,退出不能执行代码,无法处理任何类型的推送。由于也没有横幅和通知中心的展示,所以也不可能通过点击启动App来接收。可以通过配合应用内消息来使必须接收的消息被收到。
        zero000:恩,谢谢 还有一个问题是:静默推送的前提是必须要让客户端在后台/前台,那么实际应用中 用户不用客户端直接退出了,那么服务端发送一调静默推送,是不是就不起作用了?
        pikacode:@zero000
        1.后台推送是 iOS 7 以后才支持特性,iOS 系统有严格的沙盒机制,不允许 App 在后台执行任何代码,除了接收推送、播放音乐、GPS 定位等一些特殊功能以外。
        2.退出,见 Tip 2,App 退出了,程序根本不再执行了,任何一行代码都跑不了。
      • 41b3baeebe2a:楼主总结的很棒,是我理解错了!
      • 41b3baeebe2a:静默推送是不是属于后台推送,只是没有提醒声音,没有角标提示?还有想问下,后台推送,在处于后台时,可通过 didReceiveRemoteNotification:fetchCompletion
        Handler:来接收APNs传递过来的消息,那么点击推送横幅启动,还会在 didFinishLaunchingWithOptions 获取通知内容吗?
        pikacode:@青木秋雨
        首先你要明白 后台/静默推送分别是干什么的。
        后台推送的意思是在接收推送的时候,如果 App 处于后台,可以让开发者在「后台」执行一段时间的代码。此时各种展示效果跟普通推送完全一样,唯一的不同就是可以在「后台」执行代码,下载、刷新、跳转页面等等。
        静默推送的意思是「完全静默」,在用户完全不知道的情况下,在后台悄悄的执行代码。没有任何展示。可以在用户不知道的情况下更新你的App数据、页面等。
        这2种推送用于不同的场景。
        41b3baeebe2a:@pikacode 携带 "content-available" = 1的情况下,是不会有系统的自带顶部弹窗提醒吧,不管是静默还是后台。都需要可通过 didReceiveRemoteNotification:fetchCompletion
        Handler:来接收APNs传递过来的消息,写本地通知来实现弹窗提醒。
        pikacode:@青木秋雨
        1. Tip 5 - 静默推送 -「必须携带 "content-available" = 1,因此静默必然是后台的。」(跟你说的一样,静默是没有任何展示的后台推送)
        2. didFinishLaunchingWithOptions 只会在 App 启动的时候执行,而不会在「后台 -> 前台」的时候执行。所以不会存在你说的情况。
      • cf436fcaa2f2:我总结一下,楼主你看看对不对。首先先用证书在APNS上注册并返回一个token,然后客户端将token 发送给第三方生成唯一的标示(极光推送获取设备信息传承APNS). 后台将需要推送的信息发送给APNS,APNS根据第三方的唯一的标示,进行推送了?
        pikacode:@非初言 其实中间还有一步,就是你需要将证书导出 .p12 证书文件,在第三方的官网控制台对应 App 里上传。这样第三方才能获取到向 APNs 请求推送的权限。
      • 简书的推销员:虽然不是很懂,但是还是先收藏了..我想知道 静默推送是什么意思.....T-T
        简书的推销员:@pikacode 搜嘎,谢谢楼主,我得好好瞅瞅了
        pikacode:@简书的推销员 你要先看懂后台推送。静默推送就是不弹窗没声音的后台推送。
      • 一抹相思泪成雨:问下 同时设置 别名 标签 ,后台发送推送 加别名的消息 该别名的手机会收到吗?

        pikacode:@Hoolink 你是按别名推送,只要有这个别名就能收到。
        一抹相思泪成雨:@pikacode 这两者不是并列的关系吗,别名跟标签,同时满足才能收到??难道是或的关系啊??
        pikacode:@Hoolink 会的。一个手机可以被多重标记。就像人可以有大名,小名,外号。喊的都是同一个人。
      • eb7b9b53c10c:很详细,非常好的一篇文章
      • 和影子玩拳击:好的,谢谢你,不过有什么办法可以解决这个问题吗?
        pikacode:@和影子玩拳击 暂无,你会发现 QQ、微信等其他 App 有时候也会有这个问题。Apple 在 iOS 9 的较新版本里应该已经修复了这个问题,我最近是没有遇到这个问题了。我现在使用的 iOS 10 Beta 貌似也没有出现过这个问题。
      • 和影子玩拳击:为什么我的推送会收到两条推送通知,而我只能获取到一条消息记录??
        pikacode:@和影子玩拳击 Tip 3 - 3 ,iOS 9 多次重复删除/安装 App 会导致重复注册的问题,这是 iOS 系统本身的 bug ,我认为。
      • 虹淡程:虽然不是很能看懂,但是···
        pikacode:@虹淡程 哪个 Tip 看不太懂?
      • 北风2302:先行mark
      • 雪_晟:mark
      • f19bd7a58971:深度好文!我所见过最详细的推送说明
      • 马铃薯蜀黍:空心小圆是怎么排班格式?
        马铃薯蜀黍:@天空中的球 恩 学习了 感谢 ! 试了一下 用 "-" 跟 "*" 都是可以的 :smile:
        天空中的球:@马铃薯蜀黍 "*" 后面另起一行,再打“*”前多一个空格键或 tab键就好啦。
        pikacode:@马铃薯蜀黍 不太清楚你的意思?

      本文标题:iOS 推送全解析,你不可不知的所有 Tips!

      本文链接:https://www.haomeiwen.com/subject/gdyjsttx.html