Xcode8开发iOS10推送通知过程
iOS10发布后,简书优先开发增加了iOS10的新通知。本文分享整个feature的开发过程遇到的问题。
1、工程配置
Xcode8发生了很大的变化,直接打开原来的工程编译运行,这个时候是获取不到Push token的,打印didFailToRegisterForRemoteNotificationsWithError
中的error可以看到
fail to register with error Error Domain=NSCocoaErrorDomain Code=3000
"no valid 'aps-environment' entitlement string found for application"
UserInfo={NSLocalizedDescription=no valid 'aps-environment'
entitlement string found for application}
Google了解到是Xcode8的变化,entitlements
由本地的entitlements文件配置,主Target的Capabilities下,Push Notification
处于关闭的状态,必须手动打开。
2、Code Sign
工程增加了Notification Content
和Notification Service
两个Extension,Signing
默认是自动模式.。
据网上介绍Xcode8签名管理方式比Xcode7更智能,那我就试一下吧。选完Team它就自动生成了授权文件。然而,Xcode8还帮我生成了一个新的证书,相当于增加了一个开发人员,也就是我现在的证书不在原来的授权文件中,后果就是原来手动配置的授权文件要重新生成。
这时候如果想使用原始的手动配置,不仅要把Automatically manage signing
去掉,还要在Key Chains
里把新生成的证书删掉,然后在Web端生成授权文件。使用Automatically manage signing
最好把每个Target都使用相同的方式。
3、Swift版本
如果你在创建Target的时候开发语言选了Swift,默认是使用Swift3.0,Xcode8同时支持3.0和2.3,可能你还没来及掌握3.0的API变化,想继续使用2.3的API,只要在对应Target的Build Setting
中Use Legacy Swift Language Version
设为YES就可以继续使用2.3。
4、Architectures
工程配好之后,只有模板代码,先跑起来写个Hello World
再说。Command+R
之后,编译报错了
Check dependenciesNo architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).
VALID_ARCHS
中没有对应的active arch
这时需要在对应Target的Build Setting
中Valid Architectures
中增加arm64
5、Notification Service
接下来,开始代码编写了,大部分是参考喵神的这篇文章活久见的重构 - iOS 10 UserNotifications 框架解析和Demo、还有WWDC 708 Advanced Notifications、PDF。
在service中,我们会把后端push过来的数据中的图片下载到本地文件夹,然后作为attachments。
之前我们的推送都只显示一句alert,不过推送的json数据alert字段可以是string,也可以是dictionary,如果是string,相当于dictionary中的body
,在iOS8.2之后dictionary可以增加title
、subtitle
等。为了让推送更丰富,我们想把原来的body
变成title
,增加文章摘要放到body
里,如果直接改aps
内的alert
,那么8.2以前的设备推送显示的是文章摘要了。后来我们想了一个办法,Notification Service
不是可以修改推送内容吗?aps
的alert
还是保持不变,json增加一个新的title
和body
,Service收到通知之后把json中的title
和body
取出来赋给bestAttemptContent
的title
和body
。
{
"aps":{
"alert":"test test",
"mutable-content":1
},
"title": "new title",
"body": "new body"
}
6、Notification Content
如果通知有attachments,默认情况下长按通知会显示图片或视频,但是我们觉得显示那么大一个图片不美观,而且要有action button,就是下面这种效果,所以要用到Notification Content
。
其实这里没有自定义通知的UI,而是直接把这个View隐藏了。Info.plist
中UNNotificationExtensionInitialContentSizeRatio
表示view的初始height/width(其他属性参考WWDC),把它设为0.001(不能设为0),在viewDidload
中设置self.preferredContentSize = CGSizeZero;
来隐藏view。
这个Extension可以响应多个category
,而每个category
可以注册自己的action buttons,所以action buttons和customUI view是相互独立的,不过可以通过action buttons更新customUI view。
Action buttons默认的行为会打开APP,由delegate处理响应,使用了Notification Content
后,我们可以在Notification Content
直接处理响应而不用打开APP,也可以forward打开APP由delegate处理。
5、真机调试
代码写得差不多了,那就开始调试了。Extension调试过程中有时会遇到Could not attach to process ID
错误。
有时重启Xcode能解决,有时不能解决,这时候有一个方法,这个窗口弹出之后点OK
,接着点Debug > Attach to Process > 你的Extension
,这时候就能捕获断点了。
6、提交TestFlight
测试过了准备提交TestFlight,结果校验出错了。
错误信息很明显,Extension.appex中包含了Frameworks文件夹。如果Extension使用了Cocoapods,Cocoapods会创建这个文件夹,实际没什么用。解决办法就是在Build Phases
最后增加一个Build Phase
,执行一段shell脚本把Frameworks文件夹删掉。
cd "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/"if [[ -d "Frameworks" ]]; thenrm -fr Frameworksfi
Xcode8开发iOS10推送通知过程的更多相关文章
- iOS开发 iOS10推送必看
iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说.希望看完我的这篇文章,对大家有所帮助. 一.简单入门篇---看完就可以简单适配完了 相对简单的推送证书以及环境的问题,我就不在这 ...
- iOS10 推送通知 UserNotifications
简介 新框架 获取权限 获取用户设置 注册APNS,获取deviceToken 本地推送流程 远程推送流程 通知策略(Category+Action) 附件通知 代理回调 简介 iOS10新增了Use ...
- iOS开发 iOS10推送必看(基础篇)
iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说.希望看完我的这篇文章,对大家有所帮助. 原文链接 一.简单入门篇---看完就可以简单适配完了相对简单的推送证书以及环境的 ...
- 【WP 8.1开发】推送通知测试服务端程序
所谓推送通知,用老爷爷都能听懂的话说,就是: 1.我的服务器将通知内容发送到微软的通知服务器,再由通知服务器帮我转发消息. 2.那么,微软的推送服务器是如何知道我的服务器要发消息给哪台手机呢?手机客户 ...
- iOS10 推送通知详解(UserNotifications)
iOS10新增加了一个UserNotificationKit(用户通知框架)来整合通知相关的API,UserNotificationKit框架增加了很多令人惊喜的特性: 更加丰富的推送内容:现在可以设 ...
- iOS开发 iOS10推送必看(基础篇)-转
iOS10更新之后,推送也是做了一些小小的修改,下面我就给大家仔细说说.希望看完我的这篇文章,对大家有所帮助. 一.简单入门篇---看完就可以简单适配完了 相对简单的推送证书以及环境的问题,我就不在这 ...
- iOS10推送通知适配
iOS10推送新增了UserNotifications Framework,使用起来其实很简单. 只是在iOS10以上系统上点击通知栏,回调方法不再走原来的这两个方法 - (void)applicat ...
- 推送通知/传感器/UIDynamic仿真(推送通知已适配iOS10)
推送通知/传感器/UIDynamic 一.推送通知 1.推送通知简介 什么是推送通知 此处的推送通知与NSNotification没有任何关系 可以理解为,向用户推送一条信息来通知用户某件事情 作用: ...
- iOS10推送必看UNNotificationServiceExtension
转:http://www.cocoachina.com/ios/20161017/17769.html (收录供个人学习用) iOS10推送UNNotificationServic 招聘信息: 产品经 ...
随机推荐
- 深入学习jQuery选择器系列第四篇——过滤选择器之属性选择器
× 目录 [1]简单属性 [2]具体属性 [3]条件属性 前面的话 属性过滤选择器的过滤规则是通过元素的属性来获取相应的元素,对应于CSS中的属性选择器.属性过滤选择器可分为简单属性选择器.具体属性选 ...
- 在Objective-C中浅谈面向对象
接触面向对象也有一段时间了,当时是通过C++学习的OOP,后来又接触到了PHP和Java.每种OOP的语言在面向对象上或多或少都会有不同的地方,现在在学习OC的面向对象部分,又感觉到OC面向对象的特点 ...
- 十进制(decimal system)转换函数说明
一,十进制(decimal system)转换函数说明 1,十进制转二进制 decbin() 函数,如下实例 echo decbin(12); //输出 1100 echo decbin(26); / ...
- objective-c 语法快速过(3)
oc 里的匿名对象 oc 这里,很少用到,因为并不适用于oc的内存管理,只是面试笔试也许出现,要求能看懂,不要在项目里这样写,因为写匿名对象,会造成内存泄露 #import <Foundatio ...
- 【Java心得总结三】Java泛型上——初识泛型
一.函数参数与泛型比较 泛型(generics),从字面的意思理解就是泛化的类型,即参数化类型.泛型的作用是什么,这里与函数参数做一个比较: 无参数的函数: public int[] newIntAr ...
- mysql权限管理
经常遇到有网友在QQ群或者论坛上问关于mysql权限的问题,今天抽空总结一下关于这几年使用MYSQL的时候关于MYSQL数据库的权限管理的经验,也希望能对使用mysql的网友有所帮助! 一.MYSQL ...
- 记录visual Studio使用过程中的两个问题
Visual Studio是Windows平台下进行项目管理和开发的终极利器.除了微软自家的技术外,新版的VS不但支持Javascript, Python的开发调试,甚至还支持了Android, iO ...
- GitHub-版本控制
GitHub的使用:注册,登录,邮箱激活,创建第一个repository.如果branch是master,修改,提交,master直接改变. 稳妥起见创建另一个branch,修改,提交,再发出pull ...
- Windows Server 2008设置远程桌面连接的最大数量
远程桌面连接的默认数量是2,当有多个用户需要同时远程桌面连接时很不方便,可以设置远程桌面连接的最大数量. 1. 运行gpedit.msc: 2. 选择计算机配置-->管理模板-->Wind ...
- 【nodejs笔记1】配置webstorm + node.js +express + mongodb开发博客的环境
1. 安装webstorm 并破解 2. 安装node (以及express框架) 至官网下载并安装.(http://nodejs.org)v0.10.32 msi 安装后测试,打开命令行, c ...