Tag: Appworks School

TableView顶部的iOS视差视图

本篇文章将按步骤详细说明,如何在iOS TableView中实作Parallax的其中一个视觉效果,Demo Project使用XCode 8,Swift 3 ,适合读者为: 了解ScrollView的ContentOffset属性以及委托设计Patten。 熟悉ImageView的ContentMode属性。 对AutoLayout有基本了解。 下图为想要实现的效果,上方的ImageView会跟着拖动的动作产生相对应的变化。 步骤1:从 Dropbox 下载启动项目 。 (按此下载) 下载后,打开ParallaxDemo.xcodeproj ,里面已经有一个写好的TableView,在每一个单元格里面显示每一个各自的行号。 步骤2:透过TableView的ContentInset属性,将TableView往下移,腾出上方的空间,给后续要置入的ImageView使用。 在DemoTableViewController里添加一个imageViewLength属性: 类DemoTableViewController:UIViewController,UITableViewDelegate,UITableViewDataSource { // 1 让imageViewHeight:CGFloat = 200.0 … } 在DemoTableViewController里面的setUpTableView()函数中加入以下代码: func setUpTableView(){ // 2 tableView.contentInset = UIEdgeInsets(顶部:imageViewHeight,左侧:0,底部:0,右侧:0) // 3 tableView.contentOffset = CGPoint(x:0,y:-imageViewHeight) … } 以下说明每一段程式码的作用: 设定要留给ImageView的高度,将之存在ImageViewHeight属性中,以供后续使用。 设定TableView的ContentInset,这个属性的资料类型状态是UIEdgeInsets,透过分别设定上,左,下,右,可以调整TableView的内容视图与底下ScrollView的相对距离。这里我们把ImageViewHeight作为UIEdgeInset初始值设定项的top参数,并将这个新生成的UIEdgeInset物件指定给TableView的ContentInset属性。 设置好ContentInset后,为了让一进来App的时候,显示上方的空白,我们还必须设置TableView的ContentOffset,让上方的空白可以被看见。 设定完这些指令之后,跑模拟器就可以看到下方的画面: 步骤3:添加ImageView 在DemoTableViewController里添加setUpImageView函数: 接下来就进到更重要的部分,UIScrollView有相对应的协议:UIScrollViewProtocol,会在发生一些事件的时候通知委派对象,执行相对应的方法,而UITableViewDelegate协议继承自UIScrollViewDelegate,自然也继承了这些方法。我们将会用到scrollViewDidScroll()这个功能。 将下列的程式码新增到DemoTableViewController中: 3. changeImageViewHeightConstraint(contentOffset:CGPoint) 当TableView已经被滑到最上层的画面,还继续被拖动的时候,我们希望imageView变大,来替换空白,所以我们去修改的imageViewHeightConstraint,让imageView随着拖动的动作高度变大,而因为contentMode设置为ScaleAspectFill的关系,imageView显示的内容就会有所改变,达到我们想要的效果。 […]

写在最初

「你为什么想要转职?之前的工作不好吗?你有下定决心要成为软体工程师了吗?」 翻开自己的履历,中文系,公关公司, 这些背景或许很难跟写Swift,开发iOS系统相连。 在经过高强度,密集的驻点集训后, 该是时候好好整理这近半年来的奇幻旅程。 目前预计内容希望会有:独立开发专案,AppWorks School收获,转职面试心得,实作解题纪录等等。 独立开发专案 [iOS]我的第一个App —很多诞生 求职系列 求职|工作求职101–软件工程师求职|软件工程师求职,面试篇求职|转职工程师之面试心路历程 实习系列 实习| IOH六个月的奇幻旅程 随时留下任何评论或反馈。 如果觉得文章不错的话,欢迎帮我拍拍手👏🏻👏🏻👏🏻

iOS中的Google Analytics(分析)— 1

当我们想要在App里面追踪使用者行为时,就需要第三方服务的支持,像是GoogleAnalysis,Mixpanel等。这里介绍Google Analytics iOS SDK及相关报表,包括屏幕,事件,电子商务,会话。广告,崩溃和异常,社交,用户ID,用户计时。 这个系列适合对Objective-c及iOS开发有初步熟悉度的读者。 调度 GA的资料收集,当天的资料必须在隔天的。4 am以前称为GA,否则就不会出现在当天报表上。 [GAI sharedInstance] .dispatchInterval = 120.0; 如果把这个属性设定比1还小,可以禁用auto dispatch,资料会等待上传: [GAI sharedInstance] .dispatchInterval = 0; //调用此方法手动发送数据 [[GAI sharedInstance]调度]; 事件追踪 App里面会有各式各样使用者所触发的事件,GA也提供了相关的API来监控这些事件,先来看看有什么参数: Category是Event的大分类,每个Category里面再由Action来区分事件。 你可以透过GAITracker send方法,把参数个别填入之后,送出事件。 id tracker = [[GAI sharedInstance] defaultTracker]; [跟踪发送:@ {kGAIEventCategory:@“游戏”, kGAIEventAction:@“攻击”}]; 或者通过GA的GAIDictionaryBuilder类所建立的方法来送出事件。 [跟踪发送:[[GAIDictionaryBuilder createEventWithCategory:@“ ui_action” 动作:@“ button_press” 标签:@“播放” value:nil] build]]; 透过上述的两种方法,Google就可以帮我们纪录用户与App的互动事件。事件追踪的报表可以在Google Console→行为→事件里面找到相关的纪录。 屏风 Screens在GA里面代表用户在看的画面,通过收集这个数据,可以知道用户停留最长的页面是哪一个,以及使用者的浏览app的状态。先来看一下Screens的键: GA有提供两个方法来送出屏幕快照,一个是手动送出,一个是继承GAITrackedViewController : 手动送出: id tracker […]

iOS中的Google Analytics(分析)— 2

在上一篇介绍了Google Analytics(分析)iOS SDK里面的屏幕,事件,电子商务,会话。接着介绍会再介绍广告,崩溃和异常,社交,用户ID,用户计时。 广告 目标对象报表提供非常详细的,关于产品访客的资讯,包含访客的性别,年龄,国家/地区等,通过目标对象报表您可以替换出访客族群,以及他们的特征,甚至我们可以做到完整的客群分析。如果您想获得使用者的年龄,性别,兴趣等资料,必须要开启GA的IDFA功能,并在App送审的时候,改为使用IDFA(广告标识符,Apple使用追踪用户的广告识别但必须要注意的是这些顾客资料都是Google推算出来的,并非真实资料,使用上要小心。 tracker = [[GAI sharedInstance] trackerWithTrackingId:@“ UA-1234-2”]; tracker.allowIDFACollection = YES; 广告的报表可以在Google控制台→目标对象里面找到相关的纪录。 崩溃和异常 如果使用者在使用我们开发的App遇到闪退,肯定正确这个这个App有不好的印象,甚至就不使用这款产品了,所以Developer必须要在第一时间知道这个问题并修复它,这当时就需要崩溃日志来辅助。GoogleAnalytics(分析)提供两种不同的方式来记录崩溃跟Exception,先看Exception的定义: 发送异常到GA时,有两个栏位可以让我们填充,分别是描述与isFatal,他们都有各自定义好的键。GAAPI里面的GAIDictionaryBuilder类也有专门为制作Exception的方法可以使用。 [self.tracker发送:[[[GAIDictionaryBuilder createExceptionWithDescription:description withFatal:@NO] build]]]; App Crash的搜集则是另外一种方法,通过设置GAI的singleton的trackUncaughtExceptions属性为YES,当App发生非预期的错误,系统就会自动发送崩溃报告到Google Analysis。 gai.trackUncaughtExceptions = YES; 所有被Google自动捕获到的崩溃在报告中都会标注成fatal属性(fatal = YES。)。描述栏位会包含异常类型,类名,方法名还有线程名。可以在Google Console→行为→当机和例外状况里面找到Crash&Exception的纪录。 社交互动 社交互动可以帮助我们纪录每一笔的分享,或者App提供的任何分享管道。 id跟踪程序= [[GAI sharedInstance] defaultTracker]; NSString * targetUrl = @“ https://developers.google.com/analytics”; [跟踪发送:[[GAIDictionaryBuilder createSocialWithNetwork:@“ Twitter” 动作:@“ Tweet” target:targetUrl] build]]; 目前这个项目的资料只能在客制化的报告中获得,这里没有特别去尝试这个部分。 用户身份 透过GA里面的UserID的特性,可以将同一个使用者,在不同装置上的行为都记录起来,形成有意义的资料。 [self.tracker设置:kGAIUserId值:@“ […]

iOS开发:设备检查

作为一个iOS开发者,如何识别始用者装置可以说是基本功课,最近正好被老板开了一个帐号绑定Device的需求,整理了过往的几种作法,跟各路iOS新手分享一下,重点在最后2017 WWDC最新推出的Device Check,也有实作的程式码。 话不多说,就从最初的UDID开始吧! 在iOS 5之前,如果要辨认使用者的设备,可以利用以下程式码: [[UIDevice cuurrent] uniqueIdenfier] 来获得设备的UDID(唯一设备标识符),以达成装置绑定或追踪。这个值是唯一且永远不会变的。 而是实际上存在有隐私问题,UDID等于设备的身分证字号,如果开发者可以随意获取UDID,代表他们可以通过各种分析来获取『多于开发者应获取的资讯』。 UDID这么潮的功能,注重专有权的Apple当然不会让我们一直使用。其后Apple提供了另一种识别方式— IDFV(供应商标识符) 让id = UIDevice.current.identifierForVendor 如果说UDID是Device的身分证字号,IDFV比较像是Device的『工号』 每个应用开发者能取到的设备IDFV都不一样。 举例来说,用户下载了A开发商的a,b两款App,同时下载了B开发商的c App,A开发商如果用上面的程序代码获取IDFV,在两款app中皆会取到1234 ,而B开发商会取到5678。 而这个IDFV既然是“ identifierForVendor”(IDFV),就算删除App,重新下载过后仍然会取到一样的IDFV。 不过!如果将手机内同一个开发商的App全数删除后,这个IDFV将会重置,随后再次用户再次下载同一个开发商的App,会拿到不同的IDFV 另外,还有UUID()这个识别方式 让uud = UUID() UUID是一个128位的数值,里面加入了产生UUID当下的时间去计算出来,不过UUID就是一个几乎不可能重复的随机数值而已,其中也不会有什么开发商或装置的识别方法。 我们透过将UUID存放在Keychain中基本上也可以达到我们对于绑定装置的需求。存储于Keychain的方法可以参考介绍: http://www.jianshu.com/p/9e885c3e6b0a 而在2017年的WWDC上,苹果推出了另外一种装置识别的API — Device Check。我们先来看一下官方说明Device Check的使用情境: 举个比较易懂的例子,今天一个App提供了30天的免费试用,期限到了之后透过Device Check的API把装置从状态A(试用中)标注为状态B(已过期),之后却是删除App重新下载,或者系统重置,都不会影响到这个状态的判定。而这个状态,其实就是两个位所组成的,最多处于状态而已。 接着来看一下Device Check API的运作流程: 上图可以看到,先在客户端端生成令牌,然后丢给服务器,服务器可以再针对以下几种属性传给Apple,让资料保存在Apple端。 “ device_token” => $ deviceToken, “ transaction_id” => Uuid :: uuid4() -> toString(), […]