js调app原生方法

// 定义 const ApiBridge = {     msgQueue: [],     callbackCache: [],     callbackId: 0,     processingMsg: false,     isReady: false,     isNotifyReady: false }; ApiBridge.callNative = function(clz, method, args, callback) {     var msgJson = {};     msgJson.clz = clz;     msgJson.method = method;     if (args != undefined)         msgJson.args = args;     return prompt(JSON.stringify(msgJson)); }; // 调用 setTimeout(() => {         this.$ApiBridge.callNative("KCApiTSLModule", "notifyF", {           action: 'closePage',           param: {}         });       }); 以上代码经测试不能很好的兼容ios,下面的代码可以:

 

webview调用ios或者安卓的方法(内嵌h5页面调用app原生方法)

1.配合使用调用app原生的方法(h5页面不需要回调和数据) 实例1

  实例2

  2.配合使用调用app原生的方法(h5页面需要回调和数据) // 从App获取UUID(手机唯一标识)

标红字段为调用的app端定义的方法名,需要app端定义方法配合   from:https://www.cnblogs.com/wendyAndJken/p/9318501.html

iOS9 & iOS10 & iOS11 HTTP 不能正常使用的解决办法

今天升级Xcode 7.0 bata发现网络访问失败。 输出错误信息

  Google后查证,iOS9引入了新特性App Transport Security (ATS)。详情:App Transport Security (ATS) 新特性要求App内访问的网络必须使用HTTPS协议。 但是现在公司的项目使用的是HTTP协议,使用私有加密方式保证数据安全。现在也不能马上改成HTTPS协议传输。 最终找到以下解决办法: 在Info.plist中添加NSAppTransportSecurity类型Dictionary。 在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES 看到很多同学修改后还是不能用添加一下截图: 在Filter中搜索Info.plist,选择Info.plist进行编辑 按照上面提到的方式添加信息,正确的修改会看到下图这个样子,注意类型NSAppTransportSecurity为Dictionary,NSAllowsArbitraryLoads为Boolean,复制粘贴的时候,不要多了空格,segment fault 页面上直接复制,经常会多一个出空格! 注意⚠️,单元测试下面也有一个Info.plist,修改那个文件是没有作用的! 补充说明 上面介绍的方法虽然解决了网络访问的问题,但是苹果提供的安全保障也被关闭了。 不过,按照国内的现状,关闭这个限制也许是更实际的做法。 至于原因就太多了,第三方SDK(几乎都是访问HTTP),合作伙伴接入(不能要求它们一定要支持HTTPS)。 如果你的App没有受到这些原因的限制,还是更建议你增加HTTPS支持,而不是关闭限制。 请大家根据项目的实际情况作调整。 出于安全考虑我们提倡使用HTTPS,退而求其次,优先考虑使用例外:将允许访问的域加入到配置列表中 @banxi1988 补充了配置的方法 对于实在不支持HTTPS的应该首先考虑添加例外 添加例外的方式也很简单: 左键Info.plist选择open with source code 然后添加类似如下的配置:

  根据自己需要的域名修改, NSIncludeSubdomains 顾名思义是包括子域的意思。 参考: App Transport Security support aka apps on iOS 9 don’t work #4560 711_networking_with_nsurlsession.pdf 总结: 苹果正在加大应用安全的管控,这个举措可以看出苹果对信息安全的重视,也暴露出大部分应用传输数据时都是未经过加密的,或使用私有方式加密,以至于苹果开始对开发者提出要求。 私有加密虽然一定程度上是安全的,但是终究不是一个长久之计。全世界这么多安全专家在维护HTTPS安全,早日使用HTTPS确保信息安全才是王道!也省去了私有加密协议的安全隐患!   from:https://segmentfault.com/a/1190000002933776

搭建开发环境macOS-IOS

欢迎使用 React Native!这篇文档会帮助你搭建基本的 React Native 开发环境。如果你已经搭好了环境,那么可以尝试一下编写 Hello World。 Follow these instructions if you need to build native code in your project. For example, if you are integrating React Native into an existing application, or if you "ejected" from Create React Native App, you’ll need this section. 根据你所使用的操作系统、针对的目标平台不同,具体步骤有所不同。如果想同时开发 iOS 和 Android 也没问题,你只需要先选一个平台开始,另一个平台的环境搭建只是稍有不同。 如果阅读完本文档后还碰到很多环境搭建的问题,我们建议你还可以再看看由本站提供的环境搭建视频教程(macOS iOS、macOS Android、windows Android)、windows 环境搭建文字教程、以及常见问题。注意!视频教程或者其他网络上的博客和文章可能和本文档有所出入,请以最新版本的本文档所述为准! 开发平台: macOS 目标平台: iOS 安装依赖 必须安装的依赖有:Node、Watchman 和 React Native 命令行工具以及 Xcode。 虽然你可以使用任何编辑器来开发应用(编写 js 代码),但你仍然必须安装 Xcode 来获得编译 iOS 应用所需的工具和环境。 Node, Watchman 我们推荐使用Homebrew来安装 Node 和 Watchman。在命令行中执行下列命令安装:

