IOS的UIKit以及一些乱七八糟的经验,Android程序入

作者:计算机网络

一款记录跑步应用,能记录运动轨迹和运动过程中的数据,功能实现比较完整,15年年底做的上架项目,开发者账号过期AppStore上已经搜不到了,不过一些Android应用市场还能找到Android的版本。

很多刚入门的程序员,在实现程序的时候都希望一步到位,将程序代码一次完成。这一方面是因为刚入门程序员接触的项目比较简单,代码量不多。另一方面,也可能是缺乏开发经验导致。一步到位实现程序有两个结果。一是程序正常运行,另一个是一运行就出现错误。排查起来相当麻烦。笔者在这里提供一个搭建UI界面的小项目,分析其实现过程中怎么减少bug的出现,提高编码效率。

新接触一门程序或者开发框架,我一般都要先弄清楚程序的入口在哪里,程序怎么运行的;建立一个项目后,各个文件夹有什么作用以及如何使用等等。理清楚这些东西对以后开发是很有好处的,古话说得好,工欲善其事,必先利其器。本文主要总结android程序的入口点和程序的运行流程(初识),android项目中各文件夹的含义,以及它们的使用。

UIKit框架提供了重要的基础方法可以用于创建和管理IOS应用。这个框架提供了可以管理app交互界面的窗口和视图结构,应用用户输入的基层响应事件,驱动main run loop和系统交互的app模型结构

源码放出来作为学习交流。见github。

项目是支付宝的口碑界面。如下图

刚接触android程序,配置好开发andriod的环境,建立一个项目,框架自带的经典hello程序,然后就可以在虚拟设备上进行运行了。但是对程序从哪里开始运行的,下一步应该执行哪个函数,以及各个项目文件夹干什么的,里面存储什么,都有什么作用等等这些都是一脸懵逼的。经过这几天的摸索,对这些概念有那么一点点理解,下面进行总结一下,有不对的地方,敬请各位android大牛进行指出,感激不尽。

除了这些重要特性,UIKit同样对下述特性提供支持:

应用截图

应用大概长这个样子,截取了部分界面

图片 11.jpg图片 22.jpg图片 33.jpg图片 44.jpg

图片 5图片 6

1 Android程序的入口

一个视图模型可以概括你的用户界面的内容

项目文件结构

项目的文件结构如下所示

图片 75.jpeg

界面相关的实现全在View里,其他文件是一些比较独立的且和整个项目相关的功能的实现。

个人偏好是以功能模块来划分文件,如跑步相关的功能会专门放一个文件里,用户相关的功能又会放另一个文件里。看其他一些开源项目,比如以MVVM为架构的工程,会专门分为ModelViewControllerViewModel三个文件夹,然后所有相关的文件无论功能划分全堆到对应的文件里。这里会存在一个问题,当应用比较复杂的时候,每个文件夹下便会存在很多文件,从中去找要修改的文件很麻烦,而且修改同一个功能还要跨文件夹工作。

还有一种方式是文件夹按功能来划分,然后在每个实现对应功能的文件下再按MVVM或者MVC架构的方式划分对应的文件夹,看个人喜好。

界面的实现,个人习惯是将界面中关联较紧密的部分,单独抽出来作为一个独立的控件,对外提供修改数据的接口,视图控制器直接引用这个控件,并通过外部接口来修改该控件的显示,而不用关注控件内部例如布局相关、UI设置的具体实现。有时候控件里面也会包含其他的控件。总之就是为了将对外无关的代码实现封装到类中,外部操作控件时只需要关注逻辑实现。

以前公司的项目,见过一个视图控制器类,包含所有视图的生成布局设置,和相关业务逻辑的处理,结果就是一个UIViewController类文件的代码行数近3万行,简直是维护人员的噩梦。所以个人偏向将比较独立的代码单独抽出为一个文件,无论是界面布局相关,或是业务流程处理相关,尽量保证每个文件的代码在几百行之内。

整个界面实现起来并不困难,可以使用collectionView或者tableView。然后添加一个头部视图,和底部视图。头部视图xib文件中添加collectionView,通过自动布局将数据加载到视图中。但这里我们不重点讨论该界面的实现。我们关注的是如何在实现一个项目时减少bug的出现。这里介绍的方法是在实现项目的时候边实现变检查。同样,在通过AFN从网络请求数据的时候也应该写一段代码后运行检查代码的执行效果。在通过自动布局设置好一个控件后,就可以运行看下运行效果,如果实际效果和我们的预期效果有差别,我们再着手进行修改。或者出现报错情况,我们也可以及时进行修改。但如果把所有空间都设置完成,再去检查,出现报错后问题就很难进行排查。整个项目可以从简单的方面入手,方便编程过程中直观地检查已经写好的代码有没有运行成功。

1.1 Activity类

在andriod的应用程序中,用户所感知的都是一个个应用界面,在android程序里面每个应用界面对应一个 Activity类,这类似于.NET Winform项目中的Form窗体。与WinForm中的Form一样,Activity类也是一个基类,每个视图界面都是继承Activity的。下面看一下Activity的扩展类的代码。

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        //执行逻辑代码
    }    
}

当Activity进行创建的时候,它会执行onCreate函数,当然,在Activity不同的生命周期中,会执行相应的函数。onCreate函数会在创建的时候被调用,同样的,当这个Activity界面不可见的时候,又会调用onStop函数。这和WinForm又有些类似,这些函数对应Winform窗体的FormLoadFormClosing事件,但是不一样的,FormClosing事件内部可以取消该窗体的关闭,而Activity却不可以,这也是很好理解,因为在android程序中,你自己点击后退键,那是肯定会回到前一个界面,当前界面会消失。

我们可以在程序建立许多个Activity界面类,和我们的WinForm程序一样,也可以建立多个Form窗体界面,那么问题来了,这么Activity界面,程序在启动的时候,应该启动哪一个?

支持基于触控和运动的事件

布局方式

大部分视图控件使用了xib做自动布局,没用storyboard做页面间的跳转,是因为大部分时间用笔记本做开发,小屏幕看storyboard一堆连在一起的界面体验太差。当时开发的时候还是15年年底,iOS9的reference也才刚出,项目需要兼容iOS8。

有些视图的布局,需要的运算很小,懒得专门新建个xib,就直接通过计算frame的方式来实现了。

有些使用了xib但需要做布局变化的地方,会引用布局约束NSLayoutConstraint,通过代码方式对布局约束进行调整。

