寰堝涓滆タ涔熶笉鏄秺鏂拌秺濂斤紝姣斿app鈥斺€斿湪 iphone 涓婂挨鍏跺姝?/p>
姣斿鍙互鏌ョ湅 ios 姣忔棩闄愬厤搴旂敤鐨凱rice tag鍦?2.3.1鐗堟椂杩樺畬鍏ㄦ病鏈夊唴璐紝鎵€鏈夐珮绾у姛鑳介兘鑳藉厤璐硅в閿侊紒
杩欎釜app闃胯櫄鍘熸潵鏈夋帹鑽愯繃锛屼笉杩囩幇鍦ㄥ緢鍙儨宸茬粡涓嬫灦浜?/p>
浼樼鐨勫浘鐗囨爣娉ㄨ蒋浠禔nnotable锛屽湪1.11.2鐗堟湰鐨勬椂鍊欙紝鎵€鏈夐珮绾у姛鑳介兘杩樺厤璐规彁渚涳紒
瑕佺煡閬擄紝杩欎箣鍚庣殑鐗堟湰鎹釜棰滆壊銆佹斁澶ч暅銆佹枃瀛楅珮浜瓑绛夊姛鑳介兘闇€瑕佹墠鑳戒粯璐硅в閿?/p>
鍙堟瘮濡傛瘮杈冪煡鍚嶇殑ocr鏂囧瓧璇嗗埆杞欢锛氱櫧鎻忓湪2.1.6鐗堟椂锛岃繕娌℃湁ocr璇嗗埆鐨勬瘡鏃?娆$殑闄愬埗锛岄偅鏃惰繕鍙互涓€鐩寸敤
闄や簡鍙互閫氳繃鎹㈢敤鏃х増鏉ョ櫧瀚栦竴浜汚pp
鏇村鏃跺€欒繕鏄负浜嗚拷姹傛棤骞垮憡涓庡姛鑳芥洿绠€娲?/p>
鍍忕綉鏄撲簯 3.7.5 娌℃湁浠讳綍骞垮憡锛屾敞鎰忔槸浠讳綍骞垮憡锛?/p>
涔熸病鏈夌煭瑙嗛绛夋潅涓冩潅鍏殑绀句氦鍔熻兘
杩欎釜鐗堟湰鐨勭綉鏄撲簯锛岃繕鏄師鏉ョ殑鍛抽亾馃お
鍙﹀锛屾棫鐗圓pp鍥犱负鍔熻兘鏇寸畝鍗曪紝涓€鑸惎鍔ㄦ洿蹇€佹洿鐪佺數锛岃繖浜涗篃鏄崲鍥炴棫鐗圓pp鐨勫師鍥犱箣涓€
璇翠簡閭d箞澶氾紝iphone 鍒板簳濡備綍涓嬭浇鏃х増app鍛?
瀹為檯涓婅繖涓棶棰橀樋铏氬湪18骞寸殑鏃跺€欏氨鍐欒繃浜嗭細 mp.weixin.qq /s/chcrhxvcbsdd0gcu-7wu0q
涓嶈繃涓婃枃涓粙缁嶇殑杞欢锛屼綔鑰呮病鑳藉潥鎸併€屼笉蹇樺垵蹇冦€嶏紝鏈€缁堟拨涓轰簡鏀惰垂杞欢馃し馃徎鈥嶁檪锔?/p>
鑰屽湪2020骞达紝鎴戜滑鏈変簡鏇村鐨勫厤璐瑰伐鍏峰彲渚涢€夋嫨 锛堢湅鏉ュぇ浣兘鏄€€鏃х殑浜哄憖锛?锛屼簬鏄粖澶╅噸鏂板啓涓€绡囨洿鏂颁竴涓?/p>
浣犲彲鑳戒細闂负浠€涔堥樋铏氫笉鐩存帴鍒嗕韩杩欎簺鏃х増鍛紵
鍥犱负 android 鍜?ios 鐨?app 瀹夎鍖呮槸涓嶄竴鏍风殑锛?/p>
ios 鐨?ipa 鏂囦欢鍐呴儴鏄寘鍚簡璐﹀彿淇℃伅鐨勶紝瀹夎鏃堕渶瑕侀獙璇佽喘涔拌繖涓?app 鏃舵墍鐢?apple 璐﹀彿鐨勫瘑鐮侌煍?/p>
闄ら潪鏄綘鏈嬪弸鍙戠粰浣狅紝鍐嶅憡璇変綘ta鐨?apple 璐﹀彿瀵嗙爜锛屽惁鍒欎綘鏄棤娉曡繘琛屽畨瑁呯殑
鎵€浠ュ晩锛屽彧鏈夎嚜宸辨帉鎻℃柟娉曟墠鏄渶瀹炲湪鐨勮в鍐虫柟娉?/p>
鍐典笖鐜板湪涓嬮潰瑕佷粙缁嶇殑宸ュ叿閮芥槸鍌荤摐鎿嶄綔涓€閿紡鐨勶紝5鍒嗛挓灏辫兘瀛︿細锛岃繕骞插槢鍘婚夯鐑﹀埆浜哄憿馃槀
鈻? ios鏃х増搴旂敤涓嬭浇宸ュ叿
浠ヤ笅杩欎簺宸ュ叿閮藉嚭鑷惥鐖辩牬瑙h鍧涢噷闈㈢殑鍚勪釜澶т浆馃惗
杩?娆捐蒋浠剁殑浣跨敤鏂瑰紡鍑犱箮宸笉澶氾紝浣嗕笂闈ime涓˙rand澶т浆鐨勮繖娆惧伐鍏风浉瀵规洿濂界敤
闃胯櫄杩欓噷灏变粎浠嬬粛杩欎竴娆捐蒋浠讹紝鍓╀笅鐨勪袱娆捐蒋浠跺ぇ瀹跺浼氫妇涓€鍙嶄笁
杞欢鑾峰彇鐨勮瘽锛屽叧娉ㄥ井淇″叕浼楀彿锛氶樋铏氬悓瀛︼紝鍙戦€佷互涓嬪叧閿瘝锛屽悗鍙板嵆浼氳嚜鍔ㄥ洖澶嶈繖3娆捐蒋浠剁殑涓嬭浇鍦板潃锛?/p>
鏃х増app
鈻? 浣跨敤鏂规硶
鐢变簬apple 绉婚櫎浜?itunes 12.7 浠ュ悗鍐呯疆鐨?app store 鍔熻兘锛屾墍浠ユ垜浠繀椤诲厛鎹㈢敤鐗瑰畾鐨勫寘鍚?app store 鍔熻兘鐨?itunes 12.6.3
apple瀹樼綉涓撻棬鎻愪緵浜嗘鐗堟湰鐨勪笅杞介摼鎺ワ細 support.apple /zh-cn/ht208079
瀹夎濂?itunes 12.6.3锛屽苟鐧诲綍浣犵殑 apple 璐﹀彿锛岀劧鍚庢帴鐫€寰€涓嬬湅
鈼?2.1 鏃х増搴旂敤涓嬭浇鐨勫師鐞?/p>
鎺ョ潃鍏堢畝鍗曡涓€涓嬭繖绫诲伐鍏风殑鍘熺悊锛屾柟渚垮ぇ瀹剁悊瑙e悗闈㈢殑鎿嶄綔姝ラ
娴呭眰鐨勯€昏緫鍏跺疄涓嶉毦锛屽氨绐佸嚭涓€涓瘝鈥斺€斿崐璺埅鑳?/p>
杩欑被宸ュ叿閮芥槸鎷︽埅鐢ㄦ埛鍙戦€佺粰 itunes 鐨勪笅杞借姹傦紝骞朵慨鏀规墍璇锋眰涓嬭浇杞欢鐨勭増鏈琁d锛屽啀閲嶆柊鍚?itunes 鍙戦€佷笅杞借姹傦紝鏈€鍚?itunes 杩斿洖鐨勫氨鏄棫鐨凙pp鐗堟湰浜?/p>
鍙渶瑕佸湪 itunes 鐐瑰嚮涓嬭浇涔嬪墠锛屾彁鍓嶆灦濂芥棫鐗堝簲鐢ㄤ笅杞藉伐鍏疯繘琛屼笅杞借姹傛嫤鎴紝鏈€鍚庝笅杞藉緱鍒扮殑搴旂敤灏辨槸鏃х増浜?/p>
鈼?2.2 鐩存帴鎼滅储鏂瑰紡
涓嬮潰灏辨潵鍏蜂綋璇翠竴涓嬩笅杞芥楠わ紝鍏堝湪 itunes 涓悳绱㈡兂涓嬭浇鐨勬棫鐗圓pp
鎵撳紑浣犳兂涓嬭浇鐨凙pp锛岀劧鍚庢妸 itunes 鍏堟櫨鐫€
鏄剧ず銆岃幏鍙栥€嶏紝琛ㄧず杩欎釜搴旂敤娌¤喘涔版垨鑰呴娆′笅杞斤紝鏄剧ず銆屼笅杞姐€嶅垯鐩稿弽
鐒跺悗灏卞涓婃枃鎵€杩帮紝鎴戜滑闇€瑕佹灦璧锋姄鍖呭伐鍏疯繘琛屻€屾埅鑳°€?/p>
鎵惧埌浣犳兂涓嬭浇鐨勫叿浣撶増鏈紝鍙抽敭涓嬭浇
鍑虹幇浠ヤ笅鎻愮ず鐨勬椂鍊欏氨鍙互鍥炲埌 itunes 杩涜涓嬭浇浜嗮煈?/p>
杩欎釜鏃跺€欏啀鍒?itunes 閲岄潰涓嬭浇锛屽緱鍒扮殑灏辨槸鏃х増app浜?/p>
鈼?2.3 澶嶅埗app閾炬帴鏂瑰紡
闄や簡浠ヤ笂鏂规硶锛岃繕鍙互鎸変笅闈㈣繖鏍锋潵浣跨敤
鍏堟墦寮€鏃х増app鎶撳寘宸ュ叿鈽?/p>
鎺ョ潃鍒?itunes 鎼滅储鎯宠涓嬭浇鐨?app锛岀劧鍚庣偣鍑诲幓锛屽湪涓嬭浇鎸夐挳鍙充晶涓嬫媺鑿滃崟涓紝閫夋嫨銆屽鍒堕摼鎺ャ€?/p>
鐒跺悗宸ュ叿浼氳嚜鍔ㄨ瘑鍒摼鎺ワ紝骞跺脊鍑虹増鏈彿閫夋嫨鐣岄潰
鍓╀笅鐨勬楠ゅ氨鍜屼笂涓€鏍蜂簡锛岄€夋嫨鎯宠涓嬭浇鐨勭増鏈紝鍐嶅埌 itunes 閲岄潰涓嬭浇鍗冲彲
鈼?2.4 濡備綍瀹夎鏃х増ipa鏂囦欢
鏃х増鐨?itunes 鏃犳硶杩炴帴鏂?iphone锛堟瘮濡俰phone11锛夛紝鎵€浠ヤ笅闈㈢殑姝ラ鍙兘闇€瑕佷綘閲嶆柊瑁呭洖鏂扮増 itunes 鎵嶈
鏈€鏂扮増 itunes 涓嬭浇鍦板潃锛歨ttps:// apple /itunes/锛屽缓璁笉瑕佷笅杞組icrosoft store鐗?/p>
鎴栬€呬綘涔熷彲浠ョ敤鐖辨€濆姪鎵嬶細 i4 / 鏉ュ畨瑁卛pa鏂囦欢
涓嶈繃濂藉鏄紝鍙浣犳妸 ipa 鏂囦欢涓嬭浇涓嬫潵锛屼互鍚庨兘鑳界洿鎺ュ畨瑁呯殑锛屾崲鎵嬫満涔熶笉褰卞搷锛屽氨鏄墍璋撶殑銆屼竴娆′笅杞斤紝缁堣韩鍙楃泭銆嶐煒?/p>
鎬讳箣瀹夎涔嬪墠锛岄渶瑕佷綘鍦?itunes锛嶈处鎴疯缃噷闈紝鍏堝 iphone 杩炴帴鐨勭數鑴戞巿鏉?/p>
濡傛灉杩欓噷鍑虹幇鎺堟潈鍙嶅鎺堟潈涓嶄簡锛屽厛鍏抽棴鏃х増app涓嬭浇宸ュ叿锛屽啀杩涜鎺堟潈鍗冲彲
鐒跺悗灏卞緢绠€鍗曚簡锛屽湪璧勬枡搴撻噷闈㈡壘鍒颁笅杞藉ソ鐨勬棫鐗圓pp鐨?ipa 鏂囦欢
鎶婅繖涓?ipa 鏂囦欢鎷栧埌 itunes 閲岄潰涓嬪浘鎵€绀哄尯鍩燂紝鍗冲彲杩涜瀹夎浜?/p>
itunes 涓婃柟鍑虹幇涓嬪浘鏄剧ず鍗宠〃绀烘搷浣滄纭?/p>
濡傛灉鎷栧姩杩囧幓娌¤繘琛屽紑濮嬪畨瑁咃紝鎷旀帀鏁版嵁绾块噸鏂拌繛鎺ヤ竴涓嬬數鑴戝嵆鍙?/p>
鈻? 甯歌闂
鏈€鍚庤鏄庝竴涓嬫搷浣滆繃绋嬩腑鍙兘浼氶亣鍒扮殑闂
鈼?3.1 library.itl闂
濡傛灉涔嬪墠鏈夊畨瑁呮柊鐗堢殑 itunes锛屾崲鍥炴棫鐗堝悗杩愯 itunes 鏃跺彲鑳戒細鍑虹幇浠ヤ笅寮圭獥
瑙e喅鏂规硶寰堢畝鍗曪紝鐢?everything 绛夋悳绱㈣蒋浠讹紙鐢佃剳鑷甫鐨勬悳绱篃鍙互锛夛紝鎵惧埌杩欎釜library.itl鏂囦欢锛屽垹鎺夊嵆鍙?/p>
鈼?3.2 鎬庝箞瑙e喅鏃х増app鐨勬洿鏂版彁绀?/p>
閬垮厤鑷繁鎵嬭幢涓嶅皬蹇冨湪 app store 涓偣鍒版洿鏂版寜閽紝鎴戜滑鍙互鍦?ipa 鏂囦欢杩涜瀹夎涔嬪墠锛屽 ipa 鏂囦欢杩涜涓€鐐瑰鐞嗭紝鏉ュ幓闄?app store 鐨勬洿鏂版娴?/p>
浣嗚繖涓篃**鍙兘鍘婚櫎 app store 鐨勬洿鏂版娴嬶紝app鍐呯殑鏇存柊鎻愮ず杩樻槸浼氭湁鐨勶紙褰撶劧锛屼綘鏃犺鍗冲彲锛?*馃う馃徎鈥嶁檪锔?/p>
鏂规硶灏辨槸鍙抽敭 ipa 鏂囦欢锛岀敤瑙e帇杞欢鎵撳紑
鐒跺悗鍒犻櫎閲岄潰鐨?itunesmeradata.plist 杩欎釜鏂囦欢鍗冲彲
濡傛灉浣犲彸閿病鏈夈€岀敤xx瑙e帇杞欢鎵撳紑銆嶇殑閫夐」锛屼綘涔熷彲浠ヨ繖鏍锋搷浣滐細鎶婃墿灞曞悕 ipa 鏀规垚 zip 鎴栬€?rar锛岀敤鍘嬬缉杞欢鎵撳紑锛屽垹闄ら噷闈㈢殑itunesmetadata.plist锛屽啀閲嶆柊鎶婂悗缂€鍚嶆敼鍚嶅洖 ipa 鍗冲彲馃憣
鈼?3.3 宸蹭笅鏋剁殑app鎬庝箞鎶撳彇锛?/p>
寰堝彲鎯滐紝宸蹭笅鏋剁殑app鐩墠鏄病鍔炴硶涓嬭浇鍒版棫鐗堢殑
鑰屼笖鎯宠涓嬭浇鍒板凡缁忎笅鏋剁殑app涔熸槸姣旇緝鍥伴毦鐨勶紝闄や簡灏濊瘯鎵?testflight 鐗堬紙寮€鍙戣€呭唴娴嬬増锛屼絾杩欑寰堝皯锛?/p>
鍓╀笅鍞竴鐨勫姙娉曞氨鏄壘鍒汉鍏变韩宸茶喘璐﹀彿鏉ヤ笅杞戒簡锛岃繖鍙ヨ瘽鐨勬剰鎬濇槸锛氳嚜宸变笂娣樺疂 or 鍜搁奔锛屾垨鑰呮壘缃戝弸 or 鏈嬪弸鎻愪緵宸蹭笅杞借繃杩欎釜app鐨?鐨凙pple 璐﹀彿馃憠馃憟
鈼?3.4 鏃х増app鍔熻兘鏈夐棶棰?/p>
鏃х増app鍑虹幇鍚勭浣跨敤涓婄殑闂鏄緢姝e父鐨?/p>
姣斿寰崥鍥介檯鐗?2.9.4鐜板湪琚柊娴檺鍒朵簡锛屼笉鑳借繘琛岀櫥褰曪紱鐭ヤ箮 3.29.0锛岃櫧鐒舵槸鏃犲箍鍛婏紝浣嗙湅涓嶄簡鍔ㄥ浘鈥?/p>
鍔犱箣鏃х増app娌℃湁瀵规柊鐗堢郴缁熺増鍋氶€傞厤锛岄棯閫€涔熸槸鍙兘鍑虹幇鐨勷煒?/p>
鎬昏€岃█涔嬶紝鏃х増app鏈変紭鐐癸紝涔熸湁缂虹偣锛屽ぇ瀹堕渶瑕佽嚜宸辨牴鎹嚜宸辩殑绯荤粺鐗堟湰鍜屽姛鑳介渶姹傛潵鍋氶€夋嫨
鈻? 涓€浜涙棫鐗圓pp鎺ㄨ崘
鏈€鍚庡啀鏉ユ帹鑽愪竴浜涘叿浣撶殑app鏃х増鐗堟湰鍙峰惂馃搩
涓嶈繃浠ヤ笅鏃х増app鏄惁渚濇棫鑳戒娇鐢紝闃胯櫄涔熸病鑳藉畬鍏ㄨ繘琛屾祴璇曪紝鑳藉惁鍦ㄤ綘鐨勬墜鏈恒€佺郴缁熶笂姝e父浣跨敤杩樻槸闇€瑕佽嚜琛屾祴璇曚竴涓?/p>
app鐗堟湰浠嬬粛鐧芥弿 2.1.6娌℃湁姣忔棩5娆$殑ocr闄愬埗锛屾壒閲忚瘑鍒篃鍙互涓€鐩寸敤锛堢炕璇戞鏁颁粛闄愬埗姣忔棩3娆★級寰洏 3.4.3浠嶆湁鎼滅储鍔熻兘鐨勪竴涓増鏈竻鐞嗗悰 1.9.4鏃犲箍鍛婄増鏈紝浣嗕笉鏀寔 iphone xannotable 1.11.2鏃犲唴璐姛鑳藉叏瑙i攣鐗堬紝姝ゅ悗鐗堟湰寮€濮嬫敹璐筆rice tag 2.3.1锛堝凡涓嬫灦锛夋棤鍐呰喘鍔熻兘鍏ㄨв閿佺増缃戞槗浜戦煶涔?3.1.1鏃犱换浣曞箍鍛婏紝鏃犮€岃棰戙€嶆爮鐩綉鏄撲簯闊充箰 3.7.5鏃犱换浣曞箍鍛婏紝鏃犮€岃棰戙€嶆爮鐩紝涓嶆椂浼氬脊鍑烘洿鏂版彁閱掔綉鏄撲簯闊充箰 4.0.1鏃犲惎鍔ㄥ箍鍛婏紝鏃犮€岃棰戙€嶆爮鐩綉鏄撲簯闊充箰 4.1.2鏀圭増娣诲姞銆岃棰戙€嶆寜閽€夐」鍓嶇殑鏈€鍚庝竴鐗堢綉鏄撲簯闊充箰 4.3.4鍏ㄩ潰灞忓彲姝e父鏄剧ず锛屽紑灞忔瀬灏戝嚭鐜板箍鍛婏紝鍒囧洖缃戞槗浜戜笉浼氭湁骞垮憡锛屼笉浼氬脊鍑烘洿鏂版彁閱掔綉鏄撲簯闊充箰 5.7.4瑙嗛xr鐨勭涓€涓増鏈井淇?6.6.1鏀寔callkit鐨勬渶鍚庝竴鐗堝井淇?6.6.2棣栦釜鏀寔鍒囨崲涓や釜璐﹀彿鐨勭増鏈井淇?6.6.7璁㈤槄鍙蜂负鐎戝竷娴佸墠鐨勬渶鍚庝竴鐗堬紝涓嶅枩娆㈡柊鐗堝彲瀹夎姝ょ増寰俊 6.7.4澶х増鏈洿鏂板墠鏈€鍚庝竴鐗堝井淇?2.0.5锛圡ac鐗堬級姝ょ増鏈槸鏈€鍚庝竴涓彲浠ュ皢鍏紬鍙锋枃绔犲湪鍐呯疆灏忕獥娴忚鍣ㄦ墦寮€鐨勭増鏈毊鐨櫨 1.3.2娌℃湁浠讳綍骞垮憡绯椾簨鐧剧 2.6.4鏃犲箍鍛婁粖鏃ュご鏉?3.1.1瀹岀編鐨勪竴涓増鏈粖鏃ュご鏉ro 6.3.2鏈夊皬瑙嗛鐗堝潡锛屽姛鑳介綈鍏紝鎵撳紑寰堝揩鍝斿摡鍝斿摡 5.24.1300m澶у皬锛屽啀寰€鍓嶇殑鏃х増鏃犳硶鐧诲綍鍝斿摡鍝斿摡 5.33.2鍏抽棴鍚姩鍔ㄧ敾鍚庢病鏈夊紑灞忓箍鍛婏紝浣嗘悳绱箣鍚庝笅鎷夊唴瀹逛細鍗″睆tik tok 1.2.2鏈睆钄藉湴鍖烘渶鍚庝竴鐗堬紝鍙互姝e父瑙傜湅瑙嗛锛屼絾鏃犳硶娉ㄥ唽鍜岀櫥褰曡吘璁姩婕?4.4.5閰嶅悎浼氬憳鏃犻檺鍒跺彲闅忔剰鐪嬶紝鏂扮増浼氬憳杩橀渶浠樿垂鐧惧害璐村惂 6.9.6鏀寔鍚у唴鎼滅储鐧惧害璐村惂 8.9.0棣栦釜鏀寔鍒樻捣灞忕殑鐗堟湰鐧惧害璐村惂 9.2.0鐪嬭捣鏉ユ竻鐖斤紝涓斿箍鍛婂皯鐧惧害璐村惂 2.0.1锛坕pad 鐗堬級姝ょ増鏈共鍑€鏃犲箍鍛婏紝鑰屼笖杩樿兘鏌ョ湅鍒汉闅愯棌鐨勫唴瀹硅拷涔︾鍣?2.23.1鏈夊箍鍛婏紝涓嶉渶瑕佽拷涔﹀竵锛岃拷鏇存ā寮忓仴鍦紝鐧诲綍浼间箮鏈夐棶棰樿拷涔︾鍣?2.24.24鏈夊箍鍛婏紝浣嗗彲鎹㈡簮鐖遍槄涔﹂ 4.3.1杞婚噺鍙崲婧愪紭閰疯棰?6.12.0鏃犲箍鍛婄増锛岀綉鍙嬪弽棣堬紝鍏蜂綋闇€鑷祴鑵捐瑙嗛 5.9.2鍙互缁戝畾鍒汉鐜嬪崱鏉ュ疄鐜板厤娴佺埍濂囪壓 5.7.1鏃犵墖澶村箍鍛婏紝浣嗗洜涓洪€傞厤闂ios11浠ヤ笂鏃犳硶瀹夎鐖卞鑹?8.12.5涓嶉渶浼氬憳涔熷彲浠ュ悓鏃朵笅杞?涓棰戠埍濂囪壓 9.8.0鍚姩蹇紝鏈€鍚庝竴涓敮鎸侀潪涓昏澶囧彲浠ョ綉椤垫壂鐮佺櫥褰曠殑鐗堟湰娣樺疂 8.0.0璐墿杞︿紭鎯犳槑缁嗘煡鐪嬨€佹敮鎸佹壂鐮併€佸姛鑳藉叏鍜搁奔 6.3.2娌℃湁寮€灞忓箍鍛婏紝鎵撳紑涓嶄細鏈夋洿鏂版彁閱扵witter 7.37.2甯︾炕璇戝姛鑳界殑澧ㄨ抗澶╂皵 7.1.6閫傞厤ios11鐨勭涓€涓増鏈紝鎵撳紑蹇拰椋炰俊 4.1.1352鏈€鍚庢嫢鏈夋紡璇濇嬀閬楀姛鑳界殑鐗堟湰锛屾紡璇濇嬀閬楀姛鑳芥墦寮€鍚庡湪娓告垙鏃朵笉浼氳鎵撴壈澶╃考浜戠洏 4.5.0鏈€鍚庝竴涓笉闇€瑕佽秴绾т細鍛樺氨鍙互涓婁紶瑙嗛鐨勭増鏈紝姣忔棩绛惧埌杩樿兘澧炲姞绌洪棿缃戞槗婕敾 4.2.0瓒婄嫳鐢ㄦ埛鍙互浣跨敤flex3浼氬憳琛ヤ竵閽夐拤 4.3.5鏈€鍚庢敮鎸乧allkit鐗堟湰鏃犲咖琛?3.8.2鏈€鍚庢敮鎸乧allkit鐗堟湰楗夸簡涔?7.21杩樺彲浠ヤ娇鐢ㄥ彔鍔犵孩鍖呮淮婊村嚭琛?.1棣栦釜鏀寔婊存淮鍗曡溅鐨勭増鏈琋omo鐩告満 0.9.6鏂板晢搴楀墠鐨勬渶鍚庝竴涓増鏈紝涓嶈噧鑲匡紝鍒囨崲鐩告満鏂逛究tim 1.1.6鍔熻兘绠€娲侊紝鍚姩蹇椋炶緭鍏ユ硶 6.0瀹夎鍖呭皬杈撳叆娴佺晠鐧惧害杈撳叆娉?6.0.2鍒氬ソ鍙互浣跨敤瓒呯骇鐨偆鐨勭増鏈紝娌℃湁鍓垏鏉匡紝杈撳叆娴佺晠鐧惧害杈撳叆娉?7.1.1鏃犺噧鑲垮拰鏃犺闊冲姛鑳界殑鐗堟湰鎼滅嫍杈撳叆娉?4.0.0杈撳叆鏋佸害娴佺晠锛屾敮鎸乮os11寮虹儓鎺ㄨ崘鎼滅嫍杈撳叆娉?5.0.1鏂板姛鑳藉锛屼娇鐢ㄦ祦鐣呮棤鍗¢】鏈夐亾浜戠瑪璁?5.7.1绗旇鍒楄〃鏃犲箍鍛婏紝銆屾垜鐨勩€嶇晫闈㈡湁骞垮憡鏈夐亾浜戠瑪璁?5.9.8浜戠瑪璁颁笌浜戝崗浣滃垎寮€鍓嶇殑鏈€鍚庝竴鐗堬紝鏈夊箍鍛婏紝浣嗕笉鐢ㄥ畨瑁呬袱涓簲鐢ㄨ吘璁炕璇?3.1鏈€鍚庝竴涓棤鑷冭偪鍔熻兘鐗堬紝涓昏鍔熻兘閮芥湁鍞卞惂 8.2娴佺晠绋冲畾锛屽崰鐢ㄥ唴瀛樹綆鍏ㄦ皯k姝?3.7.6娴佺晠绋冲畾缇庡浘绉€绉€ 6.0.5娴佺晠绋冲畾鑺遍笩瀛?1.2淇濆瓨鐪熷僵鑹茬敾浣滐紝鑳屾櫙鐢诲竷绱犳潗涓庢柊鐗堢浉鍚屾枃浠跺叏鑳界帇 5.4鏀寔鍡呮帰寮忎笅杞介煶瑙嗛锛屾敮鎸乵3u8鏍煎紡涓嬭浇鐢佃鍔╂墜 5.5.0鏀寔闊宠棰戜笅杞斤紝鏀寔瀵煎嚭鏂囦欢persian idm 1.0鏃犲箍鍛婏紝鏃犲唴璐紝鏀寔闊宠棰戜笅杞藉揩鐪艰拷鍓?1.6.2鏀寔浜戞挱鏀綯elegram x 5.0.2鏃犻檺鍒跺睆钄界粍锛屽叿浣撹嚜琛屾祴璇曞枩椹媺闆?5.4.9浣撶н灏忥紝鍚姩蹇眴鐡?4.1.0鍚姩蹇紝姝ょ増鍚庣殑姝ゅ簲鐢ㄤ綋绉秺鏉ヨ秺澶umbook 1.3姹や笉鐑涓夋柟瀹㈡埛绔紝甯︿笅杞藉姛鑳界殑鏃х増tumbot 1.0.5鏃犲箍鍛婏紝鏀寔涓嬭浇瑙嗛鎸囧皷娴忚鍣?1.6甯︿笅杞藉姛鑳斤紝鏀寔m3u8锛屾柊鐗?.9闇€绯荤粺涓烘眽璇墠甯︿笅杞藉姛鑳介波楸兼祻瑙堝櫒 1.0鏀寔瑙嗛涓嬭浇锛屾敮鎸乵3u8鏍煎紡涓嬭浇鐭ヤ箮 3.10.0鏃犲箍鍛婏紝鏃犮€岄€氱煡銆嶆寜閽紝浣嗛儴鍒嗗姛鑳芥棤娉曟甯镐娇鐢ㄧ煡涔?3.12.0鏃犲箍鍛婏紝鏈夈€岄€氱煡銆嶆寜閽紝浣嗛儴鍒嗗姛鑳芥棤娉曟甯镐娇鐢ㄧ煡涔?4.4.2鏄渶鍚庝竴涓洖绛旈〉闈㈤噷娌℃湁骞垮憡鐨勭増鏈井鍗?7.3.1寰崥鍑虹幇棣栭〉鐩存挱鍥炬爣鍓嶆渶鍚庝竴鐗堬紝璇勮椤垫殏鏃犲箍鍛婏紝鐩稿绠€娲丵q 6.5.9瀹夎鍖呭皬锛屽惎鍔ㄥ揩锛屼絾涓嶆敮鎸佹枩鐪肩瑧锛忔墭鑵瓑琛ㄦ儏鐨勬煡鐪婹q 6.6.5瀹夎鍖呭皬鍚姩杩呴€燂紝ios12鍙互娴佺晠浣跨敤qq 6.7.1qq 7.0涔嬪墠鐨勬渶鍚庝竴鐗堬紝寰堟竻鐖斤紝浣嗕細鏈夊皬绾㈢偣鏇存柊鎻愮ずqq 7.2.5鍏ㄩ潰閫傞厤ios11qq闊充箰 5.2.2鐢‵lex鍙洿鎺ヤ笅鏃犳崯鏍煎紡qq闊充箰 6.2鍗犵敤鍐呭瓨灏戯紝鍚姩蹇玅q闊充箰 6.3.1鍙互鍏嶈垂浣跨敤dts闊虫晥qq闊充箰 6.5.1鍙互涓嬭浇楂樻竻mvqq绌洪棿 5.1.1鍔ㄦ€佹祻瑙堟棤骞垮憡锛宨os11鏃犳硶瀹夎qq娴忚鍣?6.1.1鑳界紦瀛樿棰戠殑鏈€鍚庝竴鐗圦q娴忚鍣?6.3鏈€鍚庝竴涓兘鍏抽棴澶存潯鐨勭増鏈櫨搴︾綉鐩?6.6.0鏀寔瑙e帇鏂囦欢锛屾枃浠惰矊浼兼棤娉曞鍑猴紝娌″叾浠栦紭鐐圭櫨搴︾綉鐩?6.7.3鍒氬ソ鏀寔閲嶅懡鍚嶅悗缂€鍜屾墦寮€鍒嗕韩鏈煡鏂囦欢铚昏湏fm 4.7.6鏃犻煶棰戝箍鍛奤c娴忚鍣?10.5.5鏃犲ご鏉★紝鑳界紦瀛樿棰戯紝浣唅os11浼氭湁闂€€鎯呭喌鍙戠敓uc娴忚鍣?10.7.11鏈夊ご鏉★紝鑳界紦瀛樿棰戠殑鏈€鍚庝竴鐗堬紝涓嶆敮鎸佺涓夋柟鎵撳紑uc娴忚鍣?11.3.1鍙紦瀛樿棰戯紝涓嬭浇鏂囦欢锛岄椤垫棤骞垮憡铏剧背闊充箰 6.1.8閫傞厤ios11锛岄殢蹇冨惉鑷畾涔夋ā寮忓ぉ澶╁姩鍚?8.1.5澶╁ぉ鍔ㄥ惉鍙樻垚闃块噷鏄熺悆鐨勬渶鍚庝竴鐗堬紝缃戠粶鏈嶅姟鍋滄帀锛屽彲褰撶绾挎挱鏀惧櫒浣跨敤閰风嫍闊充箰 3.9.4绾补鐨勬挱鏀惧櫒閰锋垜闊充箰 4.9.2鍙互涓嬭浇鏃犳崯闊宠川鐨勭増鏈紝浣嗙増鏈お鏃у緢澶氭満鍣ㄥ彲鑳借涓嶄笂澶氱湅闃呰 3.5.3绾补鐨勯槄璇诲櫒锛屼絾ios11涓婇€傞厤鏈夐棶棰楧ownloads 2.0.0涓嬭浇瑙嗛鍒╁櫒aloha 2.0.3锛堜腑鍖哄凡涓嬫灦锛夎棰戠紦瀛樺埄鍣紝娣诲姞鏂伴椈棣栭〉鍓嶇殑鏈€鍚庝竴鐗圕astro 2.6.2鍚勫浗鐢靛彴鎾斁鍣紝瀛﹁瑷€鍒╁櫒锛屽垯鏄棤璁㈤槄闄愬埗鐨勬渶鍚庝竴鐗堥珮寰峰湴鍥?7.5.8鏃犲紑灞忓箍鍛婇珮寰峰湴鍥?8.50.0鎻愰啋涓嶅脊鍑猴紝浣跨敤鍙嬪ソ楂樺痉鍦板浘 8.90涓嶅崱涓嶅彂鐑敮浠樺疂 10.1.32鍚姩蹇紝绗竴涓敮鎸侀€氱煡鏍忓睍寮€浠樻鐮佺殑鐗堟湰濞侀攱缃?2.2.11鏃犲箍鍛婏紝浣嗕細鍛樻秷鎭€氱煡鎵撲笉寮€pin 3.2.2鎷ユ湁瀹屾暣xteko瀹為獙瀹ゅ姛鑳界殑鏈€鍚庝竴涓増鏈琌xford advanced learner鈥檚 dictionary 3.53.32鐗涙触楂橀樁鑻辨眽绗叓鐗堬紝鏈€鍚庝竴涓敹璐圭増鏈琈erriam-webster dictionary 2.1鏃犲箍鍛婏紝浣嗛珮鐗堟湰绯荤粺鏃犳硶瀹夎缇庨鐩告満 5.7.5鏁堟灉姣旇緝鑷劧鐗堢編棰滅浉鏈?6.2.6鍚富棰樹箰鍥増缇庨鐩告満 7.1.1绗竴涓湁钀屾媿鐗圱v assist鐢佃鍔╂墜 5.5.0鏀寔闊宠棰戜笅杞斤紝鏀寔瀵煎嚭鏂囦欢intolive pro 2.0.2鐢℅if鎴栬棰戣€屽埗浣滃姩鎬佸绾革紝30绉掑厓姘旈獞澹?1.6.2鍚屾椂鏀寔鍗℃棤闄愬够褰辩殑bug鍜?浜鸿仈鏈虹殑鐗堟湰锛屽啀鏃╂病鑱旀満锛屽啀鏅氭病bug瑙﹀疂鐢佃瘽 5.6.1鍒氬姞鍏ヤ翰鎯呭彿鐨勭増鏈紝鏈夊箍鍛婁絾涓嶅锛堜箣鍚庣増鏈箍鍛婅秴澶氾級tdownloadr 2.6.4涓嬭浇绁炲櫒锛屾敮鎸佸浗鍐呭鍑犱箮鎵€鏈夎棰戜笅杞斤紙鏂扮増涓嬭浇鍔熻兘闃夊壊锛夌鎷?6.7.6.8浼犺棰戠ǔ瀹氫笖涓嶄細鐗瑰埆鍘嬬缉闈㈣川锛岃€屾柊鐗堜細鑷姩鍓瑙嗛avplayer 1.645鏈€鍚庝竴涓敮鎸丏ts鐨勭増鏈珹vplayer 2.50鏈€鍚庝竴涓敮鎸丄ac鎵撳紑鏉滄瘮鐜粫闊虫晥鐨勭増鏈琻player 2.6.5鏀寔aac鎵撳紑鏉滄瘮鐜粫闊虫晥锛岄煶鏁堟瘮鏂扮増鐨勫ソ锛屽揩鎷塅lv鏍煎紡鐨勬椂鍊欎笉鍗★紝浣嗕笉鏀寔dtsthor 1.2.0.283鐩存帴鏌ョ湅鍝嶅簲涓秷鎭綋鐨勯煶瑙嗛鏂囦欢锛屾姄鍙栧埌鐨勯煶瑙嗛鏂囦欢锛屽彲浠ユ挱鏀撅紝鏀寔鍒嗕韩鍜屽鍑猴紙鏂扮増鏈檺鍒堕煶瑙嗛鏂囦欢鐩存帴鏌ョ湅鍜屽鍑猴級alfred 2.8姝ゅ悗鐨勭増鏈細鍜?popclip 鐨勬璺彇璇嶅彂鐢熷啿绐乀erminology 3.3.4鏈€鍚庝竴涓敹璐圭増ulysses 10鏈€鍚庝竴涓潪璁㈤槄鐗?/p>
鑰?mac 鐢ㄦ埛灏辨病杩欎箞鏂逛究鐨勫伐鍏蜂簡锛屽彧鑳借嚜宸辨墜鍔ㄦ姄鍖呬簡锛屽叿浣撴暀绋嬭鐪嬮樋铏氫箣鍓嶅啓鐨勯偅绡囨暀绋嬶紝鏂规硶鏄緷鐒舵湁鏁堢殑锛歨ttps://mp.weixin.qq /s/chcrhxvcbsdd0gcu-7wu0q
鎺ㄧ壒濡備綍瑙i櫎鏁忔劅鍐呭鐨勯檺鍒讹紝杩欓噷涓哄ぇ瀹跺垎鍒粙缁嶈嫻鏋溿€佸畨鍗撱€佺綉椤电増鐨勬帹鐗规€庝箞鐪嬫晱鎰熷唴瀹癸紝鏈夐渶瑕佺殑鏈嬪弸鍙互鐪嬩竴涓嬨€?/p>
聽
涓€銆佽嫻鏋滃畨鍗撴墜鏈鸿в闄ゆ晱鎰熷唴瀹规柟娉曪紙瀵瑰簲涓嫳鏂囩増锛?/p>
1.鎵撳紑鎵嬫満鎺ㄧ壒app锛岀偣鍑诲乏涓婅鐨勩€愪笁妯€戣繘鍏ヤ釜浜轰腑蹇冪晫闈紱鎺ㄧ壒瑙i櫎鏁忔劅鍐呭姝ョ紑
2.鍦ㄥ脊鍑虹殑涓汉涓績涓偣鍑汇€愯缃拰闅愮聽settings and privacy銆戣繘鍏ラ殣绉佽缃〉闈紱鎺ㄧ壒瑙i櫎鏁忔劅鍐呭姝ョ紑
3.閫氳繃璁剧疆鍜岄殣绉佷腑鐨勩€愰殣绉佸拰瀹夊叏聽privacy and safety銆戞墦寮€鎺ㄦ枃瀹夊叏淇濇姢椤甸潰锛涙帹鐗硅в闄ゆ晱鎰熷唴瀹规缂€
4.鍦ㄩ殣绉佷笌瀹夊叏璁剧疆閫夐」涓壘鍒般€愬畨鍏ㄣ€?銆愬睍绀哄彲鑳藉寘鍚晱鎰熷唴瀹圭殑濯掍綋聽display media that may contain sensitive content銆戝嬀閫夛紝杩欐牱灏卞彲浠ョ湅鏁忔劅鍐呭浜嗐€傛帹鐗硅в闄ゆ晱鎰熷唴瀹规缂€
聽
浜屻€佺綉椤电増瑙i櫎鏁忔劅鍐呭鏂规硶
缃戝潃鐧诲綍鎺ㄧ壒瀹樼綉( twitter / )锛岀櫥褰曡处鍙峰悗銆?/p>
绗竴姝ワ細鍦ㄤ富鐣岄潰宸︿晶鑿滃崟鏍忥紝鐐瑰嚮銆愭洿澶毬燤ore銆戯紱缃戦〉鎺ㄧ壒瑙i櫎鏁忔劅鍐呭绗竴姝?/p>
绗簩姝ワ細鐐瑰嚮寮瑰嚭涓汉涓績宸﹀彸鐨劼犮€愯缃拰闅愮聽settings and privacy銆戯紱缃戦〉鎺ㄧ壒瑙i櫎鏁忔劅鍐呭绗簩姝ワ紱
绗笁姝ワ細鍦ㄣ€愯缃甋ettings銆?涓壘鍒?銆愰殣绉佸拰瀹夊叏聽privacy and safety銆戝彸渚?銆愪綘鐪嬪埌鐨勫唴瀹孤燙ontent you see銆戯紱缃戦〉鎺ㄧ壒瑙i櫎鏁忔劅鍐呭绗笁姝ワ細
绗洓姝ワ細鍦ㄧ偣寮€鍙鍐呭涓壘鍒奥犮€愭樉绀哄彲鑳藉寘鍚晱鎰熷唴瀹圭殑濯掍綋聽display media that may contain sensitive content銆戞墦鍕惧嵆鍙€?/p>
聽
杩欑瘒鏂囩珷涓昏浠嬬粛浜嗚嫻鏋滄墜鏈烘€庝箞鐢ㄨ摑鐗欎紶鐓х墖鍒板畨鍗撴墜鏈猴紝鍏锋湁涓€瀹氬€熼壌浠峰€硷紝闇€瑕佺殑鏈嬪弸鍙互鍙傝€冧笅銆傚笇鏈涘ぇ瀹堕槄璇诲畬杩欑瘒鏂囩珷鍚庡ぇ鏈夋敹鑾凤紝涓嬮潰璁╁皬缂栧甫鐫€澶у涓€璧蜂簡瑙d竴涓嬨€?/p>
2019鐙鍏戒紒涓氶噸閲戞嫑鑱楶ython宸ョ▼甯堟爣鍑?>>聽
璁╀綘鐨刬os搴旂敤绋嬪簭鏀寔杩愯javascript鑴氭湰锛欽avascriptcore妗嗘灦璇﹁в
聽 聽 璇村埌javascript鑴氭湰锛宨os寮€鍙戣€呴兘浼氭兂鍒颁竴涓悕鍙獼avascriptcore鐨勬鏋躲€傝繖涓鏋剁殑纭崄鍒嗗己澶э紝鍏朵腑灏佽浜嗕竴濂桱avascript杩愯鐜浠ュ強native涓嶫s鏁版嵁绫诲瀷涔嬮棿鐨勮浆鎹㈡ˉ姊佸揩鐮佽鏂囥€傛湰绡囧崥瀹富瑕佽璁哄浣曚娇鐢ㄦ妗嗘灦鏉ュ湪ios搴旂敤涓繍琛孞avascript鑴氭湰銆?/p>
涓€銆丣avascriptcore妗嗘灦缁撴瀯
聽 聽 鍦ㄥ涔犱竴涓鏋舵椂锛岄鍏堝簲璇ュ厛浜嗚в鏁翠釜妗嗘灦鐨勭粨鏋勶紝鎷縤os寮€鍙戞潵涓句緥锛屽浜庝竴涓檶鐢熺殑妗嗘灦锛岀涓€姝ラ渶瑕佸厛鎼炴竻妤氳繖閲岄潰閮藉寘鍚摢浜涚被锛屼釜鍚勭被涔嬮棿鏄€庢牱鐨勫叧绯伙紝杩欎釜妗嗘灦鍜屽叾浠栫殑妗嗘灦闂存湁鏃犺仈绯讳互鍙婃€庢牱浜х敓鐨勮仈绯汇€傚皢浜涢棶棰樻悶娓呮锛屾湁浜嗗ぇ浣撲笂鐨勮璇嗗悗锛屾垜浠啀鏉ュ涔犲叾涓殑姣忎釜绫诲嵆鍏朵粬缁嗚妭鐨勫簲鐢ㄥ皢闈炲父瀹规槗銆傛垜浠厛鏉ョ湅涓€寮燡avascriptcore妗嗘灦鐨勭粨鏋勫浘锛?/p>
杩欏紶鍥炬槸鎴戞墜宸ョ敾鐨勶紝涓嶆槸閭d箞缇庤骞朵笖娌℃湁鏂囧瓧鐨勮в閲婏紝浣嗘槸鎴戣寰楀畠鑳介潪甯哥洿瑙傜殑琛ㄨ揪javascriptcore涓寘鍚殑绫讳箣闂寸殑鍏崇郴銆備笅闈㈡垜鏉ュ悜浣犺в閲婅繖寮犲浘绌剁珶琛ㄨ揪浜嗕粈涔堟剰鎬濓紝棣栧厛鍘熺敓鐨刬os搴旂敤鏄敮鎸佸绾跨▼鎵ц浠诲姟鐨勶紝鎴戜滑鐭ラ亾javascript鏄崟绾跨▼锛屼絾杩欏苟涓嶄唬琛ㄦ垜浠笉鑳藉湪native涓紓姝ユ墽琛屼笉鍚岀殑javascript浠g爜銆?/p>
1.jsvirtualmachine鈥斺€擩avascript鐨勮櫄鎷熸満
聽聽聽聽javascriptcore涓彁渚涗簡涓€涓悕涓篔svirtualmachine鐨勭被锛岄【鍚嶆€濅箟锛岃繖涓被鍙互鐞嗚в涓轰竴涓狫s铏氭嫙鏈恒€傚湪native涓紝鍙浣犳効鎰忥紝浣犲彲浠ュ垱寤轰换鎰忓涓狫svirtualmachine瀵硅薄锛屽悇涓狫sviretualmachine瀵硅薄闂存槸鐩镐簰鐙珛鐨勶紝浠栦滑涔嬮棿涓嶈兘鍏变韩鏁版嵁涔熶笉鑳戒紶閫掓暟鎹紝濡傛灉浣犳妸浠栦滑鏀惧湪涓嶅悓鐨凬ative绾跨▼锛屼粬浠氨鍙互骞惰鐨勬墽琛屾棤鍏崇殑js浠诲姟銆?/p>
2.jscontext鈥斺€擩avascript杩愯鐜
聽 聽 jscontext涓婁笅鏂囧璞″彲浠ョ悊瑙d负鏄疛s鐨勮繍琛岀幆澧冿紝鍚屼竴涓狫svirtualmachine瀵硅薄鍙互鍏宠仈澶氫釜jscontext瀵硅薄锛屽苟涓斿湪webview涓瘡娆″埛鏂版搷浣滃悗锛屾webview鐨凧s杩愯鐜閮芥槸涓嶅悓鐨凧scontext瀵硅薄銆傚叾浣滅敤灏辨槸鐢ㄦ潵鎵цjs浠g爜锛屽湪native鍜孞s闂磋繘琛屾暟鎹殑浼犻€掋€?/p>
3.jsvalue鈥斺€擩avascript鍊煎璞?/p>
聽 聽 javascript鍜孫bjective-c铏界劧閮芥槸闈㈠悜瀵硅薄璇█锛屼絾鍏跺疄鐜版満鍒跺畬鍏ㄤ笉鍚岋紝oc鏄熀浜庣被鐨勶紝js鏄熀浜庡師鍨嬬殑锛屽苟涓斾粬浠殑鏁版嵁绫诲瀷闂翠篃瀛樺湪寰堝ぇ鐨勫樊寮傘€傚洜姝よ嫢瑕佸湪native鍜孞s闂存棤闅滅鐨勮繘琛屾暟鎹殑浼犻€掞紝灏遍渶瑕佷竴涓腑闂村璞″仛妗ユ帴锛岃繖涓璞″氨鏄疛svalue銆?/p>
4.jsexport
聽 聽 jsexport鏄竴涓崗璁紝native涓伒瀹堟瑙f瀽鐨勭被鍙互灏嗘柟娉曞拰灞炴€ц浆鎹负js鐨勬帴鍙d緵js璋冪敤銆?/p>
5.涓€浜涚敤浜嶤璇█鐨勭粨鏋?/p>
聽 聽 浣犱竴瀹氭敞鎰忓埌浜嗭紝涓婂浘鐨勫彸涓嬭杩樻湁涓€鍧楄铏氱嚎鍖呭洿鐨勫尯鍩燂紝鍏朵腑鐨?绫?閮芥槸c璇█椋庢牸锛孞avascriptcore妗嗘灦鏄敮鎸佸湪objective-c銆丼wift鍜孋涓夌璇█涓娇鐢ㄧ殑銆?/p>
浜屻€佸湪native涓繍琛孞avascript鑴氭湰浠g爜
聽 聽 鎴戜滑鍏堟潵缂栧啓涓€涓渶绠€鍗曠殑渚嬪瓙锛屼娇鐢∣c浠g爜鏉ユ墽琛屼竴娈礘s鑴氭湰銆傞鍏堟柊寤轰竴涓枃浠讹紝灏嗗叾鍚庣紑璁剧疆涓?js锛屾垜杩欓噷灏嗗畠鍛戒护涓簃ain.js锛屽湪鍏朵腑缂栧啓濡備笅浠g爜锛?/p>
(function(){
console.log("hello native");
})();
涓婇潰鏄竴涓嚜鎵ц鐨勫嚱鏁帮紝鍏朵腑鎵撳嵃浜嗏€淗ello native鈥濆瓧绗︿覆銆傚湪native涓紪鍐欏涓嬩唬鐮侊細
- (void)viewdidload {
[super viewdidload];
nsstring * path = [[nsbundle mainbundle] pathforresource:@"main" oftype:@"js"];
nsdata * jsdata = [[nsdata alloc]initwithcontentsoffile:path];
nsstring * jscode = [[nsstring alloc]initwithdata:jsdata encoding:nsutf8stringencoding];
self.jscontext = [[jscontext alloc]init];
[self.jscontext evaluatescript:jscode];
}
闇€瑕佹敞鎰忥紝鍏跺疄杩欓噷鎴戝皢鍒涘缓鐨凧scontext瀵硅薄浣滀负浜嗗綋鍓嶈鍥炬帶鍒跺櫒鐨勫睘鎬э紝杩欐牱鍋氱殑鐩殑浠呬粎鏄负浜嗘柟渚胯皟璇曪紝涓嶈繃涓嶅姝ontext瀵硅薄杩涜寮曠敤锛屽綋viewdidload鍑芥暟鎵ц瀹屾垚鍚庯紝js杩愯鐜涔熷皢琚攢姣侊紝鎴戜滑灏辨棤娉曞湪safari涓洿瑙傜殑鐪嬪埌js浠g爜鐨勬墽琛岀粨鏋滀簡銆?/p>
聽 聽 杩愯宸ョ▼锛岃寰楄鎵撳紑safari娴忚鍣ㄧ殑鑷姩鏄剧ずjscontent妫€鏌ュ櫒锛屽涓嬪浘锛?/p>
褰搃os妯℃嫙鍣ㄨ窇璧锋潵鍚庯紝safari浼氳嚜鍔ㄥ脊鍑哄紑鍙戣€呭伐鍏凤紝鍦ㄦ帶鍒跺彴閲岄潰鍙互鐪嬪埌鏉ヨ嚜javascript鐨勭湡鎸氶棶鍊欙細
鍒氭墠鎴戜滑鍙槸绠€鍗曚簡閫氳繃鍘熺敓璋冪敤浜嗕竴娈礘s浠g爜锛屼絾鏄鏋淣ative鍦ㄨ皟js鏂规硶鏃舵棤娉曚紶鍙傞偅涔熷おlow浜嗭紝鎴戜滑鍙互鐩存帴灏嗚浼犻€掔殑鍙傛暟鏍煎紡鍖栧埌瀛楃涓蹭腑锛屼慨鏀筸ain.js鏂囦欢濡備笅锛?/p>
function put(name){
console.log("hello " name);
};
put(%@);
鍐嶅皝瑁呬竴涓狾c鏂规硶濡備笅锛?/p>
-(void)runjs_hello:(nsstring *)name{
nsstring * path = [[nsbundle mainbundle] pathforresource:@"main" oftype:@"js"];
nsdata * jsdata = [[nsdata alloc]initwithcontentsoffile:path];
nsstring * jscode = [[nsstring alloc]initwithdata:jsdata encoding:nsutf8stringencoding];
nsstring * finistring = [nsstring stringwithformat:jscode,name];
[self.jscontext evaluatescript:finistring];
}
鍦╲iewdidload涓繘琛岃皟鐢紝濡備笅锛?/p>
- (void)viewdidload {
[super viewdidload];
self.jscontext = [[jscontext alloc]init];
[self runjs_hello:@"'闃垮嚒杈?"];
}
杩愯鍐嶇湅safari鎺у埗鍙扮殑缁撴灉锛岀紪绋嬩簡hello 闃垮嚒杈緙锛?/p>
鍏跺疄evaluatescript鍑芥暟鎵ц鍚庝細灏咼s浠g爜鐨勬墽琛岀粨鏋滆繘琛岃繑鍥烇紝鏄疛svalue绫诲瀷鐨勫璞★紝鍚庨潰浼氬啀浠嬬粛銆?/p>
涓夈€佸湪javascript涓皟鐢∟ative鏂规硶
聽 聽 鏈夋潵鏃犲線闈炲悰瀛愶紝鍚屾牱涔熷彲浠ュ湪鍘熺敓涓紪鍐欐柟娉曡js鏉ヨ皟鐢紝绀轰緥濡備笅锛?/p>
- (void)viewdidload {
[super viewdidload];
void(^block)() = ^(){
nslog(@"hello javascript");
};
self.jscontext = [[jscontext alloc]init];
[self.jscontext setobject:block forkeyedsub:@"oc_hello"];
}
涓婇潰setobject:forkeyedsub:鏂规硶鐢ㄦ潵鍚慗scontext鐜鐨勫叏灞€瀵硅薄涓坊鍔犲睘鎬э紝杩欓噷娣诲姞浜嗕竴涓嚱鏁板睘鎬э紝鍙栧悕涓簅c_hello銆傝繖閲孞avascriptcore浼氳嚜鍔ㄥ府鎴戜滑鎶婁竴浜涙暟鎹被鍨嬭繘琛岃浆鎹紝浼氬皢oc鐨勫嚱鏁拌浆鎹负js鐨勫嚱鏁帮紝杩愯宸ョ▼锛屽湪safari鐨勬帶鍒跺彴涓皟鐢╫c_hello鍑芥暟锛屽彲浠ョ湅鍒板湪xcode鎺у埗鍙拌緭鍑轰簡瀵笿avascript鐨勭湡鎸氶棶鍊欙紝濡備笅锛?/p>
鍚屾牱锛屽鏋滃0鏄庣殑block鏄甫鍙傛暟鐨勶紝js鍦ㄨ皟鐢ㄦoc鏂规硶鏃朵篃闇€瑕佷紶鍏ュ弬鏁帮紝濡傛灉block鏈夎繑鍥炲€硷紝鍒欏湪js涓篃鑳借幏鍙栧埌杩斿洖鍊硷紝渚嬪锛?/p>
bool (^block)(nsstring *) = ^(nsstring *name){
nslog(@"%@", [nsstring stringwithformat:@"hello %@",name]);
return yes;
};
self.jscontext = [[jscontext alloc]init];
[self.jscontext setobject:block forkeyedsub:@"oc_hello"];
鍥涖€佹繁鍏scontext绫?/p>
聽 聽 鐪嬪埌杩欙紝浣犲凡缁忓浼氭渶鍩虹鐨凮c涓嶫s浜掔浉闂ソ(浜や簰)銆備笅闈㈡垜浠啀鏉ユ繁鍏ョ湅涓婮scontext涓殑灞炴€у拰鏂规硶銆?/p>
聽 聽 鍒涘缓jscontext瀵硅薄鏈夊涓嬩袱绉嶆柟寮忥細
//鍒涘缓涓€涓柊鐨凧s杩愯鐜
- (instancetype)init;
//鍒涘缓涓€涓柊鐨凧s杩愯鐜 骞跺叧鑱斿埌鏌愪釜铏氭嫙鏈哄璞′笂
- (instancetype)initwithvirtualmachine:(jsvirtualmachine *)virtualmachine;
聽 聽 鎵цjs浠g爜鏈夊涓嬩袱涓柟娉曪細
//鎵цjs浠g爜 缁撴灉灏嗗皝瑁呮垚jsvalue瀵硅薄杩斿洖
- (jsvalue *)evaluatescript:(nsstring *);
//浣滅敤鍚屼笂
- (jsvalue *)evaluatescript:(nsstring *) withsourceurl:(nsurl *)sourceurl ns_available(10_10, 8_0);
聽 聽 涓嬮潰鐨勫睘鎬у拰鏂规硶鍙互鑾峰彇鍒癑s杩愯鐜涓殑涓€浜涗俊鎭細
//褰撳墠鐨凧s杩愯鐜 褰揓s璋冪敤oc鏂规硶鏃讹紝鍦∣c鏂规硶涓彲浠ョ敤姝ゆ柟娉曡幏鍙栧埌js杩愯鐜
(jscontext *)currentcontext;
//鑾峰彇褰撳墠鎵ц鐨凧s鍑芥暟锛屽綋js璋冪敤oc鏂规硶鏃讹紝鍦∣c鏂规硶涓彲浠ョ敤姝ゆ柟娉曡幏鍙栧埌鎵ц鐨勫嚱鏁?/p>
(jsvalue *)currentcallee;
//鑾峰彇褰撳墠鎵ц鐨凧s鍑芥暟涓殑this鎸囧悜鐨勫璞?/p>
(jsvalue *)currentthis;
//鑾峰彇褰撳墠鎵ц鍑芥暟鐨勫弬鏁板垪琛紝褰揓s璋冪敤oc鏂规硶鏃讹紝鍦∣c鏂规硶涓彲浠ョ敤姝ゆ柟娉曡幏鍙栧埌鎵ц鐨勫嚱鏁扮殑鍙傛暟鍒楄〃
(nsarray *)currentarguments;
//鑾峰彇褰撳墠js杩愯鐜鐨勫叏灞€瀵硅薄
@property (readonly, strong) jsvalue *globalobject;
//褰撹繍琛岀殑javascript浠g爜鎶涘嚭浜嗘湭鎹曡幏鐨勫紓甯告椂锛岃繖涓睘鎬т細琚祴鍊间负鎶涘嚭鐨勫紓甯?/p>
@property (strong) jsvalue *exception;
//璁剧疆涓轰竴涓紓甯告崟鑾风殑block锛屽鏋滃紓甯歌姝lock鎹曡幏锛宔xception灞炴€у氨涓嶅啀琚祴鍊间簡
@property (copy) void(^exceptionhandler)(jscontext *context, jsvalue *exception);
//褰撳墠杩愯鐜鎵€鍏宠仈鐨勮櫄鎷熸満
@property (readonly, strong) jsvirtualmachine *virtualmachine;
//褰撳墠杩愯鐜鍚嶇о
@property (copy) nsstring *name;
//鑾峰彇褰撳墠js杩愯鐜鍏ㄥ眬瀵硅薄涓婄殑鏌愪釜灞炴€?/p>
- (jsvalue *)objectforkeyedsub:(id)key;
//璁剧疆褰撳墠js杩愯鐜鍏ㄥ眬瀵硅薄涓婄殑灞炴€?/p>
- (void)setobject:(id)object forkeyedsub:(nsobject
//灏咰璇█鐜鐨凧s杩愯鐜杞崲涓篛c鐜鐨凧s杩愯鐜
(jscontext *)contextwithjsglobalcontextref:(jsglobalcontextref)jsglobalcontextref;
//c璇█鐜鐨凧s杩愯涓婁笅鏂?/p>
@property (readonly) jsglobalcontextref jsglobalcontextref;
浜斻€佹繁鍏svalue绫?/p>
聽 聽 jsvalue鏄疛avascript涓嶰bjective-c涔嬮棿鐨勬暟鎹ˉ姊併€傚湪objective-c涓皟鐢↗s鑴氭湰鎴栬€匤s璋冪敤oc鏂规硶閮藉彲浠ヤ娇鐢↗svalue鏉ヤ紶杈撴暟鎹€傚叾涓睘鎬у拰鏂规硶绀轰緥濡備笅锛?/p>
//鎵€瀵瑰簲鐨凧s杩愯鐜
@property (readonly, strong) jscontext *context;
//鍦ㄦ寚瀹氱殑js杩愯鐜涓垱寤轰竴涓狫svalue瀵硅薄
(jsvalue *)valuewithobject:(id)value incontext:(jscontext *)context;
//鍒涘缓甯冨皵鍊?/p>
(jsvalue *)valuewithbool:(bool)value incontext:(jscontext *)context;
//鍒涘缓娴偣鍊?/p>
(jsvalue *)valuewithdouble:(double)value incontext:(jscontext *)context;
//鍒涘缓32浣嶆暣鍨嬪€?/p>
(jsvalue *)valuewithint32:(int32_t)value incontext:(jscontext *)context;
//鍒涘缓32浣嶆棤绗﹀彿鏁村舰鍊?/p>
(jsvalue *)valuewithuint32:(uint32_t)value incontext:(jscontext *)context;
//鍒涘缓绌虹殑js瀵硅薄
(jsvalue *)valuewithnewobjectincontext:(jscontext *)context;
//鍒涘缓绌虹殑js鏁扮粍
(jsvalue *)valuewithnewarrayincontext:(jscontext *)context;
//鍒涘缓js姝e垯瀵硅薄
(jsvalue *)valuewithnewregularexpressionfrompattern:(nsstring *)pattern flags:(nsstring *)flags incontext:(jscontext *)context;
//鍒涘缓js閿欒淇℃伅
(jsvalue *)valuewithnewerrorfrommessage:(nsstring *)message incontext:(jscontext *)context;
//鍒涘缓js null鍊?/p>
(jsvalue *)valuewithnullincontext:(jscontext *)context;
//鍒涘缓js undefined鍊?/p>
(jsvalue *)valuewithundefinedincontext:(jscontext *)context;
javascript涓殑鏁版嵁绫诲瀷鍜孫bjective-c鐨勬暟鎹被鍨嬭繕鏄湁鐫€寰堝ぇ鐨勫樊寮傦紝鍏朵腑瀵瑰簲鍏崇郴濡備笅锛?/p>
objective-c聽javascriptnilundefinednsnullnullnsstringstringnsnumbernumber booleannsdictionary 聽聽objectnsarrayarraynsdatedate聽 聽blockfunctionidobjectclassobject
涓嬮潰杩欎簺鏂规硶鍙互灏咼svalue鍊艰浆鎹负objective-c涓殑鏁版嵁绫诲瀷锛?/p>
//灏咼svalue杞崲涓篛c瀵硅薄
- (id)toobject;
//灏咼svalue杞崲鎴愮壒瀹歄c绫荤殑瀵硅薄
- (id)toobjectofclass:(class)expectedclass;
//灏咼svalue杞崲鎴愬竷灏斿€?/p>
- (bool)tobool;
//灏咼svalue杞崲鎴愭诞鐐瑰€?/p>
- (double)todouble;
//灏咼svalue杞崲鎴?2浣嶆暣鍨嬪€?/p>
- (int32_t)toint32;
//灏咼svalue杞崲鎴?2浣嶆棤绗﹀彿鏁村瀷鍊?/p>
- (uint32_t)touint32;
//灏咼svalue杞崲鎴怤snumber鍊?/p>
- (nsnumber *)tonumber;
//灏咼svalue杞崲鎴怤sstring鍊?/p>
- (nsstring *)tostring;
//灏咼svalue杞崲鎴怤sdate鍊?/p>
- (nsdate *)todate;
//灏咼svalue杞崲鎴怤sarray鍊?/p>
- (nsarray *)toarray;
//灏咼svalue杞崲鎴怤sdictionary鍊?/p>
- (nsdictionary *)todictionary;
//鑾峰彇jsvalue瀵硅薄涓煇涓睘鎬х殑鍊?/p>
- (jsvalue *)valueforproperty:(nsstring *)property;
//璁剧疆jsvalue瀵硅薄涓煇涓睘鎬х殑鍊?/p>
- (void)setvalue:(id)value forproperty:(nsstring *)property;
//鍒犻櫎jsvalue瀵硅薄涓殑鏌愪釜灞炴€?/p>
- (bool)deleteproperty:(nsstring *)property;
//鍒ゆ柇jsvalue瀵硅薄涓槸鍚﹀寘鍚煇涓睘鎬?/p>
- (bool)hasproperty:(nsstring *)property;
//瀹氫箟jsvalue涓殑鏌愪釜灞炴€?杩欎釜鏂规硶鍜孞avascript涓璒bject鏋勯€犲嚱鏁扮殑defineproperty鏂规硶涓€鑷?/p>
/*
绗?涓弬鏁拌缃灞炴€х殑鎻忚堪淇℃伅 鍙互璁剧疆鐨勯敭鍊煎涓嬶細
nsstring * const jspropertydeorwritablekey;//璁剧疆甯冨皵鍊?鏄惁鍙啓
nsstring * const jspropertydeorenumerablekey;//璁剧疆甯冨皵鍊?鏄惁鍙灇涓?/p>
nsstring * const jspropertydeorconfigurablekey;//璁剧疆甯冨皵鍊?鏄惁鍙厤缃?/p>
nsstring * const jspropertydeorvaluekey;//璁剧疆姝ゅ睘鎬х殑鍊?/p>
nsstring * const jspropertydeorgetkey;//璁剧疆姝ゅ睘鎬х殑get鏂规硶
nsstring * const jspropertydeorsetkey;//璁剧疆姝ゅ睘鎬х殑set鏂规硶
浠ヤ笂set銆乬et鏂规硶鐨勯敭鍜寁alue銆佸彲鍐欐€х殑閿笉鑳藉悓鏃跺瓨鍦紝鍏惰娉曟槸javascript淇濇寔涓€鑷?/p>
*/
- (void)defineproperty:(nsstring *)property deor:(id)deor;
//鑾峰彇js鏁扮粍瀵硅薄鏌愪釜涓嬫爣鐨勫€?/p>
- (jsvalue *)valueatindex:(nsuinteger)index;
//璁剧疆js鏁扮粍瀵硅薄鏌愪釜涓嬫爣鐨勫€?/p>
- (void)setvalue:(id)value atindex:(nsuinteger)index;
//鍒ゆ柇姝ゅ璞℃槸鍚︿负undefined
@property (readonly) bool isundefined;
//鍒ゆ柇姝ゅ璞℃槸鍚︿负null
@property (readonly) bool isnull;
//鍒ゆ柇姝ゅ璞℃槸鍚︿负甯冨皵鍊?/p>
@property (readonly) bool isboolean;
//鍒ゆ柇姝ゅ璞℃槸鍚︿负鏁板€?/p>
@property (readonly) bool isnumber;
//鍒ゆ柇姝ゅ璞℃槸鍚︿负瀛楃涓?/p>
@property (readonly) bool isstring;
//鍒ゆ柇姝ゅ璞℃槸鍚︿负object瀵硅薄
@property (readonly) bool isobject;
//鍒ゆ柇姝ゅ璞℃槸鍚︿负鏁扮粍
@property (readonly) bool isarray;
//鍒ゆ柇姝ゅ璞℃槸鍚︿负鏃ユ湡瀵硅薄
@property (readonly) bool isdate;
//姣旇緝涓や釜jsvalue鏄惁鍏ㄧ浉绛?瀵瑰簲javascript涓殑===
- (bool)isequaltoobject:(id)value;
//姣旇緝涓や釜jsvalue瀵硅薄鐨勫€兼槸鍚︾浉绛?瀵瑰簲javascript涓殑==
- (bool)isequalwithtypecoerciontoobject:(id)value;
//鍒ゆ柇鏌愪釜瀵硅薄鏄惁鍦ㄥ綋鍓嶅璞$殑鍘熷瀷閾句笂
- (bool)isinstanceof:(id)value;
//濡傛灉jsvalue鏄疐unction瀵硅薄 鍙互璋冪敤姝ゆ柟娉?鍜孞avascript涓殑call鏂规硶涓€鑷?/p>
- (jsvalue *)callwitharguments:(nsarray *)arguments;
//濡傛灉jsvalue鏄竴涓瀯閫犳柟娉曞璞?鍙互璋冪敤姝ゆ柟娉?鍜孞avascript涓娇鐢╪ew鍏抽敭瀛椾竴鑷?/p>
- (jsvalue *)constructwitharguments:(nsarray *)arguments;
//鐢ㄦ瀵硅薄杩涜鍑芥暟鐨勮皟鐢?褰撳墠瀵硅薄浼氳缁戝畾鍒皌his涓?/p>
- (jsvalue *)invokemethod:(nsstring *)method witharguments:(nsarray *)arguments;
//灏咰gpoint杞崲涓篔svalue瀵硅薄
(jsvalue *)valuewithpoint:(cgpoint)point incontext:(jscontext *)context;
//灏哊srange杞崲涓篔svalue瀵硅薄
(jsvalue *)valuewithrange:(nsrange)range incontext:(jscontext *)context;
//灏咰grect杞崲涓篔svalue瀵硅薄
(jsvalue *)valuewithrect:(cgrect)rect incontext:(jscontext *)context;
//灏咰gsize杞崲涓篔svalue瀵硅薄
(jsvalue *)valuewithsize:(cgsize)size incontext:(jscontext *)context;
//杞崲鎴怌gpoint鏁版嵁
- (cgpoint)topoint;
//杞崲鎴怤srange鏁版嵁
- (nsrange)torange;
//杞崲鎴怌grect鏁版嵁
- (cgrect)torect;
//杞崲涓篊gsize鏁版嵁
- (cgsize)tosize;
//灏咰椋庢牸鐨凧svalueref瀵硅薄杞崲涓篔svalue瀵硅薄
(jsvalue *)valuewithjsvalueref:(jsvalueref)value incontext:(jscontext *)context;
鍏跺疄鍦↗avascriptcore妗嗘灦涓繕鏈変竴涓狫smanagervalue绫伙紝杩欎釜鐨勪富瑕佷綔鐢ㄦ槸绠$悊鍐呭瓨銆傝櫧鐒舵垜浠湪缂栧啓objective-c浠g爜鏃舵湁寮哄ぇ鐨勮嚜鍔ㄥ紩鐢ㄦ妧鏈?arc鎶€鏈?锛屾垜浠竴鑸棤闇€鍏冲績瀵硅薄鐨勫唴瀛橀棶棰橈紝鍦ㄧ紪鍐橨avascript浠g爜鏃朵篃鏈夊己澶х殑鍨冨溇鍥炴敹鏈哄埗(杩欑鏈哄埗涓嬬敋鑷宠繛寰幆寮曠敤閮戒笉鏄棶棰?锛屼絾鏄湪oc鍜孞s娣峰悎寮€鍙戞椂锛屽氨寰堝鏄撳嚭鐜伴棶棰樹簡锛屾瘮濡備竴涓狫s鍨冨溇鍥炴敹鏈哄埗閲婃斁鎺夌殑瀵硅薄oc涓嵈杩樺湪鐢紝鍙嶈繃鏉ヤ篃鏄竴鏍枫€侸smanagervalue瀵笿svalue杩涜浜嗕竴灞傚寘瑁咃紝瀹冨彲浠ヤ繚璇佸湪閫傚悎鏃跺€欎娇鐢ㄨ繖涓璞℃椂瀵硅薄閮戒笉浼氳閲婃斁锛屽叾涓柟娉曞涓嬶細
//鍒涘缓jsvlaue瀵硅薄鐨勫寘瑁匤smanagervalue
(jsmanagedvalue *)managedvaluewithvalue:(jsvalue *)value;
(jsmanagedvalue *)managedvaluewithvalue:(jsvalue *)value andowner:(id)owner;
- (instancetype)initwithvalue:(jsvalue *)value;
//鑾峰彇鎵€鍖呰鐨凧svalue瀵硅薄
@property (readonly, strong) jsvalue *value;
鍏€丱bjective-c涓嶫avascript澶嶆潅瀵硅薄鐨勬槧灏?/p>
聽 聽 鎴戜滑鍦ㄤ娇鐢↗avascript璋冪敤objective-c鏂规硶鐨勫疄璐ㄦ槸灏嗕竴涓狾c鍑芥暟璁剧疆涓轰簡js鍏ㄥ眬瀵硅薄鐨勪竴涓睘鎬э紝褰撶劧鎴戜滑涔熷彲浠ヨ缃潪鍑芥暟鐨勫睘鎬ф垨鑰呬换鎰廕svalue(鎴栬€呭彲浠ヨ浆鎹负jsvalue)鐨勫€笺€備緥濡傦細
self.jscontext = [[jscontext alloc]init];
//鍚慗s鍏ㄥ眬瀵硅薄涓坊鍔犱竴涓幏鍙栧綋鍓峃ative璁惧绫诲瀷鐨勫睘鎬?/p>
[self.jscontext setobject:@"ios" forkeyedsub:@"devicetype"];
浣嗘槸濡傛灉鎴戜滑鎯虫妸oc鑷畾涔夌殑涓€涓被鐨勫璞¤缃负js鍏ㄥ眬瀵硅薄鐨勬煇涓睘鎬э紝js鍜孫c鏈夌潃瀹屽叏涓嶅悓鐨勫璞″師鐞嗭紝濡傛灉涓嶅仛浠讳綍澶勭悊锛孞s鏄帴鏀朵笉鍒癘c瀵硅薄涓畾涔夌殑灞炴€у拰鏂规硶鐨勩€傝繖鏃跺氨闇€瑕佷娇鐢ㄥ埌鍓嶉潰鎻愬埌鐨凧sexport鍗忚锛岄渶瑕佹敞鎰忥紝杩欎釜鍗忚涓嶆槸鐢ㄦ潵琚被閬靛畧鐨勶紝瀹冮噷闈㈡病鏈夎瀹氫换浣曟柟娉曪紝鍏舵槸鐢ㄦ潵琚户鎵垮畾涔夋柊鐨勫崗璁殑锛岃嚜瀹氫箟鐨勫崗璁腑绾﹀畾鐨勬柟娉曞拰灞炴€у彲浠ュ湪js涓鑾峰彇鍒帮紝绀轰緥濡備笅:
oc涓柊寤轰竴涓嚜瀹氫箟鐨勭被锛?/p>
@protocol myobjectprotocol
@property(nonatomic,strong)nsstring * name;
@property(nonatomic,strong)nsstring * subject;
@property(nonatomic,assign)nsinteger age;
-(void)sayhi;
@end
@interface myobject : nsobject
@property(nonatomic,strong)nsstring * name;
@property(nonatomic,strong)nsstring * subject;
@property(nonatomic,assign)nsinteger age;
@end
@implementation myobject
-(void)sayhi{
nslog(@"hello javascript");
}
@end
娣诲姞鍒癑s鍏ㄥ眬瀵硅薄涓細
myobject* object = [myobject new];
object.name = @"jaki";
object.age = 25;
object.subject = @"oc";
[jscontext setobject:object forkeyedsub:@"deviceobject"];
鍦↗s杩愯鐜涓彲浠ュ畬鏁寸殑鍒癲eviceobject瀵硅薄锛屽涓嬶細
涓冦€丆璇█椋庢牸鐨凙pi瑙i噴
聽 聽 javascriptcore妗嗘灦涓櫎浜嗗寘鍚畬鏁寸殑objective-c鍜孲wift璇█鐨凙pi澶栵紝涔熸彁渚涗簡瀵笴璇█鐨勬敮鎸併€?/p>
聽 聽 涓嶫s杩愯鐜鐩稿叧鐨勬柟娉曞涓嬶細
//鍒涘缓涓€涓狫scontextref缁?/p>
/*
jscontextref鐩稿綋浜嶫scontext锛屽悓涓€缁勪腑鐨勬暟鎹彲浠ュ叡浜?/p>
*/
jscontextgroupref jscontextgroupcreate(void);
//鍐呭瓨寮曠敤
jscontextgroupref jscontextgroupretain(jscontextgroupref group);
//鍐呭瓨寮曠敤閲婃斁
void jscontextgrouprelease(jscontextgroupref group);
//鍒涘缓涓€涓叏灞€鐨勮繍琛岀幆澧?/p>
jsglobalcontextref jsglobalcontextcreate(jsclassref globalobjectclass);
//鍚屼笂
jsglobalcontextref jsglobalcontextcreateingroup(jscontextgroupref group, jsclassref globalobjectclass);
//鍐呭瓨寮曠敤
jsglobalcontextref jsglobalcontextretain(jsglobalcontextref ctx);
//鍐呭瓨寮曠敤閲婃斁
void jsglobalcontextrelease(jsglobalcontextref ctx);
//鑾峰彇鍏ㄥ眬瀵硅薄
jsobjectref jscontextgetglobalobject(jscontextref ctx);
//鑾峰彇jscontextref缁?/p>
jscontextgroupref jscontextgetgroup(jscontextref ctx);
//鑾峰彇鍏ㄥ眬鐨勮繍琛岀幆澧?/p>
jsglobalcontextref jscontextgetglobalcontext(jscontextref ctx);
//鑾峰彇杩愯鐜鍚?/p>
jsstringref jsglobalcontextcopyname(jsglobalcontextref ctx);
//璁剧疆杩愯鐜鍚?/p>
void jsglobalcontextsetname(jsglobalcontextref ctx, jsstringref name);
聽 聽 涓庡畾涔塉s瀵硅薄鐨勭浉鍏虫柟娉曞涓嬶細
//瀹氫箟js绫?/p>
/*
鍙傛暟jsclassdefinition鏄竴涓粨鏋勪綋 鍏朵腑鍙互瀹氫箟璁稿鍥炶皟
*/
jsclassref jsclasscreate(const jsclassdefinition* definition);
//寮曠敤鍐呭瓨
jsclassref jsclassretain(jsclassref jsclass);
//閲婃斁鍐呭瓨
void jsclassrelease(jsclassref jsclass);
//鍒涘缓涓€涓狫s瀵硅薄
jsobjectref jsobjectmake(jscontextref ctx, jsclassref jsclass, void* data);
//瀹氫箟js鍑芥暟
jsobjectref jsobjectmakefunctionwithcallback(jscontextref ctx, jsstringref name, jsobjectcallasfunctioncallback callasfunction);
//瀹氫箟鏋勯€犲嚱鏁?/p>
jsobjectref jsobjectmakeconstructor(jscontextref ctx, jsclassref jsclass, jsobjectcallasconstructorcallback callasconstructor);
//瀹氫箟鏁扮粍
jsobjectref jsobjectmakearray(jscontextref ctx, size_t argumentcount, const jsvalueref arguments[], jsvalueref* exception);
//瀹氫箟鏃ユ湡瀵硅薄
jsobjectref jsobjectmakedate(jscontextref ctx, size_t argumentcount, const jsvalueref arguments[], jsvalueref* exception);
//瀹氫箟寮傚父瀵硅薄
jsobjectref jsobjectmakeerror(jscontextref ctx, size_t argumentcount, const jsvalueref arguments[], jsvalueref* exception);
//瀹氫箟姝e垯瀵硅薄
jsobjectref jsobjectmakeregexp(jscontextref ctx, size_t argumentcount, const jsvalueref arguments[], jsvalueref* exception);
//瀹氫箟鍑芥暟瀵硅薄
jsobjectref jsobjectmakefunction(jscontextref ctx, jsstringref name, unsigned parametercount, const jsstringref parameternames[], jsstringref body, jsstringref sourceurl, int startinglinenumber, jsvalueref* exception);
//鑾峰彇瀵硅薄鐨勫睘鎬?/p>
jsvalueref jsobjectgetprototype(jscontextref ctx, jsobjectref object);
//璁剧疆瀵硅薄鐨勫睘鎬?/p>
void jsobjectsetprototype(jscontextref ctx, jsobjectref object, jsvalueref value);
//妫€鏌ュ璞℃槸鍚﹀寘鍚煇涓睘鎬?/p>
bool jsobjecthasproperty(jscontextref ctx, jsobjectref object, jsstringref propertyname);
//鑾峰彇瀵硅薄灞炴€?/p>
jsvalueref jsobjectgetproperty(jscontextref ctx, jsobjectref object, jsstringref propertyname, jsvalueref* exception);
//瀹氫箟瀵硅薄灞炴€?/p>
void jsobjectsetproperty(jscontextref ctx, jsobjectref object, jsstringref propertyname, jsvalueref value, jspropertyattributes attributes, jsvalueref* exception);
//鍒犻櫎瀵硅薄灞炴€?/p>
bool jsobjectdeleteproperty(jscontextref ctx, jsobjectref object, jsstringref propertyname, jsvalueref* exception);
//鑾峰彇鏁扮粍鍊?/p>
jsvalueref jsobjectgetpropertyatindex(jscontextref ctx, jsobjectref object, unsigned propertyindex, jsvalueref* exception);
//璁剧疆鏁扮粍鍊?/p>
void jsobjectsetpropertyatindex(jscontextref ctx, jsobjectref object, unsigned propertyindex, jsvalueref value, jsvalueref* exception);
//鑾峰彇绉佹湁鏁版嵁
void* jsobjectgetprivate(jsobjectref object);
//璁剧疆绉佹湁鏁版嵁
bool jsobjectsetprivate(jsobjectref object, void* data);
//鍒ゆ柇鏄惁涓哄嚱鏁?/p>
bool jsobjectisfunction(jscontextref ctx, jsobjectref object);
//灏嗗璞′綔涓哄嚱鏁版潵璋冪敤
jsvalueref jsobjectcallasfunction(jscontextref ctx, jsobjectref object, jsobjectref thisobject, size_t argumentcount, const jsvalueref arguments[], jsvalueref* exception);
//鍒ゆ柇鏄惁涓烘瀯閫犲嚱鏁?/p>
bool jsobjectisconstructor(jscontextref ctx, jsobjectref object);
//灏嗗璞′綔涓烘瀯閫犲嚱鏁版潵璋冪敤
jsobjectref jsobjectcallasconstructor(jscontextref ctx, jsobjectref object, size_t argumentcount, const jsvalueref arguments[], jsvalueref* exception);
//鑾峰彇鎵€鏈夊睘鎬у悕
jspropertynamearrayref jsobjectcopypropertynames(jscontextref ctx, jsobjectref object);
//杩涜鍐呭瓨寮曠敤
jspropertynamearrayref jspropertynamearrayretain(jspropertynamearrayref array);
//鍐呭瓨閲婃斁
void jspropertynamearrayrelease(jspropertynamearrayref array);
//鑾峰彇灞炴€т釜鏁?/p>
size_t jspropertynamearraygetcount(jspropertynamearrayref array);
//鍦ㄥ睘鎬у悕鏁扮粍涓彇鍊?/p>
jsstringref jspropertynamearraygetnameatindex(jspropertynamearrayref array, size_t index);
//娣诲姞灞炴€у悕
void jspropertynameaccumulatoraddname(jspropertynameaccumulatorref accumulator, jsstringref propertyname);
聽 聽 js鏁版嵁绫诲瀷鐩稿叧瀹氫箟鍦↗svalueref涓紝濡備笅锛?/p>
//鑾峰彇鍊肩殑绫诲瀷
/*
鏋氫妇濡備笅锛?/p>
typedef enum {
kjstypeundefined,
kjstypenull,
kjstypeboolean,
kjstypenumber,
kjstypestring,
kjstypeobject
} jstype;
*/
jstype jsvaluegettype(jscontextref ctx, jsvalueref);
//鍒ゆ柇鏄惁涓簎ndefined绫诲瀷
bool jsvalueisundefined(jscontextref ctx, jsvalueref value);
//鍒ゆ柇鏄惁涓簄ull绫诲瀷
bool jsvalueisnull(jscontextref ctx, jsvalueref value);
//鍒ゆ柇鏄惁涓哄竷灏旂被鍨?/p>
bool jsvalueisboolean(jscontextref ctx, jsvalueref value);
//鍒ゆ柇鏄惁涓烘暟鍊肩被鍨?/p>
bool jsvalueisnumber(jscontextref ctx, jsvalueref value);
//鍒ゆ柇鏄惁涓哄瓧绗︿覆绫诲瀷
bool jsvalueisstring(jscontextref ctx, jsvalueref value);
//鍒ゆ柇鏄惁涓哄璞$被鍨?/p>
bool jsvalueisobject(jscontextref ctx, jsvalueref value);
//鏄惁鏄被
bool jsvalueisobjectofclass(jscontextref ctx, jsvalueref value, jsclassref jsclass);
//鏄惁鏄暟缁?/p>
bool jsvalueisarray(jscontextref ctx, jsvalueref value);
//鏄惁鏄棩鏈?/p>
bool jsvalueisdate(jscontextref ctx, jsvalueref value);
//姣旇緝鍊兼槸鍚︾浉绛?/p>
bool jsvalueisequal(jscontextref ctx, jsvalueref a, jsvalueref b, jsvalueref* exception);
//姣旇緝鍊兼槸鍚﹀叏绛?/p>
bool jsvalueisstrictequal(jscontextref ctx, jsvalueref a, jsvalueref b);
//鏄惁鏄煇涓被鐨勫疄渚?/p>
bool jsvalueisinstanceofconstructor(jscontextref ctx, jsvalueref value, jsobjectref constructor, jsvalueref* exception);
//鍒涘缓undefined鍊?/p>
jsvalueref jsvaluemakeundefined(jscontextref ctx);
//鍒涘缓null鍊?/p>
jsvalueref jsvaluemakenull(jscontextref ctx);
//鍒涘缓甯冨皵鍊?/p>
jsvalueref jsvaluemakeboolean(jscontextref ctx, bool boolean);
//鍒涘缓鏁板€?/p>
jsvalueref jsvaluemakenumber(jscontextref ctx, double number);
//鍒涘缓瀛楃涓插€?/p>
jsvalueref jsvaluemakestring(jscontextref ctx, jsstringref string);
//閫氳繃json鍒涘缓瀵硅薄
jsvalueref jsvaluemakefromjsonstring(jscontextref ctx, jsstringref string);
//灏嗗璞¤浆涓篔son瀛楃涓?/p>
jsstringref jsvaluecreatejsonstring(jscontextref ctx, jsvalueref value, unsigned indent, jsvalueref* exception);
//杩涜甯冨皵鍊艰浆鎹?/p>
bool jsvaluetoboolean(jscontextref ctx, jsvalueref value);
//杩涜鏁板€艰浆鎹?/p>
double jsvaluetonumber(jscontextref ctx, jsvalueref value, jsvalueref* exception);
//瀛楃涓插€艰祴鍊?/p>
jsstringref jsvaluetostringcopy(jscontextref ctx, jsvalueref value, jsvalueref* exception);
//鍊间笌瀵硅薄鐨勮浆鎹?/p>
jsobjectref jsvaluetoobject(jscontextref ctx, jsvalueref value, jsvalueref* exception);
聽 聽 鍦–椋庢牸鐨凙pi涓紝瀛楃涓蹭篃琚寘瑁呮垚浜咼sstringref绫诲瀷锛屽叾涓柟娉曞涓嬶細
//鍒涘缓js瀛楃涓?/p>
jsstringref jsstringcreatewithcharacters(const jschar* chars, size_t numchars);
jsstringref jsstringcreatewithutf8cstring(const char* string);
//鍐呭瓨寮曠敤浜庨噴鏀?/p>
jsstringref jsstringretain(jsstringref string);
void jsstringrelease(jsstringref string);
//鑾峰彇瀛楃涓查暱搴?/p>
size_t jsstringgetlength(jsstringref string);
//杞垚utf8瀛楃涓?/p>
size_t jsstringgetutf8cstring(jsstringref string, char* buffer, size_t buffersize);
//瀛楃涓叉瘮杈?/p>
bool jsstringisequal(jsstringref a, jsstringref b);
bool jsstringisequaltoutf8cstring(jsstringref a, const char* b);
鍏€丠ybird app 鏋勫缓鎬濊矾
聽 聽 hybird app鏄寚娣峰悎妯″紡绉诲姩搴旂敤锛屽嵆鍏朵腑鏃㈠寘鍚師鐢熺殑缁撴瀯鏈夊唴宓屾湁web鐨勭粍浠躲€傝繖绉岮pp涓嶄粎鎬ц兘鍜岀敤鎴蜂綋楠屽彲浠ヨ揪鍒板拰鍘熺敓鎵€宸棤鍑犵殑绋嬪害锛屾洿澶х殑浼樺娍鍦ㄤ簬bug淇蹇紝鐗堟湰杩唬鏃犻渶鍙戠増銆?鏈?鏃ヨ嫻鏋滅粰璁稿寮€鍙戣€呭彂閫佷簡涓€灏佽鍛婇偖浠讹紝涓昏鏄彁绀哄紑鍙戣€呬笅杞借剼鏈姩鎬佹洿鏀笰pp鍘熸湰琛屼负鐨勫仛娉曞皢浼氳鎻愬鎷掔粷銆傚叾瀹炶繖娆¢偖浠舵墍鎻愬唴瀹瑰拰hybird app骞舵棤澶ぇ鍏崇郴(瀵筊eactnative涔熸病鏈夊奖鍝?锛岃嫻鏋滆鍛婄殑鏄綉缁滀笅鍙戣剼鏈苟涓斾娇鐢╮untime鍔ㄦ€佷慨鏀筃ative琛屼负鐨勫簲鐢紝hybird app鐨勫疄璐ㄥ苟娌℃湁淇敼鍘烴ative鐨勮涓猴紝鑰屾槸灏嗕笅鍙戠殑璧勬簮杩涜鍔犺浇鍜岀晫闈㈡覆鏌擄紝绫讳技webview銆?/p>
聽 聽 鍏充簬娣峰悎寮€鍙戯紝鎴戜滑鏈変袱绉嶆ā寮忥細
聽聽聽聽1.native鍐呭祵webview锛岄€氳繃js涓嶰c浜や簰瀹炵幇涓氬姟鏃犵紳鐨勮鎺ャ€?/p>
聽 聽 鏃犺鏄疷iwebview杩樻槸wkwebkit锛屾垜浠兘鍙互鍦ㄥ叾涓嬁鍒板綋鍓嶇殑jscontext锛岀劧鏄娇鐢ㄥ墠闈粙缁嶇殑鏂规硶渚垮彲浠ュ疄鐜版暟鎹簰閫氫笌浜や簰銆傝繖绉嶆柟寮忔槸鏈€绠€鍗曠殑娣峰悎寮€鍙戯紝浣嗗叾鎬ц兘鍜屽師鐢熺浉姣旇宸竴浜涖€傜ず鎰忓浘濡備笅锛?/p>
聽 聽 2.涓嬪彂js鑴氭湰锛屼娇鐢ㄧ被浼糝eactnative鐨勬鏋惰繘琛屽師鐢熸覆鏌?/p>
聽 聽 杩欐槸涓€绉嶆晥鐜囬潪甯搁珮鐨勬贩鍚堝紑鍙戞ā寮忥紝骞朵笖reactnative涔熸湰韬敮鎸乤ndroid鍜宨os鍏敤涓€濂椾唬鐮併€傛垜浠篃鍙互浣跨敤javascriptcore鑷繁瀹炵幇涓€濂楄в鏋愰€昏緫锛屼娇鐢↗avascript鏉ョ紪鍐橬ative搴旂敤锛岃瀹屾暣瀹炵幇杩欐牱涓€濂椾笢瑗垮お澶嶆潅浜嗭紝鎴戜滑涔熸病鏈夎兘鍔涘畬鎴愪竴涓姝ゅ簽澶х殑宸ョ▼锛屼絾鏄垜浠彲浠ュ仛涓€涓皬demo鏉ユā鎷熷叾鍘熺悊锛岃繖鏍峰彲浠ユ洿濂界殑甯姪鎴戜滑鐞嗚вhybird app鐨勬瀯寤哄師鐞嗐€?/p>
鎴戜滑鎵撶畻瀹炵幇杩欐牱鐨勫姛鑳斤細閫氳繃涓嬪彂js鑴氭湰鍒涘缓鍘熺敓鐨刄ilabel鏍囩涓嶶ibutton鎺т欢锛岄鍏堢紪鍐橨s浠g爜濡備笅锛?/p>
(function(){
console.log("progectinit");
//js鑴氭湰鍔犺浇瀹屾垚鍚?鑷姩render鐣岄潰
return render();
})();
//js鏍囩绫?/p>
function label(rect,text,color){
this.rect = rect;
this.text = text;
this.color = color;
this.typename = "label";
}
//js鎸夐挳绫?/p>
function button(rect,text,callfunc){
this.rect = rect;
this.text = text;
this.callfunc = callfunc;
this.typename = "button";
}
//js rect绫?/p>
function rect(x,y,width,height){
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
//js棰滆壊绫?/p>
function color(r,g,b,a){
this.r = r;
this.g = g;
this.b = b;
this.a = a;
}
//娓叉煋鏂规硶 鐣岄潰鐨勬覆鏌撳啓鍦ㄨ繖閲岄潰
function render(){
var rect = new rect(20,100,280,30);
var color = new color(1,0,0,1);
var label = new label(rect,"hello world",color);
var rect2 = new rect(20,150,280,30);
var color2 = new color(0,1,0,1);
var label2 = new label(rect2,"hello native",color2);
var rect3 = new rect(20,200,280,30);
var color3 = new color(0,0,1,1);
var label3 = new label(rect3,"hello javascript",color3);
var rect4 = new rect(20,240,280,30);
var button = new button(rect4,"鎴戞槸涓€涓寜閽?,function(){
var randcolor = new color(math.random(),math.random(),math.random(),1);
globle.changebackgroundcolor(randcolor);
});
//灏嗘帶浠朵互鏁扮粍褰㈠紡杩斿洖
return [label,label2,label3,button];
}
鍒涘缓涓€涓狾bjective-c绫荤粦瀹氬埌js鍏ㄥ眬瀵硅薄涓婏紝浣滀负oc鏂规硶鐨勬ˉ鎺ュ櫒锛?/p>
//.h
#import
#import
#import
@protocol globleprptocol
-(void)changebackgroundcolor:(jsvalue *)value;
@end
@interface globle : nsobject
@property(nonatomic,weak)uiviewcontroller * ownercontroller;
@end
//.m
#import "globle.h"
@implementation globle
-(void)changebackgroundcolor:(jsvalue *)value{
self.ownercontroller.view.backgroundcolor = [uicolor colorwithred:value[@"r"].todouble green:value[@"g"].todouble blue:value[@"b"].todouble alpha:value[@"a"].todouble];
}
@end
鍦╒iewcontroller涓疄鐜颁竴涓晫闈㈡覆鏌撶殑render瑙i噴鏂规硶锛屽苟寤虹珛鎸夐挳鐨勬柟娉曡浆鎹紝濡備笅锛?/p>
//
// viewcontroller.m
// javascriptcoretest
//
// created by vip on 17/3/6.
// 威尼斯人2299 copyright 漏 2017骞?jaki. all rights reserved.
//
#import "viewcontroller.h"
#import
#import "globle.h"
@interface viewcontroller ()
@property(nonatomic,strong)jscontext * jscontext;
@property(nonatomic,strong)nsmutablearray * actionarray;
@property(nonatomic,strong)globle * globle;
@end
@implementation viewcontroller
- (void)viewdidload {
[super viewdidload];
//鍒涘缓js杩愯鐜
self.jscontext = [jscontext new];
//缁戝畾妗ユ帴鍣?/p>
self.globle = [globle new];
self.globle.ownercontroller = self;
self.jscontext[@"globle"] = self.globle;
self.actionarray = [nsmutablearray array];
[self render];
}
//鐣岄潰娓叉煋瑙i噴鍣?/p>
-(void)render{
nsstring * path = [[nsbundle mainbundle] pathforresource:@"main" oftype:@"js"];
nsdata * jsdata = [[nsdata alloc]initwithcontentsoffile:path];
nsstring * jscode = [[nsstring alloc]initwithdata:jsdata encoding:nsutf8stringencoding];
jsvalue * jsvlaue = [self.jscontext evaluatescript:jscode];
for (int i=0; i
jsvalue * subvalue = [jsvlaue objectatindexedsub:i];
if ([[subvalue objectforkeyedsub:@"typename"].tostring isequaltostring:@"label"]) {
uilabel * label = [uilabel new];
label.frame = cgrectmake(subvalue[@"rect"][@"x"].todouble, subvalue[@"rect"][@"y"].todouble, subvalue[@"rect"][@"width"].todouble, subvalue[@"rect"][@"height"].todouble);
label.text = subvalue[@"text"].tostring;
label.textcolor = [uicolor colorwithred:subvalue[@"color"][@"r"].todouble green:subvalue[@"color"][@"g"].todouble blue:subvalue[@"color"][@"b"].todouble alpha:subvalue[@"color"][@"a"].todouble];
[self.view addsubview:label];
}else if ([[subvalue objectforkeyedsub:@"typename"].tostring isequaltostring:@"button"]){
uibutton * button = [uibutton buttonwithtype:uibuttontypesystem];
button.frame = cgrectmake(subvalue[@"rect"][@"x"].todouble, subvalue[@"rect"][@"y"].todouble, subvalue[@"rect"][@"width"].todouble, subvalue[@"rect"][@"height"].todouble);
[button settitle:subvalue[@"text"].tostring forstate:uicontrolstatenormal];
button.tag = self.actionarray.count;
[button addtarget:self action:@selector(buttonaction:) forcontrolevents:uicontroleventtouchupinside];
[self.actionarray addobject:subvalue[@"callfunc"]];
[self.view addsubview:button];
}
}
}
//鎸夐挳杞崲鏂规硶
-(void)buttonaction:(uibutton *)btn{
jsvalue * action = self.actionarray[btn.tag];
//鎵цjs鏂规硶
[action callwitharguments:nil];
}
@end
杩愯宸ョ▼锛屾晥鏋滃涓嬪浘鎵€绀猴紝鐐瑰嚮鎸夐挳鍗冲彲瀹炵幇绠€鍗曠殑鐣岄潰棰滆壊鍒囨崲锛?/p>
涓婇潰鐨勭ず渚嬪伐绋嬫垜鍙疄鐜颁簡uilabel绫讳笌uibutton绫荤殑js-oc杞崲锛屽鏋滃皢鍘熺敓鎺т欢鍜孞s瀵硅薄鍐嶈繘琛屼竴灞傜粦瀹氾紝骞朵笖瀹炵幇澶ч儴鍒咼s绫讳笌鍘熺敓绫诲拰浠栦滑鍐呴儴鐨勫睘鎬э紝鍒欐垜浠氨寮€鍙戜簡涓€濂桯ybird app寮€鍙戞鏋讹紝浣嗗苟娌℃湁杩欎釜蹇呰锛屽鏋滀綘瀵规洿澶氬叴瓒o紝鍙互娣卞叆瀛︿範涓婻eactnative銆?/p>
聽 聽 鏂囦腑鐨勭ず渚婦emo鎴戞斁鍦ㄤ簡github涓婏紝鍦板潃濡備笅锛欸ithub - zyhshao/demo-hybird: 娣峰悎寮€鍙戝湪ios涓殑鏋勫缓鎬濊矾demo銆?/p>
鍓嶇瀛︿範鏂颁汉锛屾湁蹇楀悓閬撳悎鐨勬湅鍙嬶紝娆㈣繋浜ゆ祦涓庢寚瀵硷紝qq缇?541458536
杞浇浜? my.oschina /u/2340880/blog/856321
还没有评论,来说两句吧...