如果你已经安装了 Node,请检查其版本是否在 v8.3 以上。安装完 Node 后建议设置 npm 镜像以加速后面的过程(或使用科学上网工具)。 注意:不要使用 cnpm!cnpm 安装的模块路径比较奇怪,packager 不能正常识别!

Watchman则是由 Facebook 提供的监视文件系统变更的工具。安装此工具可以提高开发时的性能(packager 可以快速捕捉文件的变化从而实现实时刷新)。 Yarn、React Native 的命令行工具(react-native-cli) Yarn是 Facebook 提供的替代 npm 的工具,可以加速 node 模块的下载。React Native 的命令行工具用于执行创建、初始化、更新项目、运行打包服务(packager)等任务。

  安装完 yarn 后同理也要设置镜像源:

  安装完 yarn 之后就可以用 yarn 代替 npm 了,例如用yarn代替npm install命令,用yarn add 某第三方库名代替npm install 某第三方库名。 Xcode React Native 目前需要Xcode 9.4 或更高版本。你可以通过 App Store 或是到Apple 开发者官网上下载。这一步骤会同时安装 Xcode IDE、Xcode 的命令行工具和 iOS 模拟器。 Xcode 的命令行工具 启动 Xcode,并在Xcode | Preferences | Locations菜单中检查一下是否装有某个版本的Command Line Tools。Xcode 的命令行工具中包含一些必须的工具,比如git等。 创建新项目 使用 React Native 命令行工具来创建一个名为"AwesomeProject"的新项目: !!!注意!!!:init 命令默认会创建最新的版本,而目前最新的 0.45 及以上版本需要下载 boost 等几个第三方库编译。这些库在国内即便翻墙也很难下载成功,导致很多人无法运行iOS项目!!!中文网在论坛中提供了这些库的国内下载链接。如果你嫌麻烦,又没有对新版本的需求,那么可以暂时创建0.44.3的版本。

  提示:你可以使用--version参数(注意是两个杠)创建指定版本的项目。例如react-native init MyApp --version 0.44.3。注意版本号必须精确到两个小数点。 如果你是想把 React Native 集成到现有的原生项目中,则步骤完全不同,请参考集成到现有原生应用。 编译并运行 React Native 应用 在你的项目目录中运行react-native run-ios:

  提示:如果 run-ios 无法正常运行,请使用 Xcode 运行来查看具体错误(run-ios 的报错没有任何具体信息)。 很快就应该能看到 iOS 模拟器自动启动并运行你的项目。 react-native run-ios只是运行应用的方式之一。你也可以在 Xcode 或是Nuclide中直接运行应用。 如果你无法正常运行,先回头仔细对照文档检查,然后可以看看论坛的求助专区。 在真机上运行 上面的命令会自动在 iOS 模拟器上运行应用,如果你想在真机上运行,则请阅读在设备上运行这篇文档。 修改项目 现在你已经成功运行了项目,我们可以开始尝试动手改一改了: 使用你喜欢的编辑器打开App.js并随便改上几行。 在 iOS 模拟器中按下⌘-R就可以刷新 APP 并看到你的最新修改!(如果没有反应,请检查模拟器的 Hardware 菜单中,connect hardware keyboard 选项是否选中开启) 完成了! 恭喜!你已经成功运行并修改了你的第一个 React Native 应用。 接下来? 试着在开发者菜单中打开Live Reload,现在你只要一保存代码应用就会自动完整刷新。 如果你想把 React Native 集成到现有的原生项目中,则请参考集成到现有原生应用。 如果你想从头开始学习 React Native 开发,可以从尝试编写 Hello World开始。

PhoneGap Developer App Android

由于谷歌商店国内访问不了,即使访问得了,国内许多安卓机也没有google play的框架,还是安装不了google商店的应用。想用安卓机开发啊,找度娘,终于在csdn的下载上,找到了个可用的~ Apk下载   csdn:http://download.csdn.net/download/yyh352091626/9176197