也有些地方尝试使用纯代码定义NSLayoutConstraint的方式来实现自动布局,感受就是,实现的代码量太大,不方便后续维护修改。

抽点代码出来感受一下。。这段代码其实在xib里面就是给一个视图添加了一个上下左右边缘的约束和对应的间距,界面上点几下就能实现的事,换成代码会要用好多行。所以项目里的布局能用xib的基本全用xib了,我懒。

...[self addConstraint:[NSLayoutConstraint constraintWithItem:_contentView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]]; [self addConstraint:[NSLayoutConstraint constraintWithItem:_contentView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]]; [self addConstraint:[NSLayoutConstraint constraintWithItem:_contentView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0.0]]; [self addConstraint:[NSLayoutConstraint constraintWithItem:_contentView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:0.0]]; ...

若真想用代码来实现自动布局,推荐一个框架Masonry,它对NSLayoutConstraint做了一层封装,用一种更直观更优雅的编码方式来实现布局约束。这个框架有对应的Swift版本SnapKit,也是同一个团队在进行维护。具体可查看官方文档。

例如上面这个项目。假设我们要通过自动布局,tableView来实现。我们就要在storyBoard中拖入tableViewController.按照程序的实现顺序,我们先从上往下实现。第一步先实现headerView.在这里headerView有多种实现方法可供选择,第一种是使用xib,然后通过九宫格算法布局控件。第二种是使用原型cell。但在这里最简单的方法是使用collectionView,然后通过xib布置子控件。我们去实现这些步骤的时候不是先去计算collectionView中item之间的间距,还有内边距等。实现时我们先使用假数据写死collectionView的item,让collectionView先显示出来。再通过视图显示效果去调整页面布局。根据我们的想法计算边距,内边距等,然后再运行查看我们的计算结果和和运行效果。如果界面不理想,就再调整算法,直到视图显示正常为止。这样做的好处是能够动态地调整我们的算法。能及时检查出代码中的错误,进行调整。

1.2 AndroidManifest.xml配置文件

在WinForm程序中,程序的启动一般是Program类中的Main 负责启动第一个程序界面,而在android程序中则是使用配置文件来配置入口的Activity界面。下面是AndroidManifest.xml 配置文件中的代码。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloworld"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="16"
        android:targetSdkVersion="21" />

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

该配置文件是每一个android项目都必须要有的,下面解释部分节点的含义。

  1. uses-permission :表示用户需要授权该程序的权限,上面xml中配置的需要用户授予访问网络的权限。
  2. application : 这个配置节点很重要,它的子节点 activity 就是配置android程序的入口,android:name=".MainActivity" 配置了程序的初始视图界面为MainActivity (这个MainActivity类在src文件夹中)。而 actioncategory 节点配置也很关键,action节点中的android.intent.action.MAIN表明这个Activity是整个应用程序的入口点;而category中的android.intent.category.LAUNCHER意思是把这个Activity归属到加载器类,即把这个Activity标注为自动会加载和启动的Activity,这样程序启动时候就先加载这个Activity了。

目前理解的andriod程序运行是这样的。至于内部如何实现的,目前涉猎不深,暂不明白。(望高手指点)

首先,加载程序需要的一个资源,接着读取配置文件,找到application节点中配置的入口Activity视图,然后加载该Activity视图进行显示。

一个文档模型包括了云整合;可参见 Document-Based App Programming Guide for IOS

第三方库

主要用到的第三方库:

  • 高德地图SDK:用来做路径绘制和定位
  • ShareSDK:第三方分享和登录
  • FMDB:本地数据库的操作
  • AFNetworking:网络请求
  • 友盟SDK:做埋点统计和用户反馈

使用到的第三方库都放到了项目Vendors文件夹里,当时是直接将第三方的源码和资源拖到项目里,并手动给项目target添加需要的系统库。这并不是一种好的实践方式,引用管理第三方还是推荐使用CocoaPods。当然,这种做法也有一种好处,就是方便别人把项目download下来之后什么都不用管直接就能跑起来了。:)

头部视图实现了,接下来就实现中间的活动图片,我们可以使用原型cell,或者xib来实现。同样,我们关注的是怎么在现实过程中及时排查错误。视图排查错误的方法和上面一样,也是这篇文章所介绍的方法的重点,就是第一步先让视图先显示出来,然后根据运行后显示情况来进行调整。在这里我们先给xib一张图片。然后返回6个单元格,查看图片的显示效果。再调整大小。

2 项目文件夹的含义

新建一个android的项目之后,就会出现如下的目录结构。

图片 8

主要的目录有src、gen、assets、bin、res。

  1. src:存放项目的源代码。
  2. gen:该文件是创建项目时候自动生成的,里面包了一个R.java的静态类,它里面包括很多静态类(内部类),每个静态类中的静态成员名称都对应res文件夹中的一个资源名称,保存着该资源的索引,方便在代码中进行获取资源。
  3. assets:assets文件夹里面都保存原始的文件格式,在代码中通过AssetManager来进行访问。
  4. bin:存放编译后的apk和资源文件。
  5. res:存放项目需要的资源文件,比如字符串,布局,皮肤等,这里面每个资源的索引都保存在R.java类中。

图形和窗口支持,包含了对拓展显示的支持;可参见View Programming Guide for IOS

蓝牙连接

应用可以通过蓝牙连接外设获取数据。我们有配套的运动内衣,穿戴上之后可收集心率。应用通过扫描附近蓝牙设备并连接就可获取到心率的数据。

整个蓝牙相关的流程是标准的蓝牙协议,iOS自带相关框架<CoreBluetooth/CoreBluetooth.h>专门处理这个流程。

代码具体实现在 Bluetooth 文件夹下的 YSBluetoothConnect 类。

实现对应的代理来进行蓝牙事件回调处理,如设备的连接、断开,心率数据的获取。

CBCentralManagerDelegateCBPeripheralDelegate

心率数据貌似在蓝牙设备中有固定的标准字段,代码里面这个字段的常量。

static NSString *ServiceHeartRateUUIDStr = @"180D";static NSString *CharacteristicHeartRateUUIDStr = @"2A37";

所以应该只要是能发送心率的蓝牙设备都能给这个应用传输数据。代码里面对蓝牙设备名称的前缀做了判断处理,若想尝试自行连其他蓝牙设备可以把这个前缀判断注释掉。

有些界面需要有蓝牙数据才能显示,为了获取到模拟的蓝牙数据,直接将这个字段设为YES即可。

