碎片知识 (1)

1、开发者证书无效:
遇到这种情况需要下载苹果最新证书
然后在钥匙串->显示->显示过期证书下,删除过期的原证书即可,这样就没问题了
2、iOS9 设备上http网页无法加载:
需要在plist里面设置:NSAppTransportSecurity里面的”Allow Arbitrary Loads”这个属性为true。
其次如果想只添加单独网页需要用:Exception Domains这个参数来添加,如下图:
piece 01
其中的属性为:NSIncludesSubdomains(子域名是否也可以加载)、NSExceptionRequiresForwardSecrecy(是否禁用ForwardSecrecy)、NSExceptionAllowInsecureHTTPLoads(是否允许签名过期,或者不匹配等情况)
3、Bitcode:
默认项目是开启的,Bitcode可以帮助App减小包的大小,但有的第三方库不支持,所以凭项目情况来决定是否开启
4、企业App无法安装:
这个是因为iOS9 需要在设置->通用->描述文件中开启信任即可
5、iOS9 字体显示不全:
可以使用:sLabel.sizeToFit() 或者 sizeWithAttributes 来自动拉伸
6、iOS9 无法跳其他App:
需要在plist添加字段:LSApplicationQueriesSchemes,然后在其下面添加要跳转的App scheme

SFSafariViewController

SFSafariViewController 也是iOS9之后,苹果推出的新功能,这个框架使用起来相对比UIWebView简单一些。但是目前感觉仅适用于简单操作,因为SFSafariViewController只提供了两个实例化方法,两个delegate方法。
接下来我们简单看下如何使用这个新框架吧。
首先需要包含框架
[code lang=”Objective-C”]import SafariServices[/code]
其次就是实例化,并跳入到控制器
[code lang=”Objective-C”]// entersReaderIfAvailable参数是是否可以调用阅读模式
let safarivc = SFSafariViewController(URL: NSURL(string: “http://www.baidu.com”)!, entersReaderIfAvailable: true)
self.presentViewController(safarivc, animated: true, completion: nil)[/code]
接下来实现SFSafariViewControllerDelegate
[code lang=”Objective-C”]// 此方式是打开safari加载网页完成之后的方法,打印结果显示是否加载成功
func safariViewController(controller: SFSafariViewController, didCompleteInitialLoad didLoadSuccessfully: Bool) {
print(“\(didLoadSuccessfully)”)
}
// 点击完成后调用此方法
func safariViewControllerDidFinish(controller: SFSafariViewController) {
print(“back”)
}
// 点击分享按钮就能拦截到此方法,在这里可以自定义分享里面的按钮
func safariViewController(controller: SFSafariViewController, activityItemsForURL URL: NSURL, title: String?) -> [UIActivity] {

print(“\(URL),\(title)”)

let ac = UIActivity()
return [ac]
}[/code]
以上就是SFSafariViewController 控制器的简单集成

Replay Kit 使用

Replay Kit 感觉是玩游戏时需要的,可以录制视频,可以语言教学。但是要求在iOS9以上,那么我们来看看如何简单的集成这个框架进行录制自己的小视频吧。
首先需要包含框架

import ReplayKit

其次就是创建一个按钮,来供我们进行录制功能,然后方法名为startRecording

func startRecording(sender :UIButton) {
    if RPScreenRecorder.sharedRecorder().available {
        // true :第一个参数代表是否开启麦克风
        RPScreenRecorder.sharedRecorder().startRecordingWithMicrophoneEnabled(true, handler: { (error :NSError?) -> Void in
            if error == nil {
                sender.removeTarget(self, action: "startRecording:", forControlEvents: .TouchUpInside)
                sender.addTarget(self, action: "stopRecording:", forControlEvents: .TouchUpInside)
                sender.setTitle("停止", forState: .Normal)
            }else{
                print("录像失败")
            }
        })
    }else{
         print("不能录像")
    }
}

接下来我们要实现停止录像的方法

func stopRecording(sender :UIButton){
    RPScreenRecorder.sharedRecorder().stopRecordingWithHandler { (previewController : RPPreviewViewController?, error :NSError?) -> Void in
        if previewController != nil {
            previewController?.previewControllerDelegate = self
            let alertController = UIAlertController(title: "Recording", message: "Do you wish to discard or view your gameplay recording?", preferredStyle: .Alert)
            // 取消按钮
            let discardAction = UIAlertAction(title: "Discard", style: .Default) { (action: UIAlertAction) in
                RPScreenRecorder.sharedRecorder().discardRecordingWithHandler({ () -> Void in
                    // Executed once recording has successfully been discarded
                })
            }
            // 确定按钮
            let viewAction = UIAlertAction(title: "View", style: .Default, handler: { (action: UIAlertAction) -> Void in
                self.presentViewController(previewController!, animated: true, completion: nil)
            })
                
            alertController.addAction(discardAction)
            alertController.addAction(viewAction)
                
            self.presentViewController(alertController, animated: true, completion: nil)
                
            sender.removeTarget(self, action: "stopRecording:", forControlEvents: .TouchUpInside)
            sender.addTarget(self, action: "startRecording:", forControlEvents: .TouchUpInside)
            sender.setTitle("Start Recording", forState: .Normal)
            sender.setTitleColor(UIColor.blueColor(), forState: .Normal)
        }else{
                
        }
    }
}

上面的代码我们还需要实现了replaykit框架的一个delegate。RPPreviewViewControllerDelegate
以下是他的两个delegate方法
// 此方式是点击view之后 弹出视频预览页面,可以直接返回 可以保存 也可以分享 通过activityTypes的返回字段可以拿到相应的状态

func previewController(previewController: RPPreviewViewController, didFinishWithActivityTypes activityTypes: Set) {
    print("\(activityTypes)")
        
    if activityTypes.contains("com.apple.UIKit.activity.SaveToCameraRoll")  {
        print("存储视频")
    }else{
        print("取消")
    }
}
// 这是点击视频预览页面顶部两个按钮之后执行的操作
func previewControllerDidFinish(previewController: RPPreviewViewController) {
    previewController.dismissViewControllerAnimated(true, completion: nil)
}