真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

蘋果flutter,蘋果電影

Flutter 上字體的另類玩法:FontFeature

在以前的 《Flutter 上默認的文本和字體知識點》 和 《帶你深入理解 Flutter 中的字體“冷”知識》 中,已經(jīng)介紹了很多 Flutter 上關(guān)于字體有趣的知識點,而本篇講繼續(xù)介紹 Flutter 上關(guān)于 Text 的一個屬性: FontFeature , 事實上相較于 Flutter ,本篇內(nèi)容可能和前端或者設(shè)計關(guān)系更密切 。

創(chuàng)新互聯(lián)是專業(yè)的歙縣網(wǎng)站建設(shè)公司,歙縣接單;提供成都網(wǎng)站制作、成都網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行歙縣網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

什么是 FontFeature ? 簡單來說就是影響字體形狀的一個屬性 ,在前端的對應(yīng)領(lǐng)域里應(yīng)該是 font-feature-settings ,它有別于 FontFamily ,是用于指定字體內(nèi)字的形狀的一個參數(shù)。

我們知道 Flutter 默認在 Android 上使用的是 Roboto 字體,而在 iOS 上使用的是 SF 字體,但是其實 Roboto 字體也是分很多類型的,比如你去查閱手機的 system/fonts 目錄,就會發(fā)現(xiàn)很多帶有 Roboto 字樣的字體庫存在。

所以 Roboto 之類的字體庫是一個很大的字體集,不同的 font-weight 其實對應(yīng)著不同的 ttf ,例如默認情況下的 Roboto 是不支持 font-weight 為 600 的配置 :

所以如下圖所示,如果我們設(shè)置了 w400 - w700 的 weight ,可以很明顯看到中間的 500 和 600 其實是一樣的粗細,所以在 設(shè)置 weight 或者設(shè)計 UI 時,就需要考慮不同平臺上的 weight 是否支持想要的效果 。

回歸到 FontFeature 上,那 Roboto 自己默認支持多少種 features 呢? 答案是 26 種,它們的編碼如下所示,運行后效果也如下圖所示,從日常使用上看,這 26 種 Feature 基本滿足開發(fā)的大部分需求。

而 iOS 上的 SF pro 默認支持 39 種 Features , 它們的編碼如下所示,運行后效果也如下圖所示,可以看到 SF pro 支持的 Features 更多。

所以可以看到,并不是所有字體支持的 Features 都是一樣的,比如 iOS 上支持 sups 上標顯示和 subs 下標顯示,但是 Android 上的 Roboto 并不支持,甚至很多第三方字體其實并不支持 Features 。

有趣的是,在 Flutter Web 有一個渲染文本時會變模糊的問題 #58159 ,這個問題目前官方還沒有修復,但是你可以通過給 Text 設(shè)置任意 FontFeatures 來解決這個問題。

最后,如果對 FontFeature 還感興趣的朋友,可以通過一下資料深入了解,如果你還有什么關(guān)于字體上的問題,歡迎留言討論。

基于網(wǎng)友的問題再補充一下拓展知識,畢竟這方面內(nèi)容也不多 。

事實上在 dart 里就可以看到對應(yīng) FontWeight 約定俗稱用的是字體集里的什么字體:

所以如果對于默認字體有疑問,可以在你的手機字體找找是否有對應(yīng)的字體, 比如雖然我們說 roboto 沒有 600 ,但是如果是 roboto mono 字體集是有 600 的 fontweight ,甚至還有 600 斜體: 。

另外注意這是 Flutter 而不是原生,具體實現(xiàn)調(diào)用是在 Engine 的 paragraph_skia.cc 和 paragraph_builder_skia.cc 下對應(yīng)的 setFontFamilies 相關(guān)邏輯,當然默認字體庫指定在 typography.dart 下就看到,例如 'Roboto' 、 '.SF UI Display' 、 '.SF UI Text' 、 '.AppleSystemUIFont' 、 'Segoe UI' :

另外如果你在 Mac 的 Web 上使用 Flutter Web,可以看到指定的是 .AppleSystemUIFont ,而對于 .AppleSystemUIFont 它其實不算是一種字體,而是蘋果上字體的一種集合別稱:

[圖片上傳失敗...(image-40f5ce-1648368234737)]

還有,如果你去看 Flutter 默認自帶的 cupertino/context_menu_action.dart ,就可以看到一個有趣的情況:

