±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚwww.chinaznyj.com,ÎÒÃÇÈ¥×Ðϸ²é¿´ÁËÔApp´úÂ룬·¢ÏֺܶණÎ÷¶¼ÐèÒªÖØÓöøÎÒÃÇȴûÓаÑËüÃÇ×é¼þ»¯¡£±¾ÎÄ´úÂë½²½â£¬Ï£Íû¶Ô´ó¼ÒÓаïÖú¡£ |
|
ǰÒò
ÆäʵÎÒÃÇÕâ¸ö7ÈËiOS¿ª·¢ÍŶӲ¢²»ÊʺÏ×é¼þ»¯¿ª·¢¡£ÔÒòÊÇÒòΪÐԼ۱ȵͣ¬ÐèÒª»¨ºÜ¶àʱ¼äºÍ¾ÀúÈ¥×öÕâ¼þÊ£¬´øÀ´µÄÊÕÒæ²¢²»Äܳ¹µ×¸Ä±äʲô¡£µ«ÊÇÒòΪÓÐ2¡«3¸öÐÇÆÚµÄ¿ÕµµÆÚ£¬²¢²»ÊǺÜæ£»ÁíÍâÊÇ¿ÉÒÔÓÃÔÚÒ»¸öȫеÄAppÉÏ¡£ËùÒÔ¾ö¶¨Ïë³¢ÊÔÏÂ×é¼þ»¯¿ª·¢¡£
Ëùν³¢ÊÔÒ²¾ÍÊÇ˵£ºÈ¥³¢ÊÔ½â¾ö×é¼þ»¯¿ª·¢µ±ÖеÄһЩÎÊÌâ¡£Èç¹ûÄܽâ¾ö£¬²¢ÇÒÓбȽϺõĽâ¾ö·½°¸£¬ÄǾͼÌÐøÏÂÈ¥£¬·ñÔò¾Í·ÅÆú¡£
±³¾°
ÍÑÀëʵ¼ÊÇé¿öȥ̸·½°¸µÄÑ¡ÐÍÊDz»ºÏÀíµÄ¡£
ËùÒÔÏȼòµ¥½éÉÜϱ³¾°£ºÎÒÃÇÊÇÒ»¼ÒÄÉ˹´ï¿Ë½»Ò×ËùÉÏÊеĿƼ¼ÆóÒµ¡£ÎÒÃǹ«Ë¾»¹Óкü¸¿îApp£¬Óɲ»Í¬µÄ¼¸¸öÍŶÓȥά»¤£¬ÎÒÃÇÊÇÆäÖÐÖ®Ò»¡£ÎÒÃÇÕâ¸öÍŶÓÊÇÒ»¸ö7È˵ÄiOS¿ª·¢Ð¡ÍŶӡ£×÷Õß±¾ÈËÊÇС×鳤¡£
֮ǰµÄAppÒѾʹÓÃÁËÄ£¿é»¯£¨CocoaPods£©¿ª·¢£¬²¢ÇÒÒѾʹÓÃÁË ¶þ½øÖÆ»¯ ·½°¸¡£AppÒѾÔÚʹÓÃ×Ô¶¯»¯¼¯³É¡£
ËäȻҪ¿ª·¢Ò»¸öÐÂApp£¬µ«ÊǺܶàÒµÎñºÍ֮ǰµÄAppÊÇÒ»ÑùµÄ»òÕßÏàËÆµÄ¡£
ΪʲôҪдÕâÆª²©¿Í£¿
Ïë°ÑÕû¸ö¹ý³Ì¼Ç¼ÏÂÀ´£¬·½±ãÒÔºó»Ø¹Ë¡£
ÎÒÃǵÄ˼·ºÍ½â¾ö·½°¸²»Ò»¶¨ÊǶԵĻòÕßÊÇ×îºÃµÄ¡£ËùÒÔÏ£Íû´ó¼Ò¿´ÁËÕâÆª²©¿ÍÖ®ºó£¬ÄܸøÎÒÃÇÌṩºÜ¶à½¨ÒéºÍ±ðµÄ½â¾ö·½°¸£¬ÈÃÎÒÃÇ¿ÉÒÔÓÅ»¯Ê¹µÃÕâ¸ö×é¼þ»¯¿ª·¢µÄ·½°¸ÄܱäµÃ¸ü¼ÓºÃ¡£
¼¼ÊõÕ»
gitlab
gitlab-runner
CocoaPods
CocoaPods-Packager
fir
¶þ½øÖÆ»¯
fastlane
deploymate
oclint
Kiwi
³É¹û
ʹÓÃ×é¼þ»¯¿ª·¢AppÖ®ºó£º
´úÂëÌá½»¸ü¹æ·¶£¬ÖÊÁ¿Ìá¸ß¡£ÌåÏÖÔÚ²âÊÔÈËÔ±·´À¡µÄbugÃ÷ÏÔ¼õÉÙ¡£
±àÒë¼Ó¿ì¡£ÔÚ¶¼ÊÇÔ´ÂëµÄÇé¿öÏ£ºÔAppÐèÒª150s×óÓÒÕû¸ö±àÒëÍê±Ï£¬È»ºó¿ª·¢ÈËÔ±²Å¿ÉÒÔ¿ªÊ¼µ÷ÊÔ¡£¶øÏÖÔÚ×é¼þ»¯Ö®ºó£¬Ä³¸öÒµÎñ×é¼þÖ»ÐèÒª10s¡«20s×óÓÒ¡£ÔÚÒÀÀµ¶þ½øÖÆ»¯×é¼þµÄÇé¿öÏ£¬ÒµÎñ×é¼þ±àÒëËÙ¶ÈÒ»°ãµÍÓÚ10s¡£
·Ö¹¤¸üΪÃ÷È·£¬´Ó¶øÌáÉý¿ª·¢Ð§ÂÊ¡£
Áé»î£¬ñîºÏµÍ¡£
½áºÏMVVM¡£·Ç³£Ï¸Öµĵ¥Ôª²âÊÔ£¬Ìá¸ß´úÂëÖÊÁ¿£¬±£Ö¤AppÎȶ¨ÐÔ¡£ÌåÏÖÔÚ²âÊÔÈËÔ±·´À¡µÄbugÃ÷ÏÔ¼õÉÙ¡£
»Ø¹ö¸ü·½±ã¡£ÎÒÃǾ³£»á·¢ÉúÒµÎñ»òÕßUI±ä»ØÖ®Ç°°æ±¾µÄÇé¿ö£¬ÒÔǰÎÒÃǶ¼ÊÇcheckout³ö֮ǰµÄ´úÂë¡£¶øÏÖÔÚ×é¼þ»¯ÁËÖ®ºó£¬ÎÒÃÇÖ»ÐèҪʹÓþɰ汾µÄÒµÎñ×é¼þPod¿â£¬»òÕßÔھɰ汾µÄ»ù´¡ÉÏÔÙ·¢Ò»¸öPod¿â¡£
ÐÂÈ˸üÈÝÒ×ÉÏÊÖ¡£
¶ÔÓÚÎÒÀ´Ëµ£º
¸ü¼ÓÈÝÒ׵ذѿشúÂëÖÊÁ¿¡£
¸ü¼ÓÈÝÒ×µØÖªµÀС×é³ÉÔ±×öÁËЩʲô¡£
¸ü¼ÓÈÝÒ׵طÖÅ乤×÷¡£
¸ü¼ÓÈÝÒ׵ذ²ÅÅгÉÔ±¡£
½âñî
ÎÒÃǵÄÏë·¨ÊÇÕâÑùµÄ£¬¾ÍËã×îºó×ö²»³É×é¼þ»¯¿ª·¢£¬°ÑÕâЩӦ¸ÃÖØÓõĴúÂë³é³öÀ´×ö³ÉPod¿âҲûÓÐʲôӰÏì¡£ËùÒÔÓÅÏÈ×öÁËÕâÒ»²½¡£
ÄÄЩ¶«Î÷ÐèÒª³é³ÉPod¿â£¿
ÎÒÃÇ֮ǰµÄAppÒѾʹÓÃÁËÄ£¿é»¯£¨CocoaPods»¯£©¿ª·¢¡£ÎÒÃÇÒѾ°Ñ»áÔÚAppÖ®¼äÖØÓõÄUtil¡¢Category¡¢ÍøÂç²ãºÍ±¾µØ´æ´¢µÈµÈÕâЩ¶«Î÷³é³ÉÁËPod¿â¡£»¹ÓÐЩһЩºÍÒµÎñÏà¹ØµÄ£¬±ÈÈçYTXChart,YTXChartSocket£»ÕâЩҲÊÇÔÚ¸÷¸öAppÖ®¼äÖØÓõġ£
ËùÒԵóöÒ»¸öºÜ¼òµ¥µÄ½áÂÛ£ºÒªÔÚAppÖ®¼ä¹²ÏíµÄ´úÂë¾ÍÓ¦¸Ã³é³ÉPod¿â£¬°ÑËüÃÇ×÷Ϊһ¸ö¸ö×é¼þ¡£
ÎÒÃÇÈ¥×Ðϸ²é¿´ÁËÔApp´úÂ룬·¢ÏֺܶණÎ÷¶¼ÐèÒªÖØÓöøÎÒÃÇȴûÓаÑËüÃÇ×é¼þ»¯¡£
ΪʲôûÓаÑÕâЩ´úÂë×é¼þ»¯£¿
ÒòΪµ±Ê±Ã»ÏëºÃÔõô½âñ¾Ù¸öÀý×Ó¡£
ÓÐÒ»¸öÀà½Ð×öYTXAnalytics¡£ÊÇÒÀÀµUMengAnalyticsÀ´×öͳ¼ÆµÄ¡£ ËüµÄñîºÏÊÇÔÚÓÚÒ»¸ö·½·¨¡£Õâ¸ö·½·¨ÊÇÓÃÀ´ÊÕ¼¯ÐÅÏ¢µÄ¡£ËüÒÀÀµÁËUser£¬»¹ÒÀÀµÁËcurrentServerIdÕâ¸ö¶«Î÷¡£
+ (NSDictionary*)collectEventInfo:(NSString*)event
withData:(NSDictionary*)data
{
.......
return @{
@"event" : event,
@"eventType" : @"event",
@"time" : [[[NSDate date] timeIntervalSince1970InMillionSecond]
stringValue],
@"os" : device.systemName,
@"osVersion" : device.systemVersion,
@"device" : device.model,
@"screen" : screenStr,
@"network" : [YTXAnalytics networkType],
@"appVersion" : [AppInfo appVersion],
@"channel" : [AppInfo marketId],
@"deviceId" : [ASIdentifierManager sharedManager].advertisingIdentifier.UUIDString,
@"username" : objectOrNull([YTXUserManager
sharedManager].currentUser.username),
@"userType" : objectOrNull([[YTXUserManager
sharedManager].currentUser.userType stringValue]),
@"company" : [[ServiceProvider sharedServiceProvider].currentServerId
stringValue],
@"ip" : objectOrNull([SSNetworkInfo
currentIPAddress]),
@"data" : jsonStr
};
} |
½â¾ö·½°¸ÊÇ£¬¸ãÁËÒ»¸öblock£¬°Ñ»ñÈ¡ÕâЩÐÅÏ¢µÄÔðÈ檳öÀ´¡£
[YTXAnalytics
sharedAnalytics].analyticsDataBlock = ^ NSDictionary
*() {
return @{
@"appVersion" : objectOrNull([PBBasicProviderModule
appVersion]),
@"channel" : objectOrNull([PBBasicProviderModule
marketId]),
@"username" : objectOrNull([PBUserManager
shared].currentUser.username),
@"userType" : objectOrNull([PBUserManager
shared].currentUser.userType),
@"company" : objectOrNull([PBUserManager
shared].currentUser.serverId),
@"ip" : objectOrNull([SSNetworkInfo
currentIPAddress])
};
}; |
ÎÒÃǵÄñîºÏ´ó¶àÊý¶¼ÊÇÕâÖÖ¡£½â¾ö·½°¸¶¼ÊÇŪÁËÒ»¸öblock£¬°Ñ»ñÈ¡ÐÅÏ¢µÄÖ°Ô𶪳öÀ´µ½ÍâÃæ¡£
ÎÒÃǽâñîµÄ·½Ê½¾ÍÊÇÒÔϼ¸ÖÖ£º
°ÑËüÒÀÀµµÄ´úÂëÏÈ×ö³ÉÒ»¸öPod¿â£¬È»ºóת¶øÒÀÀµPod¿â¡£ÓеãÏñÊÇ¡°ÒÀÀµÏ³Á¡±¡£
ʹÓÃcategoryµÄ·½Ê½°ÑÒÀÀµ¸Ä³É×éºÏµÄ·½Ê½¡£
ʹÓÃÒ»¸öblock»òdelegate£¨ÐÒ飩°ÑÕⲿ·ÖÖ°Ô𶪳öÈ¥¡£
Ö±½Ócopy´úÂë¡£copy´úÂëÕâ¸öÊÂÇé¿´ÆðÀ´ºÜ²»ÓÅÑÅ£¬µ«ÊÇËüµÄºÃ´¦¾ÍÊǿ졣¶ÔÓÚһЩ²»ÖØÒªµÄ¹¤¾ß·½·¨£¬Ò²¿ÉÒÔÖ±½Ócopyµ½ÄÚ²¿À´Óá£
³õʼ»¯
AppDelegate³ä³âן÷ÖÖ³õʼ»¯¡£ ±ÈÈçÎÒÃÇ×Ô¼ºµÄ´úÂë¡£ÒѾֻÊǽØÈ¡Á˲¿·Ö£¡
[self setupScreenShowManager];
//event start
[YTXAnalytics createYtxanalyticsTable];
[YTXAnalytics start];
[YTXAnalytics page:APP_OPEN];
[YTXAnalytics sharedAnalytics] .analyticsDataBlock
= ^ NSDictionary *() {
return @{
@"appVersion" : objectOrNull ([AppInfo
appVersion]),
.......
@"ip" : objectOrNull ([SSNetworkInfo
currentIPAddress]),
};
};
[self registerPreloadConfig];
//Migrate UserDefault ×ªÒÆ standardUserDefaultµ½group
[NSUserDefaults migrateOld UserDefaultToGroup];
[ServiceProvider sharedServiceProvider];
[YTXChatManager sharedYTXChatManager];
[ChartSocketManager sharedChartSocketController].delegate
= [ChartProvider sharedChartProvider];
//³õʼ»¯×î³õµÄÐÐÇ鼯ºÏ
[[ChartProvider sharedChartProvider] addMetalList: [ChartSocketManager
sharedChartSocketController].quoteList];
//³õʼ»¯»·ÐÅÐÅÏ¢Manager
[YTXEaseMobManager sharedManager]; |
±ÈÈçµÚÈý·½£º
//×¢²á»·ÐÅ
[self setupEaseMob:application didFinishLaunchingWithOptions:launchOptions];
//Talking Data
[self setupTalkingData];
[self setupAdTalkingData];
[self setupShareSDK];
[self setupUmeng];
[self setupJSPatch];
[self setupAdhocSDK];
[YTXGdtAnalytics communicateWithGdt];//¹ãµãͨ
//³õʼ»¯»·ÐÅÐÅÏ¢Manager
[YTXEaseMobManager sharedManager]; |
Ê×ÏÈÕâЩ³õʼ»¯µÄ¶«Î÷Êǻᱻ¸÷¸öÒµÎñ×é¼þ¶¼Óõ½µÄ¡£
ÄÇÎÒ×é¼þ»¯¿ª·¢µÄʱºò£¬Ã¿Ò»¸öÒµÎñ×é¼þÈçºÎ±£Ö¤ÎÒʹÓÃÕâЩ¶«Î÷µÄʱºòÒѾ³õʼ»¯¹ýÁËÄØ£¿ÄѵÀÿһ¸öÒµÎñ×é¼þ¶¼³õʼ»¯Ò»±é£¿ÓвÎÊýÔõô°ì£¬Äܲ»ÄÜʹÓõ¥Àý£¿
µ«ÎÊÌâÊǵÚÈý·½¿â»ù±¾¶¼ÐèҪע²áÒ»¸öAppKey£¬ÎÒÿһ¸öÒµÎñ×é¼þÀﶼдһ·Ý£¿ÄÇÑù¿Ï¶¨²»ºÃ£¬ÄÇÎÒÅäÖÃÔÚÖ÷AppÀïµÄinfo.plistÀïÃæ£¬Ã¿Ò»¸öÒµÎñ×é¼þ¶¼³õʼ»¯Ò»ÏºÃÁË£¬Ò²²»»áÓÐʲô¸±×÷Óᣵ«ÕâÑù¸Ð¾õ²»ÓÅÑÅ£¬¶øÇÒÓкܶàÖØ¸´´úÂë¡£Íòһij¸öAppKey»òÖØÒª²ÎÊý¸ÄÁË£¬ÄÇÿһ¸öÒµÎñ×é¼þÆñ²»ÊǶ¼µÃ¸ÄÁË¡£ÕâÑù¿Ï¶¨²»ÐС£ÁíÍâÒ»µã£¬ÄÇÎÒµÄÒµÎñ×é¼þ±ØÐëÒÀÀµÖ÷AppµÄÄÚÈÝÁË¡£ÎÞÂÛÊÇÔÚÖ÷AppÀïµ÷ÊÔ»¹ÊǰÑÖ÷AppµÄinfo.plistµÄÏà¹ØÄÚÈÝ¿½±´¹ýÀ´Ê¹Óá£
¸ü¹Ø¼üµÄÊÇÓÐһЩµÚÈý·½µÄ¿âÐèÒªÔÚapplication: didFinishLaunchingWithOptions:ʱ³õʼ»¯¡£
//³õʼ»¯»·ÐÅ£¬shareSDK,
ÓÑÃË, Talking DataµÈ
[self setupThirdParty:application didFinishLaunchingWithOptions:launchOptions]; |
ÓÐûÓиüºÃµÄ°ì·¨ÄØ£¿
Ê×ÏÈÎÒдÁËÒ»¸ö YTXModule ¡£ËüÀûÓÃruntime£¬²»ÐèÒªÔÚAppDelegateÖÐÌí¼ÓÈκδúÂ룬¾Í¿ÉÒÔ²¶»ñAppÉúÃüÖÜÆÚ¡£
ÔÚij¸öÏë»ñµÃAppÉúÃüÖÜÆÚµÄÀàÖеÄ.mÖÐÕâÑùʹÓãº
YTXMODULE_EXTERN()
{
//Ï൱ÓÚload
isLoad = YES;
}
+ (BOOL)application:(UIApplication *)application
willFinishLaunchingWithOptions:(nullable NSDictionary
*)launchOptions
{
//ʵÏÖÒ»ÑùµÄ·½·¨Ãû£¬µ«ÊDZØÐëÊǾ²Ì¬·½·¨¡£
return YES;
} |
·Ö²ã
ÒòΪÔÚ½â¾ö³õʼ»¯ÎÊÌâµÄʱºò£¬ÒªÏÈÉè¼ÆºÃ²ã¼¶½á¹¹¡£ËùÒÔÕâÀïÍ»È»Ìø×ªµ½·Ö²ã¡£
Éϸöͼ£º

