日期: 2021 年 3 月 30 日

python下载ts视频文件

python下载ts视频文件

import requests
from multiprocessing import Pool

def mission(url,n):
headers = {“User-Agent”:”Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36″}
print(‘*****’)
response=requests.get(url,headers=headers)
print(‘—–‘)
f=open(“./1/%03d.ts”%n,”wb”)
f.write(response.content)
f.close()
print(“%03d.ts OK…”%n)

if __name__ == “__main__”:
pool=Pool(20)
for n in range(1,38):
url = “https://f1.media.brightcove.com/1/1362235890001/5796758914001/1362235890001_5796758914001_s-{}.ts?pubId=1362235890001&videoId=1655020599001”.format(n)
pool.apply_async(mission,(url,n))
pool.close()
pool.join()
在windows系统下面,直接可以使用:copy/b *.ts video.mp4  把所有ts文件合成一个mp4格式文件

华为云的下一程:与中国SaaS软件开发企业一起“乘风破浪”

%title插图%num

自三年前华为云正式发布以来,整个云计算市场发生了结构性转变:根据中国信通院《云计算白皮书(2020)》,2019年我国公有云规模首次超过了私有云规模,预计到2023年将达到2300亿元规模而届时私有云的规模将为1500亿元。换言之,未来的软件应用模式将以基于公有云的SaaS软件为主,而云计算厂商之争将从IaaS“跑马圈地”上升到争夺SaaS软件开发者生态,特别是争夺SaaS软件开发商。

《云计算白皮书(2020)》指出,2019年以互联网公司为代表的云服务商开始重视SaaS生态建设,但IaaS服务商和SaaS服务商在布局传统企业上云这一市场过程中,均存在一定短板;特别是此前IaaS 服务商虽然也有云市场等模式为SaaS服务商发展提供平台,但缺少深度合作。而作为从华为公司走出来的华为云,从一开始就非常重视与开发者生态的深度连接:2015年,华为发布沃土计划,持续投资在开放能力、平台工具、培训赋能、成果孵化、创新基金五个方面,帮助开发者获得技能、加速创新、持续发展。
%title插图%num

在2020年9月25日华为全联接大会2020第三日主题演讲中,华为云业务总裁郑叶来表示:经过三年的发展,华为云已经汇聚150万全球开发者。也就是说从2017年华为云刚发布时的近乎空白增长到3年后的150万开发者。2019年,华为推出沃土计划2.0,未来5年投资15亿美元发展云与计算开发者。在华为全联接大会2020上,华为云进一步发布了一系列的*简平台、技术使能服务和商业扶持计划,致力成为*佳应用构建平台。

郑叶来在华为全联接大会2020上特别强调,华为云期待首先成为中国软件开发企业值得信赖的伙伴。

从“三不”到“三能”
相比于2017年的华为云,今天的华为云有了什么样的重大变化?郑叶来在华为全联接大会2020上强调,这就是从“三不”到“三能”。也就是从2017年的“上不做应用,下不碰数据,不做股权投资”到今天的“赋能应用、使能数据、做智能世界的黑土地”。从“三不”到“三能”不是简单几个字的改变,郑叶来表示“而是未来三年华为云应该在产业界什么样的地位,应该为产业界贡献什么,这是一次重新思考”。
%title插图%num

从不做什么到能做什么,这在本质上体现了过去三年,华为云在技术形态上从*初的IaaS到如今具有丰富PaaS功能的结构性转变。三年前华为云正式发布,当时有三个初心:*,把华为公司在ICT领域的研发投资以云服务的形式变现;第二,把华为公司30多年积累的各种能力,通过云服务的方式提供给客户;第三,为华为公司自身,包括华为终端云服务、内部IT提供云底座,支撑全球业务发展。

过去三年,这三个初心在持续深化发展。从云服务的数量和类型来看:华为云的服务从2017年底的10大类54个,猛增到今天的210+云服务、210+解决方案;从*初的计算、存储和网络等基础IaaS公有云服务,发展到今天提供1个基于擎天架构的云基础设施底座、3个技术使能服务(应用使能、数据使能、AI使能)、4个面向行业场景化的联接触点(ROMA、DevCloud、IoT、华为云会议),已完成了从IaaS到“IaaS+PaaS”深度整合且面向政企场景的云服务。特别是去年以来陆续把ROMA、WeLink等华为数字化转型的“内功”对外输出,*大增强了华为云的软实力。

郑叶来强调,“云”在本质是软件服务,不是硬件产品,当然硬件将更好发挥软件的性能。而软件能力特别体现在3个使能服务上:AI使能服务即华为云ModelArts,应用使能服务即华为云ROMA,以及数据使能服务即华为云DAYU。值得一提的是,这三大使能服务不仅仅具备强大的软件能力,如今更进一步与行业紧密结合:华为云ModelArts提供了300+行业知识模型,应用使能服务ROMA积累了超过2000个行业应用资产,数据使能服务DAYU已上线200+行业通用数据资产模型。例如,华为云与西北空管局一起,建设了空管数据资产模型,帮助开发人员制定*佳的管制指挥方案,大幅减少了航班延误。

简而言之,今天的华为云已经成为行业数字化转型的“底座”,已经可以垂直打通和整合行业数字化转型所需的技术、数据和行业知识栈,接下来就是为行业和商业开发者提供更好的工具、平台和商业变现,让行业和商业开发者真正打开行业数字化转型的空间。