當然,前面我們說了那么多,主要是針對英文的情況下,而在中文下還是有差異的 ,之前的文章也介紹過:

例如,在蘋果上的簡體中文其實會是 PingFang SC 字體,對應(yīng)還有 PingFang TC 和 PingFang HK 的繁體集,而關(guān)于這個問題在 Flutter 上之前還出現(xiàn)過比較有意思的 bug :

當然后續(xù)的 #16709 修復了這個問題 ,而在以前的文章我也講過,當時我遇到了 “Flutter 在 iOS 系統(tǒng)上,系統(tǒng)語言是韓文時,在和中文一起出現(xiàn)會導致字體顯示異常" 的問題 :

解決方法也很簡單,就是給 fontFamilyFallback 配置上 ["PingFang SC" , "Heiti SC"] 就可以了,這是因為韓文在蘋果手機上使用的應(yīng)該是 Apple SD Gothic Neo 這樣的超集字體庫,【廣】這個字符在這個字體集上是不存在的,所以就變成了中文的【廣】;

所以可以看到,字體相關(guān)是一個平時很少會深入接觸的東西,但是一旦涉及多語言和繪制,就很容易碰到問題的領(lǐng)域 。

Flutter浪潮下的音視頻研發(fā)探索

文/陳爐軍

整理/LiveVideoStack

大家好,我是阿里巴巴閑魚事業(yè)部的陳爐軍,本次分享的主題是Flutter浪潮下的音視頻研發(fā)探索,主要內(nèi)容是針對閑魚APP在當下流行的跨平臺框架Flutter的大規(guī)模實踐,介紹其在音視頻領(lǐng)域碰到的一些困難以及解決方案。

分享內(nèi)容主要分為四個方面,首先會對Flutter有一個簡單介紹以及選擇Flutter作為跨平臺框架的原因,其次會介紹Flutter中與音視頻關(guān)系非常大的外接紋理概念,以及對它做出的一些優(yōu)化。之后會對閑魚在音視頻實踐過程中碰到的一些Flutter問題提出了一些解決方案——TPM音視頻框架。最后是閑魚Flutter多媒體開源組件的介紹。

Flutter

Flutter是一個跨平臺框架,以往的做法是將音頻、視頻和網(wǎng)絡(luò)這些模塊都下沉到C++層或者ARM層,在其上封裝成一個音視頻的SDK,供UI層的PC、iOS和Android調(diào)用。

而Flutter做為一個UI層的跨平臺框架,顧名思義就是在UI層也實現(xiàn)了一個跨平臺開發(fā)。可以預想的是未Flutter發(fā)展的好的話,會逐漸變?yōu)橐粋€從底層到UI層的一個全鏈路的跨平臺開發(fā),技術(shù)人員分別負責SDK和UI層的開發(fā)。

在Flutter之前已經(jīng)有很多跨平臺UI解決方案,那為什么選擇Flutter呢?

我們主要考慮性能和跨平臺的能力。

以往的跨平臺方案比如Weex,ReactNative,Cordova等等因為架構(gòu)的原因無法滿足性能要求,尤其是在音視頻這種性能要求幾乎苛刻的場景。

而諸如Xamarin等,雖然性能可以和原生App一致,但是大部分邏輯還是需要分平臺實現(xiàn)。

我們可以看一下,為什么Flutter可以實現(xiàn)高性能:

原生的native組件渲染以IOS為例,蘋果的UIKit通過調(diào)用平臺自己的繪制框架QuaztCore來實現(xiàn)UI的繪制,圖形繪制也是調(diào)用底層的API,比如OpenGL、Metal等。

而Flutter也是和原生API邏輯一致,也是通過調(diào)用底層的繪制框架層SKIA實現(xiàn)UI層。這樣相當于Flutter他自己實現(xiàn)了一套UI框架,提供了一種性能超越原生API的跨平臺可能性。

但是我們說一個框架最終性能怎樣,其實取決于設(shè)計者和開發(fā)者。至于現(xiàn)在到底是一個什么狀況:

在閑魚的實踐中,我們發(fā)現(xiàn)在正常的開發(fā)沒有特意的去優(yōu)化UI代碼的情況下,在一些低端機上,F(xiàn)lutter界面的流暢性是比Native界面要好的。