ÎÒÃÇ×Ô¼º¶¨Á˼¸¸öÔÔò¡£
ÒµÎñ×é¼þÖ®¼ä²»ÄÜÓÐÒÀÀµ¹ØÏµ¡£
°´ÕÕͼʾ²»ÄÜ¿ç²ãÒÀÀµ¡£
ËùνÈõÒµÎñ×é¼þ¾ÍÊǰüº¬×ÅÉÙ²¿·ÖÒµÎñ£¬²¢ÇÒ¿ÉÒÔÔÚÕâ¸öAppÄڵĸ÷¸öÒµÎñ×é¼þÖ®¼äÖØÓõĴúÂë¡£
ÒªÒÀÀµYTXModuleµÄ×é¼þÒ»¶¨ÒªÒÔModule½á⣬¶øÇÒËüÒ»¶¨ÊǸöÒµÎñ×é¼þ»òÊÇÈõÒµÎñ×é¼þ¡£
ÈõÒµÎñ×é¼þÒÔApp´úºÅ¿ªÍ·£¨±ÈÈçPB£©£¬ÒÔModule½áβ¡£Àý£ºPBBasicProviderModule¡£
ÒµÎñ×é¼þÒÔApp´úºÅ¿ªÍ·£¨±ÈÈçPB£©BusinessModule½áβ¡£Àý£ºPBHomePageBusinessModule¡£
ÒµÎñ×é¼þÖ®¼ä²»ÄÜÓÐÒÀÀµ¹ØÏµ£¬ÕâÊǹ«ÈϵĵÄÔÔò¡£·ñÔò¾ÍʧȥÁË×é¼þ»¯¿ª·¢µÄºËÐļÛÖµ¡£
ÈõÒµÎñ×é¼þÖ®¼äÒ²²»Ó¦µ±ÓÐÒÀÀµ¹ØÏµ¡£Èç¹ûÓÐÒÀÀµ¹ØÏµËµÃ÷ÄãµÄ¹¦ÄÜ»®·Ö²»×¼È·¡£
³õʼ»¯
ÎÒÃÇÔ¼¶¨ºÃÁ˲㼶½á¹¹£¬Ã÷È·ÁËÖ°ÔðÖ®ºó¡£ÎÒÃǾͿÉÒÔÌø»Ø³õʼ»¯µÄÉè¼ÆÁË¡£
´´½¨Ò»¸öPBBasicProviderModuleÈõÒµÎñ×é¼þ¡£
Ëüͨ¹ýÒÀÀµYTXModuleÀ´²¶×½AppÉúÃüÖÜÆÚ¡£
ËüÀ´¸ºÔð³õʼ»¯×Ô¼ºµÄºÍµÚÈý·½µÄ¶«Î÷¡£
ËùÓÐÒµÎñ×é¼þ¶¼¿ÉÒÔÒÀÀµÕâ¸öÈõÒµÎñ×é¼þ¡£
ËüÀ´±£Ö¤ËùÓж«Î÷Ò»¶¨ÊÇÊdzõʼ»¯Íê±ÏµÄ¡£
ËüÀ´Í³Ò»¹ÜÀí¡£
ËüÀ´±©Â¶Ò»Ð©ÀàºÍ¹¦ÄܸøÒµÎñ×é¼þʹÓá£
·´Õý¾ÍÊÇÒµÎñ×é¼þÖÐÒÀÀµPBBasicProviderModule£¬Ëü±£Ö¤ËüÀïÃæµÄËùÓж«Î÷¶¼ÊǺÃÓõġ£
ÒòΪÓÐÁËPBBasicProviderModule£¬ËùÒÔ²ÅÈÃÎÒ¸üÃ÷È·ÁËÈõÒµÎñ×é¼þÕâ¸ö¸ÅÄî¡£
ÒòΪÎÒÃÇÀÁ£¬Èç¹û°ÑPBBasicProvider¶¨ÒåΪҵÎñ×é¼þ¡£ÄÇËüºÍÆäËûÒµÎñ×é¼þÖ®¼äµÄͨОͱØÐëͨ¹ýBus¡¢Notification»òÐÒéµÈµÈ¡£
µ«ËüÓֿ϶¨ÊÇÒµÎñ°¡¡£ÒòΪÄÇЩAppKey¿Ï¶¨ÊǺÍÕâ¸öAppÓйØÏµµÄ£¬Ò²¾ÍÊÇAppµÄÏà¹ØÅäÖúͲÎÊýÒ²¿ÉÒÔ˵ÊÇÒµÎñ£»ÎÒÐèÒª³õʼ»¯ÉèÖÃÄÇЩBlockÒÀÀµUserÐÅÏ¢¡¢CurrentServerIdµÈµÈ¿Ï¶¨¶¼ÊÇÒµÎñ°¡¡£
ÄÇÖ»ºÃ¸ã¸öÈõÒµÎñ³öÀ´°¡¡£ÒòΪÎÒ²»ÄÜ´òÆÆÕâ¸öÔÔò°¡£ºÒµÎñ×é¼þÖ®¼ä²»ÄÜ»¥ÏàÒÀÀµ¡£
ÔÙ½øÒ»²½·ÖÇåÈõÒµÎñ×é¼þºÍÒµÎñ×é¼þ¡£
ÒµÎñ×é¼þÀïÃæ»ù±¾¶¼ÓУºstoryboard¡¢nib¡¢Í¼Æ¬µÈµÈ¡£ÈõÒµÎñ×é¼þÀïÃæÒ»°ãûÓС£Õâ²»ÊǾø¶ÔµÄ£¬µ«Ò»°ãÇé¿öÊÇÕâÑù¡£
ÒµÎñ×é¼þÒ»°ã¶¼ÊÇAppÉÏijһ¾ßÌåÒµÎñ¡£±ÈÈçÊ×Ò³¡¢ÎÒ¡¢Ö±²¥¡¢ÐÐÇéÏêÇé¡¢XX½»Ò×´óÅÌ¡¢YY½»Ò×´óÅÌ¡¢XX½»Ò×ÖÐÅÌ¡¢×ÊѶ¡¢·¢Ïֵȵȡ£¶øÈõÒµÎñ×é¼þÊǸøÕâЩҵÎñ×é¼þÌṩ¹¦Äܵģ¬×Ô¼º²»Ö±½Ó±íÏÖÔÚAppÉÏչʾ¡£
ÎÒÃÇ»¹¿ÉÒÔ´´½¨Ò»Ð©ÈõÒµÎñ×é¼þ¸øÒµÎñ×é¼þÌṩ¹¦ÄÜ¡£µ±È»ÁË£¬²»Äܹ»ÀÄÓá£ÐèҪ׼ȷ»®·ÖÖ°Ôð¡£
×îºó£¬´úÂë´ó¸ÅÊÇÕâÑùµÄ£º
@implementation
PBBasicProviderModule
YTXMODULE_EXTERN()
{
}
+ (BOOL)application: (UIApplication *)application
didFinishLaunchingWithOptions: (nullable NSDictionary
*)launchOptions
{
[self setupThirdParty: application didFinishLaunching WithOptions:launchOptions];
[self setupBasic: application didFinishLaunchingWithOptions: launchOptions];
return YES;
}
+ (void) setupThirdParty: (UIApplication *)application
didFinishLaunchingWithOptions: (NSDictionary
*)launchOptions
{
dispatch_async (dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_HIGH,
0), ^{
[self setupEaseMob:application didFinishLaunchingWithOptions:launchOptions];
[self setupTalkingData];
[self setupAdTalkingData];
[self setupShareSDK];
[self setupJSPatch];
[self setupUmeng];
// [self setupAdhoc];
});
}
+ (void) setupBasic:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary
*)launchOptions
{
[self registerBasic];
[self autoIncrementOpenAppCount];
[self setupScreenShowManager];
[self setupYTXAnalytics];
[self setupRemoteHook];
}
+ (YTXAnalytics) sharedYTXAnalytics
{
return ......;
}
...... |
ÉèÏë
Õâ¸öPBBasicProviderModule¼òÖ±¾ÍÊǸö´óÔӻⰡ£¬°ÑºÜ¶àÒÔǰдÔÚAppDelegateÀïµÄ¶«Î÷¶¼¶ªÔÚÀïÃæÁË¡£ºÁÎÞÓÅÑÅ¿ÉÑÔ¡£
µÄÈ·ÊÇÕâÑùµÄ£¬¸Ð¾õûÓиüºÃµÄ°ì·¨ÁË¡£
¼ÈÈ»ÒѾÕâÑùÁË¡£ÎÒÃǿɲ»¿ÉÒԴ󵨵ØÉèÏëһϣºÃ¿¸ö¿ª·¢Õß¿ª·¢×Ô¼º¸ºÔðµÄÒµÎñ×é¼þµÄʱºò²»ÐèÒª¹ØÐÄÖ÷App¡£
ÒòΪÎÒÖªµÀÃÀÍŵÄ×é¼þ»¯¿ª·¢±ØÐëÒÀÀµÖ÷AppµÄAppDelegateµÄÒ»´ó¶ÑÉèÖúͳõʼ»¯¡£ËùÒԸɴàËûÃǾÍÖ±½ÓÔÚÖ÷AppÖм¯³Éµ÷ÊÔ£¬ËûÃÇͨ¹ý¶þ½øÖÆ»¯ºÍÈ¥PodÒÀÀµ»¯µÄ·½Ê½ÈÃÖ÷AppµÄ¹¹½¨·Ç³£¿ì¡£
ËùÒÔÎÒÃÇÊDz»ÊÇ¿ÉÒÔ¼ÌÐøÎÛȾÕâ¸öPBBasicProviderModule¡£²»ÐèÒªÔÚÖ÷AppÏîÄ¿ÀïµÄAppDelegateдÈκγõʼ»¯´úÂ룿»ù±¾»òÕß¾¡Á¿²»ÔÚÖ÷AppÀïдÈκδúÂ룿¸ÄÒÀÀµÖ÷App±äΪÒÀÀµÕâ¸öÈõÒµÎñ×é¼þ£¿
°´ÕÕÕâ¸ö˼·ÎÒÃǰá¿ÕÁËAppDelegateÀïµÄËùÓдúÂë¡£±ÈÈçһЩ³õʼ»¯AppÑùʽµÄ¶«Î÷¡¢³õʼ»¯RootViewControllerµÈµÈÕâЩ¶¼¿ÉÒÔ°áµ½Ò»¸öеÄÈõÒµÎñ×é¼þÀï¡£
¶øÒµÎñ×é¼þÆäʵ¸ù±¾²»Ðè¹ØÐÄÕâ¸öÈõÒµÎñ×é¼þ£¬¿ª·¢ÈËÔ±Ö»ÐèÒªÔÚÒµÎñ×é¼þÖеÄExample AppÖеÄAppDelegateÖгõʼ»¯×Ô¼ºÒµÎñ×é¼þµÄRootViewController¾ÍºÃÁË¡£
ÆäËûµÄÊÂÇé½»¸øÕâ¸öеÄÈõÒµÎñ×é¼þ¾ÍºÃÁË¡£¶øÖ÷AppºÍExample AppÖ»ÒªÔÚPodfileÖÐÒÀÀµËü¾ÍºÃÁË¡£
ËùÒÔ×îºóµÄÉèÏë¾ÍÊÇ£º¿ª·¢Õß²»»áÈ¥¸ÄÖ÷AppÏîÄ¿£¬Ò²²»ÐèÒªÖªµÀÖ÷AppÏîÄ¿¡£¶ÔÓÚ¿ª·¢ÕßÀ´Ëµ£¬Ö÷AppºÍÒµÎñ×é¼þÖ®¼äÊǸô¾øµÄ¡£
ÓÐÒ»¸ö¸ü´óµÄºÃ´¦£¬ÎÒÖ»Òª¸ü»»Õâ¸öÈõÒµÎñ×é¼þ£¬Õâ¸öÒµÎñ×é¼þ¾ÍÄÜÂíÉÏÊÊÅäÒ»¸öÐÂApp¡£ÕâÒ²ÊÇijÖÖÒâÒåÉϵĽâñî¡£
Debug/Release
Ë˵²»ÓÃÔÚÖ÷AppÀïµÄAppDelegateдÈκδúÂëµÄ£¬´òÁ³¡£¡£¡£
ÎÒÃÇÔÚ¶Ô¶þ½øÖÆPod¿âÅܲâÊԵķ¢ÏÖ£¬Ô´ÂëÄܹý£¬¶þ½øÖÆ(.a)²»Äܹý¡£°Ù˼²»µÃÆä½â£¬È»ºó×Ðϸ²é¿´´úÂ룬·¢ÏÖÊÇÕâ¸öºêµÄ¹ø£º
DEBUGÔÚ±àÒë½×¶Î¾ÍÒѾ¾ö¶¨ÁË¡£¶þ½øÖÆ»¯µÄʱºòÒѾ±àÒëÍê³ÉÁË¡£ ¶øÎÒÃǵĴúÂëÖгäÂú×Å#ifdef
DEBUG ¾ÍÕâÑùÕâÑù¡£ÄÇÔõô°ì£¬ÕâÊǶþ½øÖÆ»¯µÄ¹ø¡£µ«ÊÇÎÒÃǵĶþ½øÖÆ»¯ÒѾÐγÉÁ˱ê×¼£¬´ó¼Ò¶¼×Ô¾õ»áÕâô×ö£¬Ôõô½â¾öÕâ¸öÎÊÌâÄØ¡£
½â¾ö·½°¸ÊÇ£º
´´½¨ÁËÒ»¸öPBEnvironmentProvider¡£´ó¼Ò¶¼È¥ÒÀÀµËü¡£
È»ºóÔÀ´ÅжϺêµÄ´úÂë¸Ä³ÉÕâÑù£º
if([PBEnvironmentProvider
testing])
{
//...
} |
ÔÚÖ÷AppµÄAppDelegateÖÐÕâÑù£º
#if DEBUG &&
TESTING
//PBEnvironmentProviderÌṩµÄºê
CONFIG_ENVIRONMENT_TESTING
#endif |
ÔÀíÊÇ£ºÈç¹ûAppDelegateÓÐij¸ö·½·¨£¨CONFIG_ENVIRONMENT_TESTINGºê»áÌṩÕâ¸ö·½·¨£©£¬[PBEnvironmentProvider
testing]µÃµ½µÄ½á¹û¾ÍÊÇYES¡£
ΪʲôҪдÔÚÖ÷AppÀïÄØ£¿ÆäʵҲ¿ÉÒÔ¶ªÔÚPBBasicProviderModuleÀïÃæ£¬Ìṩһ¸ö·½·¨°¡¡£
ÒòΪÖ÷AppµÄAppDelegate.mÊÇÔ´Â룬δ¾±àÒë¡£ÁíÍâ×¢ÒâTESTINGÕâ¸öºê¡£ÎÒÃÇ¿ÉÒÔÔÚxcodeÉèÖÃÀï¼ÓÒ»¸ömacro²ÎÊýTESTING£¬²¢ÇÒÐÞ¸ÄΪ0µÄÇé¿öÏ£¬Äܹ»Éú³ÉÒ»¸öʵ¼ÊÊÇDEBUGµÄAppµ«ÀïÃæÄÚÈÝÈ´ÊÇÏßÉϵÄÄÚÈÝ¡£
Õâ¸öÐèÇóÊÇÀ´×ÔÓÚÎÒÃǾ³£ÐèÒª½ô¼±Í¨¹ýxcodeÖ±½ÓbuildÒ»¸öappµ½ÊÖ»úÉÏÒÔ½â¾ö»òÈ·ÈÏÏßÉϵÄÎÊÌâ¡£
ËäÈ»´òÁ³ÁË£¬µ«ÊÇÒ²»¹ºÃ£¬ÒÔºóÒ²²»ÓøÄÁË¡£ÔÙ˵Õâ¸öÊÇÌØÊâÐèÇó¡£³ýÁËÕâ¸öÖ®Í⣬Ö÷AppûÓÐÆäËû´úÂëÁË¡£
ÒµÎñ×é¼þ¼äͨÐÅ
ÎÒÃǽâ¾öÁ˳õʼ»¯ºÍ½âñîµÄÎÊÌâ¡£½ÓÏÂÀ´Ö»Òª½â¾ö×é¼þ¼äͨÐŵÄÎÊÌâ¾ÍºÃÁË¡£
È»ºóÎÒÕÒÁ˼¸¸öµÚÈý·½¿â£¬Ñ¡ÓÃÁË MGJRouter ¡£±¾À´Ö±½ÓÒÀÀµËü¾ÍºÃÁË¡£
ºóÀ´¾õµÃ¶¼Ê¹ÓÃBlockµÄ·½Ê½»áµ¼ÖÂÕâÑùµÄ´úÂ룬ȫ²¿¶ÑÔÚÁËÒ»¸ö·½·¨À
+ (void) setupRouter
{
......
[MGJRouter registerURLPattern:@"mgj://foo/a"
toHandler:^(NSDictionary *routerParameters) {
NSLog(@"routerParameterUserInfo:%@",
routerParameters[MGJRouterParameterUserInfo]);
}];
[MGJRouter registerURLPattern:@"mgj://foo/b"
toHandler:^(NSDictionary *routerParameters) {
NSLog(@"routerParameterUserInfo:%@",
routerParameters[MGJRouterParameterUserInfo]);
}];
......
} |
ÕâÑù¸Ð¾õºÜ²»Ë¬¡£ÄÇÎҸɴà¾Í°ÑMGJRouter´úÂë¸´ÖÆÁËÏÂÀ´£¬°ÑBlock¸Ä³ÉÁË@selector¡£²¢ÇÒ°ÑËüÖ±½Ó¼ÓÈëÁË
YTXModule ÀïÃæ¡£²¢ÇÒʹÓÃÁ˺꣬Èýá¹û¿´ÆðÀ´ÓÅÑÅЩ¡£´úÂë¿´ÆðÀ´ÊÇÕâÑùµÄ£º
//ÔÚij¸öÀàµÄ.mÀÆäʵ²¢²»ÐèÒª¼Ì³ÐYTXModuleÒ²¿ÉÒÔʹÓøù¦ÄÜ
YTXMODULE_EXTERN_ROUTER_OBJECT_METHOD(@"object1")
{
YTXMODULE_EXAPAND_PARAMETERS(parameters)
NSLog(@"%@ %@", userInfo, completion);
isCallRouterObjectMacro2 = YES;
return @"ÎÒÊǸöÀàÐÍ";
}
YTXMODULE_EXTERN_ROUTER_METHOD(@"YTX://QUERY/:query")
{
YTXMODULE_EXAPAND_PARAMETERS(parameters)
NSLog(@"%@ %@", userInfo, completion);
testQueryStringQueryValue = parameters[@"query"];;
testQueryStringNameValue = parameters[@"name"];
testQueryStringAgeValue = parameters[@"age"];
} |
µ÷ÓõÄʱºò¿´ÆðÀ´ÊÇÕâÑùµÄ£º
[YTXModule openURL:@"YTX://QUERY/query?age=18&name=CJ"
withUserInfo:@{@"Test":@1} completion:nil];
NSString * testObject2 = [YTXModule objectForURL:@"object1"
withUserInfo:@{@"Test":@2}]; |
ͨÐÅÎÊÌâ½â¾öÁË¡£ÆäÊµÒ³ÃæÌø×ªÎÊÌâÒ²½â¾öÁË¡£
Ò³ÃæÌø×ª
Ò³ÃæÌø×ª½â¾ö·½°¸ÓëÒµÎñ×é¼þÖ®¼äͨÐÅÎÊÌâÊÇÒ»ÑùµÄ¡£
µ«ÊÇÐèҪעÒâµÄÊÇ£¬ÄãÒ»¸öÒµÎñ×é¼þÄÚ²¿µÄÒ³ÃæÌø×ªÒ²ÇëʹÓÃURL+RouterµÄ·½Ê½Ìø×ª£¬¶ø²»Òª×Ô¼ºÖ±½ÓpushViewController¡£
ÕâÑùµÄºÃ´¦ÊÇ£ºÈç¹û½«À´Ä³Ð©ÄÚ²¿Ìø×ªÒ³ÃæÐèÒª¸øÆäËûÒµÎñ×é¼þµ÷Óã¬Äã¾Í²»ÐèÒªÔÙ×¢²á¸öURLÁË¡£ÒòΪ±¾À´¾ÍÓС£
ÊÇ·ñÈ¥Model»¯
È¥Model»¯Ö÷ÒªÌåÏÖÔÚÒµÎñ×é¼þ¼äͨÐÅ£¬Òª²»Òª´«Ò»¸öModel¹ýÈ¥(´«¹ýÈ¥µÄDictionaryÖеÄij¸ö¼üÊÇModel)¡£
Èç¹ûÈ¥Model»¯£¬Õâ¸öÒµÎñ×é¼þµÄ¿ª·¢ÕßÈçºÎÈ·¶¨DictionaryÀïÃæÓÐÄÄЩÄÚÈÝ·Ö±ðÊÇʲôÀàÐÍÄØ£¿ÄÇÐèÒªÓиöµØ·½´«²¥ÕâЩÐÅÏ¢£¬±ÈÈçдÔÚÍ·Îļþ£¬wikiµÈµÈ¡£
Èç¹û²»È¥Model»¯µÄ»°£¬¾ÍÐèÒª°ÑÕâ¸öModel×ö³ÉPod¿â¡£Á½¸öÒµÎñ×é¼þ¶¼È¥ÒÀÀµËü¡£
×îºó¾ö¶¨²»È¥Model¡£ÒòΪʵ¼ÊÉÏÓÐһЩModel¾ÍÊÇÔÚ¸÷¸öÒµÎñ×é¼þÖ®¼ä¹«Óõ썱ÈÈçUser£©£¬ËùÒԿ϶¨¾Í»áÓÐModel×ö³ÉPod¿â¡£ÎÒÃÇ¿ÉÒÔ°ÑËü×ö³ÉÖØModel£¬ModelÀï¿ÉÒÔ´øÍøÂçÇëÇóºÍ±¾µØ´æ´¢µÄ·½·¨¡£Î¨Ò»²»ÄܱÜÃâµÄÎÊÌâÊÇ£¬Á½¸öÒµÎñ×é¼þµÄ¿ª·¢Õß¶¼ÓпÉÄÜÈ¥¸ÄÕâ¸öModelµÄPod¿â¡£
ÐÅÏ¢µÄÅû¶
Ìø×ªµÄÒ³ÃæÐèÒª´«ÄÄЩ²ÎÊý£¿ ÒµÎñ×é¼þÖ®¼ä´«µÝÊý¾Ýʱºò±¾ÖʵÄÔØÌåÊÇʲô£¿
²»Í¬ÒµÎñ¿ª·¢ÕßÈçºÎÖªÏþÕâЩÐÅÏ¢¡£
ʹÓÃÈ¥Model»¯ºÍ²»Ê¹ÓÃÈ¥Model»¯£¬ÎÒÃǶ¼Óи÷×Եķ½°¸¡£
È¥Model»¯£¬ÔòÅû¶ͷÎļþ£¬ÔÚÍ·ÎļþÀïÃæÐ´ÏêϸµÄ×¢ÊÍ¡£
Èç¹û²»È¥Model»¯£¬Ôò¾Í¿´Model¾Í¿ÉÒÔÁË¡£ÈçÓÐÌØÊâÇé¿ö£¬ÄÇÒ²ÊÇÎĵµÐ´ÔÚÍ·ÎļþÄÚ¡£
×ܽáµÄ»°£ºÐÅÏ¢Åû¶µÄ·½Ê½¾ÍÊǰÑ×¢ÊÍÎĵµÐ´ÔÚÍ·ÎļþÄÚ¡£
×é¼þµÄÉúÃüÖÜÆÚ
ÒµÎñ×é¼þµÄÉúÃüÖÜÆÚºÍAppÒ»Ñù¡£Ëü±¾Éí¾ÍÊǸöÀֻ࣬±©Â¶Àà·½·¨£¬²»´æÔÚÐèҪʵÀý£¬ËùÒÔÆäʵ²»´æÔÚÉúÃüÖÜÆÚÕâ¸ö¸ÅÄî¡£¶øËü¿ÉÒÔʹÓÃÀà·½·¨´´½¨ºÜ¶àViewController£¬ViewControllerµÄÉúÃüÖÜÆÚÓÉApp¹ÜÀí¡£ÄÄÅÂÕâЩViewControllerÖ®¼äÐèҪͨÐÅ£¬ÄãÒ²¿ÉÒÔʹÓÃBus/YTXModule/ÐÒéµÈµÈ·½Ê½À´×ö£¬¶ø²»Ó¦¸ÃÈÃÒµÎñ×é¼þÕâ¸öÀàÀ´¸ºÔðËûÃÇÖ®¼äµÄͨÐÅ£»Ò²²»Ó¦¸Ã×Ô¼º³ÖÓÐViewController£»ÕâÑùÔö¼ÓÁËñîºÏ¡£
ÈõÒµÎñ×é¼þµÄÉúÃüÖÜÆÚÓÉ´´½¨ËüµÄ¶ÔÏóÀ´¹ÜÀí¡£°´Ðè´´½¨ºÍARC×Ô¶¯ÊÍ·Å¡£
»ù´¡¹¦ÄÜ×é¼þºÍµÚÈý·½µÄÉúÃüÖÜÆÚÓÉ´´½¨ËüµÄ¶ÔÏóÀ´¹ÜÀí¡£°´Ðè´´½¨ºÍARC×Ô¶¯ÊÍ·Å¡£
°æ±¾¹æ·¶
ÎÒÃÇ×Ô¼º¶¨µÄ¹æÔò¡£
ËùÓÐPod¿â¶¼Ö»ÒÀÀµµ½minor
Ö÷AppÖо«È·ÒÀÀµµ½patch
Ö÷AppÖеÄÒµÎñ×é¼þ°æ±¾ºÅµÄMain.MinorÒªºÍÖ÷App°æ±¾±£³ÖÒ»Ö¡£
²Î¿¼£º Semantic Versioning RubyGems Versioning Policies
¶þ½øÖÆ»¯
¶þ½øÖÆ»¯ÎÒÈÏΪÊDZØÐëµÄ£¬Äܹ»¼Ó¿ì¿ª·¢ËÙ¶È¡£
¶øÎÒʹÓõÄÕâ¸ö ¶þ½øÖÆ·½°¸
Óиö¿Ó¾ÍÊÇÔÚgitlab-runnerÉÏÔÚ¶þ½øÖƺÍÔ´ÂëÇл»Ê±£¬¾³£ÐèÒªpod cache clean
--all£¬test/lint/publish²ÅÄܳɹ¦¡£¶øÃ¿´Îpod cache clean --allÖ®ºóCocoaPods»áÈ¥ÖØÐÂÏÂÔØÏà¹ØµÄpod¿â£¬Ôö¼ÓÁËʱ¼äºÍ²»±ØÒªµÄ¿ªÏú¡£
ÎÒÃÇÏÖÔÚͨ¹ýpodspecÖÐÔö¼Ópreserve_pathsºÍÖ´ÐÐdownload_zip.sh½â¾öÁËcacheµÄÎÊÌâ¡£ÔÀíÊÇÈÃpod
cache¼ÈÓÐÔ´ÂëÓÖÓжþ½øÖÆ.a¡£¾ßÌå¿ÉÒÔ¿´ytx-pod-templateÏîÄ¿ÖÐµÄ Name.podspec
ºÍ download_zip.sh ¡£
¶þ½øÖÆ»¯»¹µÃ×¢ÒâºêµÄÎÊÌ⡣СÐÄʹÓú꣬ÓÈÆäÊÇ#ifdef¡£±ÜÃâÔ´ÂëºÍ¶þ½øÖÆ´úÂëÔËÐеĽá¹û²»Ò»Ñù¡£
¼¯³Éµ÷ÊÔ
¼¯³Éµ÷ÊԺܼòµ¥¡£Ã¿Ò»¸öÒµÎñ×é¼þÔÚ×Ô¼ºµÄExample AppÖе÷ÊÔ¡£
Õâ¸öÒµÎñ×é¼þµÄpodspecֻҪдÇå³þ×Ô¼ºÒÀÀµµÄ¿âÓÐÄÄЩ¡£Ê£ÏÂµÄÆäËûÒµÎñ×é¼þÓ¦¸ÃдÔÚExample
AppµÄPodfileÀïÃæ¡£
ÒÀÀµµÄPod¿â¶¼ÊǶþ½øÖƵġ£ÈçÓÐÎÊÌâ¿ÉÒÔ×°Ô´Âë(IS_SOURCE=1 pod install)À´µ÷ÊÔ¡£
¿ª·¢ÈËÔ±ÆäʵֻÐèÒª¹ØÐÄ×Ô¼ºµÄÒµÎñ×é¼þ£¬Õâ¸öÒµÎñ×é¼þÊÇ×ÔÇ¢µÄ¡£
¹«¹²¿âËÀ´Î¬»¤µÄÎÊÌâ
Õâ¸öÎÊÌâÔÚÎÒÃÇÕâÖÖСTeam²»´æÔÚ¡£Ã»ÓÐ×ÐϸµØÈ¥Ïë¹ý¡£µ«ÊÇÖ»Òª×öºÃ´úÂë×¼È루Test/Lint/Code
Review£©ºÍȨÏÞ¹ÜÀí¾ÍÓ¦¸Ã²»»á´æÔÚ´óµÄÎÊÌâ¡£
µ¥Ôª²âÊÔ
µ¥Ôª²âÊÔÎÒÃÇÓõÄÊÇ Kiwi ¡£ ½áºÏMVVMģʽ£¬¶Ôÿһ¸öÒµÎñ×é¼þµÄViewModel¶¼½øÐе¥Ôª²âÊÔ¡£Ã¿´Îpush´úÂ룬gitlab-runner¶¼»á×Ô¶¯ÅܲâÊÔ¡£Ò»µ©¿ª·¢ÈËÔ±·¢ÏÖ²âÊÔ¹ÒÁ˾ÍÄܹ»¼°Ê±ÕÒµ½ÎÊÌâ¡£Ò²¿ÉÒÔºÜÈÝÒ×µÄ×·ËÝÄÄ´ÎÌá½»°Ñ²âÊÔÅܹÒÁË¡£
ÕâÒ²ÊÇÎÒÃÇÍŶӵÄÇ¿ÖÆÒªÇó¡£Ã»ÓвâÊÔ£¬²âÊÔдµÄ²»ºÃ£¬²âÊÔ¹ÒÁË£¬Ö±½Ó¾Ü¾ømerge request¡£

