1515typedef 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