雖然現(xiàn)在閑魚某些場景下會有卡頓閃退等情況,但是這是一個新事物發(fā)展過程中的必然問題,我們相信未來性能肯定不會成為限制Flutter發(fā)展的瓶頸的。

在閑魚實踐Flutter的過程中,混合棧和音視頻是其中比較難解決的兩個問題,混合棧是指一個APP在Flutter過程中不可能一口氣將所有業(yè)務(wù)全部重寫為Flutter,所以這是一個逐步迭代的過程,這期間原生native界面與Flutter界面共存的狀態(tài)就稱之為混合棧。閑魚在混合棧上也有一些比較好的輸出,例如FlutterBoost。

外接紋理

在講音視頻之前需要簡要介紹一下外接紋理的概念,我們將它稱之為是Flutter和Frame之間的橋梁。

Flutter渲染一幀屏幕數(shù)據(jù)首先要做的是,GPU發(fā)出的VC信號在Flutter的UI線程,通過AOT編譯的機器碼結(jié)合當前Dart Runtime,生成Layer Tree UI樹,Layer Tree上每一個葉子節(jié)點都代表了當前屏幕上所需要渲染的每一個元素,包含了這些元素渲染所需要的內(nèi)容。將Layer Tree拋給GPU線程,在GPU線程內(nèi)調(diào)用Skia去完成整個UI的渲染過程。Layer Tree中有PictureLayer和TextureLayer兩個比較重要的節(jié)點。PictureLayer主要負責屏幕圖片的渲染,F(xiàn)lutter內(nèi)部實現(xiàn)了一套圖片解碼邏輯,在IO線程將圖片讀取或者從網(wǎng)絡(luò)上拉取之后,通過解碼能夠在IO線程上加載出紋理,交給GPU線程將圖片渲染到屏幕上。但是由于音視頻場景下系統(tǒng)API太過繁多,業(yè)務(wù)場景過于復雜。Flutter沒有一套邏輯去實現(xiàn)跨平臺的音視頻組件,所以說Flutter提出了一種讓第三方開發(fā)者來實現(xiàn)音視頻組件的方式,而這些音視頻組件的視頻渲染出口,就是TextureLayer。

在整個Layer Tree渲染的過程中,TextureLayer的數(shù)據(jù)紋理需要由外部第三方開發(fā)者來指定,可以把視頻數(shù)據(jù)和播放器數(shù)據(jù)送到TextureLayer里,由Flutter將這些數(shù)據(jù)渲染出來。

TextureLayer渲染過程:首先判斷Layer是否已經(jīng)初始化,如果沒有就創(chuàng)建一個Texture,然后將Texture Attach到一個SufaceTexture上。

這個SufaceTexture是音視頻的native代碼可以獲取到的對象,通過這個對象創(chuàng)建的Suface,我們可以將視頻數(shù)據(jù)、攝像頭數(shù)據(jù)解碼放到Suface中,然后Flutter端通過監(jiān)聽SufaceTexture的數(shù)據(jù)更新就可以順利把剛才創(chuàng)建的數(shù)據(jù)更新到它的紋理中,然后再將紋理交給SKIA渲染到屏幕上。

然而我們?nèi)绻枰肍lutter實現(xiàn)美顏,濾鏡,人臉貼圖等等功能,就需要將視頻數(shù)據(jù)讀取出來,更新到紋理中,再將GPU紋理經(jīng)過美顏濾鏡處理后生成一個處理后的紋理。按Flutter提供的現(xiàn)有能力,必須先將紋理中的數(shù)據(jù)從GPU讀出到CPU中,生成Bitmap后再寫入Surface中,這樣在Flutter中才能順利的更新到視頻數(shù)據(jù),這樣做對系統(tǒng)性能的消耗很大。

通過對Flutter渲染過程分析,我們知道Flutter底層需要渲染的數(shù)據(jù)就是GPU紋理,而我們經(jīng)過美顏濾鏡處理完成以后的結(jié)果也是GPU紋理,如果可以將它直接交給Flutter渲染,那就可以避免GPU-CPU-GPU這樣的無用循環(huán)。這樣的方法是可行的,但是需要一個條件,就是OpenGL上下文共享。

OpenGL

在說上下文之前,得提到一個和上線文息息相關(guān)的概念:線程。

Flutter引擎啟動后會啟動四個線程:

第一個線程是UI線程,這是Flutter自己定義的UI線程,主要負責GPU發(fā)出的VSync信號時候用當前Dart編譯的機器碼和當前運行環(huán)境創(chuàng)建出Layer Tree。

還有就是IO線程和GPU線程。和大部分OpenGL處理解決方案中一樣,F(xiàn)lutter也采取一個線程責資源加載,一部分負責資源渲染這種思路。

兩個線程之間紋理共享有兩種方式。一種是EGLImage(IOS是 CVOpenGLESTextureCache)。一種是OpenGL Share Context。Flutter通過Share Context來實現(xiàn)紋理共享,將IO線程的Context和GPU線程的Context進行Share,放到同一個Share Group下面,這樣兩個線程下資源是互相可見可以共享的。

Platform線程是主線程,F(xiàn)lutter中有一個很奇怪的設(shè)定,GPU線程和主線程共用一個Context。并且在主線程也有很多OpenGL 操作。

這樣的設(shè)計會給音視頻開發(fā)帶來很多問題,后面會詳細說。

音視頻端美顏處理完成的OpenGL紋理能夠讓Flutter直接使用的條件就是Flutter的上下文需要和平臺音視頻相關(guān)的OpenGL上下文處在一個Share Group下面。

由于Flutter主線程的Context就是GPU的Context,所以在音視頻端主線程中有一些OpenGL操作的話,很有可能使Flutter整個OpenGL被破壞掉。所以需要將所有的OpenGL操作都限制在子線程中。

通過上述這兩個條件的處理,我們就可以在沒有增加GPU消耗的前提下實現(xiàn)美顏和濾鏡等等功能。

TPM

在經(jīng)過demo驗證之后,我們將這個方案應(yīng)用到閑魚音視頻組件中,但改造過程中發(fā)現(xiàn)了一些問題。

上圖是攝像頭采集數(shù)據(jù)轉(zhuǎn)換為紋理的一段代碼,其中有兩個操作:首先是切進程,將后面的OpenGL操作都切到cameraQueue中。然后是設(shè)置一次上下文。然后這種限制條件或者說是潛規(guī)則往往在開發(fā)過程中容易被忽略的。而這個條件一旦忽略后果就是出現(xiàn)一些莫名其妙的詭異問題極難排查。因此我們就希望能抽象出一套框架,由框架本身實現(xiàn)線程的切換、上下文和模塊生命周期等的管理,開發(fā)者接入框架以后只需要安心實現(xiàn)自己的算法,而不需要關(guān)心這些潛規(guī)則還有其他一些重復的邏輯操作。

在引入Flutter之前閑魚的音視頻架構(gòu)與大部分音視頻邏輯一樣采用分層架構(gòu):

1:底層是一些獨立模塊

2:SDK層是對底層模塊的封裝

3:最上層是UI層。

引入Flutter之后,通過分析各個模塊的使用場景,我們可以得出一個假設(shè)或者說是抽象:音視頻應(yīng)用在終端上可以歸納為視頻幀解碼之后視頻數(shù)據(jù)幀在各個模塊之間流動的過程,基于這種假設(shè)去做Flutter音視頻框架的抽象。

咸魚Flutter多媒體開源組件

整個Flutter音視頻框架抽象分為管線和數(shù)據(jù)的抽象、模塊的抽象、線程統(tǒng)一管理和上下文同一管理四部分。

管線,其實就是視頻幀流動的管道。數(shù)據(jù),音視頻中涉及到的數(shù)據(jù)包括紋理、Bit Map以及時間戳等。結(jié)合現(xiàn)有的應(yīng)用場景我們定義了管線流通數(shù)據(jù)以Texture為主數(shù)據(jù),同時可以選擇性的添加Bit Map等作為輔助數(shù)據(jù)。這樣的數(shù)據(jù)定義方式,避免重復的創(chuàng)建和銷毀紋理帶來的性能開銷以及多線程訪問紋理帶來的一些問題。也滿足一些特殊模塊對特殊數(shù)據(jù)的需求。同時也設(shè)計了紋理池來管理管線中的紋理數(shù)據(jù)。

模塊:如果把管線和數(shù)據(jù)比喻成血管和血液,那框架音視頻的場景就可以比喻成器官,我們根據(jù)模塊所在管線的位置抽象出采集、處理和輸出三個基類。這三個基類里實現(xiàn)了剛才說的線程切換,上下文切換,格式轉(zhuǎn)換等等共同邏輯,各個功能模塊通過集成自這些基類,可以避免很多重復勞動。

