Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
GMPhobos
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
gengmeiios
GMPhobos
Commits
7b79a83e
Commit
7b79a83e
authored
Sep 23, 2019
by
乔金柱
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'jql/phobos' into 'master'
重构埋点库 See merge request
!42
parents
3d867177
9adf3bfc
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
544 additions
and
410 deletions
+544
-410
D343427D-396A-4DA4-A74B-7C92AD89F7A7.plist
...39A.xcbaseline/D343427D-396A-4DA4-A74B-7C92AD89F7A7.plist
+22
-0
Info.plist
...cbaselines/6003F5AD195388D20070C39A.xcbaseline/Info.plist
+31
-0
GMViewController.m
Example/GMPhobos/GMViewController.m
+5
-6
Podfile.lock
Example/Podfile.lock
+4
-4
GMPhobosUtilTest.m
Example/Tests/GMPhobosUtilTest.m
+2
-2
GMPhotoTest.m
Example/Tests/GMPhotoTest.m
+82
-70
GMPhobos.podspec
GMPhobos.podspec
+1
-1
Phobos.h
GMPhobos/Classes/Phobos.h
+55
-11
Phobos.m
GMPhobos/Classes/Phobos.m
+336
-313
PhobosConfig.h
GMPhobos/Classes/PhobosConfig.h
+2
-2
PhobosUtil.m
GMPhobos/Classes/PhobosUtil.m
+4
-0
UIResponder+PhobosPV.h
GMPhobos/Classes/UIResponder+PhobosPV.h
+0
-1
No files found.
Example/GMPhobos.xcodeproj/xcshareddata/xcbaselines/6003F5AD195388D20070C39A.xcbaseline/D343427D-396A-4DA4-A74B-7C92AD89F7A7.plist
0 → 100644
View file @
7b79a83e
<
?xml
v
e
rsion="
1
.
0
"
e
n
c
o
d
ing="UT
F
-
8
"?
>
<
!
D
O
C
TYP
E
plist
PU
B
LI
C
"-//
A
ppl
e
//
D
T
D
PLIST
1
.
0
//
E
N"
"http://www.
a
ppl
e
.
c
om/
D
T
D
s/Prop
e
rtyList-
1
.
0
.
d
t
d
"
>
<
plist
v
e
rsion="
1
.
0
"
>
<
d
i
c
t
>
<
k
e
y
>
classNames
<
/k
e
y
>
<
d
i
c
t
>
<
k
e
y
>
GMPhobosUtilTest
<
/k
e
y
>
<
d
i
c
t
>
<
k
e
y
>
testDataCompressPerformance
<
/k
e
y
>
<
d
i
c
t
>
<
k
e
y
>
com.apple.XCTPerformanceMetric_WallClockTime
<
/k
e
y
>
<
d
i
c
t
>
<
k
e
y
>
baselineAverage
<
/k
e
y
>
<
r
ea
l
>
0.000579
<
/r
ea
l
>
<
k
e
y
>
baselineIntegrationDisplayName
<
/k
e
y
>
<
string
>
Local
Baseline
<
/string
>
<
/
d
i
c
t
>
<
/
d
i
c
t
>
<
/
d
i
c
t
>
<
/
d
i
c
t
>
<
/
d
i
c
t
>
<
/plist
>
Example/GMPhobos.xcodeproj/xcshareddata/xcbaselines/6003F5AD195388D20070C39A.xcbaseline/Info.plist
View file @
7b79a83e
...
@@ -35,6 +35,37 @@
...
@@ -35,6 +35,37 @@
<
string
>
com.apple.platform.iphonesimulator
<
/string
>
<
string
>
com.apple.platform.iphonesimulator
<
/string
>
<
/
d
i
c
t
>
<
/
d
i
c
t
>
<
/
d
i
c
t
>
<
/
d
i
c
t
>
<
k
e
y
>
D343427D-396A-4DA4-A74B-7C92AD89F7A7
<
/k
e
y
>
<
d
i
c
t
>
<
k
e
y
>
localComputer
<
/k
e
y
>
<
d
i
c
t
>
<
k
e
y
>
busSpeedInMHz
<
/k
e
y
>
<
int
e
g
e
r
>
100
<
/int
e
g
e
r
>
<
k
e
y
>
cpuCount
<
/k
e
y
>
<
int
e
g
e
r
>
1
<
/int
e
g
e
r
>
<
k
e
y
>
cpuKind
<
/k
e
y
>
<
string
>
Intel
Core
i7
<
/string
>
<
k
e
y
>
cpuSpeedInMHz
<
/k
e
y
>
<
int
e
g
e
r
>
2300
<
/int
e
g
e
r
>
<
k
e
y
>
logicalCPUCoresPerPackage
<
/k
e
y
>
<
int
e
g
e
r
>
8
<
/int
e
g
e
r
>
<
k
e
y
>
modelCode
<
/k
e
y
>
<
string
>
MacBookPro11
,
2
<
/string
>
<
k
e
y
>
physicalCPUCoresPerPackage
<
/k
e
y
>
<
int
e
g
e
r
>
4
<
/int
e
g
e
r
>
<
k
e
y
>
platformIdentifier
<
/k
e
y
>
<
string
>
com.apple.platform.macosx
<
/string
>
<
/
d
i
c
t
>
<
k
e
y
>
targetArchitecture
<
/k
e
y
>
<
string
>
x86_64
<
/string
>
<
k
e
y
>
targetDevice
<
/k
e
y
>
<
d
i
c
t
>
<
k
e
y
>
modelCode
<
/k
e
y
>
<
string
>
iPhone10
,
5
<
/string
>
<
k
e
y
>
platformIdentifier
<
/k
e
y
>
<
string
>
com.apple.platform.iphonesimulator
<
/string
>
<
/
d
i
c
t
>
<
/
d
i
c
t
>
<
/
d
i
c
t
>
<
/
d
i
c
t
>
<
/
d
i
c
t
>
<
/
d
i
c
t
>
<
/plist
>
<
/plist
>
Example/GMPhobos/GMViewController.m
View file @
7b79a83e
...
@@ -36,12 +36,11 @@ NSString *const MockCityId = @"beijing";
...
@@ -36,12 +36,11 @@ NSString *const MockCityId = @"beijing";
NSString
*
url
=
@"http://log.test.gengmei.cc/log/collect"
;
NSString
*
url
=
@"http://log.test.gengmei.cc/log/collect"
;
#endif
#endif
[
GMCache
removeObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
GMCache
removeObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
Phobos
*
phobos
=
[
Phobos
clientWithAppName
:
MockAppName
channelId
:
MockChannelId
];
[
Phobos
clientWithAppName
:
MockAppName
channelId
:
MockChannelId
];
phobos
.
serverAPI
=
url
;
Phobos
.
sharedClient
.
serverAPI
=
url
;
[
phobos
setLogEnabled
:
NO
];
// 调试打Log模式,看情况开启
[
Phobos
.
sharedClient
setLogEnabled
:
NO
];
// 调试打Log模式,看情况开启
phobos
.
signingType
=
PhobosSigningTypeDebug
;
Phobos
.
sharedClient
.
signingType
=
PhobosSigningTypeDebug
;
phobos
.
userId
=
@""
;
Phobos
.
sharedClient
.
userId
=
@""
;
[
Phobos
setSharedClient
:
phobos
];
NSString
*
inDate
=
[
PhobosUtil
currentTime
];
NSString
*
inDate
=
[
PhobosUtil
currentTime
];
NSMutableDictionary
*
dict
=
[[
NSMutableDictionary
alloc
]
init
];
NSMutableDictionary
*
dict
=
[[
NSMutableDictionary
alloc
]
init
];
...
...
Example/Podfile.lock
View file @
7b79a83e
...
@@ -35,9 +35,9 @@ PODS:
...
@@ -35,9 +35,9 @@ PODS:
- GMKit/Protocol (1.1.3):
- GMKit/Protocol (1.1.3):
- Masonry (= 1.1.0)
- Masonry (= 1.1.0)
- SDWebImage (= 3.7.6)
- SDWebImage (= 3.7.6)
- GMPhobos (1.
2.9
):
- GMPhobos (1.
3.0
):
- GMCache
(= 0.2.3)
- GMCache
- GMKit
(= 1.1.3)
- GMKit
- Masonry (1.1.0)
- Masonry (1.1.0)
- SDWebImage (3.7.6):
- SDWebImage (3.7.6):
- SDWebImage/Core (= 3.7.6)
- SDWebImage/Core (= 3.7.6)
...
@@ -63,7 +63,7 @@ EXTERNAL SOURCES:
...
@@ -63,7 +63,7 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
SPEC CHECKSUMS:
GMCache: 09a3029c96fe130e3a21faef70b3d9d2ce92d639
GMCache: 09a3029c96fe130e3a21faef70b3d9d2ce92d639
GMKit: 35f788243cceeddf3e13c5226b3ea0b5e08e2117
GMKit: 35f788243cceeddf3e13c5226b3ea0b5e08e2117
GMPhobos:
89d9654a951819abc9285b392e055278d10877f
2
GMPhobos:
c1dd33760f8d4243e6bf562a115899e66c6ec7d
2
Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
SDWebImage: c325cf02c30337336b95beff20a13df489ec0ec9
SDWebImage: c325cf02c30337336b95beff20a13df489ec0ec9
TMCache: 95ebcc9b3c7e90fb5fd8fc3036cba3aa781c9bed
TMCache: 95ebcc9b3c7e90fb5fd8fc3036cba3aa781c9bed
...
...
Example/Tests/GMPhobosUtilTest.m
View file @
7b79a83e
...
@@ -7,8 +7,8 @@
...
@@ -7,8 +7,8 @@
//
//
#import <XCTest/XCTest.h>
#import <XCTest/XCTest.h>
#import <GMPhobos/Phobos.h>
#import "PhobosUtil.h"
#import "PhobosUtil.h"
@import
GMPhobos
;
@interface
GMPhobosUtilTest
:
XCTestCase
@interface
GMPhobosUtilTest
:
XCTestCase
@property
(
nonatomic
,
retain
)
NSMutableArray
*
mockArray
;
@property
(
nonatomic
,
retain
)
NSMutableArray
*
mockArray
;
...
@@ -19,7 +19,7 @@
...
@@ -19,7 +19,7 @@
-
(
void
)
setUp
{
-
(
void
)
setUp
{
[
super
setUp
];
[
super
setUp
];
NSString
*
url
=
@"http://log.test.gengmei.cc/log/collect"
;
NSString
*
url
=
@"http://log.test.gengmei.cc/log/collect"
;
[
Phobos
setSharedClient
:[
Phobos
clientWithAppName
:
@"gengmei_test"
channelId
:
@"AppStore"
]
];
[
Phobos
clientWithAppName
:
@"gengmei_test"
channelId
:
@"AppStore"
];
[
Phobos
sharedClient
].
serverAPI
=
url
;
[
Phobos
sharedClient
].
serverAPI
=
url
;
_mockArray
=
[[
NSMutableArray
alloc
]
init
];
_mockArray
=
[[
NSMutableArray
alloc
]
init
];
for
(
int
i
=
0
;
i
<
50
;
i
++
)
{
for
(
int
i
=
0
;
i
<
50
;
i
++
)
{
...
...
Example/Tests/GMPhotoTest.m
View file @
7b79a83e
...
@@ -9,8 +9,7 @@
...
@@ -9,8 +9,7 @@
#import <XCTest/XCTest.h>
#import <XCTest/XCTest.h>
#import <GMPhobos/Phobos.h>
#import <GMPhobos/Phobos.h>
#import "GMPhobosController.h"
#import "GMPhobosController.h"
#define PhobosCacheKey @"PhobosCacheKey"
#import <GMCache/GMCache.h>
@import
GMCache
;
NSString
*
const
MockAppName
=
@"gengmei_test"
;
NSString
*
const
MockAppName
=
@"gengmei_test"
;
NSString
*
const
MockChannelId
=
@"AppStore"
;
NSString
*
const
MockChannelId
=
@"AppStore"
;
...
@@ -19,26 +18,25 @@ NSString *const MockUserId = @"1";
...
@@ -19,26 +18,25 @@ NSString *const MockUserId = @"1";
NSString
*
const
MockCityId
=
@"beijing"
;
NSString
*
const
MockCityId
=
@"beijing"
;
@interface
GMPhotoTest
:
XCTestCase
@interface
GMPhotoTest
:
XCTestCase
@property
Phobos
*
client
;
@end
@end
///[NSThread sleepForTimeInterval:0.2]; 因为是异步处理数据,所以需要延迟获取,进行单元测试
@implementation
GMPhotoTest
@implementation
GMPhotoTest
-
(
void
)
setUp
{
-
(
void
)
setUp
{
[
super
setUp
];
[
super
setUp
];
_client
=
[
Phobos
clientWithAppName
:
MockAppName
channelId
:
MockChannelId
];
[
Phobos
clientWithAppName
:
MockAppName
channelId
:
MockChannelId
];
_client
.
serverAPI
=
@"http://log.test.igengmei.com/log/collect"
;
Phobos
.
sharedClient
.
serverAPI
=
@"http://log.test.igengmei.com/log/collect"
;
[
_client
setLogEnabled
:
NO
];
// 调试打Log模式,看情况开启
Phobos
.
sharedClient
.
logEnabled
=
NO
;
// 调试打Log模式,看情况开启
_client
.
signingType
=
PhobosSigningTypeDebug
;
Phobos
.
sharedClient
.
signingType
=
PhobosSigningTypeDebug
;
_client
.
userId
=
@""
;
Phobos
.
sharedClient
.
userId
=
@""
;
[
Phobos
setSharedClient
:
_client
];
}
}
-
(
void
)
tearDown
{
-
(
void
)
tearDown
{
// Put teardown code here. This method is called after the invocation of each test method in the class.
// Put teardown code here. This method is called after the invocation of each test method in the class.
[
super
tearDown
];
[
super
tearDown
];
[
GMCache
removeObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
Phobos
removeAllNormalPhobosData
];
[
GMCache
removeObjectAtDocumentPathWithkey
:
PhobosTempCacheKey
];
[
Phobos
removeAllImmediatelyPhobosData
];
}
}
/**
/**
...
@@ -47,10 +45,12 @@ NSString *const MockCityId = @"beijing";
...
@@ -47,10 +45,12 @@ NSString *const MockCityId = @"beijing";
* @since <#version number#>
* @since <#version number#>
*/
*/
-
(
void
)
testClientWithUserId
{
-
(
void
)
testClientWithUserId
{
[
_client
setUserId
:
MockUserId
];
[
Phobos
removeAllNormalPhobosData
];
[
_client
setCurrentCityId
:
MockCityId
];
[
Phobos
.
sharedClient
setUserId
:
MockUserId
];
[
Phobos
.
sharedClient
setCurrentCityId
:
MockCityId
];
[
Phobos
track
:
MockEventId
];
[
Phobos
track
:
MockEventId
];
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
NSArray
*
array
=
[
Phobos
normalPhobosDataForServerAPI
];
XCTAssertTrue
(
array
.
count
==
1
,
@"array is empty"
);
XCTAssertTrue
(
array
.
count
==
1
,
@"array is empty"
);
NSDictionary
*
dict
=
[
array
objectAtIndex
:
0
];
NSDictionary
*
dict
=
[
array
objectAtIndex
:
0
];
[
self
verfiyDict
:
dict
];
[
self
verfiyDict
:
dict
];
...
@@ -64,7 +64,8 @@ NSString *const MockCityId = @"beijing";
...
@@ -64,7 +64,8 @@ NSString *const MockCityId = @"beijing";
*/
*/
-
(
void
)
testTrackEventWithoutAttr
{
-
(
void
)
testTrackEventWithoutAttr
{
[
Phobos
track
:
MockEventId
];
[
Phobos
track
:
MockEventId
];
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
NSArray
*
array
=
[
Phobos
normalPhobosDataForServerAPI
];
XCTAssertTrue
(
array
.
count
==
1
,
@"array is empty"
);
XCTAssertTrue
(
array
.
count
==
1
,
@"array is empty"
);
NSDictionary
*
dict
=
[
array
objectAtIndex
:
0
];
NSDictionary
*
dict
=
[
array
objectAtIndex
:
0
];
[
self
verfiyDict
:
dict
];
[
self
verfiyDict
:
dict
];
...
@@ -79,7 +80,8 @@ NSString *const MockCityId = @"beijing";
...
@@ -79,7 +80,8 @@ NSString *const MockCityId = @"beijing";
-
(
void
)
testTrackEventWithAttr
{
-
(
void
)
testTrackEventWithAttr
{
NSDictionary
*
attr
=
@{
@"attr"
:
@"track_attr"
};
NSDictionary
*
attr
=
@{
@"attr"
:
@"track_attr"
};
[
Phobos
track
:
MockEventId
attributes
:
attr
];
[
Phobos
track
:
MockEventId
attributes
:
attr
];
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
NSArray
*
array
=
[
Phobos
normalPhobosDataForServerAPI
];
XCTAssertTrue
(
array
.
count
==
1
,
@"array is empty"
);
XCTAssertTrue
(
array
.
count
==
1
,
@"array is empty"
);
NSDictionary
*
dict
=
[
array
objectAtIndex
:
0
];
NSDictionary
*
dict
=
[
array
objectAtIndex
:
0
];
[
self
verfiyDict
:
dict
];
[
self
verfiyDict
:
dict
];
...
@@ -95,13 +97,13 @@ NSString *const MockCityId = @"beijing";
...
@@ -95,13 +97,13 @@ NSString *const MockCityId = @"beijing";
* @since <#version number#>
* @since <#version number#>
*/
*/
-
(
void
)
testTrackEventWithAttrAndSendNow
{
-
(
void
)
testTrackEventWithAttrAndSendNow
{
[
Phobos
removeAllNormalPhobosData
];
// Given
// Given
NSDictionary
*
attr
=
@{
@"attr"
:
@"track_attr"
};
NSDictionary
*
attr
=
@{
@"attr"
:
@"track_attr"
};
// When
// When
[
Phobos
track
:
MockEventId
attributes
:
attr
sendNow
:
YES
];
[
Phobos
track
:
MockEventId
attributes
:
attr
sendNow
:
YES
];
// Then
// Then
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
XCTAssertTrue
([
Phobos
normalPhobosCount
]
==
0
,
@"array should be empty"
);
XCTAssertTrue
(
array
.
count
==
0
,
@"array should be empty"
);
}
}
/**
/**
...
@@ -118,8 +120,7 @@ NSString *const MockCityId = @"beijing";
...
@@ -118,8 +120,7 @@ NSString *const MockCityId = @"beijing";
// When
// When
[
Phobos
track
:
MockEventId
attributes
:
sendNowAttr
sendNow
:
YES
];
[
Phobos
track
:
MockEventId
attributes
:
sendNowAttr
sendNow
:
YES
];
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
XCTAssertTrue
([
Phobos
normalPhobosCount
]
!=
0
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
array
.
count
!=
0
,
@"array shouldn't be empty"
);
}
}
/**
/**
...
@@ -133,16 +134,16 @@ NSString *const MockCityId = @"beijing";
...
@@ -133,16 +134,16 @@ NSString *const MockCityId = @"beijing";
// 因为实时埋点是异步删除,所以这个位置暂时延时取数据,待优化 TODO
// 因为实时埋点是异步删除,所以这个位置暂时延时取数据,待优化 TODO
dispatch_after
(
dispatch_time
(
DISPATCH_TIME_NOW
,
(
int64_t
)(
0
.
25
*
NSEC_PER_SEC
)),
dispatch_get_main_queue
(),
^
{
dispatch_after
(
dispatch_time
(
DISPATCH_TIME_NOW
,
(
int64_t
)(
0
.
25
*
NSEC_PER_SEC
)),
dispatch_get_main_queue
(),
^
{
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosTempCacheKey
];
NSArray
*
array
=
[
Phobos
immediatelyPhobosForServerAPI
];
XCTAssertTrue
(
array
.
count
==
0
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
array
.
count
==
0
,
@"array shouldn't be empty"
);
[
Phobos
track
:
MockEventId
attributes
:
attr
sendNow
:
YES
];
[
Phobos
track
:
MockEventId
attributes
:
attr
sendNow
:
YES
];
dispatch_after
(
dispatch_time
(
DISPATCH_TIME_NOW
,
(
int64_t
)(
0
.
25
*
NSEC_PER_SEC
)),
dispatch_get_main_queue
(),
^
{
dispatch_after
(
dispatch_time
(
DISPATCH_TIME_NOW
,
(
int64_t
)(
0
.
25
*
NSEC_PER_SEC
)),
dispatch_get_main_queue
(),
^
{
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosTempCacheKey
];
NSArray
*
array
=
[
Phobos
immediatelyPhobosForServerAPI
];
XCTAssertTrue
(
array
.
count
==
0
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
array
.
count
==
0
,
@"array shouldn't be empty"
);
[
Phobos
track
:
MockEventId
attributes
:
attr
sendNow
:
YES
];
[
Phobos
track
:
MockEventId
attributes
:
attr
sendNow
:
YES
];
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
array
=
[
Phobos
normalPhobosDataForServerAPI
];
XCTAssertTrue
(
array
.
count
==
0
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
0
,
@"array shouldn't be empty"
);
});
});
});
});
}
}
...
@@ -153,23 +154,27 @@ NSString *const MockCityId = @"beijing";
...
@@ -153,23 +154,27 @@ NSString *const MockCityId = @"beijing";
* @since 1.1.4
* @since 1.1.4
*/
*/
-
(
void
)
testTrackEventWithDoubleAttrAndNoSendNow
{
-
(
void
)
testTrackEventWithDoubleAttrAndNoSendNow
{
[
Phobos
removeAllNormalPhobosData
];
NSDictionary
*
attr
=
@{
@"attr"
:
@"track_attr"
};
NSDictionary
*
attr
=
@{
@"attr"
:
@"track_attr"
};
//
//
[
NSThread
sleepForTimeInterval
:
0
.
2
];
[
Phobos
track
:
MockEventId
attributes
:
attr
];
[
Phobos
track
:
MockEventId
attributes
:
attr
];
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
1
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
1
,
@"array shouldn't be empty"
);
// PhobosCacheKey超过50条数据会自动上报,模拟此情况
// PhobosCacheKey超过50条数据会自动上报,模拟此情况
for
(
int
i
=
0
;
i
<
50
;
i
++
)
{
for
(
int
i
=
0
;
i
<
50
;
i
++
)
{
[
Phobos
track
:
MockEventId
attributes
:
attr
];
[
Phobos
track
:
MockEventId
attributes
:
attr
];
}
}
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
XCTAssertTrue
(
array
.
count
==
0
,
@"array shouldn't be empty"
);
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
([
Phobos
normalPhobosCount
]
==
1
,
@"array shouldn't be empty"
);
[
NSThread
sleepForTimeInterval
:
0
.
2
];
[
Phobos
track
:
MockEventId
attributes
:
attr
];
[
Phobos
track
:
MockEventId
attributes
:
attr
];
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
1
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
2
,
@"array shouldn't be empty"
);
}
}
/**
/**
...
@@ -178,35 +183,36 @@ NSString *const MockCityId = @"beijing";
...
@@ -178,35 +183,36 @@ NSString *const MockCityId = @"beijing";
* @since 1.1.4
* @since 1.1.4
*/
*/
-
(
void
)
testTrackEventWithSendNowAndNoSendNowOne
{
-
(
void
)
testTrackEventWithSendNowAndNoSendNowOne
{
[
Phobos
removeAllNormalPhobosData
];
NSDictionary
*
attr
=
@{
@"attr"
:
@"track_attr"
};
NSDictionary
*
attr
=
@{
@"attr"
:
@"track_attr"
};
NSDictionary
*
sendNowAttr
=
@{
@"attr"
:
@"track_attr_send_now"
};
NSDictionary
*
sendNowAttr
=
@{
@"attr"
:
@"track_attr_send_now"
};
for
(
int
i
=
0
;
i
<
30
;
i
++
)
{
for
(
int
i
=
0
;
i
<
30
;
i
++
)
{
[
Phobos
track
:
MockEventId
attributes
:
attr
];
[
Phobos
track
:
MockEventId
attributes
:
attr
];
}
}
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
30
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
30
,
@"array shouldn't be empty"
);
// PhobosCacheKey超过50条数据会自动上报,模拟此情况
// PhobosCacheKey超过50条数据会自动上报,模拟此情况
[
Phobos
track
:
MockEventId
attributes
:
sendNowAttr
sendNow
:
YES
];
[
Phobos
track
:
MockEventId
attributes
:
sendNowAttr
sendNow
:
YES
];
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
30
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
30
,
@"array shouldn't be empty"
);
[
Phobos
track
:
MockEventId
attributes
:
sendNowAttr
sendNow
:
YES
];
[
Phobos
track
:
MockEventId
attributes
:
sendNowAttr
sendNow
:
YES
];
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
30
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
30
,
@"array shouldn't be empty"
);
[
Phobos
track
:
MockEventId
attributes
:
sendNowAttr
sendNow
:
YES
];
[
Phobos
track
:
MockEventId
attributes
:
sendNowAttr
sendNow
:
YES
];
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
30
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
30
,
@"array shouldn't be empty"
);
[
Phobos
track
:
MockEventId
attributes
:
attr
];
[
Phobos
track
:
MockEventId
attributes
:
attr
];
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
31
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
31
,
@"array shouldn't be empty"
);
}
}
/**
/**
...
@@ -215,33 +221,34 @@ NSString *const MockCityId = @"beijing";
...
@@ -215,33 +221,34 @@ NSString *const MockCityId = @"beijing";
* @since 1.1.4
* @since 1.1.4
*/
*/
-
(
void
)
testTrackEventWithSendNowAndNoSendNowTwo
{
-
(
void
)
testTrackEventWithSendNowAndNoSendNowTwo
{
[
Phobos
removeAllNormalPhobosData
];
NSDictionary
*
attr
=
@{
@"attr"
:
@"track_attr"
};
NSDictionary
*
attr
=
@{
@"attr"
:
@"track_attr"
};
NSDictionary
*
sendNowAttr
=
@{
@"attr"
:
@"track_attr_send_now"
};
NSDictionary
*
sendNowAttr
=
@{
@"attr"
:
@"track_attr_send_now"
};
[
Phobos
track
:
MockEventId
attributes
:
sendNowAttr
sendNow
:
YES
];
[
Phobos
track
:
MockEventId
attributes
:
sendNowAttr
sendNow
:
YES
];
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
0
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
0
,
@"array shouldn't be empty"
);
[
Phobos
track
:
MockEventId
attributes
:
attr
];
[
Phobos
track
:
MockEventId
attributes
:
attr
];
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
1
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
1
,
@"array shouldn't be empty"
);
[
Phobos
track
:
MockEventId
attributes
:
attr
];
[
Phobos
track
:
MockEventId
attributes
:
attr
];
[
Phobos
track
:
MockEventId
attributes
:
sendNowAttr
sendNow
:
YES
];
[
Phobos
track
:
MockEventId
attributes
:
sendNowAttr
sendNow
:
YES
];
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
2
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
2
,
@"array shouldn't be empty"
);
[
Phobos
track
:
MockEventId
attributes
:
sendNowAttr
sendNow
:
YES
];
[
Phobos
track
:
MockEventId
attributes
:
sendNowAttr
sendNow
:
YES
];
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
2
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
2
,
@"array shouldn't be empty"
);
[
Phobos
track
:
MockEventId
attributes
:
attr
];
[
Phobos
track
:
MockEventId
attributes
:
attr
];
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
3
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
3
,
@"array shouldn't be empty"
);
}
}
/**
/**
...
@@ -250,23 +257,24 @@ NSString *const MockCityId = @"beijing";
...
@@ -250,23 +257,24 @@ NSString *const MockCityId = @"beijing";
* @since 1.1.4
* @since 1.1.4
*/
*/
-
(
void
)
testTrackEventWithSendNowAndNoSendNowThree
{
-
(
void
)
testTrackEventWithSendNowAndNoSendNowThree
{
[
Phobos
removeAllNormalPhobosData
];
NSDictionary
*
attr
=
@{
@"attr"
:
@"track_attr"
};
NSDictionary
*
attr
=
@{
@"attr"
:
@"track_attr"
};
//
//
[
Phobos
track
:
MockEventId
attributes
:
attr
];
[
Phobos
track
:
MockEventId
attributes
:
attr
];
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
1
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
1
,
@"array shouldn't be empty"
);
// PhobosCacheKey超过50条数据会自动上报,模拟此情况
// PhobosCacheKey超过50条数据会自动上报,模拟此情况
for
(
int
i
=
0
;
i
<
50
;
i
++
)
{
for
(
int
i
=
0
;
i
<
50
;
i
++
)
{
[
Phobos
track
:
MockEventId
attributes
:
attr
];
[
Phobos
track
:
MockEventId
attributes
:
attr
];
}
}
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
0
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
1
,
@"array shouldn't be empty"
);
[
Phobos
track
:
MockEventId
attributes
:
attr
];
[
Phobos
track
:
MockEventId
attributes
:
attr
];
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
1
,
@"array shouldn't be empty"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
2
,
@"array shouldn't be empty"
);
}
}
-
(
void
)
verfiyDict
:
(
NSDictionary
*
)
dict
{
-
(
void
)
verfiyDict
:
(
NSDictionary
*
)
dict
{
...
@@ -281,7 +289,7 @@ NSString *const MockCityId = @"beijing";
...
@@ -281,7 +289,7 @@ NSString *const MockCityId = @"beijing";
}
}
-
(
void
)
testCatchNullInAttributes
{
-
(
void
)
testCatchNullInAttributes
{
_c
lient
.
captureNullExpection
=
^
(
NSString
*
eventId
,
NSDictionary
*
att
)
{
Phobos
.
sharedC
lient
.
captureNullExpection
=
^
(
NSString
*
eventId
,
NSDictionary
*
att
)
{
NSCAssert
([
att
[
@"bussness_id"
]
integerValue
]
==
1244
,
@"testCatchNullInAttributes 没有捕获到有用信息"
);
NSCAssert
([
att
[
@"bussness_id"
]
integerValue
]
==
1244
,
@"testCatchNullInAttributes 没有捕获到有用信息"
);
};
};
NSDictionary
*
attributes
=
@{
@"key"
:
[
NSNull
null
],
NSDictionary
*
attributes
=
@{
@"key"
:
[
NSNull
null
],
...
@@ -309,7 +317,8 @@ NSString *const MockCityId = @"beijing";
...
@@ -309,7 +317,8 @@ NSString *const MockCityId = @"beijing";
[
controller
viewWillAppear
:
true
];
[
controller
viewWillAppear
:
true
];
[
controller
viewWillDisappear
:
true
];
[
controller
viewWillDisappear
:
true
];
[
self
paramUnNilCheck
];
[
self
paramUnNilCheck
];
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
NSArray
*
array
=
[
Phobos
normalPhobosDataForServerAPI
];
XCTAssertTrue
(
array
.
count
!=
0
,
@"PhobosCacheKey 下面应该有数据"
);
XCTAssertTrue
(
array
.
count
!=
0
,
@"PhobosCacheKey 下面应该有数据"
);
NSDictionary
*
dic
=
array
[
0
][
@"params"
];
NSDictionary
*
dic
=
array
[
0
][
@"params"
];
...
@@ -318,12 +327,14 @@ NSString *const MockCityId = @"beijing";
...
@@ -318,12 +327,14 @@ NSString *const MockCityId = @"beijing";
}
}
-
(
void
)
testSimulativePageViewEvent
{
-
(
void
)
testSimulativePageViewEvent
{
[
_client
simulativePV
:
nil
businessId
:
nil
referer
:
nil
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
[
Phobos
.
sharedClient
simulativePV
:
nil
businessId
:
nil
referer
:
nil
];
[
self
paramUnNilCheck
];
[
self
paramUnNilCheck
];
}
}
-
(
void
)
paramUnNilCheck
{
-
(
void
)
paramUnNilCheck
{
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
NSArray
*
array
=
[
Phobos
normalPhobosDataForServerAPI
];
XCTAssertTrue
(
array
.
count
!=
0
,
@"PhobosCacheKey 下面应该有数据"
);
XCTAssertTrue
(
array
.
count
!=
0
,
@"PhobosCacheKey 下面应该有数据"
);
NSDictionary
*
dic
=
array
[
0
][
@"params"
];
NSDictionary
*
dic
=
array
[
0
][
@"params"
];
...
@@ -341,8 +352,9 @@ NSString *const MockCityId = @"beijing";
...
@@ -341,8 +352,9 @@ NSString *const MockCityId = @"beijing";
XCTAssertFalse
(
controller
.
needLogPV
,
@"needLogPV赋值为NO时应该NO"
);
XCTAssertFalse
(
controller
.
needLogPV
,
@"needLogPV赋值为NO时应该NO"
);
}
}
// 该单元测试暂时不用,因为过滤代码暂时不用,所以不需要跑通
-
(
void
)
testCheckPVPhobos
{
-
(
void
)
testCheckPVPhobos
{
[
GMCache
removeObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
Phobos
removeAllNormalPhobosData
];
NSString
*
inDate
=
[
PhobosUtil
currentTime
];
NSString
*
inDate
=
[
PhobosUtil
currentTime
];
[
NSThread
sleepForTimeInterval
:
1
];
//模拟浏览页面,让out和in时间相差1s
[
NSThread
sleepForTimeInterval
:
1
];
//模拟浏览页面,让out和in时间相差1s
...
@@ -358,12 +370,12 @@ NSString *const MockCityId = @"beijing";
...
@@ -358,12 +370,12 @@ NSString *const MockCityId = @"beijing";
[
dict
setObject
:
@""
forKey
:
@"referrer_tab_name"
];
[
dict
setObject
:
@""
forKey
:
@"referrer_tab_name"
];
[
dict
setObject
:
@
(
0
)
forKey
:
@"is_push"
];
[
dict
setObject
:
@
(
0
)
forKey
:
@"is_push"
];
[
Phobos
track
:
@"page_view"
attributes
:
dict
];
[
Phobos
track
:
@"page_view"
attributes
:
dict
];
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
NSArray
*
array
=
[
Phobos
normalPhobosDataForServerAPI
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
1
,
@"PhobosCacheKey 下面应该有数据"
);
XCTAssertTrue
(
array
.
count
==
1
,
@"PhobosCacheKey 下面应该有数据"
);
[
Phobos
track
:
@"page_view"
attributes
:
dict
];
[
Phobos
track
:
@"page_view"
attributes
:
dict
];
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
XCTAssertTrue
([
Phobos
normalPhobosCount
]
==
1
,
@"PhobosCacheKey 上条数据不应该发送"
);
XCTAssertTrue
(
array
.
count
==
1
,
@"PhobosCacheKey 上条数据不应该发送"
);
[
NSThread
sleepForTimeInterval
:
2
];
//模拟浏览页面,让第二次浏览和上一次时间相差2s
[
NSThread
sleepForTimeInterval
:
2
];
//模拟浏览页面,让第二次浏览和上一次时间相差2s
...
@@ -371,14 +383,14 @@ NSString *const MockCityId = @"beijing";
...
@@ -371,14 +383,14 @@ NSString *const MockCityId = @"beijing";
[
NSThread
sleepForTimeInterval
:
1
];
//模拟浏览页面,让out和in时间相差1s
[
NSThread
sleepForTimeInterval
:
1
];
//模拟浏览页面,让out和in时间相差1s
[
dict
setObject
:[
PhobosUtil
currentTime
]
forKey
:
@"out"
];
[
dict
setObject
:[
PhobosUtil
currentTime
]
forKey
:
@"out"
];
[
Phobos
track
:
@"page_view"
attributes
:
dict
];
[
Phobos
track
:
@"page_view"
attributes
:
dict
];
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
2
,
@"PhobosCacheKey 上条数据应该发送"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
2
,
@"PhobosCacheKey 上条数据应该发送"
);
[
Phobos
track
:
@"page_view"
attributes
:
dict
];
[
Phobos
track
:
@"page_view"
attributes
:
dict
];
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
2
,
@"PhobosCacheKey 上条数据不应该发送"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
2
,
@"PhobosCacheKey 上条数据不应该发送"
);
[
Phobos
track
:
@"test"
attributes
:
dict
];
[
Phobos
track
:
@"test"
attributes
:
dict
];
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
[
NSThread
sleepForTimeInterval
:
0
.
2
];
XCTAssertTrue
(
array
.
count
==
3
,
@"PhobosCacheKey 上条数据应该发送"
);
XCTAssertTrue
(
[
Phobos
normalPhobosCount
]
==
3
,
@"PhobosCacheKey 上条数据应该发送"
);
}
}
...
...
GMPhobos.podspec
View file @
7b79a83e
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,7 @@
Pod
::
Spec
.
new
do
|
s
|
Pod
::
Spec
.
new
do
|
s
|
s
.
name
=
"
GMPhobos
"
s
.
name
=
"
GMPhobos
"
s
.
version
=
"1.3.
0
"
s
.
version
=
"1.3.
1
"
s
.
summary
=
"GM statistic data sdk"
s
.
summary
=
"GM statistic data sdk"
s
.
description
=
<<-
DESC
s
.
description
=
<<-
DESC
...
...
GMPhobos/Classes/Phobos.h
View file @
7b79a83e
...
@@ -33,13 +33,14 @@ typedef NS_ENUM (NSInteger, PhobosSigningType) {
...
@@ -33,13 +33,14 @@ typedef NS_ENUM (NSInteger, PhobosSigningType) {
*/
*/
+
(
Phobos
*
)
clientWithAppName
:(
NSString
*
)
appName
channelId
:(
NSString
*
)
channelId
;
+
(
Phobos
*
)
clientWithAppName
:(
NSString
*
)
appName
channelId
:(
NSString
*
)
channelId
;
+
(
instancetype
)
sharedClient
;
+
(
instancetype
)
alloc
__attribute__
((
deprecated
));
-
(
instancetype
)
init
__attribute__
((
deprecated
));
+
(
void
)
setSharedClient
:(
Phobos
*
)
client
;
+
(
instancetype
)
new
__attribute__
((
deprecated
));
#pragma mark - SDK配置
#pragma mark - SDK配置
@property
(
class
,
readonly
,
strong
)
Phobos
*
sharedClient
;
// Phobos在处理业务端传递来的参数时会检查是否某个value为空,如果为空会调用这个block以通知业务层,业务层可以上报这个异常,以助解决问题
// Phobos在处理业务端传递来的参数时会检查是否某个value为空,如果为空会调用这个block以通知业务层,业务层可以上报这个异常,以助解决问题
@property
(
nonatomic
,
copy
)
void
(
^
captureNullExpection
)
(
NSString
*
eventId
,
NSDictionary
*
info
);
@property
(
nonatomic
,
copy
)
void
(
^
captureNullExpection
)
(
NSString
*
eventId
,
NSDictionary
*
info
);
...
@@ -133,12 +134,12 @@ typedef NS_ENUM (NSInteger, PhobosSigningType) {
...
@@ -133,12 +134,12 @@ typedef NS_ENUM (NSInteger, PhobosSigningType) {
*
*
* @since 0.0.1
* @since 0.0.1
*/
*/
+
(
void
)
track
:(
NSString
*
)
event
Id
attributes
:(
NSDictionary
*
)
attributes
;
+
(
void
)
track
:(
NSString
*
)
event
Name
attributes
:(
NSDictionary
*
)
attributes
;
+
(
void
)
track
:(
NSString
*
)
event
Id
attributes
:(
NSDictionary
*
)
attributes
sendNow
:(
BOOL
)
sendNow
;
+
(
void
)
track
:(
NSString
*
)
event
Name
attributes
:(
NSDictionary
*
)
attributes
sendNow
:(
BOOL
)
sendNow
;
+
(
void
)
track
:(
NSString
*
)
event
Id
;
+
(
void
)
track
:(
NSString
*
)
event
Name
;
/**
/**
* @brief 自定义事件,数量统计 7730 精准曝光.
* @brief 自定义事件,数量统计 7730 精准曝光
/数据链路
.
*
*
* @param eventId 事件Id
* @param eventId 事件Id
* @attributes 参数
* @attributes 参数
...
@@ -146,9 +147,9 @@ typedef NS_ENUM (NSInteger, PhobosSigningType) {
...
@@ -146,9 +147,9 @@ typedef NS_ENUM (NSInteger, PhobosSigningType) {
* @currentAPI 当前传过来的API
* @currentAPI 当前传过来的API
* @
* @
*/
*/
+
(
void
)
track
:(
NSString
*
)
event
Id
attributes
:(
NSDictionary
*
)
attributes
currentAPI
:(
NSString
*
)
currentAPI
;
+
(
void
)
track
:(
NSString
*
)
event
Name
attributes
:(
NSDictionary
*
)
attributes
currentAPI
:(
NSString
*
)
currentAPI
;
+
(
void
)
track
:(
NSString
*
)
event
Id
attributes
:(
NSDictionary
*
)
attributes
sendNow
:(
BOOL
)
sendNow
currentAPI
:(
NSString
*
)
currentAPI
;
+
(
void
)
track
:(
NSString
*
)
event
Name
attributes
:(
NSDictionary
*
)
attributes
sendNow
:(
BOOL
)
sendNow
currentAPI
:(
NSString
*
)
currentAPI
;
+
(
void
)
track
:(
NSString
*
)
event
Id
currentAPI
:(
NSString
*
)
currentAPI
;
+
(
void
)
track
:(
NSString
*
)
event
Name
currentAPI
:(
NSString
*
)
currentAPI
;
/**
/**
* @author 翟国钧, 16-02-03 16:02:30
* @author 翟国钧, 16-02-03 16:02:30
...
@@ -183,5 +184,48 @@ typedef NS_ENUM (NSInteger, PhobosSigningType) {
...
@@ -183,5 +184,48 @@ typedef NS_ENUM (NSInteger, PhobosSigningType) {
*/
*/
-
(
void
)
simulativePV
:(
NSString
*
)
pageName
businessId
:(
NSString
*
)
bid
referer
:(
NSString
*
)
referer
;
-
(
void
)
simulativePV
:(
NSString
*
)
pageName
businessId
:(
NSString
*
)
bid
referer
:(
NSString
*
)
referer
;
@end
@interface
Phobos
(
UtilTest
)
/** 获取所有非立即发送埋点数量 */
+
(
NSInteger
)
normalPhobosCount
;
/** 获取所有非立即发送埋点数据 */
+
(
NSDictionary
*
)
normalPhobosData
;
/** 获取url的非立即发送埋点数量 */
+
(
NSInteger
)
normalPhobosCountForURL
:(
NSString
*
)
url
;
/** 获取serverAPI的非立即发送埋点数据 */
+
(
NSArray
*
)
normalPhobosDataForServerAPI
;
/** 获取url的非立即发送埋点数据 */
+
(
NSArray
*
)
normalPhobosDataForURL
:(
NSString
*
)
url
;
/** 获取所有立即发送埋点数据 */
+
(
NSDictionary
*
)
immediatelyPhobosData
;
/** 获取serverAPI的立即发送埋点数据 */
+
(
NSArray
*
)
immediatelyPhobosForServerAPI
;
/** 获取url的立即发送埋点数据 */
+
(
NSArray
*
)
immediatelyPhobosDataForURL
:(
NSString
*
)
url
;
/** 获取url的立即发送埋点数量 */
+
(
NSUInteger
)
immediatelyPhobosCountForURL
:(
NSString
*
)
url
;
/** 清除非立即发送埋点数据缓存 */
+
(
void
)
removeAllNormalPhobosData
;
/** 清除立即发送埋点数据缓存 */
+
(
void
)
removeAllImmediatelyPhobosData
;
/** 获取将要发送的数据 */
@property
(
nonatomic
,
copy
)
void
(
^
phobosSendDataBlock
)(
NSArray
*
datas
);
@end
@end
NS_ASSUME_NONNULL_END
NS_ASSUME_NONNULL_END
GMPhobos/Classes/Phobos.m
View file @
7b79a83e
...
@@ -15,8 +15,9 @@
...
@@ -15,8 +15,9 @@
#import "PhobosCustomVisibleController.h"
#import "PhobosCustomVisibleController.h"
#import "UIDevice+Resolutions.h"
#import "UIDevice+Resolutions.h"
#import <GMCache/GMCache.h>
#import <GMCache/GMCache.h>
static
Phobos
*
sharedClient
=
nil
;
#import <objc/runtime.h>
static
NSString
*
sdkVersion
=
@"110"
;
static
Phobos
*
_sharedClient
;
static
NSString
*
sdkVersion
=
@"1.3.1"
;
@interface
Phobos
()
@interface
Phobos
()
@property
(
strong
,
nonatomic
)
UIViewController
*
visibleController
;
@property
(
strong
,
nonatomic
)
UIViewController
*
visibleController
;
...
@@ -28,48 +29,84 @@ static NSString *sdkVersion = @"110";
...
@@ -28,48 +29,84 @@ static NSString *sdkVersion = @"110";
/* 每一条埋点数据的物理ID,自增,生命周期和sessionId相同。特别注意:在sessionOver的时候,要把他置为0 */
/* 每一条埋点数据的物理ID,自增,生命周期和sessionId相同。特别注意:在sessionOver的时候,要把他置为0 */
@property
(
assign
,
nonatomic
)
NSInteger
serialId
;
@property
(
assign
,
nonatomic
)
NSInteger
serialId
;
// 用来记录除serverAPI以外的API
//@property (nonatomic, weak) dispatch_semaphore_t immediatelySemaphore;// 保障需要立即发送的埋点数据安全
@property
(
strong
,
nonatomic
)
NSMutableArray
*
APIArray
;
//@property (nonatomic, weak) dispatch_semaphore_t normalSemaphore;// 保障普通埋点数据安全
@property
(
nonatomic
,
assign
)
NSInteger
normalCount
;
// 记录普通埋点数量
@end
@end
@implementation
Phobos
@implementation
Phobos
static
dispatch_semaphore_t
_immediatelySemaphore
;
static
dispatch_semaphore_t
_normalSemaphore
;
static
dispatch_queue_t
_immediatelyQueue
;
static
dispatch_queue_t
_normalQueue
;
+
(
Phobos
*
)
clientWithAppName
:(
NSString
*
)
appName
channelId
:(
NSString
*
)
channelId
{
+
(
Phobos
*
)
clientWithAppName
:(
NSString
*
)
appName
channelId
:(
NSString
*
)
channelId
{
return
[[
self
alloc
]
initWithAppName
:
appName
channelId
:
channelId
];
Phobos
.
sharedClient
.
appName
=
appName
;
Phobos
.
sharedClient
.
channelId
=
channelId
;
return
Phobos
.
sharedClient
;
}
+
(
void
)
initialize
{
static
dispatch_once_t
onceToken
;
dispatch_once
(
&
onceToken
,
^
{
_immediatelySemaphore
=
dispatch_semaphore_create
(
1
);
_normalSemaphore
=
dispatch_semaphore_create
(
1
);
_immediatelyQueue
=
dispatch_queue_create
(
"immdiately"
,
DISPATCH_QUEUE_CONCURRENT
);
_normalQueue
=
dispatch_queue_create
(
"normal"
,
DISPATCH_QUEUE_CONCURRENT
);
});
}
}
+
(
Phobos
*
)
sharedClient
{
-
(
instancetype
)
init
{
return
sharedClient
;
if
(
self
=
[
super
init
])
{
}
self
.
appName
=
@""
;
self
.
channelId
=
@""
;
self
.
logEnabled
=
NO
;
self
.
userId
=
@""
;
self
.
netStatus
=
@""
;
self
.
currentCityId
=
@""
;
self
.
serverAPI
=
@""
;
self
.
greyType
=
@""
;
self
.
userType
=
[[
NSMutableDictionary
alloc
]
initWithCapacity
:
0
];
self
.
appVersion
=
[
PhobosUtil
getAppVersion
];
self
.
signingType
=
PhobosSigningTypeUndefined
;
// self.immediatelySemaphore = dispatch_semaphore_create(1);
// self.normalSemaphore = dispatch_semaphore_create(1);
+
(
void
)
setSharedClient
:
(
Phobos
*
)
client
{
NSMutableDictionary
*
dataDict
=
[[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosNormalCacheKey
]
mutableCopy
];
sharedClient
=
client
;
for
(
NSArray
*
data
in
dataDict
.
allValues
)
{
}
self
.
normalCount
+=
data
.
count
;
}
-
(
instancetype
)
initWithAppName
:
(
NSString
*
)
appName
channelId
:
(
NSString
*
)
channelId
{
self
=
[
super
init
];
if
(
self
)
{
_appName
=
appName
;
_channelId
=
channelId
;
_logEnabled
=
NO
;
_userId
=
@""
;
_netStatus
=
@""
;
_currentCityId
=
@""
;
_serverAPI
=
@""
;
_greyType
=
@""
;
_userType
=
[[
NSMutableDictionary
alloc
]
initWithCapacity
:
0
];
_appVersion
=
[
PhobosUtil
getAppVersion
];
_APIArray
=
[
NSMutableArray
array
];
_signingType
=
PhobosSigningTypeUndefined
;
[
self
setupNotification
];
[
self
setupNotification
];
[
self
handleSessionStart
];
[
self
handleSessionStart
];
[
self
synchronizePhobosKey
];
[
self
synchronizePhobosKey
];
phobosLog
(
@"starts to orbit"
);
}
}
return
self
;
return
self
;
}
}
+
(
id
)
allocWithZone
:
(
struct
_NSZone
*
)
zone
{
return
Phobos
.
sharedClient
;
}
-
(
id
)
copyWithZone
:
(
struct
_NSZone
*
)
zone
{
return
Phobos
.
sharedClient
;
}
+
(
Phobos
*
)
sharedClient
{
// 使用单例设计模式,保证Phobos只有一个实例,并提供了全局访问点
static
dispatch_once_t
onceToken
;
dispatch_once
(
&
onceToken
,
^
{
_sharedClient
=
[[
super
allocWithZone
:
NULL
]
init
];
});
return
_sharedClient
;
}
-
(
void
)
setAppName
:
(
NSString
*
)
appName
channelId
:
(
NSString
*
)
channelId
{
self
.
appName
=
appName
;
self
.
channelId
=
channelId
;
}
/**
/**
* disk下的PhobosHaveOpenApp只要存在,就把他取出来放到document下(注:当不支持7.6.16版本的时候,干掉这个方法)
* disk下的PhobosHaveOpenApp只要存在,就把他取出来放到document下(注:当不支持7.6.16版本的时候,干掉这个方法)
*/
*/
...
@@ -188,7 +225,7 @@ static NSString *sdkVersion = @"110";
...
@@ -188,7 +225,7 @@ static NSString *sdkVersion = @"110";
phobosLog
(
@"handleAppInForeground"
);
phobosLog
(
@"handleAppInForeground"
);
[
self
handleSessionStart
];
[
self
handleSessionStart
];
[
self
handleEventDeviceOpened
];
[
self
handleEventDeviceOpened
];
[
self
fetchDataAndSend
];
[
self
sendImmediatelyNormalData
];
[
self
handlePVEventAppInForeground
];
[
self
handlePVEventAppInForeground
];
}
}
...
@@ -201,7 +238,7 @@ static NSString *sdkVersion = @"110";
...
@@ -201,7 +238,7 @@ static NSString *sdkVersion = @"110";
phobosLog
(
@"handleAppInBackgound"
);
phobosLog
(
@"handleAppInBackgound"
);
[
self
handlePVEventAppInBackgound
];
[
self
handlePVEventAppInBackgound
];
[
self
handleSessionOver
];
[
self
handleSessionOver
];
[
self
fetchDataAndSend
];
[
self
sendImmediatelyNormalData
];
}
}
/**
/**
...
@@ -256,95 +293,6 @@ static NSString *sdkVersion = @"110";
...
@@ -256,95 +293,6 @@ static NSString *sdkVersion = @"110";
}
}
}
}
#pragma mark - track event handler
+
(
void
)
track
:
(
NSString
*
)
eventId
{
[
Phobos
track
:
eventId
attributes
:@{}];
}
+
(
void
)
track
:
(
NSString
*
)
eventId
attributes
:
(
NSDictionary
*
)
attributes
{
[
self
track
:
eventId
attributes
:
attributes
sendNow
:
NO
];
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
//超过一定数量的话,统一发送一次
if
(
array
.
count
>
PhobosShardCount
)
{
[
sharedClient
sendArray
:
array
cleanCacheRightNow
:
YES
];
}
}
+
(
void
)
track
:
(
NSString
*
)
eventId
attributes
:
(
NSDictionary
*
)
attributes
sendNow
:
(
BOOL
)
sendNow
{
NSDictionary
*
dict
=
[
sharedClient
prepareDictionaryForEvent
:
eventId
attributes
:
attributes
];
@try
{
NSData
*
JSON
=
[
PhobosUtil
encodeJSON
:
dict
];
if
(
sendNow
)
{
NSArray
*
array
=
@[
dict
];
// 实时发送的埋点,不能立即清楚缓存
[
sharedClient
sendArray
:
array
cleanCacheRightNow
:
NO
];
}
else
{
[
sharedClient
save
:
dict
];
}
}
@catch
(
NSException
*
exception
)
{
NSAssert
(
NO
,
@"哎呀呀,VALUE不能为NSObject "
);
}
}
+
(
void
)
track
:
(
NSString
*
)
eventId
attributes
:
(
NSDictionary
*
)
attributes
currentAPI
:
(
NSString
*
)
currentAPI
{
[
self
track
:
eventId
attributes
:
attributes
sendNow
:
NO
currentAPI
:
currentAPI
];
NSArray
*
array
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:[
PhobosUtil
MD5String
:
currentAPI
]];
//超过一定数量的话,统一发送一次
if
(
array
.
count
>
PhobosShardCount
)
{
[
sharedClient
sendArray
:
array
currentAPI
:
currentAPI
cleanCacheRightNow
:
YES
];
}
}
+
(
void
)
track
:
(
NSString
*
)
eventId
attributes
:
(
NSDictionary
*
)
attributes
sendNow
:
(
BOOL
)
sendNow
currentAPI
:
(
NSString
*
)
currentAPI
{
[
sharedClient
addNewApi
:
currentAPI
];
// 记录新的API
NSDictionary
*
dict
=
[
sharedClient
prepareDictionaryForEvent
:
eventId
attributes
:
attributes
];
@try
{
NSData
*
JSON
=
[
PhobosUtil
encodeJSON
:
dict
];
if
(
sendNow
)
{
NSArray
*
array
=
@[
dict
];
// 实时发送的埋点,不能立即清楚缓存
[
sharedClient
sendArray
:
array
currentAPI
:
currentAPI
cleanCacheRightNow
:
NO
];
}
else
{
[
sharedClient
save
:
dict
currentAPI
:
currentAPI
];
}
}
@catch
(
NSException
*
exception
)
{
NSAssert
(
NO
,
@"哎呀呀,VALUE不能为NSObject "
);
}
}
+
(
void
)
track
:
(
NSString
*
)
eventId
currentAPI
:
(
NSString
*
)
currentAPI
{
[
Phobos
track
:
eventId
attributes
:@{}
currentAPI
:
currentAPI
];
}
+
(
void
)
trackJsEvent
:
(
NSString
*
)
jsonString
{
@try
{
NSData
*
data
=
[
jsonString
dataUsingEncoding
:
NSUnicodeStringEncoding
];
NSMutableDictionary
*
dict
=
[
NSJSONSerialization
JSONObjectWithData
:
data
options
:
NSJSONReadingAllowFragments
error
:
nil
];
id
pa
=
dict
[
@"params"
];
NSDictionary
*
json
;
if
([
pa
isKindOfClass
:[
NSString
class
]])
{
NSError
*
jsonError
;
NSData
*
objectData
=
[
pa
dataUsingEncoding
:
NSUTF8StringEncoding
];
json
=
[
NSJSONSerialization
JSONObjectWithData
:
objectData
options
:
NSJSONReadingMutableContainers
error
:&
jsonError
];
[
Phobos
track
:
dict
[
@"type"
]
attributes
:
json
];
}
else
{
[
Phobos
track
:
dict
[
@"type"
]];
}
}
@catch
(
NSException
*
exception
)
{
phobosLog
(
exception
);
}
}
#pragma mark - PV
#pragma mark - PV
-
(
void
)
onPVStart
:
(
UIResponder
<
PhobosPVProtocol
>
*
)
page
{
-
(
void
)
onPVStart
:
(
UIResponder
<
PhobosPVProtocol
>
*
)
page
{
// 必须在此处调用一下referer,因为onControllerStart
// 必须在此处调用一下referer,因为onControllerStart
...
@@ -399,45 +347,44 @@ static NSString *sdkVersion = @"110";
...
@@ -399,45 +347,44 @@ static NSString *sdkVersion = @"110";
}
}
}
}
#pragma mark - 事件存储、发送
/**
/**
* @brief 将埋点时间封装成词典数据
* @brief 将埋点时间封装成词典数据
*
*
* @since 0.0.1
* @since 0.0.1
*/
*/
-
(
NSDictionary
*
)
prepareDictionaryForEvent
:
(
NSString
*
)
event
Id
attributes
:
(
NSDictionary
*
)
attributes
{
-
(
NSDictionary
*
)
prepareDictionaryForEvent
:
(
NSString
*
)
event
Name
attributes
:
(
NSDictionary
*
)
attributes
{
[
self
catchNullForEvent
:
event
Id
attributes
:
attributes
];
[
self
catchNullForEvent
:
event
Name
attributes
:
attributes
];
NSMutableDictionary
*
dict
=
[[
NSMutableDictionary
alloc
]
init
];
NSMutableDictionary
*
dict
=
[[
NSMutableDictionary
alloc
]
init
];
@try
{
@try
{
NSString
*
currentTime
=
[
PhobosUtil
currentTime
];
NSString
*
currentTime
=
[
PhobosUtil
currentTime
];
NSMutableDictionary
*
deviceParams
=
[
NSMutableDictionary
dictionaryWithObjectsAndKeys
:
[[[
ASIdentifierManager
sharedManager
]
advertisingIdentifier
]
UUIDString
],
@"idfa"
,
NSMutableDictionary
*
deviceParams
=
[
NSMutableDictionary
new
];
[[[
UIDevice
currentDevice
]
identifierForVendor
]
UUIDString
],
@"idfv"
,
[
deviceParams
setValue
:[[[
ASIdentifierManager
sharedManager
]
advertisingIdentifier
]
UUIDString
]
forKey
:
@"idfa"
];
[
PhobosUtil
deviceId
],
@"device_id"
,
[
deviceParams
setValue
:[[[
UIDevice
currentDevice
]
identifierForVendor
]
UUIDString
]
forKey
:
@"idfv"
];
@"ios"
,
@"device_type"
,
[
deviceParams
setValue
:[
PhobosUtil
deviceId
]
forKey
:
@"device_id"
];
@"Apple"
,
@"manufacturer"
,
[
deviceParams
setValue
:
@"ios"
forKey
:
@"device_type"
];
@
(
self
.
gps
.
coordinate
.
latitude
),
@"lat"
,
[
deviceParams
setValue
:
@"Apple"
forKey
:
@"manufacturer"
];
@
(
self
.
gps
.
coordinate
.
longitude
),
@"lng"
,
[
deviceParams
setValue
:
@
(
self
.
gps
.
coordinate
.
latitude
)
forKey
:
@"lat"
];
_netStatus
,
@"is_WiFi"
,
[
deviceParams
setValue
:
@
(
self
.
gps
.
coordinate
.
longitude
)
forKey
:
@"lng"
];
[
PhobosUtil
getIPAddress
:
YES
],
@"ip"
,
nil
];
[
deviceParams
setValue
:
_netStatus
forKey
:
@"is_WiFi"
];
[
deviceParams
setValue
:[
PhobosUtil
getIPAddress
:
YES
]
forKey
:
@"ip"
];
[
deviceParams
setValue
:
_networkStatus
forKey
:
@"net_type"
];
[
deviceParams
setValue
:
_networkStatus
forKey
:
@"net_type"
];
[
deviceParams
setValue
:[
UIDevice
platform
]
forKey
:
@"model"
];
[
deviceParams
setValue
:[
UIDevice
platform
]
forKey
:
@"model"
];
[
deviceParams
setValue
:[
UIDevice
currentDevice
].
systemVersion
forKey
:
@"sys_version"
];
[
deviceParams
setValue
:[
UIDevice
currentDevice
].
systemVersion
forKey
:
@"sys_version"
];
NSMutableDictionary
*
appParams
=
[
NSMutableDictionary
dictionaryWithObjectsAndKeys
:
_greyType
,
@"grey_type"
,
NSMutableDictionary
*
appParams
=
[
NSMutableDictionary
new
];
self
.
appName
,
@"name"
,
[
appParams
setValue
:
_greyType
forKey
:
@"grey_type"
];
self
.
appVersion
,
@"version"
,
[
appParams
setValue
:
_appName
forKey
:
@"name"
];
self
.
channelId
,
@"channel"
,
[
appParams
setValue
:
_appVersion
forKey
:
@"version"
];
_userType
,
@"user_type"
,
[
appParams
setValue
:
_channelId
forKey
:
@"channel"
];
self
.
currentCityId
,
@"current_city_id"
,
[
appParams
setValue
:
_userType
forKey
:
@"net_type"
];
@
(
_serialId
++
),
@"serial_id"
,
nil
];
[
appParams
setValue
:
_currentCityId
forKey
:
@"current_city_id"
];
[
appParams
setValue
:
@
(
_serialId
++
)
forKey
:
@"serial_id"
];
if
(
_signingType
==
PhobosSigningTypeDebug
||
_signingType
==
PhobosSigningTypeRelease
)
{
if
(
_signingType
==
PhobosSigningTypeDebug
||
_signingType
==
PhobosSigningTypeRelease
)
{
[
dict
setObject
:
@
(
0
)
forKey
:
@"is_release"
];
[
dict
setObject
:
@
(
0
)
forKey
:
@"is_release"
];
}
}
[
dict
setObject
:
event
Id
forKey
:
@"type"
];
[
dict
setObject
:
event
Name
forKey
:
@"type"
];
[
dict
setObject
:
appParams
forKey
:
@"app"
];
[
dict
setObject
:
appParams
forKey
:
@"app"
];
[
dict
setObject
:
sdkVersion
forKey
:
@"version"
];
[
dict
setObject
:
sdkVersion
forKey
:
@"version"
];
[
dict
setObject
:
deviceParams
forKey
:
@"device"
];
[
dict
setObject
:
deviceParams
forKey
:
@"device"
];
...
@@ -452,33 +399,190 @@ static NSString *sdkVersion = @"110";
...
@@ -452,33 +399,190 @@ static NSString *sdkVersion = @"110";
return
dict
;
return
dict
;
}
}
#pragma mark - helpers
-
(
void
)
catchNullForEvent
:
(
NSString
*
)
eventName
attributes
:
(
NSDictionary
*
)
attributes
{
dispatch_async
(
dispatch_get_global_queue
(
0
,
0
),
^
{
@try
{
for
(
NSString
*
key
in
attributes
.
allKeys
)
{
if
([
attributes
[
key
]
isMemberOfClass
:[
NSNull
class
]])
{
if
(
self
.
captureNullExpection
)
{
self
.
captureNullExpection
(
eventName
,
attributes
);
}
break
;
}
}
}
@catch
(
NSException
*
exception
)
{
}
});
}
#pragma mark - track event handler
+
(
void
)
trackJsEvent
:
(
NSString
*
)
jsonString
{
@try
{
NSData
*
data
=
[
jsonString
dataUsingEncoding
:
NSUnicodeStringEncoding
];
NSMutableDictionary
*
dict
=
[
NSJSONSerialization
JSONObjectWithData
:
data
options
:
NSJSONReadingAllowFragments
error
:
nil
];
id
pa
=
dict
[
@"params"
];
NSDictionary
*
json
;
if
([
pa
isKindOfClass
:[
NSString
class
]])
{
NSError
*
jsonError
;
NSData
*
objectData
=
[
pa
dataUsingEncoding
:
NSUTF8StringEncoding
];
json
=
[
NSJSONSerialization
JSONObjectWithData
:
objectData
options
:
NSJSONReadingMutableContainers
error
:&
jsonError
];
[
Phobos
track
:
dict
[
@"type"
]
attributes
:
json
];
}
else
{
[
Phobos
track
:
dict
[
@"type"
]];
}
}
@catch
(
NSException
*
exception
)
{
phobosLog
(
exception
);
}
}
+
(
void
)
track
:
(
NSString
*
)
eventName
{
[
self
track
:
eventName
attributes
:@{}
sendNow
:
NO
currentAPI
:
_sharedClient
.
serverAPI
];
}
+
(
void
)
track
:
(
NSString
*
)
eventName
attributes
:
(
NSDictionary
*
)
attributes
{
[
self
track
:
eventName
attributes
:
attributes
sendNow
:
NO
currentAPI
:
_sharedClient
.
serverAPI
];
}
+
(
void
)
track
:
(
NSString
*
)
eventName
attributes
:
(
NSDictionary
*
)
attributes
sendNow
:
(
BOOL
)
sendNow
{
[
self
track
:
eventName
attributes
:
attributes
sendNow
:
sendNow
currentAPI
:
_sharedClient
.
serverAPI
];
}
+
(
void
)
track
:
(
NSString
*
)
eventName
currentAPI
:
(
NSString
*
)
currentAPI
{
[
self
track
:
eventName
attributes
:@{}
sendNow
:
NO
currentAPI
:
currentAPI
];
}
+
(
void
)
track
:
(
NSString
*
)
eventName
attributes
:
(
NSDictionary
*
)
attributes
currentAPI
:
(
NSString
*
)
currentAPI
{
[
self
track
:
eventName
attributes
:
attributes
sendNow
:
NO
currentAPI
:
currentAPI
];
}
+
(
void
)
track
:
(
NSString
*
)
eventName
attributes
:
(
NSDictionary
*
)
attributes
sendNow
:
(
BOOL
)
sendNow
currentAPI
:
(
NSString
*
)
currentAPI
{
NSDictionary
*
dataDict
=
[
_sharedClient
prepareDictionaryForEvent
:
eventName
attributes
:
attributes
];
@try
{
NSData
*
JSON
=
[
PhobosUtil
encodeJSON
:
dataDict
];
if
(
sendNow
)
{
[
_sharedClient
sendImmediatelyPhobosWithURL
:
currentAPI
data
:
dataDict
];
}
else
{
[
_sharedClient
trackPhobosWithURL
:
currentAPI
data
:
dataDict
];
}
}
@catch
(
NSException
*
exception
)
{
NSAssert
(
NO
,
@"哎呀呀,VALUE不能为NSObject "
);
}
}
#pragma mark - 事件存储、发送
/**
/**
* @brief 保存数据到缓存层
* 普通埋点
*
* @param url 接口url
* @param data 数据
* @param dataArray 埋点数据
*
* @param nowSend 是否需要发送当前缓存数据(app进入到后台、前台等情况)
* @since 0.0.1
*/
*/
-
(
void
)
save
:
(
NSDictionary
*
)
data
-
(
void
)
sendImmediatelyNormalData
{
{
[
self
trackPhobosWithURL
:
nil
data
:
nil
immediate
:
YES
];
if
(
_logEnabled
)
{
}
phobosLog
([
NSString
stringWithFormat
:
@"save dictionary: %@"
,
data
]);
-
(
void
)
trackPhobosWithURL
:
(
NSString
*
)
url
data
:
(
NSDictionary
*
)
data
{
[
self
trackPhobosWithURL
:
url
data
:
data
immediate
:
NO
];
}
-
(
void
)
trackPhobosWithURL
:
(
NSString
*
)
url
data
:
(
NSDictionary
*
)
data
immediate
:
(
BOOL
)
immediate
{
dispatch_async
(
_normalQueue
,
^
{
dispatch_semaphore_wait
(
_normalSemaphore
,
DISPATCH_TIME_FOREVER
);
NSMutableDictionary
*
dataDict
=
[[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosNormalCacheKey
]
mutableCopy
];
_normalCount
++
;
if
(
!
immediate
)
{
dataDict
=
[
self
dataDict
:
dataDict
setObject
:
data
forKey
:
url
];
[
GMCache
storeObjectAtDocumentPathWithkey
:
PhobosNormalCacheKey
object
:
dataDict
];
}
if
(
immediate
||
self
.
normalCount
>=
50
)
{
// 数据超过一定数量 或 进入后台等逻辑,统一进行发送普通埋点数据
[
dataDict
enumerateKeysAndObjectsUsingBlock
:
^
(
NSString
*
_Nonnull
key
,
NSArray
*
_Nonnull
obj
,
BOOL
*
_Nonnull
stop
)
{
if
(
obj
&&
obj
.
count
>
0
)
{
[
self
sendImmediatelyPhobosWithURL
:
key
data
:
obj
];
}
}];
[
Phobos
removeAllNormalPhobosData
];
}
dispatch_semaphore_signal
(
_normalSemaphore
);
});
}
/**
* 即时发送埋点接口
* @param url : 接口url
* @param data : 使用id类型是因为直接调用实时埋点传过来的是Dict,而普通埋点过来的则是Array类型
*/
-
(
void
)
sendImmediatelyPhobosWithURL
:
(
NSString
*
)
url
data
:
(
id
)
data
{
dispatch_async
(
_immediatelyQueue
,
^
{
dispatch_semaphore_wait
(
_immediatelySemaphore
,
DISPATCH_TIME_FOREVER
);
__block
NSMutableDictionary
*
dataDict
=
[[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosImmediatelyCacheKey
]
mutableCopy
];
dataDict
=
[
self
dataDict
:
dataDict
setObject
:
data
forKey
:
url
];
NSInteger
allCount
=
dataDict
.
allKeys
.
count
;
// 请求个数
__block
finishCount
=
0
;
// 请求完成次数,不是请求成功次数,能在最后保证未发送成功的数据,能一次保存下来,等待下次发送
dispatch_semaphore_t
semaphore
=
dispatch_semaphore_create
(
1
);
// 因为网络请求是异步回调,需要保证数据安全
[
dataDict
enumerateKeysAndObjectsUsingBlock
:
^
(
NSString
*
_Nonnull
key
,
NSArray
*
_Nonnull
obj
,
BOOL
*
_Nonnull
stop
)
{
[
self
sendDataWithAPI
:
key
data
:
obj
successBlock
:^
(
NSInteger
code
)
{
dispatch_semaphore_wait
(
semaphore
,
DISPATCH_TIME_FOREVER
);
finishCount
++
;
if
(
code
==
200
)
{
// 如果数据请求成功,删除当前数据的缓存
[
dataDict
removeObjectForKey
:
key
];
}
if
(
finishCount
==
allCount
)
{
// 所有数据都请求完成,重新进行数据缓存
[
GMCache
storeObjectAtDocumentPathWithkey
:
PhobosImmediatelyCacheKey
object
:
dataDict
];
dispatch_semaphore_signal
(
_immediatelySemaphore
);
}
dispatch_semaphore_signal
(
semaphore
);
phobosLog
(
@"✈ ---------- ✈ data arrived Mars"
);
}];
}];
});
}
/**
* 将数据存入到字典中
* @param dataDict 需要存入的字典
* @param object 需要存入的数据
* @param key 需要将数据存入到dataDict的key所在的数据中
*/
-
(
NSMutableDictionary
*
)
dataDict
:
(
NSMutableDictionary
*
)
dataDict
setObject
:
(
id
)
object
forKey
:
(
NSString
*
)
key
{
if
(
!
dataDict
)
{
dataDict
=
[
NSMutableDictionary
new
];
}
// 判断数据类型,统一转换成数组
NSMutableArray
*
dataArray
=
[
dataDict
.
allKeys
containsObject
:
key
]
?
[
dataDict
[
key
]
mutableCopy
]
:
[
NSMutableArray
new
];
NSArray
*
data
=
[
object
isKindOfClass
:[
NSArray
class
]]
?
object
:@[
object
];
//#ifndef POD_CONFIGURATION_APP_STORE
// [self verifyPVPhobos:dataArray data:object];
//#endif
[
dataArray
addObjectsFromArray
:
data
];
// 进行数据校验
@try
{
NSData
*
json
=
[
PhobosUtil
encodeJSON
:
dataArray
];
[
dataDict
setValue
:
dataArray
forKey
:
key
];
}
@catch
(
NSException
*
exception
)
{
NSAssert
(
NO
,
@"哎呀呀,VALUE只不能为NSObject "
);
}
}
return
dataDict
;
}
NSMutableArray
*
dataArray
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
// 校验PV埋点是否有问题,默认返回NO
if
(
dataArray
)
{
-
(
BOOL
)
verifyPVPhobos
:
(
NSArray
*
)
dataArray
data
:
(
id
)
data
{
#ifdef POD_CONFIGURATION_APP_STORE
if
([
data
isKindOfClass
:[
NSDictionary
class
]])
{
[
dataArray
addObject
:
data
];
NSDictionary
*
dataDict
=
(
NSDictionary
*
)
data
;
#else
if
(
dataDict
[
@"type"
]
&&
[
dataDict
[
@"type"
]
isEqualToString
:
@"page_view"
])
{
if
(
data
[
@"type"
]
&&
[
data
[
@"type"
]
isEqualToString
:
@"page_view"
])
{
NSDictionary
*
pageParams
=
dataDict
[
@"params"
];
NSDictionary
*
pageParams
=
data
[
@"params"
];
long
long
pageInTime
=
[
pageParams
[
@"in"
]
longLongValue
];
long
long
pageInTime
=
[
pageParams
[
@"in"
]
longLongValue
];
long
long
pageOutTime
=
[
pageParams
[
@"out"
]
longLongValue
];
long
long
pageOutTime
=
[
pageParams
[
@"out"
]
longLongValue
];
// phobosLog(@"pageInTime------%lld",pageInTime);
// phobosLog(@"pageOutTime------%lld",pageOutTime);
if
(
pageInTime
&&
pageOutTime
)
{
if
(
pageInTime
&&
pageOutTime
)
{
__block
BOOL
checkTimeError
;
BOOL
checkTimeError
=
NO
;
for
(
int
i
=
0
;
i
<
dataArray
.
count
;
i
++
)
{
for
(
int
i
=
0
;
i
<
dataArray
.
count
;
i
++
)
{
NSDictionary
*
obj
=
dataArray
[
i
];
NSDictionary
*
obj
=
dataArray
[
i
];
...
@@ -500,77 +604,29 @@ static NSString *sdkVersion = @"110";
...
@@ -500,77 +604,29 @@ static NSString *sdkVersion = @"110";
break
;
break
;
}
}
}
}
}
}
return
checkTimeError
;
}
}
}
}
// 不管成功还是失败 给开发提示方便DEBUG
// phobosLog(@"%s____数据校验成功", __func__);
[
dataArray
addObject
:
data
];
#endif
}
else
{
dataArray
=
[
NSMutableArray
arrayWithObject
:
data
];
}
}
[
GMCache
storeObjectAtDocumentPathWithkey
:
PhobosCacheKey
object
:
dataArray
]
;
return
NO
;
}
}
/**
// 发送埋点数据
* @brief 保存数据到缓存层
-
(
void
)
sendDataWithAPI
:
(
NSString
*
)
api
data
:
(
NSArray
*
)
dataArray
successBlock
:
(
SendDataSuccessBlock
)
successBlock
{
*
* @param data 数据
*
*/
-
(
void
)
save
:
(
NSDictionary
*
)
data
currentAPI
:
(
NSString
*
)
currentAPI
{
if
(
_logEnabled
)
{
phobosLog
([
NSString
stringWithFormat
:
@"save dictionary: %@"
,
data
]);
}
NSMutableArray
*
dataArray
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:[
PhobosUtil
MD5String
:
currentAPI
]];
if
(
dataArray
)
{
[
dataArray
addObject
:
data
];
}
else
{
dataArray
=
[
NSMutableArray
arrayWithObject
:
data
];
}
[
GMCache
storeObjectAtDocumentPathWithkey
:[
PhobosUtil
MD5String
:
currentAPI
]
object
:
dataArray
];
}
/**
* @brief 从缓存中获取数据,并发送
*
* @since 0.0.1
*/
-
(
void
)
fetchDataAndSend
{
NSArray
*
paramsArray
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
if
(
paramsArray
.
count
>
0
)
{
[
self
sendArray
:
paramsArray
cleanCacheRightNow
:
YES
];
}
// 其他接口的埋点
for
(
NSString
*
newApi
in
self
.
APIArray
)
{
NSArray
*
paramsArray
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:[
PhobosUtil
MD5String
:
newApi
]];
if
(
paramsArray
.
count
>
0
)
{
[
self
sendArray
:
paramsArray
currentAPI
:
newApi
cleanCacheRightNow
:
YES
];
}
}
}
/*
从缓存区获取数据,发给服务器,请求成功的时候,把缓存区的数据删除掉
*/
-
(
void
)
sendArray
{
NSMutableArray
*
dataArray
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosTempCacheKey
];
if
(
_logEnabled
)
{
if
(
_logEnabled
)
{
NSData
*
data
=
[
NSJSONSerialization
dataWithJSONObject
:
dataArray
options
:
NSJSONWritingPrettyPrinted
error
:
nil
];
NSData
*
data
=
[
NSJSONSerialization
dataWithJSONObject
:
dataArray
options
:
NSJSONWritingPrettyPrinted
error
:
nil
];
NSString
*
jsonString
=
[[
NSString
alloc
]
initWithData
:
data
encoding
:
NSUTF8StringEncoding
];
NSString
*
jsonString
=
[[
NSString
alloc
]
initWithData
:
data
encoding
:
NSUTF8StringEncoding
];
phobosLog
([
NSString
stringWithFormat
:
@"array prepare to fly --✈: %@"
,
jsonString
]);
phobosLog
([
NSString
stringWithFormat
:
@"array prepare to fly --✈: %@"
,
jsonString
]);
}
}
@try
{
@try
{
if
(
self
.
phobosSendDataBlock
)
{
self
.
phobosSendDataBlock
(
dataArray
);
}
NSData
*
JSON
=
[
PhobosUtil
encodeJSON
:
dataArray
];
NSData
*
JSON
=
[
PhobosUtil
encodeJSON
:
dataArray
];
NSData
*
compressedData
=
[
PhobosUtil
compressData
:
JSON
];
NSData
*
compressedData
=
[
PhobosUtil
compressData
:
JSON
];
if
(
compressedData
)
{
if
(
compressedData
)
{
[
PhobosUtil
sendData
:
compressedData
success
:
^
(
NSInteger
code
)
{
[
PhobosUtil
sendData
:
compressedData
currentAPI
:
api
success
:
successBlock
];
phobosLog
(
@"✈ ---------- ✈ data arrived Mars"
);
[
GMCache
removeObjectAtDocumentPathWithkey
:
PhobosTempCacheKey
];
}];
}
}
}
}
@catch
(
NSException
*
exception
)
{
@catch
(
NSException
*
exception
)
{
...
@@ -578,109 +634,76 @@ static NSString *sdkVersion = @"110";
...
@@ -578,109 +634,76 @@ static NSString *sdkVersion = @"110";
}
}
}
}
/*
@end
从缓存区获取数据,发给服务器,请求成功的时候,把缓存区的数据删除掉
*/
@implementation
Phobos
(
UtilTest
)
-
(
void
)
sendArrayWithCurrentAPI
:
(
NSString
*
)
currentAPI
{
NSString
*
PhobosTempCacheKeyStr
=
[
PhobosUtil
MD5String
:[
PhobosUtil
MD5String
:
currentAPI
]];
// 两次加密作为key值,和缓存的key值作区分
/** 获取所有非立即发送埋点数量 */
NSMutableArray
*
dataArray
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosTempCacheKeyStr
];
+
(
NSInteger
)
normalPhobosCount
{
if
(
_logEnabled
)
{
return
Phobos
.
sharedClient
.
normalCount
;
NSData
*
data
=
[
NSJSONSerialization
dataWithJSONObject
:
dataArray
options
:
NSJSONWritingPrettyPrinted
error
:
nil
];
NSString
*
jsonString
=
[[
NSString
alloc
]
initWithData
:
data
encoding
:
NSUTF8StringEncoding
];
phobosLog
([
NSString
stringWithFormat
:
@"array prepare to fly --✈: %@"
,
jsonString
]);
}
@try
{
NSData
*
JSON
=
[
PhobosUtil
encodeJSON
:
dataArray
];
NSData
*
compressedData
=
[
PhobosUtil
compressData
:
JSON
];
if
(
compressedData
)
{
[
PhobosUtil
sendData
:
compressedData
currentAPI
:
currentAPI
success
:^
(
NSInteger
code
)
{
phobosLog
(
@"✈ ---------- ✈ data arrived Mars"
);
[
GMCache
removeObjectAtDocumentPathWithkey
:
PhobosTempCacheKeyStr
];
}];
}
}
@catch
(
NSException
*
exception
)
{
phobosLog
(
exception
);
}
}
}
/**
该方法有改动,现在的逻辑是:当前方法只接受发送的请求,然后把数据转存到另一个缓存区,
让sendArray方法负责发送,数据一旦转移到缓存区,就把原有的数据干掉。
@author zhaiguojun 16-10-17 in (null)
@param array 参数
@param clean 是否立即清楚缓存
*/
-
(
void
)
sendArray
:
(
NSArray
*
)
array
cleanCacheRightNow
:
(
BOOL
)
clean
{
@try
{
//1.获取缓存区的数据,把新数据追加进去
NSMutableArray
*
dataArray
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosTempCacheKey
];
/** 获取所有非立即发送埋点数据 */
if
(
dataArray
)
{
+
(
NSDictionary
*
)
normalPhobosData
{
[
dataArray
addObjectsFromArray
:
array
];
return
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosNormalCacheKey
];
}
else
{
dataArray
=
[
NSMutableArray
arrayWithArray
:
array
];
}
[
GMCache
storeObjectAtDocumentPathWithkey
:
PhobosTempCacheKey
object
:
dataArray
];
//2.把缓存区的数据发送给服务器
[
self
sendArray
];
//3.把原有的数据删除
if
(
clean
)
{
[
GMCache
removeObjectAtDocumentPathWithkey
:
PhobosCacheKey
];
}
}
@catch
(
NSException
*
exception
)
{
phobosLog
(
exception
);
}
}
}
/**
/** 获取url的非立即发送埋点数量 */
上边方法新加了一个API字段
+
(
NSUInteger
)
normalPhobosCountForURL
:
(
NSString
*
)
url
{
*/
NSDictionary
*
dict
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosNormalCacheKey
];
-
(
void
)
sendArray
:
(
NSArray
*
)
array
currentAPI
:
(
NSString
*
)
currentAPI
cleanCacheRightNow
:
(
BOOL
)
clean
{
NSArray
*
urlData
=
dict
[
url
];
@try
{
return
urlData
?
urlData
.
count
:
0
;
//1.获取缓存区的数据,把新数据追加进去
NSString
*
PhobosTempCacheKeyStr
=
[
PhobosUtil
MD5String
:[
PhobosUtil
MD5String
:
currentAPI
]];
// 两次加密作为key值,和缓存的key值作区分
NSMutableArray
*
dataArray
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosTempCacheKeyStr
];
if
(
dataArray
)
{
[
dataArray
addObjectsFromArray
:
array
];
}
else
{
dataArray
=
[
NSMutableArray
arrayWithArray
:
array
];
}
[
GMCache
storeObjectAtDocumentPathWithkey
:
PhobosTempCacheKeyStr
object
:
dataArray
];
//2.把缓存区的数据发送给服务器
[
self
sendArrayWithCurrentAPI
:
currentAPI
];
//3.把原有的数据删除
[
GMCache
removeObjectAtDocumentPathWithkey
:[
PhobosUtil
MD5String
:
currentAPI
]];
}
@catch
(
NSException
*
exception
)
{
phobosLog
(
exception
);
}
}
}
#pragma mark - helpers
-
(
void
)
catchNullForEvent
:
(
NSString
*
)
eventId
attributes
:
(
NSDictionary
*
)
attributes
{
dispatch_async
(
dispatch_get_global_queue
(
0
,
0
),
^
{
@try
{
for
(
NSString
*
key
in
attributes
.
allKeys
)
{
if
([
attributes
[
key
]
isMemberOfClass
:[
NSNull
class
]])
{
if
(
self
.
captureNullExpection
)
{
self
.
captureNullExpection
(
eventId
,
attributes
);
}
break
;
}
}
}
@catch
(
NSException
*
exception
)
{
}
+
(
NSArray
*
)
normalPhobosDataForServerAPI
{
})
;
return
[
self
normalPhobosDataForURL
:
Phobos
.
sharedClient
.
serverAPI
]
;
}
}
/** 获取url的非立即发送埋点数据 */
+
(
NSArray
*
)
normalPhobosDataForURL
:
(
NSString
*
)
url
{
NSDictionary
*
dict
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosNormalCacheKey
];
return
dict
[
url
];
}
-
(
void
)
addNewApi
:
(
NSString
*
)
api
{
+
(
NSArray
*
)
immediatelyPhobosForServerAPI
{
for
(
NSString
*
item
in
self
.
APIArray
)
{
return
[
self
immediatelyPhobosDataForURL
:
Phobos
.
sharedClient
.
serverAPI
];
if
([
api
isEqualToString
:
item
])
{
break
;
}
[
self
.
APIArray
addObject
:
api
];
}
}
}
/** 获取所有立即发送埋点数据 */
+
(
NSDictionary
*
)
immediatelyPhobosData
{
return
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosImmediatelyCacheKey
];
}
/** 获取url的立即发送埋点数据 */
+
(
NSArray
*
)
immediatelyPhobosDataForURL
:
(
NSString
*
)
url
{
NSDictionary
*
dict
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosImmediatelyCacheKey
];
return
dict
[
url
];
}
+
(
NSUInteger
)
immediatelyPhobosCountForURL
:
(
NSString
*
)
url
{
NSDictionary
*
dict
=
[
GMCache
fetchObjectAtDocumentPathWithkey
:
PhobosImmediatelyCacheKey
];
NSArray
*
urlData
=
dict
[
url
];
return
urlData
?
urlData
.
count
:
0
;
}
/** 清除非立即发送埋点数据缓存 */
+
(
void
)
removeAllNormalPhobosData
{
Phobos
.
sharedClient
.
normalCount
=
0
;
[
GMCache
removeObjectAtDocumentPathWithkey
:
PhobosNormalCacheKey
];
}
/** 清除立即发送埋点数据缓存 */
+
(
void
)
removeAllImmediatelyPhobosData
{
[
GMCache
removeObjectAtDocumentPathWithkey
:
PhobosImmediatelyCacheKey
];
}
-
(
void
)
setPhobosSendDataBlock
:
(
void
(
^
)(
NSArray
*
))
phobosSendDataBlock
{
objc_setAssociatedObject
(
self
,
@selector
(
phobosSendDataBlock
),
phobosSendDataBlock
,
OBJC_ASSOCIATION_COPY_NONATOMIC
);
}
-
(
void
(
^
)(
NSArray
*
))
phobosSendDataBlock
{
return
objc_getAssociatedObject
(
self
,
@selector
(
phobosSendDataBlock
));
}
@end
@end
GMPhobos/Classes/PhobosConfig.h
View file @
7b79a83e
...
@@ -18,8 +18,8 @@
...
@@ -18,8 +18,8 @@
#define PhobosHaveOpenApp @"PhobosHaveOpenApp" //是否打开过APP
#define PhobosHaveOpenApp @"PhobosHaveOpenApp" //是否打开过APP
#define PhobosBeginTime @"PhobosBeginTime" //记录APP打开|从后台启动时的时间戳
#define PhobosBeginTime @"PhobosBeginTime" //记录APP打开|从后台启动时的时间戳
#define PhobosEndTime @"PhobosEndTime" //记录APP退出|退到后台时的时间戳
#define PhobosEndTime @"PhobosEndTime" //记录APP退出|退到后台时的时间戳
#define Phobos
CacheKey @"PhobosCacheKey"
//存放持久化埋点数据的key
#define Phobos
NormalCacheKey @"PhobosNormalCacheKey"
//存放持久化埋点数据的key
#define Phobos
TempCacheKey @"PhobosTempCacheKey" //临时存放待发送
埋点数据的key
#define Phobos
ImmediatelyCacheKey @"PhobosImmediatelyCacheKey" //存放持久化实时
埋点数据的key
#define PhobosShardCount 50 //收集数据分段发送的个数
#define PhobosShardCount 50 //收集数据分段发送的个数
...
...
GMPhobos/Classes/PhobosUtil.m
View file @
7b79a83e
...
@@ -127,6 +127,8 @@
...
@@ -127,6 +127,8 @@
//没有错误,返回正确;
//没有错误,返回正确;
if
(
success
)
{
if
(
success
)
{
success
(
200
);
success
(
200
);
}
else
{
success
(
error
.
code
);
}
}
}
}
}];
}];
...
@@ -150,6 +152,8 @@
...
@@ -150,6 +152,8 @@
//没有错误,返回正确;
//没有错误,返回正确;
if
(
success
)
{
if
(
success
)
{
success
(
200
);
success
(
200
);
}
else
{
success
(
error
.
code
);
}
}
}
}
}];
}];
...
...
GMPhobos/Classes/UIResponder+PhobosPV.h
View file @
7b79a83e
...
@@ -25,5 +25,4 @@
...
@@ -25,5 +25,4 @@
*/
*/
-
(
void
)
initReferrerTabName
;
-
(
void
)
initReferrerTabName
;
@end
@end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment