为什么没有或很少有人用vxcode js 高亮写js

本文出自汗血宝马,转载时请注明出处及相应链接。
本文永久链接: http://www.caotama.com/26836.html
Ɣ回顶部使用Xcode做WebApps时,使用UIWebview来调用一个页面,有时会遇到问题,其一就是编译的时候出现黄色感叹号的Warning,js文件都报错:warning: no rule to process file '$(PROJECT_DIR)/jquery-1.8.1.min.js' of type sourcecode.javascript for architecture i386
错误原因是:js和html等资源文件加入到project的时候,Xcode错误的将js文件都放到了编译源代码(Compile Sources)文件夹,以为js代码也需要&被编译&。
解决的办法:将Targets -&Build Phases-& Compile Sources 中的js文件拖拽到Copy Bundle Resource即可
Copy Bundle Resources:是指生成的product的.app内将包含哪些资源文件。通过Copy Bundle Resources中内容的不同设置, 我们可以让不同的product包含不同的资源, 包括程序的主图标等, 而不是把XCode的工程中列出的资源一股脑的包含进去
Compile Sources:是指将有哪些源代码被编译
Link Binary With Libraries:是指编译过程中会引用哪些库文件
另转:Xcode编译错误和警告汇总&
1、error: macro names must be identifiers YourProject_prefix.pch
  原因: 因为你弄脏了预处理器宏,在它处于&Multiple Values&的时候修改了它
  解决方法: Configiration选择All Configirations,清空它 然后分别重新定义你的Debug,Release,Distributin预处理器宏吧
2、warning: no rule to process file '$(PROJECT_DIR)/LoadingView.h' of type sourcecode.c.h for architecture armv6
  原因: Target里Compile Sources里含有头文件 了,那里面不需要头文件
  解决方法:&从Target里Compile Sources里删除头文件
3、Command /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneOS Build System Support.xcplugin/Contents/Resources/copypng failed with exit code 1
  原因: png图像文件拷贝失败,看看信息上面提示Can't find哪个文件,一般都是从文件系统里删除文件而没有通过Xcode删除造成的,Xcode的项目配置文件依然纪录着这个文件的引用
  解决办法: 给文件系统里增加相应的文件,或者从Xcode的Groups & Files删除它,或者从Target的Copy Bundle Resources里删除它
4、Code Sign error: The identity 'iPhone Developer: Your Name' doesn't match any valid certificate/private key pair in the default keychain
  &原因: 签名错误
&  解决办法: Target -& Get Info -& Build -& Code Signing -& 修改签名
  记得左上角的Configuration类型要跟当前Build类型对应(Debug, Release, Distribution),否则改了也白改