// 设为YES时模拟生成心率static BOOL simulationMode = YES;

最后是相对复杂一点的具体商店展示。在这里我么通过xib使用自动布局,布置控件。然后将其中一些需要修改值得约束作为类的属性。在controller中进行判断,如果没有活动就将控件隐藏,将约束的值设为0;这里实现步骤是一样的,先赋值假数据。让视图先显示。显示完了之后再根据显示效果动态调整。最好是实现一个小功能后就运行检查一遍。

2.1 src

src文件主要存放着项目的java源代码,比如Activity视图类,还有其他逻辑处理代码。

图片 9

支持管理应用的前台和后台行为

语音提示

Voice 文件夹下的 YSVoicePrompt类,运动时每公里提示,若连接心率设备时,会根据心率是否在特定的范围做相应提示。提示可设置男声女声,资源文件在Audio.bundle里,音频资源当时还是专门上淘宝找人做的。

除了实现界面时可以使用上面的方法,我们在写其他代码的时候也应该遵循这个方法。例如写了懒加载代码后,可以先运行后检查数据是否加载成功。因为懒加载和添加数据的时候我们有时会忘了给数组实例化,这时候给数组中添加数据后数组仍然为空,如果我们添加数据后就运行检查看数据加载成功没有,就很容易找出问题的锁所在。

2.2 gen

gen目录中的R.java文件保存着res文件中的资源索引。索引都是int类型的。

图片 10

从上往下看,array类保存数组的资源索引,drawable:保存图片索引,id:保存布局文件中控件id,layout:保存布局文件的索引,string:保存字符串资源的索引。

注意,R.java这个类是保存着当前项目中工程师定义的资源索引,而android.R.java,是保存着android内部预定义好的资源索引。

打印;可参见Drawing and Printing Guide for IOS

数据库操作

主要实现在 Database 文件下。FMDB对系统自带的SQLite做了封装,使得可以直接用OC的方式来操作数据库。

数据库主要保存用户信息和每次跑步数据,例如每次跑步记录的GPS路径坐标,运动过程中收集到的心率数据。界面展示相关信息时需要从数据库查询。

系统的sqlite并非线程安全,多线程同时对sqlite进行操作极有可能造成崩溃。数据库的读写比较耗时不应该放到主线程里,多线程操作可以放到FMDBFMDatabaseQueue队列里进行。

你可能已经发现,上面的重点不在于整个界面如何实现。而是在于实现过程中怎么减少错误的出现。这个方法也是大部分有经验程序员在使用的一个方法。但一些刚入门的程序员还没注意到这个问题,或者没很好地使用这个方法。导致编程过程中出现bug无法及时排除,影响写代码的速度。所以在这里提供的方法希望对你提高编程效率有帮助。

2.3 res

res中有许多文件夹,不同的文件存放不同的资源。

图片 11

  1. drawable:存放图片资源,每添加一个图片资源,R.drawble类中对应添加一个图片索引。不同的drawable文件夹存放不同分辨率的图片。
  2. layout:存放界面的布局,每一个布局文件对应R.layout里面的布局索引,索引名称与布局文件名称一致。
  3. values:里面存放xml资源文件,每个xml文件可以存放字符串、数组、样式等数据。xml文件可以按照自己需要进行新建。

图片 12

string.xml文件中存放了两个字符串数据,那么在R.string类中会保存两个字符串数据的索引,索引名称和字符串资源中的name标签的值一致。

图片 13

添加一个数组资源,在R.array类中会添加一个数组资源索引,索引名称和标签中name属性值一致。

图片 14

布局中文件每个控件的id也会被添加到R.id类中去。其中在为控件指定id时有两种方式,一种是@id/btn ,另外一种是@ id/btn ,前一种是R.id类中已经有了这个id定义,后一种是新增一个btn的id索引。

文本和网页内容的支持

网络请求

请求相关的处理实现在 Network 文件下。如用户的注册时的验证码,登录注销,云端数据同步和本地数据上传等。具体接口可看 YSNetworkManager.h 文件注释。

租用的服务器已过期,所以现在的请求基本都返回超时,只能看着接口自行脑补过程了。

2.4 assets

assets文件夹主要保存原始的文件格式,比如我需要在代码中访问加载一个html文件,或者一个txt文档,那么就需要把html文件和txt文档保存到assets文件下。

剪切,复制和粘贴支持

地图功能

整个应用最核心的功能就是和地图相关的路径记录了。使用的是高德SDK。具体的功能实现在 Manager/Map 文件下。

主要的实现类为 YSMapManager

运动开始结束时调用的接口

- startLocation;- endLocation;

MAMapView 为显示地图的视图,用来显示地图和绘制运动路径。

实现MAMapView的代理MAMapViewDelegate,定位实时更新时会收到对应的回调

- mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLocation:updatingLocation

回调参数里会包含新的定位的信息,将新获取到的定位数据保存,并重新绘,即可看到实时的运动轨迹。

实时路径的绘制具体可看代码,也可看这篇文章,高德地图实时路径绘制代码实现,忽略其他的代码。

YSMapPaintFunc 类实现了将获取到的定位点依次连成一条路径显示在地图上。GPS定位有时候会存在一定的误差,绘制到地图上会显示毛刺,实现的时候用了个小算法将这些毛刺点做了平滑处理,具体自己看代码啦。

记录路径的过程中还需要计算一些其他的值,如总距离,平均速度,当前速度,配速等。这些东可以通过搜集到的定位数据和时间来进行计算。YSMapPaintFunc类用来做相应的计算。

3 项目文件夹中各种资源的使用

第2节已经搞清楚了各种文件夹中存放何种资源,那么本小节总结一下如何在程序代码中访问这些资源文件。(所有的资源索引都已经自动更新到R类中)

用户交互内容的动画支持

计时器

Manager/Time 中实现。YSTimeManager 主要用了一个Runloop通过一定的时间间隔来不断刷新界面和时间相关的信息。需要注意的是NSRunLoop在主线程和子线程使用的区别。

Manager/CaptchaTimer 中的实现为倒计时,用户手机注册时会发送验证码,发送验证码按钮点击之后会有一定的时间将按钮置灰,以防止频繁的发送验证码。

3.1 使用布局文件

布局文件类似wpf的界面布局文件,如果没有程序使用它,那它仅仅只是一个xml文件,我们需要把这个文件通过Activity的setContentView方法进行渲染之后,它才会显示到该Activity视图上,这种设计方式实现了UI和业务逻辑代码的分离。

