Skip to content

Commit 4bf47c1

Browse files
Merge pull request #147 from TakayukiHoshi1984/modify_host_proximity
iPhoneの近接センサ挙動修正
2 parents 6e29b88 + ec55195 commit 4bf47c1

1 file changed

Lines changed: 134 additions & 110 deletions

File tree

dConnectDevicePlugin/dConnectDeviceHost/dConnectDeviceHost/Classes/profile/DPHostProximityProfile.m

Lines changed: 134 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
typedef void (^DPHostProximityBlock)(DConnectMessage *);
1616

1717
@interface DPHostProximityProfile ()
18-
1918
/// @brief イベントマネージャ
2019
@property DConnectEventManager *eventMgr;
2120

@@ -41,7 +40,8 @@ - (instancetype)init
4140
// プロファイルが表示されない様にする。
4241
return nil;
4342
}
44-
43+
[UIDevice currentDevice].proximityMonitoringEnabled = NO;
44+
4545
// YESを設定してYES;近接センサーがサポートされている。
4646
__weak DPHostProximityProfile *weakSelf = self;
4747
self.proximityBlock = nil;
@@ -50,117 +50,138 @@ - (instancetype)init
5050
// イベントマネージャを取得
5151
self.eventMgr = [DConnectEventManager sharedManagerForClass:[DPHostDevicePlugin class]];
5252

