Bootstrap系列 -- 13. 内联表单 - 贺臣 - 博客园

mikel阅读(998)

来源: Bootstrap系列 — 13. 内联表单 – 贺臣 – 博客园

有时候我们需要将表单的控件都在一行内显示。在Bootstrap框架中实现这样的表单效果是轻而易举的,你只需要在<form>元素中添加类名“form-inline”即可

 

如果你要在input前面添加一个label标签时,会导致input换行显示。如果你必须添加这样的一个label标签,并且不想让input换行,你需要将label标签也放在容器“form-group”中

复制代码
<form class="form-inline" role="form">
        <div class="form-group">
            <label class="sr-only" for="exampleInputEmail2">邮箱</label>
            <input type="email" class="form-control" id="exampleInputEmail2" placeholder="请输入你的邮箱地址"/>
        </div>
        <div class="form-group">
            <label class="sr-only" for="exampleInputPassword2">密码</label>
            <input type="password" class="form-control" id="exampleInputPassword2" placeholder="请输入你的邮箱密码"/>
        </div>
        <div class="checkbox">
            <label>
                <input type="checkbox"/>
                记住密码
   
            </label>
        </div>
        <button type="submit" class="btn btn-default">进入邮箱</button>
</form>
复制代码

 

在label标签运用了一个类名“sr-only”,可以将label标签影藏起来

Bootstrap系列 -- 12. 水平表单 - 贺臣 - 博客园

mikel阅读(799)

来源: Bootstrap系列 — 12. 水平表单 – 贺臣 – 博客园

Bootstrap框架默认的表单是垂直显示风格,但很多时候我们需要的水平表单风格(标签居左,表单控件居右)

 

在Bootstrap框架中要实现水平表单效果,必须满足以下两个条件:
  1、在<form>元素是使用类名“form-horizontal”。
2、配合Bootstrap框架的网格系统。

 

在<form>元素上使用类名“form-horizontal”主要有以下几个作用:
  1、设置表单控件padding和margin值。
2、改变“form-group”的表现形式,类似于网格系统的“row”。

 

复制代码
<form class="form-horizontal" role="form">
        <div class="form-group">
            <label for="inputEmail3" class="col-sm-2 control-label">邮箱</label>
            <div class="col-sm-10">
                <input type="email" class="form-control" id="inputEmail3" placeholder="请输入您的邮箱地址"/>
            </div>
        </div>
        <div class="form-group">
            <label for="inputPassword3" class="col-sm-2 control-label">密码</label>
            <div class="col-sm-10">
                <input type="password" class="form-control" id="inputPassword3" placeholder="请输入您的邮箱密码"/>
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <div class="checkbox">
                    <label>
                        <input type="checkbox"/>
                        记住密码
       
                    </label>
                </div>
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <button type="submit" class="btn btn-default">进入邮箱</button>
            </div>
        </div>
</form>
复制代码

 

iOS 审核被拒 - 2 - 雨季的雾 - 博客园

mikel阅读(1112)

来源: iOS 审核被拒 – 2 – 雨季的雾 – 博客园

很快首次试飞,就迎来了第一次的惨败,虽然我已有了一些心理准备,但还是有不小打击的,奉上我的被拒理由:

被拒的描述1:
From Apple
2. 1 PERFORMANCE: APP COMPLETENESS
2. 3 PERFORMANCE: ACCURATE METADATA
Performance - 2.1 
We were unable to review your app as it crashed on launch. We have attached detailed crash logs to help troubleshoot this issue.
Next Steps
Please revise your app and test it on a device while connected to an IPv6 network (all apps must support IPv6) to ensure it will launch without crashing.
Resources
For additional information about supporting IPv6 Networks, please refer to Supporting `IPv6 DNS64/NAT64 Networks `and `Supporting IPv6-only Networks`.
For a networking overview, please see About Networking.
For information on how to symbolicate and read a crash log, please see Tech Note TN2151 Understanding and Analyzing iPhone OS Application Crash Reports.
If you have difficulty reproducing this issue, please try testing the workflow described in Testing Workflow with Xcode's Archive feature.
`

大致扫一遍就可以看出来被拒的理由:IPv6的问题;当时我就懵了,这该怎么修改啊,让我如何是好,这个本来就是一个简单的不能再简单的APP了,虽然提交之后我有发现了APP的一些Bug,但是还真没想到网络的问题,之后我就在网上看了各种‘因为IPv6被拒的解决方案’,也加了好多的有关IPv6的群,却发现千篇一律,大部分是要租国外的服务器,期间我看见群里有人说,可能当时审核的时候网络不好,再提交一次就可能过;于是乎我就抱着侥幸的心理,把我之前发现的Bug给修改了,但是网络的部分基本没动,之后又是漫长的等待。

出乎我的意料复审的速度也很快,一天多时间我的APP又回来了,被拒理由居然又是‘IPv6’的问题,

Please run your app on a device to identify the issue(s), then revise and resubmit your app for review. 

Apps are reviewed on an IPv6 network. Please ensure that your app supports IPv6 networks, as IPv6 compatibility is required.

For additional information about supporting IPv6 Networks, please refer to Supporting iPv6 DNS64/NAT64 Networks.

For a networking overview, see About Networking.

If we misunderstood the intended behavior of your app, please reply to this message in the Resolution Center to provide information on how these features were intended to work.

For new apps, uninstall all previous versions of your app from a device, then install and follow the steps to reproduce the issue(s). For updates, install the new version as an update to the previous version, then follow the steps to reproduce the issue(s).

这是真的是要疯的节奏,我开始认真的查看我的
APP,近乎我的每一个页面都需要请求数据,我对比了审核发来的截图,先找到对应的页面,找了好久,又询问了其他的高手,说是可能是第三方框架的问题;我开始查看跟网络有关三方框架,发现用的两个:SDWebImageAFNetworking,但是看到截图上什么数据都没有我排除了第一个,那么问题就应该是剩下的那个,再看官方有关IPv6的说明,建议使用的API如下图:

Networking frameworks and API layers.png

难道我要把网络请求的部分都改了,我不死心继续看我的网络部分,突然,我发现没有数据的那几个的网络请求我都进行了封装,我在想是不是封装的问题,想着我就开始行动,把封装的部分又进行拆封,同时把三方库进行更新,运行看看显示成功,我就又一次的上传了。

再审期间,我一直在想一定要过呀,但是谁知结果往往总是出人意料;我真的崩溃了,被拒的理由竟然还和上一个一模一样,截图也都差不多,我都在想审核是不是在逗我,没办法谁让人家说的算呢,硬着头皮,继续我的修改之路,喜欢找偏门的我看出一点我自认为的猫腻,偶然看到截图上的图标都是ipd,我在想是不是只在ipd的上面不能显示,明明我自己测试的都可以啊,我就决定先把这些支持ipd的都去掉,同时我在想这样不是万全之策啊。

自己看着截图一直发呆,在想你们为什么请求不到数据呢,既然你们请求不到数据,那我就给你们数据请求好,这时我想到了plist文件,虽然它只能简单的数据处理,但我想也应该够我用了,
Plist文件写入数组(包含读取,插入和删除)参考链接
http://www.jianshu.com/p/df7fd7d48edf
这下应该没问题了吧,数据也都请求完了,数据应该能显示了吧,
我是这样想的,做完这些我松了一口气打完包继续上传,又开始了我的忐忑之路。

三次悲剧(被拒)完,待续。。。


苹果APP审核被拒绝-关于“元数据被拒绝”相关问题

上周五上线一个新版本项目,这周一发现审核居然没通过!反馈的问题是“元数据被拒绝”,这个问题真是第一次碰到所以在这儿总结分享,做个笔记同时也希望可以帮助被这个问题困扰的开发者们。

  • 元数据被拒绝,请看一下你哪一个条件没有符合

元数据(名称、描述、评级、排名等)

  1. 应用或者元数据中提到其他任何移动平台都将会被拒绝。
  2. 带有占位符文本的应用将会被拒绝
  3. 应用程序的名称、描述、截图或者预览与应用的内容和功能不相关将会被拒绝。
  4. 为了不让用户产生困惑,iTunes Connect中的应用名称应该和展示在设备上的应用名称一致。
  5. 应用的大图标和小图标要一致,以免造成混淆。
  6. 图标、截图以及预览以及当Apple TV应用被展示在Apple TV主界面顶部的时候不符合4+年龄评级的应用将会被拒绝。
  7. 分类与内容选择不适合应用内容的程序将会被拒绝。
  8. 开发者有责任为其程序指定适合的评级。不恰当的评级可能会由苹果公司进行修改或者删除。
  9. 开发者有责任为其应用指定恰当的关键字。不恰当的关键词可能会被苹果公司修改或删除。
  10. 试图操控或者欺骗用户评价,或使用虚假/付费购买评价的方式在App Store排行榜作弊,或者采用其他不正当方式)以提升排名的开发者将会被苹果从iOS开发者项目中除名。
  11. 在安装或打开之前,推荐用户重启iOS设备的应用将会被拒绝。
  12. 提交审核的所有应用都应包含能正常运行的URL,比如支持服务URL和私有政策URL。
  13. 应用程序的截图、预览或者营销文本没有清晰地指出附加内容或项目需要额外单独购买(比如使用IAP)将会被拒绝。
  14. App预览只能是使用应用本身捕捉的视频、旁白、文本以及设计轮廓,否则应用将会被拒绝。
  15. 在未经允许的情况下展示真实个人信息的应用将会被拒绝。
  16. 应用预览只能使用在所有选定地区内经过授权许可的音乐。
  17. 包含未经授权而把应用播放或者直播内容(比如音乐、视频和相关封面艺术)用作预览或者截屏的应用将会被拒绝。

注意:元素数据被拒绝不需要你修改二进制数据(就是不需要你修改项目),只需要修改你APP的描述信息就OK。

我遇到的“元数据被拒绝”问题

  • 如果APP中有游客与用户的限制的时候,要给一个明确的测试账户而不能让苹果的审核人员自己注册使用,否则就会出现元数据被拒绝。
  • 应用或者元数据中提到其他任何移动平台都将会被拒绝,我上次在需要上传5张浏览图里,有一张图片图片的状态栏是安卓系统的,UI给我图后我没看就上传到浏览图了,然后出现元素数据被拒绝,没有审核成功。

浏览图的状态栏错误.png

审核反馈的问题描述

2017年5月13日 上午4:34
发件人 Apple

    2. 1 Performance: App Completeness
    2. 3 Performance: Accurate Metadata

Guideline 2.1 - Information Needed

We were unable to sign in to review your app with the demo account information you provided. In order for us to review your app, please provide us with a functional demo account so that we may fully assess your app's features

Next Steps

To help us proceed with the review of your app, please provide a user name and password in the App Review Information section for your app in iTunes Connect. Please be sure to include content in your app that demonstrates the features and functionality available in your app.

To provide demo account information:

- Log in to iTunes Connect
- Click "My Apps"
- Select your app
- Click on the app version on the left side of the screen
- Scroll down to "App Review Information"
- Select the "Sign-in required" box
- Enter demo credentials in the "User name" and "Password" fields
- Once you've completed all changes, click the "Save" button at the top of the Version Information page.

If your iTunes Connect status shows as Metadata Rejected, we do not require a new binary to correct this issue. Please reply to this message in Resolution Center to confirm the availability of a valid demo account, and we will continue with the review.

Guideline 2.3.10 - Performance

We noticed that your app or its metadata includes irrelevant third-party platform information. Specifically, non-iOS status bar is mentioned in the screenshots.

Referencing third-party platforms in your app or its metadata is not permitted on the App Store unless there is specific interactive functionality.

Please see attached screenshots for details.

Next Steps

To resolve this issue, please remove all instances of this information from your app and its metadata, including the app description, What's New info, previews, and screenshots.

Since your iTunes Connect status is Metadata Rejected, we do NOT require a new binary. To revise the metadata, visit iTunes Connect to select your app and revise the desired metadata values. Once you’ve completed all changes, reply to this message in Resolution Center and we will continue the review.

NOTE: Please be sure to make any metadata changes to all app localizations by selecting each specific localization and making appropriate changes.

翻译

发件人 Apple
    •    2. 1 性能:应用程序完整性
    •    2. 3 性能:准确的元数据

指南2.1 -所需的信息

我们无法登录来检查你的应用与你提供的演示帐号信息。为了回顾你的应用程序,请为我们提供一个功能演示账户以便我们能充分评估你的应用程序的功能

下一个步骤

帮助我们进行应用程序的审查,请提供一个用户名和密码的应用审核信息部分在iTunes应用程序连接。请确保内容包含在您的应用程序,展示了应用程序中可用的特性和功能。

提供演示账户信息:

——登陆iTunes Connect
——点击“我的应用”
——选择你的应用
——点击屏幕左侧的应用程序版本向下滚动到“应用程序审查信息”
——选择“登录”框
——输入演示的凭证在“用户名”和“密码”字段
——一旦你完成了所有更改,点击“保存”按钮顶部的版本信息页面。

如果您的iTunes连接状态显示为元数据拒绝,我们不需要一个新的二进制来纠正这个问题。请回复此消息解决中心确认有效的演示账户的可用性,我们将继续审查。

指引2.3.10——性能

我们注意到你的应用程序或其元数据包括无关的第三方平台信息。具体来说,项目状态栏中提到的截图。引用第三方平台应用程序或其元数据在应用程序商店是不允许的,除非有特定的互动功能。详情请见附件截图。

下一个步骤

为了解决这个问题,请把这些信息从你的应用程序的所有实例及其元数据,包括应用描述,有什么新信息,预览、截图。因为您的iTunes连接状态是元数据拒绝,我们不需要一个新的二进制文件。修改元数据,访问iTunes连接选择您的应用程序和修改所需的元数据值。一旦你完成了所有更改,在解决中心回复这个信息,我们将继续审查。

注意:请确保任何元数据更改所有应用程序本地化通过选择每个特定的本地化和做适当的改变。

关于审核被拒绝的更多参考链接
iOS 最新AppStore审核指南与10大被拒理由详解
iOS AppStore 上架应用被拒绝原因

 

原文如下:原因是我们上传的App屏幕快照并没有在App内使用,方案就是把这个设置成启动的欢迎界面或者替换成真正的应用截图即可

Performance – 2.3.3

We noticed that your screenshot(s) do not sufficiently reflect your app in use.

We’ve attached the screenshot(s) for your reference.

Next Steps

Please revise your screenshots to ensure that they accurately reflect the app in use.

Please ensure you have made any screenshot modifications using Media Manager. You should confirm your app looks and behaves identically in all languages and on all supported devices. Use Media Manager to add custom screenshots for each display size and localization.

Since your iTunes Connect Application State is Rejected, a new binary will be required. Make the desired metadata changes when you upload the new binary.

NOTE: Please be sure to make any metadata changes to all App Localizations by selecting each specific localization and making appropriate changes.

If you have difficulty reproducing a reported issue, please try testing the workflow described in Technical Q&A QA1764: How to reproduce bugs reported against App Store submissions.

If you have code-level questions after utilizing the above resources, you may wish to consult with Apple Developer Technical Support. When the DTS engineer follows up with you, please be ready to provide:
– complete details of your rejection issue(s)
– screenshots
– steps to reproduce the issue(s)
– symbolicated crash logs – if your issue results in a crash log

 

 

  1. 3 PERFORMANCE: ACCURATE METADATA

Performance – 2.3.7

Your app name to be displayed on the App Store includes keywords or descriptors, which are not appropriate for use in an app name.
(翻译:app名称中含有关键词或描述,而关键词和描述出现在APP名称中是不妥当的……)

修改后重新上架,通过。

Guideline 2.3.8 – Performance – Accurate Metadata

2017年8月16日 下午10:24
发件人 Apple
2. 3 Performance: Accurate Metadata
Guideline 2.3.8 – Performance – Accurate Metadata

We noticed the app icon displayed on the device and the large icon displayed on the App Store do not sufficiently match, which makes it difficult for users to find the app they just downloaded.

Please see attached screenshots for details.

Next Steps

To resolve this issue, please update the smaller device icon to match the larger App Store icon. When users search for your app on their devices, they should be able to recognize it from the icon on the App Store.

Resources

Since the large app icon will be displayed for your app on the desktop App Store, we recommend you provide an attractive, original icon that meets the following requirements for both iPhone/iPod touch and iPad apps:

– 512px square (do not scale-up smaller artwork, as this could appear pixelated and blurry)
– 72ppi, RGB, flattened, no transparency
– High quality JPEG,TIFF, or PNG image file format. (ZIP-compressed TIFF files are not acceptable)

You can also preview image files before submitting them by clicking the filename to view them in a separate window. Note that the small icon that you include inside your app’s binary will be used on the iPhone, iPod touch, or iPad Home screen when installed. For more on icon sizes, please review App Icons on iPad and iPhone.

For resources on creating eye-catching icons, you may want to review the App Store Product Page information available on the Apple developer portal.

2017年8月16日下午24
发件人苹果
2。3性能:准确的元数据
准则2.3.8——性能——准确的元数据

我们注意到在设备上显示的应用图标和在app Store上显示的大图标不够匹配,这使得用户很难找到他们刚刚下载的应用程序。

详情请见附件的截图。

下一个步骤

为了解决这个问题,请更新较小的设备图标,以匹配更大的应用商店图标。当用户在他们的设备上搜索你的应用时,他们应该能够从app Store的图标中识别出来。

资源

由于这个大的应用程序图标将会在桌面应用程序商店中显示出来,我们推荐你提供一个有吸引力的、原始的图标,它可以满足iphone/ipod touch和iPad应用的以下要求:

-512px的正方形(不要放大较小的艺术品,因为这可能会出现像素化和模糊)
-72ppi,RGB,扁平化,没有透明度
高质量的JPEG、TIFF或PNG图像文件格式。(压缩压缩的TIFF文件是不可接受的)

您还可以在提交文件之前预览图像文件,然后单击文件名在一个单独的窗口中查看它们。请注意,在你的应用程序二进制文件中包含的小图标将被安装在iPhone、iPod touch或iPad的主屏幕上。有关图标尺寸的更多信息,请查看iPad和iPhone上的应用图标。

对于创建吸引眼球的图标的资源,您可能需要查看苹果开发者门户网站上的应用商店产品页面信息。

这些附件可能会显示可能令人反感的内容,如裸露,色情和亵渎内容。
icon1024.jpg

360影视视频的地址解析下载 - 简书

mikel阅读(2088)

来源: 360影视视频的地址解析下载 – 简书

以360影视播放页地址http://v.360kan.com/sv/cIPmaWPqUBT5TC.html 为例,说说如何得到视频的真实地址。

同样,我们使用浏览器的开发者工具观察页面视频加载过程中出现了哪些值得关注的网络请求,然后分析这些请求之间的关联关系。

第一步,请求接口 http://v.360kan.com/Shortvideo/ajaxApi?id=cIPmaWPqUBT5TC&_=1478005639801 返回如下JSON数据:

{
  "errno": 0,
  "error": "ok",
  "result": {
    "discuss": {
      "unikey": "cIPmaWPqUBT5TC"
    },
    "share": {
      "title": "歼20亮相珠海航展",
      "url": "http://v.360kan.com/sv/cIPmaWPqUBT5TC.html",
      "desc": "歼20亮相珠海航展",
      "pic": "http://p4.qhimg.com/t01d2a7df91a54e3b5e.jpg"
    },
    "midbar": {
      "h5": "http://m.v.360kan.com/sv/cIPmaWPqUBT5TC.html",
      "playNumber": "22.4万",
      "date": "2016-11-01"
    },
    "topbar": {
      "title": "歼20亮相珠海航展",
      "type": [
        "歼20",
        "亮相"
      ],
      "bread": [
        {
          "text": "360影视",
          "url": "http://www.360kan.com/"
        },
        "现场"
      ]
    },
    "video": {
      "recommend": [
        {
          "title": "网爆何炅小腿骨折受伤入院",
          "cover": "http://p3.qhimg.com/t013dc0d59b2c28549e.jpg",
          "url": "http://v.360kan.com/sv/bYbqcmPqUBT6SS.html"
        },
        {
          "title": "相恋结婚9年 丈夫竟然变妻子?",
          "cover": "http://p7.qhimg.com/t01359b0b35aa2b187b.gif",
          "url": "http://v.360kan.com/sv/cIPocWPqUBT6Sy.html"
        },
        {
          "title": "反转!曝马蓉将告宋喆强奸",
          "cover": "http://p4.qhimg.com/t0184ab1ceb64d990ab.jpg",
          "url": "http://v.360kan.com/sv/coTkamPqUBH3Ti.html"
        },
        {
          "title": "爆笑!盘点那些奇葩的开门方式",
          "cover": "http://p1.qhimg.com/t015fa4d2fd82b0d944.jpg",
          "url": "http://v.360kan.com/sv/b4TqaWPqUBT5Si.html"
        },
        {
          "title": "网曝两女子和狗围攻老人 老人被打倒在地猛踹",
          "cover": "http://p2.qhimg.com/dmb/380_220_/t019c94eb2edd62b7fe.gif",
          "url": "http://v.360kan.com/sv/cobpbWPqUBTyUS.html",
          "date": "2016110101"
        },
        {
          "title": "印度村庄现神秘“笑脸蛇”",
          "cover": "http://p1.qhimg.com/t015fb97534120d13e9.jpg",
          "url": "http://v.360kan.com/sv/cYLjbGPqUBT6SC.html"
        }
      ],
      "relate": [
        {
          "title": "歼20亮相珠海航展",
          "id": "cIPmaWPqUBT5TC",
          "cover": "http://p4.qhimg.com/t01d2a7df91a54e3b5e.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=1b190d3186c3d889102d9eebcd2274e1&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=bb308556dd4d97ab9d57b4689c36ed38",
          "duration": "00:42",
          "playNum": "22.4万"
        },
        {
          "title": "男女偷情被抓双双遭暴打 女子衣服惨被扒光",
          "id": "c4TocmPoShX7TC",
          "cover": "http://p5.qhimg.com/t01b64185b8a0ac1a5e.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=fed04ada224cccac803a7d9f9cc6fddf&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=bb55de39b3eef0e60f7f874888a3887e",
          "duration": "02:12",
          "playNum": "3.2万"
        },
        {
          "title": "实拍小偷行窃当街被抓 上演“铁头功”连撞公交站台",
          "id": "cIfqcWLrThD1TS",
          "cover": "http://p7.qhimg.com/t015201256458b2c68b.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=21503944ec58fdcc1dea9be60e094c04&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=6bdfdedbe3323d3974c780023aa63d6f",
          "duration": "02:55",
          "playNum": "15.2万"
        },
        {
          "title": "实拍奇葩男子冒雨碰瓷 先敬个礼再摔倒",
          "id": "corjaWPqUBL4TC",
          "cover": "http://p0.qhimg.com/t01c44f03d525093473.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=1bb8d4ed28679604ba852eadfa6c36cb&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=92c9d4c442c041f0579cebc8f640288e",
          "duration": "01:32",
          "playNum": "5.4万"
        },
        {
          "title": "实拍生产化机器杀猪过程 批量从活猪到猪肉让屠夫都看傻眼了",
          "id": "b4XlbWPqUBn3SS",
          "cover": "http://p5.qhimg.com/t01af562aad8863daf7.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=e4b8aa7a337f1e1f22e0addf5ee9dc1f&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=17c71712da094ef5b439a6423b7549ce",
          "duration": "04:55",
          "playNum": "4.6万"
        },
        {
          "title": "贵圈真乱!游戏嫩模自曝拍完照与摄影师发生关系",
          "id": "cYLrbmPqURf6UC",
          "cover": "http://p0.qhimg.com/t019fd8d88f6baae719.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=2e0653a8de5cfa885530f940fc62e45b&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=1c287b903f08233b373280ca02d98861",
          "duration": "00:58",
          "playNum": 1991
        },
        {
          "title": "太魔性了!来自妈妈的爱 劝你穿秋裤时操老心了",
          "id": "b4Xna2PqURf6US",
          "cover": "http://p9.qhimg.com/t01275df3055c38a7fc.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=2dfcc594cdb83f5c6433e1d1790538e0&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=c9ac226d357c89e2b32ffe99aa975122",
          "duration": "00:48",
          "playNum": 1408
        },
        {
          "title": "外围女花巨资整容陪吸毒月入80万 00后最吃香",
          "id": "c4Lla2PqURf7Sy",
          "cover": "http://p2.qhimg.com/t0169ebc7fbe667f305.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=3d18abe70354ed86a6394838d7937aee&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=4bc227ef8b79a940c391be5dd2ba8b33",
          "duration": "01:26",
          "playNum": 1540
        },
        {
          "title": "男子带瓶眼镜蛇坐火车 安检喊你喝一口",
          "id": "bofmcWPqURf7TC",
          "cover": "http://p9.qhimg.com/t0188d8de26e95b29c7.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=d3cae0356d2d6b56efc8ea238e5bd7a6&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=e584122bb32e76a55b6661ff819430be",
          "duration": "00:58",
          "playNum": 1367
        },
        {
          "title": "3D还原重庆煤矿瓦斯爆炸“气流扑来像龙卷风”",
          "id": "dofmamPqURj0TS",
          "cover": "http://p1.qhimg.com/t0151466a9f86c514e3.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=208feb8616d56696b3ad1d02a30b7b25&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=a6df809a529d48ca155fb7d82e40e3d5",
          "duration": "02:15",
          "playNum": 860
        },
        {
          "title": "毛骨悚然!实拍成群浣熊伸手寻找食物 上演现实版鬼片",
          "id": "cYTpamPqURj2SS",
          "cover": "http://p4.qhimg.com/t013328b2cea49c24d8.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=7f76f93350c115ea4e3be22a385c3bd8&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=0a9ae326fda916764309dd2dc0999ae2",
          "duration": "01:11",
          "playNum": 1342
        },
        {
          "title": "这不是电影!罕见纪实影像揭秘二战战场残酷历史瞬间",
          "id": "cYTlcmPqURj6UC",
          "cover": "http://p6.qhimg.com/t01bc2dd91caebfb8a3.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=9f398dbe5b946ed403454d5337b63c34&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=2df037734dc115ae81324e8382c69965",
          "duration": "03:26",
          "playNum": 646
        },
        {
          "title": "2016马云现场对话李连杰和马化腾,全场笑声一波接一波!",
          "id": "b4bmaWPqURj7UC",
          "cover": "http://p2.qhimg.com/t01a3a16cc9dfaa4246.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=4067c7d8db40ae057c5175923bf6ad82&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=1b84e860cb553fc41a009d2c1e3beba9",
          "duration": "17:32",
          "playNum": 1400
        },
        {
          "title": "皮条客揭外围圈内幕:花巨资整容 00后最吃香",
          "id": "doXobGPqURn0SC",
          "cover": "http://p2.qhimg.com/t01c9b6639786204e68.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=9383b8c70292100ff9b7349678b2111c&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=0e7e60413ff5b6d02bd22612c4792d5e",
          "duration": "02:08",
          "playNum": "3.1万"
        },
        {
          "title": "圆状UFO飞进日本村庄 被公路上的监控拍了下来\n",
          "id": "boPkcWPrSBD4SC",
          "cover": "http://p6.qhimg.com/t01a94e5f559687391a.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=401f877c136365c6750b5ef50005efbe&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=e3982a9e2d432e2774470c333e99044d",
          "duration": "02:42",
          "playNum": 771
        },
        {
          "title": "萌cry!馋嘴的小贝壳 偷偷伸出舌头偷盐吃",
          "id": "cYLmaWPrSBD4SS",
          "cover": "http://p6.qhimg.com/t01da8d3f400a1ff300.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=406f930631e7fa3505e695d5717a7151&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=1a1b8dd34287ba29c3b02bda54440a6b",
          "duration": "00:38",
          "playNum": 280
        },
        {
          "title": "姐弟俩为争房产 互向对方租客泼屎尿",
          "id": "c4Tsa2PrSBD4Sy",
          "cover": "http://p9.qhimg.com/t010e876a6ae8591f8f.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=641d13dd42ac8b75472336c9c6ae4065&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=79b02c835c13e97999909d4b237283e9",
          "duration": "01:34",
          "playNum": 626
        },
        {
          "title": "贵圈真乱!游戏嫩模自曝拍完照与摄影师发生关系",
          "id": "c4TjbGPrSBD6UC",
          "cover": "http://p5.qhimg.com/t013d881b0eeb5beee6.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=af9795712c811ac927662bfd25a61f4f&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=9d3cdc50c6b28ca44ffe4429008b07b7",
          "duration": "01:02",
          "playNum": "2.8万"
        },
        {
          "title": "惊心动魄!夫妻酒店泳池嬉戏遭鳄鱼闯入袭击 丈夫第一时间逃离",
          "id": "dYTmaWPrSBL5US",
          "cover": "http://p4.qhimg.com/t01f66efc1a341141c2.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=5a273a1f0858c077b216f21991347ddb&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=3f0233cd1c9beb8b28797a0e55bd3a6a",
          "duration": "01:10",
          "playNum": 110
        },
        {
          "title": "罗马尼亚老师掌掴5岁学童 夸张画面让人不忍直视",
          "id": "doblbGPrSBL6Si",
          "cover": "http://p3.qhimg.com/t01ed2df3949305e343.jpg",
          "url": "http://info.play.tvfanqie.com/video/getplay?mid=0f7de783e8ac374ae65360eef075d2c9&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006714&_sign=a92857cb0a890d76417c1ca956a75dfc",
          "duration": "01:14",
          "playNum": 576
        }
      ]
    },
    "guess": [
      {
        "title": "男子微信摇来女网友 不想对方竟是男儿身",
        "id": "dYjqb2PqURf7SS",
        "cover": "http://p6.qhimg.com/t01bda779e5aaa4af9d.jpg",
        "url": "http://v.360kan.com/sv/dYjqb2PqURf7SS.html",
        "duration": "00:40",
        "playNum": 976
      },
      {
        "title": "外围女花巨资整容陪吸毒月入80万 00后最吃香",
        "id": "c4Lla2PqURf7Sy",
        "cover": "http://p2.qhimg.com/t0169ebc7fbe667f305.jpg",
        "url": "http://v.360kan.com/sv/c4Lla2PqURf7Sy.html",
        "duration": "01:26",
        "playNum": 1540
      },
      {
        "title": "男子带瓶眼镜蛇坐火车 安检喊你喝一口",
        "id": "bofmcWPqURf7TC",
        "cover": "http://p9.qhimg.com/t0188d8de26e95b29c7.jpg",
        "url": "http://v.360kan.com/sv/bofmcWPqURf7TC.html",
        "duration": "00:58",
        "playNum": 1367
      },
      {
        "title": "这不是电影!罕见纪实影像揭秘二战战场残酷历史瞬间",
        "id": "cYTlcmPqURj6UC",
        "cover": "http://p6.qhimg.com/t01bc2dd91caebfb8a3.jpg",
        "url": "http://v.360kan.com/sv/cYTlcmPqURj6UC.html",
        "duration": "03:26",
        "playNum": 646
      },
      {
        "title": "2016马云现场对话李连杰和马化腾,全场笑声一波接一波!",
        "id": "b4bmaWPqURj7UC",
        "cover": "http://p2.qhimg.com/t01a3a16cc9dfaa4246.jpg",
        "url": "http://v.360kan.com/sv/b4bmaWPqURj7UC.html",
        "duration": "17:32",
        "playNum": 1400
      },
      {
        "title": "圆状UFO飞进日本村庄 被公路上的监控拍了下来\n",
        "id": "boPkcWPrSBD4SC",
        "cover": "http://p6.qhimg.com/t01a94e5f559687391a.jpg",
        "url": "http://v.360kan.com/sv/boPkcWPrSBD4SC.html",
        "duration": "02:42",
        "playNum": 771
      },
      {
        "title": "少女晚上跟爸爸哥哥同住一屋 竟发生了可怕的事",
        "id": "bYbmb2PrSBD4Si",
        "cover": "http://p2.qhimg.com/t01cf0960afcbacdab6.jpg",
        "url": "http://v.360kan.com/sv/bYbmb2PrSBD4Si.html",
        "duration": "04:37",
        "playNum": 1358
      },
      {
        "title": "实拍丰田违停4男子猛砸宝马车  宝马车气不过连续猛撞丰田",
        "id": "dYjmaWPrSBD6Ty",
        "cover": "http://p0.qhimg.com/t01ff4baf0f2d10eced.jpg",
        "url": "http://v.360kan.com/sv/dYjmaWPrSBD6Ty.html",
        "duration": "02:02",
        "playNum": 2540
      },
      {
        "title": "惊心动魄!夫妻酒店泳池嬉戏遭鳄鱼闯入袭击 丈夫第一时间逃离",
        "id": "dYTmaWPrSBL5US",
        "cover": "http://p4.qhimg.com/t01f66efc1a341141c2.jpg",
        "url": "http://v.360kan.com/sv/dYTmaWPrSBL5US.html",
        "duration": "01:10",
        "playNum": 110
      },
      {
        "title": "实拍恩施一奇葩男子冒雨碰瓷有礼貌 先敬个礼再摔倒",
        "id": "cYrnbWPrSBL6TS",
        "cover": "http://p4.qhimg.com/t017fd9fe803a973a99.jpg",
        "url": "http://v.360kan.com/sv/cYrnbWPrSBL6TS.html",
        "duration": "01:35",
        "playNum": 985
      }
    ],
    "todayHot": [
      {
        "title": "张雨绮称老公未婚",
        "desc": "但有人却晒了他的结婚照",
        "cover": "http://p6.qhimg.com/t014495cdef1c986575.jpg",
        "url": "http://v.360kan.com/sv/cITnbGPqTBj6US.html"
      },
      {
        "title": "印度村庄现神秘“笑脸蛇”",
        "cover": "http://p1.qhimg.com/t015fb97534120d13e9.jpg",
        "url": "http://v.360kan.com/sv/cYLjbGPqUBT6SC.html"
      },
      {
        "title": "贾静雯全家过万圣节",
        "desc": "咘咘梧桐妹大眼软萌",
        "cover": "http://p0.qhimg.com/t0150b403e057674f4e.jpg",
        "url": "http://v.360kan.com/sv/dYXmbmPqSxj0SS.html"
      },
      {
        "title": "心疼!何炅急送医院手术 疑因金属异物插入小腿",
        "desc": "何炅意外被异物扎伤 不愿轻易下火线 被赞中国好主持!",
        "cover": "http://p0.qhimg.com/t011b2b8a18af8d3b17.jpg",
        "url": "http://v.360kan.com/sv/coPma2PqUBH1UC.html"
      },
      {
        "title": "董明珠因进门没掌声怒骂股东",
        "cover": "http://p4.qhimg.com/t0174bf89dcd8a46e61.jpg",
        "url": "http://v.360kan.com/sv/cYLoamPqShPyUS.html"
      },
      {
        "title": "萌娃扮无脸男酷到没朋友 网友:妈妈下手太重了",
        "cover": "http://p0.qhimg.com/dmb/380_220_/t01fa84b47e6de625d4.jpg",
        "url": "http://v.360kan.com/sv/c4fkcmPqSxH2US.html",
        "date": "2016103104"
      },
      {
        "title": "杨幂嗲音被批恶心",
        "desc": "回应:严重鼻炎",
        "cover": "http://p9.qhimg.com/t018df898ae578d33cd.jpg",
        "url": "http://v.360kan.com/sv/bYXjbWPqTBj4UC.html"
      },
      {
        "title": "土豪怒甩50万现金砸碎店里iPhone",
        "cover": "http://p3.qhimg.com/t01f998610d1cffae18.jpg",
        "url": "http://v.360kan.com/sv/coflbGPqSRj1Ty.html"
      },
      {
        "title": "惨!实拍公路桥被车重压垮塌",
        "cover": "http://p2.qhimg.com/t018f25cf6682b46e73.gif",
        "url": "http://v.360kan.com/sv/dInmbWPqUBTyTi.html"
      },
      {
        "title": "新买iPhone7相册存陌生人照片",
        "cover": "http://p3.qhimg.com/t01f04fee7bd224af4b.jpg",
        "url": "http://v.360kan.com/sv/bYjobWPqUBT6TC.html"
      },
      {
        "title": "20岁林允曝性感照",
        "desc": "晒美胸美背好诱人",
        "cover": "http://p3.qhimg.com/t01938e1dd299bb1cf5.jpg",
        "url": "http://v.360kan.com/sv/b4nkbGPqSxnzSi.html"
      },
      {
        "title": "摩的司机占道不听劝亮刀打交警",
        "cover": "http://p4.qhimg.com/t012b069fa44b11a5bf.gif",
        "url": "http://v.360kan.com/sv/cYbnaWPqUBT2SC.html"
      },
      {
        "title": "爆笑!盘点那些奇葩的开门方式",
        "cover": "http://p1.qhimg.com/t015fa4d2fd82b0d944.jpg",
        "url": "http://v.360kan.com/sv/b4TqaWPqUBT5Si.html"
      },
      {
        "title": "奇葩男子冒雨碰瓷 先敬礼再摔倒",
        "cover": "http://p0.qhimg.com/t01c44f03d525093473.jpg",
        "url": "http://v.360kan.com/sv/corjaWPqUBL4TC.html"
      },
      {
        "title": "网曝两女子和狗围攻老人 老人被打倒在地猛踹",
        "cover": "http://p2.qhimg.com/dmb/380_220_/t019c94eb2edd62b7fe.gif",
        "url": "http://v.360kan.com/sv/cobpbWPqUBTyUS.html",
        "date": "2016110101"
      },
      {
        "title": "相恋结婚9年 丈夫竟然变妻子?",
        "cover": "http://p7.qhimg.com/t01359b0b35aa2b187b.gif",
        "url": "http://v.360kan.com/sv/cIPocWPqUBT6Sy.html"
      }
    ],
    "wemedia": {
      "wmid": "c4LiQHkwQWn58g",
      "wm_url": "http://wemedia.360kan.com/wm/c4LiQHkwQWn58g.html?from=v",
      "name": "车祸实拍",
      "head_img": "http://p0.qhimg.com/t01c341f9415acebca7.jpg",
      "video_count": "2",
      "fans_count": "12",
      "upload_time": "2016-10-28 19:25",
      "desc": "歼20亮相珠海航展",
      "tags": [
        "歼20",
        "亮相"
      ],
      "judgeAttention": -1
    },
    "log": {
      "vid": 678474,
      "catid": "1700",
      "sub_catid": null
    }
  }
}

该接口请求中的id参数值可以从播放页地址中提取得到。从返回的JSON数据中,我们发现相关视频(result/video/relate)列表中的第一项就是要找的视频信息。其中的id正好是播放页地址中的id,url就是接下来要请求的东西。

请求 http://info.play.tvfanqie.com/video/getplay?mid=1b190d3186c3d889102d9eebcd2274e1&cli=web&act=play&sid=fanqie_web&_rate=&pver=1.0&ckts=1&source=1&ts=1478006691&_sign=c05ee59bfb518ec70fea8664227042e1 返回如下JSON数据:

{
  "errno": 0,
  "error": "ok",
  "result": {
    "vid": "1b190d3186c3d889102d9eebcd2274e1",
    "site": "360shipin",
    "duration": 42,
    "title": "682804",
    "pic": "http://p4.qhimg.com/t01d2a7df91a54e3b5e.jpg",
    "currqua": {
      "key": "xd",
      "value": "超清"
    },
    "quality": [
      {
        "key": "xd",
        "value": "超清"
      },
      {
        "key": "hd",
        "value": "高清"
      },
      {
        "key": "sd",
        "value": "标清"
      }
    ],
    "vrtype": {
      "key": 0,
      "value": "普通视频"
    },
    "drmtype": "non",
    "stype": "m3u8",
    "usep2p": 0,
    "sid": "fanqie_web",
    "videos": [
      {
        "duration": 42,
        "url": "http://g.play.tvfanqie.com/video/getplay?mid=1b190d3186c3d889102d9eebcd2274e1&dtype=non&stype=m3u8&_rate=xd&sid=fanqie_web&source=1&ts=1478007132&_sign=69e115781ac007e9df87a0c3425afa53"
      }
    ]
  }
}

从这串JSON数据可以推知,currqua是当前清晰度的意思,quality列表表示该视频有哪些清晰度。重点在于videos列表中的url,请求该地址,得到的是一个m3u8文件内容:

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-QIHU-RUID:900b2f1b2d2f99a16353e5d4abda38d6
#EXT-X-CDN_DOMAIN:y.play.360kan.com
#EXT-X-TARGETDURATION:10
#EXT-X-QIHU-SZ:1639736
#EXTINF:8.166,
http://y.play.360kan.com/vod/143/141/900b2f1b2d2f99a16353e5d4abda38d6/1b190d3186c3d889102d9eebcd2274e1_1280_640_1200_128_900b2f1b2d2f99a16353e5d4abda38d6_mp4_3gb15523d_0.ts?time=1478007357&sign=13479111e10e131dc8dd6ea2720fea49
#EXT-X-QIHU-SZ:1143792
#EXTINF:6.250,
http://y.play.360kan.com/vod/143/141/900b2f1b2d2f99a16353e5d4abda38d6/1b190d3186c3d889102d9eebcd2274e1_1280_640_1200_128_900b2f1b2d2f99a16353e5d4abda38d6_mp4_3gb1d40ae_1.ts?time=1478007357&sign=3d7e66b1b13c52db597eabbf02bffd72
#EXT-X-QIHU-SZ:882284
#EXTINF:6.250,
http://y.play.360kan.com/vod/143/141/900b2f1b2d2f99a16353e5d4abda38d6/1b190d3186c3d889102d9eebcd2274e1_1280_640_1200_128_900b2f1b2d2f99a16353e5d4abda38d6_mp4_3gb1fab8e_2.ts?time=1478007357&sign=6be2a1c97c1110942f5358a9a190716e
#EXT-X-QIHU-SZ:1175564
#EXTINF:6.250,
http://y.play.360kan.com/vod/143/141/900b2f1b2d2f99a16353e5d4abda38d6/1b190d3186c3d889102d9eebcd2274e1_1280_640_1200_128_900b2f1b2d2f99a16353e5d4abda38d6_mp4_3gb158a8d_3.ts?time=1478007357&sign=fb790212297512ceb6f21e28069d5eca
#EXT-X-QIHU-SZ:962560
#EXTINF:6.250,
http://y.play.360kan.com/vod/143/141/900b2f1b2d2f99a16353e5d4abda38d6/1b190d3186c3d889102d9eebcd2274e1_1280_640_1200_128_900b2f1b2d2f99a16353e5d4abda38d6_mp4_3gb1379bb_4.ts?time=1478007357&sign=1f1cf07d2231e5f951319f530b1044a4
#EXT-X-QIHU-SZ:861980
#EXTINF:4.750,
http://y.play.360kan.com/vod/143/141/900b2f1b2d2f99a16353e5d4abda38d6/1b190d3186c3d889102d9eebcd2274e1_1280_640_1200_128_900b2f1b2d2f99a16353e5d4abda38d6_mp4_3gb19a24f_5.ts?time=1478007357&sign=27b20b0fec49b61fcab804a3ffbf727f
#EXT-X-QIHU-SZ:521136
#EXTINF:4.000,
http://y.play.360kan.com/vod/143/141/900b2f1b2d2f99a16353e5d4abda38d6/1b190d3186c3d889102d9eebcd2274e1_1280_640_1200_128_900b2f1b2d2f99a16353e5d4abda38d6_mp4_3gb10f11b_6.ts?time=1478007357&sign=fc13fb4ba30872643e5b2c5e6916a513
#EXT-X-ENDLIST

从m3u8文件中提取出各个视频分段的地址,分别下载完成后合并成完整视频即可。

Python代码示例

import re
import requests
import json

url = 'http://v.360kan.com/sv/cIPmaWPqUBT5TC.html'
vid = re.search('/(\w+).html', url).group(1)
r = requests.get('http://v.360kan.com/Shortvideo/ajaxApi?id=%s' % vid)
data = json.loads(r.content)
relate_videos = data['result']['video']['relate']
for v in relate_videos:
    if v['id'] == vid:
        r = requests.get(v['url'])
        data = json.loads(r.content)
        m3u8_url = data['result']['videos'][0]['url']
        r = requests.get(m3u8_url)
        segments = re.findall(r'^[^#][^\r][^\n]*', r.content, re.MULTILINE)
        for seg in segments:
            print seg
        break

作者:Maslino
链接:https://www.jianshu.com/p/47813d7f7974
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

JavaScript 事件循环及异步原理(完全指北) - 梁音 - 博客园

mikel阅读(916)

来源: JavaScript 事件循环及异步原理(完全指北) – 梁音 – 博客园

引言

最近面试被问到,JS 既然是单线程的,为什么可以执行异步操作?
当时脑子蒙了,思维一直被困在 单线程 这个问题上,一直在思考单线程为什么可以额外运行任务,其实在我很早以前写的博客里面有写相关的内容,只不过时间太长给忘了,所以要经常温习啊:(浅谈 Generator 和 Promise 的原理及实现)

  1. JS 是单线程的,只有一个主线程
  2. 函数内的代码从上到下顺序执行,遇到被调用的函数先进入被调用函数执行,待完成后继续执行
  3. 遇到异步事件,浏览器另开一个线程,主线程继续执行,待结果返回后,执行回调函数

其实 JS 这个语言是运行在宿主环境中,比如 浏览器环境nodeJs环境

  • 在浏览器中,浏览器负责提供这个额外的线程
  • 在 Node 中,Node.js 借助 libuv 来作为抽象封装层, 从而屏蔽不同操作系统的差异,Node可以借助libuv来实现多线程。

而这个异步线程又分为 微任务 和 宏任务,本篇文章就来探究一下 JS 的异步原理以及其事件循环机制

为什么 JavaScript 是单线程的

JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。这样设计的方案主要源于其语言特性,因为 JavaScript 是浏览器脚本语言,它可以操纵 DOM ,可以渲染动画,可以与用户进行互动,如果是多线程的话,执行顺序无法预知,而且操作以哪个线程为准也是个难题。

所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。

在 HTML5 时代,浏览器为了充分发挥 CPU 性能优势,允许 JavaScript 创建多个线程,但是即使能额外创建线程,这些子线程仍然是受到主线程控制,而且不得操作 DOM,类似于开辟一个线程来运算复杂性任务,运算好了通知主线程运算完毕,结果给你,这类似于异步的处理方式,所以本质上并没有改变 JavaScript 单线程的本质。

函数调用栈与任务队列

函数调用栈

JavaScript 只有一个主线程和一个调用栈(call stack),那什么是调用栈呢?

这类似于一个乒乓球桶,第一个放进去的乒乓球会最后一个拿出来。

举个栗子:

function a() {  
  console.log("I'm a!");
};

function b() {  
  a();
  console.log("I'm b!");
};

b();

执行过程如下所示:

  • 第一步,执行这个文件,此文件会被压入调用栈(例如此文件名为 main.js
    call stack
    main.js
  • 第二步,遇到 b() 语法,调用 b() 方法,此时调用栈会压入此方法进行调用:
    call stack
    b()
    main.js
  • 第三步:调用 b() 函数时,内部调用的 a() ,此时 a() 将压入调用栈:
    call stack
    a()
    b()
    main.js
  • 第四步:a() 调用完毕输出 I'm a!,调用栈将 a() 弹出,就变成如下:
    call stack
    b()
    main.js
  • 第五步:b()调用完毕输出I'm b!,调用栈将 b() 弹出,变成如下:
    call stack
    main.js
  • 第六步:main.js 这个文件执行完毕,调用栈将 b() 弹出,变成一个空栈,等待下一个任务执行:
    call stack

这就是一个简单的调用栈,在调用栈中,前一个函数在执行的时候,下面的函数全部需要等待前一个任务执行完毕,才能执行。

但是,有很多任务需要很长时间才能完成,如果一直都在等待的话,调用栈的效率极其低下,这时,JavaScript 语言设计者意识到,这些任务主线程根本不需要等待,只要将这些任务挂起,先运算后面的任务,等到执行完毕了,再回头将此任务进行下去,于是就有了 任务队列 的概念。

任务队列

所有任务可以分成两种,一种是 同步任务(synchronous),另一种是 异步任务(asynchronous) 。

同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。

异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有 "任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

所以,当在执行过程中遇到一些类似于 setTimeout 等异步操作的时候,会交给浏览器的其他模块进行处理,当到达 setTimeout 指定的延时执行的时间之后,回调函数会放入到任务队列之中。

当然,一般不同的异步任务的回调函数会放入不同的任务队列之中。等到调用栈中所有任务执行完毕之后,接着去执行任务队列之中的回调函数。

用一张图来表示就是:

image-20181011232324823

上图中,调用栈先进行顺序调用,一旦发现异步操作的时候就会交给浏览器内核的其他模块进行处理,对于 Chrome浏览器来说,这个模块就是 webcore 模块,上面提到的异步API,webcore 分别提供了 DOM Binding 、 networktimer 模块进行处理。等到这些模块处理完这些操作的时候将回调函数放入任务队列中,之后等栈中的任务执行完之后再去执行任务队列之中的回调函数。

我们先来看一个有意思的现象,我运行一段代码,大家觉得输出的顺序是什么:

  setTimeout(() => {
    console.log('setTimeout')
  }, 22)
  for (let i = 0; i++ < 2;) {
    i === 1 && console.log('1')
  }
  setTimeout(() => {
    console.log('set2')
  }, 20)
  for (let i = 0; i++ < 100000000;) {
    i === 99999999 && console.log('2')
  }

没错!结果很量子化:

QQ20181012-101019-HD

那么这实际上是一个什么过程呢?那我就拿上面的一个过程解析一下:

  • 首先,文件入栈

    image-20181012102607896

  • 开始执行文件,读取到第一行代码,当遇到 setTimeout 的时候,执行引擎将其添加到栈中。(由于字体太细我调粗了一点。。。)

    image-20181012103026018

  • 调用栈发现 setTimeout 是 Webapis中的 API,因此将其交给浏览器的 timer 模块进行处理,同时处理下一个任务。

image-20181012134531903

  • 第二个 setTimeout 入栈

    image-20181012134755318

  • 同上所示,异步请求被放入 异步API 进行处理,同时进行下一个入栈操作:

    image-20181012135048171

  • 在进行异步的同时,app.js 文件调用完毕,弹出调用栈,异步执行完毕后,会将回调函数放入任务队列:

    image-20181012140221038

  • 任务队列通知调用栈,我这边有任务还没有执行,调用栈则会执行任务队列里的任务:

    image-20181012140632679

    image-20181012140723756

上面的流程解释了浏览器遇到 setTimeout 之后究竟如何执行的,其实总结下来就是以下几点:

  1. 调用栈顺序调用任务
  2. 当调用栈发现异步任务时,将异步任务交给其他模块处理,自己继续进行下面的调用
  3. 异步执行完毕,异步模块将任务推入任务队列,并通知调用栈
  4. 调用栈在执行完当前任务后,将执行任务队列里的任务
  5. 调用栈执行完任务队列里的任务之后,继续执行其他任务

这一整个流程就叫做 事件循环(Event Loop)

那么,了解了这么多,小伙伴们能从事件循环上面来解析下面代码的输出吗?

  for (var i = 0; i < 10; i++) {
    setTimeout(() => {
      console.log(i)
    }, 1000)
  }
  console.log(i)

解析:

  • 首先由于 var 的变量提升,i 在全局作用域都有效
  • 再次,代码遇到 setTimeout 之后,将该函数交给其他模块处理,自己继续执行 console.log(i) ,由于变量提升,i 已经循环10次,此时 i 的值为 10 ,即,输出 10
  • 之后,异步模块处理好函数之后,将回调推入任务队列,并通知调用栈
  • 1秒之后,调用栈顺序执行回调函数,由于此时 i 已经变成 10 ,即输出10次 10

用下图示意:

image-20181012152514598

现在小伙伴们是否已经恍然大悟,从底层了解了为什么这个代码会输出这个内容吧:

image-20181012152640173

那么问题又来了,我们看下面的代码:

  setTimeout(() => {
    console.log(4)
  }, 0);
  new Promise((resolve) =>{
    console.log(1);
    for (var i = 0; i < 10000000; i++) {
      i === 9999999 && resolve();
    }
    console.log(2);
  }).then(() => {
    console.log(5);
  });
  console.log(3);

大家觉得这个输出是多少呢?

有小伙伴就开始分析了,promise 也是异步,先执行里面函数的内容,输出 1 和 2,然后执行下面的函数,输出 3 ,但 Promise 里面需要循环999万次,setTimeout 却是0毫秒执行,setTimeout 应该立即推入执行栈, Promise 后推入执行栈,结果应该是下图:

image-20181012161137385

实际上答案是 1,2,3,5,4 噢,这是为什么呢?这就涉及到任务队列的内部,宏任务和微任务。

宏任务和微任务

什么是宏任务和微任务

任务队列又分为 macro-task(宏任务) 与 micro-task(微任务) ,在最新标准中,它们被分别称为 task 与 jobs 。

  • macro-task(宏任务)大概包括:script(整体代码)setTimeoutsetIntervalsetImmediate(NodeJs)I/OUI rendering
  • micro-task(微任务)大概包括: process.nextTick(NodeJs)PromiseObject.observe(已废弃)MutationObserver(html5新特性)
  • 来自不同任务源的任务会进入到不同的任务队列。其中 setTimeout 与 setInterval 是同源的。

事实上,事件循环决定了代码的执行顺序,从全局上下文进入函数调用栈开始,直到调用栈清空,然后执行所有的micro-task(微任务),当所有的micro-task(微任务)执行完毕之后,再执行macro-task(宏任务),其中一个macro-task(宏任务)的任务队列执行完毕(例如setTimeout 队列),再次执行所有的micro-task(微任务),一直循环直至执行完毕。

解析

现在我就开始解析上面的代码。

  • 第一步,整体代码 script 入栈,并执行 setTimeout 后,执行 Promise

    image-20181013144141327

  • 第二步,执行时遇到 Promise 实例,Promise 构造函数中的第一个参数,是在new的时候执行,因此不会进入任何其他的队列,而是直接在当前任务直接执行了,而后续的.then则会被分发到micro-taskPromise队列中去。

    image-20181013144638756

    image-20181013144902587

  • 第三步,调用栈继续执行宏任务 app.js,输出3并弹出调用栈,app.js 执行完毕弹出调用栈:

    image-20181013145222565

    image-20181013145713234

  • 第四步,这时,macro-task(宏任务)中的 script 队列执行完毕,事件循环开始执行所有的 micro-task(微任务)

    image-20181013150040555

  • 第五步,调用栈发现所有的 micro-task(微任务) 都已经执行完毕,又跑去macro-task(宏任务)调用 setTimeout 队列:

    image-20181013150354612

  • 第六步,macro-task(宏任务) setTimeout 队列执行完毕,调用栈又跑去微任务进行查找是否有未执行的微任务,发现没有就跑去宏任务执行下一个队列,发现宏任务也没有队列执行,此次调用结束,输出内容1,2,3,5,4

那么上面这个例子的输出结果就显而易见。大家可以自行尝试体会。

总结

  1. 不同的任务会放进不同的任务队列之中。
  2. 先执行macro-task,等到函数调用栈清空之后再执行所有在队列之中的micro-task
  3. 等到所有micro-task执行完之后再从macro-task中的一个任务队列开始执行,就这样一直循环。
  4. 宏任务和微任务的队列执行顺序排列如下:
  5. macro-task(宏任务)script(整体代码)setTimeoutsetIntervalsetImmediate(NodeJs)I/OUI rendering
  6. micro-task(微任务)process.nextTick(NodeJs)PromiseObject.observe(已废弃)MutationObserver(html5新特性)

进阶举例

那么,我再来一些有意思一点的代码:

<script>
  setTimeout(() => {
    console.log(4)
  }, 0);
  new Promise((resolve) => {
    console.log(1);
    for (var i = 0; i < 10000000; i++) {
      i === 9999999 && resolve();
    }
    console.log(2);
  }).then(() => {
    console.log(5);
  });
  console.log(3);
</script>
<script>
  console.log(6)
  new Promise((resolve) => {
    resolve()
  }).then(() => {
    console.log(7);
  });
</script>

这一段代码输出的顺序是什么呢?

其实,看明白上面流程的同学应该知道整个流程,为了防止一些同学不明白,我再简单分析一下:

  • 首先,script1 进入任务队列(为了方便起见,我把两块script 命名为script1script2):

    image-20181013152218883

  • 第二步,script1 进行调用并弹出调用栈:

    image-20181013152506563

  • 第三步,script1执行完毕,调用栈清空后,直接调取所有微任务:

    image-20181013152844991

  • 第四步,所有微任务执行完毕之后,调用栈会继续调用宏任务队列:

    image-20181013153031374

  • 第五步,执行 script2,并弹出:

    image-20181013153426912

  • 第六步,调用栈开始执行微任务:

    image-20181013153503105

  • 第七步,调用栈调用完所有微任务,又跑去执行宏任务:

    image-20181013153654938

至此,所有任务执行完毕,输出 1,2,3,5,6,7,4

了解了上面的内容,我觉得再复杂一点异步调用关系你也能搞定:

setImmediate(() => {
    console.log(1);
},0);
setTimeout(() => {
    console.log(2);
},0);
new Promise((resolve) => {
    console.log(3);
    resolve();
    console.log(4);
}).then(() => {
    console.log(5);
});
console.log(6);
process.nextTick(()=> {
    console.log(7);
});
console.log(8);
//输出结果是3 4 6 8 7 5 2 1

image-20181013163225154

终极测试

setTimeout(() => {
    console.log('to1');
    process.nextTick(() => {
        console.log('to1_nT');
    })
    new Promise((resolve) => {
        console.log('to1_p');
        setTimeout(() => {
          console.log('to1_p_to')
        })
        resolve();
    }).then(() => {
        console.log('to1_then')
    })
})

setImmediate(() => {
    console.log('imm1');
    process.nextTick(() => {
        console.log('imm1_nT');
    })
    new Promise((resolve) => {
        console.log('imm1_p');
        resolve();
    }).then(() => {
        console.log('imm1_then')
    })
})

process.nextTick(() => {
    console.log('nT1');
})
new Promise((resolve) => {
    console.log('p1');
    resolve();
}).then(() => {
    console.log('then1')
})

setTimeout(() => {
    console.log('to2');
    process.nextTick(() => {
        console.log('to2_nT');
    })
    new Promise((resolve) => {
        console.log('to2_p');
        resolve();
    }).then(() => {
        console.log('to2_then')
    })
})

process.nextTick(() => {
    console.log('nT2');
})

new Promise((resolve) => {
    console.log('p2');
    resolve();
}).then(() => {
    console.log('then2')
})

setImmediate(() => {
    console.log('imm2');
    process.nextTick(() => {
        console.log('imm2_nT');
    })
    new Promise((resolve) => {
        console.log('imm2_p');
        resolve();
    }).then(() => {
        console.log('imm2_then')
    })
})
// 输出结果是:?

大家可以在评论里留言结果哟~

已获得 OLE DB 记录。源:“Microsoft SQL Native Client” Hresult: 0x80004005 说明:“不能将值 NULL 插入列 'id',表 'ToolingD - 路漫漫 修远兮 - CSDN博客

mikel阅读(2351)

来源: 已获得 OLE DB 记录。源:“Microsoft SQL Native Client” Hresult: 0x80004005 说明:“不能将值 NULL 插入列 ‘id’,表 ‘ToolingD – 路漫漫 修远兮 – CSDN博客

到excel中的数据导入SQL 时遇到的

报错的错是:

==============================

– 正在复制到 [ToolingDataSystem].[dbo].[Tool] (错误)
消息
信息 0x402090df: 数据流任务: 数据插入操作的最终提交已开始。
(SQL Server 导入和导出向导)

错误 0xc0202009: 数据流任务: 出现 OLE DB 错误。错误代码: 0x80004005。
已获得 OLE DB 记录。源:“Microsoft SQL Native Client” Hresult: 0x80004005 说明:“语句已终止。”。
已获得 OLE DB 记录。源:“Microsoft SQL Native Client” Hresult: 0x80004005 说明:“不能将值 NULL 插入列 ‘id’,表 ‘ToolingDataSystem.dbo.Tool’;列不允许有空值。INSERT 失败。”。
(SQL Server 导入和导出向导)

信息 0x402090e0: 数据流任务: 数据插入操作的最终提交已结束。
(SQL Server 导入和导出向导)

错误 0xc0047022: 数据流任务: 组件“目标 – Tool”(251)的 ProcessInput 方法失败,错误代码为 0xC0202009。标识的这个组件从 ProcessInput 方法返回了一个错误。虽然该错误是此组件特有的,但却是致命的,将导致数据流任务停止运行。
(SQL Server 导入和导出向导)

错误 0xc0047021: 数据流任务: 线程“WorkThread0”已退出,错误代码为 0xC0202009。
(SQL Server 导入和导出向导)
消息
信息 0x402090df: 数据流任务: 数据插入操作的最终提交已开始。
(SQL Server 导入和导出向导)

错误 0xc0202009: 数据流任务: 出现 OLE DB 错误。错误代码: 0x80004005。
已获得 OLE DB 记录。源:“Microsoft SQL Native Client” Hresult: 0x80004005 说明:“语句已终止。”。
已获得 OLE DB 记录。源:“Microsoft SQL Native Client” Hresult: 0x80004005 说明:“不能将值 NULL 插入列 ‘id’,表 ‘ToolingDataSystem.dbo.Tool’;列不允许有空值。INSERT 失败。”。
(SQL Server 导入和导出向导)

信息 0x402090e0: 数据流任务: 数据插入操作的最终提交已结束。
(SQL Server 导入和导出向导)

错误 0xc0047022: 数据流任务: 组件“目标 – Tool”(251)的 ProcessInput 方法失败,错误代码为 0xC0202009。标识的这个组件从 ProcessInput 方法返回了一个错误。虽然该错误是此组件特有的,但却是致命的,将导致数据流任务停止运行。
(SQL Server 导入和导出向导)

错误 0xc0047021: 数据流任务: 线程“WorkThread0”已退出,错误代码为 0xC0202009。
(SQL Server 导入和导出向导)

==============================

不要勾选上面的”启用标识插入” ID 自增列 默认对应 忽略就好了
———————
作者:橙色阳光
来源:CSDN
原文:https://blog.csdn.net/sat472291519/article/details/19490673?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!

App被拒选择回复还是重新提审,如何选择最高效的应对方式? - 环信

mikel阅读(1251)

来源: App被拒选择回复还是重新提审,如何选择最高效的应对方式? – 环信

对于开发者来说,最揪心的不是 App 上传 App Store 审核被拒,而是被拒之后重新提审总要过好久才能得到新的反馈,而且结果依旧是……被拒……

今天,我们就请来了资深的过审达人「道长」来给大家分享——被拒之后怎样应对才是更高效的,直接回复还是重新提审?

一、两种被拒类型

通常来说,App 被拒不外乎两种情况:“元数据被拒”与“二进制被拒”。

那元数据和二进制分别指什么呢,刚接触 ASO 的新人可能不太了解,我们做一下简单的解释:

元数据,简单来说就是 iTC 后台(iutunesconnect.apple.com)上所有能编辑到的地方,我们都可以称之为“元数据”,比如标题、副标题、关键字域、截图等。

二进制全称是“二进制文件”,也可以说就是苹果 iOS 应用的 ipa 包(iOS 的安装包后缀为 ipa,安卓安装包后缀为apk)。一般二进制文件是由团队中的技术人员打包后上传至 iTC,如果 App 被拒,有一些情况是需要重新提交二进制文件的(如下图)。

001.jpg

002.jpg

  而且苹果在两种拒绝类型中,给开发者回复的拒绝消息的内容也有所不同。

元数据被拒,苹果回复的消息会包含以下内容:

“由于您的元数据被拒绝,您可修改元数据内容后在此处回复我,收到您的回复后,我们会继续审核您的应用。”

二进制被拒,苹果回复的消息会包含以下内容:

“由于您的二进制文件被拒绝,您需要重新修改二进制文件后上传到 iTC 后台,我方收到您的重新提交后,会继续审核您的应用。”

整体回复内容大致一样。区别在于,① 苹果拒绝了你的元数据,你可以修改元数据后直接回复,苹果收到后会继续审核;② 但是拒绝二进制的大多数情况下为 ipa 包本身的问题,例如 ipv6,bug 等等,所以苹果会要求开发者更改应用后重新打包,然后重新提审至 iTC 后台。

二、不同应对方式

被拒之后,开发者面临这两种不同情况,处理方式也有所不同——选择「回复苹果」还是「重新提交」, 才能在最有效的时间让苹果重新审核我们提交的 ipa 包。

元数据被拒:

修改原数据即可,比如标题问题(违反条款 2.3.7),直接修改标题后保存,然后对被拒消息进行回复。这里有回复的模板,大家可借鉴:

尊敬的苹果开发者审核您好;

我方已修正贵方所提出问题,

请重新审核;

诚挚的问候!

修改完元数据之后点击这里回复

003.jpg

  二进制被拒:

二进制被拒也要看被拒原因选择是否重新打包。

比如因为 PLA 1.2,这种情况,有的可以直接在后台回复相关内容即可(比如相关的资质附件);

如果因为包本身的问题,也要看 ipa 包有没有被“写死”。

如果被写死,违规的内容如果不修改 ipa 包就无法更改的话,那就重新打包提审 ;

如果没有写死,或者 IPv6 的问题,我们可以直接在服务端修改,不必修改 ipa 包也不用重新提交,改完服务端的部分就可以直接回复苹果了。

PS:建议大家在产品上线前和技术进行沟通,关于部分内容、特定页面(主要是一些被审查的敏感位置)都可以留有灵活控制的空间,实现不重新打包就可以重新提审,减少“写死”的情况出现。

另外,有些二进制被拒的情况,是否要修改 ipa 包还是要更灵活判断的。比如产品因为 4.3 被拒,只回复苹果、只修改服务端内容往往还是会被拒,最终还要视情况修改 App 本身的视觉和代码等部分。

这里是与苹果沟通时的回复模板,大家可以借鉴

IPv6 等内容的回复:

尊敬的苹果开发者审核;

您好,我方已在服务端修复此问题,

请重新审核;

诚挚的问候

Bug 等内容的回复:

尊敬的苹果开发者审核您好;

我方已修正贵方所提出问题,

请重新审核;

诚挚的问候!

为什么我们要直接回复???

正常情况下,重新提交 ipa 审核会再次进入审核队列,需要排队,因为苹果需要重新安装或者说重走审核流程;而直接回复,苹果会在目前有的问题上,检查问题,然后继续审核。并且回复的内容,会被苹果在 30 分钟至最多 1 天内回复处理;重新提审则需要 1-2 天才会进入审核。

(PS:现苹果审核比较快速,正常情况下1天即会审核,特殊情况除外。但避免不必要麻烦,建议大家后台回复会比较便利。)

苹果近段时间审核基本上是我们当天晚上提交,凌晨都会审核;但最近审核都普遍比较慢,在 2 天到 4 天以至于更多,所以在被拒之后,如果能选择比较便捷的方式直接回复的话,在时间上都是比较节约的。

最后关于一些常见问题:

①二进制被拒情况下,如果不重新提审,而是直接选择构建新版本,是否苹果收到回复后会审核到新的版本?

经测试,回复内容后,苹果会继续审核,但审核人员安装的用来审核的版本,还是旧的版本,并非“构建版本”更换后的“新版本”,且继续进行常规审核流程流程。不出意外的话,还是会回复上一版出现的问题。

 

004.jpg
005.jpg

②二进制or元数据被拒情况下,如果回复了内容,然后又重新提审了,苹果会如何处理?审核时间呢?(这里同样适用于申诉后重新提审的情况)

经测试,回复并重新提审后,会出现 2 个情况:

第一种情况是苹果审核会回复一版内容,大致为“我已收到您提交的审核请求,会继续您提交的新版应用”并且提审的会重新排队,我们需要等待审核;

第二种情况是苹果审核未回复,在最短的时间内重新审核了,结果被拒或者过审(也有回复第一条的内容后,最短的时间内审核的,时间会在 1 天内,或者几小时、几分钟内。)。

最新VIP视频解析网站搭建教程(附源码) - kaixin09o的博客 - CSDN博客

mikel阅读(1596)

ofzb

来源: 最新VIP视频解析网站搭建教程(附源码) – kaixin09o的博客 – CSDN博客

今天交大家搭建一个VIP视频解析网站,另赠送源码,毫无保留的奉献给大家。

这是演示站:www.wuyyb.com

这个VIP视频解析网站可以解析优酷、爱奇艺、腾讯视频、乐视视频等等,要VIP会员才可以看的电视剧、电影。

用此神器看VIP视频不需要花钱,也不需要注册,非常简单好用。

下面我就交大家怎么搭建。

1.首先需要注册域名(随便你在那个域名注册商那里注册都可以,价钱都差不多,我这里就不打广告了。)

2.注册一个虚拟主机,一般100M的主机空间就可以。可以用香港的主机或者国外的主机,因为这些主机是不需要备案的。如果你想备案也可以用国内主机。当然也可以用云主机或者vps服务器(土豪请随意)。

3.下载源码。

源码下载链接:https://pan.baidu.com/s/14BRBEQ6p4jVuw0FAAsplpg  密码:ofzb

4.源码下载好后解压缩,然后用FTP上传到服务器根目录下。(如图)

到这里就差不多了,上传完后浏览自己的域名就可以看到网站了.

附:下图中的两条网址是打开网页自动播放的视频网址,可以根据自己的喜好更换,在index.html更换。
——————— 本文来自 kaixin09o 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/kaixin09o/article/details/79797519?utm_source=copy

iOS应用审核的时隐私政策模板 - xiaobo0134的专栏 - CSDN博客

mikel阅读(1215)

来源: iOS应用审核的时隐私政策模板 – xiaobo0134的专栏 – CSDN博客

隐私政策 

AAA尊重并保护所有使用服务用户的个人隐私权。为了给您提供更准确、更有个性化的服务,AAA会按照本隐私权政策的规定使用和披露您的个人信息。但AAA将以高度的勤勉、审慎义务对待这些信息。除本隐私权政策另有规定外,在未征得您事先许可的情况下,AAA不会将这些信息对外披露或向第三方提供。AAA会不时更新本隐私权政策。 您在同意AAA服务使用协议之时,即视为您已经同意本隐私权政策全部内容。本隐私权政策属于AAA服务使用协议不可分割的一部分。

1. 适用范围

a) 在您注册AAA帐号时,您根据AAA要求提供的个人注册信息;

b) 在您使用AAA网络服务,或访问AAA平台网页时,AAA自动接收并记录的您的浏览器和计算机上的信息,包括但不限于您的IP地址、浏览器的类型、使用的语言、访问日期和时间、软硬件特征信息及您需求的网页记录等数据;

c) AAA通过合法途径从商业伙伴处取得的用户个人数据。

您了解并同意,以下信息不适用本隐私权政策:

a) 您在使用AAA平台提供的搜索服务时输入的关键字信息;

b) AAA收集到的您在AAA发布的有关信息数据,包括但不限于参与活动、成交信息及评价详情;

c) 违反法律规定或违反AAA规则行为及AAA已对您采取的措施。

2. 信息使用

a) AAA不会向任何无关第三方提供、出售、出租、分享或交易您的个人信息,除非事先得到您的许可,或该第三方和AAA(含AAA关联公司)单独或共同为您提供服务,且在该服务结束后,其将被禁止访问包括其以前能够访问的所有这些资料。

b) AAA亦不允许任何第三方以任何手段收集、编辑、出售或者无偿传播您的个人信息。任何AAA平台用户如从事上述活动,一经发现,AAA有权立即终止与该用户的服务协议。

c) 为服务用户的目的,AAA可能通过使用您的个人信息,向您提供您感兴趣的信息,包括但不限于向您发出产品和服务信息,或者与AAA合作伙伴共享信息以便他们向您发送有关其产品和服务的信息(后者需要您的事先同意)。

3. 信息披露

在如下情况下,AAA将依据您的个人意愿或法律的规定全部或部分的披露您的个人信息:

a) 经您事先同意,向第三方披露;

b) 为提供您所要求的产品和服务,而必须和第三方分享您的个人信息;

c) 根据法律的有关规定,或者行政或司法机构的要求,向第三方或者行政、司法机构披露;

d) 如您出现违反中国有关法律、法规或者AAA服务协议或相关规则的情况,需要向第三方披露;

e) 如您是适格的知识产权投诉人并已提起投诉,应被投诉人要求,向被投诉人披露,以便双方处理可能的权利纠纷;

f) 在AAA平台上创建的某一交易中,如交易任何一方履行或部分履行了交易义务并提出信息披露请求的,AAA有权决定向该用户提供其交易对方的联络方式等必要信息,以促成交易的完成或纠纷的解决。

g) 其它AAA根据法律、法规或者网站政策认为合适的披露。

4. 信息存储和交换

AAA收集的有关您的信息和资料将保存在AAA及(或)其关联公司的服务器上,这些信息和资料可能传送至您所在国家、地区或AAA收集信息和资料所在地的境外并在境外被访问、存储和展示。

5. Cookie的使用

a) 在您未拒绝接受cookies的情况下,AAA会在您的计算机上设定或取用cookies

,以便您能登录或使用依赖于cookies的AAA平台服务或功能。AAA使用cookies可为您提供更加周到的个性化服务,包括推广服务。  b) 您有权选择接受或拒绝接受cookies。您可以通过修改浏览器设置的方式拒绝接受cookies。但如果您选择拒绝接受cookies,则您可能无法登录或使用依赖于cookies的AAA网络服务或功能。

c) 通过AAA所设cookies所取得的有关信息,将适用本政策。

6. 信息安全

a) AAA帐号均有安全保护功能,请妥善保管您的用户名及密码信息。AAA将通过对用户密码进行加密等安全措施确保您的信息不丢失,不被滥用和变造。尽管有前述安全措施,但同时也请您注意在信息网络上不存在“完善的安全措施”。

b) 在使用AAA网络服务进行网上交易时,您不可避免的要向交易对方或潜在的交易对方披露自己的个人信息,如联络方式或者邮政地址。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。如您发现自己的个人信息泄密,尤其是AAA用户名及密码发生泄露,请您立即联络AAA客服,以便AAA采取相应措施。

——————— 本文来自 博BOBO 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/xiaobo0134/article/details/82385149?utm_source=copy