27 个 iOS 开源库,让你的开发坐上火箭吧

1. DZNEmptyDataSet 这本应该是iOS中一个标准、内置的解决空table和collection view的方式。默认的如果你的table view是空的,屏幕就是空的。但这不是你能提供的最好的用户体验。 用了这个库,你只需要遵循一系列协议,iOS会优雅地接管你的collection view并且会正确、好看地显示给用户信息。很明显,每个iOS项目都应该采用。 这是完全可自定义的。 CocoaPods: pod ‘DZNEmptyDataSet’ GitHub 2. PDTSimpleCalendar 你的app是否需要一个简单、好看并且有效的日历组件呢? 现在你有了——PDTSimpleCalendar很有可能是最棒的iOS日历组件。有很多方式来自定义它,逻辑有效而且好看。 CocoaPods: pod 'PDTSimpleCalendar' GitHub 3. MagicalRecord 他们说,Core Data很简单。他们说,它很好很简单。哈哈,你是认真的吗,苹果?一顿陈词滥调的代码被添加到每个项目里,这真的不够优雅和简单。更不用说添加、移除和更新很多实体,保存上下文,为不同的环境创建不同的Core Data栈,等等等等。我当然很喜欢Core Data,但是苹果真的可以通过一个简单的好方法来简化它——MagicalRecord方法。 MagicalRecord的工作就像一个Core Data的包装,并且向开发者隐藏了所有无关的东西。如果你曾经用过活跃纪录模式(例如Ruby on Rails),那你已经掌握它了。如果你在app里用Core Data的话真的真心推荐这个库。 CocoaPods: pod 'MagicalRecord' GitHub 4. Chameleon 如果你读到了这一点,你是一个很好的程序员,而不是一个设计师。这就是为你准备的。 Chameleon是iOS的一个颜色框架。它用好看、摩登的扁平化颜色扩展了UIColor。它也给了我们能力来创建调色板,里面是我们自己定义的颜色。它可以做很多其他事,探索readme文件。如果你想要好看的应用程序,快把这个库加到你的项目里吧。 Chameleon基础扁平化颜色 CocoaPods: pod 'ChameleonFramework' GitHub 5. Alamofire Alamofire是一个用Swift写的优雅的网络库。你曾经用过AFNetworking吗?ALamofire是它的弟弟。年轻也更有才华,当然啦(AFNetworking是用Objective-C写的)。 需要做网络相关比如下载、上传、获取JSON等等?Alamofire是为你准备的。GitHub上8000人的选择不会错。 CocoaPods: pod 'MagicalRecord' GitHub 6. TextFieldEffects 你不觉得标准的UITextField有一点无聊吗?我也是——所以对TextFieldEffects说hello吧!我不会写太多,我只会展示你一些这个库可以做的例子: 是的,这些就是简单的易用的控制器。你甚至可以用storyboard里的IBDesignable! 不幸的是这个库不支持CocoaPods(如果你来自未来,而这在一些时间之前改变了的话,请在Twitter上让我知道),但它支持Carthage。你也可以简单的从GitHub下载项目,并且把它添加到你的workspace里。 Carthage: github "raulriera/TextFieldEffects" GitHub 7. GPUImage 你曾经创建过一个摄像机app吗?如果没有,看完这个库你就肯定会的。 GPUImage可能性 GPUImage提供我们一个GPU-accelerated摄像头效果(图像和视频都可以),熊熊燃烧般的速度。App Store里有几百个app使用这个库——其中就有我的一个: 我的一个app中用的GPUImage GitHub上8869个收藏并且还在持续增加。 CocoaPods: pod 'GPUImage' GitHub 8. iRate 在App Store获得更多评价最好的方式是什么?我没有明确的数据来回答这个问题,但如果要我来猜测的话,我会说只要简单的询问用户就可以了。也许这是一个老套的方式——大部分开发者现在创建自定义的app内置提醒——但如果你没有时间或者不想所有事都从头做起,用iRate比不用要好。并且这就是iRate——一个小库,你包含在你的项目里并且忘记询问用户去评价了——iRate会自动替你完成,在合适的时间里。 CocoaPods: pod 'iRate' GitHub 9. GameCenterManager 喜欢或讨厌一个人,在这种情况下管理Game Center非常简单,只需要一点我们最著名的反模式的帮助(你的游戏里只有Game Center,对吧?) 诚实地说,在iOS里香草管理Game Center并不是那么困难,但用这个库就是简单和快速。更好的是好的敌人。 我的一个游戏里就用了它,真是一个愉悦的体验。 CocoaPods: pod 'GameCenterManager' GitHub 10. PKRevealController 2 这是一个真正的宝石,我最喜欢的iOS控件之一。PKRevealController是一个可滑动的侧边栏(向左、向右或者都可以),用你的手指来滑动(或者只通过点击按钮,但这样就没有滑动酷了)。 我使用过一些其它库,提供这种空间,PKRevealController是最好的。设置起来很简单,高度可自定义,手势识别非常非常好。它可以在iOS SDK中包含作为一个标准空间,真的。 CocoaPods: pod 'PKRevealController' GitHub 11. SlackTextViewController 你曾经用过Slack iOS app吗?如果你在一个更大的软件公司工作的话,很有可能回答是。对于没有这么回答的人——Slack很坚硬。Slack的iOS app也是,特别是对于很好的、自定义的文本输入控件…就是你现在有的——你的app里可以用的代码! 自增长文本域?对的。手势识别,自动填充,多媒体粘贴?对的。简单的易用的?对的。你还可能需要什么? CocoaPods: pod 'SlackTextViewController' GitHub 12. RETableViewManager RETableViewManager会帮助你动态创建和管理你的table view,都用代码。它提供我们预先定义好的cell(布尔型、文本、日期等等。——看下面的截图),你也可以创建你的自定义视图,和默认的一起使用。 左侧截图好老套! 这些你都可以在storybard里做而不需要这个库的帮忙,但有的时候代码比可视化编辑器更简单。 CocoaPods: pod 'RETableViewManager' GitHub 13. PermissionScope 有用的库,通过在询问用户之前提示用户需要系统许可带来更好的用户体验。高度可接受程度->更多用户活动使用app->更好的留存->更好的数据->更多的下载。被高度推荐的pod。 CocoaPods: pod 'PermissionScope' GitHub 14. SVProgressHUD 这个图片正在被正确的加载,不会等很久也不需要刷新页面。这就是SVProgressHUD在你的app里看起来的样子。如果你需要自定义等待指示,这里就有一个(很有可能就是最好的)。 CocoaPods: pod 'SVProgressHUD' GitHub 15. FontAwesomeKit Font Awesome很酷,用这个库你可以轻松地添加字体到你的项目里,并且在多种方式里使用它。 CocoaPods: pod 'FontAwesomeKit' GitHub 16. SnapKit 喜欢auto layout?你应该! 至少在storyboard里创建的时候。 用代码创建constraints是痛苦的,如果没有帮助的话,但幸运的是SnapKit在这里,使用它你可以轻松写你的constraints,声明方式。看看吧。 CocoaPods: pod 'SnapKit' GitHub 17. MGSwipeTableCell 另一个UI组件,在很多app里都常见,苹果应该考虑在iOS标准库里加入类似的东西。可滑动的table cell,这是这个pod最好的描述。最好的一个。 这些只是3个动画种类,还有很多。探索readme文件。 CocoaPods: pod 'MGSwipeTableCell' GitHub 18. Quick Swift里的单元测试,给Swift(好吧,要给Objective-C),和Xcode融为一体。如果你是一个Objective-C粉,我会推荐你Specta而不是这个,但对于Swift Quick很有可能是最好的。 CocoaPods: pod 'Quick' GitHub 19. IAPHelper app内购带给我们很多陈词滥调的代码,用这个库就不需要了,把最有关交易金钱的普遍的任务从iOS用户到你的(或者你的公司的)钱包简单包装起来。 CocoaPods: pod 'IAPHelper' GitHub 20. ReactiveCocoa 好吧,这里我们有一个小怪兽。 ReactiveCocoa并不是很小、易用的项目,就像这个列表里其它项目一样。ReactiveCocoa带给我们一种完全不同的编程方式/结构,基于值的信号和流。这是完全的头脑风暴,首先你需要忘记你曾经学习的来理解它是如何工作的。这不是一个简单的任务,但是是有回报的。 这不是一个合适的地方来教你使用ReactiveCocoa,但我会给你一些好的资源,如果你感兴趣的话。 Getting Started with ReactiveCocoa ReactiveCocoa ReactiveCocoa Tutorial – The Definitive Introduction: Part 1/2 CocoaPods: pod 'ReactiveCocoa' GitHub 21. SwiftyJSON 让Swift里的JSON解析更简单。 CocoaPods: pod 'SwiftyJSON' GitHub 22. Spring 做动画更简单、可链和声明。 CocoaPods: pod 'Spring' GitHub 23. FontBlaster 在app里加载自定义字体更简单。 CocoaPods: pod 'FontBlaster' GitHub 24. TAPromotee 交叉推销你的app是最棒的销售策略之一,你可以在它们中免费实现。用这个库非常简单,你不再能为自己辩解为什么不用它——增加TAPromotee到你的podfile,配置、然后免费享受更多下载。 CocoaPods: pod 'TAPromotee' GitHub 25. Concorde 在你的app加载很多JPEG吗?用Concorde你可以加载地更好看。有进度的方式。 CocoaPods: pod 'Concorde' GitHub 26. KeychainAccess 管理钥匙串权限的小帮手库。 CocoaPods: pod 'KeychainAccess' GitHub 27. iOS-charts 最后但重要的——iOS图表库!很简单和有效,我不会在这儿写太多——滑动到下面去看在你的app用它可以干嘛。 是的,所有东西都是可用的,作为一个可放进去(好吧,也许是“可写进去”)的组件。 不幸的是目前还没有CocoaPods支持,所以你需要手动拖动项目到你的Xcode workspace中。 所有库的太长不看列表,快速访问: 1. DZNEmptyDataSet [UI, 空table view解决方案] 2. PDTSimpleCalendar [UI, 可放入日历组件] 3. MagicalRecord [Core Data帮手实现活动记录模式] 4. Chameleon [UI, 颜色框架] 5. Alamofire [Swift网络] 6. TextFieldEffects [UI, 自定义外观text fields] 7. GPUImage [快速图像处理] 8. iRate [获得用户评价] 9. GameCenterManager [轻松管理Game Center] 10. PKRevealController [UI, 滑动边栏] 11. SlackTextViewController [UI, 高度自定义text field] 12. RETableViewManager [用代码动态创建table view] 13. PermissionScope [UI, 巧妙的提前问用户要系统许可] 14. SVProgressHUD [UI, 自定义等待菊花] 15. FontAwesomeKit [轻松地添加酷字体到你的app中] 16. SnapKit [用代码轻松auto layout] 17. MGSwipeTableCell [UI, 可滑动的table view cells] 18. Quick [Swift 单元测试框架] 19. IAPHelper [app内购封装帮手] 20. ReactiveCocoa [FRP框架] 21. SwiftyJSON [Swift JSON库] 22. Spring [动画框架] 23. FontBlaster [轻松在app中加载自定义字体] 24. TAPromotee [在你的app中交叉提示,置入界面] 25. Concorde [下载和解码进度化JPEGs] 26. KeychainAccess [轻松管理钥匙串] 27. iOS-charts [漂亮的图表库] 感谢阅读,真是一个长列表!如果你认为创建是有价值的,请分享它,通过点击文章下方的分享按钮——更多人会从中受益。并且如果你是一个Meduim用户,请点击推荐按钮——它会鼓舞我创建更多iOS开发文章! One more thing——如果你在读这篇文章,你很有可能是个iOS开发者。很多iOS开发者也是iPhone用户——所以我有一些你可能感兴趣的东西。 我运行着一个每周一次手选最好的iOS app和游戏——看看吧,我关注高质量并且只挑选酷的app。连接也会很酷! 你也可以在推特上follow我,我最经常讨论iOS开发的地方。 文/张嘉夫 译文出处:简书 from:http://www.oschina.net/news/75360/27-ios-opensource