53-
dispatch_async(dispatch_get_main_queue(), ^{
54-
[UIDevice currentDevice].proximityMonitoringEnabled = YES;
55-
56-
[[NSNotificationCenter defaultCenter] addObserver:weakSelf
57-
selector:@selector(sendOnUserProximityEvent:)
58-
name:UIDeviceProximityStateDidChangeNotification
59-
object:nil];
60-
61-
// API登録(didReceiveGetOnUserProximityRequest相当)
62-
NSString *getOnUserProximityRequestApiPath = [self apiPath: nil
63-
attributeName: DConnectProximityProfileAttrOnUserProximity];
64-
[self addGetPath: getOnUserProximityRequestApiPath
65-
api:^BOOL(DConnectRequestMessage *request, DConnectResponseMessage *response) {
66-
67-
DConnectMessage *proximity = [DConnectMessage message];
53+
54+
// API登録(didReceiveGetOnUserProximityRequest相当)
55+
NSString *getOnUserProximityRequestApiPath = [self apiPath: nil
56+
attributeName: DConnectProximityProfileAttrOnUserProximity];
57+
[self addGetPath: getOnUserProximityRequestApiPath
58+
api:^BOOL(DConnectRequestMessage *request, DConnectResponseMessage *response) {
59+
dispatch_async(dispatch_get_main_queue(), ^{
60+
[UIDevice currentDevice].proximityMonitoringEnabled = YES;
61+
[[NSNotificationCenter defaultCenter] addObserver:weakSelf
62+
selector:@selector(sendOnUserProximityEvent:)
63+
name:UIDeviceProximityStateDidChangeNotification
64+
object:nil];
65+
});
66+
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
67+
DConnectMessage *proximity = [DConnectMessage message];
68+
69+
[response setResult:DConnectMessageResultTypeOk];
70+
[DConnectProximityProfile setNear:NO target:proximity];
71+
[DConnectProximityProfile setProximity:proximity target:response];
72+
73+
weakSelf.onceProximityBlock = ^(DConnectMessage *message) {
6874
[response setResult:DConnectMessageResultTypeOk];
69-
70-
[DConnectProximityProfile setNear:weakSelf.proximityState target:proximity];
71-
[DConnectProximityProfile setProximity:proximity target:response];
72-
73-
return YES;
74-
}];
75-
76-
// API登録(didReceivePutOnUserProximityRequest相当)
77-
NSString *putOnUserProximityRequestApiPath = [self apiPath: nil
78-
attributeName: DConnectProximityProfileAttrOnUserProximity];
79-
[self addPutPath: putOnUserProximityRequestApiPath
80-
api:^BOOL(DConnectRequestMessage *request, DConnectResponseMessage *response) {
81-
82-
NSString *serviceId = [request serviceId];
83-
84-
NSArray *evts = [[weakSelf eventMgr] eventListForServiceId:serviceId
85-
profile:DConnectProximityProfileName
86-
attribute:DConnectProximityProfileAttrOnUserProximity];
87-
if (evts.count == 0) {
88-
weakSelf.proximityBlock = ^(DConnectMessage *message) {
89-
// イベントの取得
90-
NSArray *evts = [weakSelf.eventMgr eventListForServiceId:DPHostDevicePluginServiceId
91-
profile:DConnectProximityProfileName
92-
attribute:DConnectProximityProfileAttrOnUserProximity];
93-
94-
DPHostDevicePlugin *plugin = (DPHostDevicePlugin *)weakSelf.plugin;
95-
// イベント送信
96-
for (DConnectEvent *evt in evts) {
97-
DConnectMessage *eventMsg = [DConnectEventManager createEventMessageWithEvent:evt];
98-
[DConnectProximityProfile setProximity:message target:eventMsg];
99-
[plugin sendEvent:eventMsg];
100-
}
101-
};
102-
dispatch_async(dispatch_get_main_queue(), ^{
103-
[UIDevice currentDevice].proximityMonitoringEnabled = YES;
104-
105-
[[NSNotificationCenter defaultCenter] addObserver:weakSelf
106-
selector:@selector(sendOnUserProximityEvent:)
75+
[DConnectProximityProfile setProximity:message target:response];
76+
dispatch_semaphore_signal(semaphore);
77+
};
78+
dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC));
79+
NSString *serviceId = [request serviceId];
80+
dispatch_async(dispatch_get_main_queue(), ^{
81+
NSArray *evts = [[weakSelf eventMgr] eventListForServiceId:serviceId
82+
profile:DConnectProximityProfileName
83+
attribute:DConnectProximityProfileAttrOnUserProximity];
84+
if (evts.count == 0) {
85+
[UIDevice currentDevice].proximityMonitoringEnabled = NO;
86+
87+
[[NSNotificationCenter defaultCenter] removeObserver:weakSelf
10788
name:UIDeviceProximityStateDidChangeNotification
10889
object:nil];
109-
});
110-
}
111-
112-
switch ([[weakSelf eventMgr] addEventForRequest:request]) {
113-
case DConnectEventErrorNone: // エラー無し.
114-
[response setResult:DConnectMessageResultTypeOk];
115-
break;
116-
case DConnectEventErrorInvalidParameter: // 不正なパラメータ.
117-
[response setErrorToInvalidRequestParameter];
118-
break;
119-
case DConnectEventErrorNotFound: // マッチするイベント無し.
120-
case DConnectEventErrorFailed: // 処理失敗.
121-
[response setErrorToUnknown];
122-
break;
123-
}
124-
125-
return YES;
126-
}];
127-
128-
// API登録(didReceiveDeleteOnUserProximityRequest相当)
129-
NSString *deleteOnUserProximityRequestApiPath = [self apiPath: nil
130-
attributeName: DConnectProximityProfileAttrOnUserProximity];
131-
[self addDeletePath: deleteOnUserProximityRequestApiPath
132-
api:^BOOL(DConnectRequestMessage *request, DConnectResponseMessage *response) {
133-
134-
NSString *serviceId = [request serviceId];
135-
136-
switch ([[weakSelf eventMgr] removeEventForRequest:request]) {
137-
case DConnectEventErrorNone: // エラー無し.
138-
[response setResult:DConnectMessageResultTypeOk];
139-
break;
140-
case DConnectEventErrorInvalidParameter: // 不正なパラメータ.
141-
[response setErrorToInvalidRequestParameter];
142-
break;
143-
case DConnectEventErrorNotFound: // マッチするイベント無し.
144-
case DConnectEventErrorFailed: // 処理失敗.
145-
[response setErrorToUnknown];
146-
break;
147-
}
90+
weakSelf.onceProximityBlock = nil;
91+
}
92+
});
93+
94+
return YES;
95+
}];
96+
97+
// API登録(didReceivePutOnUserProximityRequest相当)
98+
NSString *putOnUserProximityRequestApiPath = [self apiPath: nil
99+
attributeName: DConnectProximityProfileAttrOnUserProximity];
100+
[self addPutPath: putOnUserProximityRequestApiPath
101+
api:^BOOL(DConnectRequestMessage *request, DConnectResponseMessage *response) {
102+
103+
NSString *serviceId = [request serviceId];
104+
105+
NSArray *evts = [[weakSelf eventMgr] eventListForServiceId:serviceId
106+
profile:DConnectProximityProfileName
107+
attribute:DConnectProximityProfileAttrOnUserProximity];
108+
if (evts.count == 0) {
109+
weakSelf.proximityBlock = ^(DConnectMessage *message) {
110+
// イベントの取得
111+
NSArray *evts = [weakSelf.eventMgr eventListForServiceId:DPHostDevicePluginServiceId
112+
profile:DConnectProximityProfileName
113+
attribute:DConnectProximityProfileAttrOnUserProximity];
114+
115+
DPHostDevicePlugin *plugin = (DPHostDevicePlugin *)weakSelf.plugin;
116+
// イベント送信
117+
for (DConnectEvent *evt in evts) {
118+
DConnectMessage *eventMsg = [DConnectEventManager createEventMessageWithEvent:evt];
119+
[DConnectProximityProfile setProximity:message target:eventMsg];
120+
[plugin sendEvent:eventMsg];
121+
}
122+
};
123+
dispatch_async(dispatch_get_main_queue(), ^{
124+
[UIDevice currentDevice].proximityMonitoringEnabled = YES;
125+
126+
[[NSNotificationCenter defaultCenter] addObserver:weakSelf
127+
selector:@selector(sendOnUserProximityEvent:)
128+
name:UIDeviceProximityStateDidChangeNotification
129+
object:nil];
130+
});
131+
}
132+
133+
switch ([[weakSelf eventMgr] addEventForRequest:request]) {
134+
case DConnectEventErrorNone: // エラー無し.
135+
[response setResult:DConnectMessageResultTypeOk];
136+
break;
137+
case DConnectEventErrorInvalidParameter: // 不正なパラメータ.
138+
[response setErrorToInvalidRequestParameter];
139+
break;
140+
case DConnectEventErrorNotFound: // マッチするイベント無し.
141+
case DConnectEventErrorFailed: // 処理失敗.
142+
[response setErrorToUnknown];
143+
break;
144+
}
145+
146+
return YES;
147+
}];
148+
149+
// API登録(didReceiveDeleteOnUserProximityRequest相当)
150+
NSString *deleteOnUserProximityRequestApiPath = [self apiPath: nil
151+
attributeName: DConnectProximityProfileAttrOnUserProximity];
152+
[self addDeletePath: deleteOnUserProximityRequestApiPath
153+
api:^BOOL(DConnectRequestMessage *request, DConnectResponseMessage *response) {
154+
155+
NSString *serviceId = [request serviceId];
156+
157+
switch ([[weakSelf eventMgr] removeEventForRequest:request]) {
158+
case DConnectEventErrorNone: // エラー無し.
159+
[response setResult:DConnectMessageResultTypeOk];
160+
break;
161+
case DConnectEventErrorInvalidParameter: // 不正なパラメータ.
162+
[response setErrorToInvalidRequestParameter];
163+
break;
164+
case DConnectEventErrorNotFound: // マッチするイベント無し.
165+
case DConnectEventErrorFailed: // 処理失敗.
166+
[response setErrorToUnknown];
167+
break;
168+
}
169+
170+
NSArray *evts = [[weakSelf eventMgr] eventListForServiceId:serviceId
171+
profile:DConnectProximityProfileName
172+
attribute:DConnectProximityProfileAttrOnUserProximity];
173+
if (evts.count == 0) {
174+
[UIDevice currentDevice].proximityMonitoringEnabled = NO;
148175

149-
NSArray *evts = [[weakSelf eventMgr] eventListForServiceId:serviceId
150-
profile:DConnectProximityProfileName
151-
attribute:DConnectProximityProfileAttrOnUserProximity];
152-
if (evts.count == 0) {
153-
[UIDevice currentDevice].proximityMonitoringEnabled = NO;
154-
155-
[[NSNotificationCenter defaultCenter] removeObserver:weakSelf
156-
name:UIDeviceProximityStateDidChangeNotification
157-
object:nil];
158-
weakSelf.proximityBlock = nil;
159-
}
160-
161-
return YES;
162-
}];
163-
});
176+
[[NSNotificationCenter defaultCenter] removeObserver:weakSelf
177+
name:UIDeviceProximityStateDidChangeNotification
178+
object:nil];
179+
weakSelf.proximityBlock = nil;
180+
}
181+
182+
return YES;
183+
}];
184+
164185

165186
}
166187
return self;
@@ -190,7 +211,10 @@ - (void) sendOnUserProximityEvent:(NSNotification *)notification
190211
DPHostProximityBlock block = self.proximityBlock;
191212
block(proximity);
192213
}
193-
214+
if (self.onceProximityBlock) {
215+
DPHostProximityBlock block = self.onceProximityBlock;
216+
block(proximity);
217+
}
194218
}
195219

196220
@end

0 commit comments

Comments
 (0)