iOS10新特性(What's New in iOS)

1.原文地址
2.Additional Framework Changes章节还没来得及翻译,之后会出
3.有些不适合翻译的词就没有进行翻译,大家应该能懂
4.翻译的不是很完美,希望大家多提意见

iOS 10.0

这篇文章简述了在iOS10中被引入的开发者相关的关键特性。文章同时也列出了详细描述这些新特性的相关文档。

有关最新的新闻和已知问题信息,请查看发行说明https://developer.apple.com/ios/download/。获取iOS10中新API的完整列表,请查看iOS 10.0 API Diffs。想了解在新设备上的更多信息,请查阅iOS Device Compatibility Reference

想了解有关Swift的更新,请查看Swift LanguageThe Swift Programming Language (Swift 3)

SiriKit

在特定领域提供服务的应用可以利用SiriKit来通过Siri提供这些服务。要想使你的服务可用,需要使用Intents和Intents UI框架创建一个或多个应用扩展(app extensions)。SiriKit支持以下领域的服务:

  • 语音和视频通话(Audio or video calling)
  • 发送消息(Messaging)
  • 收款或付款(Sending or receiving payments)
  • 照片搜索(Searching photos)
  • 约车(Booking a ride)
  • 管理健身(Managing workouts)

当用户的请求涉及你的服务,SiriKit会向你的extension发送一个intent对象,这个intent对象描述了用户的请求,并提供请求相关的所有数据。开发者使用这个intent对象来提供一个适当的响应对象,这个响应需要包含你处理这个请求的详细操作。一般来说,Siri处理所有的用户交互,但开发者也可以用你们的应用中的extension来提供一个整合品牌或附加信息的定制UI。

SiriKit也提供这样一种机制:你可以告诉系统存在于你应用中的交互和活动。当你告诉系统相关的交互信息,系统可以判断你的应用是否可以处理用户目前的请求,如果可以,会传递请求到你的应用。此外,intent-SiriKit定义的一个把意图相关信息和处理步骤结合的交互对象-包含了一些详细信息,比如该步骤的起始时间和持续时间。如果你的应用注册了某种intent的处理能力,那么即使它没有提供一个intent的应用扩展(app extensions),系统同样可以启动它并带着一个包含这种intent的interaction对象。

Maps和Siri都支持汽车预约,用户同时也可以使用Maps来进行餐馆的预定。你的Intents extension使用同样的方式处理来自于Map应用的交互或Siri的请求。如果你定制了用户界面,你的Intents UI extension也可以根据请求的来源-Siri或Maps-来进行差异化的配置。

学习如何支持SiriKit并给用户提供全新的使用你服务的方式,请阅读SiriKit Programming Guide。当你准备好实现一个处理各种各样intents的应用扩展(app extensions),请阅读Intents Framework ReferenceIntents UI Framework Reference

Proactive Suggestions

iOS10引入了新的方式来提高用户与你应用的互动:通过在合适的时机向用户展示你的应用。如果你在iOS9中采用了应用搜索,通过Spotlight和Safari搜索结果、Handoff、Siri建议,你能够给予用户更加深层的对活动和内容的访问能力。在iOS10和未来的版本中,你可以提供“用户能在你的应用做什么”这样的信息,这可以帮助系统在更多的地方推荐你的应用,比如键盘相关的QuickType建议, Maps和CarPlay,应用切换页面,Siri交互,(为媒体播放类应用) 锁屏界面。这些提高和系统集成度的功能被许多技术支持,比如NSUserActivity,Schema.org定义的web标记, 和定义在Core Spotlight、MapKit、UIKit、Media Player 框架中的API。

在iOS10中,NSUserActivity对象包含一个mapItem属性,它允许你提供一个可以在其它环境中使用的位置信息。例如,如果你的应用程序显示酒店评论,你可以使用mapItem属性来保存用户正在查看酒店的位置,这样,当用户切换到一个旅行规划应用,该酒店的位置会被自动提供。如果你支持应用搜索,你可以使用CSSearchableItemAttributeSet中新的基于文本的地址组件属性,比如thoroughfarepostalCode,来全面地指定用户可能想去的位置。要注意的是当你使用了mapItem属性,系统也会自动将其填入contentAttributeSet属性.

为了和系统分享位置信息,一定要指定latitudelongitude值,并将其加入CSSearchableItemAttributeSet中定义的地址组件属性。它也建议你为namedLocation属性提供一个值,以便用户可以查看到这个位置的名称。你同样可以提供值给phoneNumbers属性,这样用户就可以使用Siri来发起一个基于位置的呼叫。

在iOS9中,为你网页中的结构化数据添加标记可以丰富用户在Spotlight和Safari中看到的搜索结果。在iOS10中,你可以使用Schema.org中定义的位置相关的词表,比如PostalAddress,来进一步提高用户的体验。例如,如果用户在你的网站上看到一个位置说明,那么当用户使用Maps应用的时候,系统会提示相同的位置。需要注意的是,Safari同时支持Schema.org词表的JSON-LD和Microdata编码。

UIKit在UITextInputTraits协议中引入textContentType属性,使你可以指定希望用户在文本区域中输入内容的语义。当你提供了这个信息,系统在某种情况下可以自动选择适当的键盘,提高键盘的输入校正,主动整合从其它app和网站获取的信息。例如,如果你使用UITextContentTypeFullStreetAddress来通知系统你希望用户在文本输入区框中输入一个完整的地址,系统就可以将用户最近浏览的地址提示给他本人。

如果你的应用是媒体播放器之类的,你可以使用MPPlayableContentManager中相关的API,iOS10可以帮助你在锁屏的时候实现查看专辑封面和媒体播放的功能。

如果你的ride-sharing应用使用MKDirectionsRequestAPI,那么当用户有可能叫车的时候,iOS10可以在应用切换界面显示你的应用。为了注册成一个乘车分享服务的提供方,你需要在Info.plist文件中将MKDirectionsApplicationSupportedModes关键字指定为MKDirectionsModeRideShare。如果你的应用只支持共享乘车,系统将会以“Get a ride to...”这样开头的文本来推荐你的应用。如果你的应用同时支持共享乘车和其它交通方式(比如汽车或自行车),系统将会使用“Get directions to...”这样的文本。需要注意的是,你收到的MKMapItem对象有可能不包括经纬度信息,并且MKMapItem需要地理编码。

Integrating with the Messages App

在iOS10中,你可以创建一个应用扩展(app extensions)来和Messages应用进行交互,比如让用户发送文本、stickers、媒体文件、交互式消息。你也可以支持交互式的消息,这个更新是每个收件人对消息的响应。你可以创建两种类型的应用扩展(app extensions):

  • Sticker pack给用户提供了一套可以被加在消息内容上的贴纸。
  • iMessage app现在能让你在其内部提供一个用户界面,用于在一次会话中创建一个sticker的浏览器,这个浏览器可以创建、发送、更新包括文字、stickers、媒体文件在内的交互式信息。

当用户在iMessage应用中的时候,应用同样可以帮助用户搜索保存在和你应用相关联的网站中的图片。

你可以在不写任何代码的情况下创建一个Sticker包:简单的拖拽图片到Xcode中Stickers asset catalog的Sticker Pack folder就可以了。

你可以使用Messages框架(Messages.framework)中提供的API来开发一个iMessage应用。想学习有关Messages框架的知识,你可以查看Messages Framework Reference。有关创建应用程序扩展(app extensions)的一般信息,你可以查看App Extension Programming Guide

如果你的app提供了可以在Messages中分享的图片,然后你希望用户可以在不离开Messages应用的情况下通过Spotlight进行通用图片查找(就是这种,“#images”),那么第一步是创建一个iMessage应用。之后的步骤如下:

  • 给你应用的entitlements添加com.apple.developer.associated-domains关键字。这个关键字包含一个你希望用户搜索到的web域的列表。对于每个域,指定spotlight-image-search服务。
  • 在你的网站上添加一个apple-app-site-association文件,文件中添加一个包含spotlight-image-search的字典,字典中也要包含你的应用ID(app ID),这个应用ID是你的团队ID(team ID)或者一个appID+bundleID的字符串。你可以指定最多500个路径和模式来帮助Spotlight通用图片搜索可以索引到(有关网站路径的一些例子,可以参考universal links的例子Creating and Uploading the Association File)。
  • 请允许Applebot对数据进行抓取(更多信息,请查看About Applebot)。

User Notifications

iOS10引入了User Notification框架(UserNotifications.framework),这个框架支持本地和远程通知的传递和处理。你可以使用这个框架中的类基于一些特殊的条件来交付本地通知,比如时间和地点。当通知交付到用户设备的时候,应用和应用扩展可以使用这个框架来接收和修改本地或远端的通知。

同样是在iOS10被引入的,User Notifications UI框架(UserNotificationsUI.framework)使你可以定制显示在用户设备上的本地和远端通知样式。你可以使用这个框架来定义一个应用扩展(app extension)来接收通知数据,然后提供相似的视觉效果进行显示。

Speech Recognition

iOS10引入了一个新的API,它支持连续的语音识别,可以帮助你实现一个有语音识别并转换为文字这样功能的应用。使用Speech框架(Speech.framework)中的API,你可以对实时语音或录制音频进行语音转录。例如,你可以获得一个语音识别器,然后像如下代码一样开始简单的语音转录:

let recognizer = SFSpeechRecognizer()
let request = SFSpeechURLRecognitionRequest(url: audioFileURL)
  recognizer?.recognitionTask(with: request, resultHandler: {   (result, error) in
  print (result?.bestTranscription.formattedString)
})

正如访问其它类型受保护的数据,比如日历数据和相册数据,执行语音识别需要用户的许可(有关访问受保护数据类的更多信息,请查看Security and Privacy Enhancements)。对于语音识别来说,获取权限是必须的,因为考虑到识别精确度,数据会被传送并临时性的存储在苹果的服务器上。为了获取用户的许可,你需要把NSSpeechRecognitionUsageDescription关键字添加到你应用的Info.plist文件中。

当你在你的应用中采用语音识别的时候,务必向用户说明他们的讲话应该是能被认可的,而且他们在那个时候不应该有敏感的言论。

Wide Color

大部分图像框架贯穿整个系统,包括Core Graphics,Core Image,Metal,AVFoundation在内的框架极大的改善了对更加广泛的像素格式和宽色域色彩空间的支持。通过在整个图形堆栈(graphics stack)扩展这个行为,让设备支持更广泛的色彩显示变的前所未有的简单。此外,UIKit把使用新的扩展sRGB色彩空间变的标准化,使sRGB颜色和其它颜色的混合变的简单,更宽的色域显示没有显著的性能损失。

以下是开始使用Wide Color的一些最佳实践。

  • 在iOS10中,UIColor类使用扩展的sRGB色彩空间,它的初始化不再限制组成值在0.0-1.0之间。如果你的应用依赖UIKit来限制组成值(无论你是创建一个颜色还是请求一个颜色的组成值),你需要在适配iOS10的时候改变你应用的行为。
  • 当你在iPad Pro(9.7英寸)上执行一个UIView的自定义绘图操作的时候,默认的绘图环境是用扩展的sRGB颜色域。
  • 如果你的应用渲染自定义的图像,请使用新的UIGraphicsImageRenderer类来进行管理,无论目标位图是用扩展值域还是标准值域格式。
  • 如果你在一个广色域设备上使用低级别的API(比如Core Graphics或Metal)来进行图片加工,你需要使用一个扩展范围的颜色域和支持16位浮点的像素格式来组成数值。当限制颜色值是必须的,你应该明确这样做。
  • Core Graphics,Core Image,Metal Performance Shaders提供新的简单的选择来处理颜色和图片色彩空间的转化。

Adapting to the True Tone Display

真色调(True Tone)显示使用环境光传感器,可以做到配合当前环境的光线条件自动调节显示的颜色和强度。为了确保你的应用在真色调(True Tone)提供的标准色改变功能下能正常工作,请添加UIWhitePointAdaptivityStyle关键字到你的Info.plist文件下,来描述你应用的原始视觉内容。比如:

  • 如果你的应用是照片编辑类,颜色保真度就比自适应环境中的白点要重要。对于这种情况,你可以使用UIWhitePointAdaptivityStylePhoto类型来减少系统提供的真色调调整的强度。
  • 如果你的应用是阅读类,和环境中的白点保持一致对用户来说就是有益的。对于这种情况,你可以使用UIWhitePointAdaptivityStyleReading类型来增加系统提供的真色调调整的强度。

App Search Enhancements

对于应用搜索,iOS10和Core Spotlight框架引入了一些增强功能:

  • 应用内搜索
  • 搜索延长
  • Crowdsourcing deep link popularity with differential privacy
  • 确认结果的可视化

新的CSSearchQuery类支持搜索那些你用Core Spotlight API指出的应用内内容。使用这些API可以淘汰你应用中单独的搜索索引,以及更好的利用Spotlight强大的搜索技术,同时,匹配规则允许用户在不离开你应用的条件下搜索内容,就像他们在Mail,Messages和Notes中体验到的一样。

在iOS9中,使用搜索API(比如Core Spotlight,NSUserActivity和web markup)在你的应用做内容索引,可以使用户通过Spotlight和Safari搜索到这些内容。在iOS10中,你可以使用新的Core Spotlight符号来延续一个用户的搜索,从Spotlight开始直到用户打开你的应用。为了支持这个特性,需要向Info.plist文件中添加CoreSpotlightContinuation关键字,并把它设置为YES,然后更新你的代码来处理这种延续活动的类型CSQueryContinuationActionTypeapplication:continueUserActivity:restorationHandler:方法中收到的NSUserActivity对象中的用户信息字典里面包括CSSearchQueryString关键字,通过这个关键字取出来的值是一个包含用户查询信息的字符串。

iOS10引入了一种差异化的私有方式来帮助改善应用搜索内容的排名。iOS提交差异化的私有哈希表的子集到苹果的服务器上,比如用户使用你的应用,比如一个包含深链接URL的NSUserActivity对象,这个对象中eligibleForPublicIndexing属性会被设为YES,这样的信息会被提交给iOS。差异化的私有哈希表允许苹果来计算受欢迎的深链接和无法与用户关联起来的链接的频率。

当你使用App Search API Validation工具测试你的网站的markup和深链接时,它现在可以更直观的显示结果。包括支持markup在内,相关的内容被定义在Schema.org。App Search API Validation工具可以帮助你查看Applebot网络爬虫都索引了哪些信息,比如title,description,URL和其他的一些支持的元素。你可以在https://search.developer.apple.com/appsearch-validation-tool这里访问到App Search API Validation工具。要了解更多有关深链接支持和添加markup的信息,请查看Mark Up Web Content

想了解更多有关如何使你网站中的图片在Messages应用中是可被搜索的,请查看Integrating with the Messages App

Widget Enhancements

iOS10引入了一个新的锁屏设计,新的锁屏现在会显示各种widget。为了确保你的widget在任何背景下都看起来很好,你可以在合适的时候指定widgetPrimaryVibrancyEffectwidgetSecondaryVibrancyEffect(使用这个属性来替换已经弃用的notificationCenterVibrancyEffect属性)。此外,widget目前包括显示模式的概念(以NCWidgetDisplayMode为代表),显示模式允许你描述多少内容是可用的,并且允许用户来选择紧凑的或是扩展的视觉效果。

Apple Pay Enhancements

在iOS10中,用户可以从网页上,或通过Siri和地图的互动来使用Apple Pay进行简单和安全的支付。对于开发者来说,iOS10引入了可以同时在iOS和watchOS上使用的新API,支持动态支付网络的能力,和新的沙盒测试环境。

iOS10引入新的API帮助你整合Apple Pay到你的网站,当你的网站支持Apple Pay,在iOS或OS X上使用Safari进行网页浏览的用户就能使用他们iPhone或Apple Watch中Apple Pay绑定的卡进行支付。想了解更多,请查阅ApplePay JS Framework Reference

PassKit框架(PassKit.framework)引入的API使你可以在某些UIKit不支持的地方使用Apple Pay。具体说来,PKPaymentAuthorizationControllerPKPaymentAuthorizationControllerDelegate可用的特性由PKPaymentAuthorizationViewController和它的delegate提供,但这些并不依赖UIKit。虽然新的API只是对于要在watchOS和某些intents下支持Apple Pay才是必须的,但我们还是推荐对于所有的代码都做适配,这样你就可以用一个代码库提供更广泛的Apple Pay支持。(要了解更多有关intents和Siri的集成,请查看SiriKit。)

PassKit框架也添加了这种特性,即允许卡片发行方在他们的应用中展示他们的卡片。具体而言,PKPaymentButtonTypeInStore按钮类型允许你为一张卡显示一个Apple Pay按钮,presentPaymentPass:方法允许你以编程的方式展示一个卡片(presentPaymentPass:方法在PKPassLibrary中定义)。

当一个新的支付网络变的可用,你的应用可以自动支持新的网络而不需要你修改或重新编译你的应用。availableNetworks方法让你可以在运行时发现用户设备上可用的网络。此外,supportedNetworks属性得到了扩展,它可以拿到一些支付提供商的名字并把它作为参数。你的应用可以自动的支持任何支付提供商支持的网络。想了解更多,请查阅https://developer.apple.com/apple-pay/

iOS10引入一个新的测试环境,它让你可以直接在设备上测试卡片。测试环境会返回加密的测试支付数据。要使用此环境,请按照以下步骤:
1. 在iTunes Connect中创建一个测试用的iCloud账户。
2. 在你的设备上登录这个账号。
3. 设置用于测试所需的区域。
4. 使用https://developer.apple.com/apple-pay/中列出的测试卡片。

注意:当你切换iCloud账户,环境也会自动切换。
你还是必须使用实际卡片在生产环境中测试付款功能。

Security and Privacy Enhancements

iOS10引入几个变化来帮助您提高代码的安全和维护用户数据的隐私性。想了解更多,请查阅https://developer.apple.com/security/

  • Info.plist文件中新的NSAllowsArbitraryLoadsInWebContent关键字为您提供了一个便捷的方式来允许任意Web页面加载,当为你的应用的其它部分保持ATS 保护。
  • SecKey API包含了对非对称密钥生成的改进。使用SecKey API替换弃用的Common Data Security Architecture(CDSA)中的若干API。
  • RC4对称加密套件现在对于所有SSL/TLS链接都是默认不可用的,Secure Transports API中的SSLv3也不再支持了。推荐你尽快停止使用SHA-1和3DES加密算法。
  • UIPasteboard类支持Clipboard功能,这个功能允许用户在设备间进行拷贝和粘贴操作。你可以使用其中的API来为一个特定的设备限定一个剪贴板,并设置一个过期时间,在此时间之后,剪贴板将被清空。此外,named pasteboards不再是持久化的-作为代替,你应当使用shared containers- 同时“Find” pasteboard(就是说,pasteboard被UIPasteboardNameFindconstant识别)是不可用的。
  • 你必须通过在Info.plist文件中包含适当的目的字符串关键字来静态的声明你应用中打算用到的受保护数据类。例如,你必须包含NSCalendarsUsageDescription关键字来访问用户的日历数据。如果你不包含明确目的的字符关键字,你的应用将会在访问相关数据的时候退出。

CallKit

CallKit框架(CallKit.framework)使得VoIP应用能与iPhone UI整合到一起,从而给用户带来更好的体验。使用这个框架来让用户在锁屏页面查看和接听打来的VoIP电话,并在Phone应用的个人收藏和最近通话视图中管理来自VoIP通话的联系人。

CallKit框架同样也引入了应用扩展(app extensions),这个扩展可以进行呼叫拦截和来电识别。你可以创建一个应用扩展来将电话号码和名称关联起来,或是告诉系统什么样的号码需要被拦截。

News Publisher Enhancements

News Publisher使用Apple News Format来让发表设计精美的新闻、杂志、网页内容到Apple News变的简单。从各大杂志或新闻机构这种独立出版商,到个人博客,任何人都可以注册。要开始使用或了解更多最新信息,请访问https://newsresources.apple.com

Video Subscriber Account

iOS10引入了Video Subscriber Account框架(VideoSubscriberAccount.framework)来帮助应用支持流媒体认证或认证视频点播(也被称为TV Everywhere)与他们的有线电视或卫星电视供应商认证。对于那些用户注册一次就能解锁流媒体订阅服务的应用来说,使用这个框架中的API可以帮助你支持单一登录体验。

App Extensions

iOS10为那些可以创建应用扩展的人引入了一些新的扩展点,比如:

  • Call Directory
  • Intents
  • Intents UI
  • Messages
  • Notification Content
  • Notification Service
  • Sticker Pack

此外,iOS10对于第三方键盘扩展应用有如下增强:

  • 通过使用UITextDocumentProxy类的documentInputMode属性,你可以自动检测文档的输入语言,然后改变你的键盘扩展来匹配这种序言(如果支持)。如果你使用这种方式检测输入语言,你可以做每种语言的键盘切换,就像自带的Messages应用那样。
  • 新的handleInputModeListFromView:withEvent:方法让键盘扩展显示系统的键盘选择菜单(that is, the globe key menu)。

一个键盘扩展应该把全局键放在相同的位置,就像系统中对于每个方向上全局键的显示一样。并且,如果你需要提供一个自定义的按键-比如支持键盘设置的按键-你
应该将这个按键放在相同的位置,就像系统键盘的听写键一样。

要了解更多有关创建应用扩展的一般内容,请查看App Extension Programming Guide

Additional Framework Changes

未完待续...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,999评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,102评论 1 302
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,709评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,439评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,846评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,881评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,062评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,783评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,517评论 1 248
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,762评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,241评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,236评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,145评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,941评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,965评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,802评论 2 275

推荐阅读更多精彩内容