ios常见问题我要提意见

Native.js for iOS封装一条通过JS语法直接调用Native Objective-C接口通道,通过plus.ios可调用几乎所有的系统API。

方法:

对象:

权限:

5+功能模块(permissions)


{
// ...
"permissions":{
	// ...
	"Invocation": {
		"description": "Native.js"
	}
}
}
			

importClass

导入Objective-C类对象


ClassObject plus.ios.importClass( String classname );
				

说明:

导入类对象后,就可以通过.操作符直接调用对象(类对象/实例对象)的方法。 通过.操作符号调用方法时,不需要使用":"来分割参数。 注意:导入类对象将会消耗较多的系统资源,不应该导入过多的类对象,可以使用plus.ios.invoke()来调用未导入类实例对象的方法。

参数:

返回值:

ClassObject : Objective-C类对象,如果导入类对象失败则返回null。

示例:


<!DOCTYPE html>
<html>
	<head>
	<meta charset="utf-8"/>
	<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
	<title>iOS Native.js</title>
	<script type="text/javascript">
// 监听plusready事件  
document.addEventListener( "plusready", function(){
	// 扩展API加载完毕,现在可以正常调用扩展API
	// 导入GKLocalPlayer
	var GKLocalPlayer  = plus.ios.importClass("GKLocalPlayer");
}, false );
	</script>
	</head>
	<body>
	</body>
</html>
				

newObject

创建实例对象


InstanceObject plus.ios.newObject( String classname, Object..args );
				

参数:

返回值:

InstanceObject : Objective-C实例对象,如果创建对象失败则返回null。

示例:


<!DOCTYPE html>
<html>
	<head>
	<meta charset="utf-8"/>
	<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
	<title>iOS Native.js</title>
	<script type="text/javascript">
// 监听plusready事件  
document.addEventListener( "plusready", function(){
	// 扩展API加载完毕,现在可以正常调用扩展API
	// 创建GKLocalPlayer类的一个实例对象
	var localplayer  = plus.ios.newObject("GKLocalPlayer");
}, false );
	</script>
	</head>
	<body>
	</body>
</html>
				

deleteObject

销毁实例对象


void plus.ios.deleteObject( Object obj );
				

参数:

返回值:

void : 无

示例:


<!DOCTYPE html>
<html>
	<head>
	<meta charset="utf-8"/>
	<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
	<title>iOS Native.js</title>
	<script type="text/javascript">
// 监听plusready事件  
document.addEventListener( "plusready", function(){
	// 扩展API加载完毕,现在可以正常调用扩展API
	// 创建GKLocalPlayer类的一个实例对象
	var localplayer  = plus.ios.newObject("GKLocalPlayer");
	// ...
	// 销毁GKLocalPlayer示例对象
	plus.ios.deleteObject( localplayer );
}, false );
	</script>
	</head>
	<body>
	</body>
</html>
				

invoke

调用对象(类对象/示例对象)的方法


Object plus.ios.invoke( Object obj, String name, Object... args );
				

参数:

返回值:

Object : 调用方法的返回值,如果调用方法失败,则返回null。

示例:


<!DOCTYPE html>
<html>
	<head>
	<meta charset="utf-8"/>
	<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
	<title>iOS Native.js</title>
	<script type="text/javascript">
// 监听plusready事件  
document.addEventListener( "plusready", function(){
	// 扩展API加载完毕,现在可以正常调用扩展API
  // 创建UIAlertView类的实例对象
  var view = plus.ios.newObject("UIAlertView");
  // 设置提示对话上的内容,这里的方法名称中必须包含':'字符
  plus.ios.invoke(view,"initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:"
      , "自定义标题" // 提示框标题
      , "使用NJS的原生弹出框,可自定义弹出框的标题、按钮"  // 提示框上显示的内容
      , null // 操作提示框后的通知代理对象,暂不设置
      , "确定(或者其他字符)" // 提示框上取消按钮的文字
      , null ); // 提示框上其它按钮的文字,设置为null表示不显示
  // 调用show方法显示提示对话框,在JS中使用()语法调用对象的方法
  plus.ios.invoke(view,"show");
}, false );
	</script>
	</head>
	<body>
	</body>