布局行业应用开发者
整个2020年,华为云与计算的一大主题就是开发者,特别是行业与商业开发者。在今年3月华为开发者大会2020(Cloud)上,华为云与计算BG总裁侯金龙就表示,IT产业本质是一个生态型产业,华为在IT产业中聚焦底层的算力、IT基础设施和云平台,而面向各个行业解决客户问题还需要很多的应用和软件,这就需要大量的开发者为各个行业、各个业务场景开发不同的软件适配。
%title插图%num

华为在去年推出了沃土计划2.0,而在今年3月的开发者大会上进一步宣布2020年将投入2亿美元。在华为全联接大会2020上,华为云进一步抛出了技术与商业变现方面的扶持。在技术工具方面,华为云为开发者提供全流程*简开发工具,通过提供1个通用工具平台和多个热点场景的工具套件,支持 Full Code和Low code/No code多种开发模式,开发效率可提升10倍。例如,利用低代码开发服务ROMA AppCube可以帮助开发者快速构建城市IOC管理中心。

在商业变现方面,华为云进一步通过两大应用分发平台,加速商业价值转化:华为云Marketplace和华为应用市场AppGallery两大应用分发平台,提供强大的应用分发能力和商业扶持计划,让开发者可以获得丰富的云资源和流量。例如,厦门卡伦特是一家成立不久的在线CAD软件提供商,2019年初开始对外提供服务,在华为云Marketplace上,短短一年销售业绩增长6倍,销售额迅速突破千万。

经过两年的发展,华为云Marketplace年交易额超过10亿元,订单数量超过10万,超过30个伙伴的销售额已经超过1000万。如今,华为云又推出了 SaaS应用扶持计划,首批扶持1000个SaaS应用,每个应用可获得*高20万元的云资源。此外,华为云联合AppGallery Connect,为集成HMS Core且上架AppGallery的创新应用提供更多技术及资源支持,推出华为云HMS生态扶持计划,首批提供5亿元的云资源,重点扶持1500个HMS应用,在商用阶段,每个应用还将获得*高120万元的广告资源扶持。

激活行业AI应用“头雁”效应
AI应用是当前所有SaaS应用和企业应用中*具活动力的应用类型,可以说在政企数字化转型中具有“头雁”效应。而行业AI开发者,主要指具备行业知识与沉淀的行业开发者,将AI应用于解决具体的行业问题。

郑叶来在华为全联接大会2020上强调,AI进入生产系统才能发挥更大价值。2018年9月全联接大会,华为云在上海发布了ModelArts,为开发者提供一站式的AI开发平台。截止华为全联接大会2020,华为云在10多个行业成功交付了600多个AI项目,ModelArts得到了广泛的应用。ModelArts在行业AI中发挥了重要价值。比如在一个铁路项目中,全车故障类型600多种,大部分故障的数据样本小于10个,数据量非常小,而基于华为云ModelArts目前已经实现重大故障的识别准确率100%,轻微故障的识别准确率98%。

华为云AI首席科学家田奇在华为全联接大会2020上介绍,华为云长期扎根AI基础技术研究,覆盖计算机视觉、语音语义和决策优化三大领域,聚焦于模型高效、数据高效、算力高效、知识高效4大方向,提出了六大基础研究计划——面向大模型的模型摸高计划、面向小模型的模型瘦身计划、面向多模态学习的数据魔方计划、面向小样本学习的数据冰山计划、面向通用知识抽取的万物预视计划和面向新学习范式的虚实合一计划。而许多研究成果,包括自动机器学习、小样本学习、联邦学习、预训练模型等,能够即插即用地部署于ModelArts使能平台,从而赋能千行百业。

%title插图%num

郑叶来在华为全联接大会2020期间发布了ModelArts 3.0,融合骨干模型、联邦学习、模型智能评估与诊断、高性能AI计算四大特性,加速行业AI落地。田奇强调,ModelArts 3.0是面向AI在行业落地提供的AI开发平台。田奇及其团队主要是从技术领域进行探索和研究,如何通过AI技术高效解决行业挑战。例如如何用*少数据训练出高精度模型、如何降低企业应用AI的门槛、如何解决企业对数据安全使用的顾虑等等。*终的结果,就是将骨干模型、联邦学习、高效算力和智能诊断评估优化等,融入了ModelArts 3.0。

所谓骨干模型,指的是基于行业小样本数据训练高精度模型,提供了AI开发的新范式。以医疗影像分割为例,过去需要成百上千例标注数据才能进行的训练,现在有了EI-Backbone,只需要几十例甚至十几例标注数据即可完成,节省标注成本90%以上。

在联邦学习方面,华为云还提供云边协同的服务,支持不同地点、不同客户的数据进行联邦训练,通过加密方式上传服务端,对全局模型进行更新,再将其下发至边缘设备,便捷支持同业态的横向联邦和跨业态的纵向联邦学习。

而为了更好地支持超大算力需求的AI研发,华为ModelArts平台在集群规模,任务数量,以及分布式训练都做了针对性的优化。例如,ModelArts平台能够管理上万的节点,更好的支持大型训练任务需求;通过优化服务框架,ModelArts平台支持10万级别的作业同时运行等等。

值得一提的是,除了骨干模型、联邦学习、高效算力和智能诊断评估优化等落地行业AI所需的关键技术外,ModerArts 3.0还在决策智能方面依托运筹优化、强化学习、智能控制等算法,构建起完整的决策底座,让AI真正实现感知-认知-决策的智能闭环,目前ModelArts驱动的决策引擎已经应用于机位分配、工业制造、智能交通、游戏娱乐等领域。