在Activity的onCreate方法中,调用布局文件,渲染界面。

setContentView(R.layout.activity_main);//实现界面的渲染

Activity的setContentView 方法,带一个参数,该参数就是布局文件的索引。该方法通过布局文件索引实现界面绑定。

获取布局文件中的控件

TextView myView=(TextView) this.findViewById(R.id.textView1);

通过URL计划框架接口与其他应用通讯

应用配置

Manager/ConfigYSConfigManager 类用来记录应用的配置,通过系统的NSUserDefaults进行保存。需要配置的信息较少,也就语音提示选择男声或女声,界面上时候显示实时心率数据的面板,蓝牙默认连接。配置的选项不多。

3.2 获取values文件夹下的各种资源

访问字符串资源

String sstr=this.getResources().getString(R.string.app_name);//获取app名称

访问数组资源

int []myarray=this.getResources().getIntArray(R.array.my_array);

对残疾人的支持

Models

Models文件加下有很多model,当时初衷是将一些相关的数据保存在一个类里,方便作为参数进行数据传递。如单次跑步相关的数据保存到一个model里,传递给专门展示这些数据的视图做为界面的显示。现在回过头看感觉处理得有点乱,也许不是个好的实践,读者请自行斟酌参考。

3.3 获取assets文件夹下的资源

在assets文件中保存一个html页面,我们需要在代码利用WebView控件加载这个html页面.

图片 15

代码如下:

myWebView.loadUrl("file:///android_asset/myblog.html");  //注意获取文件的路径格式

Apple Push Notification服务;参见Local and Remote Notification Programming Guide

应用的界面实现

界面相关的代码实现全在View文件夹下。

图片 166.jpeg

文件夹对应的功能实现

用户相关功能的实现,如注册登录,修改重置密码等。

设置界面,提示音设置,打开关闭心率面板,用户反馈。

tabBar左边的日历界面,当时想用UICollectionView来实现个日历控件,后面调试的时候发现有些日期cell之间的左右间隔在设为0之后还是会出现细线,不得以只能强行用一个UIScrollView在上面自己贴UIView的方式来实现了这控件。性能还有待优化,左右滑动切换日期时有时会有卡顿现象。

主要的几个界面:

  • YSRunViewController:tabBar中间的界面,显示记录的总体数据,开始运动的入口
  • YSRunningRecordViewController:运动过程中界面,主要包含两个视图,显示实时运动轨迹的地图视图,和不显示地图的视图
  • YSResultRecordView:运动结束后显示结果的界面

tabBar右边的用户界面,显示当前用户信息,登录注销,修改用户资料的入口。

记录单次运动具体信息和数据分析的界面。

几个文件实现的功能:

  • Detail:详情界面,此次运动的距、时间、速度等
  • HeartRate:心率数据界面,分析运动全程心率在各个范围内的比例
  • Locus:运动的轨迹
  • Pace:计算出每段路程的配速
  • Share:社交分享,将轨迹生成图片发送

一些可以单独抽出来,或者几个界面都会用到的控件。大部分也都是xib实现。

xib实现可复用控件时需要考虑一个问题,使用时是直接用在另一个xib中,还是在代码中通过nibWithNibName的方式加载,两种使用方式设定Custom Class的地方不一样,具体参考源码。

4 总结

将项目中的各个部分的作用弄清楚对于刚接触android编程的新手我来说是很重要,这是基础性的东西,明白了这个才能够更好的深入android的学习。

Local notification 的安排和分发;参见Local and Remote Notification Programming Guide

其他

项目的大体情况如上所述,具体的一些细节实现请自行查看源码。:)

PDF创建

最后

源码可以随便使用,不用经过允许。有问题可提issues。

偶然发现腾讯部落小伙伴还在运营,关注数量还挺多,喜欢运动跑步的小伙伴可关注易瘦跑步腾讯部落,每天都会分享运动跑步相关的小知识。:)

完。

支持定制像系统键盘一样的输入界面视图

支持能够与系统键盘交互的定制化文本视图

支持通过邮件,twitter,facebook和其他服务来分享内容

除了提供用于构建应用的基础代码,UIKit也包含了一些对于基于特定设备特性的支持,例如

内置摄像机

用户的照片库

设备名字和机型信息

电池状态

飞行模式信息

头戴设备的远程支持

提示

对于大部分环节,只通过应用的主线程来使用UIKit的类。这对于通过UIResponder或与操控用户交互相关时是正确的。(貌似没翻译好)

NSObject 基类

NSDataAsset 这个类提供了一个可以访问到存储在asset目录下数据对象的一个方式

NSFileProviderExtension NSFileProviderExtension是File Provider extension的核心类

NSLayoutAnchor NSLayoutAnchor类是使用流对象创建NSLayoutConstraint的工厂类

NSLayoutDimension NSLayoutDimension是使用流对象创建基于尺寸的NSLayoutConstraint对象的工厂类

NSLayoutXAxisAnchor NSLayouttXAxisAnchor类是使用流对象创建水平NSLayoutConstrianit对象的工厂类

NSLayoutConstraint 一个限制定义了必须被基于限制的布局体系满足的两个用户界面对象间的关系

NSLayoutManager 一个描述layout坐标系显示一个nstextstorage对象显示特点

NSParagraphStyle NSParagraphStyle和它的子类 NSMutableParagraphStyle概括了被NSAttributeString类使用的段落或尺度特性

NSMutableParagraphStyle 这个类添加了一些方法到它的父类,NSParagraphStyle,用以改变一个富文本段落特性

NSShadow 一个NSShadow对象概括了可以用以创造在动态内容中的阴影的属性。

NSStringDrawingContext NSStringDrawingContext类管理绘制定制字符串时的一些公约内容

NSTextAttachment NSTextAttachment被NSAttributedString类用来管理附件

NSTextContainer NSTextContainer定义了一个排布text的区域

NSTextTab 代表了NSParagraphStyle对象中的一个tab,存储一个alignment类型和定位

UIAcceleration 一个UIAcceleration对象的实例,成为一个加速事件,代表一个直接的基于三维坐标系的加速数据

UIAccelerometer 这个对象让你可以注册接收到从外部硬件发送的加速相关的数据

UIAccessibilityCustomAction 代表了一个可以接触对象执行的定制动作

UIAccessibilityElement 这个对象概括了一个事项容易被残疾人使用的,但是它并不是默认接触的?

UIActivity 这个类代表了一个抽象函数你可以用以实现定制应用的服务