lint
¶Ôÿһ¸ö×é¼þ½øÐÐlintÔÙ·¢²¼£¬±£Ö¤ÁËÕýÈ·ÐÔ¡£ÕâÒ²ÊÇÒ»²½Ç¿ÖÆÒªÇó¡£
lintµÄʱºòÄܹ»·¢ÏֺܶàÎÊÌ⡣ͨ³£Çé¿öϲ»ÔÊÐíwarning³öÏֵġ£Èç¹û²»ÄܱÜÃ⣨±ÈÈçµÚÈý·½£©ÇëÓÃ--allow-warnings¡£
pod lib lint --sources=<span
class="variable" style="color:rgb(0,128,128);">$SOURCES</span>
--verbose --fail-fast --<span class="keyword"
style="font-weight:bold;">use</span>-libraries
|
ͳһµÄÍøÂç·þÎñºÍ±¾µØ´æ´¢·½Ê½
Õâ¸ö¾ÍºÜ¼òµ¥¡£°ÑÕâÁ½¸ö²¿·Ö³éÏó³É¼¸¸öPod¿â¹©ËùÓÐÒµÎñ×é¼þʹÓþͺÃÁË¡£ ÎÒÃÇÕâ±ß·Ö±ðÊÇÈý¸öPod¿â£º
YTXRequest
YTXRestfulModel
NSUserDefault+YTX
ÆäËûһЩÄÚÈÝ
ignoreÁËÖ÷AppÖеÄPodfile.lock¾¡Á¿±ÜÃâ³åÍ»¡£
Ö÷App ArchiveµÄʱºòҪʹÓÃÔ´Â룬¶ø²»ÊǶþ½øÖÆ¡£
ºóÆÚ¿ÉÒÔʹÓÃoclintºÍdeploymate¼ì²é´úÂë¡£
ʹÓÃfastlane matchȥά»¤¿ª·¢Ö¤Êé¡£
һЩÐèÒª´Óplist»òÕßjson¶ÁÈ¡ÅäÖõÄPod¿âÄ£¿é£¬Òª×¢Òâ¶Á³öÀ´µÄÄÚÈÝ×îºÃÒª¼ÓÒ»¸önamespace¡£namespace¿ÉÒÔÊÇÕâ¸öÒµÎñ×é¼þµÄÃû×Ö¡£
ÒµÎñ×é¼þ¶ÁÈ¡×ÊÔ´ÎļþµÄÇø±ð
#´Ómain bundleÖÐÈ¡¡£Èç¹ûͼƬϣÍûÔÚstoryboardÖб»ÕÒµ½£¬Ê¹ÓÃÕâÖÖ·½Ê½¡£
s.resource = ["#{s.name}/Assets/**"]
#Ö»ÊÇÏ£ÍûÔÚÎÒÕâ¸öÒµÎñ×é¼þµÄbundleÄÚʹÓõÄplist¡£×÷ΪÅäÖÃÎļþ¡£ÕâÊǹٷ½ÍƼö·½Ê½¡£
s.resource_bundles = {
"{s.name}/" => ["{s.name}/Assets/config.plist"]
} |
³ÖÐø¼¯³É
ÔÀ´µÄApp¾ÍÊdzÖÐø¼¯³ÉµÄ¡£Ï뵱ȻµÄ£¬ÎÒÃÇÏ£ÍûеÄ×é¼þ»¯¿ª·¢µÄAppÒ²Äܹ»³ÖÐø¼¯³É¡£
PodfileÓ¦¸ÃÊÇÕâÑùµÄ£ºÕâÀïÃæ³öÏÖµÄÈ«ÊÇ˽ÓÐPod¿â¡£
pod 'YTXRequest',
'2.0.1'
pod 'YTXUtilCategory', '1.6.0'
pod 'PBBasicProviderModule', '0.2.1'
pod 'PBBasicChartAndSocketModule', '0.3.1'
pod 'PBBasicAppInitModule', '0.5.1'
...
pod 'PBBasicHomepageBusinessModule', '1.2.15'
pod 'PBBasicMeBusinessModule', '1.2.10'
pod 'PBBasicLiveBusinessModule', '1.2.1'
pod 'PBBasicChartBusinessModule', '1.2.6'
pod 'PBBasicTradeBusinessModule', '1.2.7' |
Èç¹ûPodÒÀÀµµÄ¶«Î÷ÌØ±ðÌØ±ð¶à£¬±ÈÈç100¶à¸ö¡£ÁíÍâÓÖ±ØÐëÒÀÀµÖ÷App×ö¼¯³Éµ÷ÊÔ¡£ ÄãÒ²¿ÉÒÔÓÃÕâÖÖ·½°¸£º°ÑÄãËùÓеÄPod¿âµÄÒÀÀµ¶¼Õ¹¿ªÐ´µ½Ö÷AppµÄPodfileÖС£¶ø·¢²¼Pod¿âʱpodspecÖв»´øÈκεÄÒÀÀµµÄ¡£ÕâÑù¾Í±ÜÃâÁËpod
installµÄʱºò½âÎöÒÀÀµÌرðºÄʱµÄÎÊÌâ¡£
¸÷¸ö½Å±¾¶¼ÔÚÕâ¸ö ytx-pod-template ¡£ÏÈ´Ó.gitlab-ci.yml¿´Æð¡£
ÎÒÃdzÖÐø¼¯³ÉµÄ¹¤¾ßÊÇgitlab runner¡£
³ÖÐø¼¯³ÉµÄÕû¸öÁ÷³ÌÊÇ£º
µÚÒ»²½£º
ʹÓÃtemplate´´½¨Pod¡£ÏñÕâÑù£º
pod lib create
<Pod¿âÃû³Æ> --template-url="http://gitlab.baidao.com/pods/ytx-pod-template" |
µÚ¶þ²½£º
´´½¨dev·ÖÖ§¡£ÓÃÀ´¿ª·¢¡£
µÚÈý²½£º
ÿ´Îpush devµÄʱºò»á´¥·¢runner×Ô¶¯ÅÜStage: Init Lint(ÖеÄtest)

µÚËIJ½£º
1.×¼±¸·¢²¼Pod¿â¡£ÐÞ¸ÄpodspecµÄ°æ±¾ºÅ£¬´òÉÏÏàÓ¦tag¡£ 2.ʹÓÃmerge_request.shÏòmasterÌá½»Ò»¸ömerge
request¡£

µÚÎå²½£º
1.ÆäËûÓÐȨÏÞ¿ª·¢Õßcode reviewÖ®ºó£¬½ÓÊÜmerge request¡£ 2.masterºÏ²¢Õâ¸ömerge
request 3.master´¥·¢runner×Ô¶¯ÅÜStage: Init Package Lint
ReleasePod UpdateApp
µÚÁù²½£º
Èç¹ûµÚÎå²½ÕýÈ·¡£Ö÷AppµÄdev·ÖÖ§»áÊÕµ½Ò»¸ömerge request£¬ÀïÃæµÄÄÚÈÝÊÇÐÞ¸ÄPodfile¡£
ͼÖÐÄÚÈݳöÏÖÁËAFNetworkingµÈÊÇÒòΪÕâ¸öʱºòÔÚ×ö²âÊÔ¡£

µÚÆß²½£º
Ö÷App´¥·¢runner£¬»á¹¹½¨Ò»¸öipa×Ô¶¯ÉÏ´«µ½ fir ¡£
Init
³õʼ»¯Ò»Ð©»·¾³¡£
´òӡһЩÐÅÏ¢¡£
Package
¶þ½øÖÆ»¯´ò°ü³É.a
Lint
Pod lib lint¡£¶þ½øÖƺÍÔ´Âë¶¼lint¡£
²âÊÔ¡£
ÒÔºó¿¼ÂǼÓÈëoclintºÍdeploymate¡£
ReleasePod
°ÑÏà¹ØÎļþzipºó£¬´«µ½¾²Ì¬·þÎñÆ÷¿â¡£ÒÔÌṩ¶þ½øÖÆ»¯ÏÂÔØ°ü¡£
pod repo push¡£·¢²¼¸ÃPod¿â¡£
ReleasePodµÄʱºò²»ÔÊÐíPod¿â³öÏÖ¾¯¸æ¡£
UpdateApp
ÏÂÔØApp´úÂë
ÐÞ¸ÄPodfileÎļþ¡£Èç¹ûÆ¥Åäµ½pod¿âÎļþÃûÔòÐ޸쬷ñÔòÌí¼Ó¡£
Éú³ÉÒ»¸ömerge requestµ½Ö÷AppµÄdev·ÖÖ§¡£
¹ØÓÚgitlab runner¡£
stageÕâ¸ö¹¦Äܷdz£µÄÀ÷º¦¡£Ç¿ÁÒÍÆ¼ö¡£
ÿһ¸östage¿ÉÒÔÅÜÔÚ²»Í¬µÄrunnerÉÏ¡£Ã¿Ò»¸östageʧ°ÜÁË¿ÉÒÔµ¥¶Àretry¡£¶øÄ³Ò»¸östageÀïÃæµÄÈÎÎñ¿ÉÒÔ²¢ÐÐÖ´ÐУº(testºÍlint¾ÍÊDz¢ÐеÄ)

|