</html>
				

implements

实现代理的方法


InstanceObject plus.ios.implements( String name, Object obj );
				

参数:

返回值:

InstanceObject : 代理实例对象。

示例:


<!DOCTYPE html>
<html>
	<head>
	<meta charset="utf-8"/>
	<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
	<title>iOS Native.js</title>
	<script type="text/javascript">
// 监听plusready事件  
document.addEventListener( "plusready", function(){
	// 扩展API加载完毕,现在可以正常调用扩展API
	// 登录到游戏中心
    // 监听用户登录状态变更事件
    var nc = NSNotificationCenter.defaultCenter();
    if(delegate){
    	nc.removeObservernameobject(delegate,"GKPlayerAuthenticationDidChangeNotificationName",null);
    }
    delegate = plus.ios.implements("NSObject",{"authenticationChanged:":authenticationChanged});
    nc.addObserverselectornameobject(delegate,
    	plus.ios.newObject("@selector","authenticationChanged:"),
    	"GKPlayerAuthenticationDidChangeNotificationName",
    	null);
    // 获取游戏玩家共享实例对象
    var localplayer = GKLocalPlayer.localPlayer();
    // 判断游戏玩家是否已经登录认证
    if ( localplayer.plusGetAttribute("isAuthenticated") ) {
        // 玩家已登录认证,获取玩家信息
        playerInformation( localplayer );
        bLogin = true;
    } else {
        // 玩家未登录认证,发起认证请求
        localplayer.authenticateWithCompletionHandler(null);
        eStart.innerText = "登录中...";
    }
    // 释放使用的对象
	plus.ios.deleteObject(localplayer);
	plus.ios.deleteObject(nc);
}, false );
	</script>
	</head>
	<body>
	</body>
</html>
				

currentWebview

获取当前Webview窗口对象的native层UIWebview实例对象


InstanceObject plus.ios.currentWebview();
				

说明:

UIWebview对象的API请参考Apple开发文档 UIWebview

参数:

返回值:

InstanceObject : Webview窗口对象的native层实例对象,如果调用方法失败,则返回null。

示例:


<!DOCTYPE html>
<html>
	<head>
	<meta charset="utf-8"/>
	<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
	<title>iOS Native.js</title>
	<script type="text/javascript">
var nwv=null;
// 监听plusready事件  
document.addEventListener( "plusready", function(){
	// 扩展API加载完毕,现在可以正常调用扩展API
	// 获取当前Webview窗口的UIWebview实例对象
	nwv = plus.ios.currentWebview();
	// ...
}, false );
// 使用Native.js调用Webview的loadUrl方法跳转页面
function loadUrl(){
	// 导入UIWebview、NSURLRequest、NSURL类
	var Webview = plus.ios.importClass("UIWebview");
	var NSURLRequest = plus.ios.import('NSURLRequest');
	var NSURL = plus.ios.import('NSURL');
	// 获取当前Webview对象的实例
	var wv = plus.ios.currentWebview();
	// 创建请求对象
	var req = NSURLRequest.requestWithURL(NSURL.URLWithString('http://www.dcloud.io/'));
	// 跳转页面
	plus.ios.invoke(wv,"loadRequest:",req);
	// 释放对象(可选)
	plus.ios.deleteObject(req);
	plus.ios.deleteObject(wv);
}
	</script>
	</head>
	<body>
		获取当前Webview窗口对象的native层UIWebview实例对象<br/>
		<button onclick="loadUrl()">Native.js跳转页面</button>
	</body>
</html>
				

ClassObject

Objective-C类对象


interface ClassObject {
	// ...
}
				

说明:

Objective-C类对象,可通过其属性获取类的常量,可通过方法来操作类的静态方法,也通过new方法来创建类的实例对象。 对于类的静态方法,则直接通过.后面跟随方法名称调用。