这些编程语言程序员工资最高!C#才第九

在众多行业中,程序员属于高薪职业。无论是在国外还是国内,程序员的薪金水平普遍高于其他行业的工作岗位。 高薪的诱惑和充满挑战性的工作,令程序员一直成为备受欢迎的职业。在今年年初,Glassdoor发布的一份调查报告指出,在美国,程序员的就业情况仍然向好。据报告显示,在排名前25位的最能赚钱和需求量最高的工作岗位中,超过一半以上的岗位要求求职人员具备编程技术。因此,要想获得高薪不是一件容易的事情,你得有过硬的本领。 14种最具“吸金”能力的编程语言 据美国Rasmussen College(拉斯姆森学院)在2015年5月发表的一篇文章显示,在数以百计的编程语言中,以下14种编程语言最具“吸金”能力。 文章指出,这个结果是拉斯姆森学院收集了在2014年发布的1800万个招聘广告,以“平均年薪”和“招聘职位”两个指标为基础进行分析而得出来的。 (数据来源:Rasmussen College) 而在Indeed.com今年发布的调查数据则显示,根据编程工作的数量,排在前九位的编程语言如下: 图片来源:www.indeed.com 学习哪种编程语言可以赚到更多钱? 不同的编程语言适合不同的系统,不同的工程师也需要掌握不同的编程语言。 后台或服务器端的程序员通常都懂得Python, Ruby, PHP, Java或 .Net以及数据库的知识。前端或客户端的程序员掌握的编程语言主要是HTML, CSS和JavaScript,能力全面的程序员还具有设计能力。 移动应用的程序员懂得的语言是用于iOS 的Objective-C 或安卓系统的Java, 还有用于移动网站的HTML/CSS,他们当中有些人还懂得服务器的知识。3D或游戏开发者懂得 C/C , OpenGL和动画,同时具有艺术能力的程序员会更有优势。高效程序员懂得C/C 和Java,有的人还有数学和定量分析的能力。 如果你并不介意工程师的类型,Python, Objective-C, JavaScript, HTML和CSS这五种语言是值得学习的。因为每年它们都会出现在“最受欢迎的编程语言”名单中。此外,作为程序员,你还应该学习一些数据库,例如MySQL, MongoDB,而且要学习如何使用它来编程。 出处:网易科技 from:http://www.oschina.net/news/75295/these-programming-language-programmers-pay-the-highest

