好久没有更新blog了,最近一直在忙着写代码结项,所以很多总结都攒到一块了。一块说一下吧
企业账号发布应用提示不信任
更新了iOS9之后,很多用户反映我们的应用安装之后打不开,总是提示不受信任的开发者xxx。其实问题很简单,只需要在手机的设置里面信任一下开发者的profile就ok了。不得不说,iOS9之后对安全方面确实做了很多更新,比如默认使用HTTPs,现在又多了这么个事。
具体步骤是:
设置 --> 通用 --> 描述文件(profile) 然后如果你安装了用企业账号发布的应用,就会出现该企业账号的证书,然后点进去,信任,就ok了。
自定义Navigation Controller左上角的返回按钮
开发中遇到这样的问题,比如不希望navigation controller到一个页面回退到上一个页面,或者说,我希望自定义它的pop动作,比如说回退到指定的页面啊,或者在回退的时候有一些额外的动作,这些都是可以做的。我们一步一步来看。
想要禁止显示左上角的回退按钮,同时也禁止手势划屏的回退动作,
很简单,一行代码就可以搞定
在你的viewDidLoad 或者viewWill(Did)Appear方法中加入下面一行代码:
self.navigationItem.setHidesBackButton(true, animated: false)
当然你的这个类要是navigation controller中的一个。
那么如果想要回跳到指定的页面怎么办么?
这个步骤稍微复杂一点,我直接贴上我的代码吧
首先在AppDelegate.swift文件中把你的storyBoard中的几个用得着的页面实例记录下来
然后在想要回退到指定页面的函数方法中,比如你屏蔽了back按钮的方法,然后自己加个button,然后赋予他这样的响应动作:
我记得还有同类的方法,比如popToRootView什么的。
这样就好了,就直接跳回到你想要的界面去了。
那这种方法自然可以在你自己写的响应动作里面加入你想要的一切事情,可是有的同学会遇到这样的需求:
在点击左上角的返回按钮或者手势划屏返回的时候,增加一些附加的动作,
那如果每次都自己屏蔽了然后重新添加button这样很麻烦,而且不能使用划屏的手势了,那该怎么办?
其实这里有一个比较tricky的办法,就是利用viewWillDisAppear方法,明白了吧?其实没有做多余的动作,就是在屏幕将要消失的时候,调用执行你自己想实现的动作就ok了。哈哈。
CLLocationManager停止获取GPS信息
最后一个问题比较讨厌,同样是用一个比较tricky的办法解决的。
我在项目中需要用到CLLocationManager去获取GPS信息,并且要得到省份、城市和街道等信息。那原本方法不难,
1. 在class后面引入代理CLLocationManagerDelegate
2. 设置两个成员变量
let locationmanager = CLLocationManager()
var already_get_location : Bool? // 因为stopUpdate函数不起作用,换个方法来停止更新
为什么要把CLLocationManager设置成员变量呢?如果不这样设置,那么用户第一次使用请求同意使用地理位置信息的那个对话框就会闪屏然后消失,根本没法点。
为什么要在设置一个全局变量了,我的注释里面也写了,因为stiopUpdate函数不知道什么原因不起作用,你的代理会一直在后台获取地理位置信息,所以要用一个全局变量 来停止自动更新
3. 在你的viewDidLoad 或者viewWill(Did)Appear方法中加入下面代码:
// 设置CLLocationManager获取当前经纬度坐标和城市等信息
if #available(iOS 8.0, *) {
self.locationmanager.requestWhenInUseAuthorization()
} else {
// Fallback on earlier versions
}
self.locationmanager.delegate = self
self.locationmanager.startUpdatingLocation()
self.already_get_location = false
4. 接下来就是实现获取GPS信息然后反编译出来详细信息的方法了,我这里用Swift2.0写的 // CLLocationManager Delegate
// Auth: KAKA at 4/11/15 22:17
// 函数里面判断了两次already_get_location,在返回结果之前,可能这个函数已经被调用了多次了
func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
if !self.already_get_location! {
//此处locations存储了持续更新的位置坐标值,取最后一个值为最新位置,如果不想让其持续更新位置,则在此方法中获取到一个值之后topUpdatingLocation
let current_location = locations.last
self.longitude = current_location!.coordinate.longitude.description
self.latitude = current_location!.coordinate.latitude.description
// 根据经纬度反向编译出地址
CLGeocoder().reverseGeocodeLocation(current_location!, completionHandler: {(placemarks:[CLPlacemark]?, error: NSError?) -> Void in
if (error != nil) {
print("Reverse geocoder failed with an error" + error!.localizedDescription)
} else {
if !self.already_get_location! {
// 获取省份和城市的名称
let placemark = placemarks?.first
// 获取省份和城市的代码
let code_truple = GlobalVariables.getProvinceAndCityCodes(placemark?.locality!, cityname: placemark?.subLocality!)
self.province_code_ = code_truple.0
self.city_code_ = code_truple.1
if self.province_code_ == nil {
self.province_code_ = 0
}
if self.city_code_ == nil {
self.city_code_ = 0
}
self.province_textfield.text = placemark?.locality!
self.city_textfield.text = placemark?.subLocality!
self.address_textfield.text = placemark?.thoroughfare!
// 停止获取坐标
manager.stopUpdatingLocation()
self.already_get_location = true
// 隐藏自动定位的输入框
MBProgressHUD.hideAllHUDsForView(self.view, animated: true)
}
}
})
}
}
这里面有写函数和成员变量是我的工程中用到的,你们在用的时候看自己的实际情况来吧。但是核心的思想是一样的,改吧改吧就可以用了~