&5、could not create bundle folder for versioned model *.moda(好像是这个后缀名的这个文件)
&  原因:编译一次会产生一个新的
&  解决办法:应该把编译产生出来的moda文件都删了,然后clean下工程,重新build即可
&6、error:There are no valid certificate/private key pairs in the default keychain
&7、error:Cannot assign to 'self' outside of a method in the init family
&  原因:只能在init方法中给self赋值,Xcode判断是否为init方法规则:方法返回id,并且名字以init &&&&+大写字母开头+其他 &为准则。例如:- (id) initWithXXX;
&  出错代码:- (id) Myinit{
      self = [super init];&&
  解决方法:- (id) initWithMy{
      self = [super init];
转自:http://blog.sina.com.cn/s/blog_4aacd7af01011woj.html
阅读(...) 评论()解决 cocos js xcode archive 没有dsym文件
cocos js 生成工程后,发现archive 没有dsym文件,网上找了一下,设置一个,说就可以了
不过最终还是没有好。。。
最后没办法,比对了一下可以有dsyms的工程,后来发现,还要修改两个配置
然后。。。。
然后就有dsyms了。。。
没有更多推荐了,JS&iOS原生交互 - 简书
JS&iOS原生交互
关于原生和hybid之争,这里不做探讨.主要讲讲JS和OC交互
开讲前附上一个牛逼的第三方
OC执行JS代码
1.stringByEvaluatingJavaScriptFromString
这个方法是UIWebView里面的方法,也是最为简单的和JS交互的方式
- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)
用法比较简单,一般在代理方法- (void)webViewDidFinishLoad:(UIWebView*)webView中使用
// 获取当前页面的title
NSString *title = [webview stringByEvaluatingJavaScriptFromString:@"document.title"];
// 获取当前页面的url
NSString *url = [webview stringByEvaluatingJavaScriptFromString:@"document.location.href"];
OC执行JS&JS执行OC
1.JavaScriptCore
这个是iOS7以后引进的,使用起来可简单,也可以比较复杂.
熟悉一下里面常见得几个对象及协议
JSContext:给JavaScript提供运行的上下文环境,通过-evaluateScript:方法就可以执行一JS代码
JSValue:JavaScript和Objective-C数据和方法的桥梁,封装了JS与ObjC中的对应的类型,以及调用JS的API等
JSManagedValue:管理数据和方法的类
JSVirtualMachine:处理线程相关,使用较少
JSExport:这是一个协议,如果采用协议的方法交互,自己定义的协议必须遵守此协议
** 简单方式:直接调用JS代码**
// 一个JSContext对象,就类似于Js中的window,
// 只需要创建一次即可。
self.jsContext = [[JSContext alloc] init];
jscontext可以直接执行JS代码。
[self.jsContext evaluateScript:@"var num = 10"];
[self.jsContext evaluateScript:@"var squareFunc = function(value) { return value * 2 }"];
// 计算正方形的面积
JSValue *square = [self.jsContext evaluateScript:@"squareFunc(num)"];
// 也可以通过下标的方式获取到方法
JSValue *squareFunc = self.jsContext[@"squareFunc"];
JSValue *value = [squareFunc callWithArguments:@[@"20"]];
NSLog(@"%@", square.toNumber);
NSLog(@"%@", value.toNumber);
** 快速调用Block,可传参数 **
各种数据类型可以转换,Objective-C的Block也可以传入JSContext中当做JavaScript的方法使用。虽然JavaScritpCore没有自带(毕竟不是在网页上运行的,自然不会有window、document、console这些类了),仍然可以定义一个Block方法来调用NSLog来模拟:
JSContext *context = [[JSContext alloc] init];
context[@"log"] = ^() {
NSLog(@"+++++++Begin Log+++++++");
NSArray *args = [JSContext currentArguments];
for (JSValue *jsVal in args) {
NSLog(@"%@", jsVal);
JSValue *this = [JSContext currentThis];
NSLog(@"this: %@",this);
NSLog(@"-------End Log-------");
[context evaluateScript:@"log('ider', [7, 21], { hello:'world', js:100 });"];
// Output:
// +++++++Begin Log+++++++
// [object Object]
// this: [object GlobalObject]
// -------End Log-------
通过Block成功的在JavaScript调用方法回到了Objective-C,而且依然遵循JavaScript方法的各种特点,比如方法参数不固定。也因为这样,JSContext提供了类方法来获取参数列表(+ (JSContext *) currentA)和当前调用该方法的对象(+ (JSValue *)currentThis)。对于"this"
,输出的内容是GlobalObject,这也是JSContext对象方法- (JSValue *)globalO
所返回的内容。因为我们知道在JavaScript里,所有全局变量和方法其实都是一个全局变量的属性,在浏览器中是window,在JavaScriptCore是什么就不得而知了。Block可以传入JSContext作方法,但是JSValue没有toBlock方法来把JavaScript方法变成Block在Objetive-C中使用。毕竟Block的参数个数和类型已经返回类型都是固定的。虽然不能把方法提取出来,但是JSValue提供了- (JSValue *)callWithArguments:(NSArray *)
方法可以反过来将参数传进去来调用方法。
JSContext *context = [[JSContext alloc] init];
[context evaluateScript:@"function add(a, b) { return a + }"];
JSValue *add = context[@"add"];
NSLog(@"Func: %@", add);
JSValue *sum = [add callWithArguments:@[@(7), @(21)]];
NSLog(@"Sum: %d",[sum toInt32]);
// OutPut:
// Func: function add(a, b) { return a + }
// Sum: 28
还提供- (JSValue *)invokeMethod:(NSString *)method withArguments:(NSArray *)
让我们可以直接简单地调用对象上的方法。只是如果定义的方法是全局函数,那么很显然应该在JSContext的globalObject对象上调用该方法;如果是某JavaScript对象上的方法,就应该用相应的JSValue
对象调用。
异常处理Objective-C的异常会在运行时被Xcode捕获,而在JSContext中执行的JavaScript如果出现异常,只会被JSContext捕获并存储在exception属性上,而不会向外抛出。时时刻刻检查JSContext
对象的exception是否不为nil显然是不合适,更合理的方式是给JSContext
对象设置exceptionHandler,它接受的是^(JSContext *context, JSValue *exceptionValue)
形式的Block。其默认值就是将传入的exceptionValue赋给传入的context的exception属性:
^(JSContext *context, JSValue *exceptionValue) {
context.exception = exceptionV
我们也可以给exceptionHandler
赋予新的Block以便在JavaScript运行发生异常的时候我们可以立即知道:
JSContext *context = [[JSContext alloc] init];
context.exceptionHandler = ^(JSContext *con, JSValue *exception) {
NSLog(@"%@", exception);
con.exception =
[context evaluateScript:@"ider.zheng = 21"];
// ReferenceError: Can't find variable: ider
使用Block的注意事项
从之前的例子和介绍应该有体会到Block在JavaScriptCore中起到的强大作用,它在JavaScript和Objective-C之间的转换 建立起更多的桥梁,让互通更方便。但是要注意的是无论是把Block传给JSContext对象让其变成JavaScript方法,还是把它赋给exceptionHandler属性,在Block内都不要直接使用其外部定义的JSContext对象或者JSValue,应该将其当做参数传入到Block中,或者通过JSContext的类方法+ (JSContext *)currentC来获得。否则会造成循环引用使得内存无法被正确释放。比如上边自定义异常处理方法,就是赋给传入JSContext对象con,而不是其外创建的context对象,虽然它们其实是同一个对象。这是因为Block会对内部使用的在外部定义创建的对象做强引用,而JSContext也会对被赋予的Block做强引用,这样它们之间就形成了循环引用使得内存无法正常释放。对于JSValue也不能直接从外部引用到Block中,因为每个JSValue上都有JSContext
的引用 (@property(readonly, retain) JSContext *),JSContext再引用Block同样也会形成引用循环。
前面十分的简单方便而且高效,不过也仅限于数值型、布尔型、字符串、数组等这些基础类型。
为了方便起见,以下所有代码中的JSContext对象都会添加如下的log
方法和eventHandler
JSContext *context = [[JSContext alloc] init];
context.exceptionHandler = ^(JSContext *con, JSValue *exception) {
NSLog(@"%@", exception);
con.exception =
context[@"log"] = ^() {
NSArray *args = [JSContext currentArguments];
for (id obj in args) {
NSLog(@"%@",obj);
** 复杂但强大的方式:通过协议,模型实现(事先和前端协商格式)**
首先,我们需要先定义一个协议,而且这个协议必须要遵守JSExport协议。
注意js中调用oc方法时参数的写法
@protocol JavaScriptObjectiveCDelegate &JSExport&
// JS调用此方法来调用OC的系统相册方法
- (void)callSystemC
// 在JS中调用时,函数名应该为showAlertMsg(arg1, arg2)
// 这里是只两个参数的。
- (void)showAlert:(NSString *)title msg:(NSString *)
// 通过JSON传过来
- (void)callWithDict:(NSDictionary *)
// JS调用Oc,然后在OC中通过调用JS方法来传值给JS。
- (void)jsCallObjcAndObjcCallJsWithDict:(NSDictionary *)
为了在调用原生方法之后调用对应的JS方法,写两个JS方法:
var jsFunc = function() {
alert('Objective-C call js to show alert');
var jsParamFunc = function(argument) {
document.getElementById('jsParamFuncSpan').innerHTML
= argument['name'];
接下来,我们还需要定义一个模型,实现了上面定义协议里面的方法:
// 此模型用于注入JS的模型,这样就可以通过模型来调用方法。
@interface ObjCModel : NSObject &JavaScriptObjectiveCDelegate&
@property (nonatomic, weak) JSContext *jsC
@property (nonatomic, weak) UIWebView *webV
实现这个模型:
@implementation ObjCModel
- (void)callWithDict:(NSDictionary *)params {
NSLog(@"Js调用了OC的方法,参数为:%@", params);
// Js调用了callSystemCamera
- (void)callSystemCamera {
NSLog(@"JS调用了OC的方法,调起系统相册");
// JS调用后OC后,又通过OC调用JS,但是这个是没有传参数的
JSValue *jsFunc = self.jsContext[@"jsFunc"];
[jsFunc callWithArguments:nil];
- (void)jsCallObjcAndObjcCallJsWithDict:(NSDictionary *)params {
NSLog(@"jsCallObjcAndObjcCallJsWithDict was called, params is %@", params);
// 调用JS的方法
JSValue *jsParamFunc = self.jsContext[@"jsParamFunc"];
[jsParamFunc callWithArguments:@[@{@"age": @10, @"name": @"lili", @"height": @158}]];
- (void)showAlert:(NSString *)title msg:(NSString *)msg {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *a = [[UIAlertView alloc] initWithTitle:title message:msg delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
接下来,我们在controller中在webview加载完成的代理中,给JS注入模型。
注意,获取webview的jsContext的方法 self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
#pragma mark - UIWebViewDelegate
- (void)webViewDidFinishLoad:(UIWebView *)webView {
self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 通过模型调用方法,这种方式更好些。
ObjCModel *model
= [[ObjCModel alloc] init];
self.jsContext[@"OCModel"] =
model.jsContext = self.jsC
model.webView = self.webV
self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
context.exception = exceptionV
NSLog(@"异常信息:%@", exceptionValue);
通过KVC取得context,其路径为documentView.webView.mainFrame.javaScriptContext。这样就可以获取到JS的context,然后为这个context注入我们的模型对象。
这里我们定义了两个JS方法,一个是jsFunc,不带参数。
另一个是jsParamFunc,带一个参数。
接下来,我们在html中的body中添加以下代码:
&div style="margin-top: 100px"&
&h1&Test how to use objective-c call js&/h1&
&input type="button" value="Call ObjC system camera" onclick="OCModel.callSystemCamera()"&
&input type="button" value="Call ObjC system alert" onclick="OCModel.showAlertMsg('js title', 'js message')"&
&input type="button" value="Call ObjC func with JSON " onclick="OCModel.callWithDict({'name': 'testname', 'age': 10, 'height': 170})"&
&input type="button" value="Call ObjC func with JSON and ObjC call js func to pass args." onclick="OCModel.jsCallObjcAndObjcCallJsWithDict({'name': 'testname', 'age': 10, 'height': 170})"&
&span id="jsParamFuncSpan" style="color: font-size: 50"&&/span&
现在就可以测试代码了。
当我们点击第一个按钮:Call ObjC system camera时,
通过OCModel.callSystemCamera(),就可以在HTML中通过JS调用OC的方法。
在OC代码中,我们的callSystemCamera方法体中,添加了以下两行代码,就是获取HTML中所定义的JS就去jsFunc,然后调用它。
JSValue *jsFunc = self.jsContext[@"jsFunc"];
[jsFunc callWithArguments:nil];
这样就可以在JS调用OC方法时,也让OC反馈给JS。
看看下面传字典参数:
- (void)jsCallObjcAndObjcCallJsWithDict:(NSDictionary *)params {
NSLog(@"jsCallObjcAndObjcCallJsWithDict was called, params is %@", params);
// 调用JS的方法
JSValue *jsParamFunc = self.jsContext[@"jsParamFunc"];
[jsParamFunc callWithArguments:@[@{@"age": @10, @"name": @"lili", @"height": @158}]];
获取我们在HTML中定义的jsParamFunc方法,然后调用它并传了一个字典作为参数。
步骤有点多,但是理顺了确实很好用.
JavaScriptCore使用注意
JavaStript调用本地方法是在子线程中执行的,这里要根据实际情况考虑线程之间的切换,而在回调JavaScript方法的时候最好是在刚开始调用此方法的线程中去执行那段JavaStript方法的代码
根据url前缀特殊处理(协议拦截)-简单传递参数
在UIWebView的代理方法:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType判断url前缀,然后,根据协议类型进行特殊处理.
** 如果需要从url接受参数,我们可以把参数拼接到url上,从而传递到原生中.但是这种方式局限比较大**
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
NSString *urlStr = request.URL.absoluteS
if ([urlStr rangeOfString:@"test://"].location != NSNotFound) {
// url的协议头是test的特殊处理
NSLog(@"test");
NSURL *url = [NSURL URLWithString:urlStr];
NSString *scheme
NSString *host = url.
NSString *qurey = url.
NSString *parameter = url.parameterS
// 根据参数做进一步处理
return NO;
return YES;
这种方式同样需要先和服务端做一次统一
技术都可以学会;素质却很难培养;做事先做人。
随着H5技术的兴起,在iOS开发过程中,难免会遇到原生应用需要和H5页面交互的问题。其中会涉及方法调用及参数传值等场景。 iOS原生应用和web页面的交互大致上有这几种方法:1)URL拦截协议;(兼容iOS6及以下时可考虑,本文介绍)2)第三方框架WebViewJavaSc...
JavaScriptCore框架主要是用来实现iOS与H5的交互。由于现在混合编程越来越多,H5的相对讲多,所以研究JavaScriptCore框架是相当有必要的。 一、JavaScriptCore框架几个常用的类 首先导入JavaScriptCore框架: #import...
本文由我们团队的 纠结伦 童鞋撰写。 写在前面 本篇文章是对我一次组内分享的整理,大部分图片都是直接从keynote上截图下来的,本来有很多炫酷动效的,看博客的话就全靠脑补了,多图预警 :) 概览 JavaScriptCore 简介 Objective-C 与 JavaSc...
写在前面 本篇文章是对我一次组内分享的整理,大部分图片都是直接从keynote上截图下来的,本来有很多炫酷动效的,看博客的话就全靠脑补了,多图预警 :) 概览 JavaScriptCore 简介 Objective-C 与 JavaScript 交互 JavaScript ...
前言 Web 页面中的 JS 与 iOS Native 如何交互是每个 iOS 猿必须掌握的技能。而说到 Native 与 JS 交互,就不得不提一嘴 Hybrid。 Hybrid 的翻译结果并不是很文明(擦汗,不知道为啥很多翻译软件会译为“杂种”,但我更喜欢将它翻译为“混...
要么旅行,要么读书,身体和灵魂,必须有一个在路上。——王潇 4月23日,是世界的读书日。于是,很多牛人,都纷纷热心地出来搞了很多大大小小的读书活动,来进行推动和宣传,可谓是功德无量。而在这些读书活动中,影响最大,也是最牛的,莫过于“罗辑思维”的罗胖搞的那个非常高逼格的读书会...
我已拥有强烈的使命感。完成一段生涯咨询后,来访者取得行动方案的喜悦,笃定,让自己心升责任二字,生涯教育和生涯咨询承载了多少学子对未来的期许和对前途的憧憬。生涯,教练,我在路上,继续精进…… 我已拥有对打破框架的深度觉察。每个人都有来自于过去,家庭,社会,留存在思维里的固有信...
这世间多少人多少事回首试想一二着实荒唐。 莫不是为生计为功名争狠斗勇。 有钱的认为万贯家财,能使小鬼推磨 有权的认为权势滔天,亦可呼风唤雨 你我所在的世界,莫不是你追我赶,为了生计迫于奔命 生死关头,黄泉路上,带不走的恰好是生前争争抢抢功名利禄。 你说功名好,你说权势好,你...
集体生活到现在,细细数来,已经快要迈进第七个年头了。同住的室友里,有从小学就开始住集体宿舍的,也有入了大学才开始有室友的生活。大概,我从高中开始的宿舍生活还算是一个比较适合的时间吧。 高中时候的大家,逐渐脱去稚气迈向成熟。也许是封闭的校园环境,也许是繁重的学业,大家都无心思...XCODE环境下 js修改代码无效的情况
在BuildPhase 中加入Script _TARGET_BUILD_CONTENTS_PATH=$TARGET_BUILD_DIR/$CONTENTS_FOLDER_PATHecho _TARGET_BUILD_CONTENTS_PATH: $_TARGET_BUILD_CONTENTS_PATHecho PWD: $PWDecho Cleaning $_TARGET_BUILD_CONTENTS_PATH/rm -fr $_TARGET_BUILD_CONTENTS_PATH/srcrm -fr $_TARGET_BUILD_CONTENTS_PATH/res这个script一定要放在Target Dependencies的后面
开发时遇到了这个问题,资源在XCode里是蓝色的文件夹,资源修改后必须重新编译工程才能生效。在这里看到了解决方法:http://cn.quick-x.com/?p=22 但代码貌似不起作用,我在它的基础上改了下,最后删除了 .DS_Store 和 .svn 文件
_TARGET_BUILD_CONTENTS_PATH=$TARGET_BUILD_DIR/$CONTENTS_FOLDER_PATH
rm -rf "${_TARGET_BUILD_CONTENTS_PATH}/res/"
mkdir -p "${_TARGET_BUILD_CONTENTS_PATH}/res/"
cp -RLp "${PWD}/../Resources/res/" "${_TARGET_BUILD_CONTENTS_PATH}/res/"
find "${_TARGET_BUILD_CONTENTS_PATH}/res" \( -name ".svn" -o -name ".DS_Store" \) -exec rm -rf {} \; -prune
没有更多推荐了,}

我要回帖

更多关于 xcode js 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信