18080412_GI0N

React Native 源码笔记——你知道几条?

ReactNative是Facebook开源的一种实现移动跨平台开发的解决方案,目前在业界得到广泛应用,这里有非常详细的中文使用指南。本文主要分享RN源码中一些值得大家学习或者借鉴的代码或者编写技巧等,供大家学习参考。 整个RN库包含10多个工程,有兴趣的童鞋可以下载源码查看具体细节,在此不再展开。 宏定义巧用 整个ReactNative源码工程中用到了大量的宏定义,包括RCT_EXTERN、RCT_NOT_IMPLEMENTED、RCT_EXPORT_METHOD以及RCT_EXPORT_MODULE等申明宏或者功能宏。通过宏定义的方式,可以非常方便嵌入功能代码或者逻辑实现,重用代码的同时又保持了代码的整洁性。 比如,ProtocolKit工程中,作者通过宏定义@defs将Protocol接口巧妙的实现在.h文件中,代码简介明了,又不失功能完整性。当然,RN工程中,RCT_NOT_IMPLEMENTED宏也有相似作用,实际项目中各位也可以尝试通过宏定义实现一些常用功能模块。 关于iOS宏定义的文章有很多,在此推荐两篇非常不错的文章:RAC中必须要知道的宏、ios宏的使用和技巧。 环境变量 iOS开发中,各位对#ifdef DEBUG应该非常熟悉,通过判断该条件,可以区别当前运行环境是Debug环境还是Release环境。比如Release环境下通过重定义NSLog以屏蔽所有日志输出: ? 1 2 3 4 5 #ifdef DEBUG   #define NSLog(…) NSLog(__VA_ARGS__)   #else   #define NSLog(…) {}   #endif 进一步,是否可以考虑只在联机调试环境下输出日志?此时就涉及联机调试环境的判断,环境变量正好可以解决该问题: Xcode可以在不同环境下自定义环境变量Environment Variables,通过在运行环境Run中自定义变量CI_USE_PACKAGER,此时便可在项目代码中通过getenv()函数判断当前运行环境: ? 1 2 3 if (getenv("CI_USE_PACKAGER")) {   // to do… } 被忽略的硬键盘 相较于软键盘文字符号的输入,对于APP来说,硬键盘的应用开发似乎很容易被忽视,毕竟,通常情况下,硬键盘输入只会出现在模拟器环境下。 iOS7以后,系统定义有硬键盘响应交互类UIKeyCommand,通过UIKeyCommand,APP能够监听硬键盘的特定输入响应,比如Command+D等,当然,前提是APP需要首先监听该输入命令。 UIKeyCommand的使用非常简单,当需要在特定场景触发某一事件,但又不想影响界面显示的时候,不妨试试UIKeyCommand,具体使用可以看看这篇文章。 _cmd iOS官方文档中,_cmd表示当前方法的selector,你可以通过下面代码打印输出当前函数名: ? 1 NSLog(@"Current method: %@", NSStringFromSelector(_cmd)); 当然,实际项目中,你也可以这样使用: ? 1 2 NSNumber *rootTag = objc_getAssociatedObject(self, _cmd) ?: @1; objc_setAssociatedObject(self, _cmd, @(rootTag.integerValue + 10), OBJC_ASSOCIATION_RETAIN_NONATOMIC); 瞧,是不是有点意思! kCFNull 相对于nil NSNull而言,kCFNull笔者接触较少,kCFNull可以理解为NSNull单例对象: ? 1 2 id null1 = (id)kCFNull; id null2 = [NSNull null]; 打印地址: ? 1 2 null1=(NSNull *)0x10426eaf0 null2=(NSNull *)0x10426eaf0 从上面测试结果可以看出它们其实指向同一地址, 可以简单理解为 kCFNull === [NSNull null]。 文本阴影NSShadow APP开发中,程序猿可能经常需要在图片或视频上显示文字,由于背景颜色跟文字颜色相近,导致文字看不清,比如时下火热的直播弹幕显示,为了确保文字显示清晰,开发者一般会配上阴影或者文字描边。 给文本添加阴影描边,系统提供有NSShadow类,可以这样使用: ? 1 2 3 4 5 6 NSShadow *shadow = [NSShadow new]; shadow.shadowOffset = CGSizeZero; shadow.shadowBlurRadius = 5.0f; shadow.shadowColor = [UIColor colorWithWhite:0.0f alpha:0.3f]; NSAttributedString *attString = [[NSAttributedString alloc] initWithString:@"www.olinone.com" attributes:@{NSShadowAttributeName: shadow, NSForegroundColorAttributeName: [UIColor whiteColor]}]; lbl.attributedText = attString; 实际效果是这样的,shadowBlurRadius值越小,文本描边越清晰 主线程判断 判断当前执行线程是否为主线程的方法有很多,比如: ? 1 2 [NSThread isMainThread] pthread_main_np 在RN中,它是这样的: ? 1 2 3 4 5 6 7 8 BOOL RCTIsMainQueue() {   static void *mainQueueKey = &mainQueueKey;   static dispatch_once_t onceToken;   dispatch_once(&onceToken, ^{     dispatch_queue_set_specific(dispatch_get_main_queue(), mainQueueKey, mainQueueKey, NULL);   });   return dispatch_get_specific(mainQueueKey) == mainQueueKey; } 当然,由于无法查看NSThread内部实现机制,暂时无法了解孰优孰劣,不过,[NSThread isMainThread]貌似足矣! volatile不简单 在百科中,是这样描述它的:就像大家更熟悉的const一样,volatile是一个类型修饰符,它是被设计用来修饰被不同线程访问和修改的变量。作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。 简单说,被volatile修饰的变量是多线程安全的,其次,不会因为编译器优化导致读值出错。关于编译器编译优化可以看看这篇文章。 iOS开发中确保多线程安全的方法有很多,原子操作、线程锁、单线程执行等等,本人也写过相关文章iOS开发多线程同步。 在RN中,通过volatile修饰符,巧妙实现了多线程取消操作: ? 1 2 3 4 5 __block volatile uint32_t cancelled = 0; if (!cancelled) {    // to do… } OSAtomicOr32Barrier(1, &cancelled); 通过原子性操作访问被volatile修饰的cancelled对象即可保障函数只执行一次。想想大家熟悉的单例dispatch_once_t,现在让你设计单例对象,你又会如何设计了? ? 1 2 3 4 5 6 7 8 + (instancetype)sharedInstance {   static RCTWebSocketManager *sharedInstance = nil;   static dispatch_once_t onceToken;   dispatch_once(&onceToken, ^{     sharedInstance = [self new];   });   return sharedInstance; } 结构体Struct 说起Struct,不知各位对它印象如何?大学C课本中学过?NSObject类class原型貌似有讲? ? 1 2 3 struct iOSDev {     NSString *nickName; }; OC中一个简单的结构体,在Swift中,Struct也可以这样写: ? 1 2 3 4 5 6 7 8 9 struct iOSDev {     var nickName : String     func getBusinessCard() -> String {         return "\(nickName),幽默的iOS开发者!"     } };   let iOSOlinone = iOSDev(nickName: "olinone") print(iOSOlinone.getBusinessCard()) getBusinessCard为结构体函数,是不是感觉很方便!其实OC中也可以这样写: ? 1 2 3 4 5 6 7 8 9 struct iOSDev {     NSString *nickName;     NSString *getBusinessCard() {         return [NSString stringWithFormat:@"%@,幽默的iOS开发者!", nickName];     } };   iOSDev iosDev = iOSDev{@"olinone"}; NSLog(@"%@", iosDev.getBusinessCard()); 当然,为Struct添加函数并不是C语言特性,而是C++特性,因此,为了编译通过,你需要将.m文件修改成.mm文件 Struct有其使用的特殊场景,相较于Class,合理的使用Struct可以使代码更加整洁。同时,为了适应Swift中Struct强大特性,可以试着在OC项目中尝试Struct 最后,给大家来个段子吧: 话说一美女要在两个男人之间做选择,一个年纪大,长的丑,是个千万富翁,另一个年轻,帅气,iOS开发程序猿。 她对他们说,我会给你们一人一张纸条,写着我愿意的那张就是我的选择。 富翁打开纸条,看见上面写着我愿意,于是搂着她,坐上豪车高兴的走了。 年轻的小伙很伤心,打开纸条看见上面写着:“等我一个月~”   作者:庞海礁 原文链接:http://www.olinone.com/?p=590 from:http://www.oschina.net/news/75296/reactnative-source-notes