UIAlertAction 这个对象代表了当触摸一个alert中的按钮时发生的动作

UIApplicationShortcutIcon 一个应用快速访问方式,或一个快捷动作,图标是一个图片,你可以选择性的与Home屏幕关联以提高其外观和改进可用性(貌似就是面包旅行的那个小灰色图标?)

UIApplicationShortcutItem 一个快速访问项目,也被称为主屏静态快捷动作,能为app定制一个用户初始化动作

UIMutableApplicationShortcutItem 一个可变的应用快捷访问项,可以被称为一个可变的主屏静态快捷访问,为应用定义了一个可配置的用户初始化动作

UIBarButtonItemGroup 这个对象管理一串在iPad键盘上的快捷bar 上的bar button项

UIBarItem 是一个抽象父类,代表了那些可以被添加到屏幕底部bar上面去的项

UIBarButtonItem 这是一个定制的按钮,专门用了在UIToolbar或UINaviagtionBar上放置对象

UITabBarItem 在UITabBar对象的一个实现项

UIBezierPath 这个类让你可以定义一个由直线或曲线组成的路径,可以用来呈现定制视图中的路径

UICollectionViewLayout 这是一个抽象基类可以用来为collection视图生成一个布局信息(layout information)

UICollectionViewFlowLayout 这是一个混合的布局为每个节把头视图、尾视图组织进网格中

UICollectionViewTransitionLayout 是一个定制的特定类型布局,让你在由一个布局到另一个布局的变化过程中可以定制一些行为

UICollectionViewLayoutAttributes 为一个collection视图中的项管理布局相关的参数

UICollectionViewLayoutInvalidationContext 这个对象定义了在布局无效时,哪些布局对象需要更新

UICollectionViewFlowLayoutInvalidationContext 这个类定义了一些属性能够影响到是否要重新构建各项的布局以及他们在布局中的位置

UICollectionViewUpdateItem 这个类描述了collectionView中某项的一个改变

UIColor 一个颜色对象代表了颜色以及一些时候代表透明度(alpha 值)

UIDevice 这个类提供了代表当前设备的一个单例

UIDictationPhrase 这个类代表用于讲述的一个文本化的口语翻译?

UIDocument 这是一个抽象基类用来管理文档数据

UIManagedDocument 用Core Data表示的混合的基类

UIDocumentInteractionController 一个文本交互控制器,有一个代理对象,为用户的本地文件系统提供应用内支持

UIDynamicAnimator 一个静态动作生成器为静态动作和动画内容提供物理相关属性动画支持

UIDynamicBehavior 一个静态特性指一个或多个静态项参与的二维的动画特性配置

UIAttachmentBehavior 这个对象在两个静态项或一个静态项和一个锚点间建立联系

UICollisionBehavior 一个碰撞特性指,一个特定的静态项数组,这些项彼此碰撞的关系?

UIDynamicItemBehavior 一个静态项特性代表了一个或多个静态项的基本静态动画配置

UIFieldBehavior 这个对象将领域相关的物理特性应用于静态项

UIGravityBehavior 这个对象将重力相关的特性应用于静态项

UIPushBehavior 它代表了一连串的作用于一个静态项上的持续力,它使得静态项改变其相对位置

UISnapBehavior 它定义了一个静态物体运动到指定点,这个动作过程带着弹力效果,以一个可以设定数量的震动结束 (钟摆运动??)

UIDynamicItemGroup 它代表一个由多个其他物体组成的静态物体

UIEvent 这个对象代表了iOS中的一个事件

UIPressesEvent 它代表用以描述设备上一连串物理按钮状态的事件,比如那些跟远程设备或者游戏控制器关联的按钮

UIFocusAnimationCoordinator 这个类能在焦点更新期间帮助焦点相关的动作完成定位

UIFocusUpdateContext 这个类能为从一个视图更新到另一个视图提供相关的焦点信息

UICollectionViewFocusUpdateContext 这个类存储了一个集视图的焦点更新信息

UITableViewFocusUpdateContext 这个类是UIFocusUpdateContext的一个子类,能够提供从一个视图到另一个视图焦点变换的相关信息

UIFont 提供了可以获取和设置字体信息的接口

UIFontDescriptor 这个类提供了一个机制可以用一个参数字典来描述一个字体

UIGestureRecognizer 是一个手势识别类的抽象基类

UILongPressGestureRecognizer 是长按手势的类实现

UIPanGestureRecognizer 是按或者抓手势

UIScreenEdgePanGestureRecognizer 是从屏幕边缘开始的一个按或抓手势

UIPinchGestureRecognizer 是一个两个触摸相关的手势(捏)

UIRotationGestureRecognizer 是一个两个触摸相关的手势(旋转)

UISwipeGestureRecognizer 是朝着某个方向拖拽的手势

UITapGestureRecognizer 代表单次或多次点击的手势

UIImage 图片数据对象

UIImageAsset 这个对象是一个图片集容器,代表了多种描述一个艺术作品的方式

UIKeyCommand 这个类描述了一个由硬件键盘产生的按键动作,它的结果动作一定会执行

UILayoutGuide 代表了一个能与Auto Layout交互的矩形区域

UIFocusGuide 这个类被设计为可以将空视图区域作为可被聚焦的?

UILexicon 一个lexicon包含了一组只读的关系对,每一个都代表一个UIlexiconEntry对象,可以被定制键盘调用

UILexiconEntry 定义了一个只读的关系对,可以被UILexicon对象使用,用于定制键盘

UILocalNotification 代表了一个定制推送,能被app在特定时间点计划调度

UILocalizedIndexedCollation 这个类对于组织、排序或将一个包含章节的列表操作而言是一个便捷

UIMenuController 这个单例代表了剪切、复制、粘贴、全选、等的菜单界面

UIMenuItem 代表了一个由UIMenuController对象管理的定制编辑菜单的一个定制项

UIMotionEffect 这个抽象类代表基于运动的一些改变要素

UIInterpolatingMotionEffect 这个对象代表设备的水平或垂直倾斜值,通过UIKit可以把这些值体现在视图上

UIMotionEffectGroup 这个类代表了你想在某一个时刻应用到视图上面的一组动作

UINavigationItem 它代表一个在UINavigationBar对象里展现的按钮或视图

UINib 这个类是充当Interface Builder nib文件的对象封装器 或 容器的

UIPasteboard 这个类允许app可以与其他app共享数据