示例:


<!DOCTYPE html>
<html>
	<head>
	<meta charset="utf-8"/>
	<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
	<title>iOS Native.js</title>
	<script type="text/javascript">
// 监听plusready事件  
document.addEventListener( "plusready", function(){
	// 扩展API加载完毕,现在可以正常调用扩展API
	// 调用ios的文字转语音
	var AVSpeechSynthesizer = plus.ios.importClass("AVSpeechSynthesizer");
	var sppech = new AVSpeechSynthesizer(); // 实例化AVSpeechSynthesizer类对象
	// ...
}, false );
	</script>
	</head>
	<body>
	</body>
</html>
				

InstanceObject

Objective-C实例对象


interface InstanceObject {
	// ...
	function Object plusGetAttribute( String name );
	function Object plusSetAttribute( String name, Object value );
	// ...
}
				

说明:

Objective-C实例对象,可通过其方法来操作示例的变量和方法。 注意:必须通过plusGetAttribute()方法读取示例对象的属性值,通过plusSetAttribute()方法设置示例对象的属性值。

方法:

plusGetAttribute

获取Objective-C实例对象的属性


Object insobj.plusGetAttribute( String name );
						

参数:

返回值:

Object : 属性的实例对象

示例:


<!DOCTYPE html>
<html>
	<head>
	<meta charset="utf-8"/>
	<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
	<title>iOS Native.js</title>
	<script type="text/javascript">
// 监听plusready事件  
document.addEventListener( "plusready", function(){
	// 扩展API加载完毕,现在可以正常调用扩展API
	// 登录到游戏中心
    // 监听用户登录状态变更事件
    var nc = NSNotificationCenter.defaultCenter();
    if(delegate){
    	nc.removeObservernameobject(delegate,"GKPlayerAuthenticationDidChangeNotificationName",null);
    }
    delegate = plus.ios.implements("NSObject",{"authenticationChanged:":authenticationChanged});
    nc.addObserverselectornameobject(delegate,
    	plus.ios.newObject("@selector","authenticationChanged:"),
    	"GKPlayerAuthenticationDidChangeNotificationName",
    	null);
    // 获取游戏玩家共享实例对象
    var localplayer = GKLocalPlayer.localPlayer();
    // 判断游戏玩家是否已经登录认证
    if ( localplayer.plusGetAttribute("isAuthenticated") ) {
        // 玩家已登录认证,获取玩家信息
        playerInformation( localplayer );
        bLogin = true;
    } else {
        // 玩家未登录认证,发起认证请求
        localplayer.authenticateWithCompletionHandler(null);
        eStart.innerText = "登录中...";
    }
    // 释放使用的对象
	plus.ios.deleteObject(localplayer);
	plus.ios.deleteObject(nc);
}, false );
	</script>
	</head>
	<body>
	</body>
</html>
						

plusSetAttribute

设置Objective-C示例对象的属性


void insobj.plusSetAttribute( String name, Object value );
						

参数:

返回值:

void : 无

示例:


<!DOCTYPE html>
<html>
	<head>
	<meta charset="utf-8"/>
	<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
	<title>iOS Native.js</title>
	<script type="text/javascript">
// 监听plusready事件  
document.addEventListener( "plusready", function(){
	// 扩展API加载完毕,现在可以正常调用扩展API
	// 调用ios的文字转语音
	var AVSpeechSynthesizer = plus.ios.importClass("AVSpeechSynthesizer");
	var sppech = new AVSpeechSynthesizer();
	var AVSpeechUtterance = plus.ios.importClass("AVSpeechUtterance");
	var utterance =  AVSpeechUtterance.speechUtteranceWithString("共产主义接班人");
	// 设置语速
	utterance.plusSetAttribute("rate",30.1);
	sppech.speakUtterance(utterance);
}, false );
	</script>
	</head>
	<body>
	</body>
</html>