線程:每一個模塊初始化的時候,初始化函數(shù)就會去線程管理的模塊去獲取自己的線程,線程管理模塊可以決定給初始化函數(shù)分配新的線程或者已經(jīng)分配過其他模塊的線程。

這樣有三個好處:

一是可以根據(jù)需要去決定一個線程可以掛載多少模塊,做到線程間的負載均衡。第二,多線程并發(fā)式能夠保證模塊內(nèi)的OpenGL操作是在當前線程內(nèi)而不會跑到主線程去,徹底避免Flutter的OpenGL 環(huán)境被破壞。第三,多線程并行可以充分利用CPU多核架構(gòu),提升處理速度。

從Flutter端修改Flutter引擎將Context取出后,根據(jù)Context創(chuàng)建上下文的統(tǒng)一管理模塊,每一個模塊在初始化的時候會獲取它的線程,獲取之后會調(diào)用上下文管理模塊獲取自己的上下文。這樣可以保證每一個模塊的上下文都是與Flutter的上下文進行Share的,每個模塊之間資源都是共享可見的,F(xiàn)lutter和音視頻native之間也是互相共享可見的。

基于上述框架如果要實現(xiàn)一個簡單的場景,比如畫面實時預覽和濾鏡處理功能,

1:需要選擇功能模塊,功能模塊包括攝像頭模塊、濾鏡處理模塊和Flutter畫面渲染模塊,

2:需要配置模塊參數(shù),比如采集分辨率、濾鏡參數(shù)和前后攝像頭設(shè)置等,

3:在創(chuàng)建視頻管線后使用已配置的參數(shù)創(chuàng)建模塊

4:最后管線搭載模塊,開啟管線就可以實現(xiàn)這樣簡單的功能。

上圖為整個功能實現(xiàn)的代碼和結(jié)構(gòu)圖。

結(jié)合上述音視頻框架,閑魚實現(xiàn)了Flutter多媒體開源組件。

組要包含四個基本組件分別是:

1:視頻圖像拍攝組件

2:播放器組件

3:視頻圖像編輯組件

4:相冊選擇組件

現(xiàn)在這些組件正在走內(nèi)部開源流程。預計9月份,相冊和播放器會實現(xiàn)開源。

后續(xù)展望和規(guī)劃

1:實現(xiàn)開頭所說的從底層SDK到UI的全鏈路的跨端開發(fā)。目前底層框架層和模塊層都是各個平臺各自實現(xiàn),反而是Flutter的UI端進行了跨平臺的統(tǒng)一,所以后續(xù)會將底層也按照音視頻常用做法把邏輯下沉到C++層,盡可能的實現(xiàn)全鏈路跨平臺。

2:第二部分內(nèi)容為開源共建,閑魚開源的內(nèi)容不僅包括拍攝、編輯組件,還包括了很多底層模塊,希望有開發(fā)者在基于Flutter開發(fā)音視頻應(yīng)用時可以充分利用閑魚開源出的音視頻模塊能力,搭建APP框架,開發(fā)者只要去負責實現(xiàn)特殊需求模塊就可以,盡可能的減少重復勞動。

Flutter ios打包 ipa

1.keychain 鑰匙串訪問

2.申請開發(fā)證書

3.注冊Bundle ID

4.配置開發(fā)證書 (生成.mobileprovision文件)

5.安裝證書

6.打包ipa

7.開發(fā)團隊如何公用證書

進入以下程序

此文件保存到你想保存的地方,后面生成證書有用。

1.打開 蘋果開發(fā)者中心 ( )

2.按照以下圖片步驟走:

上面省略的步驟,按照具體需要選擇,基本是“傻瓜式點擊

到這bundle id就OK了

.mobileprovision文件格式的配置文件是讓開發(fā)者的項目(APP)能有真機調(diào)試,發(fā)布的權(quán)限。

配置開發(fā)證書,就會需要你設(shè)置,在這個項目中添加哪些設(shè)備作為真機調(diào)試的設(shè)備

1.Xcode打開以下文件夾

2.三個必填項

4.選擇發(fā)布平臺:

1.本地安裝完.cer證書文件

輸入密碼之后點擊好,即可生成.p12文件

Flutter快速實現(xiàn)蘋果賬號登錄