UIPercentDrivenInteractiveTransition 这个对象代表从一个视图场景切换到另外一个视图时定制的动画

UIPopoverController 这个类被用于内容的蓬松?

UIPresentationController 这个对象代表展示视图时的高级视图和过度?

UIPopoverPresentationController 管理在一个popover钟的视图内容呈现?

UIPress 这个对象代表一个屏幕上的按钮按压动作

UIPreviewAction 一个预览动作或一个peek quick action,是一个用户拖拽时界面显示的预显示内容

UIPreviewActionGroup 一个预览组包含一个或多个快速预览类

UIPrintFormatter 是一个抽象类代表打印格式化:那些可以跨越页边界的呈现定制的可打印内容

UIMarkupTextPrintFormatter 排布html文本支持多页打印任务的一个实例类

UISimpleTextPrintFormatter 排布平面布局,支持多页打印的一个实例类

UIViewPrintFormatter 排布画板内容用于打印的一个实例

UIPrintInfo 这个类概括了一个打印任务的信息,包括打印机标志,任务名称,输出类型(照片,常规,灰?),方向(横 竖),是否选定双页打印等

UIPrintInteractionController 这个共享实例类代表了在iOS中用户的课打印文本 图片或其他可打印内容

UIPrintPageRender 描绘了即将被打印的文本页

UIPrintPaper 代表了一个打印任务使用的打印页,打印内容在这里呈现

UIPrinter 包含了网络上一个打印机的参数

UIPrinterPickerController 为一个选定的打印机展示系统接口信息

UIRegion 在UIKit Dynamics中定义了可用的形状

UIResponder 定义了一个接口对象可以响应事件

UIApplication 这个类提供了一个中心化布局的控制以及app在ios上运行的坐标系

UIView 代表了屏幕上的一块矩形区域并且可以呈现内容

UIActionSheet ios8中废弃

UIActivityIndicatorView 活动指示器用以展示一项任务正在进行

UIAlertView ios8中废弃了

UICollectionReuseableView 定义了一个集合视图展现的所有的单元格或提供的视图的特性

UIControl 这个类实现了用户交互中一个特定动作或行为趋势包含的特性

UIButton 执行特定代码响应用户交互的对象

UIDataPicker 是一个对象能够通过使用多个旋转滚轮让用户选择日期和时间的控件

UIPageControl 这个类用于翻页控制

UIRefreshControl 这个对象提供了一个标准的控制器可以用于初始化列表内容的刷新

UISegmentedControl 一个由多个独立区域组成的垂直控制,每个区域都是一个独立的按钮控制(分页菜单?)

UISlider 这个对象是一个虚拟控件可以用于从一连串值里面选出一个值

UIStepper 这个控件为用于提供一个界面用于增加或减少一个值

UISwitch 用这个类管理使用的打开或关闭阿牛,例如,设置里使用的飞行模式和蓝牙选项

UITextField 在界面中显示一个可编辑的文本区域

UIImageView 代表了一个单独的图片或界面中一系列图片动画?

UIInputView 在一个输入视图响应时这个类被设计成匹配标准系统键盘?

UILabel 实现一个只读的文本视图

UINavigationBar 为navigting关系内容提供一个控制?

UIPickerView 这个类实现的对象,叫选择器视图,使用一个滚轮元素来显示一组值中的某一个或某几个

UIPopoverBackgroundView 为一个popover提供一个背景外观

UIProgressView 使用这个视图可以随着时间描绘一项任务的进度

UIScrollView 支持或电视超过应用窗口本身大小内容的类

UICollectionView 使用定制布局展示的一组有序数据

UITableView 列表是一种可以显示或编辑垂直列表信息的方式

UITextView 是一个可滚动多行的文本区域

UISearchBar 实现了一个文本区域控件支持基于文本的搜索

UIStackView 这个类提供了线性布局方式用来呈现一列或一行数据中的数据流??

UITabBar 这个对象是用于选择多个子任务、视图、模式中某一个的控制

UITableViewCell 列表的单元格

UITableViewHeaderFooterView 实现了一个能够被复用的用于放置在列表章节顶端或末端的视图

UIToolbar 用于显示一个或多个按钮,叫做工具项

UIVisualEffectView 提供了一个简单的方式可以实现一些复杂的视觉特效

UIWebView 在app中可以通过这个对象嵌入web内容

UIWindow 为用户交互提供北京并可以为一些重要的事件处理提供一些特性支持

UIViewController 为管理iOS app提供底层支持

UIActivityViewController 是一个标准视图控制器,可以为app提供许多种服务

UIAlertController 为用户显示一个弹出信息

UICollectionViewController 代表了一个控制器,其内容和一个集合视图相关

UIDocumentMenuViewController 这个类让用户可以在应用沙箱之外选择文档或特定的目标

UIInputViewController 要定制一个键盘就需要从实现UIInputViewController开始

UINavigationController 实现了一个试图控制器定制的导航内容

UIImagePickerController 管理系统提供的基于设备的用于拍照和拍摄电影的定制界面或者选择已经保存的照片和视频资源

UIVideoEditorController 这个对象或一个视频编辑器,提供了将音像资源从开始到结尾的截取以及重新编码到低画质的功能

UIPageViewController 提供页面内容的导航,其中每页的数据由其自己的对象控制器控制

UIReferenceLibraryViewController 提供一个字典服务可以查找一个单词或短语在app里的定义(调用系统字典)

UISearchContainerViewController 是一个对搜索结果的包装器

UISearchController 基于搜索条显示搜索结果的显示

UISplitViewController 代表了一个容器控制器用来呈现主体详情?

UITabBarController 实现了一个特定的视图控制器,可以用来管理无线条选定的界面?

UITableViewController 一个控制器对象包含了一个列表

UIScreen 定义了一些基于硬件的显示特性

UIScreenMode 代表了一系列可以被应用到uiscreen上的特性

UISearchDisplayController 在ios8中已废弃

UIStoryboard 概括了存储在storyboard资源文件中的视图控制图像信息

UIStoryboardSegue 这个对象可以用于两个视图控制器之间的虚拟切换过程

UIStoryboardPopoverSegue 呈现内容时的一种特定的展开方式?

UIStoryboardUnwindSegueSource 概括了关于unwind segue的一些信息

UITableViewRowAction 代表当用户垂直滑动列表时的一个单一动作

UITextChecker 使用这个对象可以对一个字符串进行误拼检验

UITextInputAssistantItem 这个对象控制在iPad键盘裁剪栏上的一些操作按钮