Facebook 针对 iOS 推出 Swift 开发者工具包

Swift3中文网消息,Facebook为iOS开发者推出了Swift开发者工具包(SDK),开发者可以通过Github链接下载https://github.com/facebook/facebook-sdk-swift。目前这一SDK基于Swift2,不过Facebook称他们将很快推出Swift3的版本。 据悉,这一开发者工具包包括登陆和分享功能,同时也包含带有分析功能的社交图谱API。 Facebook在官方博客中宣称:“我们相信将Facebook社交能力拓展于iOS生态系统,对于我们来说非常之重要。” 显然,Facebook并不是第一个投资于Swift的大公司,IBM在Swift发布的第一天起就发布了相关的企业级的工具,如Swift沙盒功能。Facebook也在类似的事情,这一SDK的发布将在消费级领域推广Swift的使用。 来源:Swift3中文网 from:http://www.oschina.net/news/75243/facebook-ios-swift

一个收集了 502 款开源 iOS 应用的开源项目

由dkhamsing发起的Open-Source iOS Apps收集了各种开源的iOS App,并进行了详细的分类,比如游戏、社交、健康、键盘、定位、多媒体、新闻、办公、安全以及小工具类等。截至目前,项目已收集了502款开源iOS应用,收获了7967+个Star,并吸引了109位Contributor的参与。 在此摘取部分与开发者密切相关的应用与其GitHub地址。欲阅览全部应用,可直接点击链接查阅「Open-Source iOS Apps」的README。 Developer AppLove:https://github.com/snowpunch/AppLove AppSlate:https://github.com/Taehan-Kim/AppSlate Bequest:https://github.com/splinesoft/Bequest Blink:https://github.com/blinksh/blink Charter:https://github.com/matthewpalmer/Charter wat:https://github.com/pj4533/wat GitHub CodeHub:https://github.com/thedillonb/CodeHub GitBucket:https://github.com/leichunfeng/MVVMReactiveCocoa Github-Swift:https://github.com/acmacalister/Github-Swift Monkey:https://github.com/coderyi/Monkey MrCode:https://github.com/haolloyin/MrCode OctoPodium:https://github.com/nunogoncalves/iOS-OctoPodium SwiftHub:https://github.com/sahandnayebaziz/StateView-Samples-SwiftHub Ionic Minds Mobile App:https://github.com/Minds/mobile Vegan Lists UK:https://github.com/dsgriffin/vegan-lists-uk Parse 2CITY:https://github.com/2city/2CITY-iOS Anypic in Objective-C:https://github.com/ParsePlatform/Anypic Anypic in Swift:https://github.com/kwkhaw/SwiftAnyPic AnyWall:https://github.com/ParsePlatform/AnyWall how-much:https://github.com/dkhamsing/how-much iBeaconTasks:https://github.com/TomekB/iBeaconTasks React Native 2048(App by Facebook):https://github.com/facebook/react-native/tree/master/Examples/2048 allyoop:https://github.com/wwayne/react-native-nba-app Around Me:https://github.com/bgryszko/react-native-example Assemblies:https://github.com/buildreactnative/assemblies ReactiveCocoa BrewMobile:https://github.com/brewfactory/BrewMobile C-41:https://github.com/ashfurrow/C-41 GroceryList:https://github.com/jspahrsummers/GroceryList HausClock:https://github.com/nottombrown/HausClock RxSwift Count It:https://github.com/PiXeL16/CountItApp GitHub API Client:https://github.com/tailec/boilerplate Kiosk:https://github.com/artsy/eidolon 出处:CSDN from:http://www.oschina.net/news/75258/502-opensource-ios