為了提升用戶體驗,使用三方登錄APP的功能怎么能少呢,但是蘋果的AppStore有一個很變態(tài)的要求,接入其他三方登錄的話,要求必須也要接入蘋果登錄。面對這么變態(tài)的要求,作為一個有實力的碼農(nóng)怎么能拒絕呢!

下面為大家介紹一個好用的Flutter插件 Sign in With Apple ,可以幫助我們快速的接入蘋果賬號功能,插件的英文文檔講的比較詳細了,英文好的同學可以直接參閱英文文檔集成。

在項目的 pubspec.yaml 文件中添加sign_in_with_apple插件的依賴,如果您使用的Flutter SDK 1.x版本請?zhí)砑右蕾嚢姹?2.5.4 :

如果您使用的Flutter SDK為2.x,請使用最新版本,當前最新版本 3.0.0

使用XCode打開項目后,按照以下圖片上的步驟添加 Sign in With Apple Capabilities:

成功添加 Sign in With Apple能力后,可以在下面的列表中就代表添加成功了,如下圖:

Flutter iOS 蘋果IAP(內(nèi)購)實現(xiàn)步驟及問題總結(jié)(全網(wǎng)最全)

點擊 “協(xié)議、稅務(wù)和銀行業(yè)務(wù)”

內(nèi)購用的是付費應(yīng)用程序,先簽署《付費應(yīng)用程序協(xié)議》,同意后狀態(tài)變更為“用戶信息待處理”,等待審核。

狀態(tài)更改完畢后,點擊“開始設(shè)置稅務(wù)、銀行業(yè)務(wù)和聯(lián)系信息”。

(1)添加銀行賬戶,按照要求填寫相關(guān)內(nèi)容即可。

(2)選擇報稅表,并填寫。所有與 Apple 有商業(yè)合作者必選都是美國,若有其他需求,可以多選。

繼續(xù)填寫,首先認證公司基本信息,選擇所有人類型,確認無誤后認證條款處打?qū)?/p>

Part I 部分,繼續(xù)核對公司相關(guān)信息,選填內(nèi)容可不填。

Part III 部分,簽署稅務(wù)條約,設(shè)置利益限制條款的種類,選填內(nèi)容可不填。此部分如果需要可勾選上下圖勾選框,不需要可不勾選,我們這個項目沒有用到part III 部分,所以沒有勾選。

Part XXX 部分,確認之前填寫的信息,勾選完畢后,提交

(3)填寫聯(lián)系信息,共5個。高級管理、財務(wù)、技術(shù)、法務(wù)、營銷。只需要提供5個人的基本信息即可。

只可使用一次的產(chǎn)品,使用之后即失效,必須再次購買。

示例: 釣魚 App 中的魚食。

只需購買一次,不會過期或隨著使用而減少的產(chǎn)品。

示例: 游戲 App 的賽道。

允許用戶在固定時間段內(nèi)購買動態(tài)內(nèi)容的產(chǎn)品。除非用戶選擇取消,否則此類訂閱會自動續(xù)期。

示例: 每月訂閱提供流媒體服務(wù)的 App。

允許用戶購買有時限性服務(wù)的產(chǎn)品。此 App 內(nèi)購買項目的內(nèi)容可以是靜態(tài)的。此類訂閱不會自動續(xù)期。

示例: 為期一年的已歸檔文章目錄訂閱。

App 內(nèi)購買項目的截屏,即所售項目的示意圖。例如,如果 App 內(nèi)購買項目是一本圖書,您可以提交圖書的截屏。您也可以提交購買頁的截屏。該截屏僅用于 Apple 審核,不會在 App Store 中顯示。

截屏要求如下:

iOS 至少需要 640 x 920 像素

Apple tvOS 需要 1920 x 1080 像素

macOS 需要 1280 x 800 像素

App 審核圖像上傳后,可以替換,但無法移除。當您的 App 內(nèi)購買項目處于審核中時,您無法更新截屏。

沙箱賬號是不能直接在App Store進行登錄的,只能在點擊了購買商品之后,在彈出的登錄框進行登錄 。

驗證是否已登錄沙箱測試賬號:

設(shè)置--iTunes Store與App Store,頁面拉到最底部,會看到沙箱賬戶項會列出你已登錄的沙箱測試賬號!

