ãã ããçŸåšã§ã¯å€ãã®äººæ°ã®ããæ©é¢ãç¡æãã€ã³ããžã®æ¥ç¶ã容æã«ããã¢ããªã±ãŒã·ã§ã³ãæäŸããŠããŸãã ç§ãã¡ã¯ãããããã®ãããªäŸãç°¡åã«æãåºãããšãã§ãããšç¢ºä¿¡ããŠããã®ã§ãååãåºåãªãã§è¡ãããšãã§ããŸãã ããã«ããã®åé¡ã®å¥ã®è§£æ±ºçã«ã€ããŠä»¥äžã§èª¬æããŸã-ç¬èªã®ãããã¯ãŒã¯ãã«ããŒãäœæããŸãïŒ ãã®ã¢ãããŒãã䜿çšãããšãæ¥ç¶ããã°ãªãããæšæž¬ããå¿ èŠããªããªããŸãã ãããã¯ãŒã¯ã«ã¢ã¯ã»ã¹ããããã®è¿œå ã®ã¢ã¯ã·ã§ã³ã§ããã䟿å©ãªãã€ãã£ãUIã§å®è¡ã§ãããã©ãŠã¶ãããã¯ããã«é«éã§ãã
ãã¹ãŠãã·ã³ãã«ã§ãã iOS 9ã®ãªãªãŒã¹ä»¥éãéçºè ãå©çšã§ããããã«ãªã£ãNEHotspotHelperãã¯ãããžãŒã䜿çšããã ãã§ååã§ãããã®ããŒã«ã®äž»ãªã¿ã¹ã¯ã¯ãWi-Fiãããã¯ãŒã¯ã®åé¡ãšãŠãŒã¶ãŒèªèšŒã§ãã NEHotspotHelperã¯NetworkExtensionãã¬ãŒã ã¯ãŒã¯ã®äžéšã§ãã 以äžã«ãiOS 11ã®ãªãªãŒã¹æã«å«ãŸããŠããããŒã«ã®å³ã瀺ããŸãã
äž»ãªããã¥ã¡ã³ãã¯ãã¡ãã§ãïŒ Hotspot Network Subsystem Programming Guide ã ããã«ããããã¯ãŒã¯äžã§æ å ±ãèŠã€ãããªãã£ãããããã®èšäºãæžããŠããŸãã ç§ã®è³æãããã¥ã¡ã³ãã®ã®ã£ãããåããŠãç¬èªã®ãããã¹ããããã«ããŒãå®è£ ããæ¹æ³ã説æããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã ãã®ãã¯ãããžãŒã®äœ¿çšäŸã¯ã GitHubã«ãããŸã ã
åäœåç
ãããã¹ããããã«ããŒã¯ããã«ããŒã·ã¹ãã ã«ãã£ãŠéä¿¡ãããWi-Fiæ¥ç¶ç¶æ ãã·ã³ãšã³ãã³ãã«åºã¥ããŠããããã®åŠçã«ãããã·ã³ã1ã€ã®ç¶æ ããå¥ã®ç¶æ ã«è»¢éãããŸãã 以äžã¯ãAppleèªèº«ãããã¥ã¡ã³ãã§åŒçšããŠããããããã®ç¶æ å³ã§ãã
æåã¯ããã®ãããªè€éãªå³ã¯æãã§ãããå¿é ããªãã§ãã ãã-å®éã«ã¯ããã¹ãŠãéåžžã«åçŽã§ãã
以äžãç解ããã ãã§ååã§ãã
- ããã€ã¹ãåèµ·åããåŸã«åããŠãããã¯ãŒã¯ã«æ¥ç¶ãããšãããããæäŸããããã«ãã«ããŒãéžæãããŸãïŒ Evaluate ïŒã
- éžæãè¡ããããšãéžæãããããã¹ããããã«ããŒïŒ èªèšŒ ïŒã䜿çšããŠããããã¯ãŒã¯äžã®èªèšŒãéå§ãããŸãã
- æ¿èªããã»ã¹äžã«UIã衚瀺ããå¿ èŠãããå ŽåãHotspot Helperã¯æ瀺çã«èŠæ±ããŸãïŒ PresentingUI ïŒã ãã®ãããªå¿ èŠæ§ããªãå Žåãããã¯ã°ã©ãŠã³ãã®ãã«ããŒã¯ããããã¯ãŒã¯äžã®ãŠãŒã¶ãŒãèªèšŒããããã«å¿ èŠãªæé ãå®è¡ããŸãïŒ èªèšŒæžã¿ ïŒã
- å¿ èŠã«å¿ããŠãã·ã¹ãã ã¯ã»ãã·ã§ã³ããµããŒãããããã«ãéžæãããããã¹ããããã«ããŒãå®æçã«èµ·åããŸãïŒ ã¡ã³ããã³ã¹ ïŒã
- ã»ãã·ã§ã³ã®ãµããŒãäžããã«ããŒã¯äœãããªãã£ãããåèªèšŒãèŠæ±ãããããããã¯ãŒã¯ãžã®åæ¥ç¶ãåŒãèµ·ããããããŸãã
å¯äžã®éèªæãªãã€ã³ãïŒãããã¯ãŒã¯ãžã®æåã®æ¥ç¶åŸãã·ã¹ãã ã¯éžæããããããã¹ããããã«ããŒããã£ãã·ã¥ããŸãããããã£ãŠã次ã®æ¥ç¶ã§ããã·ã³ã¯ããã«ä¿å®ç¶æ ã«åãæ¿ããã以åã®ãã¹ãŠããã€ãã¹ããŸãã
Hotspot Helperã¯ããããã¯ãŒã¯ã®ãªã¹ãã®è¡šç€ºããéžæããããããã¯ãŒã¯ãžã®æ¥ç¶ãŸã§ãWi-Fiãããã¯ãŒã¯ã®ãŠãŒã¶ãŒèªèšŒã«é¢äžããèªèšŒãšã»ã«ããã°ã¢ãŠãããµããŒãããŸãã åæã«ãæ¥ç¶ã確ç«ããããã«ãHotspot Helperã¯å¿ èŠãªãã¹ãŠã®ã³ãã³ããåŠçãããããã·ã¹ãã ã¯ããããç¶æ³ã§èµ·åããŸãïŒãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ã匷å¶çã«ã·ã£ããããŠã³ããå Žåã§ãïŒ ãµã€ã¬ã³ãããã·ã¥éç¥ãç¡èŠããããšã«ãªããŸãïŒãããã€ã¹å šäœã®åäœã¯ããã«äŸåããããã§ãïŒãããã»ã¹å šäœããŠãŒã¶ãŒã«å¯ŸããŠééçã§ãããããæãäžè¬çãªã·ããªãªã¯ãã¢ããªã±ãŒã·ã§ã³ãããã¯ã°ã©ãŠã³ãã§èµ·åããããšã§ãã
ãã®ãããWi-Fiæ¥ç¶ã確ç«ããã«ã¯ããããã¹ããããã«ããŒãå¿ èŠãªã³ãã³ãããã¹ãŠåŠçããå¿ èŠããããŸãã ã€ãŸããStateMachineãAuthenticatedç¶æ ã«ãªããŸã§ãããã€ã¹ã¯èªèº«ããããã¯ãŒã¯ã«æ¥ç¶ãããŠãããšã¯èŠãªããŸãã ã ãããŠãããã¯ãHotspot HelperãEvaluateã³ãã³ããåä¿¡ãããšæ¥ç¶ã®è¡šç€ºãéå§ãããšããäºå®ã«ããããããã§ãã ãã®ç¬éã¯ã以äžã§èª¬æããReachabilityããŒã«ã«ãã£ãŠå®å šã«è¿œè·¡ãããŸãã
NEHotspotHelperã¯ãä»ã®æ¡åŒµæ©èœã§ããããããã«ãåå¥ã®ã¿ãŒã²ããã§ã¯ãªããã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ãHotspot HelperãšããŠç»é²ãããŠãããšèšããªããã°ãªããŸããã ã€ãŸãã圌ãã³ãã³ããåŠçããå¿ èŠããããšããã«ãã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ãèµ·åããããã®åŸã®ãã¹ãŠã®çµæãããããããŸãã ã€ãŸããã¢ããªã±ãŒã·ã§ã³ã¯ä»»æã®ã³ãŒããå®è¡ã§ããŸãããããã¯ã°ã©ãŠã³ãã§èµ·åããããšããŸãã§ãŠãŒã¶ãŒèªèº«ã«ãã£ãŠéå§ããããã®ããã«æ¬æ Œçãªã¢ã¯ã·ã§ã³ããããã€ã§ããŸãã ãã ãããã®ãããªã¢ã¯ãã£ããã£ã¯ãªãœãŒã¹ãç¡é§ã«ããããšãæå³ããã ããªã®ã§ãããã¯ã°ã©ãŠã³ãã§äœãèµ·ãã£ãŠãããã¯æ³šç®ã«å€ããŸã
äºåæºå
ã¢ããªã±ãŒã·ã§ã³ããããã¹ããããã«ããŒãšããŠç»é²ããã«ã¯ãAppleã®èš±å¯ãå¿ èŠã§ãã ãããè¡ãã«ã¯ãããŒã ãšãŒãžã§ã³ãããªã³ã¯ããã©ã£ãŠã¢ã³ã±ãŒãã«èšå ¥ããå¿ èŠããããŸãã
å·çæç¹ã§ã¯ã次ã®ããã«ãªã£ãŠããŸãã
ãã¹ãŠãããŸãããã° ã httpsïŒ//developer.apple.comã§ããããžã§ãã³ã°ãããã¡ã€ã«ãäœæãããšãã«ããã¹ãŠã®ã°ããºã䜿çšããæš©å©ãäžããããŒcom.apple.developer.networking.HotspotHelperã§è³æ Œãéžæããããšãã§ããŸãã
ããã«ããããžã§ã¯ãã§ããã¯ã°ã©ãŠã³ãã¢ãŒãæ©èœãæå¹ã«ãã UIBackgroundModesã»ã¯ã·ã§ã³ã®Info.plistã«è¡ãããã¯ãŒã¯èªèšŒãèšè¿°ããå¿ èŠããããŸãã ãã®åŸãæãèå³æ·±ãã³ãŒãã£ã³ã°ã«é²ãããšãã§ããŸãã
ç»é²
ã¢ããªã±ãŒã·ã§ã³ããããã¹ããããã«ããŒã«ããã«ã¯ãã·ã¹ãã ã«ç»é²ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ã次ã®ã¡ãœãããåŒã³åºããŸãã
class NEHotspotHelper class func register(options: [String : NSObject]? = nil, queue: DispatchQueue, handler: @escaping NetworkExtension.NEHotspotHelperHandler) -> Bool
ãã®ã¡ãœããã¯3ã€ã®ãã©ã¡ãŒã¿ãŒãåããŸãã
- ãªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒèŸæžã çŸåšãå¯äžã®ãã©ã¡ãŒã¿ãŒããµããŒããããŠããŸãïŒ kNEHotspotHelperOptionDisplayName -Hotspot Helperã®ååãHHããµããŒããããããã¯ãŒã¯ã®æšªã«ããå©çšå¯èœãªWi-Fiãããã¯ãŒã¯ã®ãªã¹ãã«è¡šç€ºãããŸãïŒè©³çŽ°ã¯ä»¥äžïŒã æ°ããååããã©ã¡ãŒã¿ãŒãšããŠæž¡ãããšã«ãããã¢ããªã±ãŒã·ã§ã³ãåèµ·åããåŸã«ã®ã¿ããã®ååãå€æŽã§ããŸãã Appleã«ãããš ãååã¯ã§ããã ãçãããå¿
èŠããããŸãã
- ã·ã¹ãã ããåä¿¡ããã³ãã³ããåŠçããããã¥ãŒã ããã¯ã°ã©ãŠã³ãã§ã³ãã³ããåŠçããã ãã§ãªããã³ãã³ãã®åŠçãä»ã®ã¢ããªã±ãŒã·ã§ã³ã³ãŒããšåæããããã«ã䜿çšã§ããŸãã
- ãããã¯ã¯ã³ãã³ããã³ãã©ã§ãã ããã¯ãèšèšã®éèŠãªèŠçŽ ã§ãã 圌ã®çœ²åã¯ç°¡åã§ãïŒ
typealias NEHotspotHelperHandler = (NEHotspotHelperCommand) -> Void
ã·ã¹ãã ã³ãã³ããå¯äžã®ãã©ã¡ãŒã¿ãŒãšããŠåãåããäœãè¿ããŸããã ãããã¯ã¯ã2çªç®ã®ãã©ã¡ãŒã¿ãŒãšããŠæž¡ããããã¥ãŒã§åŒã³åºãããŸãã
ãã«ããŒãåéå§æã«1åã ãç»é²ããŸãã åãå®è¡ã§ã®åŒã³åºãã¯äœãäžããã falseãè¿ããŸã ã åç»é²ãå®äºãããŸã§ãã¢ããªã±ãŒã·ã§ã³ã¯ã·ã¹ãã ã«ãã£ãŠèµ·åãããã³ãã³ããåä¿¡ããªãããšã«æ³šæããããšãéèŠã§ãã
ãããªãæ¹æ³ã§ãç»é²ããã£ã³ã»ã«ããããšã¯ã§ããŸããã ãããã¯ã®ç»é²ãåæ¢ããã ãã§ãã¢ããªã±ãŒã·ã§ã³ã¯æ¥ç¶ãåŠçããŸããããããã§ãèµ·åããŸã- 詳现ã¯ãã¡ã ã
ããã«ãã·ã¹ãã ã®ä»ã®å€ãã®æ©èœïŒãã©ãã®ã£ã©ãªãŒãã«ã¬ã³ããŒãéç¥ãªã©ïŒãšã¯ç°ãªããHotspot Helperã䜿çšããWi-Fiæ¥ç¶ã®åŠçã¯ãŠãŒã¶ãŒããã®èš±å¯ãå¿ èŠãšããããŠãŒã¶ãŒã«å¯ŸããŠééçã§ãïŒåœŒã¯åã«ãã®ãããªæŠå¿µã«ééããŸããïŒ ã
ã³ãã³ãåŠç
ã³ãã³ãã¯NEHotspotHelperCommandã¯ã©ã¹ã®ãªããžã§ã¯ãã§ãããåã³ãã³ãã«åºæã®ã¿ã€ããšããŒã¿ã»ããïŒã³ãã³ãã瀺ãå Žåã¯ãããã¯ãŒã¯ãŸãã¯ãããã¯ãŒã¯ã®ãªã¹ãïŒãå«ãŸããŸãã
åã³ãã³ããåŠçããåŸãå®è¡ã®çµæãšç¹å®ã®ã³ãã³ãã«ãäŸåããããŒã¿ã»ããã䜿çšããŠNEHotspotHelperResponseãäœæããŸãã
NEHotspotHelperResponseãªããžã§ã¯ãã¯ãåä¿¡ããã³ãã³ãã§ãã®ã¡ãœãããåŒã³åºãããšã«ããäœæãããŸãã
func createResponse(_ result: NEHotspotHelperResult) -> NEHotspotHelperResponse
ããã«ãã³ãã³ããªããžã§ã¯ãã䜿çšãããšãé©åãªã¡ãœãããåŒã³åºããŠãã³ãã³ããå±ãããããã¯ãŒã¯ã«åºã¥ããŠTCPãŸãã¯UDPæ¥ç¶ã確ç«ã§ããŸãã
func createTCPConnection(_ endpoint: NWEndpoint) -> NWTCPConnection func createUDPSession(_ endpoint: NWEndpoint) -> NWUDPSession
ãµãŒããŒãšã®é«ã¬ãã«ã®éä¿¡ã®ããã«ãNSURLRequestãäœæã§ããŸãã Hotspot Helperã«ã³ãã³ããæ·»ä»ãããšãããã€ã¹ã«Wi-Fiæ¥ç¶ã衚瀺ãããªãç¶æ³ã§ãµãŒããŒãšå¯Ÿè©±ããæ©äŒãåŸãããŸãã ãã®æ¹æ³ã§ç¢ºç«ãããæ¥ç¶ã¯ããç¬èªã®æ¹æ³ã§ãæ¿èªã«äœ¿çšã§ããŸãã IYKWIM
func bind(to command: NEHotspotHelperCommand)
以äžã§ã¯ãHotspot Helperããããã¯ãŒã¯ã«æ¥ç¶ããåºæ¬çãªã·ããªãªã«å¯Ÿå¿ããé åºã§åä¿¡ã§ããåã³ãã³ããæ€èšããŸãã ã»ãšãã©ã®ã³ãã³ãã¯ãããããåŒã³åºãããã¹ããŒããã·ã³ã®ç¶æ ãšåæ§ã«ååãä»ããããŸãã
å ¬åŒã«ã¯ãåã³ãã³ãã®å®è¡ã«å²ãåœãŠãããã®ã¯45ç§ä»¥äžã§ãïŒãã ããããã¯ã°ã©ãŠã³ãã§å©çšå¯èœãªæéãèŠããšã60ç§ãšããæ°åãèŠãããšãã§ããŸãïŒã ãã®åŸãããŒã ã¯æªåŠçãšèŠãªãããHotspot Helperã®äœæ¥ã¯äžæãããŸãã ãã®å¶éã¯ãã³ãã³ããåŠçããããŸã§ã¹ããŒã¿ã¹ããŒã«åæãããWi-Fiã¢ã€ã³ã³ã衚瀺ãããªãããããããã¯ãŒã¯ã«æ¥ç¶ããéã®äžå¿ èŠãªé 延ããªããããã«å¿ èŠã§ãã ã·ã¹ãã å ã«åããããã¯ãŒã¯ãåŠçããè€æ°ã®ãããã¹ããããã«ããŒãååšããå Žåãæéã®ãã®ãéžæãããããšãç解ããŠããå¿ èŠããããŸãïŒè©³çŽ°ã«ã€ããŠã¯åŸè¿°ïŒã
NEHotspotHelperCommandTypeã filterScanList
ããã¯ç¹å¥ãªã³ãã³ãã§ãããä»ã®ã³ãã³ããšã¯ç°ãªããStateMachineã®ã©ã®ç¶æ ã«ãé¢é£ä»ããããŠãããããã€ã§ãåŒã³åºãããšãã§ããŸãã ãã®ã³ãã³ãã¯ãã·ã¹ãã ã«èªèãããŠãããã¹ãŠã®ãããã¹ããããã«ããŒã§5ç§ããšã«åŒã³åºãããŸãã ããã¯ããŠãŒã¶ãŒãã·ã¹ãã ã®Settings.appã®Wi-Fiãããã¯ãŒã¯ã®ãªã¹ãã«ããéãåžžã«çºçããŸãã
ããŒã ã¯ãHotspot HelperãåŠçããŠãããããã¯ãŒã¯ããŠãŒã¶ãŒã«ç€ºããšããå¯äžã®ç®çãæãããŸãã ãããè¡ãã«ã¯ãã³ãã³ãã®å¯Ÿå¿ãããã£ãŒã«ãã«äœ¿çšå¯èœãªãããã¯ãŒã¯ã®ãªã¹ããå«ãŸããŸãã
var networkList: [NEHotspotNetwork]? { get }
ããã¯ããŠãŒã¶ãŒã«è¡šç€ºããããªã¹ããšåãã§ãã ããã«ããããã¯ãŒã¯ã®ãªã¹ãã¯ãããŒã ãžã®æ°ããåŒã³åºãããšã«å€ããå ŽåããããŸãã
Hotspot Helperã¯ãããã¯ãŒã¯ã®ãªã¹ããåæããã³ãã³ããžã®å¿çãšããŠæäŸããæºåãã§ããŠãããã®ãè¿ãå¿ èŠããããšæ³å®ãããŠããŸãã åçã®ç©ºã®é åã¯ããã®ãã«ããŒã«ãããµãŒãã¹ã«å©çšã§ãããããã¯ãŒã¯ããªãããšãæå³ããŸãã ãªã¹ãããã®ãããã¯ãŒã¯ãŠãŒã¶ãŒã®é衚瀺ã¯æ©èœããŸããã
Hotspot Helperããã®ã³ãã³ãã«å¿çããŠè¿ãããªã¹ãå ã®ãããã¯ãŒã¯ã«ã¯çœ²åããããŸãã ãªãã·ã§ã³kNEHotspotHelperOptionDisplayNameãšããŠHotspot Helperã®æåŸã®ç»é²æã«è»¢éãããå€ã«å¯Ÿå¿ããŸãã 眲åå€ã¯1ã€ã®ã¿ã§ãã ç»é²äžã«èšå®ããã次ã®ç»é²ãŸã§å€æŽããããšã¯ã§ããŸããïŒããã¯ã¢ããªã±ãŒã·ã§ã³ã®åèµ·ååŸã«çºçããŸãïŒããããã£ãŠãæ²ããããªãããŸããŸãªæ¹æ³ã§ãããã¯ãŒã¯ã«çœ²åããããšã¯ã§ããŸããã
å¿çãšããŠãããã¯ãŒã¯èªäœãéä¿¡ããããšã«å ããŠããããã¯ãŒã¯ã«ãã£ãŠä¿è·ãããŠããå Žåã¯ãã¹ã¯ãŒããèšå®ããå¿ èŠãããããšã«æ³šæããããšãéèŠã§ãã ããããªããšã眲åã¯è¡šç€ºãããŸããã ãã¹ã¯ãŒããèšå®ãããŠããå Žåã眲åã«å ããŠããŠãŒã¶ãŒã¯èªåã§ãã¹ã¯ãŒããå ¥åããå¿ èŠã¯ãããŸããã ãããã¯ãŒã¯ã®ãã¹ã¯ãŒããèšå®ã§ããã®ã¯ããã ãã§ãã ä»ãã確èªããªãå Žåã¯ããŠãŒã¶ãŒãå®è¡ããå¿ èŠããããŸãã
ãã®çµæãã³ãã³ãã¯æ¬¡ã®ããã«åŠçãããå¿ èŠããããŸãã
let network = <A network from command.networkList> network.setPassword("PASSWORD") let response = command.createResponse(.success) response.setNetworkList([network]) response.deliver()
ãã®çµæããŠãŒã¶ãŒã«ã¯æ¬¡ã®ãããªãã®ã衚瀺ãããŸãã
filterScanListã³ãã³ãã¯ããŠãŒã¶ãŒã«ãããã¯ãŒã¯ã®ãªã¹ãã瀺ãããã«äœ¿çšããããããã¯ãŒã¯æ¥ç¶ã®æ®ãã®åŠçã«ã¯åœ±é¿ããªãããšãç解ããŠãã ããã Hotspot Helperã³ãã³ãã«å¿çããŠãããã¯ãŒã¯ãè¿ãããªãå Žåã以äžã«èª¬æããã³ãã³ãã䜿çšããŠããããã®ãããããžã®æ¥ç¶ãåŠçããããã«ææ¡ãããŸãã
èå³æ·±ãäºå®ïŒã¢ããªã±ãŒã·ã§ã³ãã¢ã³ã€ã³ã¹ããŒã«ãããšããããã¯ãŒã¯ã®ãªã¹ãå ã®çœ²åã¯ãããã€ã¹ãåèµ·åããããŸã§æ®ããŸãã
NEHotspotHelperCommandTypeã è©äŸ¡ãã
ãã®ã³ãã³ãã¯ãã·ã¹ãã ãèªèããŠãããã¹ãŠã®ãããã¹ããããã«ããŒäžã®ãããã¯ãŒã¯ãžã®æåã®æ¥ç¶æã«åŒã³åºãããŸãã
泚ïŒåŸç¶ã®æ¥ç¶ã§ã¯ãevaluateã¯åŒã³åºããããããã«è©äŸ¡ããã»ã¹ã§éžæãããHotspot Helperãç¶æãããŸãã
ãã®ããŒã ã®ç®çã¯ãæåã«ãéžæãããããã¯ãŒã¯ãžã®æ¥ç¶ãåŠçããã®ã«æé©ãªãããã¹ããããã«ããŒãããã¯ãŒã¯ãç¹å®ããããšã§ãã ãããè¡ãã«ã¯ãHotspot HelperããŒã ãšãšãã«ãæ¥ç¶ããŠãããããã¯ãŒã¯çµç±ã§ããŒã¿ãåä¿¡ããŸãã
var network: NEHotspotNetwork? { get }
ãããã¯ãŒã¯ã«ã¯å€ãã®ããããã£ãå«ãŸããŠããŸãããè©äŸ¡ã³ãã³ãã®åŠçããã»ã¹ã§ã¯ã次ã®å€ã®ã¿ã«å€ããããŸãã
// var ssid: String { get } var bssid: String { get } // 0.0 1.0 (, , ) var signalStrength: Double { get } // var isSecure: Bool { get } // , , // var didAutoJoin: Bool { get }
ãã®æ å ±ãåãåã£ãHotspot Helperã¯ãïŒããŒã«ã«ããŒãã«ãããµãŒããŒãžã®ãªã¯ãšã¹ãã§çµããïŒäœããã®æ¹æ³ã§ãããã¯ãŒã¯ãåæãããããã¯ãŒã¯ãé©åãªä¿¡é Œã¬ãã«ã«èšå®ããå¿ èŠããããŸãã
// Helper , . case none // Helper , , *. case low // Helper , . case high
*ãã®å ŽåããŠãŒã¶ãŒã«ãŠãŒã¶ãŒãæ¿èªããæ©äŒãæäŸã§ããŸããããã«ããŒããã»ã¹ã§ãã®ãããã¯ãŒã¯ãšäºææ§ããªãããšãç解ããå Žåã圌ã¯ããã䜿çšããããšãæåŠã§ããStateMachineã¯åã³è©äŸ¡ç¶æ ã«å ¥ãããã«ããŒã¯é€å€ãªã¹ãã«è¿œå ãããŸããã®ãããã¯ãŒã¯ã
泚æããããšãéèŠã§ãïŒ Appleã¯ãã·ã¹ãã å šäœã®UXã«çŽæ¥åœ±é¿ãããããä¿¡é Œã¬ãã«ã¯æ éã«éžæããå¿ èŠãããããã¹ãŠã®ãããã¯ãŒã¯ãé«ïŒããã«ã¯äœïŒã«èšå®ããå¿ èŠãããããšãæ確ã«æ確ã«ããŸãã
ãã®çµæãã³ãã³ãã¯æ¬¡ã®ããã«åŠçãããå¿ èŠããããŸãã
let network = command.network // confidence... network.setConfidence(<Appropriate level of confidence>) let response = command.createResponse(.success) response.setNetwork(network) response.deliver()
ã³ãã³ãã®åŠçã«ã¯45ç§ããããŸãããã§ããã ãæ©ãå®è¡ããã®ãçã«ããªã£ãŠããŸãã ã·ã¹ãã ãæåã®å¿çãé«ãä¿¡é ŒåºŠã§åä¿¡ãããšããã«ãã³ãã³ãã®åŠçãçµäºããããã§ãã 次ã«ããããã¯ãŒã¯æ¥ç¶ãããã«åŠçããããã«å¿çãããããã¹ããããã«ããŒãéžæãããä»ã®ãã¹ãŠã¯äœæ¥ãåæ¢ããŠäžæåæ¢ç¶æ ã«ãªããŸãã
NEHotspotHelperCommandTypeã èªèšŒãã
authenticateã³ãã³ãã¯ãevaluateã³ãã³ãã®çµæã«åºã¥ããŠæãé©åãªãããã¹ããããã«ããŒã§åŒã³åºãããŸãã
ãã®ã³ãã³ãã®ç®çã¯ãéžæããWi-Fiãããã¯ãŒã¯ãžã®å®å šãªãŠãŒã¶ãŒã¢ã¯ã»ã¹ãæäŸããããã«å¿ èŠãªãã¹ãŠã®æé ãå®è¡ããããšã§ãã ãããè¡ãã«ã¯ãHotspot HelperããŒã ãšãšãã«ãæ¥ç¶ããŠãããããã¯ãŒã¯çµç±ã§ããŒã¿ãåä¿¡ããŸãã
var network: NEHotspotNetwork? { get }
Hotspot Helperã®äžæ žã¯ãã®ããŒã ã®äžæ žã§ãã ãã®æ®µéã§ã¯ãHotspot Helperã®ã¿ããŠãŒã¶ãŒãšãããã¯ãŒã¯ã¢ã¯ã»ã¹ã®éã®éå£ã§ããããŠãŒã¶ãŒã¢ã¯ã»ã¹ãèš±å¯ãããã©ãããéçºè ãæ³åã§ããæ¹æ³ã§æ±ºå®ããå¿ èŠããããŸãã
ã³ãã³ãã®åŠçã«45ç§ãäžããããåŸã次ã®çµæã®ããããã§å¿çãè¿ãå¿ èŠããããŸãã
.success-èªèšŒã¯æ£åžžã«å®äºããŸããã ãããã¯ãŒã¯ã¢ã¯ã»ã¹ã¯å®å šã«ãªãŒãã³ã§ãã StateMachineã¯èªèšŒæžã¿ç¶æ ã«å ¥ããŸãã
.unsupportedNetwork-ãã®ãããã¯ãŒã¯ã¯ãã«ããŒã«ãã£ãŠãµããŒããããŠããŸããïŒãããã¯ãŒã¯ã¯è©äŸ¡æ®µéã§èª€ã£ãŠåæãããŸããã StateMachineã¯è©äŸ¡ãã§ãŒãºã«æ»ãããã®ãããã¯ãŒã¯ã®äŸå€ã«ãã«ããŒãè¿œå ãããŸãã ããã¯ãããšãã°ããã«ããŒãè©äŸ¡æ®µéã§ãã®ãããã¯ãŒã¯ã«å¯ŸããŠäœãä¿¡é ŒåºŠãè¿ããçŸåšã§ã¯å¯Ÿå¿ã§ããªãããšã確èªããå Žåã«çºçããå¯èœæ§ããããŸãã
.uiRequired-ãŠãŒã¶ãŒã®æäœãå¿ èŠã§ãã ãã®çµæã¯ãèªèšŒã«è¿œå ã®ããŒã¿ãå¿ èŠãªå Žåã«è¿ãããŸãã ãã ãããã¹ãŠãããã»ã©åçŽãªããã§ã¯ãããŸãã ã ãã®çµæãè¿ããããšã ã UIèªäœã¯è¡šç€ºãããŸãã ã
ããã¯æ¬¡ã®ããã«æ©èœããŸãããããã¹ããããã«ããŒã¯UILocalNotificationã«ãã£ãŠçæããããããä»ããŠãŠãŒã¶ãŒã«è¿œå ã®å¯Ÿè©±ã®å¿ èŠæ§ãéç¥ããŸãã ãŠãŒã¶ãŒããããç¡èŠããå Žåãä»ã«ã¯äœãèµ·ãããŸããã åŠççµæãåä¿¡ãããšãStateMachineã¯presentingUIç¶æ ã«å ¥ãããããã¯ãŒã¯ããã®æ¿èªãŸãã¯åæãå®äºãããŸã§ãã®ç¶æ ã®ãŸãŸã«ãªããŸãã
.temporaryFailureã¯ä¿®æ£å¯èœãªãšã©ãŒã§ãã ããšãã°ãèªèšŒäžã«ãããã¯ãŒã¯ãšã©ãŒãçºçããŸããã StateMachineãé害ç¶æ ã«ãªããããã€ã¹ãéžæãããããã¯ãŒã¯ããåæãããŸãã
.failure ïŒãŸãã¯ãã®ä»ã®çµæãããã³ãã®äžåšïŒã¯èŽåœçãªãšã©ãŒã§ãã äœããå®å šã«ããŸãããããæ¥ç¶ãåŠçã§ããŸãããããšãã°ããµãŒããŒåŽã®èªèšŒãããã³ã«ãå€æŽãããã¯ã©ã€ã¢ã³ãã¯ããã«å¯Ÿå¿ã§ããŠããŸããã StateMachineãé害ç¶æ ã«ãªããããã€ã¹ãéžæãããããã¯ãŒã¯ããåæãããŸãã ãŸããtemporaryFailureãšã¯ç°ãªãã ãã®ãããªãããã¯ãŒã¯ã§ã¯èªååå æ©èœãç¡å¹ã«ãªã£ãŠããŸã ã
ãã®çµæãã³ãã³ãã¯æ¬¡ã®ããã«åŠçãããå¿ èŠããããŸãã
let network = command.network // // UILocalNotification (.uiRequired) command.createResponse(<Command result>).deliver()
NEHotspotHelperCommandTypeã presentUI
ãã®ã³ãã³ãã¯ãèªèšŒã³ãã³ãã®åŠçäžã«uiRequiredçµæãè¿ããå Žåãéžæãããããã¹ããããã«ããŒã§åŒã³åºãããŸãã
ããã¯ãããã¯ã°ã©ãŠã³ãã§ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããå®è¡æéãç¡å¶éã®å¯äžã®ã³ãã³ãã§ãã ããã¯ããŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ãèµ·åããåŸã«ã®ã¿å±ããŸããããšãã°ãèªèšŒã³ãã³ãã®åŠçããã»ã¹ã§ã®è¿œå ã®å¯Ÿè©±ã®å¿ èŠæ§ã«ã€ããŠUILocalNotificationãåä¿¡ããå Žåã§ãã
ãã®æ®µéã§ããããã¯ãŒã¯ãäŒæ¥ã®å Žåã¯ãã¡ã€ã³ããŒã³ãå ¥åããããã«ãŠãŒã¶ãŒã«èŠæ±ãããããããã¯ãŒã¯ãåçšã®å Žåã¯åºåã衚瀺ããå¿ èŠããããŸãã èŠããã«ããªãã·ã§ã³ã¯éçºè ã®æ³ååãšåžžèã«ãã£ãŠã®ã¿å¶éãããŸãã
æåŸã«ã次ã®çµæã®ããããã§å¿çãè¿ãå¿ èŠããããŸãã
.success-èªèšŒã¯æ£åžžã«å®äºããŸããã ãããã¯ãŒã¯ã¢ã¯ã»ã¹ã¯å®å šã«ãªãŒãã³ã§ãã StateMachineã¯èªèšŒæžã¿ç¶æ ã«å ¥ããŸãã
.unsupportedNetwork-ãã®ãããã¯ãŒã¯ã¯ãã«ããŒã«ãã£ãŠãµããŒããããŠããŸããïŒãããã¯ãŒã¯ã¯è©äŸ¡æ®µéã§èª€ã£ãŠåæãããŸããã StateMachineã¯è©äŸ¡ãã§ãŒãºã«æ»ãããã®ãããã¯ãŒã¯ã®äŸå€ã«ãã«ããŒãè¿œå ãããŸãã ããã¯ãããšãã°ããã«ããŒãè©äŸ¡æ®µéã§ãã®ãããã¯ãŒã¯ã«å¯ŸããŠäœãä¿¡é ŒåºŠãè¿ããçŸåšã§ã¯å¯Ÿå¿ã§ããªãããšã確èªããå Žåã«çºçããå¯èœæ§ããããŸãã
.temporaryFailureã¯ä¿®æ£å¯èœãªãšã©ãŒã§ãã èªèšŒäžã«ãããã¯ãŒã¯ãšã©ãŒãçºçãããšããŸãã StateMachineãé害ç¶æ ã«ãªããããã€ã¹ãéžæãããããã¯ãŒã¯ããåæãããŸãã
.failure ïŒãŸãã¯ãã®ä»ã®çµæãããã³ãã®äžåšïŒã¯èŽåœçãªãšã©ãŒã§ãã äœããã®åé¡ãçºçããæ¥ç¶ãåŠçã§ããŸãããããšãã°ããµãŒããŒåŽã®èªèšŒãããã³ã«ãå€æŽãããã¯ã©ã€ã¢ã³ãã¯ããã«å¯Ÿå¿ã§ããŠããŸããã StateMachineãé害ç¶æ ã«ãªããããã€ã¹ãéžæãããããã¯ãŒã¯ããåæãããŸãã ãŸããtemporaryFailureãšã¯ç°ãªãã ãã®ãããªãããã¯ãŒã¯ã§ã¯èªååå æ©èœãç¡å¹ã«ãªã£ãŠããŸã ã
ãã®çµæãã³ãã³ãã¯æ¬¡ã®ããã«åŠçãããå¿ èŠããããŸãã
let network = command.network // // command.createResponse(<Command result>).deliver()
NEHotspotHelperCommandTypeã ç¶æãã
ååããæšæž¬ã§ããããã«ãmaintainã³ãã³ãã¯ãçŸåšã®ãããã¯ãŒã¯ã§ãŠãŒã¶ãŒèªèšŒã»ãã·ã§ã³ãç¶æããããã«èšèšãããŠããŸãã 次ã®2ã€ã®å Žåãè©äŸ¡ããã»ã¹ã§ãããã¯ãŒã¯çšã«éžæããããããã¹ããããã«ããŒã§åŒã³åºãããŸãã
- ããã€ã¹ãWi-Fiãããã¯ãŒã¯ã«æ¥ç¶ãããŠããéã300ç§ïŒ5åïŒããšã
- çŸåšã®ãããã¹ããããã«ããŒã以åã«éžæãããåŠçã®ããã«ãevaluateã³ãã³ãã®ä»£ããã«ãããã¯ãŒã¯æ¥ç¶ã確ç«ãããšãã
ã©ã¡ãã®å Žåã§ããHotspot Helperã¯èªèšŒã»ãã·ã§ã³ã®çŸåšã®ç¶æ ãåæãã次ã®ããããã®ã¢ã¯ã·ã§ã³ãå®è¡ãããšæ³å®ãããŠããŸãã
- ãããã¯ãŒã¯ãžã®ãŠãŒã¶ãŒã¢ã¯ã»ã¹ãå³åº§ã«æäŸãïŒæäŸãç¶ãïŒãçµæ.successã§å¿çããŸãã
- çµæ.authenticationRequiredã§å¿çãåŒã³åºãããšã«ãããåèªèšŒãå¿ èŠã«ãªããŸãïŒãã®å ŽåãStateMachineã¯Authenticatingç¶æ ã«å ¥ããhotspot Helperã«authenticateã³ãã³ããéä¿¡ããŸãïŒã
- ãšã©ãŒã³ãŒãïŒ .temporaryFailure / .failureãŸãã¯äžèšä»¥å€ã®ãã®ïŒã䜿çšããŠã³ãã³ããå®äºããããšã«ãããã»ãã·ã§ã³ãç¶ç¶ã§ããªãããšãå ±åããŸãã ãã®å ŽåãStateMachineã¯è©äŸ¡ç¶æ ã«å ¥ããæ¥ç¶ãåŠçã§ãããããã¹ããããã«ããŒãéžæããŸãã
Maintainã³ãã³ãããã³ãã³ãã§éä¿¡ããããããã¯ãŒã¯äžã®ããŒã¿é åã®2çªç®ããåŒã³åºãããæåã®ã±ãŒã¹ãåºå¥ããããã«ãç¹å¥ãªãã©ã°-didJustJoinãæäŸãããŸãã
ãã®çµæãã³ãã³ãã¯æ¬¡ã®ããã«åŠçãããå¿ èŠããããŸãã
let network = command.network if network.didJustJoin { // , Helper } else { // , ( 300 .) } // // command.createResponse(<Command result>).deliver()
åèªèšŒäžã¯ãããã€ã¹ãèªèšŒæžã¿ç¶æ ã«æ»ããŸã§æ¥ç¶ãå©çšã§ããªãããšã«æ³šæããŠãã ããã
NEHotspotHelperCommandTypeã ãã°ãªã
ãæ³åã®ãšãããlogoffã³ãã³ãã¯ãããã¯ãŒã¯ããåæãããŠãéä¿¡ãããŸãã ã Hotspot Helperã䜿çšããŠãããã¯ãŒã¯ããã®åæã远跡ããããšã¯ã§ããŸããã
ãã®ã³ãã³ãã¯ãéžæãããããã¹ããããã«ããŒã®å éšèªèšŒã»ãã·ã§ã³ãçµäºããããšãç®çãšããŠãããéçã¡ãœããNEHotspotHelperãžã®åŒã³åºãã«å¿çããŠéä¿¡ãããŸãã
class func logoff(_ network: NEHotspotNetwork) -> Bool
ãã®ã¡ãœããã¯ãçŸåšã®ãããã¯ãŒã¯ããã©ã¡ãŒã¿ãŒãšããŠããããèš±å¯ããHotspot Helperã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ãã¢ã¯ãã£ããªå Žåã«ã®ã¿æ£åžžã«åŒã³åºãããšãã§ããŸãã ããã§ãªãå Žåãã¡ãœããã¯falseãè¿ããã³ãã³ãã¯åŒã³åºãããŸããã
ãã®çµæãStateMachineã¯LoggingOffç¶æ ã«å ¥ãããããã¹ããããã«ããŒã¯åæãããã³ãã³ããšãããå®è¡ããããã®45ç§ãåãåããŸãã
次ã®ããã«ããŠãã¡ãœããã«æž¡ããããã¯ãŒã¯ãååŸã§ããŸãã
let network = NEHotspotHelper.supportedNetworkInterfaces().first
äž»ãªäœ¿çšäŸïŒpresentUIã³ãã³ãã䜿çšããæ¿èªã¹ã¯ãªããã«é¢é£ãããã¢ããªã±ãŒã·ã§ã³UIããã®ãã°ã€ã³ã
Hotspot Helperãã³ãã³ããå®äºãããšïŒãŸãã¯ã¿ã€ã ã¢ãŠãã«ãªããšïŒãStateMachineã¯éã¢ã¯ãã£ãç¶æ ã«ãªããããã€ã¹ã¯Wi-Fiãããã¯ãŒã¯ããåæãããŸãã
ãã®çµæãã³ãã³ãã¯æ¬¡ã®ããã«åŠçãããå¿ èŠããããŸãã
let network = command.network // logoff let response = command.createResponse(.success).deliver()
ãã®ã³ãã³ããåä¿¡ããåã«ãã¢ããªã±ãŒã·ã§ã³ã¯ãããã¯ãŒã¯ããåæããã¢ã¯ã·ã§ã³ãå®è¡ããªãã§ãã ãããããã¯ã·ã¹ãã å šäœã®UXã«æªåœ±é¿ãäžããããã§ãïŒå®éããŠãŒã¶ãŒã«ã¯æ¥ç¶ã衚瀺ãããŸãããããŒã¿ã¯éä¿¡ãããŸããïŒã
ä»ã«ç¥ã£ãŠãããšè¯ãããš
Hotspot Helperã®åäœåçãšå®è£ ã®è©³çŽ°ã¯äžèšã§èª¬æãããŠããŸãã ãã ããéçºãéå§ããéã«æ³šæãã¹ãæ©èœãããã€ããããŸãã
- Hotspot Helperã¯ã·ãã¥ã¬ãŒã¿ãŒã«ç»é²ã§ããŸãã-éçºãšãããã°ã«ã¯å®éã®ããã€ã¹ãå¿
èŠã§ãã
- Hotspot HelperãšããŠç»é²ãããã¢ããªã±ãŒã·ã§ã³ã¯ãã·ã¹ãã å
šäœã®åäœãããã«äŸåãããããã©ã®ãããªç¶æ³ã§ãããã¯ã°ã©ãŠã³ãã§ã·ã¹ãã ã«ãã£ãŠèµ·åãããŸãã ãŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ãã¢ã³ããŒãããå Žåãããã¯ã°ã©ãŠã³ããã§ããããªãã«ããå Žåãäœé»åã¢ãŒãããªã³ã«ããå Žåãªã©ã
- Hotspot Helperã¯ããããã¯ãŒã¯ã®åæ¢ãç£èŠããæ©èœãæäŸããŠããŸããïŒlogoffã³ãã³ãã誀解ãæãããã«ããŠãã ãããããã¯ããã«ããŒèªèº«ã«ããèš±å¯ã»ãã·ã§ã³ã®çµäºã®åŠçã§ãïŒã ã·ã£ããããŠã³ãç£èŠããå¿
èŠãããå Žåã¯ãå°éå¯èœæ§ããã®éç¥ã䜿çšããå¿
èŠããããŸãïŒããèªäœã§ãã¢ããªã±ãŒã·ã§ã³ãã¢ã¯ãã£ãã«ãªããŸã-ããã¯ã°ã©ãŠã³ãã§ã¯ãã·ã¹ãã ã¯ãŠãŒã¶ãŒãåŒã³åºããŸããïŒã
- ããã€ã¹ãçŸåšæ¥ç¶ãããŠãããããã¯ãŒã¯ã¯ã次ã®ããã«èŠã€ããããšãã§ããŸãã
let network = NEHotspotHelper.supportedNetworkInterfaces().first
ãã®ã¡ãœããã®è¿ éãªçœ²åïŒçµæãšããŠãªãã·ã§ã³ã§ã¯ãªãé åã瀺ãïŒãšæåŸ ãããåäœïŒãããã¯ãŒã¯ããªãå Žåã¯ç©ºã®é åã«èŠããïŒã«ãããããããæ¥ç¶ããªãå ŽåãSSIDãšããŠç©ºã®æååãæã€ãããã¯ãŒã¯ãªããžã§ã¯ããååŸã§ããŸãã BSSIDããã³ä¿¡å·åŒ·åºŠ0.0ã , , nil ( crash). , .
Note: C iOS 11 .
- , StateMachine Authenticated. reachbility, , Hotspot Helper .
, , reachability Wi-Fi, Hotspot Helper . , :
, . , , .
- Helper .
Hotspot Helper, . , , .
evaluate: Hotspot Helper, high-confidence . Helper. Helper , . , Hotspot Helper .
, - Helper. : , . Apple UI ( SSID).
, - Hotspot Helper . , , â , Hotspot Helper . :
let network = NEHotspotHelper.supportedNetworkInterfaces().first if !network.isChosenHelper { // Hotspot Helper }
, false , Helper (, evaluate). , , . .
- , . :
func createTCPConnection(_ endpoint: NWEndpoint) -> NWTCPConnection func createUDPSession(_ endpoint: NWEndpoint) -> NWUDPSession
NSMutableURLRequest:
func bind(to command: NEHotspotHelperCommand)
- iOS10.3, , . - , . : . , - â .
, , .
- iOS 11 NEHotspotHelper NEHotspotConfigurationManager , Wi-Fi . . :
- , (, - .);
- , Wi-Fi- (, ). .
ãããã«
æ°å¹Žåã«ç»å ŽããNEHotspotHelperãã¯ãããžãŒã¯ãä»æ¥ãŸã§ãã®é¢é£æ§ã倱ã£ãŠããŸããããã®ããŒã«ã䜿çšãããšããããã¯ãŒã¯ãµãŒãã¹ã䜿çšããããã»ã¹ãå€§å¹ ã«æ¹åããã³ä¿é²ã§ããŸããããã§ã¯ãäœæ¥ã®åºæ¬ååãé©çšæ¹æ³ãããã³ãããå¹æçã«äœ¿çšããããã«å®è¡ããå¿ èŠããããã¹ãŠã®æé ã調ã¹ãŸãããããã«ã圌ã¯ãHelperã®ããã€ãã®æ©èœã«ã€ããŠè©±ããŸãããããã®æ©èœã«ã€ããŠã¯ããã¥ã¡ã³ãã¯å·§åŠã«éãã§ãã
ãããžã§ã¯ãã§ãã®ããšã䜿çšããçç±ãšæ¹æ³ãå®å šã«ç解ããŠããã ããã°å¹žãã§ãããããã質åãããã°ãæžããŠãã ãããç§ã¯ãããã«çããæºåãã§ããŠããŸãã
䟿å©ãªãªã³ã¯
- GitHubã®å®è£ äŸ
- ãããã¹ããããããã¯ãŒã¯ãµãã·ã¹ãã ããã°ã©ãã³ã°ã¬ã€ã
- ãããã¯ãŒã¯æ¡åŒµ
- NEhotspotHelperãªãã¡ã¬ã³ã¹
- WWDC'15 What's New in Network Extension and VPN
- WWDC'17 Advances in Networking, Part 1
- Forum: How to cancel register an app as a Hotspot Helper (NEHotspotHelper)?
- Forum: entitlements
- Forum: U I
- HotspotHelper