UITextInputMode 代表当前的文本输入模式

UITextInputStringTokenizer 是UIKit框架提供的基于UITextInputTokenizer协议的一个实现

UITextPosition 代表文本容器里的一个点;换而言之,是文本显示视图里的一个索引?

UITextRange 代表文本容器的范围;换而言之,包含一个起始索引和结束索引

UITextSelectionRect 概括了一个文档中选定区域文本的信息

UITouch 代表了屏幕上一个局部事件的位置,大小,动作以及手指力度信息

UITraitCollection 描述了app的交互环境信息,包括类似于垂直线和水平大小类,显示比例以及用户语言等特性

UIUserNotificationAction 概括了app能够响应本地或一个系统推送的 定制的用户信息

UIMutableUserNotificationCategory 概括了app能够响应本地货系统推送的一些信息

UIUserNotificationSetting 概括了能够显示给用户的一些推送类别

UIVisualEffect 这个类不包含方法并且倾向于用一个UIBlurEffect或UIVibrancyEffect对象初始化一个UIVisualEffectView

UIBlurEffect 将一个模糊特效应用于图层内容

UIVibrancyEffect 增强或调整图层内容的颜色,让图层内容变得更加生动

NSMutableAttributedString 为一个可配置属性的string

NSTextStorage 定义了TextKit的基层存储机制

NSOperation 抽象类,代表一个单任务进程?

UIActivityItemProvider 一个代理对象,将数据传递给一个指示视图控制器

协议

NSLayoutManagerDelegate 定义了NSLayoutManager对象能够定义实现的部分方法

NSTextAttachmentContainer NSLayoutManager的代理

NSTextLayoutOrientationProvider 定义了一个对象的文本的方向

NSTextStorageDelegate 定义了一些NSTextStorage对象的一些可选实现方法

UIAccelerometerDelegate 定义了一个单一方法用于从系统接收加速相关的数据

UIAccessibility 为用户接口提供了可接触信息

UIAccessibilityAction 这个协议为特定的动作提供支持,比如从一个区域值中选去一个或者通过滚动屏幕来选取

UIAccessibilityContainer 为实现类提供一个方式可以将选定的内容分离

UIAccessibilityFocus 这个协议提供了方法可以判断一些辅助功能的状态,例如 朗读文本(VoiceOver),是否处于焦点

UIAccessibilityIdentification 这个协议与用户界面中独特的标志关联

UIAccessibilityReadingContent 这个协议能被实现用以代表一些可读内容,比如一本书或一篇文章

UIActionSheetDelegate ios8.0废弃

UIActivityItemSource 这个协议定义了一些方法可以用于UIActivityViewCOntroller对象获取展示的内容

UIAdaptivePresentationControllerDelegate 这个协议与当前呈现的试图控制器一起合作能决定应用如何应对特性变化(trait changes)

UIAlertViewDelegate ios8废弃

UIAppearance 这个协议能获取一个类的外观代理

UIAppearanceContainer 一个类采用UIAppearance协议可以使用UIAppearance的api来定制外观

UIApplicationDelegate 这个协议定义了能被UIApplication 单利调用的方法用以响应一些app生命周期内的一些重要事件

UIBarPositioning 这个协议定义了一些方式让bars能在iOS设备上重新定位

UIBarPositioningDelegate 这个协议支持UIBarPositioning协议的重新定位

UICollectionViewDataSource 一个采用这个协议的对象需要为对应collection提供数据和视图

UICollectionViewDelegate 这个协议让你可以管理collection的章节,以及它的单元格的高亮以及对这些控件的一些动作

UICollectionViewDelegateFlowLayout 这个协议定义了一些方法让你能够通过使用UICollectionViewFlowLayout对象的使用来实现一个网格布局

UICollisionBehaviorDelegate ...

ios开发过程中主要用到的思想

前提:基于code做开发,

1.与前端协定ui,通过类似于 (SYSW-img.size.width)/2类似的代码来解决布局问题 (如果是基于storyboard来做,应该有更优的解决方案)

2.理解页面加载的过程和数据处理的时机,基本上每一个过程和时机都会有对应的方法执行(这也是基础的oc开发为什么会这么简单,因为就是一堆方法被系统调用,然后开发者只要在对的时机做对的事情就可以了)(有一个我在历史开发过程中规避的问题是,内存管理的问题,我现在做的app项目,基础只要图形对象处理逻辑正确,回收即时,比较难会因为业务逻辑而导致内存问题,所以我在开发时也没有做太多预留处理。如果一些比较变态的业务逻辑,可能得从持久化的层次来考虑这个块)

3.对于控件,无论是外部控件还是内部控件,只需要先理解其作用和大体逻辑(对于功能型控件,其逻辑大部分都是一样的,就是基类逻辑,就是简单uiviewcontroller 或者 uiview的逻辑),然后再就是解读一遍头文件提供的api,对于一些接口,需要注意一下版本限定(其实最开始接触类就因为考虑版本限定的问题,类似于前段时间,采取了已经遗弃的asset来自定义相册,结果在部分云相册功能开启的机型就会出现一些无法解决的bug,因为采用控件的逻辑其实是依赖ios本身代码的逻辑,所以就不得不屈从于其版本控制的限定 (ps:没办法,谁让apple是boss,apple大爷在类层级对于api没提供内部代码,而且也不能为了一个名字就采取 协议的方式重写一个已被遗弃的类吧))

4.看一遍uikit的类定义,就会发现原来apple开发的类可以进行人为管制的功能远超所想。类似于打印机,语音识别,等等一些列的辅助功能,八辈子用不了一次,如果不是做了一个类含义翻译根本没想到。

5.再说说现在主流的两种oc开发,一种是基于类似于storyboard或nib文件的可视化界面开发,另外一种就是我现在才用的基于代码逻辑的开发。本质上是一个东西,只是第一种提供了可视化界面,把屏幕适配问题抛到了前端,更多的需要拖拉拽等鼠标操作。而后者则主要基于抽象理解,最好是有一个ui图,可以参照ui进行开发,适配问题需要些代码时考虑。(从这个角度讲,如果代码开发需要依赖ui,如果没有专门的ui人员,第一种方法效率会更好)。

可视化开发

优:1.界面可视化 2.很多内容直接勾选就可以,减少了代码量 3.基于限制等约束来做布局,规避了屏幕适配的问题