操作方法一:打開App Store應(yīng)用首頁滑到最下方--選中AppleID--注銷

操作方法二:設(shè)置--iTunes Store與App Store--選中AppleID--注銷

checks if the client can make payments(檢測App是否能支付)

getAvailablePurchases

Get all non-consumed purchases 獲取未消費的商品

打印信息查詢;

原因:

沒有先執(zhí)行g(shù)etProducts,直接執(zhí)行requestPurchase方法,要先拉取商品列表,再執(zhí)行購買操作.

問題描述;

1.漏單必須要處理,玩家花RMB購買的東西卻丟失了,是絕對不能容忍的。所謂的漏單就是玩家已經(jīng)正常付費,卻沒有拿到該拿的道具。

解決:只要購買成功,便將購買記錄(receipt等賬單信息)保存下來,然后將賬單信息傳送給我們游戲服務(wù)器,游戲服務(wù)器獲得賬單后,和蘋果服務(wù)器驗證,賬單有效的話,回饋給游戲服務(wù)器處理,游戲服務(wù)器處理后,返回給游戲客戶端處理,處理完畢,將本地保存的購買記錄刪除。

官方文檔:向蘋果校驗支付憑證

21000 App Store無法讀取你提供的JSON數(shù)據(jù)

21002 收據(jù)數(shù)據(jù)不符合格式

21003 收據(jù)無法被驗證

21004 你提供的共享密鑰和賬戶的共享密鑰不一致

21005 收據(jù)服務(wù)器當前不可用

21006 收據(jù)是有效的,但訂閱服務(wù)已經(jīng)過期。當收到這個信息時,解碼后的收據(jù)信息也包含在返回內(nèi)容中

21007 收據(jù)信息是測試用(sandbox),但卻被發(fā)送到產(chǎn)品環(huán)境中驗證 【請求sandbox校驗支付憑證】

21008 收據(jù)信息是產(chǎn)品環(huán)境中使用,但卻被發(fā)送到測試環(huán)境中驗證

消耗類型: 例如:金幣、道具等。

非續(xù)訂訂閱: non-renewable subscription 例如:VIP

您的首個 App 內(nèi)購買項目必須以新的 App 版本提交。請創(chuàng)建您的 App 內(nèi)購買項目,然后前往 App 的“App Store”頁,從“App 內(nèi)購買項目”中進行選擇,點按“提交”。 了解更多

在上傳二進制文件并提交首個 App 內(nèi)購買項目以供審核后,您可以使用下表提交其他 App 內(nèi)購買項目。

唐巧-iOS應(yīng)用內(nèi)付費(IAP)開發(fā)步驟列表

未完~待續(xù)

當使用內(nèi)購購買過商品之后沒有把這個交易關(guān)閉,所以再次去購買商品后就會調(diào)用以前已經(jīng)購買成功的交易去購買因為已經(jīng)購買過,才會有這個提示

原因:添加內(nèi)購項目時,信息填寫不完整,app審核圖像未上傳

處理方法:上傳app審核圖片( 合適的尺寸 ),點擊提交,狀態(tài)改為正在準備審核中。

這個是內(nèi)購選擇類型不匹配原因?qū)е隆?/p>

購買成功之后,Apple會返回以下四個數(shù)據(jù)給應(yīng)用

Reference

Review the updated Paid Applications Schedule.

游客身份解決方案:即不登錄也要能購買

1)服務(wù)器端做一個蘋果審核機制,審核期間游客身份可以進行一切行為,一旦審核通過,修改服務(wù)端即可達到強制用戶登錄進行內(nèi)購買的目的(這個有點。。。)

2)游客可以進行內(nèi)購買,購買時以設(shè)備UUID為準,生成一個游客賬號,將購買信息保存在服務(wù)器和本地,當用戶登錄正式賬戶后判斷此設(shè)備是否進行過內(nèi)購,有的話提示用戶將游客身份購買的權(quán)益與現(xiàn)有賬號綁定,如果綁定,游客權(quán)益則遷移到正式賬戶,如果不遷移,則游客身份和正是賬戶是兩個獨立賬戶,正式賬戶不享有游客身份的權(quán)益(我用的這個)

內(nèi)購游客模式解決方案

iOS內(nèi)購規(guī)則


網(wǎng)站名稱:蘋果flutter,蘋果電影
網(wǎng)址分享:http://weahome.cn/article/dscdodp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部