整体来说:华为云正在充分发挥过去三年所建设的“IaaS+PaaS+行业知识”所形成的“智能世界黑土地”,结合顶尖的AI研究成果并将之落地到华为云平台中,通过*简开发工具和成熟的商业变现途径,帮助广大行业和商业SaaS软件开发者,在疫情后数字化转型的新一波涨潮中“乘风破浪”,打开中国政企从数字化到数智化转型的升维空间。(文/宁川)
————————————————

原文链接:https://blog.csdn.net/achuan2015/article/details/108831906

能详细地设置 APP 权限的办法

举个例子,miui 能设置一个 APP“访问已安装的 app”的权限,但是氢 OS 就不行。
有没有办法,比如用 edxposed 或者 magisk 的模块,能够做到详细的设置一个 app 里面所有的权限?

8 条回复  •  2021-03-15 23:42:00 +08:00    
1 loli   15 天前 通用的权限用 app ops 访问已安装的 app 是 miui 魔改的,所以其他的 rom 不能用 app ops 实现 如果没有可以试试 xposed 模块 XPrivacy    
2 honeycomb   15 天前 via Android 原生 Android 的 appops 没有做这个能力,厂商自行的扩展可能会开出新功能。 此外 appops 的*大多数能力并不对外开放,那个叫“appops”的应用也是想了不少办法才能良好工作的    
3 jim9606   15 天前 需要注意 MIUI 中的“访问已安装的应用列表”、“设置媒体音量”、“读写剪贴板”都是 MIUI 自创的权限项,APP 无法感知是否授权、也无法通过 Manifest 声明是否需要这个权限,因此这几个权限所有 APP 默认都是允许的。    
4 Cielsky   15 天前 权限狗    
5 Yadomin   15 天前 安卓 11 有这个权限 `QUERY_ALL_PACKAGES`,但是没有办法控制 (    
6 benedict00   15 天前 via Android thanox    
7 ikas   14 天前 通过 AppOps 你可以控制*大部分权限,但是如果你是安卓 10 以上,这个方法目前很蛋疼,因为系统会自动修改 AppOps 状态,如果你说的控制 访问已安装的 app,你需要自己 hook 系统,或者修改系统代码实现,比如 XPrivacyLua,其可以控制 app 访问    
8 ikas   14 天前 使用 Appops 与权限来设置应用详细的权限 imgur 点 com/BG2M4DU

iPhone 检测 iPhone X 设备的几种方式和分辨率终*指南

文章目录

    • iPhone 屏幕分辨率终*指南
    • 适配新的 iPhone X 设备
    • 检测 iPhone X/XS/XR 设备的几种方式
        • 方式一:通过获取设备的 device model 来判断
        • 方式二:通过获取屏幕的宽高来判断
        • 方式三:通过底部安全区域的高度来判断
        • 方式四:通过是否支持 FaceID 判断
        • 方式五:通过 UIStatusBar 的高度判断
    • 结语
    • 原文链接
    • 参考连接本文是我们前两天发的两条小集的汇总,主要包括三部分:
      1. iPhone 屏幕分辨率总结
      2. 如何适配新的 iPhone X 设备
      3. 检测设备是否为 iPhone X/XS/XR 的几种方式

      iPhone 屏幕分辨率终*指南

      上周,苹果发布了三款新的 iPhone 设备,它们的屏幕数据分别如下:

      1. iPhone XS: 5.8 英寸,375pt * 812pt (@3x);
      2. iPhone XR: 6.1 英寸,414pt * 896pt (@2x);
      3. iPhone XS Max: 6.5 英寸,414pt * 896pt (@3x);

      在国外的 PaintCode 网站上,有一篇文章《The Ultimate Guide To iPhone Resolutions》整理了包括从*代 iPhone 到*新发布的 iPhone XS Max 等所有 iPhone 设备的屏幕数据,包括:开发尺寸(points)、物理尺寸(pixels)以及实际渲染像素、1倍/2倍/3倍模式等,如图 1 所示(建议大图查看更加清晰)。%title插图%num

    •  

      从图中数据我们可以总结以下几点:

      1. 5.8 英寸的 iPhone X/XS 与 6.1 英寸的 iPhone XR 和 6.5 英寸的 iPhone XS Max 的屏幕宽高比是一致的,约为 0.462;
      2. iPhone X/XS 的屏幕宽度(开发尺寸)与 4.7 英寸的 iPhone 8 相同,都为 375pt,只是在高度上增加了
        145pt;
      3. iPhone XR 和 iPhone XS Max 的屏幕宽度(开发尺寸)与 5.5 英寸 iPhone 8 Plus 相同,都为
        414pt,只是在高度上增加了 160pt;

      因此,设计师在出图时,仍然可以以 iPhone 8 和 iPhone 8 Plus 的屏幕宽度为基准分别进行 UI 布局,而对于不同高度的屏幕只要在纵向上进行内容延伸即可。


      适配新的 iPhone X 设备

      此外,我们发现,对于未进行新屏幕尺寸适配的工程,直接编译,在新设备 iPhone XR 和 iPhone XS Max 上运行,它们是以放大模式自动适配的(以 5.8 寸的 iPhone X 屏幕为基准等比例放大),此时在代码中获取到的屏幕宽高都为 375pt * 812pt。

      那么如何正确适配新的屏幕尺寸呢?

      1. 如果你的工程是以 LaunchScreen.storyboard 作为启动页,则只需要在 Xcode 10 下重新编译工程即可;
      2. 如果你的工程是通过配置 Assets.xcassets 里的 LaunchImage 不同尺寸的启动图片作为启动页,则你需要新增两张
        828px * 1792px 和 1242px * 2688px 分辨率的图片,如图 2 所示。
        %title插图%num

      检测 iPhone X/XS/XR 设备的几种方式

      *后,我们如何在代码中判断当前设备是否为 iPhone X 呢?

      备注:这里所说的 iPhone X 泛指上述介绍的屏幕大小为 5.8、6.1、6.5 英寸三种尺寸,且带有顶部刘海和底部操作条的 iPhone 设备。

      一开始我们采用了一种比较简便的方法:通过获取屏幕的高度,判断是否等于 812.0 或 896.0,代码如图 3 所示。
      %title插图%num

      但该方法存在小瑕疵,需要考虑一下两点:

      1. 当 App 支持横竖屏切换时,在横屏模式下也能够正确判断;
      2. 在模拟器中调试时,能够正确判断当前所选则的模拟器类型是不是 iPhone X;

      因此,我们重新整理一下目前所了解到的几种检测设备是否为 iPhone X 的方式,供大家参考,不足之处欢迎补充。

      方式一:通过获取设备的 device model 来判断

      每一台 iOS 设备都有对应的硬件编码/标识符,称为 device model 或者叫 machine name,我们可以通过如下两种方法来获取 device model/machine name。
      %title插图%num

      例如,去年发布的*代 iPhone X 对应的 device mode 为 iPhone10,3 和 iPhone10,6,而今年*新发布 iPhone XS 对应 iPhone11,2,iPhone XS Max 对应 iPhone11,4 和 iPhone11,6,iPhone XR 对应 iPhone11,8,完整的 device mode 数据参考这里:

      • https://www.theiphonewiki.com/wiki/Models

      不过需要注意的是,上述两种获取 device model 的方法在模拟器中运行得到的值为 i386 或 x86_64,因此在模拟器中我们可以通过如下方式正确获取模拟器所对应的 device model:

      // 获取模拟器所对应的 device model
      NSString *model = NSProcessInfo.processInfo.environment[@"SIMULATOR_MODEL_IDENTIFIER"];
      

      综上,我们可以通过判断 device model 是否为 “iPhone10,3” 和 “iPhone10,6” 或者以 “iPhone11,”(新设备)开头,来检测设备是否为 iPhone X,完整代码如下:%title插图%num

    •  

      %title插图%num方式二:通过获取屏幕的宽高来判断

      正如我们前面讲到,目前 iPhone X 设备的屏幕宽高对应的开发尺寸只有两种,分别为 375pt * 812pt 和 414pt * 896pt,因此我们可以根据屏幕的高度来判断设备是否为 iPhone X。但是此时需要考虑设备处于横屏或者竖屏的情况,这两种情况的宽高刚好是相反的(当然,如果你的 App 不用支持横屏的情况,就相对比较简单了)。

      在 UIDevice 中提供了一个 orientation 属性用于获取设备的方向(横向、竖向、或者水平),一开始我们想着先通过这个属性判断设备处于横屏或者竖屏,然后分别取其对应的屏幕宽度(横屏下)或者高度(竖屏下)来判断,但是当这个属性的值为 FaceUp 或者 FaceDown(即设备放在水平面上),我们是无法知道此时设备是处于横屏还是竖屏的。

      后面我们想了一个简便的方法,即获取屏幕的宽度和高度,取较大一方进行比较是等于 812.0 或 896.0,代码如下:
      %title插图%num

      方式三:通过底部安全区域的高度来判断

      在去年 iPhone X 发布后,为了适配顶部的浏览和底部的操作条,苹果在 iOS 11 上引入安全区域概念,建议开发者在安全区域内进行 UI 布局,因此我们可以获取屏幕 keyWindow 的 safeAreaInsets 值来判断设备是否 iPhone X。

      iPhone X 在竖屏下,keyWindow 的 safeAreaInsets 值为:

      {top: 44, left: 0, bottom: 34, right: 0}
      

      而在横屏下,其值为:

      {top: 0, left: 44, bottom: 21, right: 44}
      

      因此,我们可以比较 safeAreaInsets 的 bottom 是否等于 34.0 或者 21.0 来判断设备是否为 iPhone X,因为其他设备对应的 bottom 横竖屏下都为 0,代码如下:
      %title插图%num

      不过该方式有个不足是,必须在 AppDelegate 的 didFinishLaunchingWithOptions 回调中等 keyWindow 初始化之后才能正确判断。

      方式四:通过是否支持 FaceID 判断

      由于目前只有 iPhone X 设备支持 FaceID,因此我们也可以通过判断设备是否支持 FaceID 来判断,代码如下:%title插图%num不足:如果用户禁用 canEvaluatePolicy:error: 方法的使用将无法正确判断,而且在也不适用于模拟器中的判断。

      方式五:通过 UIStatusBar 的高度判断

      在 iPhone X 之前,所有 iPhone 设备的 StatusBar(状态栏)高度都为 20pt,而 iPhone X 的为 44pt,因此我们可以通过获取状态栏的高度判断是否等于 44.0 来检测设备是否为 iPhone X,代码如下:
      %title插图%num

      不足:该方法只适用于竖屏且显示状态栏的情况下才能正确检测,而在横屏模式下,或者 App 隐藏导航栏时,获取到的状态栏高度都为 0(statusBarFrame 的值为 CGRectZero),就无法判断了。

      你是否有其他判断方式呢?欢迎补充~


      结语

      *后,*大部分场景,我们需要检测设备是否为 iPhone X 是为了适配顶部的刘海区域和底部的操作条区域,但是这里我们更推荐通过 Auto Layout 结合 Safe Area 进行 UI 布局,以适应越来越复杂的屏幕状况。

iOS 开发之 In-App Purchase 对接教程 (一)

很久之前就想出一篇IOS内付费的教程,但是一查网上的教程实在太多了,有的写得真的蛮不错的,就心想算了,于是就保存在草稿箱了。至于为什么写完它呢!真是说来话长,*近公司有个项目经理跑来问我有关苹果内付费相关的细节,跟他聊了半天,从项目对接苹果官方支付接口聊到了如何查看App收益,*后终于使他有了一些眉目,但是悲催的是还要我继续去跟他们项目的程序员讲解(真是疯了),所以我就决定给他们项目写一个内购的文档,所以我顺便把这篇博客完成吧!

 

首先进入苹果的ItunesConnection(https://itunesconnect.apple.com)点击左上角的加号新建一个App应用,点击后该网站会弹出一个信息编辑框,大家只要将上面的信息填充完毕点击save即可在苹果的app平台上拥有一个属于自己的App。

%title插图%num

在套装ID的上,需要提前为该App申请一个AppID以及BundleID,只要是申请成功了就会在选择列表中显示出来。如果有人有疑问如何申请,请看我之前那一篇推送的博客,里面有详细的步骤。

这里顺便多说一句这个ItunesConnect是用来干嘛的,它是苹果公司给个人或企业提供管理自己App的一个平台。在这个平台上开发者可以新建,删除和管理自己的App应用,开发者可以根据需求对App应用进行上架与下架,编辑App信息,生成测试app所需的信息,例如账号,邀请码等,还有就是我们今天要讲的内付费功能。当然啦,他的功能可不止我讲的这些,我大致说一下这个平台的作用,如果你经常跟它打交道的话就会慢慢熟悉了。

 

接下来,我就来为大家演示一下如何添加付费道具,首先打开iTunesConnect,显示如下页面:

%title插图%num

选择红圈所圈起来的选项,然后将里面的相关信息补充完毕,如果缺少这一步,内购功能是不会成功的。

假如你已经完成了上述相关银行账户的设置,就点击你的App,选择上面标题栏中的”App 内购买项目”

%title插图%num

随后点击左上角的 “create new”选项,如下图所示,进入到下一个界面:

%title插图%num

 

这个界面是让你选择消费道具的种类,现在改版的网站是有简体中文翻译的,所以不像以前打开一看都不知道选哪一个,甚至都不知道每个代表的什么意思(比如我*次遇到的时候,在领导面前真是囧)。它的种类分为如下几种:

%title插图%num

 

一般对项目来说大多数都是选择“消耗型项目”这个种类,比如游戏中购买金币,宝石balabala~之类的,选中之后就会到这个界面中来:

%title插图%num

在上图所示的编辑框中输入,商品名称,产品ID以及价格等级,在这边说明一下:

1.商品名称根据你的消费道具的实际意义来说明,比如“100颗宝石”,“100金币”等。

2.产品ID是比较重要的,由项目自定义,只要唯一即可,像我一般都是用App的bundleID加一个后缀来表示,这样既跟项目关联又具有唯一性。

3.价格等级的话“查看价格表”中有对应的说明,可以对照着表中每个国家的货币价格与等级来选择。

 

我们继续,在这个网页的接下来部分如图所示:

%title插图%num

选择添加语言选项,弹出一个编辑页面:

%title插图%num

点击save保存,则会在界面上显示成如下:

%title插图%num

*后一步就是点击“选取文件”提交一张苹果它指定像素(640*920)的商品图片,当他上传完毕后点击“save”按钮,我们这第二部分就大工告成了。提交的商品*后会在内购的页面上显示为如图:

%title插图%num

这个图是我在已经发布的app上面截取的,添加了3个商品,已经是通过的的状态了(显示绿色),当您刚提交的时候,因为通过苹果的审查需要一段时间所以会显示黄色的等待状态,所以不必担心是不是商品编辑错了。如图:

%title插图%num

这部分,我主要给大家演示一下,如何申请测试账号,利用苹果的沙盒测试环境来模拟AppStore的购买流程。

在ItunesConnect中选择“用户和职能”选项~

%title插图%num

随后在左上角的选项中选择沙盒测试者,点击左上角的加号图标增加一位测试者,如图:

%title插图%num

编辑好相应的内容,点击保存,就创建了一个测试账号,是不是很简单啊!当然这个账号如果你忘记了密码可以重新生成一个,无关紧要。

顺带多句嘴,不要在正式的appstore上面用沙盒测试的账号来登录,千万要牢记在心,此账号只用于测试环境下~

 

接下来就是代码部分啦~

1.首先在项目工程中加入“storekit.framework”,加入头文件#import <StoreKit/StoreKit.h>

2.在.h文件中加入“SKPaymentTransactionObserver,SKProductsRequestDelegate”监听机制

下面贴上内购的核心代码,就几个函数,我在这边就不在做更多详细的解释了,各位看官可以运行跑一下就一目了然了。

.h文件

 

//
// PaymentViewController.h
// IAPPayTest
//
// Created by silicon on 14-10-28.
// Copyright (c) 2014年 silicon. All rights reserved.
//

#import <UIKit/UIKit.h>

#import <StoreKit/StoreKit.h>

@interface PaymentViewController : UIViewController<SKPaymentTransactionObserver,SKProductsRequestDelegate>

@property (strong, nonatomic) IBOutlet UITextField *productID;

@property (strong, nonatomic) IBOutlet UIButton *purchase;

– (IBAction)purchaseFunc:(id)sender;

@end
.m文件

 

 

//
// PaymentViewController.m
// IAPPayTest
//
// Created by silicon on 14-10-28.
// Copyright (c) 2014年 silicon. All rights reserved.
//

#import “PaymentViewController.h”

@interface PaymentViewController ()

@end

@implementation PaymentViewController

– (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}

– (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.

[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
self.productID.text = @”com.games.ztyxs.product_point.1″;
}

– (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

– (IBAction)purchaseFunc:(id)sender {
NSString *product = self.productID.text;
if([SKPaymentQueue canMakePayments]){
[self requestProductData:product];
}else{
NSLog(@”不允许程序内付费”);
}
}

//请求商品
– (void)requestProductData:(NSString *)type{
NSLog(@”————-请求对应的产品信息—————-“);
NSArray *product = [[NSArray alloc] initWithObjects:type, nil];

NSSet *nsset = [NSSet setWithArray:product];
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
request.delegate = self;
[request start];

}

//收到产品返回信息
– (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{

NSLog(@”————–收到产品反馈消息———————“);
NSArray *product = response.products;
if([product count] == 0){
NSLog(@”————–没有商品——————“);
return;
}

NSLog(@”productID:%@”, response.invalidProductIdentifiers);
NSLog(@”产品付费数量:%d”,[product count]);

SKProduct *p = nil;
for (SKProduct *pro in product) {
NSLog(@”%@”, [pro description]);
NSLog(@”%@”, [pro localizedTitle]);
NSLog(@”%@”, [pro localizedDescription]);
NSLog(@”%@”, [pro price]);
NSLog(@”%@”, [pro productIdentifier]);

if([pro.productIdentifier isEqualToString:self.productID.text]){
p = pro;
}
}

SKPayment *payment = [SKPayment paymentWithProduct:p];

NSLog(@”发送购买请求”);
[[SKPaymentQueue defaultQueue] addPayment:payment];
}

//请求失败
– (void)request:(SKRequest *)request didFailWithError:(NSError *)error{
NSLog(@”——————错误—————–:%@”, error);
}

– (void)requestDidFinish:(SKRequest *)request{
NSLog(@”————反馈信息结束—————–“);
}

//监听购买结果
– (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction{
for(SKPaymentTransaction *tran in transaction){

switch (tran.transactionState) {
case SKPaymentTransactionStatePurchased:
NSLog(@”交易完成”);

break;
case SKPaymentTransactionStatePurchasing:
NSLog(@”商品添加进列表”);

break;
case SKPaymentTransactionStateRestored:
NSLog(@”已经购买过商品”);

break;
case SKPaymentTransactionStateFailed:
NSLog(@”交易失败”);

break;
default:
break;
}
}
}

//交易结束
– (void)completeTransaction:(SKPaymentTransaction *)transaction{
NSLog(@”交易结束”);

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}

– (void)dealloc{
[[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
[super dealloc];
}

@end
代码就这么多,到这边我们的IOS内购教程就接近尾声了,在测试的时候还有几点因素要注意一下:

 

1.沙盒环境测试appStore内购流程的时候,请使用没越狱的设备。

2.请务必使用真机来测试,一切以真机为准。

3.项目的Bundle identifier需要与您申请AppID时填写的bundleID一致,不然会无法请求到商品信息。

讲了这么多,附上几张测试截屏给大家展示一下:

请求商品时的打印日志:

%title插图%num

交易成功后:

%title插图%num

手机截屏:

要求输入AppStore帐密,使用测试生成的即可:

%title插图%num

确定购买:

%title插图%num

交易完成:

%title插图%num

当我们的交易完成后还要去appstore 上面去验证票据信息是否正确,这样我们才可以给玩家发放道具,apple官方文档:

//交易结束
– (void)completeTransaction:(SKPaymentTransaction *)transaction{
NSLog(@”交易结束”);
//交易验证
NSURL *recepitURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:recepitURL];

if(!receipt){

}

NSError *error;
NSDictionary *requestContents = @{
@”receipt-data”: [receipt base64EncodedStringWithOptions:0]
};
NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents
options:0
error:&error];

if (!requestData) { /* … Handle error … */ }

//In the test environment, use https://sandbox.itunes.apple.com/verifyReceipt
//In the real environment, use https://buy.itunes.apple.com/verifyReceipt
// Create a POST request with the receipt data.
NSURL *storeURL = [NSURL URLWithString:@”https://buy.itunes.apple.com/verifyReceipt”];
NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL];
[storeRequest setHTTPMethod:@”POST”];
[storeRequest setHTTPBody:requestData];

// Make a connection to the iTunes Store on a background queue.
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:storeRequest queue:queue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (connectionError) {
/* … Handle error … */
} else {
NSError *error;
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
if (!jsonResponse) { /* … Handle error …*/ }
/* … Send a response back to the device … */
//Parse the Response
}
}];

[[SKPaymentQueue defaultQueue] finishTransaction:transaction];
}
好了,所有的内购流程基本上讲完了,原谅我在图片上的涂抹,因为关系到产品的敏感词汇所以希望大家能够不介意。赶这篇博客的时间比较匆忙,如果有童鞋还有什么疑问或者我写的那个地方不对欢迎私信我或者评论,我会在*时间回复。谢谢~

有无可以强制 sim 卡不漫游的小工具?

边境上,所在国的信号没有隔壁国的信号好,然后就时不时漫游到别国网络去了,这个时候电话都不能接,巨贵。

这边的卡是默认全球漫游的,自助服务里面找不到关闭的开关。运营商的服务不是用的英语。

xposed 有个 Roaming Control, *后更新是 17 年,实测无用…

还有啥神奇的小工具可以试试吗??

51 条回复  •  2021-03-16 08:53:54 +08:00

1 alfchin   15 天前 via Android   1 手动选择运营商?

2 locoz   15 天前 via Android   1 试试那些锁频工具?可以锁定使用某一个基站。

3 JensenQian   15 天前   1 两家运营商的网络频段一样吗,直接锁频段

4 JensenQian   15 天前   1 某米的机子自带这个,不过要用创建快捷方式才能弄出来

5 cathedrel   15 天前 @alfchin 选了,竟然无效,选过还是漫游,十次里面不到一次能如愿转回来,而且你试过就知道,这样操作一次基本就是在傻等…

6 cathedrel   15 天前 @locoz @JensenQian 谢谢大佬们,这样的工具给个名字?

7 JensenQian   15 天前   1 @cathedrel #6 你机子是啥 你先确定下你本地和漫游过去运营商的频段,软件可以试下,这几个 https://play.google.com/store/apps/details?id=com.qtrun.QuickTest 这个要 root 的 不 root 我找到个信通院出的,叫泰尔网测。里面有基站信号测试的,你确定下是啥频段,两边确定下 https://www.frequencycheck.com/这个网站可以查全球运营商的频段的

8 JensenQian   15 天前   1 @cathedrel #6 锁频段的话各家有各家的办法的,也不知道你手机是哪家的,具体各家怎么样的话你去酷安搜下就有

9 txydhr   15 天前 还是国内方便,运营商 app 随时打开关闭国漫

10 cathedrel   15 天前 @JensenQian 谢谢大佬。我手机硬件是米家的,rom 是 PE

11 cathedrel   15 天前   1 @txydhr 我一点都不羡慕不自由的国内,外面也不是不方便,只是人家官方服务的语言不是英语而以

12 JensenQian   15 天前   1 @cathedrel #10 r 看下这个,反正这 3 种 https://www.bilibili.com/read/cv7559527/ 小米的话 miui 可以不 root 的锁,你刷了 PE 我真的不知道怎么锁,既然都刷 PE 了应该都 root 了吧,直接用网络信号大师锁

13 JensenQian   15 天前   1 锁了频段有个缺点,就是你那边如果 4G 覆盖不好的话,可能没法接电话,记得 volte 打开

14 LOVOQ   15 天前 *简单的方法 把国漫功能整体关掉 ///

15 cathedrel   15 天前 @JensenQian 我装了 Network Signal Guru,但是打开后它并不工作,请求了 root 权限后它说”非高通基带或者驱动未启用“,这可怎么办?? 另外,frequencycheck.com 这个网站的内容比较少,我查看的这家运营商它只显示了 GSM 和 UMTS 两个频段,但实际上人家的 LTE+都上马了

16 doresu   15 天前 楼主在哪国啊啊啊

17 honeycomb   15 天前 via Android @cathedrel 这个应用只能在 qualcomm 芯片组的手机上跑

18 cathedrel   15 天前   1 @honeycomb 我这个红米手机就是高通芯片啊。我手上几个手机就没有联发科的

19 JensenQian   15 天前 @cathedrel #15 这。。。。 运营商的话你查下当地的运营商的官网吧

20 JensenQian   15 天前 @JensenQian #19 piexl 的话你试下工程模式或者直接酷安下个创建快捷方式搜 band 然后看看吧

21 484A4B   15 天前   1 自首吧

22 JensenQian   15 天前 @cathedrel #15 Network Signal Guru+小米手机刷 Pixel Experience 没法运行的我在 xda 上找到的贴子,你可以看下 https://forum.xda-developers.com/t/network-signal-guru-not-working.3898545/

23 JensenQian   15 天前   1 @JensenQian #22 https://forum.xda-developers.com/t/network-signal-guru.4005511/

24 woyaojizhu8   15 天前 我见过的所有手机设置里都有漫游开关啊,那个没用的吗

25 JensenQian   15 天前 @JensenQian #23 要么你换个软件锁,类似的软件好多了,或者刷回 miui

26 divilkcvf   15 天前 @woyaojizhu8 那个似乎仅仅针对蜂窝数据有效,语音电话是都能打通的

27 Lemeng   15 天前 什么手机,小米的试过。其他的不知道

28 Chengx3   15 天前 @woyaojizhu8 那个开关只能控制移动数据,至少我的 realme 是这样,该漫游照样会漫游,不开那个开关只是不能上网。

29 genkin   15 天前 锁定不了运营商可能是系统 bug,建议刷机换 rom

30 cathedrel   15 天前 @JensenQian 创建快捷方式我试过了,不幸的是:搜索 band 或者 roaming 都没有任何结果,看来我这个 ROM 有问题,又要折腾刷机了…

31 txydhr   15 天前 via iPhone @cathedrel 没有国漫关闭自由

32 JensenQian   15 天前   1 @cathedrel #30 那就换呗,实在不行换回 miui,eu 的 miui 试下

33 cathedrel   15 天前 @JensenQian 亲,我跟 miui 这种隐私之敌有不共戴天之仇,要换只换开源 rom,*对不会换回 miui 的

34 JensenQian   15 天前 via Android @cathedrel https://i.loli.net/2021/03/15/gYXGzv3NwSHiR4Q.jpg 这圈起来的 3 个都勾上了再搜

35 cathedrel   15 天前 @JensenQian 都勾上了,搜 band 出来一个结果,但是运行出来的界面似乎是完全无用的: i.loli.net/2021/03/15/fnEXeoWcyDbLiJz.png

36 JensenQian   15 天前 via Android @cathedrel 那估计不行了,你只能换个包,或者机换个别的软件试下吧

37 FucUrFrd   15 天前 via Android 柬埔寨 电信诈骗 罪案

38 ysc3839   15 天前 这需求不需要锁频段吧?而且锁频段也不一定可行。手机一般都有选择运营商的功能,手动选择你使用的运营商不行吗?

39 emeab   15 天前 没有国漫关闭自由

40 codingadog   15 天前 via Android 楼主是干啥的?

41 jfdnet   15 天前 不能找运营商关闭漫游功能?不关就拒付漫游费用啊。这应该很合理啊。

42 marcong95   15 天前 拿着个 Google Translate 到营业厅怎么着也能把国际漫游关掉吧,“没有自由”党连基本的国外生存技能都没么。。。

43 AirShark   15 天前 via Android @jfdnet 关了也没用,会变成网络注册失败。

44 jfdnet   15 天前 @AirShark 那网络注册失败就是信号不好呗。那你用这边推荐的办法,锁频也好什么也好,也解决不了你的问题啊。就是没信号啊。如果信号没问题注册不上,你不是一样可以找运营商么?

45 cathedrel   14 天前 @ysc3839 在我这个手机上,手动选择运营商真的没用,可能确实是 rom 有点问题 @JensenQian @jfdnet 现在解决了,昨晚临睡前在运营商官网上找了个发邮件的入口用英文发送了 roaming 功能的问题,今天醒来手机已经不漫游了,邮箱里面没有他们的回复,估计他们的英文水平写东西觉得累就没给我回复了。反正解决了问题就好 @marcong95 @emeab @txydhr 祝你们生生世世享受国漫关闭自由

46 marcong95   14 天前 @cathedrel #45 我对国际漫游关闭自由没有需求,只是想好奇你们张口自由闭口隐私的连国外生活的基本技能(例如本地语言、翻译软件等)都没有的吗?个人而言只是不太爽你们(包括但不限于你、以及你把我 @在一起的那些国际漫游关闭自由的)什么奇奇怪怪的东西都能往政治上靠。

47 emeab   14 天前 15 天前 还在找$$配置 今天就一键转生国外自由人了?

48 cathedrel   14 天前 @emeab 在中国之外你就不要保护隐私了? @marcong95 你理解“懒”这个字吗?如果可以在家里敲敲键盘或者打打电话就能解决问题的话,为什么还要跑出门呢?

49 spacezip   14 天前 高通 root cellular pro 锁网 锁频段 锁小区 锁频点。。。。

50 txydhr   14 天前 via iPhone @emeab @marcong95 他自己先把话题带跑偏的。估计楼主是搞了张对面国手机卡,不想漫游到国内运营商。

51 jfdnet   14 天前 @cathedrel @emeab $$或者类似的技术之所以被称为透明代理,也就意味着它(它们)提供不了隐私保护的能力。楼主要是有这方面的需求,可得小心。

PHPWAMP配置应该如何修改,Web服务器、php、mysql的具体配置修改

phpwamp支持Nginx、apache、iis(均为完整版更稳定)

默认集成了多个php版本,包含TS与NTS,(支持自定义php版本)

Mysql默认集成了mysql5.5、mysql5.6、mysql7(支持自定义Mysql版本)

今天我们来详细讲解PHPWAMP的配置修改方式

1、修改Apache、Nginx服务器的配置,如下图,可以点击相关设置,修改服务器配置

(友情提示,nginx、apache、iis的配置也可以在站点管理里面的右键菜单修改)

%title插图%num

2、PHPWAMP主界面切换的php版本是默认站点的版本,修改默认站点的PHP配置可点击相关设置,修改PHP配置站点管理里面的php版本并非是修改此处,站点管理的php配置请在站点管理里面修改(默认集成的PHP包含ts与nts)

(注意:主界面的php版本和站点管理里面的并不相同,主界面默认站点的6个php版本是安全线程的,并且采用的是模块运行方式,而站点管理里面的php版本采用的是非安全线程,属于FCGI运行模式)

%title插图%num

3、*方便的当然是直接右键站点管理修改配置了,右键点击站点可以修改对应的php与Web服务器的配置

(注意:站点管理里面的php5.2、php5.3、php5.4、php5.5、php5.6、php7采用的是FCGI运行模式,并且是NTS。如果在站点管理里面选择默认php版本,那么就是选择了主界面当前默认的php版本,是模块运行方式、TS的php版本。)

%title插图%num

4、修改Mysql数据库配置,点击相关设置,点击修改数据库配置即可,

(此处修改的是当前的mysql数据库配置,想修改其他Mysql版本的数据库配置,请先切换到其他mysql版本)

%title插图%num

5、点击菜单栏的编辑文件,可以找到php、Web服务器、mysql数据库的物理文件所在的位置。

%title插图%num

Python 下载图片的三种方法

Python 下载图片的三种方法

import os
os.makedirs(‘./image/’, exist_ok=True)
IMAGE_URL = “http://image.nationalgeographic.com.cn/2017/1122/20171122113404332.jpg”

def urllib_download():
from urllib.request import urlretrieve
urlretrieve(IMAGE_URL, ‘./image/img1.png’)

def request_download():
import requests
r = requests.get(IMAGE_URL)
with open(‘./image/img2.png’, ‘wb’) as f:
f.write(r.content)

def chunk_download():
import requests
r = requests.get(IMAGE_URL, stream=True)
with open(‘./image/img3.png’, ‘wb’) as f:
for chunk in r.iter_content(chunk_size=32):
f.write(chunk)

urllib_download()
print(‘download img1’)
request_download()
print(‘download img2’)
chunk_download()
print(‘download img3’)

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速