劣:1.协同开发比较麻烦 2.让开发者远离了代码以及代码逻辑(这个对于我应该木有这个问题,因为俺们是一路敲过来的,对于配置项里面的逻辑都有一个大概的了解)

代码开发

优:1.代码逻辑比价清晰,内容完全可控(不用担心因为配置项某一些独特癖好出现一些莫名其妙的问题(也就是apple本身的bug,虽然这种情况少,但一旦出现就基本是无解问题)) 2.协同开发方便(这个是相较于可视化开发不方便来定义的)

劣:1.逻辑复杂,代码量较大,开发较慢 2.最好有一个ui指导,否则界面是啥样基本要靠想(- -! )

以上。

以上是我的解读吧,可能还有一些我不知道得理由吧。结论就是,可视化开发是一种更优的方案,no matter how,以后还是多采用可视化开发。

6.再说说ios特有的一些东东。

首先是特有一些和设备绑定的类,类似于 uiapplication和uidevice这种,一个对应app的对象,一个对应手机设备本身,可以获取很多硬件信息,以及做一些硬件操作。

sandbox,好像是这么叫的,就是apple给app预留的一个可以进行持久化的文件夹。其实也木什么特别的~

the photo这类的系统级app的入口。类似于The Photo 和 camera以及setting,都是有对应的方法可以访问或控制

7.再说说oc的设计模式

单例,这个有大量的系统应用。类似于the photo这些应该都是单例

代理模式,这个在外部控件中有大量的应用。外部控件一般都采取把基层功能封装在控件中,对于一些需要定制的功能,比如操作后的动作等,都会通过代理模式,提供代理方法(delegate),让用户来自定义

观察者模式,最近接触的phasset中,类似于照片发生改动时,会发一个变化给phasset指定的类,这个的本质应该是观察者模式。另外,我自己在做颜图时,类似于消息提醒,照片列表更新一类的跨页面刷新,也采取了观察者模式

mvc,这个没有太好的例子说明。额,不对,uiviewcontroller本身应该就是mvc的一个印证。viewcontroller是控制器,它的view对象的渲染应该就是view层(这个不是太熟悉,应该是对应的layer),对于model,view对象应该就是model (这个印证貌似说得有点牵强,而且对于view的渲染,我还没太多的了解)

策略模式(这个不熟悉,据说有)

工厂模式(这个在以前做java时经常接触,但是oc里,貌似只在一个外部控件中看到过,系统级方法中没注意到)

8.线程和进程

这块我的运用的比较少,而且一直理解的比较浅。一般在网络请求处理或者图片处理中会采用dispatch的方法来进行多线程异步处理,减少等待时间。现在大部分的应用都是采取 异步,进行多个线程同时处理来减少等待时间。同步方面没有太好的实证

9.安全

安全方面木有太操过心,这个貌似是ios的一个优势。。。 大部分ios app貌似都不会在安全上面花太多心思。不过有一个,和服务器通讯,这个以以前的游戏经验来看,如果是重要通讯,一个最简单的通讯加密是必要的(否则会被别人破解的哭天喊地的~~~ )

10.证书

搞IOS一个比较恶心的地方就是证书签名的问题。开发证书,发布证书以及推送证书。这个很久没弄了,没太多可说的。不过基本就是搞定一次,不过期就能一直用。现在像友盟等,对于推送这块好像是有协助处理的一些功能,减少开发者的学习和应用成本。

11.第三方接入

这个没有太多可说的,到现在做过的第三方接入都比较简单,qq控件,qq接入,微信接入,友盟接入,蒲公英接入,基本都是大同小异,获得资质和授权,阅读对应的文档以及sdk,然后按照文档走基本就ok,大部分的逻辑是如下的:

客户端-》发送第三方申请-》出现第三方授权页面-》用户点击登入,第三方根据配置的key识别申请的app是哪个,读取对应的配置信息,再结合用户的账号信息,生成一个openid

1. 通常而言,opened会回写到配置信息里面的url中,一般也就是服务器地址。这个信息发送给服务器后,服务器就获取到了用户的openid,把openid发给对应的客户端,客户端或服务器就可以拿opendi向第三方请求该用户的各种其他信息。

2.除了上面的,还有一种貌似是直接把openid发送给客户端。这个在微信接入时用配置外部url采取 onreq来处理。前几天基础instagram api时也提及了这种不推荐的方法,但是还没完全弄懂是怎么处理。

12.申请和审核

貌似没啥好说的,付费的apple account,资质。审核方面的话,现在速度已经比以前快多了(2-3天),而且支持应急申请(也就是加速)。

总结:从技术层面讲,ios的简单应用点上很难有一些能体现技术价值的地方。

那么ios进阶的方向在哪里呢?

个人认为是,1.类似于外部sdk这种能体现完整架构和设计的控件开发(对于这块,要提升比较难,因为外部sdk的开发,更多的在于对外部体系知识和细节的了解以及对于整个小而精项目开发的把控,类似于asi这种,想要自己开发首先得熟知网络的通讯的知识以及各类协议,这些知识本身是超脱于ios甚至于oc的,而开发的整个环节,除了对oc语法的把控,更考虑到其使用的便捷性,这些都不是说看一两篇文章或者做一两个项目能搞定的,更多是理解层面的东西)

2.基于c的一些底层开发(对于这块,要提升就在于,含着眼泪啊,咬牙去解读和阅读那些doc或blog。这块的知识很杂,本身没有一个太好的学习体系,至于难度上,有一些点可能只要是苦读就能解决,因为这些点的难点就是本身的稀缺性,而还有一些点,可能就会牵扯到编程思想或数学层面的一些知识甚至于是算法,碰到这种就很苦逼了)

3.图形方面(ios图形和动画的开发大部分都是一些基于c来搞的,能够做出一些深度,对于这块,提升应该在于知识本身的稀缺性以及对于运用的熟练度。从提高层面讲,这块应该是相对最容易的。不过图形构建,这个玩意本身就有点看天赋的赶脚)。

以上三点,都是能跨越ios和swift的。

最后让我来狂妄的猜想一下类似唐巧大神这类的流弊人比一般人厉害在哪里。

1.基础知识扎实,专注在这个领域,长久的积累最直接的一个体现就是基础扎实

2.对各类情形的涉猎。

3.能够独立开发外部控件的能力(这里详细说就是进阶方向的第二点的能力)

4.ios领域内的知识宽度,类似于各种调试工具以及xcode功能的运用等

5.流弊的能让业界认可的项目经理

6.?

本文由新葡京8455发布,转载请注明来源

关键词: