ITMS-90338: Non-public API usage - The app references non-public symbols in Frameworks/Flutter.framework/Flutter: _ptrace.?
站在用戶的角度思考問題,與客戶深入溝通,找到龍勝網(wǎng)站設(shè)計與龍勝網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋龍勝地區(qū)。
原因: 使用了 Flutter 的debug 版產(chǎn)物?打成 iPa 包?
就是Frameworks/Flutter.framework 是debug 版的產(chǎn)物
Debug 版的 Flutter 產(chǎn)物 ,SDK 內(nèi)部使用了 蘋果內(nèi)部私有的API , 會被蘋果審核監(jiān)測到,存在安全性隱患. 導(dǎo)致拒絕上傳到蘋果后臺.
產(chǎn)生的原因: 因為開發(fā)過程中,直接使用了debug 模式進(jìn)行開發(fā), 在打包的時候,直接打開 iOS 文件夾下面的工程,在Xcode 里設(shè)置 release 模式時,此時,Flutter 的產(chǎn)物還是 debug 模式下的產(chǎn)物. 沒有刪除替換成 release 產(chǎn)物
1.先 將工程 清理一遍,清理之前debug模式下 的Flutter 產(chǎn)物
2.然后 打開Xcode 工程,配置好相關(guān) 版本號,證書,release 模式
3. 使用命令行 打包 release ,這樣Flutter.framework就會生成 release? 產(chǎn)物
4.最后 在Xcode 工程內(nèi),按照正常 打包上傳 包過程就可以了
1.進(jìn)入 Flutter 工程 命令行操作
flutter clean
2 .清理之前debug 模式下的 殘留產(chǎn)物 (或者手動進(jìn)入文件夾刪除)
rm -rf ios/Flutter/Flutter.framework
3.?獲取 Flutter 的第三方依賴庫
flutter pub get
4.編譯 release 打包 產(chǎn)物?
flutter build ios --release?
(此時這里可以打包出 app 了, 為了安全起見,最好再次進(jìn)入Xcode 清理一遍,直接打包上傳,)
上面這一步,主要目的是生成 Flutter.framework? 的release 版本產(chǎn)物
5.進(jìn)入Xcode 工程,clean 一遍,檢查相關(guān)證書配置,版本號等
6.直接 Xcode? Archive 打包IPA 上傳 蘋果后臺
最后上傳成功:
思路: 通過檢查Flutter.framework 它的CPU 架構(gòu)支持
如果: 該產(chǎn)物 支持模擬器 x86_arm64 這樣的架構(gòu)的話,說明該產(chǎn)物就是 Debug 版的 產(chǎn)物
因為release 版的 產(chǎn)物是 不支持 模擬器CPU架構(gòu)的.? ?
輸入終端命令:? lipo -info? 產(chǎn)物的物理路徑
比如:? lipo -info /Users/zzc/Documents/rce_flutter/ios/Flutter/Flutter.framework/Flutter
點(diǎn)擊 “協(xié)議、稅務(wù)和銀行業(yè)務(wù)”
內(nèi)購用的是付費(fèi)應(yīng)用程序,先簽署《付費(fèi)應(yīng)用程序協(xié)議》,同意后狀態(tài)變更為“用戶信息待處理”,等待審核。
狀態(tài)更改完畢后,點(diǎn)擊“開始設(shè)置稅務(wù)、銀行業(yè)務(wù)和聯(lián)系信息”。
(1)添加銀行賬戶,按照要求填寫相關(guān)內(nèi)容即可。
(2)選擇報稅表,并填寫。所有與 Apple 有商業(yè)合作者必選都是美國,若有其他需求,可以多選。
繼續(xù)填寫,首先認(rèn)證公司基本信息,選擇所有人類型,確認(rèn)無誤后認(rèn)證條款處打?qū)?/p>
Part I 部分,繼續(xù)核對公司相關(guān)信息,選填內(nèi)容可不填。
Part III 部分,簽署稅務(wù)條約,設(shè)置利益限制條款的種類,選填內(nèi)容可不填。此部分如果需要可勾選上下圖勾選框,不需要可不勾選,我們這個項目沒有用到part III 部分,所以沒有勾選。
Part XXX 部分,確認(rèn)之前填寫的信息,勾選完畢后,提交
(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 審核圖像上傳后,可以替換,但無法移除。當(dāng)您的 App 內(nèi)購買項目處于審核中時,您無法更新截屏。
沙箱賬號是不能直接在App Store進(jìn)行登錄的,只能在點(diǎn)擊了購買商品之后,在彈出的登錄框進(jìn)行登錄 。
驗證是否已登錄沙箱測試賬號:
設(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 獲取未消費(fèi)的商品
打印信息查詢;
原因:
沒有先執(zhí)行g(shù)etProducts,直接執(zhí)行requestPurchase方法,要先拉取商品列表,再執(zhí)行購買操作.
問題描述;
1.漏單必須要處理,玩家花RMB購買的東西卻丟失了,是絕對不能容忍的。所謂的漏單就是玩家已經(jīng)正常付費(fèi),卻沒有拿到該拿的道具。
解決:只要購買成功,便將購買記錄(receipt等賬單信息)保存下來,然后將賬單信息傳送給我們游戲服務(wù)器,游戲服務(wù)器獲得賬單后,和蘋果服務(wù)器驗證,賬單有效的話,回饋給游戲服務(wù)器處理,游戲服務(wù)器處理后,返回給游戲客戶端處理,處理完畢,將本地保存的購買記錄刪除。
官方文檔:向蘋果校驗支付憑證
21000 App Store無法讀取你提供的JSON數(shù)據(jù)
21002 收據(jù)數(shù)據(jù)不符合格式
21003 收據(jù)無法被驗證
21004 你提供的共享密鑰和賬戶的共享密鑰不一致
21005 收據(jù)服務(wù)器當(dāng)前不可用
21006 收據(jù)是有效的,但訂閱服務(wù)已經(jīng)過期。當(dā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)購買項目”中進(jìn)行選擇,點(diǎn)按“提交”。 了解更多
在上傳二進(jìn)制文件并提交首個 App 內(nèi)購買項目以供審核后,您可以使用下表提交其他 App 內(nèi)購買項目。
唐巧-iOS應(yīng)用內(nèi)付費(fèi)(IAP)開發(fā)步驟列表
未完~待續(xù)
當(dāng)使用內(nèi)購購買過商品之后沒有把這個交易關(guān)閉,所以再次去購買商品后就會調(diào)用以前已經(jīng)購買成功的交易去購買因為已經(jīng)購買過,才會有這個提示
原因:添加內(nèi)購項目時,信息填寫不完整,app審核圖像未上傳
處理方法:上傳app審核圖片( 合適的尺寸 ),點(diǎn)擊提交,狀態(tài)改為正在準(zhǔn)備審核中。
這個是內(nèi)購選擇類型不匹配原因?qū)е隆?/p>
購買成功之后,Apple會返回以下四個數(shù)據(jù)給應(yīng)用
Reference
Review the updated Paid Applications Schedule.
游客身份解決方案:即不登錄也要能購買
1)服務(wù)器端做一個蘋果審核機(jī)制,審核期間游客身份可以進(jìn)行一切行為,一旦審核通過,修改服務(wù)端即可達(dá)到強(qiáng)制用戶登錄進(jìn)行內(nèi)購買的目的(這個有點(diǎn)。。。)
2)游客可以進(jìn)行內(nèi)購買,購買時以設(shè)備UUID為準(zhǔn),生成一個游客賬號,將購買信息保存在服務(wù)器和本地,當(dāng)用戶登錄正式賬戶后判斷此設(shè)備是否進(jìn)行過內(nèi)購,有的話提示用戶將游客身份購買的權(quán)益與現(xiàn)有賬號綁定,如果綁定,游客權(quán)益則遷移到正式賬戶,如果不遷移,則游客身份和正是賬戶是兩個獨(dú)立賬戶,正式賬戶不享有游客身份的權(quán)益(我用的這個)
內(nèi)購游客模式解決方案
iOS內(nèi)購規(guī)則
Image(圖片組件)是顯示圖像的組件,一個顯示圖片的widget,支持圖像格式:JPEG,PNG,GIF,動畫GIF,WebP,動畫WebP,BMP和WBM
構(gòu)造方法
Image: 從ImageProvider獲取數(shù)據(jù)
Image.network: 加載網(wǎng)絡(luò)圖片。
Image.asset: 加載本地圖片文件。
new Image.file: 加載本地圖片文件(File文件)圖片。
new Image.memory: 加載Uint8List資源圖片(byte數(shù)組)圖片。
常用屬性
方式一:CircleAvatar
CircleAvatar可以實現(xiàn)圓形頭像,也可以添加一個子Widget:
在圖片上加一個文本
方式二:ClipOval
ClipOval也可以實現(xiàn)圓角頭像,而且通常是在只有頭像時使用
方式三:Container+BoxDecoration
方法一:ClipRRect
方法二:Container + BoxDecoration
補(bǔ)充知識點(diǎn)
Icon字體圖標(biāo)和圖片圖標(biāo)的區(qū)別 ?
Colors.red 是一個MaterialColor對象,為什么可以使用[](Colors.red[10])來設(shè)置顏色 ?
MaterialColor 繼承于ColorSwatch,ColorSwatch中有[] 運(yùn)算符重載;
用到了一個插件: image_picker ,但是在使用這個插件過程中發(fā)現(xiàn)部分安卓手機(jī)拍照會奔潰(PlatformException (PlatformException(already_active, Image picker is already active, null, null))),就是運(yùn)行官方的demo也是一樣會報錯,版本: 0.8.4+3 ,查了很多資料也沒解決,也都嘗試了。我們的需求只是拍照上傳圖片,你可以根據(jù)你的需求使用image_picker,他可以選擇視頻,照片等
原以為很難的東西,東找找西找找,只有一個魯班壓縮,但都不怎么維護(hù)狀態(tài)最終找到好的辦法,可以通過multi_image_picker庫的二進(jìn)制壓縮
80就是壓縮比例,默認(rèn)為100
Assets為獲取到的圖片類型
上傳的時候可以通過
multiImages就是存放Assets類型的圖片數(shù)組,然后通過for循環(huán)遍歷來批量添加圖片
用dio批量上傳
1.動畫原理:在一段時間內(nèi)快速的多次改變UI外觀,由于人眼會產(chǎn)生視覺暫留所以最終看到的就是一個連續(xù)的動畫。
UI的一次改變稱為一個動畫幀,對應(yīng)一次屏幕刷新。
FPS:幀率,每秒的動畫幀數(shù)。
flutter動畫分為兩類:
常見動畫模式:
是一個抽象類,主要的功能是保存動畫的值和狀態(tài)。常用的一個Animation類是Animation double ,是一個在一段時間內(nèi)依次生成一個區(qū)間之間的值的類,可以是線性或者曲線或者其他。
可以生成除double之外的其他類型值,如:Animation Color 或 Animation Size 。
是一個動畫控制器,控制動畫的播放狀態(tài),在屏幕刷新的每一幀,就會生成一個新的值。
包含動畫的啟動forward()、停止stop() 、反向播放 reverse()等方法,在給定的時間段內(nèi)線性的生成從0.0到1.0(默認(rèn)區(qū)間)的數(shù)字。
curve:描述動畫的曲線過程。
curvedAnimation:指定動畫的曲線。
常用Curve:
繼承自Animatable T ,表示的就是一個 Animation 對象的取值范圍,只需要設(shè)置開始和結(jié)束的邊界值(值也支持泛型)。 它唯一的工作就是定義輸入范圍到輸出范圍的映射。
例如,Tween可能會生成從紅到藍(lán)之間的色值,或者從0到255。
Tween.animate:返回一個Animation。
映射過程:
1). Tween.animation通過傳入 aniamtionController 獲得一個_AnimatedEvaluation 類型的 animation 對象(基類為 Animation), 并且將 aniamtionController 和 Tween 對象傳入了 _AnimatedEvaluation 對象。
2). animation.value方法即是調(diào)用 _evaluatable.evaluate(parent)方法, 而 _evaluatable 和 parent 分別為 Tween 對象和 AnimationController 對象。
3). 這里的 animation 其實就是前面的 AnimationController 對象, transform 方法里面的 animation.value則就是 AnimationController 線性生成的 0.0~1.0 直接的值。 在 lerp 方法里面我們可以看到這個 0.0~1.0 的值被映射到了 begin 和 end 范圍內(nèi)了。
接收一個TickerProvider類型的對象,它的主要職責(zé)是創(chuàng)建Ticker。
防止屏幕外動畫消耗資源。
[圖片上傳失敗...(image-115b94-1636441483468)]
過程:
回調(diào):
不使用addListener()和setState()來給widget添加動畫。
使用AnimatedWidget,將widget分離出來,創(chuàng)建一個可重用動畫的widget,AnimatedWidget中會自動調(diào)用addListener()和setState()
AnimatedModalBarrier、DecoratedBoxTransition、FadeTransition、PositionedTransition、RelativePositionedTransition、RotationTransition、ScaleTransition、SizeTransition、SlideTransition
如何渲染過渡,把渲染過程也抽象出來:
AnimatedBuilder的示例包括: BottomSheet、 PopupMenu、ProgressIndicator、RefreshIndicator、Scaffold、SnackBar、TabBar。
MaterialPageRoute:平臺風(fēng)格一致的路由切換動畫
CupertinoPageRoute:左右切換風(fēng)格
自定義:PageRouteBuilder
1.要創(chuàng)建交織動畫,需要使用多個動畫對象(Animation)。
2.一個AnimationController控制所有的動畫對象。
3.給每一個動畫對象指定時間間隔(Interval)
可以同時對其新、舊子元素添加顯示、隱藏動畫.
當(dāng)AnimatedSwitcher的child發(fā)生變化時(類型或Key不同),舊child會執(zhí)行隱藏動畫,新child會執(zhí)行執(zhí)行顯示動畫。
希望大家支持一下,感謝