Tag: IOS 10

iOS 10中的互动消息

iOS 10 SDK引入了新的Messages框架,该框架使应用程序开发人员可以创建扩展程序以与Messages应用程序进行交互。 今天,我将说明如何使用Messages框架发送交互式消息。 我们将创建一个扩展,使两个用户可以使用Messages应用程序玩经典的井字游戏。 什么是互动讯息? 以下屏幕截图将使您了解交互式消息气泡的外观。 您可以在交互式消息中嵌入图像或视频。 创建消息扩展 通过扩展可以使用向Messages应用程序添加功能的功能。 因此,首先我们将打开Xcode,创建一个新的Xcode项目,然后选择Message扩展模板。 您将观察到创建了一个带有附加MessageExtension目标的新项目。 今天,我们将为此目标进行所有工作。 MSMessagesAppViewController MessagesViewController.swift包含MessagesViewController类,它是MSMessagesAppViewController的子类。 此类是扩展的入口点和控制中心。 演讲风格 消息扩展有两种表示样式。 紧凑型-从应用程序抽屉启动扩展程序时,最初显示此样式。 扩展-您可以单击紧凑样式中的扩展箭头以过渡到扩展样式。 当发件人单击交互式消息之一时,也可以触发它。 应用逻辑 我们仅允许用户使用扩展的呈现方式玩此游戏。 因此,您可以单击一条消息,放置标记(x或0)。 一旦放置了标记,将包含表示游戏板当前状态的图像的消息插入到输入字段中。 用户可以控制是否要发送消息。 接收者收到消息后,可以单击该消息并继续前进。 用户移动后,显示新状态的图像将插入到输入字段中。 通过仅添加标签,我们将使紧凑的演示文稿样式保持简单。 项目概况 GameBaordVC —此视图控制器以扩展的呈现方式呈现。 这将处理与玩游戏有关的所有功能。 GameBoardVC管理的视图具有collectionview。 轻触单元格可让用户在单元格上放置x或0标记。 CollapsedVC —此视图控制器以紧凑的表示形式表示 GameStateVM —此视图模型将保存有关游戏板当前状态的信息,并做出有关游戏结果的决定。 呈现消息扩展UI MSMessagesAppViewController通过以下方法通知扩展的各种状态更改。 启动扩展时,将按指示的顺序调用以下方法。 1. func willBecomeActive(与对话:MSConversation) 2. func didBecomeActive(与对话:MSConversation) 3. func viewWillAppear() 4. func viewDidAppear() MSConversation对象表示消息对话。 […]

通过React Native触发iOS 10可操作的推送通知

在本教程中,我们使用Xcode和React Native来配置和创建本地自定义推送通知。 背景 通知内容扩展用于显示iOS应用通知的自定义界面。 React Native可让您仅使用JavaScript构建移动应用 使用React Native创建一个新应用 请按照此处的说明安装React Native并生成一个新项目: 在Xcode中启用推送通知 您可以按照此处的步骤启用本地推送通知: 确保您的捆绑包标识符是唯一的。 尽管还有更多步骤可以启用远程通知,但您所要做的就是切换此开关以启用测试本地推送通知。 在Xcode中链接React Native的PushNotificationIOS库 请按照此处的说明将React Native的PushNotificationIOS库链接到Xcode。 使用Xcode在您的应用中创建新目标 选择您的Xcode项目,然后添加并命名一个Notification Content扩展目标: 告诉Xcode如何找到您的通知 出现新目标。 选择它,然后在其Info.plist中 ,设置UNNotificationExtensionCategory和UNNotificationExtensionInitialContentSizeRatio的值。 测试来自React Native的推送通知 在您的React Native代码中导入库: 从’react-native’导入{PushNotificationIOS}; 触发来自RN的推送。 确保使用上面创建的类别: componentDidMount(){ PushNotificationIOS.requestPermissions(); PushNotificationIOS.presentLocalNotification({ alertBody:“ Hello World”, 类别:“ myNotifcationCategory” }); } 在React Native中启用LiveReload后,当我关闭应用程序并保存RN文件时,可以看到推送通知: 下一步:自定义视图并处理用户操作 在这里,您可以编辑NotificationViewController.swift文件以实现didReceive方法。 使用它来配置您的通知界面并处理用户操作。 在RN中使用userInfo对象将任意信息传递到Xcode ViewController,从而填充MainInterface.storyboard提供的UI字段。

NSLog或os_log:如何记录多个iOS版本?

有一天,我们的质量检查人员通知我,在iOS 10设备上进行测试时,他没有看到我们的日志消息。 “早上好,Siri亲爱的,”我单击了屏幕右上角的圆形图标。 “我没有看到我的NSLog消息,请告知…” 她傲慢地回答:“您应该切换到os_log API”。 “而且请不要再问我紫色36倍是多少,哪只熊是最好的,或者查克·诺里斯(Chuck Norris)可以通过打架击败雷神”。 谢谢Siri,我拭目以待。 基本上,快速浏览一下我们的代码发现,我们的NSLog调用不再显示在控制台应用程序中。 现在,我们将代码编写为库。 这意味着我们在应用程序中的日志消息,即我们的质量检查人员在测试时寻找的消息,是发行版中编译的dylib的一部分。 在这种情况下,NSLog从iOS 10.0开始不起作用。 有什么用? 好吧,根据Siri所说,应该有一个新的API,即os_log API。 您问什么是os_log API? 好吧,它正式被称为“统一日志系统”。其功能被描述为“集中日志数据在内存中和磁盘上数据存储的集中化”。 因此,我们面临着相当大的难题。 Siri自己说,新的os_log API是可行的方法,但仅从iOS 10.0开始可用。 我们别无选择-我们必须在可用时使用新的API,但对于旧版本仍要使用NSLog。 我们该怎么做? 要阅读整个故事,请单击此处。

在iOS应用中设置导航栏的样式

因此,您已经开始开发Wee应用程序,甚至是大型应用程序,并且想要实现以下目标: 它看起来非常简单:状态栏为白色,状态栏下方为深红色,导航栏具有相似但略有不同的颜色。 只是开个玩笑,这些颜色就以“ breakapp”的速度摆在一起供您使用。 关键是要弄清楚如何在iOS中执行操作非常棘手,除非您知道从哪里看。 有时,您感觉就像是您在掌握Google搜索,而不是如何编码才能找到这些东西。 但是,请不要害怕,亲爱的朋友们,请继续阅读,我将向您展示导航栏向导的方法。 我们需要做的第一件事是导航到应用程序的AppDelegate。 当您在此处设置样式时,它们将在整个应用程序范围内。 首先,让状态栏样式(顶部为白色文本和电池信息等)点亮内容。 func application(_ application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:Any]?)->布尔{ application.statusBarStyle = .lightContent } 在didFinishLaunchingWithOptions函数内部,只需输入上面的代码。 生成并运行。 等待它不起作用。 事实证明,您还需要通过转到info.plist并添加新键来确认此选项:“查看基于控制器的状态栏外观”并将其设置为“ NO”。 如果您只输入’V’,它实际上会首先出现在列表中,这样您就不必记住它了-如果您真的想记住它,请使用一个助记符,例如:’不应允许弯曲的瓶子’(VCBSBA)…无论如何 繁荣! 您的应用现在具有很好的轻量级内容。 但是,我们如何增强NavigationBar的功能,使其充满色彩呢? UINavigationBar.appearance()。barTintColor = UIColor(红色:230/255,绿色:20/255,蓝色:20/255,alpha:1) 原来,您只使用barTintColor,它非常简单。 顺便说一句,您可能要删除NavigationBar底部的细微阴影。 如果是这样,请执行以下操作: UINavigationBar.appearance()。shadowImage = UIImage() 尽管看起来有些古怪,但这可以有效地消除阴影。 香蕉警报 是。 让我们这样做。 让我们首先在闭包中定义一个漂亮的小视图。 这包含我们需要的所有属性,并将其装箱返回。 好极了! 让navigationBackgroundBar:UIView = {让视图= UIView()view.backgroundColor = UIColor(红色:220/255,绿色:10/255,蓝色:10/255,alpha:1)view.translatesAutoresizingMaskIntoConstraints = falsereturn view}() 在上面,您只是在创建一个视图,设置它的背景色,停止自动翻译出现在手动视图中的约束(它只是在提供帮助,但我们不需要),然后返回该视图。 差不多好了。 window?.addSubview(navigationBackgroundBar) […]

带媒体附件的iOS丰富推送通知

与旧操作系统版本相比,iOS 10为我们带来了具有新功能的推送通知。 改进包括在通知中立即查看照片,视频或Gif。 通过使用新的Notification Service Extension ,可以将这些媒体附件作为通知的一部分。 您还可以使用新的Notification Content Extension来在通知的媒体附件视图中拥有更丰富的View Controller级别的内容。 我们将在下面浏览一些代码。 确保您具有: Xcode 8.0+ OS X El Capitan 10.11 将UserNotifications.framework导入到您的项目中。 苹果推送通知服务将您的应用程序的远程通知发送到每个用户的设备。 将向APNS服务器发送通知和设备令牌。 依次,他们处理该通知到正确的用户设备的路由。 届时,iOS将接管并确保将通知发送到您的应用程序。 推送通知的最大有效负载大小为4KB,它们支持开发和生产环境。 为了使您可以执行Notification Extension代码,必须对推送通知有效负载进行一些修改(例如,与iOS 9相比)。 { “aps”: { “alert”: { “body”: “Push notification body”, “title”: “Push notification title” }, “mutable-content”: 1, category: “rich-apns” }, “media-url”: ” https://i.imgur.com/t4WGJQx.jpg ” } ” } […]

自定义iOS View Controller过渡

查看/下载该项目的源代码 是否曾经想过在View Controller过渡中添加一些“ pezaz”? 确保内置的过渡看起来还可以,但是有时候您想要的东西会让您的用户充满过渡的喜悦。 在这篇简短的文章中,我们将要做到这一点。 我们开工吧。 主要玩家 我可以向您介绍一下本课程中的精英球员群体: UIViewControllerTransitioningDelegate 我们将遵循此协议,以允许我们使用自定义过渡:我们可以按字面上设计我们想要的任何过渡! 谈论: UIViewControllerAnimatedTransitioning 这个坏男孩将使我们能够为View Controller设计完全rad和自定义的过渡! 怎么了 是的 鸡休息 那么这里需要什么方法? 好吧,在这种情况下,我发现所需的方法确实非常有用且合乎逻辑。 例如,在UIViewControllerTransitioningDelegate中,我们需要添加以下方法: animationController(forPresented)和animationController(forDismissed)—实际上,我们需要在动画呈现视图时和何时关闭视图时调用一些东西。 类似地,当遵循UIViewControllerAnimatedTransitioning时,我们将使用: transitionDuration()和animateTransition(using)-在这里,我们提供了过渡的持续时间(显而易见的)以及实际的动画。 让我们开始 开始一个新项目,并为过渡创建一个新的Swift文件。 在其中,我们将从NSObject继承以开始,然后遵循AnimatedTransitiong: 类CewlAnimation:NSObject,UIViewControllerAnimatedTransitioning { } 在这里,您将需要两种方法来使过渡正常工作: func transitionDuration(使用transitionContext:UIViewControllerContextTransitioning?)-> TimeInterval {返回1.0 //只要您喜欢就可以:-D} fanimanimateTransition(使用transitionContext:UIViewControllerContextTransitioning){ //动画Meh!} 太棒了! 让我们添加一些动画。 func animateTransition(使用transitionContext:UIViewControllerContextTransitioning){让containerView = transitionContext.containerViewlet toView = transitionContext.view(forKey:.to)toView?.transform = CGAffineTransform(scaleX:0.0,y:0.0)containerView.addSubview(toView!)containerView。带子视图(toFront:toView!)UIView.animate(withDuration:1.0,动画:{toView?.transform = .identity})transitionContext.completeTransition(true)} 哇! 那是很多代码。 在基本级别上,这将在视图之间进行1秒钟的过渡,并在其中进行缩放以从中心填充屏幕。 让我们将代码分解为可咀嚼的内容: […]

友好介绍iOS动画

今天,我们将介绍iOS中的基本动画。 动画是在您的应用程序中增加自定义和交互性的一种好方法,我们可以使用它们做很多事情。 在本课程中,我们将介绍一些基础知识,以便您可以入门。 动画遵循一种简单的模式: 从->到持续时间。 我什么意思 好吧,我们声明我们想要的视图,或者我们要进行动画处理的所有内容,然后进行动画处理。 让我们举个例子。 假设我们要在应用程序中以某种方式对图像进行动画处理。 我不会在此处介绍更改大小或约束的问题,但我将向您介绍动画API。 UIView.animate(withDuration:1.0,动画:{}) 在这里,我们可以访问名为UIview.animate(withDuration)的静态方法 。 什么是静态方法? 这是UIView类上存在的一种方法,我们可以通过简单地编写UIView来按常规方式访问。 最基本的实现带有持续时间和动画闭包。 每当您在闭包内编写动画时,这些动画将在1.0秒内执行。 您可以延长和缩短这些值以适合您的需求。 我希望对动画的超级简短介绍能使您对iOS的动画API感兴趣。 敬请期待更多!

热门iOS 10 Objective-C和Swift 3.0代码示例

自2008年iOS推出以来,已有超过200万个应用下载了1300亿次。 iOS平台的普及并不是什么秘密,每次新的迭代都带有巨大的期望。 借助iOS 10,Apple为iPhone和iPad开发人员提供了对该软件的更多控制权,引入了允许创建新类别的应用程序和功能的新框架和工具。 为iOS 10开发的应用程序还扩展了系统服务,以提供更多引人入胜的功能。 iOS 10中有许多新功能,但是在本文中,我们将为发现最有趣和有用的示例提供示例。 UIViewPropertyAnimator iOS 10引入了一种编写动画代码的新方法:使用UIViewPropertyAnimator。 这不是现有API的替代,也不是客观上“更好”,但它确实为开发团队提供了以前无法实现的控制水平。 从本质上讲,UIViewPropertyAnimator增强了在我们的应用程序中创建动画的选项。 新选项包括停止动画和恢复动画(以及其他时间参数),随时结束动画,反转动画或将其移动到任何选定的时刻等等。 另一个新颖的事实是,除了以前使用的动画定时选项(例如EaseInEaseOut)之外,我们现在还能够基于三次函数的检查点定义自己的时间函数。 在iOS 10之前,在iOS上执行基于手势的可中断动画是一项麻烦的任务,通常需要第三方框架。 仅动画时间的精细控制就可以使Property Animator改进我们现有的UIView动画。 但是,它们真正闪耀的地方是当您创建的动画不只是一劳永逸时-我们希望用户能够抓取动画对象并与之互动。 在Objective-C和Swift 3.0中查看UIViewPropertyAnimator的代码示例。 呼叫工具 iOS 10 CallKit是一个全新框架,在WWDC 2016上首次引入。CallKit使您的Internet协议语音(VoIP)应用程序与本机Phone UI紧密集成,从而极大地增强了用户体验。 VoIP并发症 在CallKit之前,VoIP呼叫只是一个通知。 用户无法区分传入的文本消息通知和传入的电话通知之间的差异。 自然,这导致大量未接电话。 在锁定的屏幕上,即使用户设法通过滑动通知来接听电话,他/她也需要输入密码,并被重定向到应用程序,然后才可以开始讲话。 在未锁定的屏幕上,体验同样差劲,因为来电通知只是屏幕顶部的横幅。 更进一步,发出呼叫要求用户启动VoIP应用程序并从那里启动它。 iOS 10 CallKit的改进 CallKit解决了所有这些复杂问题。 借助iOS 10 CallKit,第三方VoIP应用程序可能成为用户拨打和接听电话的主要方式。 来电具有丰富的本机UI,带有接听和拒绝按钮以及用户的自定义铃声。 可以通过本地电话应用程序的联系人,收藏夹和最新消息(通过Siri,通过蓝牙或CarPlay)完成通话。 iOS 10 CallKit允许VoIP呼叫与电话呼叫,FaceTime呼叫甚至其他VoIP呼叫相互作用。 系统知道所有呼叫后,便以相同的优先级处理它们。 这意味着当接到电话时,VoIP呼叫不再处于保留状态。 此外,用户可以使用“请勿打扰”功能,可以阻止联系人或静音呼叫,甚至可以在进行中的呼叫和保持的呼叫之间进行交换,无论其类型如何。 **注意:此示例需要在设备上构建** 在Objective-C和Swift 3.0中查看CallKit的代码示例。 SiriKit SiriKit是一个新框架,允许开发人员将其应用程序的内容和服务与Siri集成在一起,因此用户可以仅凭自己的声音进行操作。 […]

良好的iOS核心数据堆栈

我当时正在编写一个新的仅限iOS 10+的核心数据堆栈,并认为我将展示该过程变得多么简单。 数据协调员 我真的很想让一个人来管理核心数据堆栈。 传统上总是调用此CoreDataManager。 现在,将其命名为DataCoordinator。 最终课程DataCoordinator { 私有静态var协调器:DataCoordinator? 公共类func sharedInstance()-> DataCoordinator { 如果协调员==无{ 协调器= DataCoordinator() } 返回协调员! } 私人init(){ } } 3层架构 TL; DR跳至下一部分。 这不再是必需的。 现在我们需要设置一个核心数据栈。 我们需要有2个堆栈或2个上下文。 用于在主线程中读取和显示数据。 用于主要通过api调用和其他后台进程写入数据 这是通过使用3层体系结构来最佳实现的。 P1用于保存到持久性存储。 C1,C2是P1的子上下文。 C2用于从API写入。 以便将保存的更改快速传播到C1。 C1更改将传播到P1。 作为其子上下文。 传播速度很快,并且写入持久性存储的操作是在另一个上下文中进行的。 C1中的操作相当快。 这是建立3层架构的整体目标。 性能! 所有这些都不再需要设置。 NSPersistentContainer iOS 10引入了新的NSPersistentContainer类,该类将建立3层架构的所有样板代码减少到下面几行。 …公共变量容器:NSPersistentContainer 私人init(){ 容器= NSPersistentContainer(名称:“模型”) container.loadPersistentStores(completionHandler:{{_,error)在 如果让错误=错误{ fatalError(“未解决的错误\(错误)”) } }) } […]

如何以编程方式在iOS 10上打开Objective-C中的WIFI设置

下面的代码在iOS 9上正常工作,请参阅这篇文章。 但它不适用于iOS 10.如何在iOS 10上以编程方式打开WIFI设置 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs:root=WIFI"]];