1.打开主程序:
一如很多前辈所说,即是打开containerAPP,苹果提供了NSExtensionContext下的OpenURL方法,但是官方文档中又提到:
Each extension point determines whether to support this method, or under which conditions to support this method. In iOS 8, only the Today extension point (used for creating widgets) supports this method.
可能苹果目的是所有的extension都支持该方法,但是在iOS8中只有Today extension 是支持的,而其他并不支持,想想现在都已经10.2了 :D
在stackoverflow上,找到了一个解决办法,是在iOS8.3+可以使用的。不知道后期是否还有更好的方法,但是这个是可以解决打开问题,如果有更好的方法,评论分享啊。
UIResponder* responder = self;
while ((responder = [responder nextResponder]) != nil) {
if ([responder respondsToSelector:@selector(openURL:)] == YES) {
[responder performSelector:@selector(openURL:)
withObject:url];
}
}
//url是主程序的URLScheme
主程序会在AppDelegate里的
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
return YES;
}
里接收Extension发送来的请求,要处理什么事情,只要在这里进行就可以了
2.判断是否开启完全访问:
[UIPasteboard generalPasteboard].string == nil ?
因为开启了完全访问的权限后,就能访问到系统的剪切板,所以通过这个方法间接的判断是否开启完全访问。
3.实时获取剪切板内容:
可以考虑开启NSTimer,然后利用 [timer setFireDate:[NSDate distantPart]]
开启,在ViewDidDisappear里 [timer setFireDate:[NSDate distantFuture]]
关闭。
4.控制内存占用问题:
因为苹果对自定义键盘严格的内存限制,超过会导致键盘直接崩溃,所以控制内存占用是重中之重
· 避免循环引用,及时释放
· 绘制文字会瞬间占用很大的内存,且无法立即释放,所以比如在加载Emoji表情的时候,尽量使用图片来显示。完整的Emoji表情,可以在http://www.unicode.org/emoji/index.html 找到。对应按键的字符,也最后使用图片。
· 加载图片使用imageWithContentsOfFile的方法
· 还有一些方法的使用可以参考搜狗输入法的优化总结