Skip to content

Commit ec55195

Browse files
Browser初回起動時に画面がOFFになってしまう件の修正。
1 parent 2e71914 commit ec55195

1 file changed

Lines changed: 132 additions & 109 deletions

File tree

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

Lines changed: 132 additions & 109 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

@@ -51,117 +50,138 @@ - (instancetype)init
5150
// イベントマネージャを取得
5251
self.eventMgr = [DConnectEventManager sharedManagerForClass:[DPHostDevicePlugin class]];
5352

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

162-
return YES;
163-
}];
164-
});
176+
[[NSNotificationCenter defaultCenter] removeObserver:weakSelf
177+
name:UIDeviceProximityStateDidChangeNotification
178+
object:nil];
179+
weakSelf.proximityBlock = nil;
180+
}
181+
182+
return YES;
183+
}];
184+
165185

166186
}
167187
return self;
@@ -191,7 +211,10 @@ - (void) sendOnUserProximityEvent:(NSNotification *)notification
191211
DPHostProximityBlock block = self.proximityBlock;
192212
block(proximity);
193213
}
194-
214+
if (self.onceProximityBlock) {
215+
DPHostProximityBlock block = self.onceProximityBlock;
216+
block(proximity);
217+
}
195218
}
196219

197220
@end

0 commit comments

Comments
 (0)