精华内容
下载资源
问答
  • unity webview插件,可以使用unity中使用浏览器,支持URL和本地HTML
  • 注意我们正在与Flutter团队紧密合作,以将所有社区插件功能集成到官方WebView插件中。 我们将尽一切努力注意我们正在与Flutter团队紧密合作,以将所有社区插件功能集成到官方WebView插件中。 我们将尽力解决PR和Bug...
  • Flutter WebView插件 允许Flutter与本机WebView进行通信的插件。 警告: Web视图未集成在窗口小部件树中,它是颤动视图之上的本机视图。 您将看不到小吃条,对话框或其他闪烁的窗口小部件,这些窗口小部件会与网络...
  • cordova-plugin-native-webview插件将打开另一个本机Web视图,以在应用程序内很好地显示您的Web资源。 在节省时间的情况下,插件支持共享功能,您可以将网站共享到微信。 特征 分享到微信 不错的导航栏 WebView...
  • Flutter WebView插件研究

    2020-04-23 17:03:13
    Flutter 出来有几个年头了,目前还有不少问题,业内也在慢慢丰富各种插件来完善功能。 这里详细介绍 Flutter 中 WebView 的坑。 首先介绍下目前pub上常用的两个插件: 1, ...

    Flutter 出来有几个年头了,目前还有不少问题,业内也在慢慢丰富各种插件来完善功能。
    这里详细介绍 Flutter 中 WebView 的坑。

    首先介绍下目前 pub 上常用的两个插件:
    1,webview_flutter 是官方维护的 WebView 插件,是基于PlatformView实现的,可以放到任何地方,特别灵活;
    目前版本(0.3.20+2)优点:
    1.1,因为是基于PlatformView实现,所以灵活,可以存在多个WebView;
    1.2,JS 和客户端方法调用;
    1.3,修改 UA;
    缺点:
    1.4,WebView的 Setting 设置不全,可能很多网页加载有问题。
    1.5,不支持添加 cookie ,但是支持清除 cookie;
    (这个可以自己加代码)

    2,flutter_webview_plugin 则是基于原生 WebView 封装的 Flutter 插件,只是在 FlutterView 上面盖了一层 原生WebView控件,所以限制很多的
    目前版本(0.3.11)优点:
    2.1,WebView的 Setting 设置比较全,使用也简单,如果只是单独显示下网页,建议使用它;
    2.2,JS 和客户端方法调用;
    2.3,修改 UA;
    缺点:
    2.4,因为是封装的,只存在一个 WebView,如果涉及到 WebView 不是单独页面的,会有很多问题;
    2.5,不支持添加 cookie ,但是支持清除 cookie;

    从上面总结的来看,2个或多或少都有些问题。所以具体看需求:
    1,如果客户端内用到的网页都是单独的一个页面显示都是 WebView,考虑用 flutter_webview_plugin,简单方便。
    2,如果客户端某个TAB下就有一个WebView,建议复制 webview_flutter的源码,搞个本地依赖,改下代码,把需要支持的都支持下。

    展开全文
  • 虽然React Native有提供一个内置的web view组件,我们这里的例子会使用react-natvie-webview这个插件,因为他功能更加强大。React Native WebView是React Native中一个更加现代化,支持更好的跨平台的WebView。 ...

    在React Native中,WebViews可以让移动APP访问任何web的门户。换句话说,web view使我们可以在app接口打开一个web的URLs。虽然React Native有提供一个内置的web view组件,我们这里的例子会使用react-natvie-webview这个插件,因为他功能更加强大。React Native WebView是React Native中一个更加现代化,支持更好的跨平台的WebView。

    Machine generated alternative text: HOW TO  CREATE A WEBVIEW  IN REACT NATIVE  instamobile.io

    据这篇文档所说,React Native内置的WebView马上就要废弃了。因此,这个插件就用来取代内置的WebView。这个插件是一个由react native社区维护的第三方插件。

    要求:

    运行我们的例子需要先满足以下要求:

    1. Nodejs >= 8.x.x, 可以用npm或者yarn进行安装。
    2. watchman:一个文件观看服务
    3. react-natvie-cli

    从React Native WebView开始

    在设置web view之前,我们需要先安装这个插件。我们这里使用yarn来安装,当然我们也可以使用npm来安装。可以运行下面的命令来进行安装:

    yarn add react-native-webview

    假如react-native的版本是大于0.60的,那么安装的时候就会把插件和native的配置自动连接起来。不过,对于早期的版本,我们需要运行下面的命令:

    react-native link react-native-webview

    IOS

    对于IOS的情况,我们需要运行下面的命令:

    pod instal

    Android

    对于Android,这个模块并不需要再运行别的命令了。不过对于react-native-webview >= 6.x.x的版本,我们需要确保AndroidX是在我们的项目中打开的。这个可以通过修改android/gradle.properties文件,加入下面的内容:

    android.useAndroidX=true
    android.enableJetifier=true

    上面就完成我们的安装,下面我们开始在我们的项目中使用这个插件。

    使用React Natvie WebView来加载内联的HTML

    首先,我们来加载一个简单的HTML内容到我们的APP接口中。我们需要加入下面的import到我们的 _App.js_ 文件中:

    import React, { Component } from 'react';
    import { WebView } from 'react-native-webview';

    这样,我们就把 _react-native-webview_ 插件的WebView import到我们的组件中了。现在,我们可以使用这个插件来加载HTM的内容了:

    import React, { Component } from 'react';
    import { WebView } from 'react-native-webview';
    class MyInlineWeb extends Component {
      render() {
        return (
          <WebView
            originWhitelist={['*']}
            source={{ html: '<h1>This is a static HTML source!</h1>' }}
          />
        );
      }
    }

    这里,我们定义了一个MyInlinWeb的类组件。这个组件的render函数会render WebView组件。这个WebView组件有一个HTML内容被设置在source 属性上。这样,我们可以看到有一个HTML的内容被显示在模拟器的屏幕上。

    Machine generated alternative text: instamobile.io

    加载远端的URL

    现在,不再是简单的HTML内容了,我们来通过remote的URL加载整个网页。我们需要在source属性中设置uri选项,如下代码所示:

    import React, { Component } from 'react';
    import { WebView } from 'react-native-webview';
    class MyWeb extends Component {
      render() {
        return <WebView source={{ uri: 'https://instamobile.io/blog' }} />;
      }
    }

    这样,我们就会在app的屏幕上显示这个网页了:

     

    在React Native Webveiw中显示加载转动

    在WebView中加载URL的时候,他可能需要一定的时间来加载完成这个网页。所以,为了表示这个等待,我们可以显示一个加载标志来表明他网页正在加载。为了做这个,我们需要从react-native包中import ActivityIndicator组件,代码如下:

    import { Text, View, StyleSheet, ActivityIndicator } from 'react-native';

    现在,我们需要在我们的代码中使用这个组件了。我们需要创建一个函数,称之为LoadingIndicatorView来返回ActivityIndicator,代码如下:

    import * as React from 'react';
    import { Text, View, StyleSheet,ActivityIndicator } from 'react-native';
    import { WebView } from 'react-native-webview';
    import { Card } from 'react-native-paper';
     function LoadingIndicatorView() {
        return <ActivityIndicator color='#009b88' size='large' />
      }
    export default function App() {
      return (
       <WebView
            originWhitelist={['*']}
            source={{ uri: 'https://instamobile.io/blog' }}  
            renderLoading={this.LoadingIndicatorView}
            startInLoadingState={true}
          />
      );
    }

    这里,我们使用了ActivitIndicator的color和size的属性。然后我们在WebView组件的RenderLoading属性中调用了这个LoadingIndicatorView。这个可以在我们完成网页加载之前都显示loading的标志。

    我们开始看到,还设置了一个startInLoadingState属性,这个值强制WebView在第一次加载的时候显示加载的标志。要想renderLoading工作,这个值必须设为true。

    我们可以在模拟器上得到下面的图:

    总结

    这个例子中,我们学习了React Native的web view属性。因为React Native内置的web view要废弃了,我们学习了如何使用第三方的插件: react-native-webview。首先,我们尝试了如何render简单的HTML内容,然后,我们详细介绍了如何使用WebView组件和它的属性来render一个URL的整个HTML内容。假如你想了解更多的内容,你可以去这个web view的repo进行讨论。

    更多原创,敬请关注微信公众号,每日更新业界最新资讯:

    欢迎访问个人小站:https://donggeitnote.com/2020/07/10/react-native-webview/

    展开全文
  • 弃用通知 该存储库已被弃用,不再维护。 不应该使用它。 如有任何疑问,请与合作者联系。 fh-cordova-plugin-webview Cordova插件,可使用平台的本机WebView组件在应用程序内显示Web内容。 目前支持iOS和Android。
  • Cordova开发中,插件调用都只能调用本地的html,这个功能就是为了Cordova能调用远程的HTML页面,这样的话,一些逻辑可以放在服务器上,不需要全部打包放在app中,同时远程的html可以调用插件,调用方式同一般的...
  • 允许flutter与本机webview通信的插件
  • 颤振的WebView 您可以在此处找到原始软件包以及如何... 提供WebView小部件的Flutter插件。 修复了无法使用原始包装中的摄像头和麦克风的错误。 在iOS上,WebView小部件由支持; 在Android上,WebView小部件由支持。
  • Displaying webpages inside of your Flutter applications is easy with the use of the WebView plugin. In our example application, we’ll look at how to create a custom Widget that can be used throughout...

    Displaying webpages inside of your Flutter applications is easy with the use of the WebView plugin. In our example application, we’ll look at how to create a custom Widget that can be used throughout our application to launch a WebView from anywhere.

    显示网页的颤振应用中很容易与使用的WebView插件。 在示例应用程序中,我们将研究如何创建可在整个应用程序中使用的自定义Widget ,以便从任何地方启动WebView

    创建一个新的Flutter项目 (Creating a new Flutter Project)

    As always, we’ll start off by setting up a new project and adding the plugin:

    与往常一样,我们将从建立一个新项目并添加插件开始:

    # New Flutter project
    $ flutter create my_webview_project
    
    # Open this up inside of VS Code
    $ cd my_webview_project && code .

    添加WebView插件 (Adding the WebView plugin)

    Next up, we’ll need to add the webview_flutter plugin within our pubspec.yaml:

    接下来,我们需要添加webview_flutter我们中的插件pubspec.yaml

    dependencies:
      flutter:
        sdk: flutter
      webview_flutter: ^0.3.14+1

    We’ll then need to add the appropriate values to our Info.plist, opting into the embedded views preview:

    然后,我们需要将适当的值添加到Info.plist ,以选择嵌入的视图预览:

    <key>io.flutter.embedded_views_preview</key>
    <true/>

    That’s all the required plugin preparation, we can now open our application up in the iOS or Android simulator.

    这就是所有必要的插件准备工作,我们现在可以在iOS或Android模拟器中打开应用程序。

    脚手架我们的项目 (Scaffolding our Project)

    We can now update main.dart to contain our HomePage widget that we’ll create in a second:

    现在,我们可以更新main.dart包含我们的HomePage小工具,我们将在第二个创建:

    import 'package:flutter/material.dart';
    import 'package:my_webview_project/home_page.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
            title: 'Flutter WebView',
            theme: ThemeData(
              primarySwatch: Colors.blue,
            ),
            home: HomePage());
      }
    }

    The HomePage widget will simply consist of a FlatButton with an onPressed event:

    HomePage部件将仅包括一个的FlatButtononPressed事件:

    import 'package:flutter/material.dart';
    
    class HomePage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text("Home Page"),
          ),
          body: Center(
            child: FlatButton(
              child: Text("Open Webpage"),
              onPressed: () {},
            ),
          ),
        );
      }
    }

    使用WebView插件 (Using the WebView Plugin)

    Let’s create a StatelessWidget named MyWebView which we can use to navigate a user to this page whenever we want to display WebView data:

    让我们创建一个StatelessWidget名为MyWebView我们可以用它来用户导航到该页面时,我们要显示WebView数据:

    import 'dart:async';
    import 'package:flutter/material.dart';
    
    import 'package:webview_flutter/webview_flutter.dart';
    
    class MyWebView extends StatelessWidget {
      final String title;
      final String selectedUrl;
    
      final Completer<WebViewController> _controller =
          Completer<WebViewController>();
    
      MyWebView({
        @required this.title,
        @required this.selectedUrl,
      });
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(
              title: Text(title),
            ),
            body: WebView(
              initialUrl: selectedUrl,
              javascriptMode: JavascriptMode.unrestricted,
              onWebViewCreated: (WebViewController webViewController) {
                _controller.complete(webViewController);
              },
            ));
      }
    }

    If we wanted to navigate the user to https://alligator.io, we could therefore use Navigator.push with the selectedUrl equal to https://alligator.io. Let’s update our FlatButton within the HomePage:

    如果我们想将用户导航到https://alligator.io ,则可以使用Navigator.push ,并且selectedUrl等于https://alligator.io 。 让我们在HomePage更新FlatButton

    child: FlatButton(
      child: Text("Open Webpage"),
      onPressed: () {
        Navigator.of(context).push(MaterialPageRoute(
            builder: (BuildContext context) => MyWebView(
                  title: "Alligator.io",
                  selectedUrl: "https://alligator.io",
                )));
      },
    ),

    And there we have it! Here’s our WebView showing the Alligator homepage:

    我们终于得到它了! 这是我们的WebView显示了鳄鱼主页:

    翻译自: https://www.digitalocean.com/community/tutorials/flutter-webview

    展开全文
  • 最近在给Unity3D接入各个Android运营平台的插件,其中有一个webview 功能用于显示玩家客服系统,上面还要上传图片 发现2个问题 1、按照正常的工程来做,发现findViewById返回了一个null 导致了空指针异常。无论...

    最近在给Unity3D接入各个Android运营平台的插件,其中有一个webview 功能用于显示玩家客服系统,上面还要上传图片
    发现2个问题

    1、按照正常的工程来做,发现findViewById返回了一个null 导致了空指针异常。无论是直接用Unity编译apk还是用Unity导出Android工程,都会出现该问题。经过各种查找,最终找到了问题的原因。

    问题的原因主要在于,在我们将自己的android工程打成jar插件时,原来的R.id.xxxxx已经被转换成相应的数字id编译进了jar包,而Unity3D在导出工程或是apk的时候,会对所有资源进行重新的id编译,这就导致我们jar中的旧id是无法获取到相应对象。解决办法如下:

    //this.wv=(WebView)findViewById(R.id.ifree_brow_webview);  
    int webviewID = getResources().getIdentifier("ifree_brow_webview", "id", getPackageName());  
    this.wv = (WebView)findViewById(webviewID);  

    之后将Eclipse工程中src目录导出成jar包,千万不要导出R类

    导出方法工程右键->Export->Java->JAR file 只选择src文件夹

    2、webview内嵌h5页面中,默认安卓webview不支持上传图片要扩展下webview

    代码要Android5.0以上

    package com.pwrd.onesdk.demo;
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.content.ClipData;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.Gravity;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.webkit.JsResult;
    import android.webkit.ValueCallback;
    import android.webkit.WebChromeClient;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.Button;
    import android.widget.LinearLayout;
    import android.widget.RelativeLayout;
    
    @SuppressLint("SetJavaScriptEnabled")
    public class WebViewActivity extends Activity {
    
        private WebView webView;
        private Button close;
        private ValueCallback<Uri> mUploadMessage;
        private ValueCallback<Uri[]> mUploadMessages;
        private static int FILECHOOSER_RESULTCODE = 1001;
        private RelativeLayout mLayout;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            this.setTheme(android.R.style.Theme_NoTitleBar_Fullscreen);
    
            mLayout = new RelativeLayout(this);
    
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT);
            webView = new WebView(getApplicationContext());
            webView.setLayoutParams(params);
            webView.getSettings().setJavaScriptEnabled(true);
            webView.getSettings().setAppCacheEnabled(true);
            webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
            webView.getSettings().setDomStorageEnabled(true);
            webView.getSettings().setAllowFileAccess(true);
            webView.getSettings().setAllowFileAccess(true);
    
            webView.getSettings().setDatabaseEnabled(true);
    
            Intent intent = getIntent();
            String url = intent.getStringExtra("urlstr");
            webView.loadUrl(url);
    
            webView.setWebViewClient(new WebViewClient() {  
                @Override  
                public boolean shouldOverrideUrlLoading(WebView view, String url) {   
                    view.loadUrl(url);  
                    return true;  
                }  
            });
    
            webView.setWebChromeClient(new WebChromeClient() {
                @Override
                public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                    return super.onJsAlert(view, url, message, result);
                }
    
                @Override
                public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
                    return super.onJsConfirm(view, url, message, result);
                }
    
                // For Android 5.0+ 重点重点
                public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
                    if (mUploadMessage != null)
                        return;
                    mUploadMessage = uploadMsg;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType("*/*");
                    startActivityForResult(Intent.createChooser(i, "File Chooser"), WebViewActivity.FILECHOOSER_RESULTCODE);
                }
    
                // For Android < 3.0
                public void openFileChooser(ValueCallback<Uri> uploadMsg) {
                    openFileChooser(uploadMsg, "");
                }
    
                // For Android > 4.1.1
                public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
                    openFileChooser(uploadMsg, acceptType);
                }
    
                @Override
                public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback,
                        FileChooserParams fileChooserParams) {
                    if (mUploadMessages != null)
                        return false;
                    mUploadMessages = filePathCallback;
                    Intent i = new Intent(Intent.ACTION_GET_CONTENT);
                    i.addCategory(Intent.CATEGORY_OPENABLE);
                    i.setType("*/*");
                    startActivityForResult(Intent.createChooser(i, "文件选择"), WebViewActivity.FILECHOOSER_RESULTCODE);
                    return true;
                }
            });
    
            mLayout.addView(webView);
    
            Button btn = new Button(this);
            btn.setText("close");
            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
            btn.setLayoutParams(layoutParams);
            btn.setGravity(Gravity.BOTTOM);
            btn.setOnClickListener(new OnClickListener() {
    
                @Override
                public void onClick(View v) {
                    WebViewActivity.this.finish();
    
                }
            });
            mLayout.addView(btn);
    
            setContentView(mLayout);
    
            super.onCreate(savedInstanceState);
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
            if (requestCode == FILECHOOSER_RESULTCODE) {
                if (null != mUploadMessage) {
                    Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
                    mUploadMessage.onReceiveValue(result);
                    mUploadMessage = null;
                }
                if (null != mUploadMessages) {
                    Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();
                    onActivityResultAboveL(requestCode, resultCode, intent);
                }
            }
        }
    
        @SuppressLint("NewApi")
        private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {
            if (requestCode != FILECHOOSER_RESULTCODE || mUploadMessages == null)
                return;
            Uri[] results = null;
            if (resultCode == Activity.RESULT_OK) {
                if (intent != null) {
                    String dataString = intent.getDataString();
                    ClipData clipData = intent.getClipData();
                    if (clipData != null) {
                        results = new Uri[clipData.getItemCount()];
                        for (int i = 0; i < clipData.getItemCount(); i++) {
                            ClipData.Item item = clipData.getItemAt(i);
                            results[i] = item.getUri();
                        }
                    }
                    if (dataString != null)
                        results = new Uri[] { Uri.parse(dataString) };
                }
            }
            mUploadMessages.onReceiveValue(results);
            mUploadMessages = null;
        }
    }
    
    展开全文
  • Android编程:WebView插件实现浏览网页

    千次阅读 2018-03-12 22:59:16
    原创:转载请注明出处:http://blog.csdn.net/qq_36408196/article/details/79533627简书文章地址:https://www.jianshu.com/p/bbe436515af8activity_webview.xml:&lt;?xml version="1.0" encoding=&...
  • 如果是安卓系统9.0,对https没有问题,对http访问有限制,会访问不了,出现加载错误页面,需要对Android 工程下app的清单文件AndroidManifest.xml做处理,在application标签内添加android:networkSecurityConfig="@...
  • 2、插件资源(审核中) 3、导入方式(按下图方式导入即可) 4、添加AndroidManifest.xml (1)导入成功后,会在Assets目录下,看到Plugins/Android的目录,里面如无AndoirdManifest.xml,则执行(2) (2)在...
  • WebView webView = new WebView(); final WebEngine webEngine = webView.getEngine(); // 设置Java的监听器 webEngine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> { if ...
  • 资源名称: Embedded Browser 资源版本: 3.0.0 资源类型: .unitypackage 资源大小: 430.5M 更新时间: 2019-08-28
  • 原因:gradle版本跟crosswalk产生冲突,需要降低gradle版本,或者安装兼容插件 解决办法: cordova plugin add cordova-android-support-gradle-release --variable ANDROID_SUPPORT_VERSION=27.0.0 然后再编译...
  • WebView webView = new WebView(); final WebEngine webEngine = webView.getEngine(); // 设置Java的监听器 webEngine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> { if ...
  • GitHub项目地址,欢迎star: https://github.com/aiyangtianci/flutter_app 目录 介绍 插件地址 使用方式 异常 介绍 官网定义:Plugin that allows Flutter to communi...
  • exocad webview-crx插件

    2021-04-03 01:30:13
    (注意:必须为扩展名手动启用“允许访问文件URL”选项)exocad Webview的优点一目了然:-简单直观的用户界面-兼容所有打开的3D数据类型(.stl,.obj) ,.ply,.wrl,.off,.eoff,.xyz,.xyzn,.xyznb,.xyzc,....
  • vscode插件webview相互通信

    千次阅读 2019-04-05 10:14:27
    title: vscode插件webview相互通信 date: 2019-04-03 13:37:37 tags: “vscode” 1.webview发送消息给插件 插件js和ts都可以(webview需要引入vscode,可以通过) 然后test-webview.js里面加入const testMode = ...
  • Android WebViews 在大型原生Android工程中嵌入一个含有cordova的WebView(制作混合应用,原生页面+H5页面)
  • 不过,在Flutter应用开发中,由于官方并没有提供类似Webview的网页加载组件,所以如果项目中涉及网页加载需要使用第三方插件库,如webview_flutter、flutter_webview_plugin等。 其中,webview_flutter是Flutter官方...
  • Android与WebView插件管理机制

    千次阅读 2014-08-05 13:10:10
    大家知道,当利用Android原生环境的功能,比如照像机,比如相册等,这些功能都是很分散的,说不清楚什么时候是需要这些功能,什么时候是不需要这些功能的,所以我们希望能够像插件一样,需要的时候就加载进来,不...
  • Sketch开放了第三方插件接口,设计师可以在几百种的插件中轻松找到适合自己工作方式的插件,并且他们都非常容易获得和安装。这里主要介绍使用Javascript API for Sketch开发Sketch插件。 Sketch成为梦想中的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,539
精华内容 6,215
关键字:

webview插件