ios

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

方法:

对象:

权限:

5+功能模块(permissions)

  1. {
  2. // ...
  3. "permissions":{
  4. // ...
  5. "Invocation": {
  6. "description": "Native.js"
  7. }
  8. }
  9. }

importClass

导入Objective-C类对象

  1. ClassObject plus.ios.importClass( String classname );

说明:

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

参数:

  • classname: (String|InstanceObject)必选 要导入的Objective-C类名如果指定的类名不存在,则导入类失败,不会抛出异常。

返回值:

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

示例:

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

uni-app使用plus注意事项

newObject

创建实例对象

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

参数:

  • classname: (String)必选 要创建实例对象的类名如果指定的类名不存在,则创建对象失败,不会抛出异常。
  • args: (Object)可选 创建实例对象的构造参数如果指定的构造参数类型不区配,则创建对象失败,不会抛出异常。

返回值:

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

示例:

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

uni-app使用plus注意事项

deleteObject

销毁实例对象

  1. void plus.ios.deleteObject( Object obj );

参数:

  • obj: (Object)必选 要销毁的实例对象如果obj对象不是有效的实例对象,则不执行销毁对象操作,不会抛出异常。如果不执行销毁实例对象操作,在页面关闭时会自动执行销毁对象的操作。

返回值:

void: 无

示例:

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

uni-app使用plus注意事项

invoke

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

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

参数:

  • obj: (InstanceObject|ClassObject|String)必选 调用方法所属的对象,也可以是类的名称如果obj为实例对象(InstanceObject)类型,则调用的是实例对象的方法;如果obj为类对象(ClassObject)类型,则调用的是类的静态方法;如果obj为字符串(String)类型,其值必须是类的名称,则调用的是类的静态方法;
  • name: (String)必选 要调用的方法名称方法名称中使用":"分隔参数。如果指定的方法名称不存在,则调用方法失败,不会抛出异常。
  • args: (Object)可选 调用方法的参数如果指定的参数数目或类型不区配,则调用方法失败,不会抛出异常。

返回值:

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

示例:

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

uni-app使用plus注意事项

implements

实现代理的方法

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

参数:

  • name: (String)必选 代理的名称,也可以是自定的字符串名称如果name为自定的字符串名称,则自定义一个代理;
  • obj: _(Object)必选 _JSON对象类型,代理实现方法的定义JSON对象中key值为代理方法的名称,使用":"分割参数;value值为Function,方法参数必须与代理方法中的":"区配。

返回值:

InstanceObject: 代理实例对象。

示例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8"/>
  5. <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
  6. <title>iOS Native.js</title>
  7. <script type="text/javascript">
  8. // 监听plusready事件
  9. document.addEventListener( "plusready", function(){
  10. // 扩展API加载完毕,现在可以正常调用扩展API
  11. // 登录到游戏中心
  12. // 监听用户登录状态变更事件
  13. var nc = NSNotificationCenter.defaultCenter();
  14. if(delegate){
  15. nc.removeObservernameobject(delegate,"GKPlayerAuthenticationDidChangeNotificationName",null);
  16. }
  17. delegate = plus.ios.implements("NSObject",{"authenticationChanged:":authenticationChanged});
  18. nc.addObserverselectornameobject(delegate,
  19. plus.ios.newObject("@selector","authenticationChanged:"),
  20. "GKPlayerAuthenticationDidChangeNotificationName",
  21. null);
  22. // 获取游戏玩家共享实例对象
  23. var localplayer = GKLocalPlayer.localPlayer();
  24. // 判断游戏玩家是否已经登录认证
  25. if ( localplayer.plusGetAttribute("isAuthenticated") ) {
  26. // 玩家已登录认证,获取玩家信息
  27. playerInformation( localplayer );
  28. bLogin = true;
  29. } else {
  30. // 玩家未登录认证,发起认证请求
  31. localplayer.authenticateWithCompletionHandler(null);
  32. eStart.innerText = "登录中...";
  33. }
  34. // 释放使用的对象
  35. plus.ios.deleteObject(localplayer);
  36. plus.ios.deleteObject(nc);
  37. }, false );
  38. </script>
  39. </head>
  40. <body>
  41. </body>
  42. </html>

uni-app使用plus注意事项

currentWebview

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

  1. InstanceObject plus.ios.currentWebview();

说明:

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

参数:

返回值:

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

示例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8"/>
  5. <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
  6. <title>iOS Native.js</title>
  7. <script type="text/javascript">
  8. var nwv=null;
  9. // 监听plusready事件
  10. document.addEventListener( "plusready", function(){
  11. // 扩展API加载完毕,现在可以正常调用扩展API
  12. // 获取当前Webview窗口的UIWebview实例对象
  13. nwv = plus.ios.currentWebview();
  14. // ...
  15. }, false );
  16. // 使用Native.js调用Webview的loadUrl方法跳转页面
  17. function loadUrl(){
  18. // 导入UIWebview、NSURLRequest、NSURL类
  19. var Webview = plus.ios.importClass("UIWebview");
  20. var NSURLRequest = plus.ios.import('NSURLRequest');
  21. var NSURL = plus.ios.import('NSURL');
  22. // 获取当前Webview对象的实例
  23. var wv = plus.ios.currentWebview();
  24. // 创建请求对象
  25. var req = NSURLRequest.requestWithURL(NSURL.URLWithString('http://www.dcloud.io/'));
  26. // 跳转页面
  27. plus.ios.invoke(wv,"loadRequest:",req);
  28. // 释放对象(可选)
  29. plus.ios.deleteObject(req);
  30. plus.ios.deleteObject(wv);
  31. }
  32. </script>
  33. </head>
  34. <body>
  35. 获取当前Webview窗口对象的native层UIWebview实例对象<br/>
  36. <button onclick="loadUrl()">Native.js跳转页面</button>
  37. </body>
  38. </html>

uni-app使用plus注意事项

ClassObject

Objective-C类对象

  1. interface ClassObject {
  2. // ...
  3. }

说明:

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

示例:

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

uni-app使用plus注意事项

InstanceObject

Objective-C实例对象

  1. interface InstanceObject {
  2. // ...
  3. function Object plusGetAttribute( String name );
  4. function Object plusSetAttribute( String name, Object value );
  5. // ...
  6. }

说明:

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

方法:

plusGetAttribute

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


Object insobj.plusGetAttribute( String name );
                        

参数:

  • name: (String)必选 实例属性的名称如果指定的属性名称不存在,则返回null。

返回值:

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>
                        

uni-app使用plus注意事项

plusSetAttribute

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


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

参数:

  • name: (String)必选 要设置的属性名称如果指定的属性名称不存在,则操作不生效,不会抛出异常。
  • value: (Object)必选 要设置的属性值如果指定的属性值类型不区配,则操作不生效,不会抛出异常。

返回值:

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>
                        

uni-app使用plus注意事项